Skip to content

Quick start with docker-compose

The core super-repo wires ~20 service repos (git submodules) plus Postgres, Redis, and an Azure Blob emulator into a single make up. This is the fastest on-ramp: clone, drop in a GitHub token, and one command builds every image and starts the whole backend stack — healthy, with zero external accounts. For the manual, run-each-service-by-hand path, see Run from source.

  1. Clone with submodules. Every service is a branch-tracked submodule; the --recurse-submodules flag pulls them all. (Forgot it? Run git submodule update --init --recursive.)

    Terminal window
    git clone --recurse-submodules <core-repo-url> core
    cd core
  2. Bootstrap. make bootstrap is idempotent: it checks prerequisites, syncs submodules to their tracked branches, and creates .env from .env.example — generating a fresh INTERNAL_RPC_SECRET so the dev stack never runs on the placeholder.

    Terminal window
    make bootstrap
  3. Add a GitHub token. Every backend image pulls private soundverse-* dependencies at build time (via a BuildKit secret), so builds fail without a token. Put GH_TOKEN in .env with scopes repo + read:packages, or just run gh auth login — the scripts fall back to gh auth token.

  4. Bring it up. make up builds every image and starts the backend stack detached. First run pulls base images and compiles Go + Python deps, so give it a few minutes.

    Terminal window
    make up
  5. Verify health. make doctor checks your tooling, the token, container state, and probes every host port.

    Terminal window
    make doctor

The default profile is the backend only. make up prints the host→container endpoints; make doctor re-probes them (core-identity and core-mcp expose an HTTP /healthz; the rest are checked as raw TCP):

Service Host port Protocol
core-database 8080 Connect / h2c — the only DB writer
core-identity 8001 HTTP /healthz
core-storage 8081 gRPC
core-mcp 8090 h2c /mcp, /healthz
core-gateway-consumer 8082 gRPC — the consumer entrypoint
postgres 5432
redis 6379
azurite (blob emulator) 10000

Add the frontends with make up-frontend (behind a compose frontend profile): soundverse-saas-2.0 on http://localhost:3000 and the standalone UI2.0 studio on http://localhost:3001. See Run the frontends.

the ones you'll actually use
make up # build + start the backend stack (detached)
make up-frontend # + the SaaS app and UI2.0
make ps # container status
make logs # tail all (one service: make logs s=core-mcp)
make doctor # tools + token + container health + ports
make down # stop & remove containers (keeps data volumes)
make update # pull latest of every submodule's tracked branch
make azurite-init # create blob containers (once, before exercising uploads)
make agent-tool-id # print the Agent One tool id for AGENT_TOOL_ID
make db-reset # wipe Postgres + reload schema (DESTRUCTIVE)
make help # the full list

The complete target reference lives in Make targets & Redis keys.

make up yields a fully healthy backend with no external credentials — all inter-service calls, the database, queues, and the tool registry work offline. Only features that reach outside the stack need a value in .env (names only — see Configuring .env and the full matrix on Offline vs. secrets):

Feature Needs (by name) Without it
Blob uploads (tool outputs) run make azurite-init storage boots; uploads 404 until the containers exist
Agent One LLM turns LITELLM_API_KEY the agent worker registers but can’t run a turn
Sansaarm song generation SANSAARM_API_KEY, SANSAARM_API_BASE_URL the worker registers but can’t generate
Browser login (end-to-end chat) a real OIDC app credential the UI loads but can’t authenticate
  • Directorycore/
    • docker-compose.yml the full stack
    • .env.example copy → .env
    • .gitmodules the ~20 service repos + tracked branches
    • Makefile make help
    • Directoryscripts/ bootstrap / up / update / doctor / wire
    • Directorycompose/postgres/ schema init (prelude + loader)
    • update-all-protos.sh refresh every service’s generated stubs