#!/bin/bash # MY Network Domain & SSL Setup Script # Настройка домена и SSL сертификата для MY Network set -e echo "==================================================" echo "🌐 MY NETWORK DOMAIN & SSL SETUP" echo "Настройка домена и HTTPS сертификата" echo "==================================================" # Проверка что скрипт запущен от root if [ "$EUID" -ne 0 ]; then echo "❌ Скрипт должен быть запущен от root (sudo)" exit 1 fi # Запрос домена echo "" echo "=== 1. НАСТРОЙКА ДОМЕНА ===" read -p "🌐 Введите ваш домен (например: mynetwork.example.com): " DOMAIN if [ -z "$DOMAIN" ]; then echo "❌ Домен не может быть пустым!" exit 1 fi echo "✅ Домен: $DOMAIN" # Проверка DNS echo "" echo "=== 2. ПРОВЕРКА DNS ===" echo "🔍 Проверяю DNS записи для $DOMAIN..." DOMAIN_IP=$(dig +short $DOMAIN 2>/dev/null || echo "") SERVER_IP=$(curl -s ifconfig.me 2>/dev/null || echo "") echo "Домен $DOMAIN указывает на: $DOMAIN_IP" echo "IP сервера: $SERVER_IP" if [ "$DOMAIN_IP" != "$SERVER_IP" ]; then echo "⚠️ ВНИМАНИЕ: DNS записи не совпадают!" echo "Убедитесь что A-запись домена $DOMAIN указывает на $SERVER_IP" read -p "Продолжить настройку? (y/N): " CONTINUE if [ "$CONTINUE" != "y" ] && [ "$CONTINUE" != "Y" ]; then echo "❌ Настройка отменена" exit 1 fi else echo "✅ DNS записи корректны" fi # Установка Certbot echo "" echo "=== 3. УСТАНОВКА CERTBOT ===" echo "📦 Установка Certbot для Let's Encrypt..." apt update apt install -y snapd snap install core; snap refresh core snap install --classic certbot ln -sf /snap/bin/certbot /usr/bin/certbot echo "✅ Certbot установлен" # Исправление nginx конфигурации echo "" echo "=== 4. ИСПРАВЛЕНИЕ NGINX КОНФИГУРАЦИИ ===" echo "🔧 Создание корректной nginx конфигурации..." # Резервная копия cp /etc/nginx/sites-enabled/default /etc/nginx/sites-enabled/default.backup.$(date +%s) cat > /etc/nginx/sites-available/default << EOF server { listen 80; server_name $DOMAIN; # Максимальный размер загружаемых файлов client_max_body_size 100M; # Let's Encrypt challenge location /.well-known/acme-challenge/ { root /var/www/html; } # Redirect to HTTPS (будет добавлено после получения сертификата) location / { return 301 https://\$server_name\$request_uri; } } # Временная конфигурация для получения сертификата server { listen 80; server_name $DOMAIN; location /.well-known/acme-challenge/ { root /var/www/html; } # API проксирование (временно для тестирования) location /api/ { proxy_pass http://localhost:3000/api/; proxy_set_header Host \$host; proxy_set_header X-Real-IP \$remote_addr; proxy_set_header X-Forwarded-For \$proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto \$scheme; proxy_connect_timeout 60s; proxy_send_timeout 60s; proxy_read_timeout 60s; proxy_buffering off; } # Health check location /health { proxy_pass http://localhost:3000/api/health; proxy_set_header Host \$host; proxy_set_header X-Real-IP \$remote_addr; } # Fallback на приложение location / { proxy_pass http://localhost:3000/; proxy_set_header Host \$host; proxy_set_header X-Real-IP \$remote_addr; proxy_set_header X-Forwarded-For \$proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto \$scheme; } } EOF # Тестирование конфигурации echo "🧪 Тестирование nginx конфигурации..." nginx -t if [ $? -eq 0 ]; then echo "✅ Nginx конфигурация корректна" systemctl reload nginx else echo "❌ Ошибка в nginx конфигурации!" exit 1 fi # Создание директории для Let's Encrypt mkdir -p /var/www/html/.well-known/acme-challenge/ chown -R www-data:www-data /var/www/html/ # Получение SSL сертификата echo "" echo "=== 5. ПОЛУЧЕНИЕ SSL СЕРТИФИКАТА ===" echo "🔒 Получение Let's Encrypt сертификата для $DOMAIN..." # Остановка nginx для standalone режима systemctl stop nginx # Получение сертификата certbot certonly --standalone \ --non-interactive \ --agree-tos \ --email admin@$DOMAIN \ --domains $DOMAIN if [ $? -eq 0 ]; then echo "✅ SSL сертификат получен успешно" else echo "❌ Ошибка получения SSL сертификата!" systemctl start nginx exit 1 fi # Создание финальной HTTPS конфигурации echo "" echo "=== 6. НАСТРОЙКА HTTPS ===" echo "🔒 Создание HTTPS конфигурации..." cat > /etc/nginx/sites-available/default << EOF # HTTP -> HTTPS redirect server { listen 80; server_name $DOMAIN; # Let's Encrypt challenge location /.well-known/acme-challenge/ { root /var/www/html; } # Redirect all other traffic to HTTPS location / { return 301 https://\$server_name\$request_uri; } } # HTTPS server server { listen 443 ssl http2; server_name $DOMAIN; # SSL Configuration ssl_certificate /etc/letsencrypt/live/$DOMAIN/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/$DOMAIN/privkey.pem; # SSL Security ssl_protocols TLSv1.2 TLSv1.3; ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-SHA256:ECDHE-RSA-AES256-SHA384; ssl_prefer_server_ciphers off; ssl_session_cache shared:SSL:10m; ssl_session_timeout 10m; # Security headers add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always; add_header X-Frame-Options DENY always; add_header X-Content-Type-Options nosniff always; add_header X-XSS-Protection "1; mode=block" always; # Максимальный размер загружаемых файлов client_max_body_size 100M; # API проксирование location /api/ { proxy_pass http://localhost:3000/api/; proxy_set_header Host \$host; proxy_set_header X-Real-IP \$remote_addr; proxy_set_header X-Forwarded-For \$proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto https; proxy_connect_timeout 60s; proxy_send_timeout 60s; proxy_read_timeout 60s; proxy_buffering off; } # Health check location /health { proxy_pass http://localhost:3000/api/health; proxy_set_header Host \$host; proxy_set_header X-Real-IP \$remote_addr; proxy_set_header X-Forwarded-Proto https; } # WebSocket поддержка (если нужна) location /ws/ { proxy_pass http://localhost:3000/ws/; proxy_http_version 1.1; proxy_set_header Upgrade \$http_upgrade; proxy_set_header Connection "upgrade"; proxy_set_header Host \$host; proxy_set_header X-Real-IP \$remote_addr; proxy_set_header X-Forwarded-Proto https; } # Статические файлы (если есть web2-client) location / { try_files \$uri \$uri/ @app; } # Fallback на приложение location @app { proxy_pass http://localhost:3000/; proxy_set_header Host \$host; proxy_set_header X-Real-IP \$remote_addr; proxy_set_header X-Forwarded-For \$proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto https; } # Gzip сжатие gzip on; gzip_vary on; gzip_min_length 1024; gzip_types text/plain text/css text/xml text/javascript application/javascript application/xml+rss application/json; } EOF # Тестирование финальной конфигурации echo "🧪 Тестирование HTTPS конфигурации..." nginx -t if [ $? -eq 0 ]; then echo "✅ HTTPS конфигурация корректна" systemctl start nginx systemctl reload nginx else echo "❌ Ошибка в HTTPS конфигурации!" exit 1 fi # Настройка автообновления сертификата echo "" echo "=== 7. АВТООБНОВЛЕНИЕ СЕРТИФИКАТА ===" echo "🔄 Настройка автообновления SSL сертификата..." # Создание скрипта обновления cat > /etc/cron.d/certbot-renew << EOF # Автообновление Let's Encrypt сертификатов 0 12 * * * root certbot renew --quiet --nginx --post-hook "systemctl reload nginx" EOF echo "✅ Автообновление настроено" # Финальное тестирование echo "" echo "=== 8. ФИНАЛЬНОЕ ТЕСТИРОВАНИЕ ===" echo "🧪 Тестирование HTTPS соединения..." sleep 5 # Тест HTTPS if curl -s --max-time 10 https://$DOMAIN/health > /dev/null 2>&1; then echo "✅ HTTPS работает: https://$DOMAIN/health" else echo "⚠️ HTTPS может быть недоступен (проверьте DNS и файрвол)" fi # Тест API if curl -s --max-time 10 https://$DOMAIN/api/health > /dev/null 2>&1; then echo "✅ API работает: https://$DOMAIN/api/health" else echo "⚠️ API может быть недоступен" fi echo "" echo "==================================================" echo "🎉 НАСТРОЙКА ДОМЕНА И SSL ЗАВЕРШЕНА!" echo "==================================================" echo "" echo "🌐 ВАШ САЙТ ДОСТУПЕН ПО АДРЕСУ:" echo "https://$DOMAIN" echo "https://$DOMAIN/api/health" echo "" echo "🔒 SSL ИНФОРМАЦИЯ:" echo "Сертификат: /etc/letsencrypt/live/$DOMAIN/fullchain.pem" echo "Ключ: /etc/letsencrypt/live/$DOMAIN/privkey.pem" echo "Автообновление: настроено (ежедневно в 12:00)" echo "" echo "🛠️ УПРАВЛЕНИЕ:" echo "Проверка сертификата: certbot certificates" echo "Ручное обновление: certbot renew --nginx" echo "Тест обновления: certbot renew --dry-run" echo "" echo "🔍 ПРОВЕРКА СТАТУСА:" echo "curl -I https://$DOMAIN/health" echo "curl -I https://$DOMAIN/api/health" echo "" echo "✅ MY Network готов к работе по HTTPS!"