#!/bin/bash # MY NETWORK UNIVERSAL INSTALLER # Универсальный установщик для любого сервера с автопоиском проекта и полной настройкой set -e echo "==================================================" echo "🚀 MY NETWORK UNIVERSAL INSTALLER" echo "Универсальная установка и восстановление сервера" echo "==================================================" # Определение системы OS_ID=$(lsb_release -i 2>/dev/null | cut -f2 || echo "unknown") OS_VERSION=$(lsb_release -r 2>/dev/null | cut -f2 || echo "unknown") echo "🖥️ Система: $OS_ID $OS_VERSION" echo "👤 Пользователь: $(whoami)" echo "📁 Текущая директория: $(pwd)" # =========================== # ПОИСК ПРОЕКТА # =========================== echo "" echo "=== 1. ПОИСК ПРОЕКТА ===" PROJECT_LOCATIONS=( "/home/myuploader/uploader-bot" "/home/uploader-bot" "/home/myuploader/my-uploader-bot" "/root/uploader-bot" "/root/my-uploader-bot" "/opt/uploader-bot" "/opt/my-uploader-bot" "/var/www/uploader-bot" "/var/www/my-uploader-bot" "$(pwd)" "$(pwd)/../uploader-bot" "$(pwd)/../my-uploader-bot" ) PROJECT_DIR="" COMPOSE_FILE="" echo "🔍 Поиск проекта в стандартных местах..." for dir in "${PROJECT_LOCATIONS[@]}"; do if [ -d "$dir" ]; then for compose in "docker-compose.production.yml" "docker-compose.yml" "docker-compose.new.yml"; do if [ -f "$dir/$compose" ]; then PROJECT_DIR="$dir" COMPOSE_FILE="$compose" echo "✅ Проект найден: $PROJECT_DIR" echo "✅ Compose файл: $COMPOSE_FILE" break 2 fi done fi done if [ -z "$PROJECT_DIR" ]; then echo "🔍 Глобальный поиск проекта..." FOUND_PROJECTS=$(find / -name "docker-compose*.yml" -path "*/uploader-bot*" 2>/dev/null | head -3) if [ -n "$FOUND_PROJECTS" ]; then echo "Найдены проекты:" echo "$FOUND_PROJECTS" FIRST_FOUND=$(echo "$FOUND_PROJECTS" | head -1) PROJECT_DIR=$(dirname "$FIRST_FOUND") COMPOSE_FILE=$(basename "$FIRST_FOUND") echo "✅ Выбран: $PROJECT_DIR" else echo "❌ Проект не найден автоматически!" read -p "📝 Введите полный путь к директории проекта: " PROJECT_DIR if [ ! -d "$PROJECT_DIR" ]; then echo "❌ Директория не существует: $PROJECT_DIR" exit 1 fi # Найти compose файл for compose in "docker-compose.production.yml" "docker-compose.yml" "docker-compose.new.yml"; do if [ -f "$PROJECT_DIR/$compose" ]; then COMPOSE_FILE="$compose" break fi done if [ -z "$COMPOSE_FILE" ]; then echo "❌ Docker compose файл не найден в $PROJECT_DIR" exit 1 fi fi fi cd "$PROJECT_DIR" echo "📁 Работаю в: $(pwd)" # =========================== # УСТАНОВКА ЗАВИСИМОСТЕЙ # =========================== echo "" echo "=== 2. УСТАНОВКА СИСТЕМНЫХ ЗАВИСИМОСТЕЙ ===" # Обновление системы echo "📦 Обновление системы..." sudo apt update && sudo apt upgrade -y # Установка основных пакетов echo "📦 Установка базовых пакетов..." sudo apt install -y curl wget git nginx ufw fail2ban htop nano net-tools # Установка Docker if ! command -v docker &> /dev/null; then echo "🐳 Установка Docker..." curl -fsSL https://get.docker.com -o get-docker.sh sudo sh get-docker.sh sudo usermod -aG docker $USER rm get-docker.sh else echo "✅ Docker уже установлен: $(docker --version)" fi # Установка Docker Compose if ! command -v docker-compose &> /dev/null; then echo "🐳 Установка Docker Compose..." sudo curl -L "https://github.com/docker/compose/releases/latest/download/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose sudo chmod +x /usr/local/bin/docker-compose else echo "✅ Docker Compose уже установлен: $(docker-compose --version)" fi # =========================== # НАСТРОЙКА БЕЗОПАСНОСТИ # =========================== echo "" echo "=== 3. НАСТРОЙКА БЕЗОПАСНОСТИ ===" # Настройка UFW echo "🔥 Настройка файрвола..." sudo ufw --force reset sudo ufw default deny incoming sudo ufw default allow outgoing sudo ufw allow 22/tcp sudo ufw allow 80/tcp sudo ufw allow 443/tcp sudo ufw allow 15100/tcp sudo ufw --force enable # Настройка fail2ban echo "🛡️ Настройка fail2ban..." sudo systemctl enable fail2ban sudo systemctl start fail2ban # =========================== # ОЧИСТКА И ПОДГОТОВКА # =========================== echo "" echo "=== 4. ОЧИСТКА СТАРЫХ КОНТЕЙНЕРОВ ===" echo "🛑 Останавливаю все контейнеры..." docker stop $(docker ps -aq) 2>/dev/null || true echo "🗑️ Удаляю старые контейнеры..." docker rm $(docker ps -aq) 2>/dev/null || true echo "🧹 Очистка системы Docker..." docker system prune -af --volumes # =========================== # ПОДГОТОВКА ФАЙЛОВ # =========================== echo "" echo "=== 5. ПОДГОТОВКА КОНФИГУРАЦИИ ===" # Создание .env файла если нет if [ ! -f ".env" ]; then echo "📝 Создание .env файла..." if [ -f "env.example" ]; then cp env.example .env else cat > .env << 'EOF' # MY Network v2.0 Configuration MY_NETWORK_MODE=main-node MY_NETWORK_PORT=15100 MY_NETWORK_HOST=0.0.0.0 BOOTSTRAP_NODE=my-public-node-3.projscale.dev:15100 # Database Configuration DATABASE_URL=sqlite+aiosqlite:///app/data/my_network.db POSTGRES_USER=mynetwork POSTGRES_PASSWORD=mynetwork123 POSTGRES_DB=mynetwork # Redis Configuration REDIS_URL=redis://redis:6379 REDIS_ENABLED=false # Application Configuration API_HOST=0.0.0.0 API_PORT=15100 DEBUG=false ENVIRONMENT=production # Security SECRET_KEY=my-network-secret-key-change-this JWT_SECRET_KEY=jwt-secret-change-this # Monitoring MONITORING_ENABLED=true METRICS_ENABLED=true # Storage STORAGE_PATH=/app/data/storage LOGS_PATH=/app/logs # Telegram Bot (if needed) BOT_TOKEN=your-bot-token WEBHOOK_URL=https://your-domain.com EOF fi echo "✅ .env файл создан" fi # Проверка requirements.txt REQUIREMENTS_FILE="requirements.txt" if [ ! -f "$REQUIREMENTS_FILE" ]; then if [ -f "requirements_new.txt" ]; then REQUIREMENTS_FILE="requirements_new.txt" elif [ -f "requirements.compatible.txt" ]; then REQUIREMENTS_FILE="requirements.compatible.txt" fi fi echo "✅ Используется файл зависимостей: $REQUIREMENTS_FILE" # =========================== # NGINX КОНФИГУРАЦИЯ # =========================== echo "" echo "=== 6. НАСТРОЙКА NGINX ===" cat > /tmp/nginx_universal.conf << 'EOF' server { listen 80; server_name _; # Максимальный размер загружаемых файлов client_max_body_size 100M; # MY Network v2.0 API проксирование location /api/ { proxy_pass http://localhost:15100/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:15100/health; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; } # MY Network Monitoring Dashboard location /api/my/monitor/ { proxy_pass http://localhost:15100/api/my/monitor/; 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; } # WebSocket поддержка для MY Network location /api/my/monitor/ws { proxy_pass http://localhost:15100/api/my/monitor/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; } # Legacy endpoints (для совместимости) location /api5000/ { proxy_pass http://localhost:5000/; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; } # Статические файлы (если есть 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 $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 sudo mv /tmp/nginx_universal.conf /etc/nginx/sites-available/default sudo ln -sf /etc/nginx/sites-available/default /etc/nginx/sites-enabled/default # Удаление дефолтной страницы nginx sudo rm -f /var/www/html/index.nginx-debian.html echo "✅ Nginx конфигурация создана" # =========================== # ЗАПУСК ПРИЛОЖЕНИЯ # =========================== echo "" echo "=== 7. ЗАПУСК ПРИЛОЖЕНИЯ ===" echo "🚀 Запуск Docker Compose..." # Стратегия запуска: сначала базовые сервисы, потом приложение echo "📊 Запуск базы данных и Redis..." if docker-compose -f "$COMPOSE_FILE" up -d postgres redis 2>/dev/null; then echo "✅ База данных запущена" else echo "⚠️ Ошибка запуска БД, пробую альтернативные имена сервисов..." docker-compose -f "$COMPOSE_FILE" up -d db database mysql mariadb redis 2>/dev/null || true fi echo "⏳ Ждем запуска БД (15 секунд)..." sleep 15 echo "🚀 Запуск основного приложения..." if docker-compose -f "$COMPOSE_FILE" --profile main-node up -d 2>/dev/null; then echo "✅ Main-node профиль запущен" elif docker-compose -f "$COMPOSE_FILE" up -d app 2>/dev/null; then echo "✅ Приложение запущено" else echo "⚠️ Пробую запустить все сервисы..." docker-compose -f "$COMPOSE_FILE" up -d fi echo "⏳ Ждем запуска приложения (30 секунд)..." sleep 30 # =========================== # СОЗДАНИЕ SYSTEMD SERVICE # =========================== echo "" echo "=== 8. СОЗДАНИЕ SYSTEMD SERVICE ===" cat > /tmp/mynetwork.service << EOF [Unit] Description=MY Network v2.0 Service After=docker.service Requires=docker.service [Service] Type=oneshot RemainAfterExit=yes WorkingDirectory=$PROJECT_DIR ExecStart=/usr/bin/docker-compose -f $COMPOSE_FILE --profile main-node up -d ExecStop=/usr/bin/docker-compose -f $COMPOSE_FILE down ExecReload=/usr/bin/docker-compose -f $COMPOSE_FILE restart app TimeoutStartSec=300 TimeoutStopSec=120 User=root Environment="MY_NETWORK_PORT=15100" Environment="MY_NETWORK_VERSION=v2.0" [Install] WantedBy=multi-user.target EOF sudo mv /tmp/mynetwork.service /etc/systemd/system/ sudo systemctl daemon-reload sudo systemctl enable mynetwork echo "✅ SystemD service создан и активирован" # =========================== # ФИНАЛЬНАЯ ПРОВЕРКА # =========================== echo "" echo "=== 9. ФИНАЛЬНАЯ ПРОВЕРКА ===" # Перезапуск nginx sudo nginx -t && sudo systemctl restart nginx echo "✅ Nginx перезапущен" # Проверка статуса echo "📊 Статус контейнеров:" docker ps --format "table {{.Names}}\t{{.Image}}\t{{.Status}}\t{{.Ports}}" echo "" echo "🔍 Тестирование соединений:" sleep 10 # Тест локальных портов для MY Network v2.0 echo "🔍 Тестирование MY Network v2.0 (порт 15100):" if timeout 10 curl -s http://localhost:15100/health > /dev/null 2>&1; then echo "✅ localhost:15100/health - РАБОТАЕТ" else echo "❌ localhost:15100/health - НЕ РАБОТАЕТ" fi if timeout 10 curl -s http://localhost:15100/api/my/monitor/ > /dev/null 2>&1; then echo "✅ localhost:15100/api/my/monitor/ - Matrix Monitoring РАБОТАЕТ" else echo "❌ localhost:15100/api/my/monitor/ - Matrix Monitoring НЕ РАБОТАЕТ" fi # Тест legacy портов (для совместимости) echo "🔍 Тестирование legacy портов:" for port in 3000 5000 8080; do if timeout 5 curl -s http://localhost:$port/api/health > /dev/null 2>&1; then echo "✅ localhost:$port/api/health - РАБОТАЕТ" else echo "⚠️ localhost:$port/api/health - НЕ РАБОТАЕТ (legacy)" fi done # Тест nginx proxy 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 if timeout 5 curl -s http://localhost/health > /dev/null 2>&1; then echo "✅ nginx proxy (/health) - РАБОТАЕТ" else echo "❌ nginx proxy (/health) - НЕ РАБОТАЕТ" fi # =========================== # РЕЗУЛЬТАТ # =========================== echo "" echo "==================================================" echo "🎉 MY NETWORK v2.0 ГОТОВ К РАБОТЕ!" echo "==================================================" echo "" echo "📊 ИНФОРМАЦИЯ О СИСТЕМЕ:" echo "Проект: $PROJECT_DIR" echo "Compose: $COMPOSE_FILE" echo "MY Network Port: 15100" echo "Внешний IP: $(curl -s ifconfig.me 2>/dev/null || echo "неизвестно")" echo "" echo "🌐 MY NETWORK v2.0 ЭНДПОИНТЫ:" EXTERNAL_IP=$(curl -s ifconfig.me 2>/dev/null || echo "YOUR_SERVER_IP") echo "• Health Check: http://$EXTERNAL_IP/health" echo "• Matrix Monitor: http://$EXTERNAL_IP/api/my/monitor/" echo "• WebSocket: ws://$EXTERNAL_IP/api/my/monitor/ws" echo "• API Docs: http://$EXTERNAL_IP:15100/docs" echo "" echo "🔧 КОМАНДЫ ТЕСТИРОВАНИЯ:" echo "curl -I http://$EXTERNAL_IP/health" echo "curl -I http://$EXTERNAL_IP/api/my/monitor/" echo "curl -I http://$EXTERNAL_IP:15100/health" echo "" echo "🔍 ДИАГНОСТИКА (если нужна):" echo "docker ps" echo "docker logs \$(docker ps --format \"{{.Names}}\" | grep app | head -1)" echo "sudo systemctl status mynetwork" echo "sudo journalctl -u nginx -f" echo "" echo "🛠️ УПРАВЛЕНИЕ MY NETWORK:" echo "Запуск: sudo systemctl start mynetwork" echo "Остановка: sudo systemctl stop mynetwork" echo "Перезапуск: sudo systemctl restart mynetwork" echo "Статус: sudo systemctl status mynetwork" echo "Логи: docker-compose logs -f app" echo "" echo "🎯 PRODUCTION DEPLOYMENT:" echo "Для развертывания на production сервере" echo "(my-public-node-3.projscale.dev) используйте" echo "отдельный production deployment скрипт" echo "" echo "✅ MY Network v2.0 с Matrix-мониторингом готов!"