This commit is contained in:
Dmitry 2025-11-23 00:34:29 +03:00
parent 56bad6624e
commit 43044d7c8b
2 changed files with 114 additions and 56 deletions

View file

@ -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

View file

@ -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