From 8b03ea2518a1c50c59bf67db474256024c29a88b Mon Sep 17 00:00:00 2001 From: Petro1990 Date: Fri, 13 Mar 2026 18:05:50 +0300 Subject: [PATCH] =?UTF-8?q?=D0=B8=D1=81=D0=BF=D1=80=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=D0=B8=D0=B5:=20=D0=B7=D0=B0=D0=B4=D0=B5=D1=80?= =?UTF-8?q?=D0=B6=D0=BA=D0=B0=20=D0=B8=20=D0=BF=D0=BE=D0=B2=D1=82=D0=BE?= =?UTF-8?q?=D1=80=D1=8B=20=D0=BF=D1=80=D0=B8=20=D1=81=D1=82=D0=B0=D1=80?= =?UTF-8?q?=D1=82=D0=B5=20+=20=D0=BF=D1=80=D0=B0=D0=B2=D0=B8=D0=BB=D1=8C?= =?UTF-8?q?=D0=BD=D1=8B=D0=B9=20Host=20=D0=B4=D0=BB=D1=8F=20nginx=20=D0=BF?= =?UTF-8?q?=D1=80=D0=BE=D0=BA=D1=81=D0=B8=20(v1.1.5)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- S98rproxy | 42 ++++++++++++++++++++++++++++++++++++++++++ rproxy | 49 ++++++++++++++++++++++++++++++++++++++++++------- 2 files changed, 84 insertions(+), 7 deletions(-) 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 если нужно