uploader-bot/scripts/setup_user_service.sh

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 готов к работе!"