Install Crewship
Crewship ships as a single, statically-linked Go binary with the Next.js frontend embedded viago:embed. There is no Node runtime at
production deploy time, and the only hard dependency is a container
runtime if you intend to run agents (Docker, Podman, Colima, OrbStack,
Apple Containers, or Rancher Desktop).
Pick the install path that matches how you run software locally — the
options below are first-class and tested on every release.
Homebrew
macOS and Linuxbrew — one command, auto-upgrades.
curl | bash
OS-agnostic install script with SHA-256 + cosign verification.
Debian / RPM packages
apt/dnf-managed install with a bundled systemd service.Docker
Official multi-arch image, or Compose from source.
Homebrew
The release pipeline publishes two Homebrew formulae on every tag tocrewship-ai/homebrew-tap (PR #444): a full binary that runs the daemon + embedded Next.js UI + CLI, and a CLI-only binary that’s about half the size and only talks to a remote crewshipd.
The two formulae declare
conflicts: against each other, so Homebrew refuses to install both on one host. Both archives ship the binary under the same name (crewship), so existing scripts keep working when you switch formulae.
Running a daemon-only subcommand from the CLI-only binary produces cobra’s
unknown command "start" error. If you need to bring up a daemon, install the full formula instead.The bundled
crewship-sidecar is always a Linux binary, even in the macOS
archive and Homebrew formula — it is bind-mounted into your Linux agent
containers and executed there, never on the host. Don’t be surprised when
file reports it as an ELF executable on a Mac; that’s by design (#953).brew tap step. Upgrades follow the normal flow:
curl | bash
The one-liner installer detects your OS and architecture, downloads the matching release archive from GitHub, verifies the SHA-256 against the signedchecksums.txt, and — when cosign is on your PATH — also
verifies the keyless Sigstore signature against the expected GitHub
Actions OIDC identity.
The short
https://crewship.ai/install alias will point at this
script once the project website goes live; until then, fetch it
straight from the repo as shown above.cosign produces a soft warning rather than a hard failure so
the one-liner keeps working for first-time users — install it from
sigstore.dev/cosign
for full supply-chain verification.
Pinning a version
Custom install directory
By default the script prefers a no-sudo user dir on yourPATH
($XDG_BIN_HOME, then ~/.local/bin) and falls back to
/usr/local/bin. Override with:
What the script does
uname -sm→ resolvesOS-arch→ picks the matching release archive.- Downloads the archive and
checksums.txtover TLS. - Computes SHA-256 of the archive, matches against the line in
checksums.txt. - If
cosignis present, verifies the archive’s signature againstEXPECTED_CERT_IDENTITY_RE = https://github.com/crewship-ai/crewship/.github/workflows/release.yml@.*andEXPECTED_OIDC_ISSUER = https://token.actions.githubusercontent.com. - Extracts and moves the
crewshipbinary into the install directory.
scripts/install.sh.
Debian / RPM packages
Every release publishes native.deb and .rpm packages (amd64 + arm64)
alongside the archives. They install the crewship and crewship-sidecar
binaries, the entrypoint.sh runtime helper, and a systemd unit so a VM or
bare-metal host runs Crewship as a managed service.
crewship service account (and adds it to the
docker group when Docker is installed), installs the unit, but deliberately
does not enable or start it. There are no secrets to configure first —
crewship auto-generates ENCRYPTION_KEY and NEXTAUTH_SECRET on first start
and persists them under /var/lib/crewship:
Upgrades go through the package manager (
apt-get install --only-upgrade crewship / dnf upgrade crewship). The postinstall runs systemctl try-restart, so a running service picks up the new binary automatically
(with its pre-migration snapshot) while a stopped one is left alone. On these
installs crewship self-update deliberately refuses and points you back at
apt/dnf — see Upgrading & Downgrading.
Verifying package signatures
Release.deb / .rpm packages are GPG-signed with the Crewship Packages
key (packages@crewship.ai, fingerprint
EDE8 25B5 5FF8 7F7D 442B 82BA A5BA 4669 E217 C05C). The public key is committed at
packaging/crewship-packages.pub:
A hosted APT/DNF repository (signed
Release / repomd.xml) is a tracked
follow-up. Package integrity can also be verified against the release
checksums.txt.macOS notarization is pipeline-ready but currently INACTIVE. The release
pipeline signs and notarizes the macOS artifacts only when the
MACOS_SIGN_P12 signing certificate is configured, and it is not provisioned
today — so published macOS builds are unsigned and Gatekeeper will still warn
(“cannot be opened because the developer cannot be verified”) on first launch.
Until the certificate is in place, verify the macOS download against
checksums.txt and clear the quarantine attribute yourself:Docker Compose
The repo ships a production-grade compose file atdocker/docker-compose.prod.yml. It builds an image from the
checked-out source, brokers all Docker API access through a
docker-socket-proxy sidecar (so the crewship container never touches
the raw socket), and exposes the single port (8080 by default) on the
host.
Quickstart
NEXTAUTH_SECRET and ENCRYPTION_KEY are required — the compose
file declares them with the ${VAR:?... is required} form, so the
stack refuses to start if either is unset. Provide them via a project-
root .env file (or the compose environment: block, an external
vault, Docker secrets, a Kubernetes secret mount, …).
The server is reachable on http://localhost:8080 once the
healthcheck (/healthz) reports healthy — typically within 10 seconds.
Defaults
ENCRYPTION_KEY and NEXTAUTH_SECRET are required in the compose
environment: block (the prod compose declares them with
${VAR:?... is required}, so an unset value aborts up). Set them in
.env and they persist across restarts because Compose reads .env
each time the stack starts.
PostgreSQL
PostgreSQL is on the v0.2 roadmap. The beta runs exclusively on
SQLite via
modernc.org/sqlite (single binary, WAL mode, no extra
services). The server accepts only file: DSNs on DATABASE_URL —
there is no Postgres driver in the binary today, so a postgres://
URL will not connect. The commented-out postgres: service block in
docker/docker-compose.prod.yml is a placeholder for that v0.2
work; leave it commented for now.Docker socket: brokered through a socket proxy by default
The prod compose does not mount/var/run/docker.sock into the
crewship container. Instead it ships a
Tecnativa docker-socket-proxy
sidecar that holds the only :ro mount of the raw socket, and points
crewship at it via DOCKER_HOST: tcp://docker-socket-proxy:2375. The
proxy enforces a defaults-deny allow-list (CONTAINERS, EXEC,
IMAGES, NETWORKS, VOLUMES, INFO, POST); widen it explicitly
if you add a feature that needs another endpoint.
The full container threat model is documented in the
Security threat model.
Windows
Each release ships two native Windows builds (beta) on the releases page:crewship-cli_<version>_windows_<arch>.zip— the lightweight CLI for driving a Crewship server running elsewhere (a Linux box, a NAS, WSL).crewship_<version>_windows_<arch>.zip— the full daemon: server, dashboard, and agent orchestration on your Windows machine.
CLI against a remote server
Full daemon (requires Docker Desktop)
Agents always run in Linux containers — install Docker Desktop (WSL 2 backend) first. The daemon finds it via thedocker_engine named
pipe automatically; a custom engine needs DOCKER_HOST set.
- Data lives under
%USERPROFILE%\.crewshipby default, as on other platforms. Server-style installs that setDATABASE_URLexplicitly get machine-wide defaults under%ProgramData%\crewship(instead of the Unix/var/lib/crewship). - Hook commands run under
cmd.exe /cinstead ofsh -c— write hook command lines in cmd syntax. crewship self-updateworks: the runningcrewship.exeis parked ascrewship.exe.oldduring the swap and cleaned up on the next run.self-update --server(systemd orchestration) is Linux-only; on Windows update the binary and restart the daemon yourself.- SHA-256 checksums cover both zips (
checksums.txton the release); verify withGet-FileHash -Algorithm SHA256 crewship_*.zip.
windows label.
Verifying the install
After any of these paths:crewship doctor runs the following checks (each PASS / WARN /
FAIL with a one-line detail):
- Container runtime detected and socket responds — when it fails, the
detail distinguishes installed but not running (with the exact
start command, e.g.
open -a Dockerorsudo systemctl start docker) from not installed (with an OS-specific install pointer) - Data directory present (with
--fixit gets created) - Data directory writable
- Database migration version current
- Sidecar binary present
NEXTAUTH_SECRETis set- Server reachable on its configured port
--fix enables safe auto-repairs (currently: create the data
directory if missing). To check whether crash-reporting telemetry is
opted in, use crewship telemetry status instead — that’s a separate
command.
Next stop: quickstart for the first run and admin user
bootstrap. For development work (running the Go server + Next.js dev
server side-by-side), see Developer installation.
Air-gapped / offline installs
Download the release tarball +checksums.txt + (optionally) the
cosign bundle from GitHub Releases on a network-connected machine,
verify it manually with sha256sum -c and cosign verify-blob, and
copy the binary to your target host. The binary has no runtime fetch
behavior — no embedded analytics, no auto-update — so once it’s on
disk you’re done.
For air-gapped Docker hosts, docker save ghcr.io/crewship-ai/crewship:v0.1.0-beta.1
into a tarball on a connected machine, transfer, then docker load
on the target. (The image publishes only to GHCR — there is no Docker Hub
mirror, so the ghcr.io/ prefix is required.)
Related
- Quickstart — first run, admin bootstrap, seeding demo data.
- Developer installation — building from source,
dev.sh, multi-instance layout. - Environment variables — full reference of
CREWSHIP_*knobs. - Telemetry — opt-out before the first start if you prefer.