Сервис для генерации PDF-документов на основе DOCX-шаблонов с использованием LibreOffice для конвертации. Поддерживает работу как в локальном Docker-окружении, так и в кластере Kubernetes.
- Генерация PDF из DOCX-шаблонов с использованием LibreOffice
- Поддержка больших файлов и данных
- Оптимизированная работа с памятью
- Единые настройки для локального и Kubernetes окружений
- Расширенное логирование с уникальными идентификаторами запросов
- Автоматическая очистка временных файлов
- Поддержка CORS и сжатия данных
- Prometheus метрики для мониторинга
- Grafana дашборды для визуализации метрик
- Подробная трассировка ошибок с контекстом
- Docker
- Python 3.11+
- LibreOffice
- Kubernetes (для production)
- Prometheus и Grafana (для мониторинга)
.
├── app.py # Основной код приложения
├── Dockerfile # Конфигурация Docker образа
├── requirements.txt # Python зависимости
├── templates/ # Директория с DOCX шаблонами
├── k8s/ # Конфигурации Kubernetes
│ ├── deployment.yaml
│ ├── service.yaml
│ └── ingress.yaml
├── monitoring/ # Конфигурации мониторинга
│ ├── prometheus/
│ │ ├── prometheus.yml
│ │ └── prometheus-rbac.yaml
│ └── grafana/
│ └── dashboards/
├── docker-compose.monitoring.yml # Конфигурация для локального мониторинга
├── deploy.ps1 # Скрипт развертывания в Kubernetes
└── run_local.ps1 # Скрипт для локального запуска
- Убедитесь, что Docker установлен и запущен
- Поместите ваш DOCX шаблон в директорию
templates/с именемtemplate.docx - Запустите скрипт:
.\run_local.ps1Сервис будет доступен по адресу: http://localhost:8005
- Убедитесь, что у вас есть доступ к кластеру Kubernetes
- Настройте переменные окружения для доступа к кластеру
- Запустите скрипт развертывания:
.\deploy.ps1- Memory: 2GB
- CPU: 2 cores
- Temporary storage: 1GB
TZ: Временная зона (по умолчанию "Europe/Moscow")PYTHONUNBUFFERED: Отключение буферизации Python (1)TMPDIR: Директория для временных файлов (/app/temp)LIBREOFFICE_PATH: Путь к LibreOffice (/usr/bin/soffice)SAL_USE_VCLPLUGIN: Настройка LibreOffice для работы без GUI (svp)
- Один воркер для предотвращения конфликтов
- Таймаут keep-alive: 300 секунд
- Размер backlog: 2048
- Отключены лимиты на размер запросов
- Включено подробное логирование
Генерирует PDF документ на основе шаблона и переданных данных.
Параметры (один из следующих способов):
file: JSON файл с данными для шаблона (multipart/form-data)data: JSON строка с данными для шаблона (в query параметре)- JSON данные в теле запроса (application/json)
Примеры запросов:
- Загрузка файла:
curl -X POST "http://localhost:8005/generate-pdf" \
-H "Content-Type: multipart/form-data" \
-F "file=@data.json"- Через query параметр:
curl -X POST "http://localhost:8005/generate-pdf" \
-H "Content-Type: application/json" \
-d '{"applicantType":"ORGANIZATION",...}'- В теле запроса:
curl -X POST "http://localhost:8005/generate-pdf?data={"applicantType":"ORGANIZATION",...}"При использовании Swagger UI (/docs) вы можете:
- Загрузить JSON файл через поле "file"
- Ввести JSON строку в поле "data"
- Оставить оба поля пустыми и отправить данные в теле запроса
Проверка работоспособности сервиса.
- Уникальные идентификаторы для каждого запроса
- Подробное логирование всех этапов обработки
- Контекстная информация в логах (IP клиента, заголовки, тело запроса)
- Трассировка ошибок с полным стеком
- Форматирование логов в JSON для production окружения
pdf_conversion_errors_total- количество ошибок конвертацииrequest_processing_duration_seconds- время обработки запросовtemp_files_count- количество временных файловmemory_usage_bytes- использование памятиhttp_requests_total- общее количество запросов
- Общее количество обработанных файлов
- Количество ошибок по окружениям
- Среднее время обработки
- Частота запросов
- Использование ресурсов
-
Просмотр всех логов:
kubectl logs -l app=serv-print-efgi
-
Фильтрация по ошибкам:
kubectl logs -l app=serv-print-efgi | grep "error"
-
Поиск конкретного запроса по ID:
kubectl logs -l app=serv-print-efgi | grep "pdf_20250202_104410"
-
Просмотр логов конвертации:
kubectl logs -l app=serv-print-efgi -f | findstr "convert Converting processing Processing"
-
Проверьте логи приложения с фильтрацией по ошибкам:
kubectl logs -l app=serv-print-efgi | grep "error"
-
Найдите конкретный запрос по ID:
kubectl logs -l app=serv-print-efgi | grep "pdf_YYYYMMDD_HHMMSS"
-
Проверьте метрики в Prometheus:
http://localhost:9090/targets -
Просмотрите дашборды в Grafana:
http://localhost:3000
MIT