# MY Network v3.0 - Руководство по установке ## 🚀 Автоматическая установка одной командой ### Быстрая установка ```bash curl -fsSL https://raw.githubusercontent.com/your-org/my-uploader-bot/main/start.sh | bash ``` ### Установка с параметрами ```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 ### Этапы установки ```bash #!/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: Подготовка системы ```bash # Обновление системы 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: Клонирование проекта ```bash # Создание директории 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: Настройка конфигурации ```bash # Копирование примера конфигурации cp .env.example .env # Редактирование .env файла nano .env ``` ### Шаг 4: Запуск сервисов ```bash # Сборка образов docker-compose build # Запуск сервисов docker-compose up -d # Проверка статуса docker-compose ps ``` ## 🔍 Проверка установки ### Проверка API ```bash # Здоровье сервиса 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/ ``` ### Логи сервисов ```bash # Все сервисы docker-compose logs -f # Конкретный сервис docker-compose logs -f app # Системный сервис journalctl -u my-network -f ``` ## 🛠️ Устранение неисправностей ### Частые проблемы 1. **Docker не запускается** ```bash sudo systemctl start docker sudo systemctl enable docker ``` 2. **Порты заняты** ```bash sudo netstat -tlnp | grep :15100 sudo fuser -k 15100/tcp ``` 3. **Проблемы с правами** ```bash sudo chown -R $USER:$USER /opt/my-network sudo usermod -aG docker $USER ``` 4. **SSL сертификат не работает** ```bash sudo certbot certificates sudo certbot renew --dry-run ``` ### Логи установки Подробные логи установки сохраняются в: - `/opt/my-network-install.log` - отчет об установке - `/var/log/my-network/` - логи работы сервисов ## 🔄 Обновление ### Автоматическое обновление ```bash cd /opt/my-network/my-uploader-bot git pull origin main docker-compose build docker-compose up -d ``` ### Ручное обновление ```bash # Остановка сервисов 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 сервере.