uploader-bot/docs/INSTALLATION_GUIDE.md

826 lines
25 KiB
Markdown
Raw Permalink Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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.

# 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 сервере.