Правило Сергія: нова фіча спочатку йде на TEST (окремий інстанс). Після approve — промоут у PROD. Лінк який дано команді на пограти — завжди /med-detective/, його не чіпати.
Фізичні (systemd + Redis) — фіксовані:
| Аспект | Інстанс A | Інстанс B |
|---|---|---|
| Code | /srv/projects/med-detective/ |
/srv/projects/med-detective-test/ |
| Systemd | med-detective.service |
med-detective-test.service |
| Host port | 8765 | 8766 |
| Redis DB | redis://127.0.0.1:6379/3 |
redis://127.0.0.1:6379/4 |
| Логи | /var/log/med-detective.log |
/var/log/med-detective-test.log |
Логічні URL (перевизначаються через Caddy conf.d при swap):
| URL | Caddy conf.d | Поточний upstream (станом на 2026-04-19 09:05) |
|---|---|---|
/med-detective/ |
/etc/caddy/conf.d/med-detective.caddy |
port 8766 (інстанс B, DB 4) ← нова фіча після promote |
/med-detective-test/ |
/etc/caddy/conf.d/med-detective-test.caddy |
port 8765 (інстанс A, DB 3) ← rollback (стара версія) |
Важливо: які «prod» і які «test» — визначається тим, куди проксить /med-detective/ зараз. Перевіряти: grep reverse_proxy /etc/caddy/conf.d/med-detective*.caddy.
rsync -a /srv/projects/med-detective/ /srv/projects/med-detective-test/ (якщо TEST застарів) АБО редагувати test напрямуsystemctl restart med-detective-testcurl /med-detective-test/api/health → 200Варіант A (swap Caddy route — нуль-даунтайм):
sed -i 's|8765|8766|' /etc/caddy/conf.d/med-detective.caddy (тепер /med-detective/ проксить у test port)sed -i 's|8766|8765|' /etc/caddy/conf.d/med-detective-test.caddy (test route тепер указує на старий prod)systemctl reload caddy/med-detective/ = нова фіча, /med-detective-test/ = старий код (як rollback)Варіант B (rsync файлів, простіший):
rsync -a --delete /srv/projects/med-detective-test/ /srv/projects/med-detective/ (обережно з REDIS_URL — systemd unit містить правильне значення)systemctl restart med-detectiveВаріант C (якщо test доводиться з нуля переписувати): rm -rf /srv/projects/med-detective-test && cp -a /srv/projects/med-detective med-detective-test, потім redo changes.
Який варіант: якщо фіча виконана тільки на test — Варіант A (swap route) найшвидший і має instant rollback. Якщо робились ad-hoc зміни на prod паралельно — Варіант B.
cd /srv/projects/med-detective && .venv/bin/python scripts/validate_case.py backend/cases/new_case.json
Перевіряє що всі key_tests_to_order[].id існують у LAB_CATALOG або extra_tests. Без цього — гравець не зможе замовити тест, який очікується для діагнозу.