826 lines
25 KiB
Markdown
826 lines
25 KiB
Markdown
# 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 сервере. |