canette
Self-hosting

Environment variable reference

Configure canette services directly with environment variables instead of Helm.

The Helm chart is the recommended way to deploy canette. It sets all of these variables for you and manages secrets safely. Use this page if you are deploying canette without Helm — for example, on bare metal, with a custom orchestrator, or in a development environment running services locally.

Each canette service is a single binary or container. All configuration is provided through environment variables — there are no config files.

API (canette-api)

VariableRequiredDescription
DATABASE_URLyesPostgreSQL connection string, e.g. postgresql://user:pass@host:5432/canette
ENCRYPTION_KEYyes32-byte AES-256-GCM key used to encrypt git credentials and app secrets at rest. Generate with openssl rand -hex 32.
BETTER_AUTH_SECRETyesSecret used to sign auth sessions. Generate with openssl rand -hex 32.
UI_URLyesPublic base URL of the UI, e.g. https://canette.example.com. Used for CORS and redirect URLs.
BETTER_AUTH_URLyesSame as UI_URL — used by better-auth for callback URL construction.
LOGSTREAMER_URLyesInternal URL of the logstreamer service, e.g. http://logstreamer:8080.
LOGSTREAMER_SECRETyesShared secret for API → logstreamer authentication. Must match LOGSTREAMER_SECRET on the logstreamer.
PORTnoPort the API listens on. Default: 3000.
GITHUB_CLIENT_IDnoGitHub OAuth app client ID.
GITHUB_CLIENT_SECRETnoGitHub OAuth app client secret.
GOOGLE_CLIENT_IDnoGoogle OAuth client ID.
GOOGLE_CLIENT_SECRETnoGoogle OAuth client secret.
GITHUB_APP_IDnoGitHub App ID (for GitHub App git credential type).
GITHUB_APP_INSTALLATION_IDnoGitHub App installation ID (for system credential mode).
GITHUB_APP_PUBLIC_LINKnoGitHub App public URL or slug, e.g. https://github.com/apps/my-app.
GITHUB_APP_PRIVATE_KEY_FILEnoPath to the GitHub App RSA private key PEM file.
DEFAULT_CPU_REQUESTnoDefault CPU request for app deployments. Default: 100m.
DEFAULT_MEMORY_REQUESTnoDefault memory request for app deployments. Default: 128Mi.
DEFAULT_CPU_LIMITnoDefault CPU limit for app deployments. Default: 500m.
DEFAULT_MEMORY_LIMITnoDefault memory limit for app deployments. Default: 512Mi.
WEBHOOK_BASE_URLnoPublic base URL used when registering webhooks with git providers. Defaults to UI_URL.
IMAGE_REPOnoRegistry address (same value as on the builder). Used by the API to resolve the active scan provider for the admin settings display.
SCAN_PROVIDERnoMirrors the builder value — used to display the active scan configuration in the admin UI.
SCAN_ENABLEDnoMirrors the builder value — displayed in the admin UI.
SCAN_MANDATORYnoMirrors the builder value — displayed in the admin UI.
SCAN_FAIL_SEVERITYnoMirrors the builder value — displayed in the admin UI.
DISABLE_EMAIL_SIGNUPnoSet to true to prevent new users from signing up via email. Default: false.
RUN_MIGRATIONSnoSet to false to skip running database migrations at startup. Default: true.

Builder (canette-builder)

VariableRequiredDescription
DATABASE_URLyesPostgreSQL connection string.
ENCRYPTION_KEYyesSame key as the API — used to decrypt git credentials for cloning.
IMAGE_REPOyesRegistry address build jobs push images to, e.g. registry.canette-system.svc.cluster.local:5000/. Include the trailing slash.
BUILDKITD_ADDRyesBuildKit daemon address, e.g. tcp://buildkitd.canette-system-build.svc.cluster.local:1234.
BUILDER_IMAGEyesImage used for the build step in build jobs (railpack + buildctl), e.g. ghcr.io/canette/canette-builder-image-build:1.0.0.
GIT_INIT_IMAGEyesImage used for the git-clone init container in build jobs, e.g. ghcr.io/canette/canette-builder-git-init:1.0.0.
BUILDER_NAMESPACEyesKubernetes namespace where build jobs are created, e.g. canette-system-build.
REGISTRY_AUTH_SECRETnoName of the Kubernetes Secret containing docker config JSON for registry authentication. Mounted into build job pods.
SCAN_PROVIDERnoScan backend: auto, trivy, ecr, or none. auto (default) selects ecr for ECR registries and trivy otherwise.
SCAN_ENABLEDnotrue or false. Leave empty (default) for provider-aware defaults: ECR scanning is enabled, Trivy scanning is disabled.
SCAN_MANDATORYnoSet to true to block deployments when the scan finds issues at or above SCAN_FAIL_SEVERITY. Default: false.
SCAN_FAIL_SEVERITYnoSeverity threshold for mandatory scans: CRITICAL, HIGH, MEDIUM, or LOW. Default: HIGH.
SCAN_SBOM_ENABLEDnoSet to true to generate a CycloneDX SBOM alongside vulnerability findings. Requires a second Trivy pass (~30–60 s extra). Default: false.
TRIVY_IMAGEnoTrivy image used when SCAN_PROVIDER=trivy. Default: aquasec/trivy:0.70.0.
POLL_INTERVALnoHow often to poll for pending builds. Default: 5s.
MAX_CONCURRENTnoMaximum number of concurrent builds. Default: 3.
GITHUB_APP_IDnoGitHub App ID (for GitHub App git credential type).
GITHUB_APP_INSTALLATION_IDnoGitHub App installation ID.
GITHUB_APP_PRIVATE_KEY_FILEnoPath to the GitHub App RSA private key PEM file.

Controller (canette-controller)

VariableRequiredDescription
DATABASE_URLyesPostgreSQL connection string.
ENCRYPTION_KEYyesSame key as the API — used to decrypt app secrets when creating Kubernetes Secrets.
GATEWAY_NAMEyesName of the Gateway resource that app HTTPRoutes attach to.
GATEWAY_NAMESPACEyesNamespace of the Gateway resource.
PULL_REPOyesRegistry prefix kubelets use to pull app images, e.g. registry.example.com/. Must be reachable from cluster nodes. Include the trailing slash.
BUILDER_NAMESPACEyesKubernetes namespace where build jobs run — used to watch build Job status.
CLUSTER_DOMAINnoCluster DNS domain. Default: cluster.local.
POLL_INTERVALnoHow often to poll for pending deployments. Default: 5s.
LOG_TAIL_INTERVALnoHow often to tail build logs. Default: 10s.
MAX_CONCURRENTnoMaximum number of concurrent deployments. Default: 3.

Logstreamer (canette-logstreamer)

VariableRequiredDescription
LOGSTREAMER_SECRETyesShared secret — requests from the API must include this as a Bearer token.
ADDRnoAddress and port to listen on. Default: :8080.

On this page