Перейти к содержанию

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. Проверить активный контейнер

./scripts/ssh-internal.sh 10.99.87.249 "cat /opt/deploy/.deploy-state"

Покажет активный цвет (blue/green) и порт.

2. Статус контейнеров

./scripts/ssh-internal.sh 10.99.87.249 "docker ps | grep vpn-back"

Один из контейнеров должен быть 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. Ресурсы контейнера

./scripts/ssh-internal.sh 10.99.87.249 "docker stats --no-stream vpn-back-blue vpn-back-green"

JVM лимит: -Xmx8g. Если MEM USAGE близко к 8 GB — OOM или leak.

6. Проверить Redis (сессии)

./scripts/ssh-internal.sh 10.99.87.62 "docker ps | grep redis && docker exec redis redis-cli ping"

Backend хранит все сессии аутентификации в Redis. Если Redis недоступен — все авторизованные запросы падают с 401, не 502.


Причины и решения

Blue-green deploy fail

Симптомы: 502 началось сразу после деплоя, один из контейнеров в Exited или unhealthy.

Откат:

./scripts/ssh-internal.sh 10.99.87.249 "/opt/deploy/deploy-backend.sh --rollback"

Проверить:

./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.

./scripts/ssh-internal.sh 10.99.87.249 "docker restart vpn-back-blue"

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 · Логи · Репозитории · Админпанель не загружается