204 lines
6.1 KiB
Bash
204 lines
6.1 KiB
Bash
#!/bin/bash
|
||
|
||
# Настройка SSL для конкретного домена my-public-node-3.projscale.dev
|
||
set -e
|
||
|
||
DOMAIN="my-public-node-3.projscale.dev"
|
||
|
||
echo "🔒 НАСТРОЙКА SSL ДЛЯ $DOMAIN"
|
||
|
||
# Проверка что приложение работает
|
||
echo ""
|
||
echo "=== 1. ПРОВЕРКА ПРИЛОЖЕНИЯ ==="
|
||
if timeout 5 curl -s http://localhost:15100/health > /dev/null 2>&1; then
|
||
echo "✅ Приложение работает на порту 15100"
|
||
else
|
||
echo "❌ Приложение НЕ работает на порту 15100!"
|
||
echo "Сначала исправьте приложение:"
|
||
echo "chmod +x fix_app_restart.sh && ./fix_app_restart.sh"
|
||
exit 1
|
||
fi
|
||
|
||
# Создание конфигурации для домена (без SSL)
|
||
echo ""
|
||
echo "=== 2. НАСТРОЙКА NGINX ДЛЯ ДОМЕНА ==="
|
||
sudo tee /etc/nginx/sites-available/default > /dev/null << EOF
|
||
server {
|
||
listen 80;
|
||
server_name $DOMAIN;
|
||
|
||
client_max_body_size 100M;
|
||
|
||
# Let's Encrypt challenge
|
||
location /.well-known/acme-challenge/ {
|
||
root /var/www/html;
|
||
}
|
||
|
||
location /api/ {
|
||
proxy_pass http://127.0.0.1:15100/api/;
|
||
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;
|
||
proxy_connect_timeout 60s;
|
||
proxy_send_timeout 60s;
|
||
proxy_read_timeout 60s;
|
||
}
|
||
|
||
location /health {
|
||
proxy_pass http://127.0.0.1:15100/health;
|
||
proxy_set_header Host \$host;
|
||
proxy_set_header X-Real-IP \$remote_addr;
|
||
}
|
||
|
||
location / {
|
||
proxy_pass http://127.0.0.1:15100/;
|
||
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;
|
||
}
|
||
}
|
||
EOF
|
||
|
||
# Тестирование и перезагрузка nginx
|
||
echo "🧪 Тестирование nginx..."
|
||
if sudo nginx -t; then
|
||
sudo systemctl reload nginx
|
||
echo "✅ Nginx перезагружен"
|
||
else
|
||
echo "❌ Ошибка nginx!"
|
||
exit 1
|
||
fi
|
||
|
||
# Создание директории для Let's Encrypt
|
||
sudo mkdir -p /var/www/html/.well-known/acme-challenge/
|
||
sudo chown -R www-data:www-data /var/www/html/
|
||
|
||
# Получение SSL сертификата
|
||
echo ""
|
||
echo "=== 3. ПОЛУЧЕНИЕ SSL СЕРТИФИКАТА ==="
|
||
echo "🔒 Получение сертификата для $DOMAIN..."
|
||
|
||
if sudo certbot certonly --webroot \
|
||
-w /var/www/html \
|
||
--non-interactive \
|
||
--agree-tos \
|
||
--email admin@$DOMAIN \
|
||
--domains $DOMAIN; then
|
||
echo "✅ SSL сертификат получен!"
|
||
else
|
||
echo "❌ Ошибка получения SSL!"
|
||
echo "Проверьте что домен $DOMAIN направлен на этот сервер"
|
||
exit 1
|
||
fi
|
||
|
||
# Создание HTTPS конфигурации
|
||
echo ""
|
||
echo "=== 4. НАСТРОЙКА HTTPS ==="
|
||
sudo tee /etc/nginx/sites-available/default > /dev/null << EOF
|
||
# HTTP -> HTTPS redirect
|
||
server {
|
||
listen 80;
|
||
server_name $DOMAIN;
|
||
|
||
location /.well-known/acme-challenge/ {
|
||
root /var/www/html;
|
||
}
|
||
|
||
location / {
|
||
return 301 https://\$server_name\$request_uri;
|
||
}
|
||
}
|
||
|
||
# HTTPS server
|
||
server {
|
||
listen 443 ssl http2;
|
||
server_name $DOMAIN;
|
||
|
||
# SSL Configuration
|
||
ssl_certificate /etc/letsencrypt/live/$DOMAIN/fullchain.pem;
|
||
ssl_certificate_key /etc/letsencrypt/live/$DOMAIN/privkey.pem;
|
||
|
||
# SSL Security
|
||
ssl_protocols TLSv1.2 TLSv1.3;
|
||
ssl_prefer_server_ciphers off;
|
||
ssl_session_cache shared:SSL:10m;
|
||
|
||
# Security headers
|
||
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
|
||
add_header X-Frame-Options DENY always;
|
||
add_header X-Content-Type-Options nosniff always;
|
||
|
||
client_max_body_size 100M;
|
||
|
||
location /api/ {
|
||
proxy_pass http://127.0.0.1:15100/api/;
|
||
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 https;
|
||
proxy_connect_timeout 60s;
|
||
proxy_send_timeout 60s;
|
||
proxy_read_timeout 60s;
|
||
}
|
||
|
||
location /health {
|
||
proxy_pass http://127.0.0.1:15100/health;
|
||
proxy_set_header Host \$host;
|
||
proxy_set_header X-Real-IP \$remote_addr;
|
||
proxy_set_header X-Forwarded-Proto https;
|
||
}
|
||
|
||
location / {
|
||
proxy_pass http://127.0.0.1:15100/;
|
||
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 https;
|
||
}
|
||
}
|
||
EOF
|
||
|
||
# Финальное тестирование
|
||
echo "🧪 Финальное тестирование nginx..."
|
||
if sudo nginx -t; then
|
||
sudo systemctl reload nginx
|
||
echo "✅ HTTPS настроен!"
|
||
else
|
||
echo "❌ Ошибка HTTPS конфигурации!"
|
||
exit 1
|
||
fi
|
||
|
||
# Настройка автообновления
|
||
echo ""
|
||
echo "=== 5. АВТООБНОВЛЕНИЕ ==="
|
||
sudo tee /etc/cron.d/certbot-renew > /dev/null << EOF
|
||
0 12 * * * root certbot renew --quiet --nginx --post-hook "systemctl reload nginx"
|
||
EOF
|
||
echo "✅ Автообновление настроено"
|
||
|
||
# Тестирование
|
||
echo ""
|
||
echo "=== 6. ФИНАЛЬНОЕ ТЕСТИРОВАНИЕ ==="
|
||
sleep 5
|
||
|
||
echo "🧪 Тестирование HTTPS..."
|
||
if timeout 10 curl -s https://$DOMAIN/health > /dev/null 2>&1; then
|
||
echo "✅ HTTPS работает: https://$DOMAIN/health"
|
||
else
|
||
echo "⚠️ HTTPS может быть недоступен (подождите несколько минут)"
|
||
fi
|
||
|
||
if timeout 10 curl -s https://$DOMAIN/api/health > /dev/null 2>&1; then
|
||
echo "✅ API работает: https://$DOMAIN/api/health"
|
||
else
|
||
echo "⚠️ API может быть недоступен"
|
||
fi
|
||
|
||
echo ""
|
||
echo "🎉 SSL НАСТРОЕН ДЛЯ $DOMAIN!"
|
||
echo ""
|
||
echo "🌐 Ваш сайт:"
|
||
echo "https://$DOMAIN"
|
||
echo "https://$DOMAIN/api/health" |