家庭网络与 NAS 部署
将 PicFast 运行在你自己的 NAS 上,图片数据完全由你掌控——没有云服务商、没有月费。本指南涵盖常见 NAS 平台的部署方法,以及在无公网 IP 的情况下将服务暴露至互联网的方案。
为什么选择 NAS?
NAS 是图床平台的理想运行环境:
- 硬盘空间本就充裕,图床的核心价值正是存储
- 现代 NAS 普遍原生支持 Docker
- 低功耗 7×24 小时运行
- 数据就在你的硬盘上、你的局域网内
NAS 平台
PicFast 可在任何支持 Docker 的平台上运行,以下是各平台的部署要点:
群晖 Synology
使用 Container Manager(原 Docker 套件)。通过 docker-compose 创建项目:
- 打开 Container Manager → 项目 → 新增
- 粘贴下方的 docker-compose 内容,修改路径和密钥
- 将数据卷映射到
/volume1/docker/picfast/uploads(或你的存储位置)
威联通 QNAP
使用 Container Station,从 docker-compose 创建应用,步骤与群晖类似。数据卷需指向 /share/ 下的共享文件夹。
TrueNAS
通过 Apps 界面的 Docker Compose 选项部署,或在 jail/VM 中直接使用 docker compose。ZFS 数据集非常适合作为上传和缩略图的卷挂载。
Unraid
在 Docker 选项卡中添加容器并使用自定义 compose 文件。数据卷指向 /mnt/user/picfast/ 即可享受 parity 保护。
通用 Linux / 树莓派
克隆仓库或直接使用 Docker Hub 镜像。树莓派用户使用 xbeta/picfast:latest(多架构镜像,含 ARM64)。
NAS 精简 compose 模板
以下是一份适合家庭部署的精简 docker-compose.yml,保存后执行 docker compose up -d:
services:
db:
image: postgres:16-alpine
restart: unless-stopped
environment:
POSTGRES_USER: picfast
POSTGRES_PASSWORD: picfast
POSTGRES_DB: picfast
volumes:
- pgdata:/var/lib/postgresql/data
app:
image: xbeta/picfast:latest
restart: unless-stopped
ports:
- "18080:8080"
environment:
PICFAST_DATABASE_URL: "postgres://picfast:picfast@db:5432/picfast?sslmode=disable"
PICFAST_JWT_SECRET: "replace-with-a-strong-random-value"
PICFAST_SERVER_BASE_URL: "https://your-domain.com"
PICFAST_APP_ADMIN_EMAIL: "admin@example.com"
PICFAST_APP_ADMIN_PASSWORD: "change-this-password"
PICFAST_STORAGE_LOCAL_ROOT: "/app/data/uploads"
PICFAST_STORAGE_THUMBNAIL_DIR: "/app/data/thumbnails"
volumes:
- uploads:/app/data/uploads
- thumbnails:/app/data/thumbnails
depends_on:
- db
volumes:
pgdata:
uploads:
thumbnails: 内网穿透:暴露服务到公网
多数家庭宽带没有固定公网 IP,即使有,在路由器上直接开端口也意味着安全风险。解决方案是隧道——一条加密的对外连接,将公网流量反向代理到你本地的服务,无需开放任何入站端口。
方案一:Cloudflare Tunnel(推荐)
免费、稳定,无需开放任何端口。前提是你拥有一个域名,且 DNS 托管在 Cloudflare。
配置步骤
- 在 NAS 或宿主机上安装
cloudflared - 认证:
cloudflared tunnel login - 创建隧道:
cloudflared tunnel create picfast - 编写配置文件
config.yml:
tunnel: <tunnel-id>
credentials-file: /home/user/.cloudflared/<tunnel-id>.json
ingress:
- hostname: pics.yourdomain.com
service: http://localhost:18080
- service: http_status:404 - 创建 DNS 记录:
cloudflared tunnel route dns picfast pics.yourdomain.com - 启动隧道:
cloudflared tunnel run picfast
长期运行建议将 cloudflared 加入 compose 作为额外服务:
tunnel:
image: cloudflare/cloudflared:latest
restart: unless-stopped
command: tunnel run
environment:
TUNNEL_TOKEN: "<your-tunnel-token>" Cloudflare Tunnel 提供 DDoS 防护、自动 SSL、全球 CDN 加速。但注意 Cloudflare 在中间解密流量——若对数据隐私有极致要求,可选择 Tailscale。
方案二:Tailscale
Tailscale 基于 WireGuard 搭建 Mesh 网络,有两种服务暴露模式:
Tailscale Serve(仅局域网/虚拟局域网)
在 tailnet 内部暴露服务,只有你网络中其他 Tailscale 设备可以访问:
tailscale serve --bg 18080 你的 PicFast 实例将通过 https://<node-name>.tailnet-name.ts.net 访问,仅限 tailnet 内。适合家庭私用。
Tailscale Funnel(公网访问)
将 Serve 延伸至公网,互联网上任何设备均可访问:
tailscale serve --bg 18080
tailscale funnel --bg 18080 Funnel 有限制:仅 443 端口,免费版有带宽上限。但配置极简,零 DNS 配置,开箱即用。
方案三:FRP(内网穿透)
FRP 是国内最常用的内网穿透方案,适用于 Cloudflare 和 Tailscale 速度不佳或不可用的场景。需要一台有公网 IP 的 VPS 作为中继。
服务端(VPS,有公网 IP)
# frps.toml
bindPort = 7000
vhostHTTPPort = 8080 客户端(你的 NAS,在内网)
# frpc.toml
serverAddr = "<vps-ip>"
serverPort = 7000
[[proxies]]
name = "picfast-web"
type = "http"
localPort = 18080
customDomains = ["pics.yourdomain.com"] VPS 收到 8080 端口的流量后,通过隧道转发到你的 NAS。FRP 速度快、灵活可控,但需要自己管理 VPS、用 Nginx 或 Caddy 处理 SSL 终结、付服务器的钱。
隧道方案对比
| Cloudflare Tunnel | Tailscale Funnel | FRP | |
|---|---|---|---|
| 公网访问 | ✅ | ✅ | ✅ |
| 需要域名 | 是 | 否 | 是(HTTPS 需要) |
| 需要 VPS | 否 | 否 | 是 |
| SSL / HTTPS | 自动 | 自动 | 手动(Nginx/Caddy) |
| 带宽 | 免费(合理使用) | 免费版有限 | 取决于 VPS |
| 隐私 | Cloudflare 解密 | 端到端加密 | 中继服务器可见流量 |
| 国内网络 | 部分可用 | 较慢 | ✅ 最佳 |
| 最适合 | 全球、生产环境 | 个人、私用 | 国内、全掌控 |
安全提醒
PICFAST_JWT_SECRET务必设为高强度随机值- 如非必要,关闭游客上传(
PICFAST_APP_ALLOW_GUEST_UPLOAD=false) - 创建好账号后关闭公开注册(
PICFAST_APP_ALLOW_REGISTRATION=false) - 首次启动时,初始化向导可在
/setup路径访问;设置PICFAST_APP_ADMIN_EMAIL和PICFAST_APP_ADMIN_PASSWORD可在无头部署时自动创建管理员并跳过向导 - 以上三种隧道方案均默认强制 HTTPS,无需额外配置证书
- 如用 FRP 部署在国内 VPS,建议在反向代理层配置请求频率限制以防范滥用