vka1 / run.sh
shDima1's picture
Create run.sh
a9359ac verified
#!/bin/bash
set -e
# --- КОНФИГУРАЦИЯ ---
WG_CONF_TEMPLATE="/etc/wireguard/wg0.conf.template"
WG_CONF="/etc/wireguard/wg0.conf"
VPN_SUBNET_BASE="10.8.0"
# --- 1. НАСТРОЙКА КЛЮЧЕЙ СЕРВЕРА ---
if [ -z "${SERVER_PRIVATE_KEY}" ]; then
echo "Секрет SERVER_PRIVATE_KEY не найден. Генерирую новую пару ключей..."
# Генерируем новый приватный ключ и сохраняем его
SERVER_PRIVATE_KEY=$(wg genkey)
echo "ВАЖНО: Сохраните этот приватный ключ, если хотите перезапустить Space с той же конфигурацией."
echo "SERVER_PRIVATE_KEY: ${SERVER_PRIVATE_KEY}"
else
echo "Использую приватный ключ сервера из секрета."
fi
# Получаем публичный ключ из приватного
SERVER_PUBLIC_KEY=$(echo "${SERVER_PRIVATE_KEY}" | wg pubkey)
echo "============================================================="
echo "Публичный ключ сервера (Server Public Key):"
echo "${SERVER_PUBLIC_KEY}"
echo "============================================================="
# --- 2. ГЕНЕРАЦИЯ КОНФИГУРАЦИИ ---
cp "${WG_CONF_TEMPLATE}" "${WG_CONF}"
# Подставляем приватный ключ сервера в конфигурацию
sed -i "s|__SERVER_PRIVATE_KEY__|${SERVER_PRIVATE_KEY}|g" "${WG_CONF}"
# --- 3. ДОБАВЛЕНИЕ КЛИЕНТОВ (ПИРОВ) ---
echo "Поиск публичных ключей клиентов в секретах (CLIENT_PUBLIC_KEY_1, _2, ...)"
CLIENT_PEERS_CONFIG=""
CLIENT_COUNT=0
# Ищем до 20 клиентов. Можно увеличить.
for i in {1..20}; do
# Получаем переменную окружения динамически (например, CLIENT_PUBLIC_KEY_1)
CLIENT_KEY_VAR="CLIENT_PUBLIC_KEY_${i}"
# Проверяем, установлена ли переменная
if [ -n "${!CLIENT_KEY_VAR}" ]; then
CLIENT_COUNT=$((CLIENT_COUNT + 1))
CLIENT_PUBLIC_KEY="${!CLIENT_KEY_VAR}"
# Назначаем клиенту IP-адрес, начиная с 10.8.0.2
CLIENT_IP="${VPN_SUBNET_BASE}.$((i + 1))/32"
echo "Найден клиент #${i} с IP ${CLIENT_IP}"
# Формируем блок [Peer] для этого клиента
CLIENT_PEERS_CONFIG+=$(cat <<EOF
[Peer]
# Клиент ${i}
PublicKey = ${CLIENT_PUBLIC_KEY}
AllowedIPs = ${CLIENT_IP}
EOF
)
fi
done
if [ ${CLIENT_COUNT} -eq 0 ]; then
echo "ПРЕДУПРЕЖДЕНИЕ: Не найдено ни одного секрета клиента (CLIENT_PUBLIC_KEY_...). Сервер запустится, но никто не сможет подключиться."
else
# Заменяем плейсхолдер __CLIENT_PEERS__ на сгенерированные блоки
# Используем `tr` для замены новой строки на какой-нибудь редкий символ, чтобы sed сработал
REPLACEMENT=$(echo "${CLIENT_PEERS_CONFIG}" | tr '\n' '\r')
sed -i "s|# __CLIENT_PEERS__|${REPLACEMENT}|g" "${WG_CONF}"
# Возвращаем новые строки обратно
sed -i 's/\r/\n/g' "${WG_CONF}"
fi
echo "Финальная конфигурация сервера (/etc/wireguard/wg0.conf):"
cat "${WG_CONF}"
echo "-------------------------------------------------------------"
# --- 4. ВЫВОД ИНФОРМАЦИИ ДЛЯ КЛИЕНТА ---
echo "================== КОНФИГУРАЦИЯ ДЛЯ КЛИЕНТА =================="
echo "Используйте эту информацию для настройки вашего клиента."
echo "ВАЖНО: Endpoint Hostname - это адрес вашего Space (${SPACE_HOST})."
echo "ВАЖНО: Endpoint Port - это ПЕРЕНАЗНАЧЕННЫЙ порт. Ищите его в логах выше (строка 'remaped port 51820 into ...')."
echo ""
echo "[Interface]"
echo "PrivateKey = <ВАШ_КЛИЕНТСКИЙ_ПРИВАТНЫЙ_КЛЮЧ>"
echo "Address = ${VPN_SUBNET_BASE}.2/32 # (для клиента 1, для клиента 2 будет 10.8.0.3 и т.д.)"
echo "DNS = 1.1.1.1"
echo ""
echo "[Peer]"
echo "PublicKey = ${SERVER_PUBLIC_KEY}"
echo "AllowedIPs = 0.0.0.0/0, ::/0"
echo "Endpoint = ${SPACE_HOST}:<ВНЕШНИЙ_ПОРТ_ИЗ_ЛОГОВ>"
echo "PersistentKeepalive = 25"
echo "============================================================="
# --- 5. ЗАПУСК СЕРВЕРА ---
shutdown() {
echo "Остановка WireGuard сервера..."
wg-quick down "${WG_CONF}"
exit 0
}
trap 'shutdown' SIGTERM SIGINT
echo "Запуск WireGuard сервера на интерфейсе wg0..."
wg-quick up "${WG_CONF}"
echo "Сервер WireGuard запущен. Контейнер работает."
# Оставляем контейнер работать в фоне
tail -f /dev/null