Лёгкий HTTP-микросервис для работы с документами Word в пайплайне таможенного брокера. Принимает DOCX-файлы с реквизитами клиентов, извлекает текст для дальнейшего парсинга ИИ, а также генерирует готовые договоры (PDF и DOCX) по шаблону с реквизитами компании.
Разворачивается в Docker, деплоится через Coolify — автоматически при пуше в main.
| Эндпоинт | Метод | Что делает |
|---|---|---|
/health |
GET | Проверка живости сервиса |
/extract |
POST | Извлекает текст из DOCX, возвращает JSON |
/generate-contract |
POST | Рендерит договор по шаблону → возвращает PDF |
/generate-contract-docx |
POST | То же самое → возвращает DOCX |
pip install -r requirements.txt
python app.py
# Сервис доступен на http://localhost:8082docker build -t docx-parser .
docker run -d -p 8082:8082 --restart unless-stopped docx-parserПринимает DOCX-файл, возвращает извлечённый текст.
curl -X POST -F "file=@card.docx" http://localhost:8082/extractИли как raw body:
curl -X POST --data-binary @card.docx \
-H "Content-Type: application/octet-stream" \
http://localhost:8082/extractОтвет:
{
"text": "ООО «Омега»\nИНН 7718100830\nКПП 772001001\n...",
"chars": 1234,
"paragraphs": 25,
"tables": 1
}Рендерит договор на оказание услуг таможенного представителя по шаблону templates/contract.docx.
Запрос (JSON):
{
"contract_number": "415",
"contract_date": "26.06.2026",
"client": {
"company_name": "ООО «Омега»",
"inn": "7718100830",
"kpp": "772001001",
"ogrn": "1157746208729",
"address": "111123, Москва, ш. Энтузиастов, д. 31",
"account": "40702810413000010925",
"bank": "ПАО Сбербанк",
"bik": "042007681",
"cor_account": "30101810600000000681",
"director_genitive": "Елютина Ивана Михайловича",
"director_short": "Елютин И.М.",
"intro_clause": ", в лице генерального директора Елютина Ивана Михайловича, действующего на основании Устава",
"email": "client@example.com",
"phone": "+7 903 030 99 94"
}
}Ответ: бинарный PDF (application/pdf) с именем Contract_415.pdf.
Эндпоинт /generate-contract-docx принимает тот же JSON, возвращает .docx.
Реквизиты Представителя задаются через переменные окружения в Coolify — не хардкодятся в образе:
| Переменная | Описание |
|---|---|
ROYAL_NAME |
Название компании |
ROYAL_INN |
ИНН |
ROYAL_KPP |
КПП |
ROYAL_OGRN |
ОГРН |
ROYAL_ADDRESS |
Юридический адрес |
ROYAL_ACCOUNT |
Расчётный счёт |
ROYAL_BANK |
Банк |
ROYAL_BIK |
БИК |
ROYAL_COR_ACCOUNT |
Корр. счёт |
ROYAL_DIRECTOR_GEN |
ФИО директора в род. падеже |
ROYAL_DIRECTOR_SHORT |
ФИО кратко (Фамилия И.О.) |
ROYAL_EMAIL |
Email компании |
ROYAL_PHONE |
Телефон (п. 2.4.1 договора) |
- Подключите репозиторий в Coolify → Build Pack: Dockerfile.
- Укажите Port: 8082.
- Заполните переменные окружения (реквизиты компании).
- Нажмите Deploy — при каждом пуше в
mainCoolify пересобирает образ автоматически.
Проверка после деплоя:
curl https://parser.yourdomain.ru/health
# {"status": "ok"}Python Flask Docker LibreOffice Coolify
- Flask 3.0 — HTTP-сервер
- python-docx — извлечение текста из DOCX
- docxtpl — рендеринг договора по Jinja2-шаблону
- LibreOffice headless — конвертация DOCX → PDF
- gunicorn — production WSGI-сервер (2 воркера ×ばつ 4 потока)
Сервис не имеет аутентификации — он живёт внутри закрытой Docker-сети Coolify и не выставлен напрямую в интернет. Если вы открываете порт наружу — закройте его Basic Auth на уровне reverse-proxy.
MIT