442 lines
13 KiB
Bash
442 lines
13 KiB
Bash
#!/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 "" |