uploader-bot/scripts/setup_domain_ssl.sh

349 lines
11 KiB
Bash
Raw Permalink 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
# 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!"