79 lines
3.7 KiB
Bash
Executable file
79 lines
3.7 KiB
Bash
Executable file
#!/usr/bin/env bash
|
||
# ==============================================================================
|
||
# Pelmeni Shield VPN - Initial Setup & Zero-Exposure Deployment Script
|
||
# ==============================================================================
|
||
set -euo pipefail
|
||
|
||
cd "$(dirname "$0")/.."
|
||
|
||
if [[ ! -f .env ]]; then
|
||
if [[ -f .env.example ]]; then
|
||
echo "⚠️ Файл .env не найден! Создаю из .env.example..."
|
||
cp .env.example .env
|
||
echo "📝 Пожалуйста, отредактируйте .env (укажите ваш реальный DOMAIN) и запустите скрипт снова!"
|
||
exit 1
|
||
else
|
||
echo "❌ Ошибка: .env.example не найден!"
|
||
exit 1
|
||
fi
|
||
fi
|
||
|
||
# shellcheck source=/dev/null
|
||
source .env
|
||
|
||
if [[ -z "${DOMAIN:-}" || "${DOMAIN}" == "endpoint.pelmeni-club.com" ]]; then
|
||
echo "❌ Ошибка: Укажите реальный DOMAIN в файле .env!"
|
||
exit 1
|
||
fi
|
||
|
||
echo "🛡️ === 1. Активная защита: Дроп подсети сканеров РКН (ГРЧЦ / ЦМУ ССОП) ==="
|
||
RKN_SUBNET="212.192.156.0/22"
|
||
|
||
if command -v iptables >/dev/null 2>&1; then
|
||
if ! iptables -C INPUT -s "${RKN_SUBNET}" -j DROP 2>/dev/null; then
|
||
echo "🚫 Блокирую диапазон сканеров РКН (${RKN_SUBNET}) в iptables..."
|
||
iptables -I INPUT 1 -s "${RKN_SUBNET}" -m comment --comment "RKN_ACTIVE_PROBING_DROP" -j DROP
|
||
echo "✅ Правило iptables успешно добавлено."
|
||
else
|
||
echo "ℹ️ Правило для ${RKN_SUBNET} уже присутствует в iptables."
|
||
fi
|
||
else
|
||
echo "⚠️ iptables не найден, пропускаю настройку файрвола хоста."
|
||
fi
|
||
|
||
echo "📁 === 2. Подготовка каталогов ==="
|
||
mkdir -p 3x-ui certbot/certs certbot/www nginx/conf.d nginx/site
|
||
|
||
echo "🔐 === 3. Проверка SSL-сертификата для ${DOMAIN} ==="
|
||
CERT_PATH="certbot/certs/live/${DOMAIN}/fullchain.pem"
|
||
if [[ ! -f "${CERT_PATH}" ]]; then
|
||
echo "🌐 Запуск первичного выпуска SSL-сертификата Let's Encrypt..."
|
||
docker run --rm --name certbot-init \
|
||
-p 80:80 \
|
||
-v "$(pwd)/certbot/certs:/etc/letsencrypt" \
|
||
-v "$(pwd)/certbot/www:/var/www/certbot" \
|
||
certbot/certbot certonly --standalone \
|
||
--non-interactive --agree-tos \
|
||
--email "${CERTBOT_EMAIL}" \
|
||
-d "${DOMAIN}"
|
||
echo "✅ SSL-сертификат успешно получен!"
|
||
else
|
||
echo "✅ SSL-сертификат уже существует: ${CERT_PATH}"
|
||
fi
|
||
|
||
echo "🚀 === 4. Запуск контейнеров Pelmeni Shield ==="
|
||
docker compose up -d
|
||
|
||
echo ""
|
||
echo "=========================================================================="
|
||
echo "🎉 СТЕК PELMENI SHIELD VPN УСПЕШНО РАЗВЕРНУТ И ЗАЩИЩЕН!"
|
||
echo "=========================================================================="
|
||
echo "🥟 Сайт-заглушка: https://${DOMAIN}/"
|
||
echo "🥟 Внутренний Fallback: http://127.0.0.1:8080 (только внутри Docker)"
|
||
echo "🥟 Шлюз подписок: https://${DOMAIN}/api/v1/recipes/secret_${SUB_TOKEN}/<subId>"
|
||
echo ""
|
||
echo "🔒 ВЕБ-ПАНЕЛЬ 3X-UI ЗАКРЫТА ОТ МИРА И СЛУШАЕТ ТОЛЬКО 127.0.0.1:2053!"
|
||
echo "👉 Для входа в панель откройте безопасный SSH-туннель с вашего ПК:"
|
||
echo " ssh -L 2053:127.0.0.1:2053 root@$(curl -s ifconfig.me || echo 'IP_СЕРВЕРА')"
|
||
echo " Затем перейдите в браузере: http://localhost:2053"
|
||
echo "=========================================================================="
|