AI-markdown/docker-compose.yml

197 lines
5.8 KiB
YAML

# ============================================================
# AI Markdown Demo — MarkItDown vs Docling vs Unlimited-OCR
# ============================================================
# Naming convention: <layer>-<service>
#
# ui :8484 — Comparison UI (Laravel)
# api-markitdown :8282 — MarkItDown API (Microsoft)
# api-docling :8383 — Docling API (IBM)
# api-unlimited-ocr :8181 — Unlimited-OCR API (Baidu)
# db-markitdown :5432 — PostgreSQL for markitdown
# db-docling :— — PostgreSQL for docling (internal only)
# db-unlimited-ocr :— — PostgreSQL for unlimited-ocr (internal only)
# db-admin :5050 — Adminer
# ============================================================
x-healthcheck-defaults: &healthcheck-defaults
interval: 10s
timeout: 5s
retries: 5
x-service-defaults: &service-defaults
restart: unless-stopped
networks:
- app-network
# ==========================
# Services
# ==========================
services:
# --- UI layer ---------------------------------------------------
ui:
image: shinsenter/laravel:php8.3
<<: *service-defaults
ports:
- "8484:80"
volumes:
- ./laravel-app:/var/www/html
- .:/workspace:ro
environment:
APP_ENV: production
APP_DEBUG: "false"
LOG_CHANNEL: stderr
depends_on:
db-markitdown:
condition: service_healthy
db-docling:
condition: service_healthy
db-unlimited-ocr:
condition: service_healthy
# --- API layer --------------------------------------------------
api-markitdown:
build:
context: ./services/markitdown-service
<<: *service-defaults
ports:
- "8282:8000"
env_file: .env
environment:
DATABASE_URL: postgresql://${POSTGRES_USER:-admin}:${POSTGRES_PASSWORD:-admin}@db-markitdown:5432/${POSTGRES_DB:-markitdown}
VISION_URL: ${VISION_URL:-http://api-vision:8000}
extra_hosts:
- "host.docker.internal:host-gateway"
volumes:
- .:/workspace:rw
depends_on:
db-markitdown:
condition: service_healthy
api-vision:
condition: service_started
api-docling:
build:
context: ./services/docling-service
<<: *service-defaults
ports:
- "8383:8000"
env_file: .env
environment:
DATABASE_URL: postgresql://${POSTGRES_USER:-admin}:${POSTGRES_PASSWORD:-admin}@db-docling:5432/docling
VISION_URL: ${VISION_URL:-http://api-vision:8000}
extra_hosts:
- "host.docker.internal:host-gateway"
volumes:
- .:/workspace:ro
depends_on:
db-docling:
condition: service_healthy
api-vision:
condition: service_started
api-unlimited-ocr:
build:
context: ./services/unlimited-ocr-service
<<: *service-defaults
ports:
- "8181:8000"
env_file: .env
environment:
DATABASE_URL: postgresql://${POSTGRES_USER:-admin}:${POSTGRES_PASSWORD:-admin}@db-unlimited-ocr:5432/unlimited_ocr
OCR_BASE_URL: ${OCR_BASE_URL:-}
OCR_API_KEY: ${OCR_API_KEY:-none}
OCR_MODEL: ${OCR_MODEL:-Unlimited-OCR}
OCR_DPI: ${OCR_DPI:-300}
extra_hosts:
- "host.docker.internal:host-gateway"
depends_on:
db-unlimited-ocr:
condition: service_healthy
# --- Vision layer (shared OCRFlux, dùng chung cho markitdown + docling) ---
api-vision:
build:
context: ./services/vision-service
<<: *service-defaults
ports:
- "8585:8000"
env_file: .env
environment:
LLM_BASE_URL: ${LLM_BASE_URL:-http://host.docker.internal:11436/v1}
LLM_MODEL: ${LLM_MODEL:-ggml-org/Qwen2.5-VL-3B-Instruct-GGUF}
extra_hosts:
- "host.docker.internal:host-gateway"
# --- Database layer ---------------------------------------------
db-markitdown:
image: postgres:16-alpine
<<: *service-defaults
env_file: .env
environment:
POSTGRES_DB: ${POSTGRES_DB:-markitdown}
POSTGRES_USER: ${POSTGRES_USER:-admin}
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-admin}
volumes:
- db_markitdown_data:/var/lib/postgresql/data
- ./db/init_markitdown.sql:/docker-entrypoint-initdb.d/init_markitdown.sql:ro
ports:
- "5432:5432"
healthcheck:
<<: *healthcheck-defaults
test: ["CMD-SHELL", "pg_isready -U ${POSTGRES_USER:-admin} -d ${POSTGRES_DB:-markitdown}"]
db-docling:
image: postgres:16-alpine
<<: *service-defaults
env_file: .env
environment:
POSTGRES_DB: docling
POSTGRES_USER: ${POSTGRES_USER:-admin}
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-admin}
volumes:
- db_docling_data:/var/lib/postgresql/data
- ./db/init_docling.sql:/docker-entrypoint-initdb.d/init_markitdown.sql:ro
healthcheck:
<<: *healthcheck-defaults
test: ["CMD-SHELL", "pg_isready -U ${POSTGRES_USER:-admin} -d docling"]
db-unlimited-ocr:
image: postgres:16-alpine
<<: *service-defaults
env_file: .env
environment:
POSTGRES_DB: unlimited_ocr
POSTGRES_USER: ${POSTGRES_USER:-admin}
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-admin}
volumes:
- db_unlimited_ocr_data:/var/lib/postgresql/data
- ./db/init_unlimited_ocr.sql:/docker-entrypoint-initdb.d/init.sql:ro
healthcheck:
<<: *healthcheck-defaults
test: ["CMD-SHELL", "pg_isready -U ${POSTGRES_USER:-admin} -d unlimited_ocr"]
# --- Admin layer ------------------------------------------------
db-admin:
image: adminer:4.8.1
<<: *service-defaults
ports:
- "5050:8080"
environment:
ADMINER_DEFAULT_SERVER: db-markitdown
depends_on:
db-markitdown:
condition: service_healthy
# ==========================
# Infrastructure
# ==========================
networks:
app-network:
driver: bridge
volumes:
db_markitdown_data:
db_docling_data:
db_unlimited_ocr_data: