Развёртывание · s5w

За обратным прокси

Рекомендуемая схема для рабочего сервера: два домена, ни одного опубликованного порта. Прокси и S5W живут в общей docker-сети, TLS делает прокси.

Схема

Домен Куда Что Кому нужен
s5.example.com s5w:9090 API и раздача файлов вашим приложениям и их пользователям
s5w.example.com s5w:9091 админ-панель администраторам

Панель ходит к API внутри контейнера, поэтому её домену не нужен доступ к домену API — и наоборот. Если панель не нужна снаружи вообще, второй домен можно не заводить и открывать её через SSH-туннель.

Что настроить в любом случае

  1. Общая сеть с прокси

    Подключите контейнер S5W к docker-сети, в которой работает прокси. Порты при этом публиковать не нужно: прокси обращается к контейнеру по имени сервиса (s5w).

  2. PUBLIC_BASE_URL — адрес домена API

    PUBLIC_BASE_URL=https://s5.example.com. Без него адреса файлов строятся из запроса, а в панели — от домена панели, то есть ведут не туда. Панель покажет предупреждение.

  3. Размер тела запроса — не меньше 32 МиБ

    Подробно — ниже.

  4. TRUSTED_PROXIES — по умолчанию ничего не нужно

    Прокси в docker-сети попадает в частные сети и уже считается доверенным: настоящий адрес клиента берётся из X-Forwarded-For. Менять — только если в той же сети есть чужие контейнеры, см. TRUSTED_PROXIES.

docker compose для S5W

docker-compose.yml
services:
  s5w:
    image: flytachi/s5w:latest
    environment:
      ADMIN_LOGIN: admin
      ADMIN_PASSWORD: ${S5W_ADMIN_PASSWORD}
      PUBLIC_BASE_URL: https://s5.example.com   # ссылки ведут на домен API
    volumes:
      - s5w_data:/var/lib/s5w
    networks: [proxy]
    stop_grace_period: 45s
    restart: unless-stopped

volumes:
  s5w_data:

networks:
  proxy:
    external: true   # сеть, в которой живёт прокси

nginx-proxy-manager

Заведите два Proxy Host:

Поле API Панель
Domain Names s5.example.com s5w.example.com
Scheme http http
Forward Hostname / IP s5w s5w
Forward Port 9090 9091
Block Common Exploits можно включить можно включить
Websockets Support не нужно не нужно
SSL сертификат, Force SSL сертификат, Force SSL
  • Размер тела у nginx-proxy-manager по умолчанию 2000 МБ — менять не нужно.
  • Закройте панель. Для хоста панели заведите Access List — по IP или с логином и паролем — и выберите его в настройках хоста.

traefik

docker-compose.yml
services:
  s5w:
    image: flytachi/s5w:latest
    environment:
      ADMIN_LOGIN: admin
      ADMIN_PASSWORD: ${S5W_ADMIN_PASSWORD}
      PUBLIC_BASE_URL: https://s5.example.com
    volumes:
      - s5w_data:/var/lib/s5w
    networks: [proxy]
    stop_grace_period: 45s
    restart: unless-stopped
    labels:
      - traefik.enable=true
      # API и раздача
      - traefik.http.routers.s5w-api.rule=Host(`s5.example.com`)
      - traefik.http.routers.s5w-api.entrypoints=websecure
      - traefik.http.routers.s5w-api.tls.certresolver=le
      - traefik.http.routers.s5w-api.service=s5w-api
      - traefik.http.services.s5w-api.loadbalancer.server.port=9090
      # админ-панель
      - traefik.http.routers.s5w-ui.rule=Host(`s5w.example.com`)
      - traefik.http.routers.s5w-ui.entrypoints=websecure
      - traefik.http.routers.s5w-ui.tls.certresolver=le
      - traefik.http.routers.s5w-ui.service=s5w-ui
      - traefik.http.services.s5w-ui.loadbalancer.server.port=9091

volumes:
  s5w_data:

networks:
  proxy:
    external: true

Имена websecure и le — точка входа и резолвер сертификатов из вашей конфигурации traefik. Ограничения размера тела у traefik по умолчанию нет. Чтобы закрыть панель, добавьте роутеру s5w-ui middleware basicAuth или ipAllowList.

nginx

/etc/nginx/conf.d/s5w.conf
# API и раздача
server {
    listen 443 ssl;
    http2 on;
    server_name s5.example.com;
    # ssl_certificate / ssl_certificate_key …

    client_max_body_size 32m;

    location / {
        proxy_pass http://s5w:9090;
        proxy_set_header Host              $host;
        proxy_set_header X-Forwarded-For   $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}

# админ-панель
server {
    listen 443 ssl;
    http2 on;
    server_name s5w.example.com;
    # ssl_certificate / ssl_certificate_key …

    client_max_body_size 32m;

    location / {
        proxy_pass http://s5w:9091;
        proxy_set_header Host              $host;
        proxy_set_header X-Forwarded-For   $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}

http://s5w:9090 работает, если nginx в той же docker-сети. Если nginx стоит на хосте, опубликуйте порты только на loopback (127.0.0.1:9090:9090, 127.0.0.1:9091:9091) и проксируйте на http://127.0.0.1:9090.

Размер тела запроса

Приложение принимает тело запроса до 32 МиБ. Прокси не должен пропускать меньше:

Прокси По умолчанию Что делать
nginx-proxy-manager 2000 МБ ничего
traefik без ограничения ничего
nginx 1 МБ client_max_body_size 32m;

Почему 32 МиБ достаточно для файлов любого размера: панель загружает файлы больше 16 МиБ частями, по 8 МиБ, и клиенты API должны делать так же — одним запросом POST /v1/files принимается файл до 32 МиБ, всё больше — через загрузку частями.

Как отличить, кто отклонил запрос: 413 с HTML-страницей — это прокси, 413 с JSON ({"code": 413, …}) — это S5W (квота бакета или предел размера).

Скачивание больших файлов

Раздача идёт потоком, а Range позволяет докачку. Прокси с настройками по умолчанию с этим справляются. Если файлы очень большие, а каналы клиентов медленные, проверьте таймауты чтения на прокси — например, proxy_read_timeout в nginx: соединение не должно обрываться, пока данные идут.