Installation

The whole stack in one click, with no server to maintain.

  1. Open the Railway deploy template for It's a Plan.
  2. Give Railway two hostnames. You need a domain of your own — Railway does not provide one.
  3. Railway generates every secret for you.

Self-host with Docker#

Requirements: Docker and a domain behind a TLS-terminating reverse proxy.

git clone https://github.com/croffasia/itsaplan.git
cd itsaplan
cp .env.example .env
# fill in the eight required values below
docker compose up -d

The stack refuses to start while one of these is missing:

Variable Value
API_URL public origin of the API
APP_URL public origin of the web app
POSTGRES_PASSWORD openssl rand -base64 32
BETTER_AUTH_SECRET openssl rand -base64 32
APP_ENCRYPTION_KEY openssl rand -base64 32
S3_ACCESS_KEY_ID the RustFS root user, any name over 3 chars
S3_SECRET_ACCESS_KEY openssl rand -base64 32

If you have Bun installed, bun install && bun run setup generates these for you — answer Generate env, then answer no when it offers to write the files, and it prints .env and apps/web/.env for you to copy onto the server.

.env.example documents every variable, including the optional ones: legal document URLs, passkey and cookie settings, telemetry opt-out, and worker tuning.

The four services run from the images published on each release. Set VERSION in .env to pin a release instead of always running the newest. The api applies database migrations automatically when it starts, and the first account you register becomes the instance admin.

Building from source instead of pulling images#

docker compose up -d --build

This builds every service from your checkout and runs those images — useful if you're running on an unsupported architecture or want local changes reflected immediately.

Updating#

git pull
docker compose pull
docker compose up -d

Before applying migrations, the api dumps the database into the db-backups volume (/backups in the api container) and refuses to start if that dump fails. Dumps are deleted after 30 days by default; BACKUP_RETENTION_DAYS changes the window, and SKIP_PRE_MIGRATION_BACKUP=1 skips the dump for operators who back up by other means.

Deploy on Coolify#

The same Docker stack, run on a Coolify instance — import the project's compose file as a Coolify resource and set the same required variables as the Docker section above.

Deploy on Kubernetes#

A Helm chart is available for any Kubernetes cluster, covering the same services and required variables as the Docker deployment.

After you deploy#

  • The first account you register on a fresh instance becomes the instance admin.
  • Set up single sign-on or SCIM provisioning — see Self-hosting: SSO and SCIM.
  • Turn on AI agents for a project and connect a coding agent CLI — see AI agents.

Updated

Was this page helpful?