
# Install

On a Linux host, as a sudoer:

```bash
curl -fsSL https://acahti.benchyard.com/install.sh | bash -s -- --domain acahti.example.com
```

The script installs Docker if it is missing, pulls the release image from `ghcr.io/benchyard/acahti`, copies its compose file and host scripts into `~/acahti`, generates secrets into `~/acahti/.env`, and starts the instance. Nothing is built on the host.

Or let your coding agent do it:

```text
Install https://acahti.benchyard.com/install.md
Self-host Acahti on my infrastructure. Ask me for the domain, SSH access, and Runner host.
```

## Have ready

- A Linux host with sudo and at least 2 GiB RAM.
- A public HTTPS hostname. You terminate TLS at your own reverse proxy or tunnel and forward it to the gateway.
- Optionally, a second host for the **Runner**, reachable over SSH from the first. CI never runs on the control plane.

## Options

| Option | `.env` | Meaning |
|---|---|---|
| `--domain HOST` | `DOMAIN`, `ROOT_URL` | Public hostname; required on first install |
| `--org NAME` | `ACAHTI_ORG` | Organization repositories live under (default `acme`) |
| `--runner SSH` | `ACAHTI_BUILD` | Runner host, set up over SSH, such as `ci@10.0.0.5` |
| `--modules LIST` | `ACAHTI_MODULES` | Optional modules: `work`, `argos`, `chat` |
| `--bind ADDR` | `GATEWAY_BIND` | Gateway listen address (default `127.0.0.1:8080`; `0.0.0.0:8080` when a Runner is set) |
| `--version X.Y.Z` | `ACAHTI_VERSION` | Release to install (default: the latest) |
| `--dir PATH` | | Install directory (default `~/acahti`) |

Options are written to `.env` and kept for later runs. With the `argos` module, also set `ARGOS_TOKEN` in `.env`. Data lives under `ACAHTI_DATA` (default `/var/lib/acahti`).

## After install

1. Point your proxy or tunnel at the gateway and open the instance URL.
2. Invite members from the web app. Each person joins at `<instance>/join`.
3. Paste the agent prompt from the instance home page into a coding agent, open the Board, and watch it run the [demo loop](/demo.md).

## Upgrade

Back up PostgreSQL and `ACAHTI_DATA`, then run the installer again:

```bash
curl -fsSL https://acahti.benchyard.com/install.sh | bash
```

It installs the latest release, keeps `.env` and data, and resyncs the Runner. `--version` pins a release. Never `docker compose down -v` on a live instance.
