#!/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 -it --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}/" 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 "=========================================================================="