diff --git a/.forgejo/workflows/deploy.yaml b/.forgejo/workflows/deploy.yaml index 896c4ad..bae0362 100644 --- a/.forgejo/workflows/deploy.yaml +++ b/.forgejo/workflows/deploy.yaml @@ -52,23 +52,38 @@ jobs: ssh ${{ secrets.SSH_USER }}@${{ secrets.SSH_HOST }} << 'ENDSSH' set -e echo "🔐 Checking Let's Encrypt certificates..." - + # Проверяем наличие multi-domain сертификата if [ -d "/etc/letsencrypt/live/mnemo-cards.online" ] && [ -f "/etc/letsencrypt/live/mnemo-cards.online/fullchain.pem" ]; then echo "✅ Let's Encrypt multi-domain сертификаты уже существуют" + # Проверяем что nginx работает + if ! sudo systemctl is-active --quiet nginx; then + echo "🚨 nginx не работает! Запускаем..." + sudo systemctl start nginx + sleep 2 + if ! sudo systemctl is-active --quiet nginx; then + echo "❌ Критическая ошибка: не удалось запустить nginx!" + exit 1 + fi + fi else echo "⚠️ Сертификаты не найдены. Пытаемся получить через webroot (nginx продолжает работать)..." - + # Убеждаемся, что nginx запущен if ! sudo systemctl is-active --quiet nginx; then echo "🚀 Запускаем nginx для webroot режима..." sudo systemctl start nginx + sleep 2 + if ! sudo systemctl is-active --quiet nginx; then + echo "❌ Критическая ошибка: не удалось запустить nginx для получения сертификатов!" + exit 1 + fi fi - + # Создаем директорию для webroot challenge sudo mkdir -p /var/www/html/.well-known/acme-challenge sudo chown -R www-data:www-data /var/www/html - + # Убеждаемся, что nginx может обслуживать ACME challenge # Проверяем, есть ли конфигурация для /.well-known if ! grep -q "\.well-known" /etc/nginx/sites-enabled/* 2>/dev/null; then @@ -78,7 +93,7 @@ jobs: sudo ln -sf /etc/nginx/sites-available/acme-challenge /etc/nginx/sites-enabled/acme-challenge sudo nginx -t && sudo systemctl reload nginx fi - + # Получаем multi-domain сертификат через webroot echo "🔐 Получаем Let's Encrypt multi-domain сертификат через webroot..." if sudo certbot certonly --webroot \ @@ -118,8 +133,24 @@ jobs: run: | ssh ${{ secrets.SSH_USER }}@${{ secrets.SSH_HOST }} << 'ENDSSH' set -e - echo "🛑 Stopping service..." + echo "🛑 Stopping backend service..." sudo systemctl stop mnemo_cards_server || true + echo "✅ Backend service stopped" + echo "🔍 Checking nginx status after stopping backend..." + if sudo systemctl is-active --quiet nginx; then + echo "✅ nginx still running" + else + echo "🚨 nginx also stopped! This is the problem!" + echo "🚀 Starting nginx..." + sudo systemctl start nginx + sleep 2 + if sudo systemctl is-active --quiet nginx; then + echo "✅ nginx restarted" + else + echo "❌ Failed to restart nginx!" + exit 1 + fi + fi ENDSSH - name: Update Service Configuration @@ -193,10 +224,50 @@ jobs: else echo "❌ Ошибка: не удалось запустить nginx!" sudo systemctl status nginx --no-pager || true + exit 1 fi else echo "❌ Ошибка в конфигурации nginx!" sudo nginx -t || true + exit 1 + fi + fi + ENDSSH + + ensure-nginx-running: + name: Ensure Nginx Running After Backend + runs-on: ubuntu-latest + needs: deploy-backend + if: always() && needs.deploy-backend.result == 'success' + steps: + - name: Check Nginx Status + run: | + ssh ${{ secrets.SSH_USER }}@${{ secrets.SSH_HOST }} << 'ENDSSH' + set -e + echo "🔍 Проверяем статус nginx после деплоя backend..." + if sudo systemctl is-active --quiet nginx; then + echo "✅ nginx запущен" + # Тестируем доступность сайтов + if curl -I --max-time 10 https://code.mnemo-cards.online/ 2>/dev/null | grep -q "200\|301\|302"; then + echo "✅ code.mnemo-cards.online доступен" + else + echo "⚠️ code.mnemo-cards.online недоступен" + fi + if curl -I --max-time 10 https://vscode.mnemo-cards.online/ 2>/dev/null | grep -q "200\|301\|302"; then + echo "✅ vscode.mnemo-cards.online доступен" + else + echo "⚠️ vscode.mnemo-cards.online недоступен" + fi + else + echo "❌ nginx не запущен! Запускаем..." + sudo systemctl start nginx + sleep 2 + if sudo systemctl is-active --quiet nginx; then + echo "✅ nginx запущен" + else + echo "❌ Не удалось запустить nginx!" + sudo systemctl status nginx --no-pager || true + exit 1 fi fi ENDSSH @@ -205,7 +276,7 @@ jobs: name: Deploy Web App runs-on: ubuntu-latest container: ghcr.io/cirruslabs/flutter:3.35.5 - needs: deploy-backend + needs: ensure-nginx-running if: always() steps: - name: Setup Node.js diff --git a/tools/deploy/backend-build_app.sh b/tools/deploy/backend-build_app.sh index 49131ed..11ae21e 100644 --- a/tools/deploy/backend-build_app.sh +++ b/tools/deploy/backend-build_app.sh @@ -38,26 +38,40 @@ else # Проверяем, занят ли порт 80 if sudo ss -tulpn | grep :80 > /dev/null 2>&1 || sudo lsof -i :80 > /dev/null 2>&1; then - echo "🔍 Порт 80 занят другим процессом. Проверяем возможные веб-сервера..." + echo "🔍 Порт 80 занят другим процессом." - # Пытаемся остановить распространенные веб-сервера - if sudo systemctl is-active --quiet nginx; then - echo "🛑 Останавливаем nginx для получения сертификата..." - sudo systemctl stop nginx - NGINX_STOPPED=true - elif sudo systemctl is-active --quiet apache2; then - echo "🛑 Останавливаем apache2 для получения сертификата..." - sudo systemctl stop apache2 - APACHE_STOPPED=true - elif sudo systemctl is-active --quiet httpd; then - echo "🛑 Останавливаем httpd для получения сертификата..." - sudo systemctl stop httpd - HTTPD_STOPPED=true - else - echo "❓ Порт 80 занят неизвестным процессом:" - sudo ss -tulpn | grep :80 || sudo lsof -i :80 - echo "💡 Рекомендуется вручную остановить процесс, занимающий порт 80, или использовать webroot режим certbot" + # ВНИМАНИЕ: В ПРОДАКШЕНЕ НЕ ОСТАНАВЛИВАЕМ NGINX! + # Используем webroot режим вместо standalone + echo "💡 Используем webroot режим для получения сертификатов (nginx продолжает работать)" + + # Убеждаемся, что nginx запущен + if ! sudo systemctl is-active --quiet nginx; then + echo "🚀 Запускаем nginx для webroot режима..." + sudo systemctl start nginx + sleep 2 + if ! sudo systemctl is-active --quiet nginx; then + echo "❌ Критическая ошибка: не удалось запустить nginx!" + exit 1 + fi fi + + # Создаем директорию для webroot challenge + sudo mkdir -p /var/www/html/.well-known/acme-challenge + sudo chown -R www-data:www-data /var/www/html + + # Проверяем, есть ли конфигурация для /.well-known + if ! grep -q "\.well-known" /etc/nginx/sites-enabled/* 2>/dev/null; then + echo "📝 Добавляем поддержку ACME challenge в nginx..." + sudo printf 'server {\n listen 80;\n server_name _;\n location /.well-known/acme-challenge/ {\n root /var/www/html;\n try_files $uri =404;\n }\n location / {\n return 404;\n }\n}\n' > /etc/nginx/sites-available/acme-challenge + sudo ln -sf /etc/nginx/sites-available/acme-challenge /etc/nginx/sites-enabled/acme-challenge + sudo nginx -t && sudo systemctl reload nginx + fi + + # Изменяем команду certbot на webroot режим + CERTBOT_WEBROOT=true + else + echo "✅ Порт 80 свободен" + CERTBOT_WEBROOT=false fi # Останавливаем наш сервер временно для получения сертификата @@ -90,39 +104,12 @@ else sudo sed -i 's|ExecStart=$BACKEND_DIR/server.exe.*|ExecStart=$BACKEND_DIR/server.exe -a 0.0.0.0 -p 8081|' /etc/systemd/system/mnemo_cards_server.service fi - # ВАЖНО: Возвращаем веб-сервера СРАЗУ после получения сертификата, - # чтобы сайты были доступны во время остальной части деплоя - echo "🔄 Немедленно возвращаем веб-сервера в работу..." - if [ "$NGINX_STOPPED" = true ]; then - echo "🔄 Запускаем nginx..." - if sudo nginx -t 2>/dev/null; then - sudo systemctl start nginx - sleep 2 - if sudo systemctl is-active --quiet nginx; then - echo "✅ nginx успешно запущен" - else - echo "❌ Ошибка: не удалось запустить nginx!" - sudo systemctl status nginx --no-pager || true - fi - else - echo "⚠️ Ошибка в конфигурации nginx, но пытаемся запустить..." - sudo systemctl start nginx || true - fi - fi - if [ "$APACHE_STOPPED" = true ]; then - echo "🔄 Возвращаем apache2..." - sudo systemctl start apache2 - fi - if [ "$HTTPD_STOPPED" = true ]; then - echo "🔄 Возвращаем httpd..." - sudo systemctl start httpd - fi fi -# Инициализируем переменные, если они не были установлены -NGINX_STOPPED=${NGINX_STOPPED:-false} -APACHE_STOPPED=${APACHE_STOPPED:-false} -HTTPD_STOPPED=${HTTPD_STOPPED:-false} +# Переменные для отслеживания состояния (теперь не используются) +# NGINX_STOPPED=false +# APACHE_STOPPED=false +# HTTPD_STOPPED=false # Создаем новую nginx конфигурацию для HTTPS-only режима API # Используем общий multi-domain сертификат mnemo-cards.online