mnemo_cards/tools/deploy/backend-build_app.sh
2025-11-16 19:36:08 +03:00

98 lines
5.3 KiB
Bash
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

set -e -v
SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
PROJECT_ROOT="$(cd "$SCRIPT_DIR/../.." && pwd)"
BACKEND_DIR="$PROJECT_ROOT/mnemo_cards_backend"
cd $PROJECT_ROOT/mnemo_cards_common
git pull origin master
dart pub get
cd $PROJECT_ROOT/mnemo_cards_common_backend
git pull origin master
dart pub get
cd $BACKEND_DIR
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=$BACKEND_DIR/server.exe.*|ExecStart=$BACKEND_DIR/server.exe --dual --certs /etc/letsencrypt/live/api.memo-cards.online -a 0.0.0.0 -p 8081|' /etc/systemd/system/mnemo_cards_server.service
else
echo "⚠️ Let's Encrypt сертификаты не найдены или повреждены. Пытаемся создать..."
# Проверяем, занят ли порт 80
if sudo ss -tulpn | grep :80 > /dev/null 2>&1 || sudo lsof -i :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 ss -tulpn | grep :80 || sudo lsof -i :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..."
if sudo certbot certonly --standalone -d api.memo-cards.online --non-interactive --agree-tos --email admin@api.memo-cards.online; then
echo "✅ Let's Encrypt сертификат успешно создан!"
echo "🚀 Запускаем в двойном режиме (HTTP + HTTPS)"
# Обновляем systemd сервис для двойного режима
sudo sed -i 's|ExecStart=$BACKEND_DIR/server.exe.*|ExecStart=$BACKEND_DIR/server.exe --dual --certs /etc/letsencrypt/live/api.memo-cards.online -a 0.0.0.0 -p 8081|' /etc/systemd/system/mnemo_cards_server.service
else
echo "❌ Не удалось создать Let's Encrypt сертификат. Запускаем в HTTP режиме"
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=$BACKEND_DIR/server.exe.*|ExecStart=$BACKEND_DIR/server.exe -a 0.0.0.0 -p 8081|' /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
sudo systemctl start mnemo_cards_server
journalctl -u mnemo_cards_server --since "1min ago"