webroot
This commit is contained in:
parent
56bad6624e
commit
43044d7c8b
2 changed files with 114 additions and 56 deletions
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
Loading…
Reference in a new issue