Эксплуатация¶
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¶
- Остановить контейнер.
- Сохранить текущий
$QA_DATA_DIRотдельно. - Распаковать backup в родительский каталог
$QA_DATA_DIR. - Установить владельца UID/GID
10001. - Запустить контейнер и проверить 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;
- число
claimedjobs с истекшим 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, которые можно удалить согласованно с записями БД.