Docker & Compose
This page walks through the root
docker-compose.yml,
which runs the published VibeXP images. It is for running VibeXP; local
development uses make instead (see
Getting Started).
Topology
Section titled “Topology”The stack is three services on a single bridge network (vibexp):
postgres
Section titled “postgres”image: pgvector/pgvector:pg16PostgreSQL 16 with the pgvector extension (needed for semantic search). It has
a pg_isready healthcheck, and the backend service waits on
condition: service_healthy before starting. Data lives in the pgdata named
volume.
backend
Section titled “backend”image: ghcr.io/vibexp/backend:latestports: ["8080:8080"]The Go API and MCP endpoint. Its environment carries the database connection
(DB_HOST: postgres, DB_USER, DB_PASSWORD, DB_NAME), the required
ENCRYPTION_KEY, the public URLs (FRONTEND_BASE_URL, CORS_ALLOWED_ORIGINS),
and auth settings (DEV_LOGIN_ENABLED, WorkOS). Its healthcheck hits
http://localhost:8080/ping. See
Configuration Reference
for which of these you must change for production.
frontend
Section titled “frontend”image: ghcr.io/vibexp/frontend:latestports: ["5173:80"]environment: BACKEND_ORIGIN: "http://backend:8080"The nginx-served SPA. It calls a relative /api base, and nginx reverse-proxies
that to BACKEND_ORIGIN — the only runtime variable it needs. It waits on the
backend’s healthcheck before starting. Container port 80 is published on host
port 5173.
Volume
Section titled “Volume”volumes: pgdata:The named pgdata volume holds the database. It survives
docker compose down. To wipe all data, use docker compose down -v.
Network
Section titled “Network”All services share a single user-defined bridge network named vibexp, so they
reach each other by service name (e.g. the backend connects to postgres:5432,
nginx proxies to backend:8080).
Optional: GCS emulator for attachments
Section titled “Optional: GCS emulator for attachments”The compose file ships a commented-out gcs service
(fsouza/fake-gcs-server) for persistent file attachments. To enable uploads:
- Uncomment the
gcsservice and itsgcsdatavolume. - Uncomment
STORAGE_EMULATOR_HOSTandGCS_RESOURCE_ATTACHMENTS_BUCKETon thebackendservice.
Without it, attachment uploads are disabled.
Lifecycle
Section titled “Lifecycle”docker compose up -d # start (pulls published images on first run)docker compose ps # check statusdocker compose logs -f # follow logsdocker compose down # stop and remove containers (keeps pgdata)docker compose down -v # stop and ALSO delete the pgdata volume (wipes data)