インターネットに公開
ネットワークの外からアクセスするには、ThirtyFile の前に HTTPS のリバースプロキシを配置します。
行うことは 3 つ
THIRTYFILE_SECURE_COOKIE=trueとTHIRTYFILE_TRUST_PROXY=trueで起動します。設定 を参照してください。- 以下の例でリバースプロキシを設定します。
- コントロールパネル › 全般 › サイトの URL に公開アドレスを入力します。
true(別のコンピューターならそのアドレス)にします。そうしないと全訪問者が同じ人として扱われ、1 人のパスワード失敗で全員が入れなくなります。プロキシがなければ false のままにします。同じコンピューターでプロキシを動かす場合は、そのコンピューターからだけ接続できるよう、-p 127.0.0.1:8080:8080(compose.yaml なら "127.0.0.1:8080:8080")で公開します。Docker の公開ポートはホストのファイアウォールを迂回します(ufw や firewalld では見えません)。-p 8080:8080 だと、接続するすべてのネットワークから HTTPS なしで到達できます。プロキシも 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 を 1 リクエストで送ります。nginx の既定の 1 MB では「413 Request Entity Too Large」で失敗します。大きなファイルも分割して送れます。WebDAV は各ファイルを 1 リクエストで送るので、同じ設定とclient_max_body_size 0を持つlocation /dav/を追加してください(無制限ですが ThirtyFile のアップロード上限は適用されます)。proxy_http_version 1.1はリクエスト間も接続を保持します。proxy_buffering offとproxy_request_buffering offは大きな転送を先にプロキシのディスクへ保存せず、ストリームで送ります。- 最初の
serverブロックはhttp://の訪問者を HTTPS に転送します。
同じ Docker Compose ファイルで Caddy を動かす
プロキシも Docker なら、両方を同じ compose.yaml に置きます。ThirtyFile のポートは公開せず、Compose が作るネットワークから Caddy だけが到達できます。
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)で使う名前を保持します。サービスの最後の 4 行は、各リリースの compose.yaml と同じく必要最小限の権限で動かします。以下の Traefik の例も同じです。
同じ場所の Caddyfile では、サービス名で ThirtyFile に接続します。
files.example.com {
reverse_proxy thirtyfile:8080 {
flush_interval -1
}
}
Traefik
Docker で Traefik が既に動いている場合(443 の entry point websecure と証明書 resolver letsencrypt)、ThirtyFile にラベルを付け、そのネットワークに参加させます。ポートは公開しません。
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 は転送をストリームで処理し、既定では本文サイズを制限しないため、追加設定は不要です。