Files
admin e768d30fb6 feat: import DOCX/PDF/scanned templates via DeepSeek recognition
Backend pipeline:
- POST /api/templates/import (multipart, max 25 MB)
- extract.ts: DOCX→mammoth, PDF→pdf-parse, fallback to OCR via tesseract+poppler-utils
  (pdftoppm renders pages to PNG, tesseract reads with rus+eng)
- deepseek.ts: chat completions client with strict JSON response_format
- recognize.ts: structured prompt that produces simplified DocBody (string text),
  postprocessor wraps text in TipTap-compatible JSON, validates with zod schema
- prompt enforces placeholder substitution: {{customer.*}}, {{executor.*}},
  {{contract.number}}, {{contract.date}}, {{today}}
- error codes: NO_OCR / NO_DEEPSEEK_KEY / UNSUPPORTED_MIME / INVALID_DOC_BODY

Dockerfile: apk add tesseract-ocr (+rus +eng data), poppler-utils, imagemagick

Frontend:
- Templates page: ⤴ Загрузить документ → file picker (.docx,.pdf,.png,.jpg)
- doc type selector (contract/invoice/act/upd)
- import-banner with spinner shows uploading→analyzing stages
- on success navigates to /templates/:id (TemplateEdit) for review

Reuses DEEPSEEK_API_KEY pattern from Hall-planer.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-01 11:40:28 +03:00

66 lines
2.2 KiB
YAML
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
name: doc-manager
# Деплой на queoserver (192.168.0.158): хостовый Caddy в /etc/caddy/Caddyfile
# проксирует doc.queo.ru → localhost:3031 (web с внутренним прокси /api/* → api).
# Локально для разработки используем npm run dev:demo, не этот compose.
services:
postgres:
image: postgres:16-alpine
restart: unless-stopped
environment:
POSTGRES_DB: ${POSTGRES_DB:-docmanager}
POSTGRES_USER: ${POSTGRES_USER:-docmanager}
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-docmanager}
volumes:
- pg_data:/var/lib/postgresql/data
healthcheck:
test: ["CMD-SHELL", "pg_isready -U ${POSTGRES_USER:-docmanager} -d ${POSTGRES_DB:-docmanager}"]
interval: 10s
timeout: 5s
retries: 5
api:
build:
context: ..
dockerfile: docker/Dockerfile.api
restart: unless-stopped
depends_on:
postgres:
condition: service_healthy
environment:
NODE_ENV: production
PORT: 3030
HOST: 0.0.0.0
DATABASE_URL: postgresql://${POSTGRES_USER:-docmanager}:${POSTGRES_PASSWORD:-docmanager}@postgres:5432/${POSTGRES_DB:-docmanager}?schema=public
AUTH_ISSUER: ${AUTH_ISSUER:-https://auth.queo.ru}
AUTH_AUDIENCE: ${AUTH_AUDIENCE:-queo.ru}
AUTH_JWKS_URL: ${AUTH_JWKS_URL:-https://auth.queo.ru/.well-known/jwks.json}
AUTH_COOKIE_NAME: q_at
AUTH_LOGIN_URL: ${AUTH_LOGIN_URL:-https://auth.queo.ru/login}
CORS_ORIGINS: ${CORS_ORIGINS:-https://doc.queo.ru}
TOCHKA_JWT_KEY: ${TOCHKA_JWT_KEY:-}
TOCHKA_WEBHOOK_SECRET: ${TOCHKA_WEBHOOK_SECRET:-}
DADATA_API_KEY: ${DADATA_API_KEY:-}
DEEPSEEK_API_KEY: ${DEEPSEEK_API_KEY:-}
DEEPSEEK_BASE_URL: ${DEEPSEEK_BASE_URL:-https://api.deepseek.com}
DEEPSEEK_MODEL: ${DEEPSEEK_MODEL:-deepseek-chat}
DEFAULT_ORGANIZATION_ID: ${DEFAULT_ORGANIZATION_ID:-00000000-0000-0000-0000-000000000001}
DEV_BYPASS_AUTH: "0"
expose:
- "3030"
web:
build:
context: ..
dockerfile: docker/Dockerfile.web
restart: unless-stopped
depends_on:
- api
ports:
# Хостовый Caddy на queoserver: doc.queo.ru → localhost:3031
- "127.0.0.1:3031:80"
volumes:
pg_data: