291 lines
9.0 KiB
Bash
291 lines
9.0 KiB
Bash
#!/bin/bash
|
|
|
|
# MY Network User Setup - без sudo, только для пользователя service
|
|
# Запуск MY Network в пользовательском пространстве
|
|
|
|
set -e
|
|
|
|
echo "🚀 MY Network User Setup (без sudo)"
|
|
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
|
|
|
|
# Создание Python venv
|
|
echo "🐍 Создание Python окружения..."
|
|
python3 -m venv venv
|
|
source venv/bin/activate
|
|
|
|
# Обновление pip
|
|
echo "📦 Обновление pip..."
|
|
pip install --upgrade pip
|
|
|
|
# Установка базовых пакетов
|
|
echo "📦 Установка Python пакетов..."
|
|
pip install fastapi uvicorn sanic requests python-dotenv
|
|
|
|
# Создание директорий
|
|
mkdir -p app/api
|
|
mkdir -p logs
|
|
|
|
# Создание упрощенного MY Network приложения
|
|
echo "🏗️ Создание MY Network приложения..."
|
|
|
|
cat > app/main.py << 'EOF'
|
|
#!/usr/bin/env python3
|
|
"""MY Network Bootstrap Node - User Space Version"""
|
|
|
|
import os
|
|
import json
|
|
import asyncio
|
|
from datetime import datetime
|
|
from fastapi import FastAPI
|
|
from fastapi.responses import JSONResponse, HTMLResponse
|
|
from fastapi.middleware.cors import CORSMiddleware
|
|
import uvicorn
|
|
import logging
|
|
|
|
# Настройка логирования
|
|
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")
|
|
|
|
app = FastAPI(
|
|
title="MY Network Bootstrap Node",
|
|
description="MY Network v2.0 Bootstrap Node - User Space",
|
|
version="2.0.0"
|
|
)
|
|
|
|
# CORS
|
|
app.add_middleware(
|
|
CORSMiddleware,
|
|
allow_origins=["*"],
|
|
allow_credentials=True,
|
|
allow_methods=["*"],
|
|
allow_headers=["*"],
|
|
)
|
|
|
|
NODE_ID = f"bootstrap-user-{int(datetime.now().timestamp())}"
|
|
DOMAIN = "my-public-node-3.projscale.dev"
|
|
PORT = 15100
|
|
|
|
@app.on_event("startup")
|
|
async def startup():
|
|
logger.info(f"🚀 MY Network Bootstrap Node запущен")
|
|
logger.info(f"Node ID: {NODE_ID}")
|
|
logger.info(f"Domain: {DOMAIN}")
|
|
logger.info(f"Port: {PORT}")
|
|
|
|
@app.get("/")
|
|
async def root():
|
|
return {"message": "MY Network Bootstrap Node v2.0 - User Space", "status": "active"}
|
|
|
|
@app.get("/api/my/health")
|
|
async def health_check():
|
|
return JSONResponse({
|
|
"status": "healthy",
|
|
"node_id": NODE_ID,
|
|
"node_type": "bootstrap",
|
|
"domain": DOMAIN,
|
|
"port": PORT,
|
|
"mode": "user-space",
|
|
"timestamp": datetime.utcnow().isoformat(),
|
|
"services": ["api", "monitor"],
|
|
"version": "2.0.0"
|
|
})
|
|
|
|
@app.get("/api/my/node/info")
|
|
async def node_info():
|
|
return JSONResponse({
|
|
"node_id": NODE_ID,
|
|
"node_type": "bootstrap",
|
|
"domain": DOMAIN,
|
|
"port": PORT,
|
|
"ssl": False,
|
|
"public": True,
|
|
"region": "eu-central",
|
|
"capacity": "medium",
|
|
"mode": "user-space",
|
|
"services": ["api", "monitor"],
|
|
"protocol_version": "2.0",
|
|
"last_seen": datetime.utcnow().isoformat()
|
|
})
|
|
|
|
@app.get("/api/my/bootstrap/config")
|
|
async def 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": "medium",
|
|
"mode": "user-space",
|
|
"services": ["api", "monitor"],
|
|
"last_seen": datetime.utcnow().isoformat()
|
|
}
|
|
],
|
|
"network_config": {
|
|
"protocol_version": "2.0",
|
|
"max_peers": 50,
|
|
"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"
|
|
}
|
|
}
|
|
return JSONResponse(config)
|
|
|
|
@app.get("/api/my/monitor/")
|
|
async def monitor_dashboard():
|
|
html = f"""
|
|
<!DOCTYPE html>
|
|
<html>
|
|
<head>
|
|
<title>MY Network Bootstrap Monitor - User Space</title>
|
|
<meta charset="utf-8">
|
|
<style>
|
|
body {{ font-family: 'Courier New', monospace; background: #000; color: #0f0; padding: 20px; }}
|
|
h1 {{ color: #ff0; text-align: center; }}
|
|
.box {{ border: 1px solid #0f0; padding: 15px; margin: 10px 0; }}
|
|
.status {{ color: #0f0; }}
|
|
.info {{ color: #00f; }}
|
|
.warning {{ color: #f80; }}
|
|
</style>
|
|
</head>
|
|
<body>
|
|
<h1>🚀 MY Network Bootstrap Node Monitor</h1>
|
|
<div class="box">
|
|
<h3 class="status">Node Status: ACTIVE (User Space)</h3>
|
|
<p class="info">Node ID: {NODE_ID}</p>
|
|
<p class="info">Domain: {DOMAIN}</p>
|
|
<p class="info">Port: {PORT}</p>
|
|
<p class="info">Type: Bootstrap Primary</p>
|
|
<p class="info">Version: 2.0.0</p>
|
|
<p class="info">Mode: User Space</p>
|
|
<p class="info">Services: API, Monitor</p>
|
|
<p class="info">Last Update: {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}</p>
|
|
</div>
|
|
<div class="box">
|
|
<h3 class="status">Network Configuration</h3>
|
|
<p class="info">Protocol Version: 2.0</p>
|
|
<p class="info">Max Peers: 50</p>
|
|
<p class="info">Public Access: Enabled</p>
|
|
<p class="warning">SSL: Disabled (User Space Mode)</p>
|
|
</div>
|
|
<div class="box">
|
|
<h3 class="warning">⚠️ User Space Mode</h3>
|
|
<p class="warning">Сервис запущен в пользовательском режиме</p>
|
|
<p class="warning">Для полной функциональности требуются root права</p>
|
|
<p class="info">Доступ: http://{DOMAIN}:{PORT}</p>
|
|
</div>
|
|
<script>
|
|
setTimeout(() => location.reload(), 30000);
|
|
</script>
|
|
</body>
|
|
</html>
|
|
"""
|
|
return HTMLResponse(content=html)
|
|
|
|
if __name__ == "__main__":
|
|
print(f"🚀 Starting MY Network Bootstrap Node - User Space")
|
|
print(f"Domain: {DOMAIN}")
|
|
print(f"Port: {PORT}")
|
|
print(f"Node ID: {NODE_ID}")
|
|
print(f"Mode: User Space (no root required)")
|
|
print(f"Access: http://{DOMAIN}:{PORT}")
|
|
print("")
|
|
uvicorn.run(app, host="0.0.0.0", port=PORT)
|
|
EOF
|
|
|
|
# Создание скрипта запуска
|
|
cat > start_my_network.sh << 'EOF'
|
|
#!/bin/bash
|
|
|
|
cd /home/service/my-uploader-bot
|
|
source venv/bin/activate
|
|
|
|
echo "🚀 Запуск MY Network Bootstrap Node (User Space)"
|
|
echo "==============================================="
|
|
echo ""
|
|
|
|
# Создание директории для логов
|
|
mkdir -p logs
|
|
|
|
# Запуск приложения
|
|
python app/main.py
|
|
EOF
|
|
|
|
chmod +x start_my_network.sh
|
|
|
|
# Создание cron задачи для автозапуска
|
|
echo "⏰ Создание задачи для автозапуска..."
|
|
cat > run_my_network.sh << 'EOF'
|
|
#!/bin/bash
|
|
|
|
# Проверка, запущен ли MY Network
|
|
if ! pgrep -f "python app/main.py" > /dev/null; then
|
|
echo "$(date): Запуск MY Network" >> /home/service/my-uploader-bot/logs/cron.log
|
|
cd /home/service/my-uploader-bot
|
|
source venv/bin/activate
|
|
nohup python app/main.py >> logs/app.log 2>&1 &
|
|
else
|
|
echo "$(date): MY Network уже запущен" >> /home/service/my-uploader-bot/logs/cron.log
|
|
fi
|
|
EOF
|
|
|
|
chmod +x run_my_network.sh
|
|
|
|
# Добавление в crontab
|
|
echo "📅 Добавление в crontab..."
|
|
(crontab -l 2>/dev/null; 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 ""
|
|
echo "🚀 Запуск в фоне:"
|
|
echo " ./run_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 ""
|
|
echo "⚠️ Примечание: Сервис работает в пользовательском режиме"
|
|
echo " Для полной функциональности требуются root права"
|
|
echo ""
|
|
echo "🎯 MY Network Bootstrap Node готов к работе!" |