320 lines
8.9 KiB
Bash
320 lines
8.9 KiB
Bash
#!/bin/bash
|
||
|
||
# MY Network Direct Setup - для работы с файлами в /home/service
|
||
# Упрощенная версия без лишних проверок
|
||
|
||
set -e
|
||
|
||
echo "🚀 MY Network Direct Setup"
|
||
echo "========================="
|
||
echo "Работаем с файлами в /home/service"
|
||
echo "Домен: my-public-node-3.projscale.dev"
|
||
echo ""
|
||
|
||
# Проверка что мы root
|
||
if [[ $EUID -ne 0 ]]; then
|
||
echo "❌ Запустите от root: sudo bash setup_server_direct.sh"
|
||
exit 1
|
||
fi
|
||
|
||
DOMAIN="my-public-node-3.projscale.dev"
|
||
EMAIL="admin@projscale.dev"
|
||
|
||
# Переход в директорию проекта
|
||
cd /home/service
|
||
|
||
echo "📁 Содержимое /home/service:"
|
||
ls -la
|
||
|
||
# Обновление системы быстро
|
||
echo "🔄 Быстрое обновление системы..."
|
||
apt update
|
||
|
||
# Установка только необходимого
|
||
echo "📦 Установка базовых пакетов..."
|
||
apt install -y \
|
||
python3 \
|
||
python3-pip \
|
||
python3-venv \
|
||
nginx \
|
||
ufw \
|
||
curl \
|
||
wget
|
||
|
||
# Переход в my-uploader-bot если есть
|
||
if [[ -d "my-uploader-bot" ]]; then
|
||
cd my-uploader-bot
|
||
echo "✅ Найдена директория my-uploader-bot"
|
||
else
|
||
echo "❌ Директория my-uploader-bot не найдена!"
|
||
echo "Содержимое /home/service:"
|
||
ls -la /home/service/
|
||
exit 1
|
||
fi
|
||
|
||
# Создание Python venv
|
||
echo "🐍 Создание Python окружения..."
|
||
python3 -m venv venv
|
||
source venv/bin/activate
|
||
|
||
# Установка базовых пакетов Python
|
||
echo "📦 Установка Python пакетов..."
|
||
pip install --upgrade pip
|
||
pip install fastapi uvicorn sanic requests python-dotenv
|
||
|
||
# Создание минимального приложения MY Network
|
||
echo "🏗️ Создание минимального MY Network приложения..."
|
||
|
||
mkdir -p app/api
|
||
|
||
# Простое FastAPI приложение
|
||
cat > app/main.py << 'EOF'
|
||
#!/usr/bin/env python3
|
||
"""MY Network Bootstrap Node - Minimal Version"""
|
||
|
||
import os
|
||
import json
|
||
from datetime import datetime
|
||
from fastapi import FastAPI
|
||
from fastapi.responses import JSONResponse, HTMLResponse
|
||
from fastapi.middleware.cors import CORSMiddleware
|
||
import uvicorn
|
||
|
||
app = FastAPI(
|
||
title="MY Network Bootstrap Node",
|
||
description="MY Network v2.0 Bootstrap Node - Minimal",
|
||
version="2.0.0"
|
||
)
|
||
|
||
# CORS
|
||
app.add_middleware(
|
||
CORSMiddleware,
|
||
allow_origins=["*"],
|
||
allow_credentials=True,
|
||
allow_methods=["*"],
|
||
allow_headers=["*"],
|
||
)
|
||
|
||
NODE_ID = f"bootstrap-{int(datetime.now().timestamp())}"
|
||
DOMAIN = "my-public-node-3.projscale.dev"
|
||
|
||
@app.get("/")
|
||
async def root():
|
||
return {"message": "MY Network Bootstrap Node v2.0", "status": "active"}
|
||
|
||
@app.get("/api/my/health")
|
||
async def health_check():
|
||
return JSONResponse({
|
||
"status": "healthy",
|
||
"node_id": NODE_ID,
|
||
"node_type": "bootstrap",
|
||
"domain": DOMAIN,
|
||
"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": 443,
|
||
"ssl": True,
|
||
"public": True,
|
||
"region": "eu-central",
|
||
"capacity": "high",
|
||
"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": 443,
|
||
"ssl": True,
|
||
"public": True,
|
||
"region": "eu-central",
|
||
"capacity": "high",
|
||
"services": ["api", "monitor"],
|
||
"last_seen": datetime.utcnow().isoformat()
|
||
}
|
||
],
|
||
"network_config": {
|
||
"protocol_version": "2.0",
|
||
"max_peers": 100,
|
||
"sync_interval": 300
|
||
},
|
||
"api_endpoints": {
|
||
"base_url": f"https://{DOMAIN}",
|
||
"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</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; }}
|
||
</style>
|
||
</head>
|
||
<body>
|
||
<h1>🚀 MY Network Bootstrap Node Monitor</h1>
|
||
<div class="box">
|
||
<h3 class="status">Node Status: ACTIVE</h3>
|
||
<p class="info">Node ID: {NODE_ID}</p>
|
||
<p class="info">Domain: {DOMAIN}</p>
|
||
<p class="info">Type: Bootstrap Primary</p>
|
||
<p class="info">Version: 2.0.0</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: 100</p>
|
||
<p class="info">Public Access: Enabled</p>
|
||
<p class="info">SSL: Required</p>
|
||
</div>
|
||
<script>
|
||
setTimeout(() => location.reload(), 30000);
|
||
</script>
|
||
</body>
|
||
</html>
|
||
"""
|
||
return HTMLResponse(content=html)
|
||
|
||
if __name__ == "__main__":
|
||
print(f"🚀 Starting MY Network Bootstrap Node")
|
||
print(f"Domain: {DOMAIN}")
|
||
print(f"Node ID: {NODE_ID}")
|
||
uvicorn.run(app, host="0.0.0.0", port=15100)
|
||
EOF
|
||
|
||
# Создание systemd сервиса
|
||
echo "⚙️ Создание systemd сервиса..."
|
||
cat > /etc/systemd/system/my-network.service << EOF
|
||
[Unit]
|
||
Description=MY Network Bootstrap Node
|
||
After=network.target
|
||
|
||
[Service]
|
||
Type=simple
|
||
User=service
|
||
Group=service
|
||
WorkingDirectory=/home/service/my-uploader-bot
|
||
Environment=PATH=/home/service/my-uploader-bot/venv/bin
|
||
ExecStart=/home/service/my-uploader-bot/venv/bin/python app/main.py
|
||
Restart=always
|
||
RestartSec=5
|
||
|
||
[Install]
|
||
WantedBy=multi-user.target
|
||
EOF
|
||
|
||
# Права доступа
|
||
chown -R service:service /home/service/
|
||
|
||
# Настройка nginx
|
||
echo "🌐 Настройка nginx..."
|
||
cat > /etc/nginx/sites-available/my-network << EOF
|
||
server {
|
||
listen 80;
|
||
server_name $DOMAIN;
|
||
return 301 https://\$server_name\$request_uri;
|
||
}
|
||
|
||
server {
|
||
listen 443 ssl http2;
|
||
server_name $DOMAIN;
|
||
|
||
# Временный самоподписанный сертификат
|
||
ssl_certificate /etc/ssl/certs/ssl-cert-snakeoil.pem;
|
||
ssl_certificate_key /etc/ssl/private/ssl-cert-snakeoil.key;
|
||
|
||
# Security headers
|
||
add_header X-Frame-Options DENY;
|
||
add_header X-Content-Type-Options nosniff;
|
||
add_header X-MY-Network-Version "2.0";
|
||
|
||
server_tokens off;
|
||
|
||
# Main application
|
||
location / {
|
||
proxy_pass http://127.0.0.1:15100;
|
||
proxy_set_header Host \$host;
|
||
proxy_set_header X-Real-IP \$remote_addr;
|
||
proxy_set_header X-Forwarded-For \$proxy_add_x_forwarded_for;
|
||
proxy_set_header X-Forwarded-Proto \$scheme;
|
||
|
||
# CORS
|
||
add_header Access-Control-Allow-Origin "*";
|
||
add_header Access-Control-Allow-Methods "GET, POST, OPTIONS";
|
||
add_header Access-Control-Allow-Headers "Content-Type, Authorization";
|
||
}
|
||
}
|
||
EOF
|
||
|
||
# Активация сайта
|
||
ln -sf /etc/nginx/sites-available/my-network /etc/nginx/sites-enabled/
|
||
rm -f /etc/nginx/sites-enabled/default
|
||
|
||
# Проверка nginx
|
||
nginx -t
|
||
|
||
# Простой firewall
|
||
echo "🔥 Настройка firewall..."
|
||
ufw --force reset
|
||
ufw default deny incoming
|
||
ufw default allow outgoing
|
||
|
||
# SSH
|
||
ufw allow 22/tcp comment 'SSH'
|
||
|
||
# HTTP/HTTPS
|
||
ufw allow 80/tcp comment 'HTTP'
|
||
ufw allow 443/tcp comment 'HTTPS'
|
||
|
||
ufw --force enable
|
||
|
||
# Запуск сервисов
|
||
echo "🚀 Запуск сервисов..."
|
||
systemctl daemon-reload
|
||
systemctl enable my-network
|
||
systemctl start my-network
|
||
systemctl enable nginx
|
||
systemctl start nginx
|
||
|
||
# Проверка
|
||
sleep 5
|
||
echo ""
|
||
echo "✅ MY Network Bootstrap Node запущен!"
|
||
echo "=================================="
|
||
echo "🌐 Домен: https://$DOMAIN"
|
||
echo "🔌 Локальный порт: 15100"
|
||
echo ""
|
||
echo "🔍 Проверка:"
|
||
echo "systemctl status my-network"
|
||
echo "curl http://localhost:15100/api/my/health"
|
||
echo ""
|
||
echo "🎯 Bootstrap узел готов к работе!" |