Fix: полное восстановление структуры файла и исправленной логики портов

This commit is contained in:
Petro1990 2026-03-14 23:33:49 +03:00
parent a1ad844315
commit 38188630ef
1 changed files with 59 additions and 43 deletions

102
rproxy
View File

@ -3,7 +3,7 @@
# Публикация локальных сервисов через SSH-туннели + nginx на VPS
# https://github.com/l-ptrol/rProxy
VERSION="1.8.8"
VERSION="1.8.6"
export PATH="/opt/bin:/opt/sbin:$PATH"
CONF_DIR="/opt/etc/rproxy"
CONF_FILE="$CONF_DIR/rproxy.conf"
@ -972,51 +972,39 @@ do_edit_interactive() {
scp_cmd "$tmp" "$VPS_USER@$VPS_HOST:$remote_loc_dir/$name.conf"
rm -f "$tmp"
# Теперь эта функция генерирует ТОЛЬКО блоки location
# Основной конфиг сервера будет собираться отдельно
cat > "$target_file" << NGINXEOF
# Редирект с пути без слеша на путь со слешем (чтобы браузер не терял контекст)
if (\$request_uri = $path) {
return 301 \$scheme://\$host$path/;
}
location $location_path {
$auth_config
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 "$stealth_host";
proxy_set_header Origin "http://$stealth_host";
proxy_set_header Referer "http://$stealth_host";
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_set_header X-Forwarded-Host \$host;
proxy_set_header X-Forwarded-Server \$host;
proxy_set_header X-Forwarded-Path "$path";
# Пересборка основного конфига
if [ -n "$SVC_DOMAIN" ]; then
rebuild_vhost_config "$SVC_DOMAIN" "$SVC_EXT_PORT" "$SVC_VPS"
else
rebuild_ip_config "$name" "$SVC_EXT_PORT" "$SVC_TUNNEL_PORT" "$SVC_VPS"
fi
proxy_cookie_domain "$t_host" "\$host";
proxy_cookie_path / "$path";
# Редиректы: если приложение шлет Location: /login, Nginx заменит на Location: $path/login
proxy_redirect / "$path/";
# Экспериментальная замена ссылок в HTML/JS для работы в подпутях (v1.8.7)
if (\$path != "/") {
# Убираем сжатие от бэкенда, чтобы Nginx мог видеть текст
proxy_set_header Accept-Encoding "";
sub_filter_once off;
sub_filter_types text/html text/css application/javascript application/json;
# Заменяем ссылки начинающиеся с / на /путь/
sub_filter '="/' '="$path/';
sub_filter '=\"/' '=\"$path/';
# Попытка поймать JS редиректы и AJAX
sub_filter 'location.href = \"/' 'location.href = \"$path/';
sub_filter 'url: \"/' 'url: \"$path/';
# SSL если он был настроен или сертификат уже есть
if [ "$SVC_SSL" = "yes" ] || { [ -n "$SVC_DOMAIN" ] && ssh_cmd "[ -f /etc/letsencrypt/live/$SVC_DOMAIN/fullchain.pem ]"; }; then
# Если SVC_SSL была "no", но сертификат нашли — помечаем как "yes"
if [ "$SVC_SSL" = "no" ]; then
sed -i "s/SVC_SSL=.*/SVC_SSL=\"yes\"/" "$SERVICES_DIR/$name.conf"
# Пересобираем vhost чтобы включить SSL блок
rebuild_vhost_config "$SVC_DOMAIN" "$SVC_EXT_PORT" "$SVC_VPS"
fi
}
NGINXEOF
<EFBFBD>══════
fi
# Обновление htpasswd на VPS если включено
if [ "$SVC_NDM_AUTH" = "yes" ]; then
ssh_cmd "printf '%s\n' '$SVC_HTPASSWD' > /etc/nginx/rproxy_$name.htpasswd"
fi
# Перезапустить туннель если он был запущен
if [ "$was_running" -eq 1 ]; then
do_start_service "$name"
fi
msg "Сервис '$name' успешно обновлён локально и на VPS!"
pause
}
# ══════════════════════════════════════════════════════════════════════
# ВЫБОР СЕРВИСА (общий)
# ══════════════════════════════════════════════════════════════════════
select_service() {
@ -1345,11 +1333,39 @@ EOF
scp_cmd "$tmp_vhost" "$VPS_USER@$VPS_HOST:$REMOTE_NGINX_DIR/rproxy_dom_$domain.conf"
else
# Это не должно вызываться для IP-публикаций напрямую через эту функцию
# Но на всякий случай оставим заглушку
return 1
fi
rm -f "$tmp_vhost"
ssh_cmd "nginx -t && systemctl reload nginx" >/dev/null 2>&1
}
# Специальная функция для IP-публикаций (они остаются одиночными)
rebuild_ip_config() {
local name="$1"
local ext_port="$2"
local tunnel_port="$3"
local vps_id="$4"
load_vps "$vps_id"
local tmp_ip="/tmp/rproxy_ip_$name.conf"
cat > "$tmp_ip" << EOF
server {
listen $ext_port;
proxy_buffering off;
proxy_request_buffering off;
include $REMOTE_LOCATIONS_DIR/_ip_$name/*.conf;
}
EOF
ssh_cmd "mkdir -p $REMOTE_LOCATIONS_DIR/_ip_$name"
scp_cmd "$tmp_ip" "$VPS_USER@$VPS_HOST:$REMOTE_NGINX_DIR/rproxy_svc_$name.conf"
rm -f "$tmp_ip"
ssh_cmd "nginx -t && systemctl reload nginx" >/dev/null 2>&1
}
do_start_all() {
for f in "$SERVICES_DIR"/*.conf; do
[ -f "$f" ] || continue