uploader-bot/docs/INSTALLATION_GUIDE.md

25 KiB
Raw Blame History

MY Network v3.0 - Руководство по установке

🚀 Автоматическая установка одной командой

Быстрая установка

curl -fsSL https://raw.githubusercontent.com/your-org/my-uploader-bot/main/start.sh | bash

Установка с параметрами

curl -fsSL https://raw.githubusercontent.com/your-org/my-uploader-bot/main/start.sh | bash -s -- --domain=yourdomain.com --ssl=true

📋 Требования системы

Минимальные требования

  • ОС: Ubuntu 20.04+, Debian 11+, CentOS 8+
  • RAM: 2GB (рекомендуется 4GB)
  • CPU: 2 cores
  • Диск: 20GB свободного места (рекомендуется 100GB для хранения контента)
  • Права: Root доступ или sudo

Рекомендуемые требования

  • RAM: 8GB+
  • CPU: 4+ cores
  • Диск: 500GB+ SSD
  • Сеть: Статический IP, доменное имя

🛠️ Подробное описание скрипта start.sh

Этапы установки

#!/bin/bash
# MY Network v3.0 Installation Script

set -e

# Переменные по умолчанию
DOMAIN=""
DOCKER_SOCK_PATH="/var/run/docker.sock"
BOOTSTRAP_CONFIG="default"
TELEGRAM_API_KEY=""
CLIENT_TELEGRAM_API_KEY=""
SSL_ENABLED=false
NODE_TYPE="public"
INSTALL_DEPENDENCIES=true

# Функция вывода логов
log() {
    echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1"
}

# Этап 1: Проверка системы и прав
check_system() {
    log "🔍 Проверка системы..."
    
    # Проверка прав root
    if [[ $EUID -ne 0 ]]; then
        log "❌ Скрипт должен запускаться с правами root"
        exit 1
    fi
    
    # Определение ОС
    if [ -f /etc/os-release ]; then
        . /etc/os-release
        OS=$NAME
        VER=$VERSION_ID
    else
        log "❌ Неподдерживаемая операционная система"
        exit 1
    fi
    
    log "✅ Система: $OS $VER"
    
    # Проверка архитектуры
    ARCH=$(uname -m)
    if [[ "$ARCH" != "x86_64" && "$ARCH" != "aarch64" ]]; then
        log "❌ Неподдерживаемая архитектура: $ARCH"
        exit 1
    fi
    
    log "✅ Архитектура: $ARCH"
}

# Этап 2: Интерактивная настройка
interactive_setup() {
    log "🔧 Интерактивная настройка MY Network..."
    
    # Тип ноды
    echo ""
    echo "Выберите тип ноды:"
    echo "1) Основная нода (создает новую сеть)"
    echo "2) Подключаемая нода (подключается к существующей сети)"
    read -p "Введите номер [1-2]: " node_choice
    
    case $node_choice in
        1)
            NODE_TYPE="bootstrap"
            BOOTSTRAP_CONFIG="new"
            log "✅ Выбрана основная нода (создание новой сети)"
            ;;
        2)
            NODE_TYPE="public"
            BOOTSTRAP_CONFIG="existing"
            log "✅ Выбрана подключаемая нода"
            ;;
        *)
            log "❌ Неверный выбор. Используется подключаемая нода по умолчанию"
            NODE_TYPE="public"
            BOOTSTRAP_CONFIG="existing"
            ;;
    esac
    
    # Bootstrap конфигурация
    if [[ "$BOOTSTRAP_CONFIG" == "existing" ]]; then
        echo ""
        read -p "Путь до bootstrap.json [оставьте пустым для дефолтного]: " custom_bootstrap
        if [[ -n "$custom_bootstrap" && -f "$custom_bootstrap" ]]; then
            BOOTSTRAP_CONFIG="$custom_bootstrap"
            log "✅ Использован кастомный bootstrap.json: $custom_bootstrap"
        else
            log "✅ Использован дефолтный bootstrap.json"
        fi
    fi
    
    # Docker socket
    echo ""
    read -p "Путь до docker.sock [$DOCKER_SOCK_PATH]: " custom_docker_sock
    if [[ -n "$custom_docker_sock" ]]; then
        DOCKER_SOCK_PATH="$custom_docker_sock"
    fi
    
    if [[ -S "$DOCKER_SOCK_PATH" ]]; then
        log "✅ Docker socket найден: $DOCKER_SOCK_PATH"
    else
        log "⚠️  Docker socket не найден: $DOCKER_SOCK_PATH (будет установлен Docker)"
    fi
    
    # Telegram API ключи
    echo ""
    read -p "TELEGRAM_API_KEY [оставьте пустым если не нужен бот]: " TELEGRAM_API_KEY
    if [[ -n "$TELEGRAM_API_KEY" ]]; then
        log "✅ TELEGRAM_API_KEY настроен"
        
        read -p "CLIENT_TELEGRAM_API_KEY [оставьте пустым если не нужен]: " CLIENT_TELEGRAM_API_KEY
        if [[ -n "$CLIENT_TELEGRAM_API_KEY" ]]; then
            log "✅ CLIENT_TELEGRAM_API_KEY настроен"
        fi
    else
        log "  Telegram боты будут отключены"
    fi
    
    # SSL сертификат
    echo ""
    read -p "Настроить SSL сертификат? [y/N]: " ssl_choice
    if [[ "$ssl_choice" =~ ^[Yy]$ ]]; then
        read -p "Доменное имя: " DOMAIN
        if [[ -n "$DOMAIN" ]]; then
            SSL_ENABLED=true
            log "✅ SSL будет настроен для домена: $DOMAIN"
        else
            log "❌ Домен не указан. SSL отключен"
        fi
    fi
    
    # Приватная нода
    echo ""
    read -p "Создать приватную ноду (только исходящие соединения)? [y/N]: " private_choice
    if [[ "$private_choice" =~ ^[Yy]$ ]]; then
        NODE_TYPE="private"
        log "✅ Создается приватная нода"
    fi
}

# Этап 3: Установка зависимостей
install_dependencies() {
    log "📦 Установка зависимостей..."
    
    # Обновление системы
    log "🔄 Обновление пакетов системы..."
    apt update && apt upgrade -y
    
    # Базовые пакеты
    log "📦 Установка базовых пакетов..."
    apt install -y curl wget git unzip htop nano ufw fail2ban python3 python3-pip
    
    # Docker
    if ! command -v docker &> /dev/null; then
        log "🐳 Установка Docker..."
        curl -fsSL https://get.docker.com -o get-docker.sh
        sh get-docker.sh
        rm get-docker.sh
        
        # Docker Compose
        log "🐳 Установка Docker Compose..."
        curl -L "https://github.com/docker/compose/releases/latest/download/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
        chmod +x /usr/local/bin/docker-compose
        
        # Запуск Docker
        systemctl start docker
        systemctl enable docker
        
        log "✅ Docker установлен и запущен"
    else
        log "✅ Docker уже установлен"
    fi
    
    # Python зависимости
    log "🐍 Установка Python зависимостей..."
    pip3 install --upgrade pip
    
    # Проверка версий
    docker --version
    docker-compose --version
    python3 --version
}

# Этап 4: SSL сертификат
setup_ssl() {
    if [[ "$SSL_ENABLED" == true && -n "$DOMAIN" ]]; then
        log "🔒 Настройка SSL сертификата..."
        
        # Установка certbot
        apt install -y certbot python3-certbot-nginx
        
        # Получение сертификата
        log "🔒 Получение SSL сертификата для $DOMAIN..."
        read -p "Email для уведомлений SSL: " ssl_email
        
        certbot certonly --standalone --non-interactive --agree-tos \
            --email "$ssl_email" -d "$DOMAIN"
        
        if [[ $? -eq 0 ]]; then
            log "✅ SSL сертификат успешно получен"
            
            # Настройка автообновления
            echo "0 2 * * * /usr/bin/certbot renew --quiet" | crontab -
            log "✅ Автообновление SSL настроено"
        else
            log "❌ Ошибка получения SSL сертификата"
            SSL_ENABLED=false
        fi
    fi
}

# Этап 5: Загрузка и настройка проекта
setup_project() {
    log "📥 Загрузка MY Network..."
    
    # Создание директории
    PROJECT_DIR="/opt/my-network"
    mkdir -p "$PROJECT_DIR"
    cd "$PROJECT_DIR"
    
    # Клонирование репозитория
    if [[ -d "my-uploader-bot" ]]; then
        log "🔄 Обновление существующего проекта..."
        cd my-uploader-bot
        git pull origin main
    else
        log "📥 Клонирование проекта..."
        git clone https://github.com/your-org/my-uploader-bot.git
        cd my-uploader-bot
    fi
    
    # Права доступа
    chmod +x scripts/*.sh
    chmod +x *.sh
    
    log "✅ Проект загружен в $PROJECT_DIR/my-uploader-bot"
}

# Этап 6: Генерация конфигурации
generate_config() {
    log "⚙️  Генерация конфигурации..."
    
    # Создание .env файла
    cat > .env << EOF
# MY Network v3.0 Configuration
# Generated: $(date)

# Node Configuration
NODE_TYPE=$NODE_TYPE
NODE_ID=node-$(date +%s)-$(shuf -i 1000-9999 -n 1)
MY_NETWORK_ENABLED=true
MY_NETWORK_VERSION=3.0.0

# Database (PostgreSQL only)
DATABASE_URL=postgresql://myuser:$(openssl rand -hex 16)@localhost:5432/mynetwork
POSTGRES_DB=mynetwork
POSTGRES_USER=myuser
POSTGRES_PASSWORD=$(openssl rand -hex 16)

# Redis
REDIS_URL=redis://localhost:6379/0
REDIS_ENABLED=true

# Security
SECRET_KEY=$(openssl rand -hex 32)
JWT_SECRET_KEY=$(openssl rand -hex 32)
ENCRYPTION_KEY=$(openssl rand -hex 32)

# API Configuration
API_HOST=0.0.0.0
API_PORT=15100

# Telegram Bots
TELEGRAM_API_KEY=$TELEGRAM_API_KEY
CLIENT_TELEGRAM_API_KEY=$CLIENT_TELEGRAM_API_KEY

# Docker Configuration
DOCKER_SOCK_PATH=$DOCKER_SOCK_PATH
CONVERTER_ENABLED=true
CONVERTER_MAX_PARALLEL=3

# SSL Configuration
SSL_ENABLED=$SSL_ENABLED
DOMAIN=$DOMAIN

# Network Configuration
BOOTSTRAP_CONFIG=$BOOTSTRAP_CONFIG
ALLOW_INCOMING_CONNECTIONS=$([ "$NODE_TYPE" != "private" ] && echo "true" || echo "false")

# Storage Configuration
STORAGE_PATH=/opt/my-network/storage
CONTENT_RETENTION_DAYS=7

# Logging
LOG_LEVEL=INFO
LOG_FORMAT=json
EOF
    
    # Bootstrap конфигурация
    if [[ "$BOOTSTRAP_CONFIG" == "new" ]]; then
        # Создание нового bootstrap.json для основной ноды
        cat > bootstrap.json << EOF
{
  "version": "3.0.0",
  "network_id": "my-network-$(date +%s)",
  "created_at": "$(date -u +%Y-%m-%dT%H:%M:%SZ)",
  "bootstrap_nodes": [
    {
      "node_id": "bootstrap-main",
      "address": "$([ "$SSL_ENABLED" == true ] && echo "https://$DOMAIN" || echo "http://$(curl -s ifconfig.me || echo localhost)")",
      "public_key": "",
      "trusted": true,
      "node_type": "bootstrap"
    }
  ],
  "network_settings": {
    "protocol_version": "3.0",
    "max_peers": 50,
    "sync_interval": 300
  }
}
EOF
        log "✅ Создан новый bootstrap.json для основной ноды"
    elif [[ -f "$BOOTSTRAP_CONFIG" ]]; then
        # Копирование кастомного bootstrap.json
        cp "$BOOTSTRAP_CONFIG" bootstrap.json
        log "✅ Использован кастомный bootstrap.json"
    fi
    
    log "✅ Конфигурация сгенерирована"
}

# Этап 7: Сборка и запуск контейнеров
setup_containers() {
    log "🐳 Сборка и запуск контейнеров..."
    
    # Сборка образов
    log "🔨 Сборка Docker образов..."
    docker-compose -f docker-compose.yml build
    
    # Сборка converter image
    log "🔄 Сборка converter module..."
    docker-compose -f docker-compose.yml build converter-module
    
    # Запуск сервисов
    log "🚀 Запуск сервисов..."
    docker-compose -f docker-compose.yml up -d
    
    # Ожидание готовности сервисов
    log "⏳ Ожидание готовности сервисов..."
    sleep 30
    
    # Проверка статуса
    log "🔍 Проверка статуса сервисов..."
    docker-compose -f docker-compose.yml ps
    
    log "✅ Контейнеры запущены"
}

# Этап 8: Настройка системных сервисов
setup_system_services() {
    log "⚙️  Настройка системных сервисов..."
    
    # Создание systemd сервиса
    cat > /etc/systemd/system/my-network.service << EOF
[Unit]
Description=MY Network v3.0
Requires=docker.service
After=docker.service

[Service]
Type=oneshot
RemainAfterExit=yes
WorkingDirectory=$PROJECT_DIR/my-uploader-bot
ExecStart=/usr/local/bin/docker-compose -f docker-compose.yml up -d
ExecStop=/usr/local/bin/docker-compose -f docker-compose.yml down
TimeoutStartSec=0

[Install]
WantedBy=multi-user.target
EOF
    
    # Активация сервиса
    systemctl daemon-reload
    systemctl enable my-network
    
    # Настройка firewall (если нужно)
    if [[ "$NODE_TYPE" != "private" ]]; then
        log "🔥 Настройка firewall..."
        ufw default deny incoming
        ufw default allow outgoing
        ufw allow ssh
        ufw allow 15100/tcp  # API порт
        
        if [[ "$SSL_ENABLED" == true ]]; then
            ufw allow 80/tcp
            ufw allow 443/tcp
        fi
        
        ufw --force enable
        log "✅ Firewall настроен"
    fi
    
    log "✅ Системные сервисы настроены"
}

# Этап 9: Инициализация базы данных
initialize_database() {
    log "🗄️  Инициализация базы данных..."
    
    # Ожидание готовности PostgreSQL
    log "⏳ Ожидание готовности PostgreSQL..."
    sleep 20
    
    # Выполнение миграций
    log "🔄 Выполнение миграций базы данных..."
    docker-compose -f docker-compose.yml exec -T app alembic upgrade head
    
    if [[ $? -eq 0 ]]; then
        log "✅ База данных инициализирована"
    else
        log "❌ Ошибка инициализации базы данных"
        return 1
    fi
}

# Этап 10: Подключение к сети
connect_to_network() {
    log "🌐 Подключение к MY Network..."
    
    # Ожидание полной готовности
    log "⏳ Ожидание готовности всех сервисов..."
    sleep 60
    
    # Проверка API
    local api_url="http://localhost:15100"
    if curl -f "$api_url/health" > /dev/null 2>&1; then
        log "✅ API сервис готов"
        
        # Статистика подключения к сети
        local network_stats=$(curl -s "$api_url/api/v1/network/stats" || echo "{}")
        log "📊 Статистика сети: $network_stats"
        
        # Попытка подключения к bootstrap нодам (если не основная)
        if [[ "$NODE_TYPE" != "bootstrap" ]]; then
            log "🔗 Подключение к bootstrap нодам..."
            curl -X POST "$api_url/api/v1/node/connect" \
                -H "Content-Type: application/json" \
                -d '{"auto_discover": true}' > /dev/null 2>&1
            
            sleep 10
            
            # Проверка подключений
            local peers=$(curl -s "$api_url/api/v1/node/peers" | jq -r '.count // 0' 2>/dev/null || echo "0")
            log "👥 Подключено пиров: $peers"
        fi
        
    else
        log "❌ API сервис недоступен"
        return 1
    fi
}

# Этап 11: Финальная проверка и отчет
final_report() {
    log "📋 Финальная проверка установки..."
    
    # Проверка всех сервисов
    echo ""
    echo "=== СТАТУС УСТАНОВКИ ==="
    
    # Docker контейнеры
    echo "🐳 Docker контейнеры:"
    docker-compose -f docker-compose.yml ps
    
    # Системный сервис
    echo ""
    echo "⚙️  Системный сервис:"
    systemctl is-active my-network && echo "✅ my-network: активен" || echo "❌ my-network: не активен"
    
    # Сетевые подключения
    echo ""
    echo "🌐 Сетевые подключения:"
    if [[ "$NODE_TYPE" != "private" ]]; then
        netstat -tlnp | grep :15100 && echo "✅ API порт 15100: открыт" || echo "❌ API порт: недоступен"
    fi
    
    # Доступность API
    echo ""
    echo "📡 API доступность:"
    local api_endpoint="http://localhost:15100"
    if [[ "$SSL_ENABLED" == true ]]; then
        api_endpoint="https://$DOMAIN"
    fi
    
    if curl -f "$api_endpoint/health" > /dev/null 2>&1; then
        echo "✅ API: доступно на $api_endpoint"
        echo "✅ Веб-интерфейс: $api_endpoint/api/my/monitor/"
    else
        echo "❌ API: недоступно"
    fi
    
    # Конфигурация
    echo ""
    echo "⚙️  Конфигурация:"
    echo "📁 Проект: $PROJECT_DIR/my-uploader-bot"
    echo "🔧 Тип ноды: $NODE_TYPE"
    echo "🔒 SSL: $([ "$SSL_ENABLED" == true ] && echo "включен ($DOMAIN)" || echo "отключен")"
    echo "🤖 Telegram боты: $([ -n "$TELEGRAM_API_KEY" ] && echo "включены" || echo "отключены")"
    echo "🐳 Docker socket: $DOCKER_SOCK_PATH"
    
    # Управление
    echo ""
    echo "=== КОМАНДЫ УПРАВЛЕНИЯ ==="
    echo "🔄 Перезапуск:     systemctl restart my-network"
    echo "⏹️  Остановка:      systemctl stop my-network"
    echo "📊 Статус:         systemctl status my-network"
    echo "📋 Логи:           docker-compose -f $PROJECT_DIR/my-uploader-bot/docker-compose.yml logs -f"
    echo "🌐 Мониторинг:     $api_endpoint/api/my/monitor/"
    
    # Сохранение информации об установке
    cat > /opt/my-network-install.log << EOF
MY Network v3.0 Installation Report
Generated: $(date)

Configuration:
- Node Type: $NODE_TYPE
- SSL Enabled: $SSL_ENABLED
- Domain: $DOMAIN
- API Endpoint: $api_endpoint
- Project Path: $PROJECT_DIR/my-uploader-bot
- Docker Socket: $DOCKER_SOCK_PATH

Services:
- API: $api_endpoint
- Monitoring: $api_endpoint/api/my/monitor/
- System Service: my-network

Management Commands:
- Start: systemctl start my-network
- Stop: systemctl stop my-network  
- Restart: systemctl restart my-network
- Status: systemctl status my-network
- Logs: docker-compose -f $PROJECT_DIR/my-uploader-bot/docker-compose.yml logs -f
EOF
    
    echo ""
    echo "🎉 УСТАНОВКА ЗАВЕРШЕНА!"
    echo "📄 Отчет сохранен: /opt/my-network-install.log"
    echo ""
}

# Главная функция
main() {
    echo "🚀 MY Network v3.0 - Автоматическая установка"
    echo "=============================================="
    echo ""
    
    # Парсинг аргументов командной строки
    while [[ $# -gt 0 ]]; do
        case $1 in
            --domain=*)
                DOMAIN="${1#*=}"
                SSL_ENABLED=true
                shift
                ;;
            --ssl=*)
                SSL_ENABLED="${1#*=}"
                shift
                ;;
            --docker-sock=*)
                DOCKER_SOCK_PATH="${1#*=}"
                shift
                ;;
            --bootstrap=*)
                BOOTSTRAP_CONFIG="${1#*=}"
                shift
                ;;
            --node-type=*)
                NODE_TYPE="${1#*=}"
                shift
                ;;
            --no-deps)
                INSTALL_DEPENDENCIES=false
                shift
                ;;
            *)
                echo "Неизвестный параметр: $1"
                exit 1
                ;;
        esac
    done
    
    # Выполнение этапов установки
    check_system
    interactive_setup
    
    if [[ "$INSTALL_DEPENDENCIES" == true ]]; then
        install_dependencies
    fi
    
    setup_ssl
    setup_project
    generate_config
    setup_containers
    setup_system_services
    initialize_database
    connect_to_network
    final_report
}

# Обработка ошибок
error_handler() {
    log "❌ Ошибка на строке $1. Код выхода: $2"
    log "🔄 Попробуйте запустить скрипт заново или обратитесь за поддержкой"
    exit $2
}

trap 'error_handler $LINENO $?' ERR

# Запуск установки
main "$@"

Особенности скрипта

  1. Интерактивная настройка: Задает только необходимые вопросы
  2. Автоматическая детекция: Определяет ОС и архитектуру
  3. Безопасность: Генерирует случайные пароли и ключи
  4. Логирование: Подробные логи каждого этапа
  5. Откат при ошибках: Информативные сообщения об ошибках
  6. SSL поддержка: Автоматическое получение сертификатов через Certbot

🔧 Ручная установка

Шаг 1: Подготовка системы

# Обновление системы
sudo apt update && sudo apt upgrade -y

# Установка базовых пакетов
sudo apt install -y curl wget git unzip htop nano ufw python3 python3-pip

# Установка Docker
curl -fsSL https://get.docker.com -o get-docker.sh
sudo sh get-docker.sh

# Установка 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

Шаг 2: Клонирование проекта

# Создание директории
sudo mkdir -p /opt/my-network
cd /opt/my-network

# Клонирование репозитория
sudo git clone https://github.com/your-org/my-uploader-bot.git
cd my-uploader-bot

# Права доступа
sudo chmod +x scripts/*.sh

Шаг 3: Настройка конфигурации

# Копирование примера конфигурации
cp .env.example .env

# Редактирование .env файла
nano .env

Шаг 4: Запуск сервисов

# Сборка образов
docker-compose build

# Запуск сервисов
docker-compose up -d

# Проверка статуса
docker-compose ps

🔍 Проверка установки

Проверка API

# Здоровье сервиса
curl http://localhost:15100/health

# Статус ноды
curl http://localhost:15100/api/v1/node/status

# Статистика сети
curl http://localhost:15100/api/v1/network/stats

Веб-интерфейс

http://localhost:15100/api/my/monitor/

Логи сервисов

# Все сервисы
docker-compose logs -f

# Конкретный сервис
docker-compose logs -f app

# Системный сервис
journalctl -u my-network -f

🛠️ Устранение неисправностей

Частые проблемы

  1. Docker не запускается

    sudo systemctl start docker
    sudo systemctl enable docker
    
  2. Порты заняты

    sudo netstat -tlnp | grep :15100
    sudo fuser -k 15100/tcp
    
  3. Проблемы с правами

    sudo chown -R $USER:$USER /opt/my-network
    sudo usermod -aG docker $USER
    
  4. SSL сертификат не работает

    sudo certbot certificates
    sudo certbot renew --dry-run
    

Логи установки

Подробные логи установки сохраняются в:

  • /opt/my-network-install.log - отчет об установке
  • /var/log/my-network/ - логи работы сервисов

🔄 Обновление

Автоматическое обновление

cd /opt/my-network/my-uploader-bot
git pull origin main
docker-compose build
docker-compose up -d

Ручное обновление

# Остановка сервисов
sudo systemctl stop my-network

# Обновление кода
cd /opt/my-network/my-uploader-bot
git pull origin main

# Пересборка образов
docker-compose build

# Запуск
sudo systemctl start my-network

Эта документация обеспечивает простую и надежную установку MY Network v3.0 на любом Linux сервере.