uploader-bot/scripts/setup_modules.sh

442 lines
13 KiB
Bash
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/bin/bash
# =============================================================================
# НАСТРОЙКА ДОПОЛНИТЕЛЬНЫХ МОДУЛЕЙ MY UPLOADER BOT
# =============================================================================
if [ $# -lt 1 ]; then
echo "Usage: $0 <project_dir>"
exit 1
fi
PROJECT_DIR="$1"
MODULES_DIR="$PROJECT_DIR/modules"
echo "Настройка дополнительных модулей в $MODULES_DIR..."
# Создание директории для модулей
mkdir -p "$MODULES_DIR"
cd "$MODULES_DIR"
# =============================================================================
# CONVERTER-MODULE (Конвертер медиа файлов)
# =============================================================================
echo "📦 Настройка converter-module..."
if [ ! -d "converter-module" ]; then
echo "Создание converter-module структуры..."
mkdir -p converter-module/{converter,logs,in_examples,out_examples,output}
# Создание основного файла converter-module
cat > "converter-module/app.py" << 'EOF'
#!/usr/bin/env python3
"""
MY UPLOADER BOT - CONVERTER MODULE
Конвертер медиа файлов для MY Network
"""
import os
import sys
import asyncio
import logging
from pathlib import Path
from fastapi import FastAPI, File, UploadFile, HTTPException
from fastapi.responses import JSONResponse, FileResponse
from fastapi.middleware.cors import CORSMiddleware
import uvicorn
# Настройка логирования
logging.basicConfig(
level=logging.INFO,
format='%(asctime)s - %(name)s - %(levelname)s - %(message)s',
handlers=[
logging.FileHandler('logs/converter.log'),
logging.StreamHandler()
]
)
logger = logging.getLogger(__name__)
app = FastAPI(
title="MY Converter Module",
description="Конвертер медиа файлов для MY Network",
version="1.0.0"
)
# CORS настройки
app.add_middleware(
CORSMiddleware,
allow_origins=["*"], # В продакшене ограничить
allow_credentials=True,
allow_methods=["*"],
allow_headers=["*"],
)
# Создание необходимых директорий
os.makedirs("output", exist_ok=True)
os.makedirs("logs", exist_ok=True)
@app.get("/")
async def root():
return {"message": "MY Converter Module", "status": "running"}
@app.get("/health")
async def health():
return {"status": "healthy", "module": "converter"}
@app.post("/convert/")
async def convert_file(file: UploadFile = File(...)):
"""Конвертация загруженного файла"""
try:
# Базовая обработка - в реальном проекте добавить ffmpeg/imagemagick
logger.info(f"Конвертация файла: {file.filename}")
# Сохранение входного файла
input_path = f"output/{file.filename}"
with open(input_path, "wb") as buffer:
content = await file.read()
buffer.write(content)
return JSONResponse({
"status": "success",
"message": f"Файл {file.filename} обработан",
"output_file": input_path,
"size": len(content)
})
except Exception as e:
logger.error(f"Ошибка конвертации: {e}")
raise HTTPException(status_code=500, detail=str(e))
@app.get("/status")
async def status():
"""Статус converter-module"""
return {
"module": "converter-module",
"status": "active",
"version": "1.0.0",
"supported_formats": ["mp4", "mp3", "jpg", "png", "gif"]
}
if __name__ == "__main__":
uvicorn.run(
"app:app",
host="0.0.0.0",
port=8080,
reload=False,
log_level="info"
)
EOF
# Создание requirements для converter-module
cat > "converter-module/requirements.txt" << 'EOF'
fastapi==0.104.1
uvicorn[standard]==0.24.0
python-multipart==0.0.6
Pillow==10.1.0
python-ffmpeg==2.0.12
EOF
# Создание Dockerfile для converter-module
cat > "converter-module/Dockerfile" << 'EOF'
FROM python:3.11-slim
# Установка ffmpeg и других утилит
RUN apt-get update && apt-get install -y \
ffmpeg \
imagemagick \
&& rm -rf /var/lib/apt/lists/*
WORKDIR /app
# Установка Python зависимостей
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
# Копирование кода
COPY . .
# Создание директорий
RUN mkdir -p output logs
EXPOSE 8080
CMD ["python", "app.py"]
EOF
echo "✅ converter-module создан"
else
echo " converter-module уже существует"
fi
# =============================================================================
# WEB2-CLIENT (Веб интерфейс)
# =============================================================================
echo "🌐 Настройка web2-client..."
if [ ! -d "web2-client" ]; then
echo "Создание web2-client структуры..."
mkdir -p web2-client/{public,src}
# Создание package.json
cat > "web2-client/package.json" << 'EOF'
{
"name": "my-uploader-web-client",
"version": "1.0.0",
"description": "Web client for MY Uploader Bot",
"main": "index.js",
"scripts": {
"start": "node server.js",
"dev": "node server.js",
"build": "echo 'Build completed'",
"test": "echo 'No tests specified'"
},
"dependencies": {
"express": "^4.18.2",
"cors": "^2.8.5",
"multer": "^1.4.5",
"axios": "^1.6.0"
},
"keywords": ["my-network", "uploader", "web-client"],
"author": "MY Network Team",
"license": "MIT"
}
EOF
# Создание простого Express сервера
cat > "web2-client/server.js" << 'EOF'
const express = require('express');
const cors = require('cors');
const path = require('path');
const multer = require('multer');
const app = express();
const PORT = process.env.PORT || 3000;
// Middleware
app.use(cors());
app.use(express.json());
app.use(express.static('public'));
// Настройка multer для загрузки файлов
const storage = multer.diskStorage({
destination: (req, file, cb) => {
cb(null, 'uploads/');
},
filename: (req, file, cb) => {
cb(null, Date.now() + '-' + file.originalname);
}
});
const upload = multer({ storage: storage });
// Создание директории uploads
const fs = require('fs');
if (!fs.existsSync('uploads')) {
fs.mkdirSync('uploads');
}
// Маршруты
app.get('/', (req, res) => {
res.send(`
<!DOCTYPE html>
<html>
<head>
<title>MY Uploader - Web Client</title>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<style>
body { font-family: Arial, sans-serif; max-width: 800px; margin: 0 auto; padding: 20px; }
.header { text-align: center; margin-bottom: 40px; }
.upload-form { border: 2px dashed #ccc; padding: 40px; text-align: center; margin-bottom: 40px; }
.btn { background: #007bff; color: white; padding: 10px 20px; border: none; border-radius: 5px; cursor: pointer; }
.status { margin-top: 20px; }
</style>
</head>
<body>
<div class="header">
<h1>🚀 MY Uploader Bot</h1>
<p>Web Client для загрузки контента в MY Network</p>
</div>
<div class="upload-form">
<h3>📁 Загрузка файла</h3>
<form id="uploadForm" enctype="multipart/form-data">
<input type="file" id="fileInput" name="file" required>
<br><br>
<button type="submit" class="btn">Загрузить</button>
</form>
<div id="status" class="status"></div>
</div>
<div>
<h3>📊 Статус системы</h3>
<p>Веб клиент: <span style="color: green;">Активен</span></p>
<p>API: <span id="apiStatus">Проверка...</span></p>
</div>
<script>
// Проверка статуса API
fetch('/api/health')
.then(response => response.json())
.then(data => {
document.getElementById('apiStatus').innerHTML = '<span style="color: green;">Активен</span>';
})
.catch(error => {
document.getElementById('apiStatus').innerHTML = '<span style="color: red;">Недоступен</span>';
});
// Обработка загрузки файлов
document.getElementById('uploadForm').addEventListener('submit', async (e) => {
e.preventDefault();
const formData = new FormData();
const fileInput = document.getElementById('fileInput');
formData.append('file', fileInput.files[0]);
const status = document.getElementById('status');
status.innerHTML = 'Загрузка...';
try {
const response = await fetch('/upload', {
method: 'POST',
body: formData
});
const result = await response.json();
status.innerHTML = \`✅ \${result.message}\`;
} catch (error) {
status.innerHTML = \`❌ Ошибка: \${error.message}\`;
}
});
</script>
</body>
</html>
`);
});
app.get('/health', (req, res) => {
res.json({ status: 'healthy', module: 'web2-client' });
});
app.post('/upload', upload.single('file'), (req, res) => {
if (!req.file) {
return res.status(400).json({ error: 'Файл не выбран' });
}
res.json({
message: `Файл ${req.file.originalname} успешно загружен`,
filename: req.file.filename,
size: req.file.size
});
});
// Проксирование API запросов к основному приложению
app.use('/api', (req, res) => {
const apiUrl = process.env.API_URL || 'http://localhost:15100';
// Здесь можно добавить проксирование через http-proxy-middleware
res.json({ message: 'API проксирование не настроено' });
});
app.listen(PORT, () => {
console.log(`🌐 Web2-Client запущен на порту ${PORT}`);
console.log(`📖 Откройте http://localhost:${PORT} в браузере`);
});
EOF
# Создание Dockerfile для web2-client
cat > "web2-client/Dockerfile" << 'EOF'
FROM node:18-alpine
WORKDIR /app
# Установка зависимостей
COPY package*.json ./
RUN npm install --production
# Копирование кода
COPY . .
# Создание директорий
RUN mkdir -p uploads public
EXPOSE 3000
CMD ["npm", "start"]
EOF
echo "✅ web2-client создан"
else
echo " web2-client уже существует"
fi
# =============================================================================
# DOCKER COMPOSE ДЛЯ МОДУЛЕЙ
# =============================================================================
echo "🐳 Создание docker-compose для модулей..."
cat > "$MODULES_DIR/docker-compose.modules.yml" << 'EOF'
version: '3.8'
services:
# Converter Module
converter:
build:
context: ./converter-module
dockerfile: Dockerfile
container_name: my_converter
restart: unless-stopped
ports:
- "8080:8080"
volumes:
- converter_data:/app/output
- converter_logs:/app/logs
environment:
- PYTHONUNBUFFERED=1
networks:
- my_network
# Web2 Client
web2-client:
build:
context: ./web2-client
dockerfile: Dockerfile
container_name: my_web2_client
restart: unless-stopped
ports:
- "3000:3000"
volumes:
- web2_uploads:/app/uploads
environment:
- NODE_ENV=production
- API_URL=http://my-uploader-app:15100
networks:
- my_network
volumes:
converter_data:
converter_logs:
web2_uploads:
networks:
my_network:
external: true
name: my-uploader-bot_uploader_network
EOF
echo "✅ Docker Compose для модулей создан"
# Установка прав доступа
chmod +x "$MODULES_DIR/converter-module/app.py"
chmod +x "$MODULES_DIR/web2-client/server.js"
echo ""
echo "📦 Дополнительные модули настроены:"
echo " 🔄 converter-module: http://localhost:8080"
echo " 🌐 web2-client: http://localhost:3000"
echo ""
echo "Для запуска модулей:"
echo " cd $MODULES_DIR"
echo " docker-compose -f docker-compose.modules.yml up -d"
echo ""