39 lines
1.9 KiB
Bash
Executable File
39 lines
1.9 KiB
Bash
Executable File
#!/bin/sh
|
|
set -e
|
|
|
|
# Опциональный WireGuard: если в wg/wg0.conf лежит конфиг — поднимаем VPN
|
|
# и только после установки handshake запускаем туннель. Без конфига —
|
|
# cloudflared стартует сразу, как в базовой схеме Quick Tunnel.
|
|
if [ -f /etc/wireguard/wg0.conf ]; then
|
|
echo "WireGuard config found, bringing up wg0..."
|
|
# Папка wg/ смонтирована :ro, поэтому копируем в /tmp и ставим 600, чтобы
|
|
# wg-quick не ругался на world-accessible файл приватного ключа.
|
|
cp /etc/wireguard/wg0.conf /tmp/wg0.conf
|
|
chmod 600 /tmp/wg0.conf
|
|
cp /etc/resolv.conf /tmp/resolv.conf.default
|
|
wg-quick up /tmp/wg0.conf
|
|
# wg-quick/resolvconf перезаписывает resolv.conf (убирает docker-DNS 127.0.0.11),
|
|
# из-за чего внутреннее имя app не резолвится. Восстанавливаем прежний конфиг.
|
|
cat /tmp/resolv.conf.default > /etc/resolv.conf
|
|
echo "Waiting for WireGuard handshake (timeout: ${WG_HANDSHAKE_TIMEOUT:-60}s)..."
|
|
# Формат `wg show wg0 latest-handshakes`: "<pubkey> <epoch-ts>"; 0 = handshake ещё не было.
|
|
waited=0; handshake=0
|
|
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
|
|
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
|
|
echo "No WireGuard config, starting Cloudflare tunnel directly..."
|
|
fi
|
|
|
|
exec cloudflared --no-autoupdate tunnel --url "$CLOUDFLARE_TUNNEL_URL"
|