- Dockerfile с multi-stage сборкой для linux/amd64 и linux/arm64 - Gitea Actions CI/CD для автоматической сборки и пуша в registry - docker-compose с поддержкой multi-arch образов - install.sh с автоопределением архитектуры и выбором: pull vs build - uninstall.sh обновлён для Docker-деинсталляции - README.md обновлён: multi-arch, CI/CD, Gitea registry
109 lines
4.7 KiB
Bash
109 lines
4.7 KiB
Bash
#!/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} уже существует, пропускаем создание"
|
||
return 0
|
||
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..."
|
||
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
|