Docker¶
Compose services run the web app, FastAPI backend, Sphinx docs, and (in prod) nginx.
The Compose project name is soju: containers use the soju- prefix,
named volumes use soju_. Services share the internal soju bridge network.
Prod vs dev¶
Dev (default via poe) — Vite, FastAPI, and docs published on the host; nginx is not
started. Live-reload Sphinx via sphinx-autobuild.
uv run poe up
# or
docker compose -f docker-compose.yml -f docker-compose.dev.yml up
Prod — only nginx is published (:8080). Backend, Vite, and docs stay on the
Compose network.
uv run poe up-prod
# or
docker compose up
Mode |
Host ports |
Notes |
|---|---|---|
Dev |
|
|
Prod |
|
|
Internal |
(listen ports) |
|
Host Ollama (desktop app) is reached from the backend via host.docker.internal:11434
(see docker/soju/backend.yaml).
Do not revive the old docker/piper TTS image — speech is served by the Soju backend.
Other commands¶
Goal |
Command |
|---|---|
Web unit tests |
|
Validate / soju CLI (backend image) |
|
Static web build |
|
Optional profiles¶
Goal |
Command |
|---|---|
Ollama (AI features, containerized) |
|
See AI practice & chat for Practice/Chat setup and Local TTS (speech) for local speech.
Python CLIs on Docker¶
Python CLIs (soju import, etc.) normally run on the host via uv run with
./data bind-mounted paths — see CLI reference. They also work inside any
container with the repo mounted at /workspace and uv sync run once.
Node / npm: never run npm install on the host — use the web_node_modules
Compose volume. If apps/web/node_modules/ exists locally, delete it.