#!/bin/bash # MY Network Simple Setup - без venv, прямо с системным Python # Самый простой способ запуска set -e echo "🚀 MY Network Simple Setup" echo "==========================" echo "Пользователь: $(whoami)" echo "Директория: $(pwd)" echo "" # Переход в my-uploader-bot if [[ -d "my-uploader-bot" ]]; then cd my-uploader-bot echo "✅ Директория my-uploader-bot найдена" else echo "❌ Директория my-uploader-bot не найдена!" echo "Содержимое текущей директории:" ls -la exit 1 fi # Создание директорий mkdir -p app/api mkdir -p logs # Проверка Python echo "🐍 Проверка Python..." python3 --version || { echo "❌ Python3 не найден"; exit 1; } # Установка пакетов через pip --user echo "📦 Установка Python пакетов (--user)..." python3 -m pip install --user fastapi uvicorn requests python-dotenv # Создание упрощенного MY Network приложения echo "🏗️ Создание MY Network приложения..." cat > app/main.py << 'EOF' #!/usr/bin/env python3 """MY Network Bootstrap Node - Simple Version""" import os import json import sys import logging from datetime import datetime from typing import Dict, Any # Простой HTTP сервер без FastAPI try: from http.server import HTTPServer, BaseHTTPRequestHandler from urllib.parse import urlparse, parse_qs import socketserver import threading USE_SIMPLE_SERVER = True except ImportError: USE_SIMPLE_SERVER = True # Настройка логирования logging.basicConfig( level=logging.INFO, format='%(asctime)s - %(name)s - %(levelname)s - %(message)s', handlers=[ logging.FileHandler('logs/my-network.log'), logging.StreamHandler() ] ) logger = logging.getLogger("MY-Network") NODE_ID = f"bootstrap-simple-{int(datetime.now().timestamp())}" DOMAIN = "my-public-node-3.projscale.dev" PORT = 15100 class MyNetworkHandler(BaseHTTPRequestHandler): def do_GET(self): parsed_path = urlparse(self.path) path = parsed_path.path # Маршруты if path == '/': self.send_json_response({"message": "MY Network Bootstrap Node v2.0 - Simple", "status": "active"}) elif path == '/api/my/health': self.send_json_response({ "status": "healthy", "node_id": NODE_ID, "node_type": "bootstrap", "domain": DOMAIN, "port": PORT, "mode": "simple", "timestamp": datetime.utcnow().isoformat(), "services": ["api", "monitor"], "version": "2.0.0" }) elif path == '/api/my/node/info': self.send_json_response({ "node_id": NODE_ID, "node_type": "bootstrap", "domain": DOMAIN, "port": PORT, "ssl": False, "public": True, "region": "eu-central", "capacity": "low", "mode": "simple", "services": ["api", "monitor"], "protocol_version": "2.0", "last_seen": datetime.utcnow().isoformat() }) elif path == '/api/my/bootstrap/config': config = { "version": "2.0", "network_id": "my-network-main", "bootstrap_nodes": [ { "id": NODE_ID, "host": DOMAIN, "port": PORT, "ssl": False, "public": True, "region": "eu-central", "capacity": "low", "mode": "simple", "services": ["api", "monitor"], "last_seen": datetime.utcnow().isoformat() } ], "network_config": { "protocol_version": "2.0", "max_peers": 10, "sync_interval": 300 }, "api_endpoints": { "base_url": f"http://{DOMAIN}:{PORT}", "health": "/api/my/health", "node_info": "/api/my/node/info", "bootstrap": "/api/my/bootstrap/config" } } self.send_json_response(config) elif path == '/api/my/monitor/' or path == '/api/my/monitor': self.send_html_response(self.get_monitor_html()) else: self.send_response(404) self.end_headers() self.wfile.write(b'Not Found') def send_json_response(self, data: Dict[Any, Any]): self.send_response(200) self.send_header('Content-type', 'application/json') self.send_header('Access-Control-Allow-Origin', '*') self.send_header('Access-Control-Allow-Methods', 'GET, POST, OPTIONS') self.send_header('Access-Control-Allow-Headers', 'Content-Type, Authorization') self.send_header('X-MY-Network-Version', '2.0') self.end_headers() json_data = json.dumps(data, indent=2) self.wfile.write(json_data.encode('utf-8')) def send_html_response(self, html: str): self.send_response(200) self.send_header('Content-type', 'text/html; charset=utf-8') self.send_header('Access-Control-Allow-Origin', '*') self.send_header('X-MY-Network-Version', '2.0') self.end_headers() self.wfile.write(html.encode('utf-8')) def get_monitor_html(self) -> str: return f"""
Node ID: {NODE_ID}
Domain: {DOMAIN}
Port: {PORT}
Type: Bootstrap Primary
Version: 2.0.0
Mode: Simple HTTP Server
Services: API, Monitor
Last Update: {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}
Protocol Version: 2.0
Max Peers: 10
Public Access: Enabled
SSL: Disabled (Simple Mode)
Сервис запущен в упрощенном режиме
Использует встроенный HTTP сервер Python
Доступ: http://{DOMAIN}:{PORT}