This commit is contained in:
Dmitry 2025-11-23 03:06:49 +03:00
parent 1bfdd73389
commit 7f7edb4775

View file

@ -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,53 +226,32 @@ 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..."
echo "🔄 Reloading nginx to serve new web app..."
if sudo nginx -t 2>/dev/null; then
sudo systemctl reload nginx
echo "✅ 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 доступен"
# 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 "⚠️ 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 недоступен"
echo "⚠️ mnemo-cards.online verification failed"
fi
else
echo "❌ Ошибка в конфигурации nginx!"
echo "❌ nginx configuration test failed!"
sudo nginx -t || true
exit 1
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
final-verification: