From 6072540c3e571931ee2e54bdedf8f1e987199ac0 Mon Sep 17 00:00:00 2001 From: Oleg Lobanov Date: Sat, 28 Jun 2025 19:34:34 +0200 Subject: [PATCH] docs: migrate to MkDocs for site generation (#5227) --- .dockerignore | 11 ++- .github/workflows/site-pr.yml | 22 +++++ .github/workflows/site-publish.yml | 39 ++++++++ .gitignore | 2 + Dockerfile.site | 22 +++++ Dockerfile.site.dev | 19 ++++ Makefile | 15 +++ README.md | 17 +++- scripts/watch.sh | 17 ++++ {docs => site/docs}/assets/1.jpg | Bin {docs => site/docs}/assets/2.jpg | Bin {docs => site/docs}/assets/3.jpg | Bin {docs => site/docs}/assets/4.jpg | Bin {docs => site/docs}/assets/5.jpg | Bin {docs => site/docs}/assets/6.jpg | Bin {docs => site/docs}/code-of-conduct.md | 0 {docs => site/docs}/configuration.md | 0 {docs => site/docs}/contributing.md | 0 site/docs/favicon.png | Bin 0 -> 13091 bytes {docs => site/docs}/installation.md | 0 site/docs/logo.png | Bin 0 -> 27365 bytes {docs => site/docs}/security.md | 0 site/mkdocs.yml | 121 +++++++++++++++++++++++++ site/public/.keep | 0 site/requirements.txt | 4 + 25 files changed, 281 insertions(+), 8 deletions(-) create mode 100644 .github/workflows/site-pr.yml create mode 100644 .github/workflows/site-publish.yml create mode 100644 Dockerfile.site create mode 100644 Dockerfile.site.dev create mode 100644 scripts/watch.sh rename {docs => site/docs}/assets/1.jpg (100%) rename {docs => site/docs}/assets/2.jpg (100%) rename {docs => site/docs}/assets/3.jpg (100%) rename {docs => site/docs}/assets/4.jpg (100%) rename {docs => site/docs}/assets/5.jpg (100%) rename {docs => site/docs}/assets/6.jpg (100%) rename {docs => site/docs}/code-of-conduct.md (100%) rename {docs => site/docs}/configuration.md (100%) rename {docs => site/docs}/contributing.md (100%) create mode 100644 site/docs/favicon.png rename {docs => site/docs}/installation.md (100%) create mode 100644 site/docs/logo.png rename {docs => site/docs}/security.md (100%) create mode 100644 site/mkdocs.yml create mode 100644 site/public/.keep create mode 100644 site/requirements.txt diff --git a/.dockerignore b/.dockerignore index 94ec8d2b..0b42d767 100644 --- a/.dockerignore +++ b/.dockerignore @@ -1,3 +1,8 @@ -* -!docker/* -!filebrowser +.venv +dist +.idea +frontend/node_modules +frontend/dist +filebrowser.db +site/docs/index.md +site/docs/quickstart.md diff --git a/.github/workflows/site-pr.yml b/.github/workflows/site-pr.yml new file mode 100644 index 00000000..a0ca49ce --- /dev/null +++ b/.github/workflows/site-pr.yml @@ -0,0 +1,22 @@ +name: Build Site Image + +on: + pull_request: + +jobs: + build: + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v3 + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v2 + + - name: Build + uses: docker/build-push-action@v4 + with: + context: . + file: ./Dockerfile.site + push: false + diff --git a/.github/workflows/site-publish.yml b/.github/workflows/site-publish.yml new file mode 100644 index 00000000..a34cdf7e --- /dev/null +++ b/.github/workflows/site-publish.yml @@ -0,0 +1,39 @@ +name: Build and Push Site Image + +on: + push: + branches: + - master + +jobs: + build: + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v3 + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v2 + + - name: Log in to Docker Hub + uses: docker/login-action@v2 + with: + username: ${{ secrets.DOCKERHUB_USERNAME }} + password: ${{ secrets.DOCKERHUB_TOKEN }} + + - name: Log in to GitHub Container Registry + uses: docker/login-action@v2 + with: + registry: ghcr.io + username: ${{ github.actor }} + password: ${{ secrets.GITHUB_TOKEN }} + + - name: Build and push + uses: docker/build-push-action@v4 + with: + context: . + file: ./Dockerfile.site + push: true + tags: | + filebrowser/site:latest + ghcr.io/filebrowser/site:latest diff --git a/.gitignore b/.gitignore index f229b066..559f056c 100644 --- a/.gitignore +++ b/.gitignore @@ -6,6 +6,7 @@ rice-box.go /filebrowser /filebrowser.exe /dist +.venv .DS_Store node_modules @@ -41,3 +42,4 @@ build/ default.nix Dockerfile.dev +site/public/ \ No newline at end of file diff --git a/Dockerfile.site b/Dockerfile.site new file mode 100644 index 00000000..002cfdc8 --- /dev/null +++ b/Dockerfile.site @@ -0,0 +1,22 @@ +FROM squidfunk/mkdocs-material as build + +WORKDIR /build +COPY site/requirements.txt /build/requirements.txt +RUN pip install --no-cache-dir -r requirements.txt +COPY LICENSE /build/docs/LICENSE + +COPY site/ /build/ + +COPY README.md /build/docs/index.md +RUN sed -i 's|site/docs/||g' /build/docs/index.md + +RUN mkdocs build + + +FROM ghcr.io/umputun/reproxy +# enables automatic changelog generation by tools like Dependabot +LABEL org.opencontainers.image.source="https://github.com/filebrowser/filebrowser" +COPY --from=build /build/site /srv/site +EXPOSE 8080 +USER app +ENTRYPOINT ["/srv/reproxy", "--assets.location=/srv/site", "--assets.cache=30d", "--assets.cache=text/html:30s"] \ No newline at end of file diff --git a/Dockerfile.site.dev b/Dockerfile.site.dev new file mode 100644 index 00000000..24a03f98 --- /dev/null +++ b/Dockerfile.site.dev @@ -0,0 +1,19 @@ +FROM squidfunk/mkdocs-material + +# Install inotify-tools for watching file changes +RUN apk add --no-cache inotify-tools + +WORKDIR /build + +COPY site/requirements.txt /build/requirements.txt +RUN pip install --no-cache-dir -r requirements.txt + +# Expose the port for mkdocs serve +EXPOSE 8000 + +# Copy the watch script and make it executable +COPY scripts/watch.sh /usr/local/bin/watch.sh +RUN chmod +x /usr/local/bin/watch.sh + +# The entrypoint will run the initial setup and then start the server. +ENTRYPOINT ["/usr/local/bin/watch.sh"] diff --git a/Makefile b/Makefile index 8b2eebfd..08fc0f97 100644 --- a/Makefile +++ b/Makefile @@ -53,6 +53,21 @@ clean: clean-tools ## Clean bump-version: $(standard-version) ## Bump app version $Q ./scripts/bump_version.sh +.PHONY: site +site: ## Build site + @rm -f site/public/* + @docker rm -f spot-site + docker build -f Dockerfile.site --progress=plain -t filebrowser.site . + docker run -d --name=filebrowser-site filebrowser.site + sleep 3 + docker cp "filebrowser-site":/srv/site/ site/public + docker rm -f filebrowser-site + +.PHONY: site-serve +site-serve: ## Serve site for development + docker build -f Dockerfile.site.dev -t filebrowser.site.dev . + docker run --rm -it -p 8000:8000 -v $(CURDIR)/site:/build/ -v $(CURDIR)/README.md:/tmp/README.md filebrowser.site.dev + ## Help: help: ## Show this help @echo '' diff --git a/README.md b/README.md index ab8a120c..2242e155 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,10 @@ +--- +hide: + - navigation + - toc +--- +# +

@@ -31,21 +38,21 @@ File Browser is a **create-your-own-cloud-kind** of software where you can insta | Easy Login System | Sleek Interface | User Management | | :----------------------: | :----------------------: | :----------------------: | -| ![](./docs/assets/1.jpg) | ![](./docs/assets/2.jpg) | ![](./docs/assets/3.jpg) | +| ![](./site/docs/assets/1.jpg) | ![](./site/docs/assets/2.jpg) | ![](./site/docs/assets/3.jpg) | | File Editing | Custom Commands | Customization | | :----------------------: | :----------------------: | :----------------------: | -| ![](./docs/assets/4.jpg) | ![](./docs/assets/5.jpg) | ![](./docs/assets/6.jpg) | +| ![](./site/docs/assets/4.jpg) | ![](./site/docs/assets/5.jpg) | ![](./site/docs/assets/6.jpg) | ## Install -For information on how to install File Browser, please check [docs/installation.md](./docs/installation.md). +For information on how to install File Browser, please check [installation](./site/docs/installation.md). ## Configuration -For information on how to configure File Browser, please check [docs/configuration.md](./docs/configuration.md). +For information on how to configure File Browser, please check [configuration](./site/docs/configuration.md). ## Contributing -For information on how to contribute to the project, including how translations are managed, please check [docs/contributing.md](./docs/contributing.md). +For information on how to contribute to the project, including how translations are managed, please check [contributing](./site/docs/contributing.md). diff --git a/scripts/watch.sh b/scripts/watch.sh new file mode 100644 index 00000000..1b8a15af --- /dev/null +++ b/scripts/watch.sh @@ -0,0 +1,17 @@ +#!/bin/sh + +# Initial setup +cp /tmp/README.md /build/docs/index.md +sed -i 's|site/docs/||g' /build/docs/index.md + +# Start mkdocs in the background +mkdocs serve -a 0.0.0.0:8000 --dirtyreload & + +# Watch for changes in README.md +while true; do + inotifywait -e modify /tmp/README.md + echo "README.md changed. Updating index.md..." + cp /tmp/README.md /build/docs/index.md + sed -i 's|site/docs/||g' /build/docs/index.md +done + diff --git a/docs/assets/1.jpg b/site/docs/assets/1.jpg similarity index 100% rename from docs/assets/1.jpg rename to site/docs/assets/1.jpg diff --git a/docs/assets/2.jpg b/site/docs/assets/2.jpg similarity index 100% rename from docs/assets/2.jpg rename to site/docs/assets/2.jpg diff --git a/docs/assets/3.jpg b/site/docs/assets/3.jpg similarity index 100% rename from docs/assets/3.jpg rename to site/docs/assets/3.jpg diff --git a/docs/assets/4.jpg b/site/docs/assets/4.jpg similarity index 100% rename from docs/assets/4.jpg rename to site/docs/assets/4.jpg diff --git a/docs/assets/5.jpg b/site/docs/assets/5.jpg similarity index 100% rename from docs/assets/5.jpg rename to site/docs/assets/5.jpg diff --git a/docs/assets/6.jpg b/site/docs/assets/6.jpg similarity index 100% rename from docs/assets/6.jpg rename to site/docs/assets/6.jpg diff --git a/docs/code-of-conduct.md b/site/docs/code-of-conduct.md similarity index 100% rename from docs/code-of-conduct.md rename to site/docs/code-of-conduct.md diff --git a/docs/configuration.md b/site/docs/configuration.md similarity index 100% rename from docs/configuration.md rename to site/docs/configuration.md diff --git a/docs/contributing.md b/site/docs/contributing.md similarity index 100% rename from docs/contributing.md rename to site/docs/contributing.md diff --git a/site/docs/favicon.png b/site/docs/favicon.png new file mode 100644 index 0000000000000000000000000000000000000000..14793ffb62cd5d8ecac555eaecd44fa822f807a0 GIT binary patch literal 13091 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 hh%yFN&^|FboUY!PC{xWt~$(69DY`FuDK$ literal 0 HcmV?d00001 diff --git a/docs/installation.md b/site/docs/installation.md similarity index 100% rename from docs/installation.md rename to site/docs/installation.md diff --git a/site/docs/logo.png b/site/docs/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..22225604cd4335095c33dd0523bc79df2fbdb80a GIT binary patch literal 27365 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%0A;=(IzFEK4{dvZc^nTp^8 zD;|56PdU#6y;Aow3d;E%nX&H~U*=X>w^V*zgRJ>JyUxixVc8+MgP~SdbLqFUn-404 zuiX`S?Ka<{P5t*OuGGymxm$D0@J{1Hm)nt3f^Hr>5Y6}_5Ij8JeJU<0A%sg}rbX}O z-iK-rIBsW73DQfA&@FJzHT8da(>1F;voUa`uwi3o;5m~+Iu8VH7fuO!myp2SHha~l ziWgTqRC1mN-dn)xw)D=D4o=m@F)D}r8@+BsC2gOk!%;WTj;nIzKVDWH$zZOv${g zc4+THf%5eo9_?=pPTk&eU`5YN5yMu$Io*anuJXE?PgQf3?nwIoLe4CPqE?9b79m&2`t@dS0q=H*?~<>+Y^vm$w|y$Obq5i`Pjklak1{?hnd(&yizr z==`qVGdDlgd%1nC`_IW@5~=Y=SdQ_3SpUdC*47|M(>%JdApCAr-RkF}nzy$c&iDhSfR&JGbTiJh!X>m+$&JmvTy`N=y!Wr3bpIbbI-=yP1L(7jyUzcsS`4(SU zm(dt_^I?wgoC=NQ(hrSVE?+qA?X`4LbE2ce57)C+^Dh6?)soI=42*o<@$%V$gh|{z z1+51%ZdXn@m2{S)Uq$xWnw8Udw;k3n6^Tj+xi(A0P*MGqxu71SpQC%~lv~n#A5Qfh zcd1|1>2aq_Vd=M4F^Q*~$?HuQ7c4V`a$&ro}ahK}V)o75W`7P;5?hi~oHpdz#W8HG>0_O}Bea zerw>hbaq{b_I*kFqcS>&wl^9#CSUyCc*>9Ma1zrW#)scax1ab8vd{C^!L>EHpGu6? zCO%oMR3rO?>(>m=owJocEHgaA{p`b)RkKs~zIE`rxro(mrL3C2@zlPDJjp+-4v9C^ z+@3jw=~v_Q-o!Y+2K)816whvB)_lqql`!R(#Nzd4KV1|33=Umq-N)Ipajxf2FXIp5 zhG)F3&Rp-@;q}*8*TCy-tLNo2%X=PX9}wrA!_bnG9yCwL_=DAlqzeyQXGMPMd+Xq} zbFP@g(zX{bIwY@&KdoS@5j-s3=)d^As;LW;v_RaUhf6EuxUab`IbEi;D3$3m5 zK?MrW9HkGHJnD?X7rsyXWx#xesouD)^`J`q)urdW-pc=-5UO?bn4jrW%MX=?b6N_7 z3RHIOI+-tYz>9~w@%kiYotWbGEw}iVPMMz37^rpDuCiCtgU#|3XOT(U;zr>{=bYz3 znpZh=L=#sk>zqBE`mn2`aH>piYq(T{C|g)U z#5CcQldGarHopz<`q?Wcu{0(L)EaK^Py82`rN;31qNxA2BRp5QuOvn!GOan$D7uTk zJLug4RyR#?Ys;jfSxGWnK4OPiT23CYNYDvLF`t`W!uVQJM|-u*3ihzj)|(%)T!f}= z)?8ZV$lVhZ`D*g@8C?}KHa;qtaUg=7Px!DR$9#rW4GZ4(=uKpqWw0l|rI#@xKVfcT z=|aY9>-WS)<*`(lEPNdzo`>^<; zL-&EODHkm9SEA yXg4g8Sm=DFZ$A4CxrW@SirX>`15fS$$M5~*r0C~GR-z0H3=E#GelF{r5}E*0x=_Oa literal 0 HcmV?d00001 diff --git a/docs/security.md b/site/docs/security.md similarity index 100% rename from docs/security.md rename to site/docs/security.md diff --git a/site/mkdocs.yml b/site/mkdocs.yml new file mode 100644 index 00000000..6fca3f1e --- /dev/null +++ b/site/mkdocs.yml @@ -0,0 +1,121 @@ +site_name: Filebrowser +site_description: 'A web-based file browser and manager for your files' +site_author: 'Filebrowser Community' +site_url: 'https://filebrowser.org' + +repo_name: 'filebrowser/filebrowser' +repo_url: 'https://github.com/filebrowser/filebrowser' +edit_uri: 'edit/master/site/docs/' + +copyright: 'Copyright © 2025 Filebrowser Community' + +theme: + name: material + language: en + logo: logo.png + favicon: favicon.png + palette: + - scheme: default + primary: blue + accent: light blue + toggle: + icon: material/brightness-7 + name: Switch to dark mode + - scheme: slate + primary: blue + accent: light blue + toggle: + icon: material/brightness-4 + name: Switch to light mode + + font: + text: Roboto + code: Roboto Mono + + features: + - navigation.tabs + - navigation.tabs.sticky + - navigation.sections + - navigation.expand + - navigation.indexes + - navigation.top + - navigation.instant + - search.suggest + - search.highlight + - search.share + - content.code.copy + - content.action.edit + - content.action.view + - toc.follow + - toc.integrate + + icon: + repo: fontawesome/brands/github + edit: material/pencil + view: material/eye + +plugins: + - search: + separator: '[\\s\\-\\/]+' + - offline + - minify: + minify_html: true + +markdown_extensions: + - smarty + - sane_lists + - abbr + - admonition + - attr_list + - def_list + - footnotes + - meta + - md_in_html + - toc: + permalink: true + - pymdownx.arithmatex: + generic: true + - pymdownx.betterem: + smart_enable: all + - pymdownx.caret + - pymdownx.details + - pymdownx.emoji: + emoji_index: !!python/name:material.extensions.emoji.twemoji + emoji_generator: !!python/name:material.extensions.emoji.to_svg + - pymdownx.highlight: + anchor_linenums: true + use_pygments: true + - pymdownx.inlinehilite + - pymdownx.keys + - pymdownx.mark + - pymdownx.smartsymbols + - pymdownx.superfences: + custom_fences: + - name: mermaid + class: mermaid + format: !!python/name:pymdownx.superfences.fence_code_format + - pymdownx.tabbed: + alternate_style: true + - pymdownx.tasklist: + custom_checkbox: true + - pymdownx.tilde + - callouts + - github-callouts + +extra: + generator: false + social: + - icon: fontawesome/brands/github + link: https://github.com/filebrowser/filebrowser + - icon: fontawesome/brands/docker + link: https://hub.docker.com/r/filebrowser/filebrowser + +nav: + - Home: index.md + - Getting Started: + - Installation: installation.md + - Configuration: configuration.md + - Security: security.md + - Contributing: + - Contributing: contributing.md + - Code of Conduct: code-of-conduct.md diff --git a/site/public/.keep b/site/public/.keep new file mode 100644 index 00000000..e69de29b diff --git a/site/requirements.txt b/site/requirements.txt new file mode 100644 index 00000000..6a5ff403 --- /dev/null +++ b/site/requirements.txt @@ -0,0 +1,4 @@ +mkdocs-material +mkdocs-minify-plugin +mkdocs-redirects +markdown-callouts