Install TOW
TOW ships as a small deployment kit: one Compose file, a guided installer, and the operations scripts. The application itself comes as prebuilt images from Docker Hub, so you never compile anything.
Requirements
- A Linux host with Docker Engine and the Compose plugin (Compose 2.24 or newer). 4 GB RAM recommended.
- For production: a domain name and an SMTP relay for outgoing email (invites, verification, password recovery).
- For backups (strongly recommended):
age(apt install age) and systemd.
Install
git clone https://github.com/theonlyworkspace/tow-deployment.git
cd tow-deployment
./install.sh
The installer asks how the deployment will be used and takes care of the rest:
- Production or local evaluation. Evaluation brings TOW up on
http://localhost:8080with no further questions. Production asks for your domain and who terminates TLS. - Sign-in. Built-in email/password accounts, or the bundled authentik identity provider for SSO, MFA, and LDAP/SAML/OIDC.
- Email and AI keys. Configure SMTP now or later; OpenAI and Exa keys are optional and can stay blank.
- Backups. The installer offers to set up daily encrypted backups; say yes before real users arrive.
- Account deletion. Production installs can continue straight into
permanent account deletion setup
(
scripts/setup-erasure.sh) once backups exist.
Every secret is generated for you and written to .env (file mode 600).
Runtime settings land in config/tow.yaml. Both files are yours: re-running
./install.sh never overwrites a value you have set, it only fills in keys a
newer release introduced. Use ./install.sh --reconfigure to change your
answers later.
First sign-in
- Built-in auth: open your TOW URL and register; the first account becomes the server administrator and first organisation owner.
- authentik: sign in with the bootstrap admin (email you provided, password
in
AUTHENTIK_BOOTSTRAP_PASSWORDin.env). The first successful OIDC login becomes the server administrator.
Then work through the go-live checklist before opening the deployment to users.
Unattended installs
Every question has a flag, so configuration management can run the installer non-interactively:
./install.sh --non-interactive --domain https://tow.example.com \
--auth builtin --smtp-host smtp.example.com --with-backups
See ./install.sh --help for the full list.
Prefer to assemble the files by hand?
Everything the installer writes is documented: .env.example explains every
secret and config/tow.example.yaml every runtime setting, both in the deploy
kit. Copy them to .env and config/tow.yaml, fill the empty values, and run
docker compose up -d --wait. The runtime configuration
page explains how the two files relate.
Next steps
- Production hardening: TLS, your own reverse proxy, proxy headers, streaming timeouts.
- authentik and SSO: path or subdomain layouts, public signup, organisation-managed providers.
- Back up and restore: what the backup contains and how to do a restore drill.
- Upgrades: moving between releases safely.
- Air-gapped and private registries: running without Docker Hub access.