Compose

Web, API, and Postgres. Images are `gethamster/doso-api` and `gethamster/doso-web`, published on merge to `main`.

1curl -fsSL https://doso.sh/install | bash

Or from a clone:

1./start.sh2# or: cd deploy/local && cp .env.example .env && docker compose up

The installer generates POSTGRES_PASSWORD and BETTER_AUTH_SECRET. You do not edit .env unless you want different ports.

ServicePort
web3000
api8080
Postgresprivate to the compose network

Change ports in .env (WEB_PORT, API_PORT) or copy compose.override.example.yml to docker-compose.override.yml.

Open http://localhost:3000 and create the first account.

Desktop: Settings → Storage → Connect to serverhttp://127.0.0.1:3000.

To build the image from a local binary instead of pulling:

1./scripts/build-api.sh2docker compose -f docker-compose.yml -f compose.build.yml up --build

CI (.github/workflows/release-api.yml) runs on merge to main and on v* tags. API and web build in parallel with cargo and BuildKit caches. Each run uploads the linux binary and gzipped image tarballs as workflow artifacts and a GitHub Release, pushes ghcr.io/asomervell/doso-api and ghcr.io/asomervell/doso-web, and pushes gethamster/doso-api and gethamster/doso-web when DOCKERHUB_TOKEN is set. DOCKERHUB_USERNAME is the Docker ID that created the token, not the org.

This is the stack you run on any machine. Put your own reverse proxy in front if you need HTTPS. Cloud recipes are in ../cloud.