A self-hosted orchestration system crafted for power users. composia.xyz


title: "Source Build" date: '2026-05-26T00:00:00+08:00' weight: 20 #

Build from source when you need custom patches, development binaries, or packaging work.

Prerequisites #

  • Go, as declared in mise.toml and go.mod.
  • Git, for version stamping and repository operations.

Use mise to install the project toolchain:

mise install

Build with the script #

The build script writes output to dist/<os>_<arch>/ and generates checksums when sha256sum is available:

sh scripts/build/binaries.sh

On Linux it builds:

  • composia
  • composia-controller
  • composia-agent

On macOS and Windows it builds the CLI only.

Build variables #

Variable Default Purpose
VERSION git describe --tags --always --dirty Version embedded into binaries.
OUTPUT_DIR dist Output directory.
GOOS Host OS Target OS.
GOARCH Host architecture Target architecture.
GOARM Empty ARM variant, such as 7.
CGO_ENABLED 0 Static cross-builds.

Examples:

GOOS=linux GOARCH=arm64 sh scripts/build/binaries.sh
GOOS=linux GOARCH=arm GOARM=7 sh scripts/build/binaries.sh

Manual Go build #

LDFLAGS="-s -w -X forgejo.alexma.top/alexma233/composia/internal/version.Value=$(git describe --tags --always --dirty)"

CGO_ENABLED=0 go build -trimpath -ldflags "$LDFLAGS" -o composia ./cmd/composia
CGO_ENABLED=0 go build -trimpath -ldflags "$LDFLAGS" -o composia-controller ./cmd/composia-controller
CGO_ENABLED=0 go build -trimpath -ldflags "$LDFLAGS" -o composia-agent ./cmd/composia-agent

Build container images #

The root Dockerfile has targets for each runtime:

docker build --target cli -t composia-cli:local .
docker build --target controller -t composia-controller:local .
docker build --target agent -t composia-agent:local .
docker build --target dev -t composia-dev:local .

The dev image includes Go, Air, Docker CLI, Docker Buildx, Docker Compose, and Git.