mnemo_cards/tools/deploy/backend-build_app.sh

163 lines
7.5 KiB
Bash
Raw Normal View History

2025-11-16 11:25:27 +00:00
set -e -v
2025-11-16 14:37:24 +00:00
SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
2025-11-16 14:38:35 +00:00
PROJECT_ROOT="$(cd "$SCRIPT_DIR/../.." && pwd)"
2025-11-16 16:05:20 +00:00
BACKEND_DIR="$PROJECT_ROOT/mnemo_cards_backend"
2025-11-16 14:37:24 +00:00
cd $PROJECT_ROOT/mnemo_cards_common
2025-11-16 11:25:27 +00:00
git pull origin master
dart pub get
2025-11-16 14:37:24 +00:00
cd $PROJECT_ROOT/mnemo_cards_common_backend
2025-11-16 11:25:27 +00:00
git pull origin master
dart pub get
2025-11-16 16:05:20 +00:00
cd $BACKEND_DIR
2025-11-16 11:25:27 +00:00
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
2025-11-16 18:39:39 +00:00
# Проверяем наличие Let's Encrypt сертификатов для HTTPS-only режима
# Используем общий multi-domain сертификат mnemo-cards.online
if [ -d "/etc/letsencrypt/live/mnemo-cards.online" ] && [ -f "/etc/letsencrypt/live/mnemo-cards.online/fullchain.pem" ]; then
echo "✅ Let's Encrypt multi-domain сертификаты найдены. Запускаем в HTTPS-only режиме"
# Обновляем systemd сервис для HTTPS-only режима
2025-11-19 19:59:53 +00:00
sudo sed -i 's|ExecStart=$BACKEND_DIR/server.exe.*|ExecStart=$BACKEND_DIR/server.exe --certs /etc/letsencrypt/live/mnemo-cards.online -a 0.0.0.0 -p 8081|' /etc/systemd/system/mnemo_cards_server.service
2025-11-16 11:25:27 +00:00
else
2025-11-16 14:53:15 +00:00
echo "⚠️ Let's Encrypt сертификаты не найдены или повреждены. Пытаемся создать..."
2025-11-16 12:15:21 +00:00
2025-11-16 14:53:15 +00:00
# Проверяем, занят ли порт 80
2025-11-16 16:36:08 +00:00
if sudo ss -tulpn | grep :80 > /dev/null 2>&1 || sudo lsof -i :80 > /dev/null 2>&1; then
2025-11-16 14:53:15 +00:00
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 занят неизвестным процессом:"
2025-11-16 16:36:08 +00:00
sudo ss -tulpn | grep :80 || sudo lsof -i :80
2025-11-16 14:53:15 +00:00
echo "💡 Рекомендуется вручную остановить процесс, занимающий порт 80, или использовать webroot режим certbot"
fi
fi
# Останавливаем наш сервер временно для получения сертификата
2025-11-16 11:25:27 +00:00
sudo systemctl stop mnemo_cards_server 2>/dev/null || true
2025-11-16 14:53:15 +00:00
sleep 5
2025-11-16 12:15:21 +00:00
2025-11-16 18:39:39 +00:00
# Пытаемся получить Let's Encrypt multi-domain сертификат
echo "🔐 Получаем Let's Encrypt multi-domain сертификат..."
if sudo certbot certonly --standalone \
-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 сертификат успешно создан!"
echo "🚀 Запускаем в HTTPS-only режиме"
# Обновляем systemd сервис для HTTPS-only режима (используем общий сертификат)
2025-11-19 19:59:53 +00:00
sudo sed -i 's|ExecStart=$BACKEND_DIR/server.exe.*|ExecStart=$BACKEND_DIR/server.exe --certs /etc/letsencrypt/live/mnemo-cards.online -a 0.0.0.0 -p 8081|' /etc/systemd/system/mnemo_cards_server.service
2025-11-16 11:25:27 +00:00
else
echo "❌ Не удалось создать Let's Encrypt сертификат. Запускаем в HTTP режиме"
2025-11-16 14:53:15 +00:00
echo "💡 Возможные причины и решения:"
2025-11-16 18:39:39 +00:00
echo " - Домен mnemo-cards.online не указывает на этот сервер"
2025-11-16 14:53:15 +00:00
echo " - Порт 80 недоступен извне (firewall, порт forwarding)"
echo " - Сертификат уже был получен ранее - проверьте /etc/letsencrypt/live/"
2025-11-16 18:39:39 +00:00
echo " - Используйте webroot режим если есть веб-сервер: certbot certonly --webroot -w /var/www/html -d mnemo-cards.online"
2025-11-16 11:25:27 +00:00
# Возвращаем обычный режим
2025-11-16 16:36:08 +00:00
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
2025-11-16 11:25:27 +00:00
fi
2025-11-16 14:53:15 +00:00
# Возвращаем веб-сервера в исходное состояние
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
2025-11-16 11:25:27 +00:00
fi
2025-11-16 18:39:39 +00:00
# Создаем новую nginx конфигурацию для HTTPS-only режима API
# Используем общий multi-domain сертификат mnemo-cards.online
cat > /tmp/api-https-only << 'EOF'
server {
listen 80;
server_name api.mnemo-cards.online;
# Serve ACME challenge for Let's Encrypt
location /.well-known/acme-challenge/ {
root /var/www/html;
try_files $uri =404;
}
# Redirect all other HTTP traffic to HTTPS
location / {
return 301 https://$server_name$request_uri;
}
}
server {
listen 443 ssl http2;
server_name api.mnemo-cards.online;
# SSL configuration - Let's Encrypt (multi-domain certificate)
ssl_certificate /etc/letsencrypt/live/mnemo-cards.online/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/mnemo-cards.online/privkey.pem;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-RSA-AES256-GCM-SHA512:DHE-RSA-AES256-GCM-SHA512:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-GCM-SHA384;
ssl_prefer_server_ciphers off;
# Security headers
add_header X-Frame-Options "SAMEORIGIN" always;
add_header X-XSS-Protection "1; mode=block" always;
add_header X-Content-Type-Options "nosniff" always;
add_header Referrer-Policy "no-referrer-when-downgrade" always;
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
2025-11-20 18:41:09 +00:00
# Proxy to HTTP backend (SSL termination in nginx)
2025-11-16 18:39:39 +00:00
location / {
2025-11-20 18:41:09 +00:00
proxy_pass http://localhost:8081;
2025-11-16 18:39:39 +00:00
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
# Timeout settings
proxy_connect_timeout 60s;
proxy_send_timeout 60s;
proxy_read_timeout 60s;
}
}
EOF
# Заменяем старую конфигурацию API на новую
sudo cp /tmp/api-https-only /etc/nginx/sites-available/api
sudo nginx -t && sudo systemctl reload nginx
2025-11-16 11:25:27 +00:00
sudo systemctl daemon-reload
sudo systemctl start mnemo_cards_server
journalctl -u mnemo_cards_server --since "1min ago"