#!/bin/bash # Настройка SSL для конкретного домена my-public-node-3.projscale.dev set -e DOMAIN="my-public-node-3.projscale.dev" echo "🔒 НАСТРОЙКА SSL ДЛЯ $DOMAIN" # Проверка что приложение работает echo "" echo "=== 1. ПРОВЕРКА ПРИЛОЖЕНИЯ ===" if timeout 5 curl -s http://localhost:3000/api/health > /dev/null 2>&1; then echo "✅ Приложение работает на порту 3000" else echo "❌ Приложение НЕ работает на порту 3000!" echo "Сначала исправьте приложение:" echo "docker-compose -f deployment/docker-compose.production.yml restart app" exit 1 fi # Создание конфигурации для домена (без SSL) echo "" echo "=== 2. НАСТРОЙКА NGINX ДЛЯ ДОМЕНА ===" sudo tee /etc/nginx/sites-available/default > /dev/null << 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; } location /api/ { proxy_pass http://127.0.0.1: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; } location /health { proxy_pass http://127.0.0.1:3000/api/health; proxy_set_header Host \$host; proxy_set_header X-Real-IP \$remote_addr; } location / { proxy_pass http://127.0.0.1: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 # Тестирование и перезагрузка nginx echo "🧪 Тестирование nginx..." if sudo nginx -t; then sudo systemctl reload nginx echo "✅ Nginx перезагружен" else echo "❌ Ошибка nginx!" exit 1 fi # Создание директории для Let's Encrypt sudo mkdir -p /var/www/html/.well-known/acme-challenge/ sudo chown -R www-data:www-data /var/www/html/ # Получение SSL сертификата echo "" echo "=== 3. ПОЛУЧЕНИЕ SSL СЕРТИФИКАТА ===" echo "🔒 Получение сертификата для $DOMAIN..." if sudo certbot certonly --webroot \ -w /var/www/html \ --non-interactive \ --agree-tos \ --email admin@$DOMAIN \ --domains $DOMAIN; then echo "✅ SSL сертификат получен!" else echo "❌ Ошибка получения SSL!" echo "Проверьте что домен $DOMAIN направлен на этот сервер" exit 1 fi # Создание HTTPS конфигурации echo "" echo "=== 4. НАСТРОЙКА HTTPS ===" sudo tee /etc/nginx/sites-available/default > /dev/null << EOF # HTTP -> HTTPS redirect server { listen 80; server_name $DOMAIN; location /.well-known/acme-challenge/ { root /var/www/html; } 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_prefer_server_ciphers off; ssl_session_cache shared:SSL: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; client_max_body_size 100M; location /api/ { proxy_pass http://127.0.0.1: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; } location /health { proxy_pass http://127.0.0.1:3000/api/health; proxy_set_header Host \$host; proxy_set_header X-Real-IP \$remote_addr; proxy_set_header X-Forwarded-Proto https; } location / { proxy_pass http://127.0.0.1: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; } } EOF # Финальное тестирование echo "🧪 Финальное тестирование nginx..." if sudo nginx -t; then sudo systemctl reload nginx echo "✅ HTTPS настроен!" else echo "❌ Ошибка HTTPS конфигурации!" exit 1 fi # Настройка автообновления echo "" echo "=== 5. АВТООБНОВЛЕНИЕ ===" sudo tee /etc/cron.d/certbot-renew > /dev/null << EOF 0 12 * * * root certbot renew --quiet --nginx --post-hook "systemctl reload nginx" EOF echo "✅ Автообновление настроено" # Тестирование echo "" echo "=== 6. ФИНАЛЬНОЕ ТЕСТИРОВАНИЕ ===" sleep 5 echo "🧪 Тестирование HTTPS..." if timeout 10 curl -s https://$DOMAIN/health > /dev/null 2>&1; then echo "✅ HTTPS работает: https://$DOMAIN/health" else echo "⚠️ HTTPS может быть недоступен (подождите несколько минут)" fi if timeout 10 curl -s https://$DOMAIN/api/health > /dev/null 2>&1; then echo "✅ API работает: https://$DOMAIN/api/health" else echo "⚠️ API может быть недоступен" fi echo "" echo "🎉 SSL НАСТРОЕН ДЛЯ $DOMAIN!" echo "" echo "🌐 Ваш сайт:" echo "https://$DOMAIN" echo "https://$DOMAIN/api/health"