# ============================================================ # AI Markdown Demo — MarkItDown vs Docling # ============================================================ # Naming convention: - # # ui :8484 — Comparison UI (nginx) # api-markitdown:8282 — MarkItDown API (Microsoft) # api-docling :8383 — Docling API (IBM) # db-markitdown :5432 — PostgreSQL for markitdown # db-docling :— — PostgreSQL for docling (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: caddy:alpine <<: *service-defaults ports: - "8484:80" volumes: - ./frontend/Caddyfile:/etc/caddy/Caddyfile:ro - ./frontend:/srv:ro # --- API layer -------------------------------------------------- api-markitdown: build: context: ./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} OLLAMA_BASE_URL: ${OLLAMA_BASE_URL:-} OLLAMA_MODEL: ${OLLAMA_MODEL:-llava} depends_on: db-markitdown: condition: service_healthy api-docling: build: context: ./docling-service <<: *service-defaults ports: - "8383:8000" env_file: .env environment: DATABASE_URL: postgresql://${POSTGRES_USER:-admin}:${POSTGRES_PASSWORD:-admin}@db-docling:5432/docling OLLAMA_BASE_URL: ${OLLAMA_BASE_URL:-} OLLAMA_MODEL: ${OLLAMA_MODEL:-llava} depends_on: db-docling: condition: service_healthy # --- 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"] # --- 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: