Skip to main content
That script copies .env.example to .env, generates the passwords and the JWT secret that are still template values, and brings the stack up. It is idempotent — run it again after editing .env.

What comes up

Postgres must start with shared_preload_libraries=timescaledb, which the compose file sets. A data volume first initialised by plain postgres will not have it in postgresql.conf, and the hypertable migrations then fail. Start from a fresh volume, or add the setting by hand.

Before you start

1

Set the storage root

Compose bind-mounts it at the same path inside the container. That is not cosmetic: with the local executor the console drives the host Docker daemon, so the left side of a -v flag is a host path. If the two differ, the console cannot see what jobs write.
2

Give the container the docker group

The console runs as uid/gid 10001 and needs to write /var/run/docker.sock.
3

Decide about GPUs

The compose file requests gpus: all so the NVIDIA toolkit injects nvidia-smi and the driver libraries — the console can see the cards without holding them.On a machine with no NVIDIA runtime, delete gpus: all and the NVIDIA_DRIVER_CAPABILITIES line, then set FORGE_LOCAL_GPU_COUNT explicitly.
4

Start it

Internal DNS names

A container does not read the host’s /etc/hosts. If your OIDC provider or image mirror resolves only through it, add the mappings:
Everything else has a working default. These do not.
.env
FORGE_INGEST_URL is the one people get wrong. Training containers POST their metrics back to it, and on the local executor they share the host network — so 127.0.0.1 works there but stops working the moment you add a second machine. Use the host’s real address from the start.
The database and Redis hostnames are compose service names, resolvable only inside the starforge-internal network. Bring the whole stack up with compose; a bare docker run of the app image fails with failed to resolve host 'postgres'.

Confirm it worked

Then open the console. The first visit runs the onboarding that creates the first administrator.

Moving off one machine

Compose with the local backend tops out at one host. When you outgrow it, you register a second Fleet rather than migrating: a node Fleet for several bare-metal boxes, or move the console itself into Kubernetes. The jobs already on the first Fleet stay where they are.