Админ-панель
Панель включена по умолчанию и работает на порту 9091. С бэкендом она общается
внутри контейнера: браузеру нужен только адрес панели — ни CORS, ни отдельный доступ к
/admin не требуются.
Что умеет
Сводка по всем бакетам: занятое место, файлы, трафик.
Папки, поиск, загрузка с обработкой картинок, переименование и перенос.
Выпуск, ротация, отключение и срок действия токенов.
Временные ссылки бакета: выдача, отзыв по одной или всех сразу.
Трафик по дням: отдача, приём и число запросов.
Политика Cache-Control для бакета и для каждой папки.
Как панель связана с сервисом
браузер ──► :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 — даже с
правильным паролем. Потом счётчик начинается заново.
Счётчик хранится в памяти приложения: перезапуск контейнера его сбрасывает.
Без панели
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: иначе кука сессии идёт в открытом виде.
- Подробнее о модели доступа — Безопасность.