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

Production topology

Рекомендуемая схема:

qa.videograce.ru:443
  -> Nginx + Let's Encrypt
  -> 127.0.0.1:8091
  -> Docker: videograce/qa-hub:0.1.0
  -> persistent data volume

QA Hub публикует 8091 только на loopback. Снаружи должны быть доступны только 22, 80 и 443.

Фактические SSH-реквизиты, пути deployment, environment-файл и backup назначаются профилем конкретной установки. В командах ниже используются следующие обозначения:

Переменная Назначение
QA_DEPLOY_HOST имя или IP deployment-сервера
QA_DEPLOY_USER системный пользователь для deployment
QA_HUB_DIR каталог с docker-compose.production.yml
QA_DATA_DIR persistent-каталог SQLite и artifacts
QA_ENV_FILE root-only environment-файл
QA_BACKUP_DIR каталог резервных копий

Значения этих переменных храните в закрытом эксплуатационном runbook или системе управления инфраструктурой, а не в публичной документации.

Проверка состояния

ssh "$QA_DEPLOY_USER@$QA_DEPLOY_HOST"
cd "$QA_HUB_DIR"

sudo docker compose -f docker-compose.production.yml ps
sudo docker compose -f docker-compose.production.yml logs --tail=100 qa-hub
curl -fsS http://127.0.0.1:8091/api/v1/health
curl -fsS https://qa.videograce.ru/api/v1/health

Healthy-ответ:

{"status":"ok","service":"videograce-qa-hub"}

Обновление

Сначала передайте текущий каталог сервиса:

rsync -az \
  --exclude data \
  --exclude __pycache__ \
  --exclude '*.pyc' \
  Services/QaHub/ \
  "$QA_DEPLOY_USER@$QA_DEPLOY_HOST:$QA_HUB_DIR/"

Затем пересоберите:

ssh "$QA_DEPLOY_USER@$QA_DEPLOY_HOST"
cd "$QA_HUB_DIR"
sudo docker compose -f docker-compose.production.yml up -d --build
sudo docker compose -f docker-compose.production.yml ps

Compose не удаляет bind-mounted данные при пересборке.

Bootstrap secret

Environment-файл должен иметь права 0600 root:root. Начальный пароль администратора создается генератором секретов и передается через принятую в организации систему управления секретами. Не отправляйте его в чат, issue, репозиторий или отчет тестового прогона.

Environment-пароль используется только при создании первого пользователя. После появления БД его изменение не меняет пароль существующего admin. Сразу после bootstrap измените пароль аккаунта через управление пользователями/API и отзовите временный секрет.

Backup

В backup должны одновременно попасть:

  • qa-hub.db;
  • возможные qa-hub.db-wal и qa-hub.db-shm;
  • каталог artifacts.

Простой согласованный backup с короткой остановкой:

cd "$QA_HUB_DIR"
sudo docker compose -f docker-compose.production.yml stop qa-hub

sudo tar -C "$(dirname "$QA_DATA_DIR")" \
  -czf "$QA_BACKUP_DIR/videograce-qa-hub-$(date -u +%Y%m%dT%H%M%SZ).tar.gz" \
  "$(basename "$QA_DATA_DIR")"

sudo docker compose -f docker-compose.production.yml start qa-hub
curl -fsS http://127.0.0.1:8091/api/v1/health

Backup нужно копировать за пределы VPS и регулярно проверять восстановление.

Restore

  1. Остановить контейнер.
  2. Сохранить текущий $QA_DATA_DIR отдельно.
  3. Распаковать backup в родительский каталог $QA_DATA_DIR.
  4. Установить владельца UID/GID 10001.
  5. Запустить контейнер и проверить health/login/artifact download.
sudo chown -R 10001:10001 "$QA_DATA_DIR"

TLS

Проверка сертификата:

sudo certbot certificates
sudo systemctl status certbot.timer

Тест продления без ожидания случайной задержки:

sudo certbot renew --dry-run --no-random-sleep-on-renew

Certbot изменяет Nginx site и устанавливает HTTP → HTTPS redirect.

Логи

QA Hub

cd "$QA_HUB_DIR"
sudo docker compose -f docker-compose.production.yml logs -f --tail=200 qa-hub

Nginx

sudo tail -f /var/log/nginx/access.log /var/log/nginx/error.log

Certbot

sudo tail -n 200 /var/log/letsencrypt/letsencrypt.log

Мониторинг

Минимальные проверки:

  • HTTPS GET /api/v1/health возвращает 200;
  • Docker health — healthy;
  • свободное место в $QA_DATA_DIR;
  • срок сертификата;
  • возраст последнего backup;
  • число claimed jobs с истекшим lease;
  • рост artifact storage.

Health endpoint проверяет доступность процесса, но не выполняет полный read/write smoke SQLite. Для приемочного мониторинга используйте отдельный agent suite QA Hub HTTP smoke.

Инциденты

UI недоступен, health на loopback работает

Проверить Nginx:

sudo nginx -t
sudo systemctl status nginx
sudo tail -n 100 /var/log/nginx/error.log

Контейнер перезапускается

sudo docker inspect videograce-qa-hub-qa-hub-1 \
  --format '{{.State.Status}} {{.State.ExitCode}} {{.State.Error}}'
sudo docker logs --tail=200 videograce-qa-hub-qa-hub-1

Частая причина — отсутствие прав UID 10001 на data directory.

Закончился диск

Не удаляйте отдельные blobs вручную. Сначала остановите новые загрузки, сделайте backup metadata и определите artifacts, которые можно удалить согласованно с записями БД.