從網際網路存取
要在本機網路以外存取 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 預設以串流方式傳輸上傳和下載,不限制請求體大小,無需額外設定。