За обратным прокси
Рекомендуемая схема для рабочего сервера: два домена, ни одного опубликованного порта. Прокси и S5W живут в общей docker-сети, TLS делает прокси.
Схема
| Домен | Куда | Что | Кому нужен |
|---|---|---|---|
s5.example.com |
s5w:9090 |
API и раздача файлов | вашим приложениям и их пользователям |
s5w.example.com |
s5w:9091 |
админ-панель | администраторам |
Панель ходит к API внутри контейнера, поэтому её домену не нужен доступ к домену API — и наоборот. Если панель не нужна снаружи вообще, второй домен можно не заводить и открывать её через SSH-туннель.
Что настроить в любом случае
- Общая сеть с прокси
Подключите контейнер S5W к docker-сети, в которой работает прокси. Порты при этом публиковать не нужно: прокси обращается к контейнеру по имени сервиса (
s5w). - PUBLIC_BASE_URL — адрес домена API
PUBLIC_BASE_URL=https://s5.example.com. Без него адреса файлов строятся из запроса, а в панели — от домена панели, то есть ведут не туда. Панель покажет предупреждение. - Размер тела запроса — не меньше 32 МиБ
Подробно — ниже.
- TRUSTED_PROXIES — по умолчанию ничего не нужно
Прокси в docker-сети попадает в частные сети и уже считается доверенным: настоящий адрес клиента берётся из
X-Forwarded-For. Менять — только если в той же сети есть чужие контейнеры, см. TRUSTED_PROXIES.
docker compose для S5W
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
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
# 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: соединение не должно
обрываться, пока данные идут.