diff --git a/S98rproxy b/S98rproxy index 64cae86..9aac1d7 100644 --- a/S98rproxy +++ b/S98rproxy @@ -6,9 +6,51 @@ ENABLED=yes PROCS="rproxy" DESC="rProxy reverse proxy tunnels" +# Задержка перед первым запуском (секунды) +# Даёт время остальным сервисам стартовать +BOOT_DELAY=30 + +# Количество попыток и пауза между ними +MAX_RETRIES=3 +RETRY_DELAY=15 + start() { echo "Starting $DESC..." + + # Задержка при старте — даём время сети и сервисам подняться + echo " Ожидание $BOOT_DELAY сек (инициализация сети и сервисов)..." + sleep $BOOT_DELAY + + # Первая попытка /opt/bin/rproxy start + + # Повторные попытки для сервисов, которые не смогли стартовать + local attempt=1 + while [ "$attempt" -le "$MAX_RETRIES" ]; do + sleep $RETRY_DELAY + + # Проверяем, все ли сервисы запущены + local total=0 running=0 + for f in /opt/etc/rproxy/services/*.conf; do + [ -f "$f" ] || continue + . "$f" + [ "$SVC_ENABLED" != "yes" ] && continue + total=$((total + 1)) + if pgrep -f "ssh.*$SVC_TUNNEL_PORT:$SVC_TARGET_HOST" >/dev/null 2>&1; then + running=$((running + 1)) + fi + done + + # Если все сервисы запущены — выходим + if [ "$running" -ge "$total" ] || [ "$total" -eq 0 ]; then + echo " Все $total сервисов запущены." + break + fi + + echo " Попытка $attempt/$MAX_RETRIES: запущено $running/$total, перезапускаю отсутствующие..." + /opt/bin/rproxy start + attempt=$((attempt + 1)) + done } stop() { diff --git a/rproxy b/rproxy index d0c03ab..c014824 100644 --- a/rproxy +++ b/rproxy @@ -464,18 +464,53 @@ do_add_interactive() { msg "Добавляю сервис '$name'..." - # Конфиг nginx (упрощенная генерация) - local nginx_conf + # Генерация конфига nginx + # Host передаём как адрес целевого сервиса, чтобы бэкенд не отклонял запрос + # (например, веб-морда роутера проверяет Host и отказывает при несовпадении) + local tmp="/tmp/rproxy_$name.conf" if [ -n "$domain" ]; then - nginx_conf="server { listen 80; server_name $domain; location / { proxy_pass http://127.0.0.1:$tunnel_port; proxy_set_header Host \$host; proxy_set_header X-Real-IP \$remote_addr; } }" + cat > "$tmp" << NGINXEOF +server { + listen 80; + server_name $domain; + location / { + proxy_pass http://127.0.0.1:$tunnel_port; + proxy_http_version 1.1; + proxy_set_header Upgrade \$http_upgrade; + proxy_set_header Connection "upgrade"; + proxy_set_header Host $t_host:$t_port; + proxy_set_header X-Real-IP \$remote_addr; + proxy_set_header X-Forwarded-For \$proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto \$scheme; + proxy_connect_timeout 60s; + proxy_send_timeout 60s; + proxy_read_timeout 60s; + } +} +NGINXEOF else - nginx_conf="server { listen $ext_port; location / { proxy_pass http://127.0.0.1:$tunnel_port; proxy_set_header Host \$host; } }" + cat > "$tmp" << NGINXEOF +server { + listen $ext_port; + location / { + proxy_pass http://127.0.0.1:$tunnel_port; + proxy_http_version 1.1; + proxy_set_header Upgrade \$http_upgrade; + proxy_set_header Connection "upgrade"; + proxy_set_header Host $t_host:$t_port; + proxy_set_header X-Real-IP \$remote_addr; + proxy_set_header X-Forwarded-For \$proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto \$scheme; + proxy_connect_timeout 60s; + proxy_send_timeout 60s; + proxy_read_timeout 60s; + } +} +NGINXEOF fi # Деплой - local tmp="/tmp/rproxy_$name.conf" - echo "$nginx_conf" > "$tmp" - scp_cmd "$tmp" "$VPS_USER@$VPS_HOST:$REMOTE_NGINX_DIR/rproxy_$name.conf" || { err "Ошибка деплоя nginx"; pause; return; } + scp_cmd "$tmp" "$VPS_USER@$VPS_HOST:$REMOTE_NGINX_DIR/rproxy_$name.conf" || { err "Ошибка деплоя nginx"; rm -f "$tmp"; pause; return; } ssh_cmd "nginx -t && systemctl reload nginx" >/dev/null 2>&1 # SSL если нужно