uploader-bot/universal_installer.sh

495 lines
16 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 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-мониторингом готов!"