通过互联网访问
要在本地网络以外访问 ThirtyFile,请在前方部署支持 HTTPS 的反向代理。
需要完成三件事
- 启动 ThirtyFile 时设置
THIRTYFILE_SECURE_COOKIE=true和THIRTYFILE_TRUST_PROXY=true。参阅设置。 - 按照下方任一示例配置反向代理。
- 在控制面板 › 常规 › 网站地址填写公开地址。
代理设置必须符合实际部署。使用代理时必须为
true(代理位于另一台电脑时,填写代理地址),否则所有访客都会被视为同一人,一人的密码错误会导致所有人被限制登录。不使用代理时必须保持 false。代理与 ThirtyFile 位于同一电脑时,让 ThirtyFile 仅能从本机访问:端口发布为 -p 127.0.0.1:8080:8080(compose.yaml 中为 "127.0.0.1:8080:8080")。Docker 发布的端口会绕过电脑防火墙(ufw 和 firewalld 无法拦截),所以 -p 8080:8080 会让电脑所在的所有网络都能通过未加密 HTTP 访问 ThirtyFile。如果代理也运行在 Docker 中,则不发布任何端口(参阅下方)。
Caddy
Caddy 会自动获取和续期证书。
files.example.com {
reverse_proxy 127.0.0.1:8080 {
flush_interval -1
}
}
nginx
server {
listen 80;
server_name files.example.com;
return 301 https://$host$request_uri;
}
server {
listen 443 ssl;
server_name files.example.com;
# ssl_certificate …; ssl_certificate_key …;
location / {
proxy_pass http://127.0.0.1:8080;
proxy_http_version 1.1;
proxy_set_header Host $http_host;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_set_header X-Forwarded-Proto $scheme;
client_max_body_size 64m;
proxy_request_buffering off;
proxy_buffering off;
proxy_read_timeout 1h;
}
}
client_max_body_size 64m是可用的最小值:上传使用 32 MB 分块,在线编辑器则单次请求保存最多 20 MB 文件。nginx 默认的 1 MB 会导致上传和保存出现“413 Request Entity Too Large”。更大的文件仍可逐块上传。WebDAV 客户端一次请求发送完整文件;通过 nginx 使用时,请添加相同配置的location /dav/区块,并设置client_max_body_size 0(无限制;ThirtyFile 自身的上传大小限制仍适用)。proxy_http_version 1.1让请求之间保持与 ThirtyFile 的连接;proxy_buffering off和proxy_request_buffering off让大文件下载和上传直接流式传输,避免先存到代理磁盘。- 第一个
server区块将输入http://的访客重定向到 HTTPS 地址。
在同一 Docker Compose 文件中运行 Caddy
如果代理也运行在 Docker 中,将两者放入同一个 compose.yaml。ThirtyFile 不发布任何端口,只有 Caddy 可通过 Compose 为该文件创建的网络访问它。
services:
thirtyfile:
image: ghcr.io/thirtyfile/thirtyfile:latest
container_name: thirtyfile
restart: unless-stopped
volumes:
- ./data:/data
- ./storage:/storage
environment:
THIRTYFILE_SECURE_COOKIE: "true"
THIRTYFILE_TRUST_PROXY: "true"
read_only: true
cap_drop: [ALL]
cap_add: [CHOWN, SETUID, SETGID, DAC_READ_SEARCH]
security_opt: ["no-new-privileges:true"]
caddy:
image: caddy:2
restart: unless-stopped
ports:
- "80:80"
- "443:443"
volumes:
- ./Caddyfile:/etc/caddy/Caddyfile:ro
- ./caddy-data:/data
container_name 保留其他指南命令使用的名称(docker exec thirtyfile …、docker logs thirtyfile);服务最后四行让 ThirtyFile 仅使用必要权限,与每个版本的 compose.yaml 一致。下方 Traefik 示例也包含这些设置。
在旁边创建 Caddyfile,通过服务名访问 ThirtyFile:
files.example.com {
reverse_proxy thirtyfile:8080 {
flush_interval -1
}
}
Traefik
如果 Traefik 已在 Docker 运行(443 端口使用 websecure 入口,证书解析器为 letsencrypt),给 ThirtyFile 添加标签,并加入 Traefik 网络。不发布任何端口。
services:
thirtyfile:
image: ghcr.io/thirtyfile/thirtyfile:latest
container_name: thirtyfile
restart: unless-stopped
volumes:
- ./data:/data
- ./storage:/storage
environment:
THIRTYFILE_SECURE_COOKIE: "true"
THIRTYFILE_TRUST_PROXY: "true"
read_only: true
cap_drop: [ALL]
cap_add: [CHOWN, SETUID, SETGID, DAC_READ_SEARCH]
security_opt: ["no-new-privileges:true"]
networks: [traefik]
labels:
traefik.enable: "true"
traefik.http.routers.thirtyfile.rule: Host(`files.example.com`)
traefik.http.routers.thirtyfile.entrypoints: websecure
traefik.http.routers.thirtyfile.tls.certresolver: letsencrypt
traefik.http.services.thirtyfile.loadbalancer.server.port: "8080"
networks:
traefik:
external: true
Traefik 默认以流式方式传输上传和下载,不限制请求体大小,无需额外设置。