#!/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.memo-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.memo-cards.online; # SSL configuration - Let's Encrypt ssl_certificate /etc/letsencrypt/live/api.memo-cards.online/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/api.memo-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 HTTPS backend location / { proxy_pass https://localhost:8443; 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.memo-cards.online" ] && [ -f "/etc/letsencrypt/live/api.memo-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.memo-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.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 "🚀 Запускаем в 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.memo-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.memo-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"