通过互联网访问

要在本地网络以外访问 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 默认以流式方式传输上传和下载,不限制请求体大小,无需额外设置。

公开访问前