new startup script

This commit is contained in:
user 2025-08-15 19:28:14 +03:00
parent cad0f6aebe
commit 18a76ccc02
1 changed files with 194 additions and 79 deletions

217
start.sh
View File

@ -3,7 +3,7 @@
# MY Network v3.0 - Автоматическая установка и запуск ноды # MY Network v3.0 - Автоматическая установка и запуск ноды
# Версия: 3.0.0 # Версия: 3.0.0
set -e set -eE
# Цвета для вывода # Цвета для вывода
RED='\033[0;31m' RED='\033[0;31m'
@ -31,10 +31,10 @@ BOOTSTRAP_CONFIG=""
TELEGRAM_API_KEY="" TELEGRAM_API_KEY=""
CLIENT_TELEGRAM_API_KEY="" CLIENT_TELEGRAM_API_KEY=""
NODE_VERSION="3.0.0" NODE_VERSION="3.0.0"
ENABLE_SSL="false" ENABLE_SSL="${ENABLE_SSL:-false}"
DOMAIN="" DOMAIN="${DOMAIN:-}"
EMAIL="" EMAIL="${EMAIL:-}"
ENABLE_WEB_CLIENT="true" ENABLE_WEB_CLIENT="${ENABLE_WEB_CLIENT:-true}"
# Функция логирования # Функция логирования
log() { log() {
@ -57,6 +57,20 @@ log_error() {
echo -e "${RED}[ERROR]${NC} $1" echo -e "${RED}[ERROR]${NC} $1"
} }
# Утилиты и Docker Compose обнаружение
has_cmd() { command -v "$1" >/dev/null 2>&1; }
COMPOSE_CMD=""
init_compose_cmd() {
if has_cmd docker && docker compose version >/dev/null 2>&1; then
COMPOSE_CMD="docker compose"
elif has_cmd docker-compose; then
COMPOSE_CMD="docker-compose"
else
COMPOSE_CMD=""
fi
}
# Показать заставку # Показать заставку
show_banner() { show_banner() {
clear clear
@ -135,7 +149,7 @@ check_existing_installation() {
fi fi
# Проверяем systemd сервис # Проверяем systemd сервис
if systemctl list-unit-files | grep -q "my-network.service"; then if has_cmd systemctl && systemctl list-unit-files | grep -q "my-network.service"; then
log_info "Обнаружен systemd сервис: my-network" log_info "Обнаружен systemd сервис: my-network"
existing_installation=true existing_installation=true
@ -146,6 +160,7 @@ check_existing_installation() {
fi fi
# Проверяем Docker контейнеры # Проверяем Docker контейнеры
if has_cmd docker; then
if docker ps -a --format "table {{.Names}}" | grep -q "my-network"; then if docker ps -a --format "table {{.Names}}" | grep -q "my-network"; then
log_info "Обнаружены Docker контейнеры MY Network" log_info "Обнаружены Docker контейнеры MY Network"
existing_installation=true existing_installation=true
@ -155,12 +170,15 @@ check_existing_installation() {
services_running=true services_running=true
fi fi
fi fi
fi
# Проверяем Docker образы # Проверяем Docker образы
if has_cmd docker; then
if docker images --format "table {{.Repository}}" | grep -q "my-network"; then if docker images --format "table {{.Repository}}" | grep -q "my-network"; then
log_info "Обнаружены Docker образы MY Network" log_info "Обнаружены Docker образы MY Network"
existing_installation=true existing_installation=true
fi fi
fi
if [ "$existing_installation" = true ]; then if [ "$existing_installation" = true ]; then
echo "" echo ""
@ -186,7 +204,7 @@ check_existing_installation() {
echo "" echo ""
echo -e "${CYAN}Для ручного управления используйте:${NC}" echo -e "${CYAN}Для ручного управления используйте:${NC}"
echo -e "${BLUE}systemctl stop my-network${NC} # Остановка сервиса" echo -e "${BLUE}systemctl stop my-network${NC} # Остановка сервиса"
echo -e "${BLUE}docker-compose -f $PROJECT_DIR/my-network/docker-compose.yml down${NC} # Остановка контейнеров" echo -e "${BLUE}docker compose -f $PROJECT_DIR/my-network/docker-compose.yml down${NC} # Остановка контейнеров"
echo -e "${BLUE}sudo rm -rf $PROJECT_DIR${NC} # Удаление проекта" echo -e "${BLUE}sudo rm -rf $PROJECT_DIR${NC} # Удаление проекта"
echo "" echo ""
exit 0 exit 0
@ -220,7 +238,10 @@ cleanup_existing_installation() {
# Переходим в папку проекта если существует # Переходим в папку проекта если существует
if [ -d "$PROJECT_DIR/my-network" ]; then if [ -d "$PROJECT_DIR/my-network" ]; then
cd "$PROJECT_DIR/my-network" cd "$PROJECT_DIR/my-network"
docker-compose down --remove-orphans --volumes 2>/dev/null || true init_compose_cmd
if [ -n "$COMPOSE_CMD" ]; then
$COMPOSE_CMD down --remove-orphans --volumes 2>/dev/null || true
fi
fi fi
# Принудительная остановка всех контейнеров MY Network # Принудительная остановка всех контейнеров MY Network
@ -242,9 +263,8 @@ cleanup_existing_installation() {
# 4. Очистка Docker системы # 4. Очистка Docker системы
log_info "Очистка Docker кэша и неиспользуемых ресурсов..." log_info "Очистка Docker кэша и неиспользуемых ресурсов..."
docker system prune -f --volumes 2>/dev/null || true docker system prune -f 2>/dev/null || true
docker builder prune -f 2>/dev/null || true docker builder prune -f 2>/dev/null || true
docker volume prune -f 2>/dev/null || true
# 5. Удаление systemd сервиса # 5. Удаление systemd сервиса
if [ -f "/etc/systemd/system/my-network.service" ]; then if [ -f "/etc/systemd/system/my-network.service" ]; then
@ -311,7 +331,7 @@ cleanup_existing_installation() {
backup_dir="/tmp/my-network-db-backup-$(date +%s)" backup_dir="/tmp/my-network-db-backup-$(date +%s)"
# Создаем резервную копию volumes перед удалением # Создаем резервную копию volumes перед удалением
if docker volume ls | grep -q "my-network.*postgres"; then if has_cmd docker && docker volume ls | grep -q "my-network.*postgres"; then
log_info "Создание резервной копии базы данных..." log_info "Создание резервной копии базы данных..."
mkdir -p "$backup_dir" mkdir -p "$backup_dir"
@ -342,8 +362,10 @@ cleanup_existing_installation() {
# 10. Очистка Docker volumes (только если удаляем БД) # 10. Очистка Docker volumes (только если удаляем БД)
if [ "$remove_database" = true ]; then if [ "$remove_database" = true ]; then
log_info "Удаление Docker volumes..." log_info "Удаление Docker volumes..."
if has_cmd docker; then
docker volume ls | grep "my-network" | awk '{print $2}' | xargs -r docker volume rm 2>/dev/null || true docker volume ls | grep "my-network" | awk '{print $2}' | xargs -r docker volume rm 2>/dev/null || true
fi fi
fi
log_success "Очистка завершена" log_success "Очистка завершена"
echo "" echo ""
@ -518,7 +540,7 @@ interactive_setup() {
# 5. Настройка веб-клиента # 5. Настройка веб-клиента
echo "" echo ""
echo -e "${PURPLE}❓ Настройка веб-интерфейса:${NC}" echo -e "${PURPLE}❓ Настройка веб-интерфейса:${NC}"
if check_interactive; then if check_interactive && [ -z "${ENABLE_WEB_CLIENT}" ]; then
echo -n "Развернуть веб-клиент для управления нодой? [Y/n]: " >&2 echo -n "Развернуть веб-клиент для управления нодой? [Y/n]: " >&2
read -r web_choice < /dev/tty read -r web_choice < /dev/tty
else else
@ -538,6 +560,10 @@ interactive_setup() {
if [ "$ALLOW_INCOMING" = "true" ] && [ "$ENABLE_WEB_CLIENT" = "true" ]; then if [ "$ALLOW_INCOMING" = "true" ] && [ "$ENABLE_WEB_CLIENT" = "true" ]; then
echo "" echo ""
echo -e "${PURPLE}❓ Настройка SSL сертификата:${NC}" echo -e "${PURPLE}❓ Настройка SSL сертификата:${NC}"
if [ -n "$DOMAIN" ] && [ -n "$EMAIL" ]; then
ssl_choice="Y"
log_info "Обнаружены DOMAIN и EMAIL в окружении — включаем SSL автоматически"
else
if check_interactive; then if check_interactive; then
echo -n "Настроить SSL сертификат? [y/N]: " >&2 echo -n "Настроить SSL сертификат? [y/N]: " >&2
read -r ssl_choice < /dev/tty read -r ssl_choice < /dev/tty
@ -545,21 +571,22 @@ interactive_setup() {
ssl_choice="N" ssl_choice="N"
log_info "Неинтерактивный режим: SSL отключен (требует ручной настройки)" log_info "Неинтерактивный режим: SSL отключен (требует ручной настройки)"
fi fi
fi
if [[ $ssl_choice =~ ^[Yy]$ ]]; then if [[ $ssl_choice =~ ^[Yy]$ ]]; then
if [ -z "$DOMAIN" ]; then
echo -n "Доменное имя: " >&2 echo -n "Доменное имя: " >&2
read -r DOMAIN < /dev/tty read -r DOMAIN < /dev/tty
if [ -n "$DOMAIN" ]; then fi
if [ -n "$DOMAIN" ] && [ -z "$EMAIL" ]; then
echo -n "Email для уведомлений SSL: " >&2 echo -n "Email для уведомлений SSL: " >&2
read -r EMAIL < /dev/tty read -r EMAIL < /dev/tty
if [ -n "$EMAIL" ]; then fi
if [ -n "$DOMAIN" ] && [ -n "$EMAIL" ]; then
ENABLE_SSL="true" ENABLE_SSL="true"
log_success "SSL будет настроен для домена: $DOMAIN" log_success "SSL будет настроен для домена: $DOMAIN"
else else
log_error "Email не указан. SSL отключен" log_error "DOMAIN/EMAIL не указаны. SSL отключен"
fi
else
log_error "Домен не указан. SSL отключен"
fi fi
fi fi
else else
@ -688,18 +715,42 @@ install_docker() {
log_success "Docker установлен: $(docker --version)" log_success "Docker установлен: $(docker --version)"
fi fi
# Проверка Docker Compose # Проверка Docker Compose (предпочитаем docker compose plugin)
if command -v docker-compose &> /dev/null; then init_compose_cmd
log_info "Docker Compose уже установлен: $(docker-compose --version)" if [ -n "$COMPOSE_CMD" ]; then
log_info "Compose доступен: $($COMPOSE_CMD version 2>/dev/null | head -n1)"
else else
log_info "🐳 Установка Docker Compose..." log_info "🐳 Установка Docker Compose..."
case $OS_ID in
# Установка последней версии Docker Compose ubuntu|debian)
COMPOSE_VERSION=$(curl -s https://api.github.com/repos/docker/compose/releases/latest | jq -r .tag_name) # Попытаться установить plugin через apt
curl -L "https://github.com/docker/compose/releases/download/${COMPOSE_VERSION}/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose apt-get update -qq || true
apt-get install -y -qq docker-compose-plugin || true
;;
centos|rhel|fedora)
if command -v dnf &>/dev/null; then
dnf install -y -q docker-compose-plugin || true
else
yum install -y -q docker-compose-plugin || true
fi
;;
esac
init_compose_cmd
if [ -z "$COMPOSE_CMD" ]; then
# Фоллбэк: скачать статический бинарник docker-compose v2
COMPOSE_VERSION=$(curl -s https://api.github.com/repos/docker/compose/releases/latest | jq -r .tag_name 2>/dev/null || echo "v2.24.7")
curl -fsSL "https://github.com/docker/compose/releases/download/${COMPOSE_VERSION}/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose chmod +x /usr/local/bin/docker-compose
if /usr/local/bin/docker-compose version >/dev/null 2>&1; then
log_success "Docker Compose установлен: $(docker-compose --version)" COMPOSE_CMD="/usr/local/bin/docker-compose"
fi
fi
if [ -n "$COMPOSE_CMD" ]; then
log_success "Docker Compose установлен: $($COMPOSE_CMD version 2>/dev/null | head -n1)"
else
log_error "Не удалось установить Docker Compose"
exit 1
fi
fi fi
# Проверка доступности Docker socket # Проверка доступности Docker socket
@ -874,22 +925,25 @@ networks:
driver: bridge driver: bridge
EOF EOF
# Создание Dockerfile # Создание Dockerfile (минимум системных зависимостей для wheels)
cat > Dockerfile << 'EOF' cat > Dockerfile << 'EOF'
FROM python:3.11-slim FROM python:3.11-slim
WORKDIR /app WORKDIR /app
# Установка системных зависимостей # Установка системных зависимостей (только необходимые)
RUN apt-get update && apt-get install -y \ RUN apt-get update \
&& apt-get install -y --no-install-recommends \
gcc \ gcc \
g++ \ g++ \
curl \ curl \
ffmpeg \
libmagic1 \
&& rm -rf /var/lib/apt/lists/* && rm -rf /var/lib/apt/lists/*
# Копирование requirements и установка Python зависимостей # Копирование requirements и установка Python зависимостей
COPY requirements.txt . COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt RUN python -m pip install --upgrade pip && pip install --no-cache-dir -r requirements.txt
# Копирование кода приложения # Копирование кода приложения
COPY app/ ./app/ COPY app/ ./app/
@ -914,7 +968,7 @@ EXPOSE 8000
CMD ["uvicorn", "app.fastapi_main:app", "--host", "0.0.0.0", "--port", "8000", "--workers", "1"] CMD ["uvicorn", "app.fastapi_main:app", "--host", "0.0.0.0", "--port", "8000", "--workers", "1"]
EOF EOF
# Создание requirements.txt # Создание requirements.txt (пинованные версии для Py3.11, wheels)
cat > requirements.txt << 'EOF' cat > requirements.txt << 'EOF'
fastapi==0.104.1 fastapi==0.104.1
uvicorn[standard]==0.24.0 uvicorn[standard]==0.24.0
@ -926,6 +980,9 @@ asyncpg==0.29.0
redis==5.0.1 redis==5.0.1
aioredis==2.0.1 aioredis==2.0.1
aiofiles==23.2.1 aiofiles==23.2.1
aiohttp==3.12.15
yarl==1.17.1
multidict==6.0.5
cryptography==41.0.7 cryptography==41.0.7
python-jose[cryptography]==3.3.0 python-jose[cryptography]==3.3.0
python-multipart==0.0.6 python-multipart==0.0.6
@ -946,11 +1003,19 @@ python-magic==0.4.27
jinja2==3.1.2 jinja2==3.1.2
starlette==0.27.0 starlette==0.27.0
structlog==23.2.0 structlog==23.2.0
aiogram==3.3.0 aiogram==3.21.0
magic-filter==1.0.12
sanic==23.12.1 sanic==23.12.1
PyJWT==2.8.0 PyJWT==2.8.0
cryptography==41.0.7
ed25519==1.5 ed25519==1.5
tonsdk==1.0.15
pytonconnect==0.3.2
prometheus-client==0.22.1
pydub==0.25.1
pycryptodome==3.23.0
psycopg2-binary==2.9.10
PyNaCl==1.5.0
uvloop==0.21.0
EOF EOF
# Создание init_db.sql # Создание init_db.sql
@ -1153,6 +1218,26 @@ setup_project() {
log_success "Проект настроен в $PROJECT_DIR/my-network" log_success "Проект настроен в $PROJECT_DIR/my-network"
} }
# Патч приложения: гарантировать регистрацию v3роутов
patch_app_routes() {
log_info "Проверка регистрации роутера /api/v3..."
local mfile="$PROJECT_DIR/my-network/app/fastapi_main.py"
if [ ! -f "$mfile" ]; then
log_warn "fastapi_main.py не найден; пропускаем патч роутов"
return 0
fi
if ! grep -q "fastapi_v3_routes" "$mfile"; then
log_info "Добавляем импорт fastapi_v3_routes и include_router()"
# Вставляем импорт рядом с другими импортами роутеров
sed -i "/from app.api.fastapi_system_routes/a from app.api.fastapi_v3_routes import router as v3_router" "$mfile"
# Вставляем include_router сразу после регистрации node_stats_router
sed -i "/app.include_router(node_stats_router)/a \ app.include_router(v3_router) # /api/v3/*" "$mfile"
log_success "Роутер /api/v3 зарегистрирован"
else
log_info "Роутер /api/v3 уже зарегистрирован"
fi
}
# Функция для проверки доступности Docker registry # Функция для проверки доступности Docker registry
check_docker_registry() { check_docker_registry() {
log_info "Проверка доступности Docker registry..." log_info "Проверка доступности Docker registry..."
@ -1193,11 +1278,11 @@ configure_docker_timeout() {
"default-runtime": "runc" "default-runtime": "runc"
}' "$temp_config" > "${temp_config}.new" && mv "${temp_config}.new" "$temp_config" }' "$temp_config" > "${temp_config}.new" && mv "${temp_config}.new" "$temp_config"
if sudo cp "$temp_config" "$docker_config" 2>/dev/null; then if cp "$temp_config" "$docker_config" 2>/dev/null; then
log_info "Docker daemon конфигурация обновлена" log_info "Docker daemon конфигурация обновлена"
# Перезапускаем Docker только если это безопасно # Перезапускаем Docker только если это безопасно
if ! docker ps >/dev/null 2>&1 || [ "$(docker ps -q | wc -l)" -eq 0 ]; then if ! docker ps >/dev/null 2>&1 || [ "$(docker ps -q | wc -l)" -eq 0 ]; then
sudo systemctl reload docker 2>/dev/null || true systemctl reload docker 2>/dev/null || true
fi fi
fi fi
fi fi
@ -1342,10 +1427,14 @@ setup_nginx() {
# Если есть сборка (build process), выполняем её # Если есть сборка (build process), выполняем её
if [ -f "package.json" ]; then if [ -f "package.json" ]; then
log_info "Установка зависимостей web2-client..." log_info "Установка зависимостей web2-client..."
if has_cmd npm; then
npm install || log_warn "Не удалось установить зависимости npm" npm install || log_warn "Не удалось установить зависимости npm"
else
log_warn "npm не установлен; пропускаем установку зависимостей"
fi
# Если есть build скрипт, выполняем сборку # Если есть build скрипт, выполняем сборку
if npm run build 2>/dev/null; then if has_cmd npm && npm run build 2>/dev/null; then
log_success "Сборка web2-client завершена" log_success "Сборка web2-client завершена"
# Копируем собранные файлы # Копируем собранные файлы
if [ -d "build" ]; then if [ -d "build" ]; then
@ -1791,26 +1880,32 @@ build_and_start() {
cd "$PROJECT_DIR/my-network" cd "$PROJECT_DIR/my-network"
# Остановка существующих контейнеров # Остановка существующих контейнеров
docker-compose down 2>/dev/null || true init_compose_cmd
$COMPOSE_CMD down 2>/dev/null || true
# Сборка образов # Сборка образов
log_info "Сборка Docker образов..." log_info "Сборка Docker образов..."
docker-compose build --no-cache if ! $COMPOSE_CMD config >/dev/null 2>&1; then
log_error "docker-compose.yml содержит ошибки. Проверьте конфигурацию и .env"
$COMPOSE_CMD config || true
exit 1
fi
$COMPOSE_CMD build --no-cache
# Запуск сервисов # Запуск сервисов
log_info "Запуск сервисов..." log_info "Запуск сервисов..."
docker-compose up -d $COMPOSE_CMD up -d
# Ожидание готовности сервисов # Ожидание готовности сервисов
log_info "Ожидание готовности сервисов..." log_info "Ожидание готовности сервисов..."
sleep 30 sleep 30
# Проверка статуса контейнеров # Проверка статуса контейнеров
if docker-compose ps | grep -q "Up"; then if $COMPOSE_CMD ps | grep -q "Up"; then
log_success "Контейнеры запущены" log_success "Контейнеры запущены"
else else
log_error "Ошибка запуска контейнеров" log_error "Ошибка запуска контейнеров"
docker-compose logs $COMPOSE_CMD logs || true
exit 1 exit 1
fi fi
} }
@ -1824,7 +1919,7 @@ init_database() {
# Ожидание готовности PostgreSQL # Ожидание готовности PostgreSQL
log_info "Ожидание готовности PostgreSQL..." log_info "Ожидание готовности PostgreSQL..."
for i in {1..30}; do for i in {1..30}; do
if docker-compose exec -T postgres pg_isready -U myuser -d mynetwork > /dev/null 2>&1; then if $COMPOSE_CMD exec -T postgres pg_isready -U myuser -d mynetwork > /dev/null 2>&1; then
break break
fi fi
echo -n "." echo -n "."
@ -1838,7 +1933,7 @@ init_database() {
# Проверяем что база данных готова # Проверяем что база данных готова
log_info "Проверка готовности базы данных..." log_info "Проверка готовности базы данных..."
if docker-compose exec -T postgres psql -U myuser -d mynetwork -c "SELECT 1;" > /dev/null 2>&1; then if $COMPOSE_CMD exec -T postgres psql -U myuser -d mynetwork -c "SELECT 1;" > /dev/null 2>&1; then
log_success "База данных инициализирована" log_success "База данных инициализирована"
else else
log_error "Ошибка доступа к базе данных" log_error "Ошибка доступа к базе данных"
@ -1958,6 +2053,16 @@ connect_to_network() {
create_systemd_service() { create_systemd_service() {
log_info "⚙️ Создание systemd сервиса..." log_info "⚙️ Создание systemd сервиса..."
# Определяем команду compose для systemd
local compose_service_cmd
if has_cmd docker && docker compose version >/dev/null 2>&1; then
compose_service_cmd="docker compose"
elif has_cmd docker-compose; then
compose_service_cmd="/usr/local/bin/docker-compose"
else
compose_service_cmd="docker compose" # по умолчанию
fi
cat > /etc/systemd/system/my-network.service << EOF cat > /etc/systemd/system/my-network.service << EOF
[Unit] [Unit]
Description=MY Network v3.0 Node Description=MY Network v3.0 Node
@ -1968,8 +2073,8 @@ After=docker.service
Type=oneshot Type=oneshot
RemainAfterExit=yes RemainAfterExit=yes
WorkingDirectory=$PROJECT_DIR/my-network WorkingDirectory=$PROJECT_DIR/my-network
ExecStart=/usr/local/bin/docker-compose up -d ExecStart=/bin/sh -lc "$compose_service_cmd up -d"
ExecStop=/usr/local/bin/docker-compose down ExecStop=/bin/sh -lc "$compose_service_cmd down"
TimeoutStartSec=300 TimeoutStartSec=300
User=root User=root
@ -2006,7 +2111,12 @@ EOF
echo "" echo ""
echo -e "${WHITE}🐳 Docker контейнеры:${NC}" echo -e "${WHITE}🐳 Docker контейнеры:${NC}"
docker-compose ps --format "table {{.Name}}\t{{.State}}\t{{.Ports}}" init_compose_cmd
if $COMPOSE_CMD ps --format "table {{.Name}}\t{{.State}}\t{{.Ports}}" >/dev/null 2>&1; then
$COMPOSE_CMD ps --format "table {{.Name}}\t{{.State}}\t{{.Ports}}"
else
$COMPOSE_CMD ps || true
fi
echo "" echo ""
echo -e "${WHITE}⚙️ Systemd сервис:${NC}" echo -e "${WHITE}⚙️ Systemd сервис:${NC}"
@ -2025,7 +2135,7 @@ EOF
if [ "$ALLOW_INCOMING" = "true" ]; then if [ "$ALLOW_INCOMING" = "true" ]; then
PUBLIC_IP=$(curl -s ifconfig.me 2>/dev/null || echo "неизвестен") PUBLIC_IP=$(curl -s ifconfig.me 2>/dev/null || echo "неизвестен")
echo -e " Публичный IP: ${YELLOW}$PUBLIC_IP${NC}" echo -e " Публичный IP: ${YELLOW}$PUBLIC_IP${NC}"
if netstat -tlnp 2>/dev/null | grep -q ":8000 "; then if (has_cmd ss && ss -ltnp 2>/dev/null | grep -q ":8000 ") || (has_cmd netstat && netstat -tlnp 2>/dev/null | grep -q ":8000 "); then
echo -e " API порт 8000: ${GREEN}✅ открыт${NC}" echo -e " API порт 8000: ${GREEN}✅ открыт${NC}"
else else
echo -e " API порт 8000: ${RED}❌ недоступен${NC}" echo -e " API порт 8000: ${RED}❌ недоступен${NC}"
@ -2114,7 +2224,7 @@ EOF
echo -e " ${BLUE}systemctl status my-network${NC} # Статус" echo -e " ${BLUE}systemctl status my-network${NC} # Статус"
echo "" echo ""
echo -e "${WHITE}📊 Мониторинг:${NC}" echo -e "${WHITE}📊 Мониторинг:${NC}"
echo -e " ${BLUE}docker-compose -f $PROJECT_DIR/my-network/docker-compose.yml logs -f${NC}" echo -e " ${BLUE}$COMPOSE_CMD -f $PROJECT_DIR/my-network/docker-compose.yml logs -f${NC}"
echo -e " ${BLUE}curl http://localhost:8000/api/v3/node/status | jq${NC}" echo -e " ${BLUE}curl http://localhost:8000/api/v3/node/status | jq${NC}"
echo -e " ${BLUE}curl http://localhost:8000/api/v3/network/stats | jq${NC}" echo -e " ${BLUE}curl http://localhost:8000/api/v3/network/stats | jq${NC}"
echo "" echo ""
@ -2173,7 +2283,7 @@ Management Commands:
- Start: systemctl start my-network - Start: systemctl start my-network
- Stop: systemctl stop my-network - Stop: systemctl stop my-network
- Status: systemctl status my-network - Status: systemctl status my-network
- Logs: docker-compose -f $PROJECT_DIR/my-network/docker-compose.yml logs -f - Logs: $COMPOSE_CMD -f $PROJECT_DIR/my-network/docker-compose.yml logs -f
Telegram Bots: Telegram Bots:
- Main Bot: $([ -n "$TELEGRAM_API_KEY" ] && echo "enabled" || echo "disabled") - Main Bot: $([ -n "$TELEGRAM_API_KEY" ] && echo "enabled" || echo "disabled")
@ -2194,6 +2304,7 @@ main() {
install_docker install_docker
create_directories create_directories
setup_project setup_project
patch_app_routes
build_converter_image build_converter_image
setup_nginx setup_nginx
generate_config generate_config
@ -2207,6 +2318,7 @@ main() {
# Обработка ошибок # Обработка ошибок
error_handler() { error_handler() {
set +e
log_error "Ошибка на строке $1. Код выхода: $2" log_error "Ошибка на строке $1. Код выхода: $2"
log_error "Установка прервана" log_error "Установка прервана"
@ -2214,7 +2326,10 @@ error_handler() {
if [ -d "$PROJECT_DIR/my-network" ]; then if [ -d "$PROJECT_DIR/my-network" ]; then
log_info "Логи для диагностики:" log_info "Логи для диагностики:"
cd "$PROJECT_DIR/my-network" cd "$PROJECT_DIR/my-network"
docker-compose logs --tail=50 init_compose_cmd
if [ -n "$COMPOSE_CMD" ]; then
$COMPOSE_CMD logs --tail=50 || true
fi
fi fi
exit $2 exit $2