From e99e0b3028e1c8a50e1744bb07ecc8e809bdb8e6 Mon Sep 17 00:00:00 2001 From: Stavros Tsioulis Date: Thu, 3 Jul 2025 07:42:55 +0300 Subject: [PATCH 01/17] fix: remove associated shares when deleting file/folder --- http/resource.go | 6 ++++++ share/storage.go | 5 +++++ storage/bolt/share.go | 13 +++++++++++++ 3 files changed, 24 insertions(+) diff --git a/http/resource.go b/http/resource.go index f03f17fb..f657856e 100644 --- a/http/resource.go +++ b/http/resource.go @@ -5,6 +5,7 @@ import ( "errors" "fmt" "io" + "log" "net/http" "net/url" "os" @@ -73,6 +74,11 @@ func resourceDeleteHandler(fileCache FileCache) handleFunc { return errToStatus(err), err } + err = d.store.Share.DeleteWithPathPrefix(file.Path) + if err != nil { + log.Printf("WARNING: Error(s) occurred while deleting associated shares with file: %s", err) + } + // delete thumbnails err = delThumbs(r.Context(), fileCache, file) if err != nil { diff --git a/share/storage.go b/share/storage.go index 4cd263de..398c192d 100644 --- a/share/storage.go +++ b/share/storage.go @@ -15,6 +15,7 @@ type StorageBackend interface { Gets(path string, id uint) ([]*Link, error) Save(s *Link) error Delete(hash string) error + DeleteWithPathPrefix(path string) error } // Storage is a storage. @@ -118,3 +119,7 @@ func (s *Storage) Save(l *Link) error { func (s *Storage) Delete(hash string) error { return s.back.Delete(hash) } + +func (s *Storage) DeleteWithPathPrefix(path string) error { + return s.back.DeleteWithPathPrefix(path) +} diff --git a/storage/bolt/share.go b/storage/bolt/share.go index 6df94f12..373533f1 100644 --- a/storage/bolt/share.go +++ b/storage/bolt/share.go @@ -75,3 +75,16 @@ func (s shareBackend) Delete(hash string) error { } return err } + +func (s shareBackend) DeleteWithPathPrefix(pathPrefix string) error { + var links []share.Link + if err := s.db.Prefix("Path", pathPrefix, &links); err != nil { + return err + } + + var err error + for _, link := range links { + err = errors.Join(err, s.db.DeleteStruct(&share.Link{Hash: link.Hash})) + } + return err +} From b6394745a33b2763211f671899313a55e49ce321 Mon Sep 17 00:00:00 2001 From: Henrique Dias Date: Thu, 3 Jul 2025 16:00:54 +0200 Subject: [PATCH 02/17] docs: docker caveat with bind mounts --- www/docs/installation.md | 73 +++++++++++++++++----------------------- 1 file changed, 31 insertions(+), 42 deletions(-) diff --git a/www/docs/installation.md b/www/docs/installation.md index 08c6248d..34345a60 100644 --- a/www/docs/installation.md +++ b/www/docs/installation.md @@ -32,37 +32,43 @@ File Browser is now up and running. Read some [first boot](#first-boot) for more ## Docker -File Browser is available as two different Docker images, which can be found on [Docker Hub](https://hub.docker.com/r/filebrowser/filebrowser). +File Browser is available as two different Docker images, which can be found on [Docker Hub](https://hub.docker.com/r/filebrowser/filebrowser): a [bare Alpine image](#bare-alpine-image) and an [S6 Overlay image](#s6-overlay-image). -=== "Alpine" +### Bare Alpine Image - The +```sh +docker run \ + -v filebrowser_data:/srv \ + -v filebrowser_database:/database \ + -v filebrowser_config:/config \ + -p 8080:80 \ + filebrowser/filebrowser +``` - ```sh - docker run \ - -v /path/to/srv:/srv \ - -v /path/to/database:/database \ - -v /path/to/config:/config \ - -p 8080:80 \ - filebrowser/filebrowser - ``` +Where `filebrowser_data`, `filebrowser_database` and `filebrowser_config` are Docker [volumes](https://docs.docker.com/engine/storage/volumes/), where the data, database and configuration will be stored, respectively. The default configuration and database will be automatically initialized. - The default user has PID 1000 and GID 1000. Please make sure that this user has access to the different mounted volumes. To change the user running inside the Docker image, you need to use the [`--user` flag](https://docs.docker.com/engine/containers/run/#user). +The default user that runs File Browser inside the container has PID 1000 and GID 1000. If, for one reason or another, you want to run the Docker container with a different user, please consult Docker's [user documentation](https://docs.docker.com/engine/containers/run/#user). -=== "s6 overlay" +> [!NOTE] +> +> When using [bind mounts](https://docs.docker.com/engine/storage/bind-mounts/), that is, when you mount a path on the host in the container, you must manually ensure that they have the correct **permissions**. Docker does not do this automatically for you. The host directories must be readable and writable by the user running inside the container. You can use the [`chown`](https://linux.die.net/man/1/chown) command to change the owner of those paths. - The `s6` image is based on LinuxServer and leverages the [s6-overlay](https://github.com/just-containers/s6-overlay) system for a standard, highly customizable image. It should be used as follows: +File Browser is now up and running. Read the ["First Book"](#first-boot) section for more information. - ```shell - docker run \ - -v /path/to/srv:/srv \ - -v /path/to/database:/database \ - -v /path/to/config:/config \ - -e PUID=$(id -u) \ - -e PGID=$(id -g) \ - -p 8080:80 \ - filebrowser/filebrowser:s6 - ``` +### S6 Overlay Image + +The `s6` image is based on LinuxServer and leverages the [s6-overlay](https://github.com/just-containers/s6-overlay) system for a standard, highly customizable image. It should be used as follows: + +```shell +docker run \ + -v /path/to/srv:/srv \ + -v /path/to/database:/database \ + -v /path/to/config:/config \ + -e PUID=$(id -u) \ + -e PGID=$(id -g) \ + -p 8080:80 \ + filebrowser/filebrowser:s6 +``` Where: @@ -72,24 +78,7 @@ Where: Both `settings.json` and `filebrowser.db` will automatically be initialized if they don't exist. -File Browser is now up and running. Read some [first boot](#first-boot) for more information. - -> [!NOTE] -> -> The Alpine Docker image has breaking changes from v2.33.0, in order to address multiple issues that have continuously affected multiple users. The changes are as follows: -> -> - **User**: File Browser no longer runs as `root`, but as user with PID 1000 and GID 1000. You can still change this by using Docker's [`--user` flag](https://www.docker.com/blog/understanding-the-docker-user-instruction/). -> - **Volumes**: the volumes with the database and configuration are now aligned with the s6-overlay images. Instead of mounting the files themselves, which leads to frequent issues, you now mount the surrounding directory. -> -> Assuming you have a `database.db`, a `.filebrowser.json` and the data in `/data`, do the following: -> -> 1. Change the path of `database` in `.filebrowser.json` to `/database/filebrowser.db` -> 2. Rename `database.db` to `filebrowser.db` -> 3. Rename `.filebrowser.json` to `settings.json` -> 4. Put them in the same directory locally, let's say `/app/filebrowser/` -> 5. Change the permissions of both directories: `sudo chown -R 1000:1000 /app/filebrowser /data` -> 6. Mount with the flags `-v /app/filebrowser:/database -v /app/filebrowser:/config` - you can also choose to put them in separate directories, but it is not needed. - +File Browser is now up and running. Read the ["First Book"](#first-boot) section for more information. ## First Boot From a756e02142e1dfb94fcb8d0441274f78f6cb5dcc Mon Sep 17 00:00:00 2001 From: Henrique Dias Date: Thu, 3 Jul 2025 16:11:37 +0200 Subject: [PATCH 03/17] docs: fix typo --- www/docs/installation.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/www/docs/installation.md b/www/docs/installation.md index 34345a60..eb609f06 100644 --- a/www/docs/installation.md +++ b/www/docs/installation.md @@ -53,7 +53,7 @@ The default user that runs File Browser inside the container has PID 1000 and GI > > When using [bind mounts](https://docs.docker.com/engine/storage/bind-mounts/), that is, when you mount a path on the host in the container, you must manually ensure that they have the correct **permissions**. Docker does not do this automatically for you. The host directories must be readable and writable by the user running inside the container. You can use the [`chown`](https://linux.die.net/man/1/chown) command to change the owner of those paths. -File Browser is now up and running. Read the ["First Book"](#first-boot) section for more information. +File Browser is now up and running. Read the ["First Boot"](#first-boot) section for more information. ### S6 Overlay Image @@ -78,7 +78,7 @@ Where: Both `settings.json` and `filebrowser.db` will automatically be initialized if they don't exist. -File Browser is now up and running. Read the ["First Book"](#first-boot) section for more information. +File Browser is now up and running. Read the ["First Boot"](#first-boot) section for more information. ## First Boot From e36a9b40a00ad4ff76a87baf71a08d1cfa2b8546 Mon Sep 17 00:00:00 2001 From: Henrique Dias Date: Thu, 3 Jul 2025 16:14:05 +0200 Subject: [PATCH 04/17] chore(release): 2.36.1 --- CHANGELOG.md | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index c0479f15..753ad536 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,13 @@ All notable changes to this project will be documented in this file. See [standard-version](https://github.com/conventional-changelog/standard-version) for commit guidelines. +### [2.36.1](https://github.com/filebrowser/filebrowser/compare/v2.36.0...v2.36.1) (2025-07-03) + + +### Bug Fixes + +* remove associated shares when deleting file/folder ([e99e0b3](https://github.com/filebrowser/filebrowser/commit/e99e0b3028e1c8a50e1744bb07ecc8e809bdb8e6)) + ## [2.36.0](https://github.com/filebrowser/filebrowser/compare/v2.35.0...v2.36.0) (2025-07-02) From 244fda2f2c1f90a2cfb33375a7d0d94f5107afe1 Mon Sep 17 00:00:00 2001 From: Henrique Dias Date: Thu, 3 Jul 2025 16:22:24 +0200 Subject: [PATCH 05/17] chore: base s6 image has now manifest for arm64 --- .goreleaser.yml | 2 +- Dockerfile.s6.aarch64 | 23 ----------------------- 2 files changed, 1 insertion(+), 24 deletions(-) delete mode 100644 Dockerfile.s6.aarch64 diff --git a/.goreleaser.yml b/.goreleaser.yml index debf6fa5..57b7b44a 100644 --- a/.goreleaser.yml +++ b/.goreleaser.yml @@ -131,7 +131,7 @@ dockers: - "filebrowser/filebrowser:v{{ .Major }}-amd64-s6" extra_files: - docker - - dockerfile: Dockerfile.s6.aarch64 + - dockerfile: Dockerfile.s6 use: buildx build_flag_templates: - "--pull" diff --git a/Dockerfile.s6.aarch64 b/Dockerfile.s6.aarch64 deleted file mode 100644 index 0378d57c..00000000 --- a/Dockerfile.s6.aarch64 +++ /dev/null @@ -1,23 +0,0 @@ -FROM ghcr.io/linuxserver/baseimage-alpine:arm64v8-3.22 - -RUN apk update && \ - apk --no-cache add ca-certificates mailcap curl jq - -# Make user and create necessary directories -RUN mkdir -p /config /database /srv && \ - chown -R abc:abc /config /database /srv - -# Copy files and set permissions -COPY filebrowser /bin/filebrowser -COPY docker/common/ / -COPY docker/s6/ / - -RUN chown -R abc:abc /bin/filebrowser /defaults healthcheck.sh - -# Define healthcheck script -HEALTHCHECK --start-period=2s --interval=5s --timeout=3s CMD /healthcheck.sh - -# Set the volumes and exposed ports -VOLUME /srv /config /database - -EXPOSE 80 From 046d6193c57b4df0e3dc583b6518b43d29d302c9 Mon Sep 17 00:00:00 2001 From: Ryan <43447928+Rmiller5466@users.noreply.github.com> Date: Sat, 5 Jul 2025 02:15:17 -0400 Subject: [PATCH 06/17] fix: lookup directory name if blank when downloading shared directory --- http/raw.go | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/http/raw.go b/http/raw.go index 4e9438e8..cd05a1bc 100644 --- a/http/raw.go +++ b/http/raw.go @@ -177,7 +177,18 @@ func rawDirHandler(w http.ResponseWriter, r *http.Request, d *data, file *files. name := filepath.Base(commonDir) if name == "." || name == "" || name == string(filepath.Separator) { - name = file.Name + // Not sure when/if this will ever be true, though kept incase there is an edge-case where it is + if file.Name != "" { + name = file.Name + } else { + // This should indicate that the fs root is the directory being downloaded, lookup its name + + actual, statErr := file.Fs.Stat(".") + if statErr != nil { + return http.StatusInternalServerError, statErr + } + name = actual.Name() + } } // Prefix used to distinguish a filelist generated // archive from the full directory archive From cc6db8398885ae4122bdd770ebe89c9a9a71ae62 Mon Sep 17 00:00:00 2001 From: Henrique Dias Date: Sun, 6 Jul 2025 08:53:05 +0200 Subject: [PATCH 07/17] chore(release): 2.36.2 --- CHANGELOG.md | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 753ad536..2edff4b8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,13 @@ All notable changes to this project will be documented in this file. See [standard-version](https://github.com/conventional-changelog/standard-version) for commit guidelines. +### [2.36.2](https://github.com/filebrowser/filebrowser/compare/v2.36.1...v2.36.2) (2025-07-06) + + +### Bug Fixes + +* lookup directory name if blank when downloading shared directory ([046d619](https://github.com/filebrowser/filebrowser/commit/046d6193c57b4df0e3dc583b6518b43d29d302c9)) + ### [2.36.1](https://github.com/filebrowser/filebrowser/compare/v2.36.0...v2.36.1) (2025-07-03) From 3645b578cddb9fc8f25a00e0153fb600ad1b9266 Mon Sep 17 00:00:00 2001 From: Henrique Dias Date: Sun, 6 Jul 2025 12:12:57 +0200 Subject: [PATCH 08/17] fix: log error if branding file exists but cannot be loaded --- http/static.go | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/http/static.go b/http/static.go index 47d828c6..447471d2 100644 --- a/http/static.go +++ b/http/static.go @@ -124,7 +124,10 @@ func getStaticHandlers(store *storage.Storage, server *settings.Server, assetsFs if d.settings.Branding.Files != "" { if strings.HasPrefix(r.URL.Path, "img/") { fPath := filepath.Join(d.settings.Branding.Files, r.URL.Path) - if _, err := os.Stat(fPath); err == nil { + _, err := os.Stat(fPath) + if err != nil && !os.IsNotExist(err) { + log.Printf("could not load branding file override: %v", err) + } else if err == nil { http.ServeFile(w, r, fPath) return 0, nil } From 200b9a6c260e688a33d6b6f65f31f81a4e2a2278 Mon Sep 17 00:00:00 2001 From: Henrique Dias Date: Sun, 6 Jul 2025 12:20:49 +0200 Subject: [PATCH 09/17] chore(release): 2.36.3 --- CHANGELOG.md | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 2edff4b8..c804baeb 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,13 @@ All notable changes to this project will be documented in this file. See [standard-version](https://github.com/conventional-changelog/standard-version) for commit guidelines. +### [2.36.3](https://github.com/filebrowser/filebrowser/compare/v2.36.2...v2.36.3) (2025-07-06) + + +### Bug Fixes + +* log error if branding file exists but cannot be loaded ([3645b57](https://github.com/filebrowser/filebrowser/commit/3645b578cddb9fc8f25a00e0153fb600ad1b9266)) + ### [2.36.2](https://github.com/filebrowser/filebrowser/compare/v2.36.1...v2.36.2) (2025-07-06) From 65bbf44e3c0bff83e64193d46e9d6ad302952276 Mon Sep 17 00:00:00 2001 From: "transifex-integration[bot]" <43880903+transifex-integration[bot]@users.noreply.github.com> Date: Sun, 6 Jul 2025 07:57:21 +0000 Subject: [PATCH 10/17] feat: Translate frontend/src/i18n/en.json in zh_CN 100% translated source file: 'frontend/src/i18n/en.json' on 'zh_CN'. --- frontend/src/i18n/zh-cn.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/src/i18n/zh-cn.json b/frontend/src/i18n/zh-cn.json index daa45619..fac470e8 100644 --- a/frontend/src/i18n/zh-cn.json +++ b/frontend/src/i18n/zh-cn.json @@ -170,7 +170,7 @@ "commandRunnerHelp": "你可以在此设置在下列事件中执行的命令。每行必须写一条命令。可以在命令中使用环境变量 {0} 和 {1},使 {0} 与 {1} 相关联。关于此功能和可用环境变量的更多信息,请阅读 {2}。", "commandsUpdated": "命令已更新!", "createUserDir": "在添加新用户的同时自动创建用户的主目录", - "minimumPasswordLength": "Minimum password length", + "minimumPasswordLength": "最小密码长度", "tusUploads": "分块上传", "tusUploadsHelp": "File Browser 支持分块上传,在不佳的网络下也可进行高效、可靠、可续的文件上传", "tusUploadsChunkSize": "分块上传大小,例如 10MB 或 1GB", From e423395ef0bcd106ddc7d460c055b95b5208415e Mon Sep 17 00:00:00 2001 From: jagadam97 Date: Sun, 6 Jul 2025 16:52:26 +0530 Subject: [PATCH 11/17] fix: Upload progress size calculation --- frontend/src/stores/upload.ts | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/frontend/src/stores/upload.ts b/frontend/src/stores/upload.ts index 3ea93037..d9698255 100644 --- a/frontend/src/stores/upload.ts +++ b/frontend/src/stores/upload.ts @@ -74,7 +74,12 @@ export const useUploadStore = defineStore("upload", { if (state.progress.length === 0 || state.sizes.length === 0) { return "0 Bytes"; } - const sum = state.progress.reduce((acc, val) => +acc + +val, 0) as number; + const sum = state.progress.reduce( + (sum, p, i) => + (sum as number) + + (typeof p === "number" ? p : p ? state.sizes[i] : 0), + 0 + ) as number; return formatSize(sum); }, getTotalSize: (state) => { From 1e96fd9035d5185dc80970a2826ccb573b5f000e Mon Sep 17 00:00:00 2001 From: "transifex-integration[bot]" <43880903+transifex-integration[bot]@users.noreply.github.com> Date: Sun, 6 Jul 2025 16:46:44 +0000 Subject: [PATCH 12/17] feat: Translate frontend/src/i18n/en.json in zh_TW 99% of minimum 50% translated source file: 'frontend/src/i18n/en.json' on 'zh_TW'. Sync of partially translated files: untranslated content is included with an empty translation or source language content depending on file format --- frontend/src/i18n/zh-tw.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/src/i18n/zh-tw.json b/frontend/src/i18n/zh-tw.json index 7566675d..9bc1adb6 100644 --- a/frontend/src/i18n/zh-tw.json +++ b/frontend/src/i18n/zh-tw.json @@ -170,7 +170,7 @@ "commandRunnerHelp": "在這裡你可以設定在下面的事件中執行的命令。每行必須寫一條命令。可以在命令中使用環境變數 {0} 和 {1}。關於此功能和可用環境變數的更多資訊,請閱讀{2}.", "commandsUpdated": "命令已更新!", "createUserDir": "在新增新使用者的同時自動建立使用者的個人目錄", - "minimumPasswordLength": "Minimum password length", + "minimumPasswordLength": "密碼最短長度", "tusUploads": "分塊上傳", "tusUploadsHelp": "File Browser 支援分塊上傳,在不佳的網絡環境下也可進行高效、可靠、可續的檔案上傳", "tusUploadsChunkSize": "分塊上傳大小,例如 10MB 或 1GB", From b28952cb2582bd4eb44e91d0676e2803c458cf31 Mon Sep 17 00:00:00 2001 From: "transifex-integration[bot]" <43880903+transifex-integration[bot]@users.noreply.github.com> Date: Sun, 6 Jul 2025 16:51:07 +0000 Subject: [PATCH 13/17] feat: Translate frontend/src/i18n/en.json in zh_TW 100% translated source file: 'frontend/src/i18n/en.json' on 'zh_TW'. --- frontend/src/i18n/zh-tw.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/src/i18n/zh-tw.json b/frontend/src/i18n/zh-tw.json index 9bc1adb6..966cb14e 100644 --- a/frontend/src/i18n/zh-tw.json +++ b/frontend/src/i18n/zh-tw.json @@ -24,7 +24,7 @@ "ok": "確認", "permalink": "獲取永久連結", "previous": "上一個", - "preview": "Preview", + "preview": "預覽", "publish": "發佈", "rename": "重新命名", "replace": "更換", From bf73e4dea3b27c01c8f6e60fb2048e1a2122a70e Mon Sep 17 00:00:00 2001 From: Henrique Dias Date: Tue, 8 Jul 2025 07:29:13 +0200 Subject: [PATCH 14/17] fix: preview PDF is correctly displayed --- frontend/src/views/files/Preview.vue | 27 +++++++++++++++++---------- 1 file changed, 17 insertions(+), 10 deletions(-) diff --git a/frontend/src/views/files/Preview.vue b/frontend/src/views/files/Preview.vue index 7170e3da..1f12cadd 100644 --- a/frontend/src/views/files/Preview.vue +++ b/frontend/src/views/files/Preview.vue @@ -60,7 +60,7 @@
+