fix and update
This commit is contained in:
132
install.sh
132
install.sh
@@ -426,6 +426,20 @@ sync_nginx_after_api_gateway_restart() {
|
||||
fi
|
||||
}
|
||||
|
||||
# После recreate frontend/docs nginx должен перерезолвить lendry-id-frontend — иначе 502 на / (корень SSO).
|
||||
sync_nginx_after_edge_restart() {
|
||||
docker_nginx_container_running || return 0
|
||||
log "Синхронизация Docker Nginx с frontend после пересборки..."
|
||||
wait_for_service "frontend" 120 || warn "frontend не стал healthy в срок"
|
||||
sleep 2
|
||||
reload_docker_nginx
|
||||
if ! verify_nginx_reaches_frontend 12 3; then
|
||||
warn "Nginx → frontend: reload не помог — пересоздаём lendry-id-nginx..."
|
||||
recreate_docker_nginx
|
||||
verify_nginx_reaches_frontend 12 3 || warn "Nginx → frontend: проверка не прошла, см. docker compose logs nginx frontend"
|
||||
fi
|
||||
}
|
||||
|
||||
recreate_docker_nginx() {
|
||||
compose_uses_proxy_profile || return 0
|
||||
ensure_nginx_gateway_watch_script
|
||||
@@ -483,11 +497,19 @@ post_deploy_proxy_verify() {
|
||||
}
|
||||
}
|
||||
verify_nginx_reaches_media_ws || true
|
||||
verify_nginx_reaches_frontend 12 3 || {
|
||||
[[ "$strict" -eq 1 ]] && fail "Docker Nginx не проксирует / на frontend — см. docker compose logs nginx frontend"
|
||||
warn "Nginx → frontend: проверка не прошла"
|
||||
}
|
||||
if [[ "$(env_get USE_NGINX_SSL false)" == "true" ]]; then
|
||||
check_sso_idp_api_proxy || {
|
||||
[[ "$strict" -eq 1 ]] && fail "SSO /idp-api/health → 502. Выполните: ./install.sh --fix-all"
|
||||
warn "SSO /idp-api/health не прошёл — выполните ./install.sh --fix-all"
|
||||
}
|
||||
check_sso_frontend_root || {
|
||||
[[ "$strict" -eq 1 ]] && fail "SSO / → 502. Nginx не проксирует главную на frontend. Выполните: ./install.sh --fix-all"
|
||||
warn "SSO / (главная) не прошла — выполните ./install.sh --fix-all"
|
||||
}
|
||||
fi
|
||||
}
|
||||
|
||||
@@ -844,6 +866,10 @@ compose_build_and_up() {
|
||||
for svc in "${services[@]}"; do
|
||||
case "$svc" in
|
||||
api-gateway) sync_nginx_after_api_gateway_restart ;;
|
||||
frontend|docs)
|
||||
wait_for_service "$svc" 90
|
||||
sync_nginx_after_edge_restart
|
||||
;;
|
||||
media-ws)
|
||||
wait_for_service "media-ws" 60
|
||||
reload_docker_nginx
|
||||
@@ -2716,6 +2742,96 @@ verify_nginx_idp_api_location() {
|
||||
return 1
|
||||
}
|
||||
|
||||
verify_nginx_reaches_frontend() {
|
||||
docker_nginx_container_running || return 0
|
||||
build_compose_stack_cmd
|
||||
load_env
|
||||
local max_attempts="${1:-1}"
|
||||
local delay_sec="${2:-0}"
|
||||
local attempt=0
|
||||
local body fe_ip frontend_domain code
|
||||
|
||||
frontend_domain="$(env_get DOMAIN_FRONTEND "")"
|
||||
|
||||
while [[ $attempt -lt $max_attempts ]]; do
|
||||
fe_ip="$(docker_cmd inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' lendry-id-frontend 2>/dev/null || true)"
|
||||
body="$(docker_cmd "${COMPOSE_STACK_CMD[@]}" exec -T nginx \
|
||||
wget -qO- --timeout=6 http://lendry-id-frontend:3000/ 2>/dev/null | head -c 256 || true)"
|
||||
if [[ -n "$body" ]]; then
|
||||
ok "Docker Nginx → lendry-id-frontend:3000/ OK (IP frontend: ${fe_ip:-?})"
|
||||
if [[ -n "$frontend_domain" ]]; then
|
||||
verify_nginx_frontend_root_location "$frontend_domain" || return 1
|
||||
fi
|
||||
return 0
|
||||
fi
|
||||
attempt=$((attempt + 1))
|
||||
if [[ $attempt -lt $max_attempts ]]; then
|
||||
[[ "$delay_sec" -gt 0 ]] && sleep "$delay_sec"
|
||||
fi
|
||||
done
|
||||
|
||||
warn "Docker Nginx не достучался до lendry-id-frontend:3000/ (IP: ${fe_ip:-?}, попыток: ${max_attempts})"
|
||||
warn "Проверьте: docker compose --env-file .env --profile proxy logs --tail=40 frontend nginx"
|
||||
return 1
|
||||
}
|
||||
|
||||
# location / → frontend (путь браузера на https://sso.../)
|
||||
verify_nginx_frontend_root_location() {
|
||||
local frontend_domain="$1"
|
||||
local body code ssl_type
|
||||
ssl_type="$(env_get SSL_TYPE none)"
|
||||
|
||||
body="$(docker_cmd "${COMPOSE_STACK_CMD[@]}" exec -T nginx \
|
||||
wget -qO- --timeout=8 --no-check-certificate \
|
||||
--header="Host: ${frontend_domain}" \
|
||||
"https://127.0.0.1/" 2>/dev/null | head -c 256 || true)"
|
||||
if [[ -n "$body" ]]; then
|
||||
ok "Docker Nginx location / → frontend OK (Host: ${frontend_domain})"
|
||||
return 0
|
||||
fi
|
||||
|
||||
if [[ "$(env_get USE_NGINX_SSL false)" == "true" || "$ssl_type" != "none" ]]; then
|
||||
code="$(curl -sk --max-time 8 -o /dev/null -w '%{http_code}' "https://${frontend_domain}/" 2>/dev/null || echo 000)"
|
||||
else
|
||||
code="$(curl -fsS --max-time 8 -o /dev/null -w '%{http_code}' "http://${frontend_domain}/" 2>/dev/null || echo 000)"
|
||||
fi
|
||||
if [[ "$code" == "200" || "$code" == "304" ]]; then
|
||||
ok "SSO / → HTTP ${code} (проверка с хоста)"
|
||||
return 0
|
||||
fi
|
||||
|
||||
warn "Nginx location / не проксирует на frontend (Host: ${frontend_domain}, HTTP ${code:-?})"
|
||||
warn "Проверьте: curl -sk -o /dev/null -w '%{http_code}' https://${frontend_domain}/"
|
||||
return 1
|
||||
}
|
||||
|
||||
check_sso_frontend_root() {
|
||||
load_env
|
||||
local frontend_domain code ssl_type
|
||||
frontend_domain="$(env_get DOMAIN_FRONTEND "")"
|
||||
[[ -n "$frontend_domain" ]] || return 0
|
||||
ssl_type="$(env_get SSL_TYPE none)"
|
||||
|
||||
if [[ "$(env_get USE_NGINX_SSL false)" == "true" || "$ssl_type" != "none" ]]; then
|
||||
code="$(curl -sk --max-time 8 -o /dev/null -w '%{http_code}' "https://${frontend_domain}/" 2>/dev/null || echo 000)"
|
||||
else
|
||||
code="$(curl -fsS --max-time 8 -o /dev/null -w '%{http_code}' "http://${frontend_domain}/" 2>/dev/null || echo 000)"
|
||||
fi
|
||||
|
||||
if [[ "$code" == "200" || "$code" == "304" ]]; then
|
||||
echo -e " ${GREEN}✔${NC} SSO / → ${code} (главная страница SPA)"
|
||||
return 0
|
||||
elif [[ "$code" == "502" ]]; then
|
||||
echo -e " ${RED}✘${NC} SSO / → 502 — Nginx не проксирует / на frontend (502 Bad Gateway в браузере)"
|
||||
echo " Проверьте: docker compose --env-file .env --profile proxy exec nginx wget -qO- http://lendry-id-frontend:3000/"
|
||||
echo " Решение: docker compose --env-file .env --profile proxy restart nginx frontend"
|
||||
return 1
|
||||
else
|
||||
echo -e " ${YELLOW}!${NC} SSO / → HTTP ${code} (ожидалось 200)"
|
||||
return 1
|
||||
fi
|
||||
}
|
||||
|
||||
verify_nginx_reaches_media_ws() {
|
||||
docker_nginx_container_running || return 0
|
||||
build_compose_stack_cmd
|
||||
@@ -3205,10 +3321,14 @@ diagnose_common_issues() {
|
||||
echo -e " ${RED}✘${NC} Конфликт: системный Nginx на 80/443 и lendry-id-nginx одновременно — браузер может ходить не туда (502)"
|
||||
echo " Решение: sudo systemctl stop nginx && ./install.sh --fix-all"
|
||||
issues=$((issues + 1))
|
||||
elif [[ "$(env_get NGINX_MODE docker)" == "host" ]] \
|
||||
|| port_in_use "${NGINX_HTTP_PORT:-80}" \
|
||||
|| port_in_use "${NGINX_HTTPS_PORT:-443}"; then
|
||||
echo -e " ${RED}✘${NC} Конфликт: контейнер lendry-id-nginx запущен при занятых портах 80/443 или NGINX_MODE=host"
|
||||
elif [[ "$(env_get NGINX_MODE docker)" == "host" ]]; then
|
||||
echo -e " ${RED}✘${NC} Конфликт: NGINX_MODE=host, но запущен lendry-id-nginx"
|
||||
echo " Решение: ./install.sh --fix-all"
|
||||
issues=$((issues + 1))
|
||||
elif [[ "$(env_get NGINX_MODE docker)" == "docker" ]] \
|
||||
&& ! docker_nginx_container_running \
|
||||
&& ( port_in_use "${NGINX_HTTP_PORT:-80}" || port_in_use "${NGINX_HTTPS_PORT:-443}" ); then
|
||||
echo -e " ${RED}✘${NC} Порты 80/443 заняты, но lendry-id-nginx не запущен"
|
||||
echo " Решение: ./install.sh --fix-all"
|
||||
issues=$((issues + 1))
|
||||
else
|
||||
@@ -3299,6 +3419,7 @@ diagnose_common_issues() {
|
||||
&& [[ -n "$(env_get DOMAIN_API "")" && -n "$(env_get DOMAIN_FRONTEND "")" ]]; then
|
||||
check_https_api_with_origin || issues=$((issues + 1))
|
||||
check_sso_idp_api_proxy || issues=$((issues + 1))
|
||||
check_sso_frontend_root || issues=$((issues + 1))
|
||||
fi
|
||||
|
||||
local api_domain frontend_domain public_api
|
||||
@@ -3677,12 +3798,15 @@ action_fix_all_errors() {
|
||||
apply_intranet_selfsigned_runtime
|
||||
recreate_docker_nginx
|
||||
sync_nginx_after_api_gateway_restart
|
||||
sync_nginx_after_edge_restart
|
||||
verify_nginx_reaches_api_gateway 24 5 || compose_build_and_up api-gateway
|
||||
sync_nginx_after_api_gateway_restart
|
||||
verify_nginx_reaches_media_ws || compose_build_and_up media-ws
|
||||
reload_docker_nginx
|
||||
verify_nginx_reaches_api_gateway 24 5 || fail "Nginx не проксирует на api-gateway — см. docker compose logs nginx api-gateway"
|
||||
verify_nginx_reaches_frontend 12 3 || fail "Nginx не проксирует / на frontend — см. docker compose logs nginx frontend"
|
||||
check_sso_idp_api_proxy || fail "SSO /idp-api/health недоступен — см. nginx/conf.d/${NGINX_PREFIX}-frontend.conf"
|
||||
check_sso_frontend_root || fail "SSO / → 502 — главная страница недоступна (502 Bad Gateway в браузере)"
|
||||
if ! docker_nginx_container_running; then
|
||||
fail "Контейнер lendry-id-nginx не запущен. Проверьте: docker compose --profile proxy logs nginx"
|
||||
fi
|
||||
|
||||
Reference in New Issue
Block a user