diff --git a/History/how-to-convert-doc.md b/History/how-to-convert-doc.md new file mode 100644 index 0000000..f2fd0ea --- /dev/null +++ b/History/how-to-convert-doc.md @@ -0,0 +1,89 @@ +# Как подключить конвертацию .doc → .docx + +Сервис: **https://liberta.containerk8s.dev.nubes.ru** + +## API + +**Конвертация:** +```bash +curl -X POST -F "file=@документ.doc" https://liberta.containerk8s.dev.nubes.ru/convert -o результат.docx +``` + +**Проверка:** +```bash +curl https://liberta.containerk8s.dev.nubes.ru/health +# → {"ok":true,"version":"1.0.0"} +``` + +## Интеграция в Python (как в Сверке) + +### 1. config.py — URL сервиса +```python +CONVERT_SERVICE_URL = os.getenv( + "CONVERT_SERVICE_URL", + "http://containerk8s.df36c8af-1a95-4623-b551-0d37b731ccca.svc.cluster.local:5000" +) +``` + +### 2. upload_bp.py — замена subprocess на HTTP +```python +import httpx +import config + +@upload_bp.route("/convert-doc", methods=["POST"]) +def convert_doc(): + f = request.files.get("files") + if not f: + return jsonify(ok=False, error="no file"), 400 + try: + resp = httpx.post( + config.CONVERT_SERVICE_URL + "/convert", + files={"file": (f.filename, f.read(), f.content_type or "application/msword")}, + timeout=120, + ) + if resp.status_code == 200: + return send_file(io.BytesIO(resp.content), mimetype="...docx") + return jsonify(ok=False, error=resp.json().get("error")), 500 + except httpx.TimeoutException: + return jsonify(ok=False, error="conversion timeout"), 500 +``` + +### 3. files.js — фронтенд +```javascript +var CONVERT_URL = '/convert-doc'; + +// Перед uploadFile: если .doc → сначала convertDoc() +async function convertDoc(file, onProgress) { + var fd = new FormData(); + fd.append('files', file, file.name); + var resp = await fetch(CONVERT_URL, { method: 'POST', body: fd }); + if (!resp.ok) throw new Error('Конвертация: HTTP ' + resp.status); + var blob = await resp.blob(); + return new File([blob], file.name.replace(/\.doc$/i, '.docx'), { + type: 'application/vnd.openxmlformats-officedocument.wordprocessingml.document' + }); +} +``` + +## Топология + +``` +Браузер → POST /convert-doc (Flask-сервер) + ↓ httpx + liberta:5000/convert (libreoffice) + ↓ + .docx обратно + ↓ + обычный upload + парсинг +``` + +## Деплой liberta + +Образ: `gitea.services.ngcloud.ru/nail/contractor-convert:latest` +Рецепт: `~/nubes/contracts/convert-service/` +- Dockerfile: python:3.12 + libreoffice + flask +- Платформа: pythonk8s +- Порт: 5000 +- Память: 1024 MB +- CPU: 500m +- Реплики: 1 diff --git a/History/how-to-logo.md b/History/how-to-logo.md new file mode 100644 index 0000000..a8b2777 --- /dev/null +++ b/History/how-to-logo.md @@ -0,0 +1,39 @@ +# Как подключить лого Nubes в веб-сервис + +## Правильный способ (как в Сверке) + +Использовать `` — браузер рендерит как картинку, +"b" в слове nubes не закрашивается. + +## Файлы + +- `~/nubes/design/logo.svg` — правильный логотип (CorelDRAW, 5 путей) +- `~/nubes/design/nubes-favicon.svg` — фавикон U-арка с nubes.ru + +## В Python (Flask) + +```python +# Читаем SVG как строку +_LOGO_SVG = """...""" + +# Отдаём через эндпоинт +@app.route("/static/logo.svg") +def logo(): + from flask import Response + return Response(_LOGO_SVG, mimetype="image/svg+xml") +``` + +## В HTML + +```html +Nubes +``` + +## НЕПРАВИЛЬНО + +- ❌ Инлайн `` — fill-rule ломает букву "b" +- ❌ Data URI — битый если длинный/неправильно закодирован + +## Фавикон + +Брать из nubes.ru: `https://nubes.ru/themes/custom/nubes/images/nubes-ico.svg`