Реализация на отдельных двух машинах с протестированным взаимодействием по проверке сообщений

This commit is contained in:
mi
2026-08-19 18:24:00 +03:00
parent bbef7a30c9
commit c7a80e7256
103 changed files with 3457 additions and 3725 deletions
@@ -0,0 +1,74 @@
#!/usr/bin/env bash
# diagnose-han-chat.sh — запускать из /opt/han-chat/backend
set -euo pipefail
cd /opt/han-chat/backend
CONFIG_FILE="${CONFIG_FILE:-.env}"
SECRETS_LAUNCHER="${SECRETS_LAUNCHER:-deployment/secrets/han-secrets}"
if [[ "${HAN_SECRETS_ACTIVE:-0}" != 1 ]]; then
[[ -x "$SECRETS_LAUNCHER" ]] || {
echo "Secret launcher is required: $SECRETS_LAUNCHER" >&2
exit 66
}
exec "$SECRETS_LAUNCHER" run --config "$CONFIG_FILE" -- "$0" "$@"
fi
compose() { docker compose --env-file "$CONFIG_FILE" "$@"; }
echo "=== 1. Статус сервисов ==="
compose ps api-backend keycloak redis message-safety
echo
echo "=== 2. Healthcheck api-backend (что именно падает) ==="
compose exec -T api-backend \
python -c "
import json, urllib.request
try:
r = urllib.request.urlopen('http://127.0.0.1:8000/health/ready', timeout=5)
print('HTTP', r.status)
print(json.dumps(json.loads(r.read()), indent=2, ensure_ascii=False))
except urllib.error.HTTPError as e:
print('HTTP', e.code)
print(json.dumps(json.loads(e.read()), indent=2, ensure_ascii=False))
"
echo
echo "=== 3. Keycloak health (management port 9000) ==="
compose exec -T keycloak bash -c \
"exec 3<>/dev/tcp/127.0.0.1/9000 && printf 'GET /auth/health/ready HTTP/1.0\r\n\r\n' >&3 && cat <&3" \
2>/dev/null | head -20 || echo "Keycloak health FAILED"
echo
echo "=== 4. api-backend -> Keycloak (JWKS) ==="
compose exec -T api-backend \
python -c "
import os, urllib.request, json
base = os.environ.get('KEYCLOAK_INTERNAL_URL','http://keycloak:8080/auth').rstrip('/')
realm = os.environ.get('KEYCLOAK_REALM','han-chat')
url = f'{base}/realms/{realm}/.well-known/openid-configuration'
try:
d = json.loads(urllib.request.urlopen(url, timeout=5).read())
print('discovery OK, jwks_uri:', d.get('jwks_uri'))
except Exception as e:
print('discovery FAILED:', e)
"
echo
echo "=== 5. Счётчик рестартов ==="
docker inspect --format '{{.Name}} restarts={{.RestartCount}} started={{.State.StartedAt}} health={{if .State.Health}}{{.State.Health.Status}}{{else}}n/a{{end}}' \
han-chat-api-backend-1 han-chat-keycloak-1
echo
echo "=== 6. Последние ошибки в логах ==="
echo "--- api-backend ---"
docker logs --tail 80 han-chat-api-backend-1 2>&1 | grep -iE 'error|failed|exception|jwks|settings|postgres' || echo "(нет совпадений)"
echo "--- keycloak ---"
docker logs --tail 80 han-chat-keycloak-1 2>&1 | grep -iE 'error|failed|exception|FATAL|OutOfMemory' || echo "(нет совпадений)"
echo
echo "=== 7. Память (Keycloak часто падает от OOM) ==="
free -h
docker stats --no-stream --format 'table {{.Name}}\t{{.MemUsage}}\t{{.CPUPerc}}' \
han-chat-keycloak-1 han-chat-api-backend-1 2>/dev/null || true
echo
echo "=== 8. Exited контейнеры (в метриках было exited=2) ==="
docker ps -a --filter status=exited --format 'table {{.Names}}\t{{.Status}}\t{{.Image}}'