agent-compose installer

July 30, 2026 ยท View on GitHub

The installer deploys agent-compose with Docker Compose on Linux amd64 and arm64. A small Bash bootstrap downloads the matching Go binary; the Go program owns installation, upgrade, uninstall, validation, and rollback.

Quick start

Interactive installation opens a bilingual TUI:

curl -fsSL https://github.com/chaitin/agent-compose/releases/download/installer-latest/install.sh | bash

The default installation directory is /opt/agent-compose. Run the bootstrap with sudo when the current user cannot write there. The installer is retained as /opt/agent-compose/installer, so later operations can run directly:

sudo /opt/agent-compose/installer upgrade
sudo /opt/agent-compose/installer uninstall

Docker Engine and the Docker Compose v2 plugin must already be installed. The installer detects missing prerequisites and prints guidance; it does not modify the host package manager or install Docker automatically.

Non-interactive CLI

The bootstrap forwards all arguments to the downloaded binary:

# Install the latest application release.
curl -fsSL https://github.com/chaitin/agent-compose/releases/download/installer-latest/install.sh | \
  sudo bash -s -- install --yes

# Select a release, directory, registry, supported UI version, or guest image.
sudo /opt/agent-compose/installer install \
  --version v1.2.3 \
  --dir /srv/agent-compose \
  --registry registry.example.com \
  --with-ui \
  --frontend-version v2 \
  --port 8080 \
  --guest-image registry.example.com/team/agent-compose-guest:v1.2.3 \
  --yes

# Skip the guest image pre-pull; the first sandbox downloads it instead.
sudo /opt/agent-compose/installer install --skip-guest-pull --yes

# Update installer-managed image references to the latest application release.
sudo /opt/agent-compose/installer upgrade --yes

# Prepare and validate files without pulling images or starting services.
sudo /opt/agent-compose/installer install --no-start --yes

The legacy top-level form, including --upgrade, --dir, --version, --image-prefix, --backend-image, --frontend-image, --no-start, and --yes, remains accepted for existing automation. These compatibility image flags are hidden from help. New automation should use --registry, --frontend-version, --guest-image, and the explicit install, upgrade, and uninstall subcommands. --registry and --image-prefix are mutually exclusive.

Environment overrides retained for automation are:

  • AGENT_COMPOSE_REPO: GitHub repository used for downloads;
  • AGENT_COMPOSE_INSTALL_DIR: default installation directory;
  • AGENT_COMPOSE_FRONTEND_VERSION: supported frontend tag selected by legacy automation;
  • AGENT_COMPOSE_YES=1: skip confirmation;
  • AGENT_COMPOSE_INSTALLER_RELEASE: bootstrap release tag, primarily for mirrors and release verification.
  • AGENT_COMPOSE_INSTALLER_BASE_URL: complete bootstrap asset base URL for a mirror or controlled test release.
  • AGENT_COMPOSE_RELEASE_BASE_URL: complete application bundle base URL for a mirror or controlled test release.

Installation and upgrade behavior

The installer downloads agent-compose-installer.tar.gz and its checksum from the selected application Release. It requires a matching SHA-256 entry and accepts only the expected regular files from the archive.

Before changing the target, it validates paths, rejects symlinked managed targets, creates candidate configuration in a temporary directory, and prints the plan in interactive mode. Managed files are replaced atomically. If Compose validation, image pulling, or startup fails, the previous files and modes are restored; an existing deployment is restarted after restoration.

On first installation the installer generates AUTH_SECRET and an admin password. The password is printed once and stored in .env. Existing settings are preserved. During upgrade, image references advance only when their current value still matches .installer-state.env; user overrides are never replaced.

The interactive form accepts one optional registry host. It replaces only the registry component of all Release-managed references and preserves the full repository path, tag, or digest. For example, chaitin/agent-compose:v1 becomes registry.example.com/chaitin/agent-compose:v1. This is not a Docker registry mirror: transparent mirrors require separate dockerd configuration and do not change image references. When the field is empty, the TUI displays Docker Hub (docker.io) as a hint but leaves the Release image references unchanged.

The Release manifest declares a default frontend version and an ordered list of supported versions. The TUI presents that list beside the Web UI toggle; --frontend-version provides the same validated selection for automation. An upgrade preserves the selected version while the new Release still supports it and stops for an explicit choice otherwise. Releases without a list expose their default as the only choice.

The sandbox guest image remains independently configurable with --guest-image. Hidden compatibility options can still override complete backend and frontend references, and a complete reference wins over Registry or version-derived values. The legacy --image-prefix retains its old namespace-prefix behavior. Installer choices are recorded in .installer-state.env so later upgrades preserve them.

New installations persist AGENT_COMPOSE_DATA_DIR=./data. If an older database exists only under ./data/agent-compose, that path is retained. When databases exist in both layouts, installation stops until the operator sets AGENT_COMPOSE_DATA_DIR to the authoritative location.

The installer checks /dev/kvm only on first selection:

  • without KVM, COMPOSE_FILE=docker-compose.yml is persisted;
  • with KVM, COMPOSE_FILE=docker-compose.yml:docker-compose.kvm.yml is persisted.

An existing explicit COMPOSE_FILE is preserved. This chooses deployment topology; it does not prove KVM permissions or BoxLite/Microsandbox health.

Uninstall

Ordinary uninstall stops the Compose project and removes installer-managed Compose files, state, and the retained installer binary. It deliberately keeps .env and persistent data so a later installation can recover them:

sudo /opt/agent-compose/installer uninstall

Permanent removal requires the explicit purge option and confirmation:

sudo /opt/agent-compose/installer uninstall --purge

Purge removes only recognized installer configuration and data. Unknown files keep the installation directory in place and are reported as leftovers. Neither uninstall form removes shared Docker image caches or Compose volumes.

Operating the deployment

The base installation starts the daemon. The web UI stays in the optional with-ui profile unless the installer was told to include it (--with-ui, or the Install web UI form field), which persists COMPOSE_PROFILES=with-ui in .env. To enable it afterwards:

cd /opt/agent-compose
docker compose --profile with-ui up -d
docker compose ps
docker compose logs -f
docker compose down

The base topology mounts the Docker socket without privilege or KVM. Use the persisted KVM overlay only on a prepared host when selecting BoxLite or Microsandbox.

It also mounts the Linux host's /etc/localtime read-only so daemon-local cron schedules follow the host timezone. Set TZ in .env only when the daemon should intentionally use another timezone, then restart the daemon.

Release model

The fixed installer-latest prerelease contains:

AssetPurpose
install.shLinux OS/architecture bootstrap
agent-compose-installer-linux-amd64amd64 Go installer
agent-compose-installer-linux-arm64arm64 Go installer
SHASUMS256.txtinstaller binary checksums

It is updated only by manually dispatching the Publish Installer workflow. Because the release is marked prerelease, it does not replace the latest normal application Release.

Normal application releases contain the architecture-independent deployment bundle, bootstrap copy, and bundle checksum. The installer binary need not be rebuilt for ordinary application releases unless the payload protocol changes. The release workflow reads the optional repository variables AGENT_COMPOSE_FRONTEND_VERSION and AGENT_COMPOSE_FRONTEND_VERSIONS; when unset, both default to the single latest frontend choice.

Contributor verification

task test:deploy
task test:scripts
task lint

The deterministic installer checks use fake command/network boundaries and do not require a running Docker daemon, KVM, network access, or runtime sandboxes.

For an isolated real-Docker demonstration, including local HTTP releases, a local OCI registry, install, upgrade, uninstall with data preservation, and reinstall, run:

task demo:installer-docker

The command prints a state file and leaves the final v2 container, registry, installation directory, and logs running for manual inspection. Use the printed cleanup-installer-docker-demo.sh command when finished. Sourcing the state file exports the local installer/application Release URLs and the demo installation directory. It also exports a unique Compose project name so retained demos can run side by side and the ordinary bootstrap can be rerun directly.