This is the supported self-host install path. End-to-end clock time on a fresh Ubuntu 24.04 VPS with Docker preinstalled: ≤5 minutes from clone to login screen.
- Linux host with ≥4 GB RAM and ≥20 GB free disk.
- Docker Engine 27+ with
docker composev2. - A DNS A-record pointing at the host (Traefik provisions Let's Encrypt automatically).
- Outbound HTTPS to your image registry (Amazon ECR — see the image and version policy) and Let's Encrypt (
acme-v02.api.letsencrypt.org).
-
Clone the repo at the version tag you want to install:
git clone --depth 1 --branch v0.1.0 https://github.com/Seta-International/agent-platform.git seta && cd seta
-
Copy the env template and edit the required values:
cp .env.example .env chmod 600 .env $EDITOR .envRequired edits (see
configuration.mdfor the full list):PLATFORM_DOMAIN,PLATFORM_ACME_EMAIL,POSTGRES_PASSWORD,BETTER_AUTH_SECRET. For first-try local installs, leavePLATFORM_TLS_MODE=self-signedandPLATFORM_DOMAIN=localhost. -
Pull and start the stack:
docker compose pull docker compose up -d
-
Run database migrations (one-shot container, exits when done):
docker compose run --rm migrator
-
(Optional, for demo data) Seed:
docker compose run --rm seeder
seederis a dedicated one-shot service behind theseedprofile;docker compose runauto-enables the profile of the named service, soup -d(no args) skips it. -
Open
https://${PLATFORM_DOMAIN}and log in with the bootstrap credentials printed to theserverlogs:docker compose logs server | grep -i 'bootstrap'
| Service | Image | Role |
|---|---|---|
proxy |
traefik:v3.1 |
Reverse proxy, Let's Encrypt or self-signed TLS, port 443. |
web |
${PLATFORM_IMAGE_WEB} |
Static React bundle, served by proxy. |
server |
${PLATFORM_IMAGE_SERVER} |
API + workers, default PLATFORM_MODULES=*. |
migrator |
${PLATFORM_IMAGE_SERVER} |
One-shot platform-server migrate. depends_on: postgres healthy. |
postgres |
pgvector/pgvector:pg17-trixie |
Persistent named volume. |
docker compose ps— all servicesrunning/healthy;migratorexited (0).curl -sfk https://${PLATFORM_DOMAIN}/health/live— the API liveness probe, returns{ "ok": true }. (-kforself-signed.) (/healthzis thewebcontainer's nginx static endpoint returningok, not the API.)- Log in with the bootstrap user from step 6 above.
- Let's Encrypt rate-limited. Cause: testing repeatedly against the same domain. Fix: temporarily set
PLATFORM_TLS_MODE=self-signedin.env, restartproxy. - Postgres pull is slow. Pre-pull:
docker pull pgvector/pgvector:pg17-trixie. - Bootstrap credentials not in logs.
migratormust succeed before firstserverstart. Rerundocker compose run --rm migrator, thendocker compose restart server. - Permission denied binding to :443. Run Docker as root, or use rootless Docker with
cap_add: NET_BIND_SERVICE. POSTGRES_PASSWORDandBETTER_AUTH_SECRETare required and empty by default. The compose stack will refuse to start until you set them.
- Tune any env var →
configuration.md.