349 lines
11 KiB
Bash
349 lines
11 KiB
Bash
#!/bin/bash
|
||
|
||
# MY Network Domain & SSL Setup Script
|
||
# Настройка домена и SSL сертификата для MY Network
|
||
|
||
set -e
|
||
|
||
echo "=================================================="
|
||
echo "🌐 MY NETWORK DOMAIN & SSL SETUP"
|
||
echo "Настройка домена и HTTPS сертификата"
|
||
echo "=================================================="
|
||
|
||
# Проверка что скрипт запущен от root
|
||
if [ "$EUID" -ne 0 ]; then
|
||
echo "❌ Скрипт должен быть запущен от root (sudo)"
|
||
exit 1
|
||
fi
|
||
|
||
# Запрос домена
|
||
echo ""
|
||
echo "=== 1. НАСТРОЙКА ДОМЕНА ==="
|
||
read -p "🌐 Введите ваш домен (например: mynetwork.example.com): " DOMAIN
|
||
|
||
if [ -z "$DOMAIN" ]; then
|
||
echo "❌ Домен не может быть пустым!"
|
||
exit 1
|
||
fi
|
||
|
||
echo "✅ Домен: $DOMAIN"
|
||
|
||
# Проверка DNS
|
||
echo ""
|
||
echo "=== 2. ПРОВЕРКА DNS ==="
|
||
echo "🔍 Проверяю DNS записи для $DOMAIN..."
|
||
|
||
DOMAIN_IP=$(dig +short $DOMAIN 2>/dev/null || echo "")
|
||
SERVER_IP=$(curl -s ifconfig.me 2>/dev/null || echo "")
|
||
|
||
echo "Домен $DOMAIN указывает на: $DOMAIN_IP"
|
||
echo "IP сервера: $SERVER_IP"
|
||
|
||
if [ "$DOMAIN_IP" != "$SERVER_IP" ]; then
|
||
echo "⚠️ ВНИМАНИЕ: DNS записи не совпадают!"
|
||
echo "Убедитесь что A-запись домена $DOMAIN указывает на $SERVER_IP"
|
||
read -p "Продолжить настройку? (y/N): " CONTINUE
|
||
if [ "$CONTINUE" != "y" ] && [ "$CONTINUE" != "Y" ]; then
|
||
echo "❌ Настройка отменена"
|
||
exit 1
|
||
fi
|
||
else
|
||
echo "✅ DNS записи корректны"
|
||
fi
|
||
|
||
# Установка Certbot
|
||
echo ""
|
||
echo "=== 3. УСТАНОВКА CERTBOT ==="
|
||
echo "📦 Установка Certbot для Let's Encrypt..."
|
||
|
||
apt update
|
||
apt install -y snapd
|
||
snap install core; snap refresh core
|
||
snap install --classic certbot
|
||
ln -sf /snap/bin/certbot /usr/bin/certbot
|
||
|
||
echo "✅ Certbot установлен"
|
||
|
||
# Исправление nginx конфигурации
|
||
echo ""
|
||
echo "=== 4. ИСПРАВЛЕНИЕ NGINX КОНФИГУРАЦИИ ==="
|
||
echo "🔧 Создание корректной nginx конфигурации..."
|
||
|
||
# Резервная копия
|
||
cp /etc/nginx/sites-enabled/default /etc/nginx/sites-enabled/default.backup.$(date +%s)
|
||
|
||
cat > /etc/nginx/sites-available/default << 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;
|
||
}
|
||
|
||
# Redirect to HTTPS (будет добавлено после получения сертификата)
|
||
location / {
|
||
return 301 https://\$server_name\$request_uri;
|
||
}
|
||
}
|
||
|
||
# Временная конфигурация для получения сертификата
|
||
server {
|
||
listen 80;
|
||
server_name $DOMAIN;
|
||
|
||
location /.well-known/acme-challenge/ {
|
||
root /var/www/html;
|
||
}
|
||
|
||
# API проксирование (временно для тестирования)
|
||
location /api/ {
|
||
proxy_pass http://localhost:3000/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;
|
||
proxy_buffering off;
|
||
}
|
||
|
||
# Health check
|
||
location /health {
|
||
proxy_pass http://localhost:3000/api/health;
|
||
proxy_set_header Host \$host;
|
||
proxy_set_header X-Real-IP \$remote_addr;
|
||
}
|
||
|
||
# Fallback на приложение
|
||
location / {
|
||
proxy_pass http://localhost:3000/;
|
||
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
|
||
|
||
# Тестирование конфигурации
|
||
echo "🧪 Тестирование nginx конфигурации..."
|
||
nginx -t
|
||
|
||
if [ $? -eq 0 ]; then
|
||
echo "✅ Nginx конфигурация корректна"
|
||
systemctl reload nginx
|
||
else
|
||
echo "❌ Ошибка в nginx конфигурации!"
|
||
exit 1
|
||
fi
|
||
|
||
# Создание директории для Let's Encrypt
|
||
mkdir -p /var/www/html/.well-known/acme-challenge/
|
||
chown -R www-data:www-data /var/www/html/
|
||
|
||
# Получение SSL сертификата
|
||
echo ""
|
||
echo "=== 5. ПОЛУЧЕНИЕ SSL СЕРТИФИКАТА ==="
|
||
echo "🔒 Получение Let's Encrypt сертификата для $DOMAIN..."
|
||
|
||
# Остановка nginx для standalone режима
|
||
systemctl stop nginx
|
||
|
||
# Получение сертификата
|
||
certbot certonly --standalone \
|
||
--non-interactive \
|
||
--agree-tos \
|
||
--email admin@$DOMAIN \
|
||
--domains $DOMAIN
|
||
|
||
if [ $? -eq 0 ]; then
|
||
echo "✅ SSL сертификат получен успешно"
|
||
else
|
||
echo "❌ Ошибка получения SSL сертификата!"
|
||
systemctl start nginx
|
||
exit 1
|
||
fi
|
||
|
||
# Создание финальной HTTPS конфигурации
|
||
echo ""
|
||
echo "=== 6. НАСТРОЙКА HTTPS ==="
|
||
echo "🔒 Создание HTTPS конфигурации..."
|
||
|
||
cat > /etc/nginx/sites-available/default << EOF
|
||
# HTTP -> HTTPS redirect
|
||
server {
|
||
listen 80;
|
||
server_name $DOMAIN;
|
||
|
||
# Let's Encrypt challenge
|
||
location /.well-known/acme-challenge/ {
|
||
root /var/www/html;
|
||
}
|
||
|
||
# Redirect all other traffic to HTTPS
|
||
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_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-SHA256:ECDHE-RSA-AES256-SHA384;
|
||
ssl_prefer_server_ciphers off;
|
||
ssl_session_cache shared:SSL:10m;
|
||
ssl_session_timeout 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;
|
||
add_header X-XSS-Protection "1; mode=block" always;
|
||
|
||
# Максимальный размер загружаемых файлов
|
||
client_max_body_size 100M;
|
||
|
||
# API проксирование
|
||
location /api/ {
|
||
proxy_pass http://localhost:3000/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;
|
||
proxy_buffering off;
|
||
}
|
||
|
||
# Health check
|
||
location /health {
|
||
proxy_pass http://localhost:3000/api/health;
|
||
proxy_set_header Host \$host;
|
||
proxy_set_header X-Real-IP \$remote_addr;
|
||
proxy_set_header X-Forwarded-Proto https;
|
||
}
|
||
|
||
# WebSocket поддержка (если нужна)
|
||
location /ws/ {
|
||
proxy_pass http://localhost:3000/ws/;
|
||
proxy_http_version 1.1;
|
||
proxy_set_header Upgrade \$http_upgrade;
|
||
proxy_set_header Connection "upgrade";
|
||
proxy_set_header Host \$host;
|
||
proxy_set_header X-Real-IP \$remote_addr;
|
||
proxy_set_header X-Forwarded-Proto https;
|
||
}
|
||
|
||
# Статические файлы (если есть web2-client)
|
||
location / {
|
||
try_files \$uri \$uri/ @app;
|
||
}
|
||
|
||
# Fallback на приложение
|
||
location @app {
|
||
proxy_pass http://localhost:3000/;
|
||
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;
|
||
}
|
||
|
||
# Gzip сжатие
|
||
gzip on;
|
||
gzip_vary on;
|
||
gzip_min_length 1024;
|
||
gzip_types text/plain text/css text/xml text/javascript application/javascript application/xml+rss application/json;
|
||
}
|
||
EOF
|
||
|
||
# Тестирование финальной конфигурации
|
||
echo "🧪 Тестирование HTTPS конфигурации..."
|
||
nginx -t
|
||
|
||
if [ $? -eq 0 ]; then
|
||
echo "✅ HTTPS конфигурация корректна"
|
||
systemctl start nginx
|
||
systemctl reload nginx
|
||
else
|
||
echo "❌ Ошибка в HTTPS конфигурации!"
|
||
exit 1
|
||
fi
|
||
|
||
# Настройка автообновления сертификата
|
||
echo ""
|
||
echo "=== 7. АВТООБНОВЛЕНИЕ СЕРТИФИКАТА ==="
|
||
echo "🔄 Настройка автообновления SSL сертификата..."
|
||
|
||
# Создание скрипта обновления
|
||
cat > /etc/cron.d/certbot-renew << EOF
|
||
# Автообновление Let's Encrypt сертификатов
|
||
0 12 * * * root certbot renew --quiet --nginx --post-hook "systemctl reload nginx"
|
||
EOF
|
||
|
||
echo "✅ Автообновление настроено"
|
||
|
||
# Финальное тестирование
|
||
echo ""
|
||
echo "=== 8. ФИНАЛЬНОЕ ТЕСТИРОВАНИЕ ==="
|
||
echo "🧪 Тестирование HTTPS соединения..."
|
||
|
||
sleep 5
|
||
|
||
# Тест HTTPS
|
||
if curl -s --max-time 10 https://$DOMAIN/health > /dev/null 2>&1; then
|
||
echo "✅ HTTPS работает: https://$DOMAIN/health"
|
||
else
|
||
echo "⚠️ HTTPS может быть недоступен (проверьте DNS и файрвол)"
|
||
fi
|
||
|
||
# Тест API
|
||
if curl -s --max-time 10 https://$DOMAIN/api/health > /dev/null 2>&1; then
|
||
echo "✅ API работает: https://$DOMAIN/api/health"
|
||
else
|
||
echo "⚠️ API может быть недоступен"
|
||
fi
|
||
|
||
echo ""
|
||
echo "=================================================="
|
||
echo "🎉 НАСТРОЙКА ДОМЕНА И SSL ЗАВЕРШЕНА!"
|
||
echo "=================================================="
|
||
|
||
echo ""
|
||
echo "🌐 ВАШ САЙТ ДОСТУПЕН ПО АДРЕСУ:"
|
||
echo "https://$DOMAIN"
|
||
echo "https://$DOMAIN/api/health"
|
||
|
||
echo ""
|
||
echo "🔒 SSL ИНФОРМАЦИЯ:"
|
||
echo "Сертификат: /etc/letsencrypt/live/$DOMAIN/fullchain.pem"
|
||
echo "Ключ: /etc/letsencrypt/live/$DOMAIN/privkey.pem"
|
||
echo "Автообновление: настроено (ежедневно в 12:00)"
|
||
|
||
echo ""
|
||
echo "🛠️ УПРАВЛЕНИЕ:"
|
||
echo "Проверка сертификата: certbot certificates"
|
||
echo "Ручное обновление: certbot renew --nginx"
|
||
echo "Тест обновления: certbot renew --dry-run"
|
||
|
||
echo ""
|
||
echo "🔍 ПРОВЕРКА СТАТУСА:"
|
||
echo "curl -I https://$DOMAIN/health"
|
||
echo "curl -I https://$DOMAIN/api/health"
|
||
|
||
echo ""
|
||
echo "✅ MY Network готов к работе по HTTPS!" |