From 61e273f05b4b8e1b276d87c3d3ea67724cd31a10 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=90=D0=BD=D0=B4=D1=80=D0=B5=D0=B9=20=D0=91=D0=BE=D0=B1?= =?UTF-8?q?=D1=8B=D1=80=D0=B5=D0=B2?= Date: Mon, 27 Apr 2026 22:51:42 +0300 Subject: [PATCH] fix(tunnel): AUTOSSH_GATETIME=0 + setsid + log file for diagnostics MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Background autossh kept exiting because of two things: 1. autossh's gate-time guard (default 30s): if first ssh dies "too fast" autossh treats it as failure and gives up. Setting GATETIME=0 disables it. 2. nohup+subshell on BusyBox doesn't always fully detach. Try setsid first (proper new session, no controlling tty) and fall back to nohup subshell. Also write autossh diagnostics to /tmp/kdns_tun.log and dump it on failure so the user can see the real reason instead of just "не запустился". Co-Authored-By: Claude Sonnet 4.6 --- app/main.py | 23 +++++++++++++++++------ 1 file changed, 17 insertions(+), 6 deletions(-) diff --git a/app/main.py b/app/main.py index 41cab27..ae9e6f9 100644 --- a/app/main.py +++ b/app/main.py @@ -402,6 +402,10 @@ echo '[3/4] Скрипт тоннеля + автозапуск...' cat > /opt/bin/kdns_tun <<'RUNEOF' #!/bin/sh PATH="/opt/bin:/opt/sbin:/bin:/sbin:/usr/bin:/usr/sbin:$PATH" +# GATETIME=0 — не сдаваться если первый коннект короткий (важно при фоне на BusyBox). +# LOGFILE — autossh пишет диагностику сюда вместо syslog (которого может не быть). +export AUTOSSH_GATETIME=0 +export AUTOSSH_LOGFILE=/tmp/kdns_tun.log exec autossh -M 0 \\ -i /opt/etc/kdns_tk \\ -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null \\ @@ -424,20 +428,27 @@ chmod +x /opt/etc/init.d/S99kdns_tun echo '[4/4] Запуск...' killall autossh 2>/dev/null || true sleep 1 -# stdin=/dev/null обязательно: иначе autossh ловит EOF от закрытой curl-трубы и сразу выходит. -# subshell ( ... ) полностью отрывает процесс от родительского sh. -( nohup /opt/bin/kdns_tun /dev/null 2>&1 & ) -sleep 4 +rm -f /tmp/kdns_tun.log +# Двойная защита: setsid если есть (полный отрыв от сессии), иначе subshell+nohup. +if command -v setsid >/dev/null 2>&1; then + setsid /opt/bin/kdns_tun /dev/null 2>&1 & +else + ( nohup /opt/bin/kdns_tun /dev/null 2>&1 & ) +fi +sleep 5 if killall -0 autossh 2>/dev/null; then echo echo '=== OK ===' echo 'Тоннель: localhost:81 (роутер) -> VPS:{port}' + echo 'Лог: /tmp/kdns_tun.log' echo 'Возвращайся в браузер и жми "Проверить связь"' else echo echo '=== ОШИБКА: autossh не запустился в фоне ===' - echo 'Тест вручную (должно работать): /opt/bin/kdns_tun (Ctrl+C для выхода)' - echo 'Если вручную работает — попробуй: ( nohup /opt/bin/kdns_tun /dev/null 2>&1 & )' + echo '--- /tmp/kdns_tun.log ---' + cat /tmp/kdns_tun.log 2>/dev/null || echo '(лог пустой)' + echo '-------------------------' + echo 'Тест вручную: /opt/bin/kdns_tun (Ctrl+C для выхода)' exit 1 fi """