Эксплуатация
Обновление, резервные копии, мониторинг и разбор проблем — всё, что нужно после первого запуска.
Обновление
Обновление — это новый образ на том же томе. Данные, токены и ссылки сохраняются.
docker compose pull
docker compose up -dИли без compose:
docker pull flytachi/s5w:latest
docker stop -t 45 s5w && docker rm s5w
docker run -d --name s5w … flytachi/s5w:latest # та же команда, тот же том- Перед обновлением сделайте резервную копию — см. ниже.
- Закрепляйте версию в рабочем развёртывании (
flytachi/s5w:<версия>, а неlatest): так обновление происходит, когда вы решили, а не при случайномpull. - Читайте заметки к выпуску — в них описано, что меняется для тех, кто обновляется. Для перехода с 1.0.x — отдельная страница.
Миграции схемы
Таблицы создаются при первом запуске, когда база пуста. При обновлении схема сама не
меняется: call db migrate создаёт недостающие таблицы, но не меняет существующие.
Если выпуску нужно изменение схемы, в заметках к нему будет готовая команда.
Резервное копирование
Всё состояние сервиса — в томе /var/lib/s5w: база, файлы и ключ подписи. Копия тома —
это полная копия сервиса.
- Остановите контейнер
bash docker stop -t 45 s5wКопия работающего тома может оказаться несогласованной: база и файлы на диске меняются независимо. Остановка занимает несколько секунд.
- Скопируйте том в архив
bash docker run --rm \ -v s5w_data:/data:ro \ -v "$PWD":/backup \ --entrypoint tar flytachi/s5w:latest \ czf /backup/s5w-$(date +%F).tar.gz -C /data . - Запустите контейнер
bash docker start s5w
Если том подключён каталогом хоста (/srv/s5w), вместо второго шага подойдёт любой
инструмент копирования каталогов — tar, rsync, снимок ФС — пока контейнер остановлен.
Архив — это всё
В архиве все файлы всех бакетов и ключ подписи WINTER_KEY. Храните его так же
надёжно, как сами данные, и не рядом с сервером.
Копия базы без остановки
Для дополнительной страховки метаданные можно выгрузить на ходу:
docker exec s5w pg_dump -U s5w -h /run/postgresql -Fc s5w > s5w-db-$(date +%F).dumpЭто копия только базы. Полное восстановление делается из копии тома.
Восстановление
- Создайте том и распакуйте в него архив
bash docker volume create s5w_data docker run --rm \ -v s5w_data:/data \ -v "$PWD":/backup:ro \ --entrypoint tar flytachi/s5w:latest \ xzpf /backup/s5w-2026-11-08.tar.gz -C /dataФлаг
pсохраняет владельцев и права: каталогу базы они обязательны. - Запустите контейнер на этом томе
Той же командой, что и обычно. Сервис поднимается с теми же бакетами, файлами, токенами и временными ссылками: ключ подписи восстановлен вместе с томом.
Перенос на другой сервер — то же самое: архив с одного сервера, восстановление на другом.
Healthcheck
Отдельного эндпоинта здоровья нет. Признак того, что приложение принимает запросы, —
GET /v1/check без токена отвечает 401.
services:
s5w:
# …
healthcheck:
test: ["CMD-SHELL", "test \"$$(curl -s -o /dev/null -w %{http_code} http://127.0.0.1:9090/v1/check)\" = 401"]
interval: 30s
timeout: 5s
start_period: 30s
retries: 3Не используйте curl -f
curl -f считает 401 ошибкой, и healthcheck будет всегда красным. Сравнивайте код ответа.
Готовность базы отдельно:
docker exec s5w pg_isready -h /run/postgresql -U s5wМониторинг
| Что смотреть | Как | Почему |
|---|---|---|
| Контейнер жив | healthcheck выше | API и раздача отвечают |
| Свободное место на томе | метрика диска хоста | при заполнении загрузки получат 507, а база остановится |
| Части приложения | call app status |
видно падения и перезапуски |
| Ошибки в логе | docker logs, уровень error |
сбои обработки, проблемы с диском |
| Квоты бакетов | панель, «Обзор» | бакет у предела начнёт отклонять загрузки (413) |
docker exec s5w su-exec winter php call app statusКоманда показывает каждую часть — HTTP, планировщик, панель — с состоянием, PID, временем работы и числом перезапусков. Растущее число перезапусков — повод смотреть лог.
Логи
docker logs -f s5w # всё: приложение, PostgreSQL, супервизор
docker logs --since 1h s5w # за последний часВсе части пишут в вывод контейнера, его собирает Docker и любой сборщик логов. Уровень
задаёт LOG_LEVEL — см. Настройку.
Команды обслуживания
docker exec -it s5w sh # shell в контейнере
docker exec s5w su-exec winter php call app status # состояние частей
docker exec -it s5w psql -U s5w -h /run/postgresql s5w # psql во встроенную базу
docker exec s5w su-exec winter php call db migrate # создать недостающие таблицыКоманды приложения выполняются от пользователя winter — поэтому su-exec winter.
Обслуживание по расписанию (сроки хранения, очистка, пересчёт места) работает внутри контейнера само — отдельный cron не нужен. Список задач — в архитектуре.
Типовые проблемы
| Симптом | Причина | Что делать |
|---|---|---|
| В панель не войти, ошибка входа при верном пароле | Не заданы ADMIN_LOGIN / ADMIN_PASSWORD |
Задать обе переменные и пересоздать контейнер |
Вход отвечает 429 |
Пять неудачных попыток за 15 минут | Подождать 5 минут (Retry-After) |
/admin/… снаружи отвечает 404 |
Admin API в режиме local |
Так и задумано; для скриптов — ADMIN_API=public |
| Ссылки в панели ведут на домен панели | Не задан PUBLIC_BASE_URL |
Задать адрес домена API |
Загрузка через прокси — 413 с HTML-страницей |
Лимит тела запроса у прокси | Поднять лимит до 32 МиБ |
Загрузка — 413 с JSON |
Квота бакета или файл больше 32 МиБ одним запросом | Поднять квоту или грузить частями |
Загрузка частями — 507 |
На диске меньше 512 МиБ запаса | Освободить место |
| После остановки база долго стартует | Docker убил её раньше времени | --stop-timeout 45 / stop_grace_period: 45s |
| Временные ссылки вдруг перестали работать | Сменился WINTER_KEY или новый том |
Вернуть ключ или том; иначе выдать ссылки заново |
| Все данные пропали после обновления | Том не был подключён | Восстановить из копии; подключить том |