new shs
This commit is contained in:
1 parent
c8e1d5046c
commit
3ca560c3e2
3 files changed
+525
-3
No files matched your search
@@ -0,0 +1,349 @@
|
||||
#!/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!"
|
||||
Reference in new issue
Block a user