#!/bin/bash # ============================================================================= # НАСТРОЙКА ДОПОЛНИТЕЛЬНЫХ МОДУЛЕЙ MY UPLOADER BOT # ============================================================================= if [ $# -lt 1 ]; then echo "Usage: $0 " 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(` MY Uploader - Web Client

🚀 MY Uploader Bot

Web Client для загрузки контента в MY Network

📁 Загрузка файла



📊 Статус системы

Веб клиент: Активен

API: Проверка...

`); }); 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 ""