Production stack now includes OpenSearch single-node and embedding-service
alongside the existing document-parser and frontend. OPENSEARCH_URL and
EMBEDDING_URL wired into document-parser; persistent volume for OpenSearch data.
These env vars were set in the CI workflow step but never passed through
docker-compose to the container, so the backend always used defaults
(100 RPM), causing 429 errors in E2E tests.
Both root and backend Dockerfiles now use a shared base stage with
two targets: remote (lightweight, ~300MB) and local (full Docling,
~2-3GB). docker-compose uses CONVERSION_MODE to select the target.