diff --git a/README.md b/README.md index d87c478..83aaed3 100644 --- a/README.md +++ b/README.md @@ -16,13 +16,36 @@ chmod +x universal_installer.sh sudo ./universal_installer.sh ``` +## 🌐 Настройка домена и HTTPS + +После установки настройте домен и SSL сертификат: + +```bash +# 1. Исправить nginx (если есть ошибки) +chmod +x fix_nginx_now.sh +sudo ./fix_nginx_now.sh + +# 2. Настроить домен и SSL +chmod +x scripts/setup_domain_ssl.sh +sudo ./scripts/setup_domain_ssl.sh +``` + +**Требования для SSL:** +- Домен должен быть направлен на IP сервера (A-запись в DNS) +- Порты 80 и 443 должны быть открыты +- Сервер должен быть доступен из интернета + ## 📁 Структура проекта ``` my-uploader-bot/ ├── universal_installer.sh # 🚀 Основной установщик +├── fix_nginx_now.sh # 🔧 Быстрое исправление nginx ├── app/ # 💻 Код приложения ├── scripts/ # 🛠️ Утилиты и скрипты +│ ├── setup_domain_ssl.sh # 🌐 Настройка домена и SSL +│ ├── diagnose.sh # 🔍 Диагностика проблем +│ └── ... ├── deployment/ # 📦 Файлы развертывания ├── docs/ # 📚 Документация └── ... @@ -35,6 +58,7 @@ my-uploader-bot/ - `env.example` - Пример переменных окружения ### 🛠️ scripts/ +- `setup_domain_ssl.sh` - Настройка домена и SSL - `diagnose.sh` - Диагностика проблем - `quick_check.sh` - Быстрая проверка статуса - `setup_*.sh` - Скрипты настройки компонентов @@ -56,10 +80,14 @@ my-uploader-bot/ ## 🌐 После установки -Сервер будет доступен на: +### HTTP доступ: - `http://YOUR_SERVER_IP/api/health` - API health check - `http://YOUR_SERVER_IP/health` - Альтернативный health check +### HTTPS доступ (после настройки домена): +- `https://your-domain.com/api/health` - API health check +- `https://your-domain.com/health` - Альтернативный health check + ## 🛠️ Управление ```bash @@ -69,8 +97,11 @@ sudo systemctl status mynetwork # Перезапуск sudo systemctl restart mynetwork -# Логи +# Логи приложения docker logs $(docker ps --format "{{.Names}}" | grep app | head -1) + +# Логи nginx +sudo journalctl -u nginx -f ``` ## 🔍 Диагностика @@ -83,6 +114,25 @@ docker logs $(docker ps --format "{{.Names}}" | grep app | head -1) # Полная диагностика ./scripts/full_diagnosis.sh + +# Исправление nginx +sudo ./fix_nginx_now.sh +``` + +## 🔒 SSL и безопасность + +После настройки SSL: +- Автоматическое перенаправление HTTP → HTTPS +- Автообновление сертификатов Let's Encrypt +- Безопасные заголовки HTTP +- Современные SSL протоколы + +```bash +# Проверка сертификата +sudo certbot certificates + +# Тест обновления +sudo certbot renew --dry-run ``` ## 📋 Поддерживаемые системы @@ -91,6 +141,24 @@ docker logs $(docker ps --format "{{.Names}}" | grep app | head -1) - ✅ Debian 11+ - ✅ CentOS 8+ (адаптация) +## 🚨 Решение проблем + +### Nginx ошибки: +```bash +sudo ./fix_nginx_now.sh +``` + +### Контейнеры перезапускаются: +```bash +docker logs $(docker ps --format "{{.Names}}" | grep app | head -1) +./scripts/diagnose.sh +``` + +### SSL не работает: +- Проверьте DNS записи +- Убедитесь что порты 80/443 открыты +- Проверьте файрвол: `sudo ufw status` + ## 🆘 Поддержка Скрипт автоматически: @@ -98,4 +166,5 @@ docker logs $(docker ps --format "{{.Names}}" | grep app | head -1) - Адаптируется к разным именам контейнеров - Работает с разными compose файлами - Создает резервные копии конфигураций -- Показывает детальную диагностику при ошибках \ No newline at end of file +- Показывает детальную диагностику при ошибках +- Настраивает SSL с автообновлением \ No newline at end of file diff --git a/fix_nginx_now.sh b/fix_nginx_now.sh new file mode 100644 index 0000000..83aa9a3 --- /dev/null +++ b/fix_nginx_now.sh @@ -0,0 +1,104 @@ +#!/bin/bash + +# Быстрое исправление nginx конфигурации +# Исправляет ошибку "proxy_pass cannot have URI part in location given by regular expression" + +echo "🔧 Исправление nginx конфигурации..." + +# Резервная копия +sudo cp /etc/nginx/sites-enabled/default /etc/nginx/sites-enabled/default.backup.$(date +%s) + +# Создание корректной конфигурации +sudo tee /etc/nginx/sites-available/default > /dev/null << 'EOF' +server { + listen 80; + server_name _; + + # Максимальный размер загружаемых файлов + 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 $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; + } + + # Альтернативные порты + location /api5000/ { + proxy_pass http://localhost:5000/; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + } + + # 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; + } + + # Основная страница + 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; + } + + # 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 "🧪 Тестирование nginx..." +if sudo nginx -t; then + echo "✅ Конфигурация корректна" + sudo systemctl reload nginx + echo "✅ Nginx перезагружен" +else + echo "❌ Ошибка в конфигурации!" + exit 1 +fi + +echo "" +echo "🌐 Тестирование соединений:" +sleep 3 + +# Тест nginx proxy +if timeout 5 curl -s http://localhost/health > /dev/null 2>&1; then + echo "✅ nginx proxy (/health) - РАБОТАЕТ" +else + echo "❌ nginx proxy (/health) - НЕ РАБОТАЕТ" +fi + +if timeout 5 curl -s http://localhost/api/health > /dev/null 2>&1; then + echo "✅ nginx proxy (/api/health) - РАБОТАЕТ" +else + echo "❌ nginx proxy (/api/health) - НЕ РАБОТАЕТ" +fi + +echo "" +echo "✅ Nginx исправлен! Теперь можно настроить домен и SSL:" +echo "sudo ./scripts/setup_domain_ssl.sh" \ No newline at end of file diff --git a/scripts/setup_domain_ssl.sh b/scripts/setup_domain_ssl.sh new file mode 100644 index 0000000..faf883e --- /dev/null +++ b/scripts/setup_domain_ssl.sh @@ -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!" \ No newline at end of file