インターネットに公開

ネットワークの外からアクセスするには、ThirtyFile の前に HTTPS のリバースプロキシを配置します。

このページの内容
  1. 行うことは 3 つ
  2. Caddy
  3. nginx
  4. 同じ Docker Compose ファイルで Caddy を動かす
  5. Traefik
  6. 公開する前に

行うことは 3 つ

  1. THIRTYFILE_SECURE_COOKIE=true と THIRTYFILE_TRUST_PROXY=true で起動します。設定 を参照してください。
  2. 以下の例でリバースプロキシを設定します。
  3. コントロールパネル › 全般 › サイトの 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;
    }
}

同じ 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 は転送をストリームで処理し、既定では本文サイズを制限しないため、追加設定は不要です。

公開する前に