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

Админ-панель

Панель включена по умолчанию и работает на порту 9091. С бэкендом она общается внутри контейнера: браузеру нужен только адрес панели — ни CORS, ни отдельный доступ к /admin не требуются.

Порт 9091Учётная запись одна, из окруженияСессия 24 часаЯзыки русский, английский

Что умеет

Обзор

Сводка по всем бакетам: занятое место, файлы, трафик.

Файлы

Папки, поиск, загрузка с обработкой картинок, переименование и перенос.

Токены

Выпуск, ротация, отключение и срок действия токенов.

Ссылки

Временные ссылки бакета: выдача, отзыв по одной или всех сразу.

Статистика

Трафик по дням: отдача, приём и число запросов.

Кэш

Политика Cache-Control для бакета и для каждой папки.

Как панель связана с сервисом

text
браузер ──► :9091  панель ──► 127.0.0.1:9090/admin  (внутри контейнера)
клиенты ──► :9090  API /v1, раздача /o /p /t

Панель — отдельный процесс в том же контейнере. Она отдаёт браузеру веб-приложение и пересылает его запросы /api/… в admin API на 127.0.0.1:9090/admin/…. Поэтому:

  • браузеру не нужен доступ к порту 9090 и к пути /admin;
  • admin API можно держать закрытым снаружи — по умолчанию так и есть;
  • падение панели не затрагивает API и раздачу, а супервизор перезапускает её.

Переменные

Переменная По умолчанию Описание
ADMIN_LOGIN — Логин. Без него вход закрыт.
ADMIN_PASSWORD — Пароль. Без него вход закрыт.
ADMIN_UI true Запускать ли панель.
ADMIN_API (от ADMIN_UI) Откуда принимать admin API: local или public.
TRUSTED_PROXIES private Каким прокси верить в X-Forwarded-For.

ADMIN_LOGIN и ADMIN_PASSWORD

Что делают. Задают единственную учётную запись панели. Пользователей, ролей и регистрации нет: доступ к панели — это полный доступ к хранилищу.

Если не заданы (хотя бы одна). Вход закрыт для всех: любая попытка отвечает отказом. Это сделано намеренно — панель без учётных данных не открывается никому, а не всем. Хранилище при этом работает как обычно.

Если сменить пароль. После пересоздания контейнера все открытые сессии сразу перестают действовать — сессия привязана к логину и паролю. Войти можно только с новыми данными.

Пароль

В примерах стоит change-me. В рабочем развёртывании задайте длинный случайный пароль и передавайте его как секрет — через .env, который не попадает в репозиторий, или через механизм секретов вашей платформы.

ADMIN_UI

true (по умолчанию) — панель запускается и слушает 9091.

false — панели нет: процесс не запускается, порт 9091 никто не слушает, его не нужно публиковать. Контейнер только хранит и раздаёт файлы. Бакеты и токены в этом режиме создаются запросами к admin API — поэтому он по умолчанию становится открытым (см. ниже).

ADMIN_API

Решает, откуда admin API /admin/… на порту 9090 принимает запросы.

  • local — только с адреса loopback внутри контейнера, то есть от самой панели. С любого другого адреса — 404, как будто API нет.
  • public — отовсюду. Нужно скриптам автоматизации, которые создают бакеты и токены.

Если не задан (или задано другое значение) — выводится из ADMIN_UI: с панелью — local, без панели — public.

Как запущен Панель /admin снаружи
по умолчанию ✅ 404
ADMIN_API=public ✅ ✅
ADMIN_UI=false — ✅
ADMIN_UI=false, ADMIN_API=local — 404 — управлять можно только из контейнера

network_mode: host

«Локальный» — значит адрес соединения 127.0.0.1. В обычной docker-сети снаружи так прийти нельзя. Но с network_mode: host контейнер делит сеть с хостом, и admin API становится доступен любому процессу на этом хосте.

Admin API наружу

С ADMIN_API=public или ADMIN_UI=false управляющий API доступен всем, кто дотянется до порта 9090. Запросы к нему требуют входа, как и панель, но путь /admin всё равно стоит закрыть на прокси или сетью для всех, кроме адресов автоматизации.

TRUSTED_PROXIES

Зачем. Блокировка перебора паролей считается по адресу клиента. За прокси адрес соединения — это адрес прокси, а настоящий адрес клиента приходит в X-Forwarded-For. Но этот заголовок может прислать кто угодно, поэтому верить ему можно только от своего прокси.

Как работает. Если запрос пришёл с доверенного адреса, сервис читает X-Forwarded-For справа налево и берёт первый адрес, который не является доверенным. Если запрос пришёл не от доверенного адреса, заголовок игнорируется. Loopback доверен всегда — это сама панель.

Значения:

  • private (по умолчанию) — частные сети: 10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16, fc00::/7. Сюда попадает любая docker-сеть, поэтому nginx-proxy-manager, traefik и подобные работают без настройки.
  • Список IP или CIDR через запятую — 10.0.0.5,192.168.1.0/24. Можно смешивать со словом private.
  • none — не верить никому, кроме loopback.

Когда менять. Если в той же docker-сети работают чужие контейнеры, которым вы не доверяете: при private они могут подставить любой адрес в X-Forwarded-For и обойти блокировку. Тогда укажите адрес только своего прокси.

Вход и сессии

  • Сессия живёт 24 часа с момента входа, потом нужно войти снова.
  • Сессия хранится в куке s5w_admin с флагами HttpOnly и SameSite=Strict.
  • Сессия подписана ключом WINTER_KEY. Смена ключа или пароля завершает все сессии.
  • Выход удаляет куку в этом браузере.

Блокировка перебора

Пять неудачных входов с одного адреса за 15 минут блокируют этот адрес на 5 минут. Всё это время вход отвечает 429 Too Many Requests с заголовком Retry-After — даже с правильным паролем. Потом счётчик начинается заново.

Счётчик хранится в памяти приложения: перезапуск контейнера его сбрасывает.

Без панели

bash
docker run -d --name s5w -p 9090:9090 \
  -e ADMIN_UI=false \
  -e ADMIN_LOGIN=admin -e ADMIN_PASSWORD="$S5W_ADMIN_PASSWORD" \
  -v s5w_data:/var/lib/s5w \
  --stop-timeout 45 --restart unless-stopped \
  flytachi/s5w:latest

В этом режиме admin API открыт на 9090 (/admin/…), а логин и пароль нужны для входа в него.

Безопасность панели

  • Домен панели стоит дополнительно закрыть на прокси: список доступа по IP или basic auth.
  • Панель за прокси должна работать по HTTPS: иначе кука сессии идёт в открытом виде.
  • Подробнее о модели доступа — Безопасность.