Skip to main content

Prerequisites

  • A Linux or macOS host with Docker 24+ and Docker Compose v2.20+
  • 2 CPU cores and 4 GB of memory or more
  • A hostname for Tierity, and ports 80 and 443 open if you want an automatic HTTPS certificate
The stack includes PostgreSQL and Redis, so you don’t need to run them separately.

Install

The installer asks a few questions, writes docker-compose.yml and .env files, and starts Tierity:
Read a script before piping it to your shell: curl -fsSL https://tierity.com/resources/self-host.sh -o self-host.sh && less self-host.sh.
It asks for: When it finishes, open the base URL and sign in with the admin account.
Some names in the installed stack, such as the ~/pwnbook directory, the armisticegroup/pwnbook images and PWNBOOK_* variables, still use Tierity’s former name. They’re kept so existing installs keep working.

What runs

Database migrations run automatically when the backend starts.

Sign-in modes

Set with AUTH_PROVIDER in backend/.env:
The admin account is created on first start. If no admin is configured, Tierity opens a setup wizard instead.

Environment variables

These live in backend/.env.

Required

Changing VCS_ENCRYPTION_KEY, or SESSION_SECRET when no encryption key is set, makes every stored credential unreadable; people would have to re-enter them. Set VCS_ENCRYPTION_KEY once, back it up with your database, and don’t rotate it without a re-encryption plan.

Optional

Never commit .env files to version control.

HTTPS

Caddy gets and renews a Let’s Encrypt certificate for the hostname in the DOMAIN variable of the top-level .env. Hostnames ending in .local or .internal get a certificate from Caddy’s own local CA instead. For an IP address, uncomment tls internal in the Caddyfile.

Upgrading

Run the installer again and choose to upgrade, or pull new images yourself:
Migrations run automatically. Back up the database first.

Backups

The backend also has export and import scripts for moving an instance between hosts:
Back up backend/.env (and especially VCS_ENCRYPTION_KEY) with the database: a backup without its encryption key can’t decrypt stored credentials.

Health check

From outside, GET https://tierity.example.com/api/config returns 200 when the frontend and backend are both up.