Stand up a complete Crawdad fleet — console and relay, with a built-in internal CA — with one command. Then enroll your first device and set policy.
curl -fsSL https://getcrawdad.dev/fleet-install.sh | sh
The installer checks your environment (Docker, Compose v2, ports, disk), downloads the fleet archive, runs the idempotent bootstrap (init-fleet.sh), and verifies the fleet is working.
At the end it prints your console URL, operator login key (shown once), and a ready-to-paste enroll command with the real --ca-fingerprint.
CRAWDAD_FLEET_DIR to change the install directory (default: $HOME/.crawdad-fleet). Port overrides: RELAY_PORT (8800), CONSOLE_PORT (9000).Two services on one host:
| Service | Port | Purpose |
|---|---|---|
| Relay | 8800 | Opaque mTLS message router |
| Console | 9000 | Fleet management UI/API with embedded dashboard and built-in internal CA (InternalCa) |
init-fleet.sh is idempotent — safe to re-run. It performs these steps:
.fleet.envopenssl (SAN: relay, localhost)--init-admin (Ed25519 keypair + cert signed by InternalCa)--init-operator admin (creates first operator, prints API key once)Open http://localhost:9000 and log in with the operator key from the installer output.
On the target machine (where the sidecar is installed):
curl -fsSL https://getcrawdad.dev/install.sh | sh crawdad enroll \ --token et_TOKEN \ --console-url https://fleet-host:9000 \ --ca-fingerprint sha256:FINGERPRINT
Replace with the values from the console’s copy-paste command. The --ca-fingerprint pin verifies the root CA before the device trusts anything — see Enrollment for the trust model.
In the console, create a policy template on the scope (Control lens → policy section). The device inherits it immediately. The device is now enrolled, connected via mTLS, and receiving fleet commands.
# View logs cd ~/.crawdad-fleet && docker compose -f docker-compose.fleet.yml logs -f # Stop the fleet cd ~/.crawdad-fleet && docker compose -f docker-compose.fleet.yml stop # Start the fleet cd ~/.crawdad-fleet && docker compose -f docker-compose.fleet.yml up -d # Uninstall (destroys all data) curl -fsSL https://getcrawdad.dev/fleet-install.sh | sh -s -- --uninstall # Reset (tear down + reinstall fresh) curl -fsSL https://getcrawdad.dev/fleet-install.sh | sh -s -- --reset
The operator key is shown once during install. If you lose it:
# List operators cd ~/.crawdad-fleet && docker compose -f docker-compose.fleet.yml \ exec console crawdad-console operator list # Reset a key (prints new key once) cd ~/.crawdad-fleet && docker compose -f docker-compose.fleet.yml \ exec console crawdad-console operator reset-key --id <operator-id> # Create a new operator cd ~/.crawdad-fleet && docker compose -f docker-compose.fleet.yml \ exec console crawdad-console operator create --name <name>
The installer checks all of these before touching anything:
curl, openssl, base64, tarFor custom infrastructure or deploying components separately, see the Console Guide and the full deployment reference (covers manual relay and console setup, including the built-in internal CA).
| Flag | What it does | When to run |
|---|---|---|
--init-admin | Generates Ed25519 admin signing identity (key + cert signed by InternalCa) | Once, before first console start |
--init-operator NAME | Creates the first operator with a random API key. Refuses if operators exist. | Once, after --init-admin |
RELAY_REQUIRE_MTLS=true (the default). Running without mTLS is dev-only.RELAY_MGMT_TOKEN is generated randomly by init-fleet.sh. Required for the relay’s revocation endpoint.