#!/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`: " "; 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"