Docker部署File Browser:轻量文件管理服务的生产级落地实践

发布时间:2026/7/8 6:36:22

Docker部署File Browser:轻量文件管理服务的生产级落地实践 1. 项目概述为什么用 Docker 部署 File Browser 是当前最稳的落地方式File Browser 是一个用 Go 语言编写的轻量级、无后端依赖的文件管理 Web 界面它不依赖数据库、不需 Node.js 运行时、不走 PHP-FPM整个二进制只有一个可执行文件启动即用。我从 2019 年开始在生产环境里用它替代传统的 FTP Nginx 目录列表方案覆盖了从树莓派 NAS、Ubuntu 小型服务器到阿里云 ECS 的全场景。但早期直接跑./filebrowser启动的方式很快暴露出几个硬伤进程挂了没人拉起、配置改错导致服务起不来、多用户权限难隔离、日志没归档、升级要手动替换二进制、HTTPS 配置和反向代理耦合太深——这些问题不是功能缺陷而是运维层面的“隐性成本”。直到我把整个部署流程切到 Docker才真正实现“一次配置三年不碰”。Docker 不是为炫技而存在它是解决“环境一致性”这个古老问题的终极缝合剂。File Browser 本身是 Go 编译的静态二进制天然适合容器化而 Docker 提供的进程隔离、资源限制、配置注入、卷挂载、网络抽象能力恰好把 File Browser 最脆弱的几个环节——比如用户目录映射、密码哈希存储、SSL 证书热更新、HTTP/HTTPS 端口暴露策略——全部封装成声明式配置。你不需要懂 Go 语言怎么交叉编译也不需要研究filebrowser.json里auth.method和auth.jwt.secret的生成逻辑更不用手写 systemd service 文件去保活。你只需要一条docker run命令或一个docker-compose.yml就能在 Ubuntu 22.04、CentOS 7、甚至 Windows WSL2 上获得完全一致的行为表现。这背后其实是 Go 语言和 Docker 的双重红利Go 的零依赖静态链接让镜像体积极小官方镜像仅 15MBDocker 的分层缓存机制让每次更新只下载差异层。我实测过在 100Mbps 带宽下从拉取镜像到服务就绪全程不到 8 秒——比手动下载二进制、解压、赋权、写配置、启动快 3 倍以上。更重要的是它彻底消除了“在我机器上能跑”的幻觉。你给同事发一个docker-compose.yml他docker-compose up -d之后看到的界面、权限、上传限制、预览行为和你本地一模一样。这不是理想主义是经过 27 台不同配置服务器验证过的工程事实。如果你正面临这些场景需要给非技术人员提供一个安全可控的文件上传入口想把老旧 NAS 的 Samba 共享转成现代 Web 界面要在 Kubernetes 集群里快速挂载 PVC 并暴露管理端或者只是单纯厌倦了每次系统升级后重配 Nginx 反代规则——那么 Docker 部署 File Browser 就不是“可选项”而是当前技术栈下最省心、最可持续、最容易交接的唯一合理路径。它不改变 File Browser 的本质却把它从一个“命令行玩具”升级成了可纳入 CI/CD 流水线的基础设施组件。2. 核心设计思路与方案选型深度拆解2.1 为什么放弃“直接运行二进制”而选择容器化很多人第一次接触 File Browser会直接去 GitHub Releases 页面下载对应平台的.tar.gz包解压后执行./filebrowser -r /data -a 0.0.0.0:8080。这种方式在测试环境确实够快但我在真实运维中踩过三次大坑足以让我永久弃用第一坑是权限失控。File Browser 默认以当前用户身份运行如果用 root 启动它就能读写/root下所有文件如果用普通用户启动又可能因umask设置不当导致上传的文件对 Web 服务不可读。而 Docker 的--user参数可以强制指定 UID/GID配合-v /host/data:/srv:rw,z的 SELinux 标签能从内核层锁定访问边界。我曾在线上误将--user 0写成--user root结果容器内进程真以 root 身份运行幸好有--read-only挂载根文件系统兜底。第二坑是配置漂移。File Browser 的配置项多达 40 个分散在命令行参数、JSON 配置文件、环境变量三处。比如--port控制监听端口--baseurl控制前端路由前缀--database指定 SQLite 路径三者必须严格匹配。某次我升级到 v2.32.0 后发现--baseurl不再支持斜杠结尾但旧版配置没报错导致前端 JS 加载 404。Docker 镜像通过ENTRYPOINT封装默认启动逻辑把易错参数固化在Dockerfile中用户只需关心FILEBROWSER_ROOT和FILEBROWSER_PORT这两个核心环境变量其余由镜像内部处理。第三坑是升级灾难。File Browser 每月发布 2~3 个 patch 版本修复安全漏洞如 CVE-2023-45803 的路径遍历绕过。手动升级意味着停止旧进程 → 下载新包 → 校验 SHA256 → 替换二进制 → 重启 → 验证功能。而 Docker 升级只需docker pull filebrowser/filebrowser:latest docker-compose up -d镜像层复用让下载量常低于 1MB且--restartunless-stopped策略保证进程崩溃自动恢复。我们团队约定每周三凌晨自动执行docker image prune -f清理旧镜像零人工干预。提示不要迷信:latest标签。我吃过亏——某次上游镜像未及时更新基础 OS 补丁导致容器内curl命令解析 DNS 失败。现在所有生产环境都锁定具体版本号如filebrowser/filebrowser:v2.33.0并通过docker manifest inspect验证多架构支持。2.2 官方镜像 vs 自建镜像为什么推荐直接使用filebrowser/filebrowserFile Browser 官方维护了 Docker Hub 镜像https://hub.docker.com/r/filebrowser/filebrowser这是目前最值得信赖的选择。有人会问“既然 Go 语言编译简单为什么不自己写 Dockerfile” 我做过对比测试结论很明确自建镜像在三个维度全面落后。首先是构建可靠性。官方 Dockerfile 使用golang:alpine作为 builder 阶段基础镜像编译时启用-ldflags-s -w去除调试信息最终镜像基于alpine:latest大小稳定在 14.8MB。而自建镜像若用ubuntu:22.04作基础即使只安装ca-certificates和tzdata体积也超 85MB且 Alpine 的 musl libc 与 Go 的 CGO_ENABLED0 天然兼容避免了 glibc 版本冲突导致的exec format error。我曾用debian:slim构建结果在 ARM64 服务器上启动失败错误日志显示standard_init_linux.go:228: exec user process caused: no such file or directory——根本原因是 Debian 的动态链接器路径与 Go 静态链接假设不一致。其次是安全更新时效性。官方镜像由 CI/CD 流水线自动触发GitHub Release 发布 → GitHub Actions 编译多架构镜像 → Docker Hub 自动推送 → 扫描 CVE 漏洞。我们用 Trivy 扫描过 v2.32.0 镜像发现只有 1 个低危漏洞openssl的CVE-2023-0286而该漏洞在 v2.32.1 中已修复。自建镜像若不接入 SBOM软件物料清单生成和漏洞扫描很可能长期携带已知风险。最后是功能完整性。官方镜像内置了filebrowser命令的完整参数集并通过ENTRYPOINT [/filebrowser]封装支持所有原生命令行选项。更重要的是它预置了filebrowser.db初始化逻辑当挂载的数据库路径不存在时自动创建带默认管理员用户的 SQLite 数据库。而自建镜像若漏掉--no-auth或--database参数容器会立即退出日志只显示failed to open database新手根本无法定位。注意官方镜像默认监听:8080但不暴露该端口。你必须通过-p 8080:8080显式映射否则容器内服务虽运行外部无法访问。这是 Docker 网络模型的基本约束不是 Bug。2.3 网络模式选型bridge、host还是macvlanDocker 提供三种主流网络驱动File Browser 部署中应严格按场景选择bridge模式默认推荐容器通过虚拟网桥docker0与宿主机通信端口映射由iptables规则实现。优势是隔离性强、IP 可预测如172.17.0.2适合绝大多数场景。缺点是额外一层 NAT吞吐略降实测万兆网卡下影响 3%。我们所有生产环境均采用此模式并通过--networkweb创建独立网络避免端口冲突。host模式慎用容器直接使用宿主机网络命名空间-p参数失效netstat -tuln | grep :8080能直接看到容器进程。优势是零网络开销适合极致性能要求。但致命缺陷是无法多实例共存端口抢占、SELinux 策略失效、防火墙规则需额外配置。某次我误用--networkhost部署 File Browser结果它监听了0.0.0.0:8080与正在运行的 Jenkins 服务冲突导致整个 CI 流水线中断。macvlan模式高级为容器分配独立 MAC 地址和 IP使其像物理机一样接入局域网。适合需要被局域网其他设备直接访问的场景如 NAS 管理界面。但要求宿主机网卡支持promiscuous模式且交换机需开启混杂模式家庭路由器通常不支持。我们只在 IDC 机房用过配置复杂度远超收益。实操心得永远优先用bridge模式。若需 HTTPS用 Nginx 反向代理若需局域网直连用--ip指定固定容器 IP而非切换网络驱动。3. 核心细节解析与实操要点3.1 目录挂载的黄金法则三卷分离原则File Browser 的数据持久化涉及三个关键路径必须用独立卷volume或绑定挂载bind mount隔离这是避免数据混乱的核心纪律根目录-v /host/data:/srv这是用户实际浏览和操作的文件位置。必须使用:z或:ZSELinux 标签CentOS/RHEL或:rwUbuntu/Debian。/srv是 File Browser 容器内的默认工作目录不能更改。我见过太多人写成-v /host/data:/data结果容器启动后报错chdir /data: no such file or directory——因为镜像内没有/data目录。数据库目录-v /host/db:/database存储用户、权限、设置等元数据。SQLite 数据库文件filebrowser.db必须落在此路径。关键点在于该路径必须可写且不能与根目录同盘。曾有客户把数据库挂载到/data/filebrowser.db结果上传大文件时磁盘满SQLite 写入失败整个服务卡死。正确做法是单独挂载 SSD 分区如-v /ssd/db:/database。配置目录-v /host/config:/config存放filebrowser.json配置文件。虽然 File Browser 支持命令行参数覆盖但复杂配置如 OAuth2、LDAP 集成必须用 JSON。注意该卷只需读取权限:ro防止容器内进程意外修改配置。提示用docker volume create fb-data创建命名卷比绑定挂载更安全。命名卷由 Docker 管理路径、权限和生命周期docker volume rm可彻底清理避免rm -rf /host/data误删宿主机文件。3.2 用户认证体系的实战配置策略File Browser 提供四种认证方式json内置 SQLite、basicHTTP Basic、proxy反向代理透传、oauth2第三方登录。生产环境我只推荐前两种理由如下json模式默认推荐用户数据存于 SQLite通过filebrowser users add命令管理。优势是完全自治无需外部依赖。但必须注意添加用户时密码会以 bcrypt 哈希形式存入数据库不能直接编辑filebrowser.db。我曾用sqlite3 filebrowser.db UPDATE users SET passwordxxx强制修改结果因哈希格式错误导致所有用户无法登录。正确流程是进入容器执行filebrowser users update admin --password newpass。basic模式轻量替代通过--auth.methodbasic启用用户名密码由htpasswd生成。优势是配置简单适合单用户快速部署。但缺陷明显密码明文传输必须配 HTTPS、不支持多用户权限分级、无法记录操作日志。我们只在临时调试环境用。oauth2模式谨慎评估支持 GitHub、Google 等登录。但需配置client_id、client_secret、auth.oauth2.provider等 7 个参数且 OAuth2 令牌刷新逻辑复杂。某次 Google API 密钥轮换导致所有用户登录失败 4 小时根源是auth.oauth2.refresh_token过期未处理。除非公司已有成熟 OAuth2 基础设施否则不建议引入。实操技巧用--auth.methodjson --auth.jwt.secretyour-secret-key强制 JWT 签名密钥。默认密钥是随机生成的容器重启后失效导致所有登录 Session 失效。设为固定值后Session 可跨重启保持。3.3 HTTPS 部署的两种可靠路径File Browser 本身支持 HTTPS--cert和--key参数但我不推荐直接在容器内配置原因有三证书续期麻烦需重启容器、私钥暴露风险高、无法复用现有 Nginx 配置。更优解是Nginx 反向代理 Lets Encrypt 自动续期这是经过 3 年验证的黄金组合。路径一Nginx 反向代理推荐upstream filebrowser { server 127.0.0.1:8080; # 容器 bridge 网络 IP } server { listen 443 ssl http2; server_name files.example.com; ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem; location / { proxy_pass http://filebrowser; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection upgrade; } }关键点在于X-Forwarded-*头部必须透传否则 File Browser 无法识别真实客户端 IP导致上传限速、IP 黑名单等功能失效。路径二Caddy 一键 HTTPS极简Caddy 的reverse_proxy指令自动处理 HTTPS配置仅需 3 行files.example.com { reverse_proxy 127.0.0.1:8080 }Caddy 会自动申请证书、续期、重定向 HTTP 到 HTTPS。我们测试环境全用 Caddy部署时间从 Nginx 的 15 分钟压缩到 47 秒。注意若用--baseurl/fb/Nginx 配置中location必须匹配且proxy_pass末尾不能加/否则路径双斜杠导致 404。4. 实操过程与核心环节实现4.1 从零开始Ubuntu 22.04 上的完整部署流程以下是在一台全新 Ubuntu 22.04 服务器上的逐行操作记录已通过 12 次重装验证无任何遗漏步骤第一步安装 Docker Engine非 Docker Desktop# 卸载旧版本如有 sudo apt remove docker docker-engine docker.io containerd runc # 安装依赖 sudo apt update sudo apt install -y \ ca-certificates \ curl \ gnupg \ lsb-release # 添加 Docker 官方 GPG 密钥 sudo mkdir -p /etc/apt/keyrings curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg # 添加稳定版仓库 echo \ deb [arch$(dpkg --print-architecture) signed-by/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \ $(lsb_release -cs) stable | sudo tee /etc/apt/sources.list.d/docker.list /dev/null # 安装 Docker Engine sudo apt update sudo apt install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin # 验证安装 sudo docker run hello-world关键说明必须用docker-ce社区版而非docker-desktop桌面 GUI 工具仅限个人开发。docker-compose-plugin是新版 Compose V2取代了旧版docker-compose二进制命令统一为docker compose。第二步创建持久化目录结构# 创建数据、数据库、配置三目录 sudo mkdir -p /opt/filebrowser/{data,db,config} # 设置权限Docker 默认以 UID 1001 运行需匹配 sudo chown -R 1001:1001 /opt/filebrowser/db /opt/filebrowser/config sudo chmod -R 755 /opt/filebrowser/data # 初始化配置文件最小化 sudo tee /opt/filebrowser/config/filebrowser.json EOF { port: 8080, baseURL: /, address: 0.0.0.0, log: stdout, database: /database/filebrowser.db, root: /srv } EOF注意chown 1001:1001是关键File Browser 官方镜像的USER指令设为1001若宿主机目录属主不是该 UID容器内进程将无权写入数据库。第三步运行容器单命令版sudo docker run -d \ --name filebrowser \ --restartunless-stopped \ --user 1001:1001 \ --networkweb \ --ip172.18.0.10 \ -v /opt/filebrowser/data:/srv \ -v /opt/filebrowser/db:/database \ -v /opt/filebrowser/config:/config:ro \ -p 8080:8080 \ -e FILEBROWSER_ROOT/srv \ -e FILEBROWSER_DATABASE/database/filebrowser.db \ -e FILEBROWSER_PORT8080 \ filebrowser/filebrowser:v2.33.0解析--ip172.18.0.10需先创建网络docker network create --subnet172.18.0.0/16 web-e环境变量非必需但显式声明可提高可读性v2.33.0版本号请根据 https://github.com/filebrowser/filebrowser/releases 最新稳定版调整。第四步初始化管理员账户# 进入容器执行用户创建 sudo docker exec -it filebrowser filebrowser users add admin Pssw0rd --perm.admin # 验证用户是否创建成功 sudo docker exec filebrowser filebrowser users list输出应包含admin用户isAdmin字段为true。此时访问http://server-ip:8080输入账号密码即可登录。4.2 生产级部署docker-compose.yml 详解对于需要长期维护的环境docker-compose.yml是唯一可接受的方案。以下是我们线上环境使用的精简版已删除注释实际使用请保留version: 3.8 services: filebrowser: image: filebrowser/filebrowser:v2.33.0 container_name: filebrowser restart: unless-stopped user: 1001:1001 network_mode: bridge ports: - 8080:8080 volumes: - /opt/filebrowser/data:/srv:rw,z - /opt/filebrowser/db:/database:rw,z - /opt/filebrowser/config:/config:ro environment: - FILEBROWSER_ROOT/srv - FILEBROWSER_DATABASE/database/filebrowser.db - FILEBROWSER_PORT8080 - FILEBROWSER_LOGstdout - FILEBROWSER_NO_AUTHfalse command: [-c, /config/filebrowser.json] healthcheck: test: [CMD, curl, -f, http://localhost:8080/api/status] interval: 30s timeout: 10s retries: 3 start_period: 40s volumes: fb-data: fb-db: fb-config:关键字段解读healthcheckDocker 原生健康检查curl http://localhost:8080/api/status返回 200 即认为健康。start_period: 40s给容器足够时间初始化数据库避免启动瞬间检测失败导致反复重启。command: [-c, /config/filebrowser.json]强制使用挂载的 JSON 配置覆盖镜像默认行为。volumes声明段定义命名卷但实际挂载仍用绑定挂载/opt/...此处仅为 Compose 文件完整性。实操心得用docker compose up -d --remove-orphans启动--remove-orphans会清理旧版容器残留避免docker ps中出现重复容器。4.3 权限精细化控制基于角色的访问策略File Browser 的权限模型基于“角色role→ 用户组group→ 用户user”三级结构。默认只有admin角色但生产环境必须创建受限角色。以下是为市场部同事配置“只读上传”权限的完整流程第一步创建角色marketing-rosudo docker exec filebrowser filebrowser roles create marketing-ro \ --perm.downloadtrue \ --perm.executefalse \ --perm.createfalse \ --perm.renamefalse \ --perm.modifyfalse \ --perm.deletefalse \ --perm.sharetrue \ --perm.uploadtrue \ --perm.archivetrue说明--perm.uploadtrue允许上传但--perm.createfalse禁止新建文件夹--perm.deletefalse禁止删除形成安全边界。第二步创建用户组marketing并关联角色sudo docker exec filebrowser filebrowser groups create marketing \ --rolemarketing-ro \ --scope/srv/marketing--scope限定该组只能访问/srv/marketing子目录即使用户知道其他路径也无法越界。第三步添加用户到组sudo docker exec filebrowser filebrowser users add market-user Pssw0rd \ --groupmarketing \ --perm.adminfalse此时market-user登录后界面只显示/marketing目录且右键菜单中“新建文件夹”、“删除”选项灰显。提示用filebrowser users update可随时调整用户所属组无需重建用户。5. 常见问题与排查技巧实录5.1 启动失败的五大高频原因及速查表现象可能原因排查命令解决方案docker logs filebrowser显示failed to open database: no such file or directory数据库挂载路径错误或权限不足sudo ls -l /opt/filebrowser/db检查目录是否存在执行sudo chown 1001:1001 /opt/filebrowser/db容器状态为Restarting (1)循环重启配置文件语法错误或端口被占用sudo docker exec filebrowser cat /config/filebrowser.json用jq . /config/filebrowser.json验证 JSON 格式sudo ss -tuln | grep :8080查端口访问http://ip:8080显示Connection refused端口未映射或防火墙拦截sudo docker port filebrowser确认输出为8080/tcp - 0.0.0.0:8080sudo ufw status检查防火墙登录后界面空白浏览器控制台报Failed to load resource: the server responded with a status of 404 ()--baseurl与反向代理路径不匹配sudo docker exec filebrowser filebrowser config get检查baseURL值确保 Nginxlocation与之完全一致上传大文件100MB时进度条卡住最终 413 错误Nginx 默认client_max_body_size1msudo nginx -t sudo nginx -s reload在 Nginxserver块中添加client_max_body_size 2G;实操心得用docker inspect filebrowser查看容器详细信息重点关注Mounts挂载是否成功、NetworkSettingsIP 和端口映射、State健康状态三个字段。5.2 文件上传失败的深度诊断流程上传失败是最常被问的问题但 90% 的案例都源于同一类配置链断裂。以下是标准诊断路径第一层确认容器内服务状态# 检查容器是否健康 sudo docker ps -f namefilebrowser --format table {{.Status}}\t{{.Names}} # 进入容器测试本地上传 sudo docker exec -it filebrowser sh # 在容器内执行 curl -X POST http://localhost:8080/api/resources -F file/etc/hosts # 若返回 201 Created则容器内服务正常第二层验证挂载目录权限# 检查宿主机目录权限 ls -ld /opt/filebrowser/data # 正确输出应为drwxr-xr-x 1001 1001 ... # 若显示 root:root执行 sudo chown -R 1001:1001 /opt/filebrowser/data第三层检查 SELinux仅 CentOS/RHEL# 查看 SELinux 状态 sudo sestatus # 若为 enforcing需添加 z 标签 # 修改 docker run 命令中的挂载为-v /opt/filebrowser/data:/srv:rw,z # 或临时禁用不推荐sudo setenforce 0第四层Nginx 代理层调优# 在 server 块中添加以下参数 client_max_body_size 2G; client_body_timeout 300; proxy_connect_timeout 300; proxy_send_timeout 300; proxy_read_timeout 300; proxy_buffering off;proxy_buffering off是关键避免 Nginx 缓冲大文件导致前端假死。5.3 日志分析与审计追踪实战File Browser 默认将日志输出到stdoutDocker 会捕获并提供结构化查询实时跟踪上传行为# 查看最近 100 行日志过滤 POST 请求 sudo docker logs --tail 100 --follow filebrowser 21 | grep POST /api/resources # 输出示例{level:info,msg:POST /api/resources,method:POST,path:/api/resources,status:201,size:1024,latency:123456789,time:2024-05-20T10:23:45Z}导出七天日志用于审计# 导出为 JSONL 格式每行一个 JSON 对象 sudo docker logs --since 7d filebrowser --timestamps /tmp/fb-7days.log # 用 jq 提取所有上传成功的文件名 cat /tmp/fb-7days.log | jq -r select(.msg POST /api/resources and .status 201) | .path | sort | uniq -c | sort -nr提示在filebrowser.json中添加log: /var/log/filebrowser.log可将日志写入文件但需额外挂载日志卷并配置 logrotate。6. 运维进阶备份、升级与灾备方案6.1 数据库备份的自动化脚本File Browser 的核心资产是filebrowser.db必须每日备份。以下脚本已运行 18 个月零故障#!/bin/bash # /usr/local/bin/backup-filebrowser.sh DB_PATH/opt/filebrowser/db/filebrowser.db BACKUP_DIR/backup/filebrowser DATE$(date %Y%m%d_%H%M%S) KEEP_DAYS30 # 创建备份目录 mkdir -p $BACKUP_DIR # 使用 sqlite3 命令行工具备份避免文件被锁 sudo docker exec filebrowser sqlite3 $DB_PATH .backup $BACKUP_DIR/filebrowser_$DATE.db # 压缩备份 gzip $BACKUP_DIR/filebrowser_$DATE.db # 清理 30 天前的备份 find $BACKUP_DIR -name filebrowser_*.db.gz -mtime $KEEP_DAYS -delete # 验证最新备份完整性 LATEST$(ls -t $BACKUP_DIR/filebrowser_*.db.gz | head -1) if gunzip -t $LATEST; then echo Backup OK: $LATEST else echo Backup FAILED: $LATEST | mail -s FileBrowser Backup Alert adminexample.com fi加入 crontab0 2 * * * /usr/local/bin/backup-filebrowser.sh每天凌晨 2 点执行。6.2 无缝升级的双容器蓝绿部署为避免升级时服务中断我们采用蓝绿部署第一步启动新版本容器绿色sudo docker run -d \ --name filebrowser-v2.34.0 \ --networkweb \ --ip172.18.0.11 \ -v /opt/filebrowser/data:/srv:rw,z \ -v /opt/filebrowser/db:/database:rw,z \ -v /opt/filebrowser/config:/config:ro \ -p 8081:8080 \ filebrowser/filebrowser:v2.34.0第二步验证绿色容器curl -s http://localhost:8081/api/status | jq .version # 应输出 2.34.0第三步切换 Nginx 上游# 修改 upstream 指向新 IP upstream filebrowser { server 127.0.0.1:8081; # 原为 8080 } # 重载 Nginx sudo nginx -s reload第四步停用旧容器蓝色sudo docker stop filebrowser sudo docker rm filebrowser sudo docker rename filebrowser-v2.34.0 filebrowser注意数据库文件共享因此新旧版本必须兼容。File Browser 保证小版本间数据库格式向后兼容如 v2.33.x → v2.34.x但跨大版本v1.x → v2.x需手动迁移。6.3 灾备恢复的分钟级响应流程当服务器硬盘损坏时恢复流程如下在新服务器安装 Docker创建相同目录结构从备份中恢复最新filebrowser.db.gz到/opt/filebrowser/db/

相关新闻