This commit is contained in:
user 2025-07-05 20:33:07 +03:00
parent c8e1d5046c
commit 3ca560c3e2
3 changed files with 525 additions and 3 deletions

View File

@ -16,13 +16,36 @@ chmod +x universal_installer.sh
sudo ./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/ my-uploader-bot/
├── universal_installer.sh # 🚀 Основной установщик ├── universal_installer.sh # 🚀 Основной установщик
├── fix_nginx_now.sh # 🔧 Быстрое исправление nginx
├── app/ # 💻 Код приложения ├── app/ # 💻 Код приложения
├── scripts/ # 🛠️ Утилиты и скрипты ├── scripts/ # 🛠️ Утилиты и скрипты
│ ├── setup_domain_ssl.sh # 🌐 Настройка домена и SSL
│ ├── diagnose.sh # 🔍 Диагностика проблем
│ └── ...
├── deployment/ # 📦 Файлы развертывания ├── deployment/ # 📦 Файлы развертывания
├── docs/ # 📚 Документация ├── docs/ # 📚 Документация
└── ... └── ...
@ -35,6 +58,7 @@ my-uploader-bot/
- `env.example` - Пример переменных окружения - `env.example` - Пример переменных окружения
### 🛠️ scripts/ ### 🛠️ scripts/
- `setup_domain_ssl.sh` - Настройка домена и SSL
- `diagnose.sh` - Диагностика проблем - `diagnose.sh` - Диагностика проблем
- `quick_check.sh` - Быстрая проверка статуса - `quick_check.sh` - Быстрая проверка статуса
- `setup_*.sh` - Скрипты настройки компонентов - `setup_*.sh` - Скрипты настройки компонентов
@ -56,10 +80,14 @@ my-uploader-bot/
## 🌐 После установки ## 🌐 После установки
Сервер будет доступен на: ### HTTP доступ:
- `http://YOUR_SERVER_IP/api/health` - API health check - `http://YOUR_SERVER_IP/api/health` - API health check
- `http://YOUR_SERVER_IP/health` - Альтернативный 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 ```bash
@ -69,8 +97,11 @@ sudo systemctl status mynetwork
# Перезапуск # Перезапуск
sudo systemctl restart mynetwork sudo systemctl restart mynetwork
# Логи # Логи приложения
docker logs $(docker ps --format "{{.Names}}" | grep app | head -1) 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 ./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+ - ✅ Debian 11+
- ✅ CentOS 8+ (адаптация) - ✅ 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`
## 🆘 Поддержка ## 🆘 Поддержка
Скрипт автоматически: Скрипт автоматически:
@ -99,3 +167,4 @@ docker logs $(docker ps --format "{{.Names}}" | grep app | head -1)
- Работает с разными compose файлами - Работает с разными compose файлами
- Создает резервные копии конфигураций - Создает резервные копии конфигураций
- Показывает детальную диагностику при ошибках - Показывает детальную диагностику при ошибках
- Настраивает SSL с автообновлением

104
fix_nginx_now.sh Normal file
View File

@ -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"

349
scripts/setup_domain_ssl.sh Normal file
View File

@ -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!"