mnemo_cards/tools/deploy/backend-build_app_webroot.sh
2025-11-20 21:41:09 +03:00

111 lines
5 KiB
Bash
Executable file
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.

#!/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
# Создаем новую nginx конфигурацию для HTTPS-only режима API
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
ssl_certificate /etc/letsencrypt/live/api.mnemo-cards.online/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/api.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;
# Proxy to HTTP backend (SSL termination in nginx)
location / {
proxy_pass http://localhost:8081;
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
# Проверяем наличие Let's Encrypt сертификатов для HTTPS-only режима
if [ -d "/etc/letsencrypt/live/api.mnemo-cards.online" ] && [ -f "/etc/letsencrypt/live/api.mnemo-cards.online/fullchain.pem" ]; then
echo "✅ Let's Encrypt сертификаты найдены. Запускаем в HTTPS-only режиме"
# Обновляем systemd сервис для HTTPS-only режима
sudo sed -i 's|ExecStart=/root/mnemo_cards_backend/server.exe.*|ExecStart=/root/mnemo_cards_backend/server.exe --certs /etc/letsencrypt/live/api.mnemo-cards.online -a 0.0.0.0 -p 8443|' /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.mnemo-cards.online..."
if sudo certbot certonly --webroot -w /var/www/html -d api.mnemo-cards.online --non-interactive --agree-tos --email admin@api.mnemo-cards.online; then
echo "✅ Let's Encrypt сертификат успешно создан через webroot!"
echo "🚀 Запускаем в HTTPS-only режиме"
# Обновляем systemd сервис для HTTPS-only режима
sudo sed -i 's|ExecStart=/root/mnemo_cards_backend/server.exe.*|ExecStart=/root/mnemo_cards_backend/server.exe --certs /etc/letsencrypt/live/api.mnemo-cards.online -a 0.0.0.0 -p 8443|' /etc/systemd/system/mnemo_cards_server.service
else
echo "❌ Не удалось создать Let's Encrypt сертификат через webroot"
echo "💡 Убедитесь, что:"
echo " - У вас установлен и запущен веб-сервер (nginx/apache)"
echo " - Домен api.mnemo-cards.online указывает на этот сервер"
echo " - Директория /var/www/html доступна для записи certbot"
echo " - Firewall разрешает входящие соединения на порт 80"
echo " - Веб-сервер правильно настроен для обслуживания .well-known/acme-challenge/"
exit 1
fi
fi
sudo systemctl daemon-reload
sudo systemctl start mnemo_cards_server
journalctl -u mnemo_cards_server --since "1min ago"