feat(cloudflared): timeout+fallback for WG handshake (WG_HANDSHAKE_TIMEOUT) so tunnel still starts when VPN peer is down
This commit is contained in:
@@ -24,3 +24,6 @@ AI_REQUEST_TIMEOUT_MS=120000
|
|||||||
CLOUDFLARE_TUNNEL_TOKEN=
|
CLOUDFLARE_TUNNEL_TOKEN=
|
||||||
# Внутренний адрес приложения, на который указывает Quick Tunnel.
|
# Внутренний адрес приложения, на который указывает Quick Tunnel.
|
||||||
CLOUDFLARE_TUNNEL_URL=http://app:3003
|
CLOUDFLARE_TUNNEL_URL=http://app:3003
|
||||||
|
# Максимальное ожидание WireGuard handshake перед fallback на прямой запуск
|
||||||
|
# туннеля без VPN (сек). Если VPN-провайдер не отвечает — сайт всё равно поднимется.
|
||||||
|
WG_HANDSHAKE_TIMEOUT=60
|
||||||
@@ -187,7 +187,7 @@ docker compose logs cloudflared | grep trycloud
|
|||||||
`cloudflared` собирается из `Dockerfile.cloudflared`, в который добавлена поддержка **опционального WireGuard** — полезно, когда Cloudflare не работает с прямого IP хоста, и исход туннеля нужно пустить через VPN.
|
`cloudflared` собирается из `Dockerfile.cloudflared`, в который добавлена поддержка **опционального WireGuard** — полезно, когда Cloudflare не работает с прямого IP хоста, и исход туннеля нужно пустить через VPN.
|
||||||
|
|
||||||
- Положите рабочий конфиг провайдера в `wg/wg0.conf` (папка `wg/` монтируется в контейнер как `/etc/wireguard`). Пример-заглушка уже лежит в `wg/wg0.conf` — замените значения на свои.
|
- Положите рабочий конфиг провайдера в `wg/wg0.conf` (папка `wg/` монтируется в контейнер как `/etc/wireguard`). Пример-заглушка уже лежит в `wg/wg0.conf` — замените значения на свои.
|
||||||
- Если `wg/wg0.conf` есть → контейнер **сначала поднимает WireGuard, дожидается handshake и только потом запускает туннель** (весь эгресс Cloudflare идёт через VPN).
|
- Если `wg/wg0.conf` есть → контейнер **сначала поднимает WireGuard и ждёт handshake** (весь эгресс Cloudflare идёт через VPN). Если handshake не установился за `WG_HANDSHAKE_TIMEOUT` сек (по умолчанию 60) — **fallback: туннель стартует напрямую без VPN**, а в логах пишется предупреждение (сайт не лежит из-за недоступного VPN-провайдера).
|
||||||
- Если `wg0.conf` нет или папка пустая → VPN не включается, туннель стартует сразу, как в базовой схеме.
|
- Если `wg0.conf` нет или папка пустая → VPN не включается, туннель стартует сразу, как в базовой схеме.
|
||||||
|
|
||||||
Проверка:
|
Проверка:
|
||||||
|
|||||||
@@ -85,6 +85,7 @@ services:
|
|||||||
environment:
|
environment:
|
||||||
TZ: Europe/Moscow
|
TZ: Europe/Moscow
|
||||||
CLOUDFLARE_TUNNEL_URL: ${CLOUDFLARE_TUNNEL_URL:-http://app:3003}
|
CLOUDFLARE_TUNNEL_URL: ${CLOUDFLARE_TUNNEL_URL:-http://app:3003}
|
||||||
|
WG_HANDSHAKE_TIMEOUT: ${WG_HANDSHAKE_TIMEOUT:-60}
|
||||||
depends_on:
|
depends_on:
|
||||||
- app
|
- app
|
||||||
|
|
||||||
|
|||||||
+14
-4
@@ -15,12 +15,22 @@ if [ -f /etc/wireguard/wg0.conf ]; then
|
|||||||
# wg-quick/resolvconf перезаписывает resolv.conf (убирает docker-DNS 127.0.0.11),
|
# wg-quick/resolvconf перезаписывает resolv.conf (убирает docker-DNS 127.0.0.11),
|
||||||
# из-за чего внутреннее имя app не резолвится. Восстанавливаем прежний конфиг.
|
# из-за чего внутреннее имя app не резолвится. Восстанавливаем прежний конфиг.
|
||||||
cat /tmp/resolv.conf.default > /etc/resolv.conf
|
cat /tmp/resolv.conf.default > /etc/resolv.conf
|
||||||
echo "Waiting for WireGuard handshake..."
|
echo "Waiting for WireGuard handshake (timeout: ${WG_HANDSHAKE_TIMEOUT:-60}s)..."
|
||||||
# Формат `wg show wg0 latest-handshakes`: "<pubkey> <epoch-ts>"; 0 = handshake ещё не было.
|
# Формат `wg show wg0 latest-handshakes`: "<pubkey> <epoch-ts>"; 0 = handshake ещё не было.
|
||||||
until wg show wg0 latest-handshakes | awk '{ if ($2 != 0) found=1 } END { exit !found }'; do
|
waited=0; handshake=0
|
||||||
sleep 2
|
while [ "$handshake" -eq 0 ] && [ "$waited" -lt "${WG_HANDSHAKE_TIMEOUT:-60}" ]; do
|
||||||
|
if wg show wg0 latest-handshakes | awk '{ if ($2 != 0) found=1 } END { exit !found }'; then
|
||||||
|
handshake=1
|
||||||
|
else
|
||||||
|
sleep 2
|
||||||
|
waited=$((waited + 2))
|
||||||
|
fi
|
||||||
done
|
done
|
||||||
echo "WireGuard is up, starting Cloudflare tunnel through VPN..."
|
if [ "$handshake" -eq 1 ]; then
|
||||||
|
echo "WireGuard is up, starting Cloudflare tunnel through VPN..."
|
||||||
|
else
|
||||||
|
echo "WARNING: WireGuard handshake not established within ${WG_HANDSHAKE_TIMEOUT:-60}s; starting Cloudflare tunnel directly (no VPN egress)."
|
||||||
|
fi
|
||||||
else
|
else
|
||||||
echo "No WireGuard config, starting Cloudflare tunnel directly..."
|
echo "No WireGuard config, starting Cloudflare tunnel directly..."
|
||||||
fi
|
fi
|
||||||
|
|||||||
Reference in New Issue
Block a user