25 KiB
25 KiB
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 "$@"
Особенности скрипта
- Интерактивная настройка: Задает только необходимые вопросы
- Автоматическая детекция: Определяет ОС и архитектуру
- Безопасность: Генерирует случайные пароли и ключи
- Логирование: Подробные логи каждого этапа
- Откат при ошибках: Информативные сообщения об ошибках
- 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
🛠️ Устранение неисправностей
Частые проблемы
-
Docker не запускается
sudo systemctl start docker sudo systemctl enable docker -
Порты заняты
sudo netstat -tlnp | grep :15100 sudo fuser -k 15100/tcp -
Проблемы с правами
sudo chown -R $USER:$USER /opt/my-network sudo usermod -aG docker $USER -
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 сервере.