從網際網路存取

要在本機網路以外存取 ThirtyFile,請在前方部署支援 HTTPS 的反向代理。

本頁內容
  1. 需要完成三件事
  2. Caddy
  3. nginx
  4. 在同一 Docker Compose 檔案中執行 Caddy
  5. Traefik
  6. 公開存取前

需要完成三件事

  1. 啟動 ThirtyFile 時設定 THIRTYFILE_SECURE_COOKIE=true 和 THIRTYFILE_TRUST_PROXY=true。參閱設定。
  2. 依照下方任一範例設定反向代理。
  3. 在控制台 › 一般 › 網站網址填寫公開位址。
代理設定必須符合實際部署。使用代理時必須為 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;
    }
}

在同一 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 預設以串流方式傳輸上傳和下載,不限制請求體大小,無需額外設定。

公開存取前