Files
wireguard-vps-tunnel/client/entrypoint.sh
Deploy Bot dcebf21e03
Some checks failed
Build and Push Docker Images / Сборка сервера (multi-arch) (push) Has been cancelled
Build and Push Docker Images / Сборка клиента (multi-arch) (push) Has been cancelled
fix: restart-safe entrypoints, remove obsolete compose version
- Add wg0 interface cleanup before startup (prevents 'already exists' crash)
- Always regenerate wg0.conf to pick up key changes
- Remove obsolete 'version' from docker-compose files
- Fix read-only /proc/sys writes (host-level ip_forward already set)
2026-07-30 00:30:18 +01:00

118 lines
5.1 KiB
Bash
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#!/usr/bin/env bash
# =============================================================================
# WireGuard VPS Tunnel — точка входа клиента (домашний сервер)
# Генерирует конфигурацию wg0.conf из переменных окружения и поднимает туннель.
# =============================================================================
set -euo pipefail
# ── Значения по умолчанию ───────────────────────────────────────────────────
CLIENT_WG_IP="${CLIENT_WG_IP:-10.0.0.2}"
VPS_WG_PORT="${VPS_WG_PORT:-51820}"
PERSISTENT_KEEPALIVE="${PERSISTENT_KEEPALIVE:-21}"
SERVER_WG_IP="${SERVER_WG_IP:-10.0.0.1}"
WG_CONF="/etc/wireguard/wg0.conf"
# ── Логирование ─────────────────────────────────────────────────────────────
log() { echo "[$(date '+%Y-%m-%d %H:%M:%S')] [$1] $*"; }
# ── Проверка обязательных переменных ───────────────────────────────────────
check_required() {
if [[ -z "${VPS_PUBLIC_IP:-}" ]]; then
log "ERROR" "VPS_PUBLIC_IP не задан. Укажите публичный IP VPS."
exit 1
fi
if [[ -z "${SERVER_PUBLIC_KEY:-}" ]]; then
log "ERROR" "SERVER_PUBLIC_KEY не задан. Укажите публичный ключ сервера."
exit 1
fi
}
# ── Генерация ключей ───────────────────────────────────────────────────────
generate_keys() {
local private_key_file="/etc/wireguard/client_private.key"
local public_key_file="/etc/wireguard/client_public.key"
if [[ -f "$private_key_file" ]] && [[ -f "$public_key_file" ]]; then
log "INFO" "Ключи клиента уже существуют"
else
log "INFO" "Генерация ключей клиента..."
wg genkey | tee "$private_key_file" | wg pubkey > "$public_key_file"
chmod 600 "$private_key_file"
log "INFO" "Ключи клиента сгенерированы"
fi
CLIENT_PRIVATE_KEY=$(cat "$private_key_file")
CLIENT_PUBLIC_KEY=$(cat "$public_key_file")
}
# ── Создание конфигурации WireGuard ────────────────────────────────────────
create_wg_config() {
# Всегда пересоздаём конфиг — ключи или эндпоинт могли измениться
if [[ -f "$WG_CONF" ]]; then
log "INFO" "Обновление конфигурации ${WG_CONF}..."
rm -f "$WG_CONF"
fi
mkdir -p "$(dirname "$WG_CONF")"
cat > "$WG_CONF" <<WGCONF
# WireGuard VPS Tunnel — конфигурация клиента (домашний сервер)
# Создано: $(date '+%Y-%m-%d %H:%M:%S')
[Interface]
PrivateKey = ${CLIENT_PRIVATE_KEY}
Address = ${CLIENT_WG_IP}/24
[Peer]
# VPS (сервер)
PublicKey = ${SERVER_PUBLIC_KEY}
Endpoint = ${VPS_PUBLIC_IP}:${VPS_WG_PORT}
AllowedIPs = ${SERVER_WG_IP}/24
PersistentKeepalive = ${PERSISTENT_KEEPALIVE}
WGCONF
chmod 600 "$WG_CONF"
log "INFO" "Конфигурация WireGuard создана: ${WG_CONF}"
}
# ── Запуск WireGuard ───────────────────────────────────────────────────────
start_wireguard() {
log "INFO" "Запуск WireGuard интерфейса wg0..."
# Удаляем старый интерфейс если остался от предыдущего запуска
if ip link show wg0 &>/dev/null; then
log "INFO" "Удаление старого интерфейса wg0..."
ip link del wg0 2>/dev/null || true
sleep 1
fi
wg-quick up wg0
log "INFO" "WireGuard интерфейс wg0 запущен"
log "INFO" "Публичный ключ клиента: ${CLIENT_PUBLIC_KEY}"
log "INFO" "Скопируйте его на сервер: CLIENT_PUBLIC_KEY=${CLIENT_PUBLIC_KEY}"
}
# ── Главная функция ────────────────────────────────────────────────────────
main() {
log "INFO" "=== Запуск WireGuard VPS Tunnel (клиент) ==="
log "INFO" "CLIENT_WG_IP=${CLIENT_WG_IP}"
log "INFO" "VPS_PUBLIC_IP=${VPS_PUBLIC_IP}"
log "INFO" "VPS_WG_PORT=${VPS_WG_PORT}"
log "INFO" "PERSISTENT_KEEPALIVE=${PERSISTENT_KEEPALIVE}"
check_required
generate_keys
create_wg_config
start_wireguard
# Запуск watchdog в фоне
log "INFO" "Запуск watchdog..."
/watchdog.sh &
log "INFO" "Клиент запущен. Ожидание..."
exec sleep infinity
}
main