2025-11-16 14:53:15 +00:00
|
|
|
|
#!/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
|
|
|
|
|
|
|
2025-11-16 18:39:39 +00:00
|
|
|
|
# Создаем новую nginx конфигурацию для HTTPS-only режима API
|
|
|
|
|
|
cat > /tmp/api-https-only << 'EOF'
|
|
|
|
|
|
server {
|
|
|
|
|
|
listen 80;
|
2025-11-19 20:10:22 +00:00
|
|
|
|
server_name api.mnemo-cards.online;
|
2025-11-16 18:39:39 +00:00
|
|
|
|
|
|
|
|
|
|
# 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;
|
2025-11-19 20:10:22 +00:00
|
|
|
|
server_name api.mnemo-cards.online;
|
2025-11-16 18:39:39 +00:00
|
|
|
|
|
|
|
|
|
|
# SSL configuration - Let's Encrypt
|
2025-11-19 20:10:22 +00:00
|
|
|
|
ssl_certificate /etc/letsencrypt/live/api.mnemo-cards.online/fullchain.pem;
|
|
|
|
|
|
ssl_certificate_key /etc/letsencrypt/live/api.mnemo-cards.online/privkey.pem;
|
2025-11-16 18:39:39 +00:00
|
|
|
|
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-27 19:45:45 +00:00
|
|
|
|
# CORS headers are handled by the backend server, nginx only proxies
|
2025-11-27 19:05:36 +00:00
|
|
|
|
|
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-22 20:05:29 +00:00
|
|
|
|
proxy_pass http://127.0.0.1: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
|
|
|
|
|
|
|
|
|
|
|
|
# Проверяем наличие Let's Encrypt сертификатов для HTTPS-only режима
|
2025-11-19 20:10:22 +00:00
|
|
|
|
if [ -d "/etc/letsencrypt/live/api.mnemo-cards.online" ] && [ -f "/etc/letsencrypt/live/api.mnemo-cards.online/fullchain.pem" ]; then
|
2025-11-16 18:39:39 +00:00
|
|
|
|
echo "✅ Let's Encrypt сертификаты найдены. Запускаем в HTTPS-only режиме"
|
|
|
|
|
|
# Обновляем systemd сервис для HTTPS-only режима
|
2025-11-19 20:10:22 +00:00
|
|
|
|
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
|
2025-11-16 14:53:15 +00:00
|
|
|
|
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
|
2025-11-19 22:41:54 +00:00
|
|
|
|
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
|
2025-11-16 14:53:15 +00:00
|
|
|
|
echo "✅ Let's Encrypt сертификат успешно создан через webroot!"
|
2025-11-16 18:39:39 +00:00
|
|
|
|
echo "🚀 Запускаем в HTTPS-only режиме"
|
|
|
|
|
|
# Обновляем systemd сервис для HTTPS-only режима
|
2025-11-19 20:10:22 +00:00
|
|
|
|
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
|
2025-11-16 14:53:15 +00:00
|
|
|
|
else
|
2025-11-16 16:31:22 +00:00
|
|
|
|
echo "❌ Не удалось создать Let's Encrypt сертификат через webroot"
|
2025-11-16 14:53:15 +00:00
|
|
|
|
echo "💡 Убедитесь, что:"
|
|
|
|
|
|
echo " - У вас установлен и запущен веб-сервер (nginx/apache)"
|
2025-11-19 22:41:54 +00:00
|
|
|
|
echo " - Домен api.mnemo-cards.online указывает на этот сервер"
|
2025-11-16 14:53:15 +00:00
|
|
|
|
echo " - Директория /var/www/html доступна для записи certbot"
|
|
|
|
|
|
echo " - Firewall разрешает входящие соединения на порт 80"
|
|
|
|
|
|
echo " - Веб-сервер правильно настроен для обслуживания .well-known/acme-challenge/"
|
2025-11-16 16:31:22 +00:00
|
|
|
|
exit 1
|
2025-11-16 14:53:15 +00:00
|
|
|
|
fi
|
|
|
|
|
|
fi
|
|
|
|
|
|
|
|
|
|
|
|
sudo systemctl daemon-reload
|
|
|
|
|
|
sudo systemctl start mnemo_cards_server
|
|
|
|
|
|
journalctl -u mnemo_cards_server --since "1min ago"
|