From 7f7edb4775662cdc051f9ab4e06433ed2317aa9d Mon Sep 17 00:00:00 2001 From: Dmitry Date: Sun, 23 Nov 2025 03:06:49 +0300 Subject: [PATCH] deploy --- .forgejo/workflows/deploy.yaml | 214 ++++----------------------------- 1 file changed, 23 insertions(+), 191 deletions(-) diff --git a/.forgejo/workflows/deploy.yaml b/.forgejo/workflows/deploy.yaml index 992af95..5a849cb 100644 --- a/.forgejo/workflows/deploy.yaml +++ b/.forgejo/workflows/deploy.yaml @@ -47,67 +47,18 @@ jobs: mnemo_cards_backend \ ${{ secrets.SSH_USER }}@${{ secrets.SSH_HOST }}:~/ - - name: Obtain Certificates + - name: Ensure SSL Certificates run: | ssh -o ServerAliveInterval=60 -o ServerAliveCountMax=3 -o ConnectTimeout=30 -o StrictHostKeyChecking=no ${{ secrets.SSH_USER }}@${{ secrets.SSH_HOST }} << 'ENDSSH' set -e - echo "🔐 Checking Let's Encrypt certificates..." + echo "🔐 Ensuring SSL certificates are available..." - # Проверяем наличие 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 + echo "✅ SSL certificates are present and valid" 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 - echo "📝 Добавляем поддержку ACME challenge в nginx..." - # Создаем временную конфигурацию для ACME challenge - 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 - - # Получаем multi-domain сертификат через webroot - echo "🔐 Получаем Let's Encrypt multi-domain сертификат через webroot..." - if sudo certbot certonly --webroot \ - -w /var/www/html \ - -d mnemo-cards.online \ - -d api.mnemo-cards.online \ - -d code.mnemo-cards.online \ - -d vscode.mnemo-cards.online \ - --cert-name mnemo-cards.online \ - --non-interactive --agree-tos --email admin@mnemo-cards.online; then - echo "✅ Let's Encrypt multi-domain сертификат успешно получен через webroot!" - else - echo "⚠️ Не удалось получить сертификат через webroot. Продолжаем без HTTPS..." - fi + echo "⚠️ SSL certificates missing - they should be renewed automatically by cron" + echo "Manual certificate renewal can be done with:" + echo "sudo certbot renew" fi ENDSSH @@ -213,89 +164,14 @@ jobs: ./check-nginx.sh ENDSSH - - name: Ensure Nginx Running - run: | - ssh -o ServerAliveInterval=60 -o ServerAliveCountMax=3 -o ConnectTimeout=30 -o StrictHostKeyChecking=no ${{ secrets.SSH_USER }}@${{ secrets.SSH_HOST }} << 'ENDSSH' - set -e - echo "🔍 Проверяем статус nginx..." - if sudo systemctl is-active --quiet nginx; then - echo "✅ nginx уже запущен" - # Перезагружаем конфигурацию на всякий случай - if sudo nginx -t 2>/dev/null; then - sudo systemctl reload nginx - echo "✅ Конфигурация nginx перезагружена" - fi - else - 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 - 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: Setup SSH - run: | - mkdir -p ~/.ssh - echo "${{ secrets.SSH_KEY }}" > ~/.ssh/id_rsa - chmod 600 ~/.ssh/id_rsa - ssh-keyscan -H ${{ secrets.SSH_HOST }} >> ~/.ssh/known_hosts - - - name: Check Nginx Status - run: | - ssh -o ServerAliveInterval=60 -o ServerAliveCountMax=3 -o ConnectTimeout=30 -o StrictHostKeyChecking=no ${{ 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 deploy-web: name: Deploy Web App runs-on: ubuntu-latest container: ghcr.io/cirruslabs/flutter:3.35.5 - needs: ensure-nginx-running - if: always() && needs.ensure-nginx-running.result == 'success' + needs: deploy-backend + if: always() && needs.deploy-backend.result == 'success' steps: - name: Install System Dependencies run: | @@ -328,29 +204,6 @@ jobs: git config --global http.maxRequestBuffer 100M git config --global core.compression 0 - - name: Check Nginx Before Web Deploy - run: | - echo "🔍 Проверяем статус nginx перед деплоем web..." - ssh -o ServerAliveInterval=60 -o ServerAliveCountMax=3 -o ConnectTimeout=30 -o StrictHostKeyChecking=no ${{ secrets.SSH_USER }}@${{ secrets.SSH_HOST }} << 'ENDSSH' - set -e - if sudo systemctl is-active --quiet nginx; then - echo "✅ nginx работает перед web деплоем" - # Тестируем доступность - if curl -I --max-time 5 https://mnemo-cards.online/ 2>/dev/null | grep -q "200\|301\|302"; then - echo "✅ mnemo-cards.online доступен" - else - echo "⚠️ mnemo-cards.online недоступен" - fi - if curl -I --max-time 5 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 - else - echo "❌ nginx не работает перед web деплоем!" - exit 1 - fi - ENDSSH - name: Build Web App working-directory: mnemo_cards_web_v2 @@ -373,52 +226,31 @@ jobs: ${{ secrets.SSH_USER }}@${{ secrets.SSH_HOST }}:/var/www/mnemo_cards/ || (echo "❌ Rsync failed" && exit 1) echo "✅ Веб-приложение скопировано" - - name: Fix Permissions and Verify + - name: Fix Permissions and Reload Nginx run: | ssh -o ServerAliveInterval=60 -o ServerAliveCountMax=3 -o ConnectTimeout=30 -o StrictHostKeyChecking=no ${{ secrets.SSH_USER }}@${{ secrets.SSH_HOST }} << 'ENDSSH' set -e - echo "🔧 Исправляем права доступа..." + echo "🔧 Setting correct permissions for web files..." chown -R www-data:www-data /var/www/mnemo_cards chmod -R 755 /var/www/mnemo_cards - echo "✅ Права исправлены" + echo "✅ Permissions fixed" - echo "🔍 Проверяем nginx после деплоя web..." - if sudo systemctl is-active --quiet nginx; then - echo "✅ nginx работает" - # Перезагружаем nginx для применения новых файлов - echo "🔄 Перезагружаем nginx..." - if sudo nginx -t 2>/dev/null; then - sudo systemctl reload nginx - echo "✅ nginx перезагружен" - sleep 2 + echo "🔄 Reloading nginx to serve new web app..." + if sudo nginx -t 2>/dev/null; then + sudo systemctl reload nginx + echo "✅ nginx reloaded successfully" + sleep 2 - # Тестируем доступность - if curl -I --max-time 10 https://mnemo-cards.online/ 2>/dev/null | grep -q "200\|301\|302"; then - echo "✅ mnemo-cards.online доступен" - else - echo "⚠️ mnemo-cards.online недоступен" - fi - 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 + # Quick verification + if curl -I --max-time 5 https://mnemo-cards.online/ 2>/dev/null | grep -q "200\|301\|302"; then + echo "✅ mnemo-cards.online is serving correctly" else - echo "❌ Ошибка в конфигурации nginx!" - sudo nginx -t || true - exit 1 + echo "⚠️ mnemo-cards.online verification failed" 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 + echo "❌ nginx configuration test failed!" + sudo nginx -t || true + exit 1 fi ENDSSH