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

Эксплуатация

Обновление, резервные копии, мониторинг и разбор проблем — всё, что нужно после первого запуска.

Обновление

Обновление — это новый образ на том же томе. Данные, токены и ссылки сохраняются.

bash
docker compose pull
docker compose up -d

Или без compose:

bash
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: база, файлы и ключ подписи. Копия тома — это полная копия сервиса.

  1. Остановите контейнер
    bash
    docker stop -t 45 s5w

    Копия работающего тома может оказаться несогласованной: база и файлы на диске меняются независимо. Остановка занимает несколько секунд.

  2. Скопируйте том в архив
    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 .
  3. Запустите контейнер
    bash
    docker start s5w

Если том подключён каталогом хоста (/srv/s5w), вместо второго шага подойдёт любой инструмент копирования каталогов — tar, rsync, снимок ФС — пока контейнер остановлен.

Архив — это всё

В архиве все файлы всех бакетов и ключ подписи WINTER_KEY. Храните его так же надёжно, как сами данные, и не рядом с сервером.

Копия базы без остановки

Для дополнительной страховки метаданные можно выгрузить на ходу:

bash
docker exec s5w pg_dump -U s5w -h /run/postgresql -Fc s5w > s5w-db-$(date +%F).dump

Это копия только базы. Полное восстановление делается из копии тома.

Восстановление

  1. Создайте том и распакуйте в него архив
    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 сохраняет владельцев и права: каталогу базы они обязательны.

  2. Запустите контейнер на этом томе

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

Перенос на другой сервер — то же самое: архив с одного сервера, восстановление на другом.

Healthcheck

Отдельного эндпоинта здоровья нет. Признак того, что приложение принимает запросы, — GET /v1/check без токена отвечает 401.

docker-compose.yml
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 будет всегда красным. Сравнивайте код ответа.

Готовность базы отдельно:

bash
docker exec s5w pg_isready -h /run/postgresql -U s5w

Мониторинг

Что смотреть Как Почему
Контейнер жив healthcheck выше API и раздача отвечают
Свободное место на томе метрика диска хоста при заполнении загрузки получат 507, а база остановится
Части приложения call app status видно падения и перезапуски
Ошибки в логе docker logs, уровень error сбои обработки, проблемы с диском
Квоты бакетов панель, «Обзор» бакет у предела начнёт отклонять загрузки (413)
bash
docker exec s5w su-exec winter php call app status

Команда показывает каждую часть — HTTP, планировщик, панель — с состоянием, PID, временем работы и числом перезапусков. Растущее число перезапусков — повод смотреть лог.

Логи

bash
docker logs -f s5w              # всё: приложение, PostgreSQL, супервизор
docker logs --since 1h s5w      # за последний час

Все части пишут в вывод контейнера, его собирает Docker и любой сборщик логов. Уровень задаёт LOG_LEVEL — см. Настройку.

Команды обслуживания

bash
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 или новый том Вернуть ключ или том; иначе выдать ссылки заново
Все данные пропали после обновления Том не был подключён Восстановить из копии; подключить том