исправление: задержка и повторы при старте + правильный Host для nginx прокси (v1.1.5)

This commit is contained in:
Petro1990 2026-03-13 18:05:50 +03:00
parent 330e4bc0d1
commit 8b03ea2518
2 changed files with 84 additions and 7 deletions

View File

@ -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() {

49
rproxy
View File

@ -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 если нужно