Service graph¶
The stack is defined in docker-compose.yml. Several services cooperate; two of
them share the RAG vector store through a bind mount. The tui service is
optional (see tui below).
graph LR
browser([Browser]) -->|9000/9443| nginx
nginx -->|/api/ /mcp/| backend
backend -->|reads LanceDB| ragdb[(rag/db)]
ingester[haiku-ingester] -->|writes LanceDB| ragdb
ingester -->|convert/chunk| docling[docling-serve]
ingester -->|job queue| postgres[(postgres)]
backend -->|threads + authz| postgres
nginx¶
Serves the Flutter web frontend (built from the soliplex/frontend release
tarball inside nginx/Dockerfile) and reverse-proxies /api/ and /mcp/ to
backend:8000. Terminates TLS on 9443 with a self-signed cert generated at
build time.
backend¶
Runs soliplex-cli serve /environment. Currently launched with
--no-auth-mode (marked temporary in docker-compose.yml). The
--reload=config flag means edits under backend/environment/ take effect
without a rebuild. The backend is installed from the pinned soliplex package;
see Backend image & dependencies.
haiku-ingester¶
The writer process for the LanceDB at rag/db/. Runs haiku-ingester serve
with a Postgres-backed job queue (its own soliplex_ingester database), an
async worker pool, retries + a dead-letter queue, and an HTTP control plane on
8765. The
filesystem source polls rag/docs/ and emits upsert/delete jobs that
docling-serve converts and chunks.
There is a single-writer constraint: only one ingester per LanceDB. The backend reads the same LanceDB through a bind mount, so no separate MCP server is needed. See RAG pipeline and Ingester control plane.
docling-serve¶
A stateless document converter. The CPU image is used by default; a GPU variant
is available by a commented swap in docker-compose.yml.
tui¶
Soliplex's Textual terminal client. The
backend image bundles the client (soliplex-tui), so you can run it from the
command line against the running stack without the tui service — see
Using the TUI.
This template also serves the same client as a web app via the optional
tui service (over
textual-serve); nginx proxies it
at /tui/, so open https://localhost:9443/tui/. The service has no host port
mapping (reached only through nginx) and a project scaffolded by the
generator includes it only when
include_tui=true.
postgres¶
Creates two databases on first boot via postgres/config/init.sh:
soliplex_agui— thread persistencesoliplex_authz— authorization policy
Each database gets a dedicated low-privilege role whose password is read from
/run/secrets/<name>_db_password. Init runs only on an empty data volume;
to re-run it, docker compose down -v first.