From b5f47855d13d24f3c415904f9eaf85fb770fb2fa Mon Sep 17 00:00:00 2001 From: Dmitry Date: Sun, 16 Nov 2025 17:53:15 +0300 Subject: [PATCH] f --- tools/deploy/backend-build_app.sh | 54 +++++++++++++++++++--- tools/deploy/backend-build_app_webroot.sh | 56 +++++++++++++++++++++++ 2 files changed, 103 insertions(+), 7 deletions(-) create mode 100755 tools/deploy/backend-build_app_webroot.sh diff --git a/tools/deploy/backend-build_app.sh b/tools/deploy/backend-build_app.sh index 63a43eb..42d7efc 100644 --- a/tools/deploy/backend-build_app.sh +++ b/tools/deploy/backend-build_app.sh @@ -19,15 +19,40 @@ sudo cp server_build.exe server.exe rm server_build.exe # Проверяем наличие Let's Encrypt сертификатов для двойного режима -if [ -d "/etc/letsencrypt/live/api.memo-cards.online" ]; then +if [ -d "/etc/letsencrypt/live/api.memo-cards.online" ] && [ -f "/etc/letsencrypt/live/api.memo-cards.online/fullchain.pem" ]; then echo "✅ Let's Encrypt сертификаты найдены. Запускаем в двойном режиме (HTTP + HTTPS)" # Обновляем systemd сервис для двойного режима sudo sed -i 's|ExecStart=/root/mnemo_cards_backend/server.exe.*|ExecStart=/root/mnemo_cards_backend/server.exe --dual --certs /etc/letsencrypt/live/api.memo-cards.online -a 0.0.0.0 -p 8080|' /etc/systemd/system/mnemo_cards_server.service else - echo "⚠️ Let's Encrypt сертификаты не найдены. Пытаемся создать..." + echo "⚠️ Let's Encrypt сертификаты не найдены или повреждены. Пытаемся создать..." - # Останавливаем сервер временно для получения сертификата + # Проверяем, занят ли порт 80 + if sudo netstat -tulpn | grep :80 > /dev/null 2>&1; then + 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 netstat -tulpn | grep :80 + echo "💡 Рекомендуется вручную остановить процесс, занимающий порт 80, или использовать webroot режим certbot" + fi + fi + + # Останавливаем наш сервер временно для получения сертификата sudo systemctl stop mnemo_cards_server 2>/dev/null || true + sleep 5 # Пытаемся получить Let's Encrypt сертификат echo "🔐 Получаем Let's Encrypt сертификат для домена api.memo-cards.online..." @@ -38,13 +63,28 @@ else sudo sed -i 's|ExecStart=/root/mnemo_cards_backend/server.exe.*|ExecStart=/root/mnemo_cards_backend/server.exe --dual --certs /etc/letsencrypt/live/api.memo-cards.online -a 0.0.0.0 -p 8080|' /etc/systemd/system/mnemo_cards_server.service else echo "❌ Не удалось создать Let's Encrypt сертификат. Запускаем в HTTP режиме" - echo "💡 Убедитесь, что:" - echo " - Домен api.memo-cards.online указывает на этот сервер" - echo " - Порт 80 доступен извне" - echo " - Firewall разрешает входящие соединения на порт 80" + echo "💡 Возможные причины и решения:" + echo " - Домен api.memo-cards.online не указывает на этот сервер" + echo " - Порт 80 недоступен извне (firewall, порт forwarding)" + echo " - Сертификат уже был получен ранее - проверьте /etc/letsencrypt/live/" + echo " - Используйте webroot режим если есть веб-сервер: certbot certonly --webroot -w /var/www/html -d api.memo-cards.online" # Возвращаем обычный режим sudo sed -i 's|ExecStart=/root/mnemo_cards_backend/server.exe.*|ExecStart=/root/mnemo_cards_backend/server.exe -a 0.0.0.0 -p 8080|' /etc/systemd/system/mnemo_cards_server.service fi + + # Возвращаем веб-сервера в исходное состояние + if [ "$NGINX_STOPPED" = true ]; then + echo "🔄 Возвращаем nginx..." + sudo systemctl start nginx + 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 sudo systemctl daemon-reload diff --git a/tools/deploy/backend-build_app_webroot.sh b/tools/deploy/backend-build_app_webroot.sh new file mode 100755 index 0000000..6544aa9 --- /dev/null +++ b/tools/deploy/backend-build_app_webroot.sh @@ -0,0 +1,56 @@ +#!/bin/bash +set -e -v + +cd ~/mnemo_cards_common +git pull origin master +dart pub get + +cd ~/mnemo_cards_common_backend +git pull origin master +dart pub get + +cd ~/mnemo_cards_backend +dart pub get && dart compile exe --verbose lib/main.dart -o server_build.exe + +sudo systemctl stop mnemo_cards_server && true +sleep 15 +sudo chmod 777 mnemo_cards_server.service +sudo cp mnemo_cards_server.service /etc/systemd/system +sudo cp server_build.exe server.exe +rm server_build.exe + +# Проверяем наличие Let's Encrypt сертификатов для двойного режима +if [ -d "/etc/letsencrypt/live/api.memo-cards.online" ] && [ -f "/etc/letsencrypt/live/api.memo-cards.online/fullchain.pem" ]; then + echo "✅ Let's Encrypt сертификаты найдены. Запускаем в двойном режиме (HTTP + HTTPS)" + # Обновляем systemd сервис для двойного режима + sudo sed -i 's|ExecStart=/root/mnemo_cards_backend/server.exe.*|ExecStart=/root/mnemo_cards_backend/server.exe --dual --certs /etc/letsencrypt/live/api.memo-cards.online -a 0.0.0.0 -p 8080|' /etc/systemd/system/mnemo_cards_server.service +else + echo "⚠️ Let's Encrypt сертификаты не найдены. Пытаемся создать с помощью webroot режима..." + + # Создаем временную директорию для webroot challenge + sudo mkdir -p /var/www/html/.well-known/acme-challenge + sudo chown -R www-data:www-data /var/www/html + + # Пытаемся получить Let's Encrypt сертификат через webroot + echo "🔐 Получаем Let's Encrypt сертификат через webroot для домена api.memo-cards.online..." + if sudo certbot certonly --webroot -w /var/www/html -d api.memo-cards.online --non-interactive --agree-tos --email admin@api.memo-cards.online; then + echo "✅ Let's Encrypt сертификат успешно создан через webroot!" + echo "🚀 Запускаем в двойном режиме (HTTP + HTTPS)" + # Обновляем systemd сервис для двойного режима + sudo sed -i 's|ExecStart=/root/mnemo_cards_backend/server.exe.*|ExecStart=/root/mnemo_cards_backend/server.exe --dual --certs /etc/letsencrypt/live/api.memo-cards.online -a 0.0.0.0 -p 8080|' /etc/systemd/system/mnemo_cards_server.service + else + echo "❌ Не удалось создать Let's Encrypt сертификат через webroot. Запускаем в HTTP режиме" + echo "💡 Убедитесь, что:" + echo " - У вас установлен и запущен веб-сервер (nginx/apache)" + echo " - Домен api.memo-cards.online указывает на этот сервер" + echo " - Директория /var/www/html доступна для записи certbot" + echo " - Firewall разрешает входящие соединения на порт 80" + echo " - Веб-сервер правильно настроен для обслуживания .well-known/acme-challenge/" + # Возвращаем обычный режим + sudo sed -i 's|ExecStart=/root/mnemo_cards_backend/server.exe.*|ExecStart=/root/mnemo_cards_backend/server.exe -a 0.0.0.0 -p 8080|' /etc/systemd/system/mnemo_cards_server.service + fi +fi + +sudo systemctl daemon-reload +sudo systemctl start mnemo_cards_server +journalctl -u mnemo_cards_server --since "1min ago"