Backend 502 / 503¶
Backend (Java Spring Boot) развёрнут по схеме blue-green на 10.99.87.249. Nginx на proxy (212.70.189.60) проксирует трафик к активному контейнеру. При 502 или 503 нужно быстро определить: сломан деплой, OOM или другое.
Симптомы¶
- Клиенты получают
502 Bad Gatewayпри запросе конфигов или авторизации - Admin Panel: все запросы возвращают 502/503
- VPN Config Service логи:
backend API: connection refused - Grafana алерт:
Backend Health Check Failed
Диагностика¶
1. Проверить активный контейнер¶
Покажет активный цвет (blue/green) и порт.
2. Статус контейнеров¶
Один из контейнеров должен быть Up и healthy. Оба Exited — критическая ситуация.
3. Healthcheck endpoint¶
./scripts/ssh-internal.sh 10.99.87.249 "curl -s http://localhost:8080/actuator/health"
# Или для green:
./scripts/ssh-internal.sh 10.99.87.249 "curl -s http://localhost:8081/actuator/health"
Ожидается: {"status":"UP"}. Если {"status":"DOWN"} — проверить причину в components.
4. Логи активного контейнера¶
# Blue:
./scripts/ssh-internal.sh 10.99.87.249 "docker logs vpn-back-blue --tail 100 2>&1 | grep -E 'ERROR|WARN|Exception|OOM'"
# Green:
./scripts/ssh-internal.sh 10.99.87.249 "docker logs vpn-back-green --tail 100 2>&1 | grep -E 'ERROR|WARN|Exception|OOM'"
5. Ресурсы контейнера¶
JVM лимит: -Xmx8g. Если MEM USAGE близко к 8 GB — OOM или leak.
6. Проверить Redis (сессии)¶
Backend хранит все сессии аутентификации в Redis. Если Redis недоступен — все авторизованные запросы падают с 401, не 502.
Причины и решения¶
Blue-green deploy fail¶
Симптомы: 502 началось сразу после деплоя, один из контейнеров в Exited или unhealthy.
Откат:
Проверить:
./scripts/ssh-internal.sh 10.99.87.249 \
"curl -s http://localhost:8080/actuator/health && cat /opt/deploy/.deploy-state"
Out of Memory (OOM)¶
Симптомы: В docker logs — java.lang.OutOfMemoryError или Killed (OOM killer).
# Проверить kernel OOM logs:
./scripts/ssh-internal.sh 10.99.87.249 "dmesg | grep -i 'killed process' | tail -5"
Решение: Перезапустить контейнер. Если OOM повторяется — искать memory leak.
Redis connection lost (mass 401)¶
Симптомы: Все пользователи разлогинились одновременно, в логах backend RedisConnectionException.
# Проверить Redis:
./scripts/ssh-internal.sh 10.99.87.62 \
"docker ps | grep redis && docker exec redis redis-cli INFO memory | grep used_memory_human"
# Перезапустить Redis (все сессии будут сброшены!):
./scripts/ssh-internal.sh 10.99.87.62 "docker restart redis"
Сброс сессий
Перезапуск Redis разлогинивает всех пользователей. Предупредить команду перед действием.
HikariCP connection pool exhausted¶
Симптомы в логах: HikariPool-1 - Connection is not available, request timed out.
Инцидент-образец: DATABASE-TIMEOUT-EXHAUSTION-2026-02-15 (monorepo: incidents/).
# Проверить соединения в MySQL:
./scripts/ssh-internal.sh 10.99.87.62 \
"docker exec vpn-db mysql -uroot -p'$(см. Vaultwarden → Databases → root)' \
-e 'SHOW STATUS LIKE \"Threads_connected\";'"
# Перезапустить backend — сбросит пул:
./scripts/ssh-internal.sh 10.99.87.249 "docker restart vpn-back-blue"
Nginx proxy не пропускает запросы¶
# Проверить nginx на proxy (212.70.189.60):
./scripts/ssh-internal.sh 212.70.189.60 \
"docker logs nginx --tail 50 | grep -v kube-probe && docker exec nginx nginx -t"
Проверка после исправления¶
# Health:
./scripts/ssh-internal.sh 10.99.87.249 "curl -s http://localhost:8080/actuator/health"
# Тест авторизации:
./scripts/ssh-internal.sh 10.99.87.249 \
"curl -s -X POST http://localhost:8080/api/auth/login/admin \
-H 'Content-Type: application/json' \
-d '{\"login\":\"admin@shivavpn.io\",\"password\":\"$(см. Vaultwarden → Backend → admin-password)\"}' \
| python3 -c 'import sys,json; d=json.load(sys.stdin); print(\"OK\" if d.get(\"accessToken\") else \"FAIL\")'"
Эскалация¶
- P0 (оба контейнера down, откат не помогает): уведомить Max и Nikita немедленно
- Если проблема после деплоя — откатить коммит в GitLab:
git revert HEAD && git push - GitLab pipelines backend:
https://git.karmann.tech/vpn/back/-/pipelines
См. также: Backend Deploy · Логи · Репозитории · Админпанель не загружается