From 4ec12873bd30fad94efd09634e313333459f8e3e Mon Sep 17 00:00:00 2001 From: user Date: Sat, 5 Jul 2025 20:42:58 +0300 Subject: [PATCH] =?UTF-8?q?=D0=B9=D0=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- check_app_status.sh | 76 +++++++++++++++ setup_ssl_for_domain.sh | 204 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 280 insertions(+) create mode 100644 check_app_status.sh create mode 100644 setup_ssl_for_domain.sh diff --git a/check_app_status.sh b/check_app_status.sh new file mode 100644 index 0000000..b603a68 --- /dev/null +++ b/check_app_status.sh @@ -0,0 +1,76 @@ +#!/bin/bash + +# Проверка статуса приложения и настройка домена +echo "🔍 ДИАГНОСТИКА ПРИЛОЖЕНИЯ И ДОМЕНА" + +DOMAIN="my-public-node-3.projscale.dev" + +echo "" +echo "=== 1. СТАТУС КОНТЕЙНЕРОВ ===" +docker ps --format "table {{.Names}}\t{{.Status}}\t{{.Ports}}" + +echo "" +echo "=== 2. ПРОВЕРКА ПОРТОВ ПРИЛОЖЕНИЯ ===" +for port in 3000 5000; do + if timeout 5 curl -s http://localhost:$port/api/health > /dev/null 2>&1; then + echo "✅ Port $port: РАБОТАЕТ" + else + echo "❌ Port $port: НЕ РАБОТАЕТ" + fi +done + +echo "" +echo "=== 3. ЛОГИ ПРИЛОЖЕНИЯ ===" +APP_CONTAINER=$(docker ps --format "{{.Names}}" | grep -E "(app|uploader)" | head -1) +if [ -n "$APP_CONTAINER" ]; then + echo "📄 Логи $APP_CONTAINER (последние 10 строк):" + docker logs --tail=10 "$APP_CONTAINER" 2>&1 +else + echo "❌ Контейнер приложения не найден" +fi + +echo "" +echo "=== 4. ПРОВЕРКА NGINX ДЛЯ ДОМЕНА ===" +echo "🌐 Домен: $DOMAIN" + +# Проверка текущей конфигурации nginx +echo "Текущая конфигурация server_name:" +sudo grep -E "server_name|listen" /etc/nginx/sites-enabled/default + +echo "" +echo "=== 5. ТЕСТ СОЕДИНЕНИЯ ПО ДОМЕНУ ===" + +# HTTP тест +if timeout 10 curl -I http://$DOMAIN/health 2>/dev/null | head -1; then + echo "✅ HTTP работает" +else + echo "❌ HTTP не работает" +fi + +# HTTPS тест +if timeout 10 curl -k -I https://$DOMAIN/health 2>/dev/null | head -1; then + echo "✅ HTTPS работает" +else + echo "❌ HTTPS не работает (SSL не настроен)" +fi + +echo "" +echo "=== 6. РЕКОМЕНДАЦИИ ===" + +# Проверка что приложение работает +LOCAL_WORKS=$(curl -s --max-time 5 http://localhost:3000/api/health > /dev/null 2>&1 && echo "yes" || echo "no") + +if [ "$LOCAL_WORKS" = "yes" ]; then + echo "✅ Приложение работает локально" + echo "🔧 Нужно настроить SSL для домена $DOMAIN" + echo "" + echo "Выполните:" + echo "sudo ./setup_ssl_for_domain.sh" +else + echo "❌ Приложение не работает локально" + echo "🔧 Сначала нужно исправить приложение" + echo "" + echo "Выполните:" + echo "docker-compose -f deployment/docker-compose.production.yml restart app" + echo "docker logs \$(docker ps --format \"{{.Names}}\" | grep app | head -1)" +fi \ No newline at end of file diff --git a/setup_ssl_for_domain.sh b/setup_ssl_for_domain.sh new file mode 100644 index 0000000..23df3b0 --- /dev/null +++ b/setup_ssl_for_domain.sh @@ -0,0 +1,204 @@ +#!/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" \ No newline at end of file