FileBrowser: 一款文件服务器#

我曾经想过组一台 NAS, 但仔细想想, 这简直是在创造需求而非解决问题, 事实上我可能根本用不上 NAS, 大部分时间只需要一个运行在树莓派上简单的文件服务器就够了.

对于这种运行在 linux 上的服务程序, 我有自己的一套挑选标准:

  • 应当是使用原生语言编写、无运行时的, 例如使用 Rust, Go, C/C++ 等, 最好是单一可执行文件;
  • KISS, 即 Keep It Simple & Stupid, 功能克制, 页面简单, 只做好自己该做的事, 不要加一堆用不到的功能, 让软件变得臃肿不堪.

综合来说, 我最后选了 File Browser, 因为它是用 Go 编写的, 只有最简单的文件上传、下载、(图片) 预览等功能, 不像其他文件服务器大包大揽, 还非得加入在线编辑之类用不上的功能; 另外, 它的网页也相当耐看.

配置服务#

下载它的可执行文件后, 在一个无关紧要的空目录运行 ./filebrowser, 程序将在此处生成一个 filebrowser.db 用于储存配置. 我们修改的配置项也将储存在这个数据库内. 生成了数据库后, 就可以用 Ctrl-C 结束运行了.

2026/07/16 17:42:56 No config file used
2026/07/16 17:42:56 WARNING: filebrowser.db can't be found. Initialing in /tmp/filebrowser/
2026/07/16 17:42:56 Using database: /tmp/filebrowser/filebrowser.db
2026/07/16 17:42:56 Performing quick setup
2026/07/16 17:42:56 User 'admin' initialized with randomly generated password: yFgD8wKg0yS1YrGF
2026/07/16 17:42:56 Listening on 127.0.0.1:8080
^C2026/07/16 17:44:34 Got signal: interrupt
2026/07/16 17:44:34 Stopped serving new connections.
2026/07/16 17:44:34 Graceful shutdown complete.

输出的日志显示程序创建了一个默认管理员用户, ID 始终为 admin, 密码随机, 这里是 yFgD8wKg0yS1YrGF.

程序的所有可配置项都在其 官网 上提供, 这里我们进行几项必要的修改:

  • filebrowser config set --root /srv/filebrowser
    将文件服务器的显示目录设为 /sev/filebrowser. 默认情况下是当前目录 (.), 你可以将你想要显示的目录软链接到上述目录.
  • filebrowser config set --port 1314
    修改监听端口避免与其他 http 服务冲突, 默认是 8080.

好了, 再运行 ./filebrowser, 程序应该读取了修改过的配置数据库, 并开始在 127.0.0.1:1314 上工作了. 你可以访问这个地址, 使用刚才打印出的 ID 和密码登录. 大部分设置都可以在网页中通过图形化的方式修改, 包括增删新用户等. 顺便一提, 软件自带中文页面.

服务化#

我们计划将 filebrowser 注册为一个 systemd 服务, 这样可以更方便地管理它的启停和日志等.

首先, 将可执行文件移动到 /usr/local/bin 或者其他在环境变量中的目录, 将数据库移动到 /etc/filebrowser/filebrowser.db. 在 /etc/systemd/system 新建文件 filebrowser.service

# /etc/systemd/system/filebrowser.service
[Unit]
Description = FileBrowser: Simple file server
After = syslog.target

[Service]
Type = simple
User = root
ExecStart = /usr/local/bin/filebrowser --database /etc/filebrowser/filebrowser.db
Restart = on-failure

[Install]
WantedBy = multi-user.target

其中用 --database 选项显式指明了配置数据库所在的位置.

重新加载 systemd 服务文件, 你应该可以用 systemctl status filebrowser 等一系列指令管理 filebrowser 了, 它产生的日志也被 journald 同一进行管理.

反向代理#

一台服务器网络安全的最佳实践是默认拒绝策略, 即先封禁所有端口的出入站流量, 再按需开启少数几个确实有必要的端口, 例如 22 (ssh), 80 (http), 443 (https) 等等. 我们用 nginx 通过反向代理复用 80 端口, 避免为文件服务器开启新端口, 否则将会提高管理成本, 还有可能引入新的安全问题.

Nginx 要求配置文件层级为 http > server > location. 我们在 /etc/nginxsites-available 目录中新建 server 级别的配置, 并且将其软链接到 sites-enabled 目录中, 这一目录中的配置文件将被自动引入默认的 http 块中.

下面是一个用于内网环境的简易 server 块:

# /etc/nginx/sites-available/intra
server {
    listen 80;
    listen [::]:80;
    server_name 192.168.0.103;

    allow 192.168.0.0/24;
    deny all;

    include /etc/nginx/rules-available/filebrowser.conf;
    # include /etc/nginx/rules-available/xx.conf;
}

server 块内的 location 块有顺序要求. 例如, 地址 /filebrowser/ 可以同时被 location /location /filebrowser/ 两者捕获, 最终实际进入哪个块取决于定义顺序. 所以, 最好按 复杂、具体在上, 简单、普遍在下的原则排列 location.

我们在 server 块中引入了若干 location 块来模块化地管理站点. 反向代理相关的配置如下:

# /etc/nginx/rules-available/filebrowser.conf
location /filebrowser/ {
    proxy_pass http://filebrowser_server/;

    proxy_http_version 1.1;
    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_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
}

rules-available 目录并非原生的 nginx 目录, 我创建这一目录是为了更方便地管理和复用 location 块.

此目录内的配置文件最好以 .conf 结尾, 并在 server 块中用 include /etc/nginx/rules-available/*.conf 的方式导入. 这样做是为了可以用 mv xx.conf xx.conf.disabled 的方式方便地禁用某配置.

这里引用了一个 upstream 块, 来更清晰直观地管理代理目标:

# /etc/nginx/sites-available/upstream
upstream filebrowser_server {
    server 127.0.0.1:1314;
}

附录: Nginx 作为文件服务器#

File Browser 很好, 也很安全, 例如当你访问 .html 资源时, 它将只以源代码形式展示, 而不会将其渲染为页面. 这当然是为了避免访问到不安全的文件而被攻击或注入, 但是如果我们真的想要浏览器渲染它而非查看源码呢?

好在我们还有 nginx 作为候补. 它也可以作为一个简陋的文件服务器, 其功能相比 filebrowser 或其它简直是云泥之别, 但它的确可以用于渲染 html 页面, 很适合作为静态页面展示, 由用户手动导航到它感兴趣的文件中.

要做到这一点, 只需如下设置 location:

location /pages/ {
    alias /srv/pages/;

    autoindex on;
    autoindex_exact_size off;
    autoindex_localtime on;

    charset utf-8;
}

使用 nginx 作为文件服务器, 请务必做好权限管理, 避免泄露个人隐私到公网! 毕竟如果不做鉴权 (例如使用 auth_basic), 任何人都可以访问你的文件.

Created in July 16, 2026 Last modified in July 16, 2026