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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

x|IE$~oPg|I#4H<{PhTB|aPZgD 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 z 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 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