#!/bin/bash
# MY Network Minimal Setup - только встроенные модули Python
# Без pip, без внешних зависимостей
set -e
echo "🚀 MY Network Minimal 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; }
# Создание минимального MY Network приложения
echo "🏗️ Создание MY Network приложения (только встроенные модули)..."
cat > app/main.py << 'EOF'
#!/usr/bin/env python3
"""MY Network Bootstrap Node - Minimal Version (только встроенные модули)"""
import os
import json
import sys
import logging
import time
from datetime import datetime
from http.server import HTTPServer, BaseHTTPRequestHandler
from urllib.parse import urlparse
import threading
# Настройка логирования
logging.basicConfig(
level=logging.INFO,
format='%(asctime)s - %(name)s - %(levelname)s - %(message)s',
handlers=[
logging.FileHandler('logs/my-network.log', encoding='utf-8'),
logging.StreamHandler()
]
)
logger = logging.getLogger("MY-Network")
NODE_ID = f"bootstrap-minimal-{int(datetime.now().timestamp())}"
DOMAIN = "my-public-node-3.projscale.dev"
PORT = 15100
class MyNetworkHandler(BaseHTTPRequestHandler):
def do_GET(self):
try:
parsed_path = urlparse(self.path)
path = parsed_path.path
# Маршруты
if path == '/':
self.send_json_response({"message": "MY Network Bootstrap Node v2.0 - Minimal", "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": "minimal",
"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": "minimal",
"mode": "minimal",
"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": "minimal",
"mode": "minimal",
"services": ["api", "monitor"],
"last_seen": datetime.utcnow().isoformat()
}
],
"network_config": {
"protocol_version": "2.0",
"max_peers": 5,
"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.send_header('Content-type', 'application/json')
self.end_headers()
error_response = {"error": "Not Found", "path": path}
self.wfile.write(json.dumps(error_response).encode('utf-8'))
except Exception as e:
logger.error(f"Error handling request: {e}")
self.send_response(500)
self.end_headers()
self.wfile.write(b'Internal Server Error')
def send_json_response(self, data):
try:
self.send_response(200)
self.send_header('Content-type', 'application/json; charset=utf-8')
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.send_header('Server', 'MY-Network-Bootstrap/2.0')
self.end_headers()
json_data = json.dumps(data, indent=2, ensure_ascii=False)
self.wfile.write(json_data.encode('utf-8'))
except Exception as e:
logger.error(f"Error sending JSON response: {e}")
def send_html_response(self, html):
try:
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.send_header('Server', 'MY-Network-Bootstrap/2.0')
self.end_headers()
self.wfile.write(html.encode('utf-8'))
except Exception as e:
logger.error(f"Error sending HTML response: {e}")
def get_monitor_html(self):
uptime = int(time.time() - start_time)
uptime_str = f"{uptime // 3600}h {(uptime % 3600) // 60}m {uptime % 60}s"
return f"""
MY Network Bootstrap Monitor - Minimal
███╗ ███╗██╗ ██╗ ███╗ ██╗███████╗████████╗██╗ ██╗ ██████╗ ██████╗ ██╗ ██╗
████╗ ████║╚██╗ ██╔╝ ████╗ ██║██╔════╝╚══██╔══╝██║ ██║██╔═══██╗██╔══██╗██║ ██╔╝
██╔████╔██║ ╚████╔╝ ██╔██╗ ██║█████╗ ██║ ██║ █╗ ██║██║ ██║██████╔╝█████╔╝
██║╚██╔╝██║ ╚██╔╝ ██║╚██╗██║██╔══╝ ██║ ██║███╗██║██║ ██║██╔══██╗██╔═██╗
██║ ╚═╝ ██║ ██║ ██║ ╚████║███████╗ ██║ ╚███╔███╔╝╚██████╔╝██║ ██║██║ ██╗
╚═╝ ╚═╝ ╚═╝ ╚═╝ ╚═══╝╚══════╝ ╚═╝ ╚══╝╚══╝ ╚═════╝ ╚═╝ ╚═╝╚═╝ ╚═╝
🚀 MY Network Bootstrap Node Monitor
🟢 Node Status: ACTIVE (Minimal Mode)
🆔 Node ID: {NODE_ID}
🌐 Domain: {DOMAIN}
🔌 Port: {PORT}
📡 Type: Bootstrap Primary
🏷️ Version: 2.0.0
⚙️ Mode: Minimal HTTP Server
🛠️ Services: API, Monitor
⏱️ Uptime: {uptime_str}
🕐 Last Update: {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}
🌐 Network Configuration
📋 Protocol Version: 2.0
👥 Max Peers: 5
🔓 Public Access: Enabled
⚠️ SSL: Disabled (Minimal Mode)
🔄 Sync Interval: 300s
⚠️ Minimal Mode
🔧 Сервис запущен в минимальном режиме
📦 Использует только встроенные модули Python
🚫 Без внешних зависимостей
🌍 Доступ: http://{DOMAIN}:{PORT}
⏰ Автообновление каждые 30 секунд
"""
def log_message(self, format, *args):
client_ip = self.address_string()
message = format % args
logger.info(f"{client_ip} - {message}")
def do_OPTIONS(self):
self.send_response(200)
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.end_headers()
# Глобальная переменная для времени запуска
start_time = time.time()
def start_server():
global start_time
start_time = time.time()
logger.info("=" * 50)
logger.info("🚀 MY Network Bootstrap Node - Minimal Mode")
logger.info("=" * 50)
logger.info(f"🌐 Domain: {DOMAIN}")
logger.info(f"🔌 Port: {PORT}")
logger.info(f"🆔 Node ID: {NODE_ID}")
logger.info(f"⚙️ Mode: Minimal HTTP Server")
logger.info(f"🌍 Access: http://0.0.0.0:{PORT}")
logger.info(f"📊 Health: http://0.0.0.0:{PORT}/api/my/health")
logger.info(f"🖥️ Monitor: http://0.0.0.0:{PORT}/api/my/monitor/")
logger.info("=" * 50)
try:
# Создание HTTP сервера
server_address = ("0.0.0.0", PORT)
httpd = HTTPServer(server_address, MyNetworkHandler)
logger.info(f"✅ Server started successfully")
logger.info(f"🎯 MY Network Bootstrap Node is ready!")
# Запуск сервера
httpd.serve_forever()
except KeyboardInterrupt:
logger.info("🛑 Server stopped by user")
except Exception as e:
logger.error(f"❌ Server error: {e}")
raise
if __name__ == "__main__":
try:
start_server()
except KeyboardInterrupt:
print("\n🛑 Stopping server...")
sys.exit(0)
except Exception as e:
print(f"❌ Fatal error: {e}")
sys.exit(1)
EOF
# Создание скрипта запуска
cat > start_my_network.sh << 'EOF'
#!/bin/bash
cd /home/service/my-uploader-bot
echo "🚀 Запуск MY Network Bootstrap Node (Minimal Mode)"
echo "==============================================="
echo ""
# Создание директории для логов
mkdir -p logs
# Запуск приложения
echo "▶️ Запуск сервера..."
python3 app/main.py
EOF
chmod +x start_my_network.sh
# Создание скрипта для фонового запуска
cat > run_my_network.sh << 'EOF'
#!/bin/bash
# Проверка, запущен ли MY Network
if ! pgrep -f "python3 app/main.py" > /dev/null; then
echo "$(date): Запуск MY Network" >> /home/service/my-uploader-bot/logs/cron.log
cd /home/service/my-uploader-bot
nohup python3 app/main.py >> logs/app.log 2>&1 &
PID=$!
echo "$(date): MY Network запущен (PID: $PID)" >> /home/service/my-uploader-bot/logs/cron.log
echo "MY Network запущен (PID: $PID)"
else
echo "$(date): MY Network уже запущен" >> /home/service/my-uploader-bot/logs/cron.log
echo "MY Network уже запущен"
fi
EOF
chmod +x run_my_network.sh
# Создание скрипта остановки
cat > stop_my_network.sh << 'EOF'
#!/bin/bash
echo "🛑 Остановка MY Network..."
if pgrep -f "python3 app/main.py" > /dev/null; then
pkill -f "python3 app/main.py"
echo "✅ MY Network остановлен"
echo "$(date): MY Network остановлен" >> /home/service/my-uploader-bot/logs/cron.log
else
echo "⚠️ MY Network не запущен"
fi
EOF
chmod +x stop_my_network.sh
# Создание скрипта проверки статуса
cat > status_my_network.sh << 'EOF'
#!/bin/bash
echo "📊 Статус MY Network Bootstrap Node"
echo "================================="
if pgrep -f "python3 app/main.py" > /dev/null; then
PID=$(pgrep -f "python3 app/main.py")
echo "✅ MY Network запущен (PID: $PID)"
echo "🌐 Доступ: http://my-public-node-3.projscale.dev:15100"
echo "📊 Health: http://my-public-node-3.projscale.dev:15100/api/my/health"
echo "🖥️ Monitor: http://my-public-node-3.projscale.dev:15100/api/my/monitor/"
echo ""
echo "📈 Процесс:"
ps aux | grep "python3 app/main.py" | grep -v grep
echo ""
echo "🔌 Порт 15100:"
netstat -tulpn 2>/dev/null | grep :15100 || echo "netstat недоступен"
else
echo "❌ MY Network не запущен"
fi
echo ""
echo "📝 Последние логи:"
if [[ -f logs/my-network.log ]]; then
tail -5 logs/my-network.log
else
echo "Лог файл не найден"
fi
EOF
chmod +x status_my_network.sh
# Добавление в crontab
echo "📅 Настройка автозапуска..."
(crontab -l 2>/dev/null | grep -v "run_my_network.sh"; echo "*/5 * * * * /home/service/my-uploader-bot/run_my_network.sh") | crontab -
echo ""
echo "✅ MY Network Bootstrap Node установлен!"
echo "======================================="
echo ""
echo "🚀 Команды управления:"
echo " cd /home/service/my-uploader-bot"
echo " ./start_my_network.sh # Запуск в терминале"
echo " ./run_my_network.sh # Запуск в фоне"
echo " ./stop_my_network.sh # Остановка"
echo " ./status_my_network.sh # Проверка статуса"
echo ""
echo "🌐 Доступ к сервису:"
echo " http://my-public-node-3.projscale.dev:15100"
echo " http://my-public-node-3.projscale.dev:15100/api/my/health"
echo " http://my-public-node-3.projscale.dev:15100/api/my/monitor/"
echo ""
echo "📝 Логи:"
echo " tail -f logs/my-network.log # Основной лог"
echo " tail -f logs/app.log # Лог приложения"
echo " tail -f logs/cron.log # Лог cron"
echo ""
echo "⚡ Автозапуск настроен через cron (каждые 5 минут)"
echo ""
echo "🎯 MY Network Bootstrap Node готов к работе!"
echo ""
echo "▶️ Запустить сейчас? Выполните:"
echo " ./run_my_network.sh"