-
Notifications
You must be signed in to change notification settings - Fork 0
Configuration
EPAR reads a small, strict YAML subset: indentation uses spaces, unknown sections and keys fail, comments outside quotes are ignored, and list values may use either [one, two] or an indented list. Put real credentials and machine-specific paths in .local/config.yml; tracked configuration files are examples.
- Lookup and parser rules
- Provider matrix
- Configuration reference
- Cross-field rules
- Provider defaults
- Short recipes
EPAR chooses the first available configuration path in this order: --config <path>, EPAR_CONFIG, ./.local/config.yml, then ~/.config/ephemeral-action-runner/config.yml. A relative file path in configuration is resolved from the project root when EPAR consumes it. ~ and ~/... are expanded for the configuration path, github.privateKeyPath, and each image.trustedCaCertificatePaths entry; do not assume they expand in other configuration properties.
The canonical config path owns its lifecycle-state namespace and may have only one active controller, even if its contents change while that controller runs. A separate host-wide prefix reservation prevents another config or project from using the same normalized pool.namePrefix. Distinct configs with distinct prefixes may run concurrently; use unique routing labels and separate log directories so jobs and diagnostics remain unambiguous.
github, image, pool, storage, logging, runner, security, provider, docker, dockerSandboxes, and timeouts are the only accepted top-level sections. security contains only the runnerGroup subsection. Values are strings unless this reference says integer, number, boolean, or list. Quote a value when it needs YAML-like punctuation; EPAR removes one matching pair of single or double quotes.
pool.logDir is a deprecated compatibility input. If logging.directory is absent, EPAR uses it and emits a warning; using both is rejected. pool.vmPrefix is an accepted alias for pool.namePrefix. image.profile and the old docker-socket provider are rejected rather than silently migrated.
External-outage supervision is an invocation policy, not YAML. Pass --external-outage-retry=off, --external-outage-retry=continuous, or a positive Go duration to start. EPAR reuses pool.replacementRetryInitialSeconds, pool.replacementRetryMaxSeconds, pool.replacementRetryMultiplier, and pool.replacementRetryJitterPercent for its delay curve; no configuration migration or duplicate retry settings are required.
| Provider | Host and artifact model | Image defaults | Provider-only configuration |
|---|---|---|---|
docker-sandboxes |
A Linux, macOS, or Windows host with healthy sbx diagnose --output json results builds and imports a native Linux runner template. EPAR uses native-only architecture admission by default and does not attempt QEMU/binfmt unless the mode is explicitly changed. |
image.distribution: local-build selects a Catthehacker source for the current build path. The preview prebuilt Act path acquires only EPAR's official verified reference and records the exact digest/attestation in local state. |
dockerSandboxes is required; provider.platform is linux/amd64 or linux/arm64; runner-group enforcement must be enforce; architectureEmulation selects best-effort, required, or native-only. |
docker-container |
Compatibility provider: a Docker-compatible host creates an outer disposable runner with its own inner Docker daemon. |
docker-image, ghcr.io/catthehacker/ubuntu:full-latest, output epar-docker-container-catthehacker-ubuntu. |
Optional provider.platform; docker proxy and mirror settings apply to its private daemon. |
wsl |
Compatibility provider: Windows WSL2 imports a Docker image or rootfs tar into disposable Linux distros. | Docker source defaults to Catthehacker full Ubuntu, x64, with output under work/images/. |
provider.installRoot controls WSL storage. |
tart |
Retired Apple Silicon Linux VM path retained for existing configurations and exact runtime/cleanup compatibility; it has no onboarding path. |
ghcr.io/cirruslabs/ubuntu:latest, output epar-ubuntu-24-arm64. |
provider.network and optional provider.rosettaTag. Validate the exact workload before relying on Rosetta. |
Four provider identities remain accepted at runtime and configuration, while three are onboarding-capable. Docker Sandboxes is wizard option 1 and the recommended default; the first screen offers C. Show compatibility providers, which reveals Docker Container (2) and WSL2 (3); Tart remains a runtime/configuration compatibility identity but is retired from onboarding. Docker Sandboxes never falls back to another provider. Its wizard is available when the required tooling, daemon diagnostics, and host-platform mapping pass; storage is estimated after image selection but never blocks provider selection or configuration creation. After the configuration is saved, ordinary startup performs storage admission, source resolution, policy fingerprinting, template construction, import, and exact readback before any runner starts. Warnings and skipped diagnostics remain visible, and provisioning failures preserve the desired configuration without silently running an old artifact.
For Docker Sandboxes, the initial wizard offers four ordered choices: 1. EPAR verified prebuilt Full (default), 2. EPAR verified prebuilt Act, 3. Catthehacker Ubuntu Full built locally, and 4. Catthehacker Ubuntu Act built locally. The official prebuilt references are restricted to ghcr.io/solutionforest/ephemeral-action-runner/docker-sandboxes-template:full-latest and :act-latest; image.prebuiltDigest is an optional lowercase SHA-256 pin, and arbitrary GHCR packages are rejected. The Full prebuilt is closest to the GitHub-hosted runner image and avoids the local 30–60 minute Full build; Act is the smaller critical-dependency profile. The published package carries its catalog-pinned runner identity, so prebuilt mode accepts only runnerVersion: latest or an empty value rather than an arbitrary exact version. Startup verifies the immutable digest and GitHub/Sigstore attestation in-process before first-use local Docker Sandboxes materialization; host and enterprise CAs are overlaid where safe, while custom scripts remain a small local derivative. Prebuilt resolution never silently falls back to a local build or another provider.
| Property | Type and default | Required or applies when | Effect and caution |
|---|---|---|---|
appId |
integer; no default | Required for GitHub operations. | GitHub App ID used to request short-lived runner registration tokens. |
organization |
string; no default | Required for GitHub operations. | GitHub organization that owns the runner group and runner records. |
privateKeyPath |
string; no default | Required for GitHub operations. | Private-key file readable by the EPAR process. Keep it under ignored .local/ storage. |
apiBaseUrl |
string; https://api.github.com
|
Optional, for GitHub Enterprise Server API endpoints. | Trailing / is removed. |
webBaseUrl |
string; https://github.com
|
Optional, for GitHub Enterprise Server web endpoints. | Trailing / is removed. |
| Property | Type and default | Required or applies when | Effect and caution |
|---|---|---|---|
sourceImage |
string; provider default | Image-building providers. | Docker image reference or WSL rootfs-tar path, selected by sourceType. |
distribution |
local-build or prebuilt; local-build
|
Docker Sandboxes image selection. Missing values retain the local-build behavior for existing configurations. |
prebuilt is preview-only for the official Act package and performs digest/attestation verification before acquisition. Other providers and arbitrary references are rejected. |
prebuiltReference |
official EPAR Act reference; empty | Docker Sandboxes with distribution: prebuilt. |
Must be exactly ghcr.io/solutionforest/ephemeral-action-runner/docker-sandboxes-template:act-latest; arbitrary GHCR packages are not trusted. |
prebuiltDigest |
lowercase sha256: fingerprint; empty |
Optional immutable pin for Docker Sandboxes prebuilt mode. | If present, the verified registry manifest must match this digest before activation. |
prebuiltAcceptance |
boolean; false
|
Operator-only Docker Sandboxes candidate validation. | Requires an exact digest, immutable candidate catalog, exact workflow evidence ref, manual update policy, one-runner epar-dev-test pool, and digest-bound architecture label. The wizard never emits this mode. |
prebuiltCatalogReference |
immutable official catalog tag or @sha256 reference; empty |
Required when prebuiltAcceptance: true. |
Must identify the exact signed candidate catalog; the moving catalog-v1 tag and package aliases are rejected. |
prebuiltEvidenceRef |
canonical refs/heads/<branch>; empty |
Required when prebuiltAcceptance: true. |
Restricts GitHub/Sigstore verification to the branch that produced the candidate evidence. It is not a package selector. |
sourceType |
docker-image or rootfs-tar; provider default |
rootfs-tar is WSL-only in normal use. |
A rootfs tar cannot use sourcePlatform. |
sourcePlatform |
Docker platform string; empty except WSL Docker source default linux/amd64
|
Only with sourceType: docker-image. |
Requests the source image platform; pulling an image does not prove it can execute. See Cross-architecture containers. |
outputImage |
string; provider default | Image-building providers. | EPAR-owned reusable runner artifact name or path. |
upstreamDir |
string; third_party/runner-images
|
Image builds that adapt upstream scripts. | Local checkout/cache location for the pinned upstream runner-image scripts. |
upstreamLock |
string; third_party/runner-images.lock
|
Image builds that adapt upstream scripts. | Lock file identifying the approved upstream revision. |
runnerVersion |
string; latest
|
Runner image builds. | Runner release selector. EPAR resolves it to an exact platform package and verified SHA-256 when a remote check is due. |
updateFrequency |
daily, weekly, biweekly, monthly, or manual; weekly
|
Mutable source-image tags and runnerVersion: latest. |
Controls remote freshness checks only. Local configuration, scripts, trust inputs, EPAR assets, and missing or corrupt artifacts apply immediately. |
updateTime |
local 24-hour HH:MM; "07:00"
|
Automatic update frequencies. | Preferred local check time. Manual mode ignores it. |
customInstallScripts |
list of non-empty paths; empty | Optional image customization. | Scripts run while creating the runner image; treat them as trusted build input. |
trustedCaCertificatePaths |
list of non-empty paths; empty | Optional additional TLS roots. | PEM or DER CA files are validated, supplied to EPAR's operational builder, and installed in the runner artifact. They supplement, not replace, system or runner-overlay trust. |
hostTrustMode |
disabled or overlay; disabled
|
Optional host-root inheritance for ephemeral runners. |
overlay requires runner.ephemeral: true; it collects a current host-trust generation before registration and fails closed on an invalid or stale result. EPAR-owned guest clients use a stable canonical bundle. On Windows Docker Sandboxes, overlay also activates and verifies an authenticated controller-host public-TLS relay before registration. EPAR's owned builder independently receives operational system trust. |
hostTrustScopes |
list of system, user; [system]
|
Required and non-empty with hostTrustMode: overlay. |
Windows/macOS may use [system, user]; Linux supports [system] only. This is root-anchor inheritance, not exact host TLS-policy emulation. |
Runner host trust is a common ephemeral-runner contract, not a Docker Container-only configuration rule. The first-run wizard enables it by default for Docker Sandboxes and the Docker Container compatibility provider, while the configuration validator applies the same overlay and ephemeral requirements independently of provider type. Operational builder trust is automatic and separate: system roots are supplied to EPAR's dedicated BuildKit builder even when runner overlay is disabled, user roots remain opt-in through runner overlay scope, and explicit CA paths apply to both paths. On Windows Docker Sandboxes, the provider adds a verified native-host transport so the selected roots correspond to the certificate chain actually presented to EPAR-owned guest clients. Arbitrary nested images still need their own CA installation or mount. A host Docker daemon must separately trust a private registry before EPAR can pull an image; neither builder nor guest overlay can repair a failed host-daemon pull.
The default update policy checks remotely mutable inputs weekly at 07:00 local time. Repeated starts before the next check verify and reuse local artifacts without contacting the image registry or Actions runner release API. Run ./start image update for an immediate check; image build remains the force-build command. Scheduled failures keep an exactly verified current generation available with visible persisted retry state, while user-requested local changes remain fail-closed.
Candidate acceptance is deliberately stricter than normal prebuilt use. It requires pool.instances: 1, runner.group: epar-dev-test, an enforced selected-repository/non-public runner-group policy, and the exact epar-prebuilt-act-<digest12>-amd64 or -arm64 label. It never follows act-latest, never falls back to local-build, and preserves candidate status in the local receipt. See Docker Sandboxes prebuilt image publication and acceptance.
| Property | Type and default | Required or applies when | Effect and caution |
|---|---|---|---|
instances |
integer; 1
|
All providers. Must be at least 1. |
Strict cap for provisioning, ready, draining, quarantined, and cleanup-pending local instances. |
namePrefix |
2-40 character name; provider default or wizard-derived machine name plus random suffix | All providers. | Literal prefix for local and GitHub identities. Keep it unique per machine/config and organization. Docker Sandboxes additionally permits only lowercase letters, digits, -, and .. |
vmPrefix |
deprecated alias for namePrefix
|
Existing configs only. | Do not set both aliases with conflicting intent; use namePrefix for new configs. |
logDir |
deprecated string path; no default | Existing configs only. | Used as logging.directory with a warning only when logging.directory is absent; using both is rejected. |
replacementRetryInitialSeconds |
integer; 15
|
All providers. Greater than 0. |
Initial retry delay for transient replacement allocation failures. |
replacementRetryMaxSeconds |
integer; 1800
|
All providers. At least the initial delay. | Upper retry-delay cap. |
replacementRetryMultiplier |
number; 2
|
All providers. At least 1. |
Backoff multiplier. |
replacementRetryJitterPercent |
integer; 20
|
All providers. 0 through 100. |
Randomizes retry delay to avoid synchronized retries. |
Without --external-outage-retry, GitHub 429 and 5xx responses and transient network failures back off steady-state replacement allocation, while initial startup remains fail-fast after compensating rollback. With the flag enabled, the same delay settings supervise typed transient external failures across startup and replacement; a longer Retry-After or rate-limit reset wins in either path. Invalid configuration, authentication, ordinary authorization, and local failures remain terminal.
| Property | Type and default | Required or applies when | Effect and caution |
|---|---|---|---|
minimumFree |
positive byte size; 1GiB
|
All providers. | Fixed provider-neutral physical free-space reserve. Existing explicit values remain authoritative; the default does not scale with volume size. |
gracePeriod |
positive Go duration; 168h
|
Conservative housekeeping. | Minimum age before abandoned or incomplete EPAR temporary work can be removed. It does not delay cleanup of a verified superseded generation. |
keepPrevious |
integer; 0
|
Conservative housekeeping. Must be non-negative. |
0 allows immediate exact retirement after replacement. A positive value defers automatic artifact retirement to the explicit storage-prune retention preview. |
automaticHousekeeping |
conservative or disabled; conservative
|
All providers. | Conservative mode reconciles interrupted exact-owned work at startup and removes unreferenced superseded resources after readback. It never runs a broad Docker or WSL prune. |
buildCacheLimit |
positive byte size; 20GiB
|
Image-building cache. | Bounded EPAR BuildKit cache target. Existing explicit values remain authoritative. |
goCacheLimit |
positive byte size; 10GiB
|
Native/no-Go Go build cache. | Bounded EPAR Go cache target. |
| Property | Type and default | Required or applies when | Effect and caution |
|---|---|---|---|
directory |
string; work/logs
|
All providers. Non-empty. | Root for manager, instance, build, error, and benchmark logs. |
level |
debug, info, warn, or error; info
|
Manager events. | Minimum manager-event severity written to configured sinks. debug includes periodic health and refresh details. |
managerSinks |
non-empty list of console, file; [console]
|
Manager events. | Choose user-facing manager event destinations. |
managerConsoleFormat |
text or json; text
|
Manager console sink. | Console encoding. |
managerConsoleTextFormat |
one-line template; empty | Only when manager console format is text. |
May use {time}, {level}, {message}, {attributes} and must contain {message}. |
managerFileFormat |
text or json; json
|
Manager file sink. | File encoding. |
transcriptSinks |
non-empty list of console, file; [file]
|
Raw instance/build transcripts. | Default keeps verbose transcript events out of the console. |
transcriptConsoleFormat |
text or json; text
|
Transcript console sink. | Console encoding. |
transcriptConsoleTextFormat |
one-line template; empty | Only when transcript console format is text. |
May use {time}, {instance}, {component}, {stream}, {message}, {session}, {category}, {provider}, {attributes} and must contain {message}. |
maxFileSizeMiB |
integer at least 1; 100
|
Rotated logs. | Per-file rotation threshold. |
maxBackups |
integer at least 1; 3
|
Rotated logs. | Number of rotated files to retain per stream. |
compressBackups |
boolean; true
|
Rotated logs. | Compresses rotated backups. |
retentionEnabled |
boolean; true
|
Log retention. | Enables periodic age and total-size retention. |
retentionMaxTotalMiB |
integer at least 1; 1024
|
Log retention. | Maximum retained logging size. |
managerMaxAgeDays |
integer at least 1; 14
|
Log retention. | Manager-log age limit. |
instanceMaxAgeDays |
integer at least 1; 14
|
Log retention. | Instance-transcript age limit. |
buildMaxAgeDays |
integer at least 1; 14
|
Log retention. | Build-transcript age limit. |
errorMaxAgeDays |
integer at least 1; 30
|
Log retention. | Error-report age limit. |
benchmarkMaxAgeDays |
integer at least 1; 90
|
Log retention. | Startup-benchmark age limit. |
retentionIntervalMinutes |
integer at least 1; 60
|
Log retention. | Periodic retention interval. |
| Property | Type and default | Required or applies when | Effect and caution |
|---|---|---|---|
labels |
non-empty list; provider default | All providers. Each label is at most 256 characters. | GitHub Actions routing labels. Keep architecture-sensitive workflows on an explicitly compatible label. |
group |
string; empty | Optional organization runner group. | Group must exist and pass the configured runner-group policy. |
includeHostLabel |
boolean; true
|
All providers. | Adds sanitized epar-host-<machine> unless already listed. Set false when workflows must not route by host. |
ephemeral |
boolean; true
|
All providers. | Required by Docker Sandboxes and host-trust overlay; each runner accepts one job. |
noDefaultLabels |
boolean; false
|
Optional GitHub registration behavior. | Omits GitHub's default self-hosted, OS, and architecture labels, so workflows must use explicitly configured labels. |
| Property | Type and default | Required or applies when | Effect and caution |
|---|---|---|---|
enforcement |
warn or enforce; warn
|
All providers; Docker Sandboxes requires enforce. |
warn records a policy failure and continues; enforce blocks registration. |
requireExplicitGroup |
boolean; true
|
Runner-group preflight. | Requires runner.group rather than an implicit default group. |
requireNonDefaultGroup |
boolean; true
|
Runner-group preflight. | Rejects the organization default group when enforcement applies. |
requiredRepositoryAccess |
selected, private, or all; selected
|
Runner-group preflight. | Maximum allowed repository breadth: selected only, all-private or narrower, or any visibility. |
requirePublicRepositoriesDisabled |
boolean; true
|
Runner-group preflight. | Requires the group not to be usable by public repositories. |
If the complete subsection is absent, EPAR warns and uses the strict recommended checks in warn mode. New wizard configurations write an explicit policy. See Runner Group Security.
| Property | Type and default | Required or applies when | Effect and caution |
|---|---|---|---|
type |
docker-sandboxes, docker-container, wsl, or tart; Docker Sandboxes is the wizard default and Tart is retired |
Required. | Selects the provider. docker-socket is intentionally rejected because EPAR uses a private daemon for Docker Container. |
sourceImage |
string; image output for image-building providers, empty for Docker Sandboxes | Required for existing Tart, WSL, and Docker Container configurations. | Reusable artifact cloned by Tart, WSL, or Docker Container. Docker Sandboxes rejects it. |
network |
string; default
|
Tart image build and runtime. | Tart network mode. Do not assume this configures Docker or Docker Sandboxes networking. |
rosettaTag |
simple virtiofs tag; empty | Existing Tart configurations only. | Enables the retired Tart Rosetta compatibility path. Validate each amd64 workload and label it distinctly. |
installRoot |
string; work/wsl
|
WSL. | Project-relative WSL distribution storage root. |
platform |
Docker platform string; empty except Docker Sandboxes default linux/amd64
|
Docker Container or Docker Sandboxes only. | Docker Sandboxes accepts only linux/amd64 or linux/arm64; it also determines the default architecture label. |
| Property | Type and default | Required or applies when | Effect and caution |
|---|---|---|---|
registryMirrors |
list of root http/https URLs; empty |
Private Docker daemon users. | Mirrors must not include credentials, query, fragment, or a non-root path. See Docker Registry Mirrors. |
httpProxy |
root http/https URL; empty |
Private Docker daemon users. | Becomes HTTP_PROXY for the outer Docker Container runner and its inner daemon. Credentials are rejected. |
httpsProxy |
root http/https URL; empty |
Private Docker daemon users. | Becomes HTTPS_PROXY; credentials are rejected. |
noProxy |
comma-separated host/domain/IP/CIDR/*; empty |
Private Docker daemon users. | Becomes NO_PROXY; whitespace, URLs, credentials, empty entries, and invalid CIDRs are rejected. |
| Property | Type and default | Required or applies when | Effect and caution |
|---|---|---|---|
image.sourceImage |
ghcr.io/catthehacker/ubuntu:full-latest |
Required with Docker Sandboxes; must be the exact full-latest or act-latest profile. |
Desired Catthehacker source selector; EPAR builds and imports the runnable template automatically. Specialized and custom tags remain available to Docker Container and WSL. |
policyGeneration |
lowercase sha256:<64-hex>; no default |
Required with Docker Sandboxes. | Recorded fingerprint of the host-global Balanced policy. |
networkBaseline |
open or balanced; open
|
Docker Sandboxes. |
open adds a sandbox-scoped public-egress rule while denying host aliases; it does not change the host-global policy. |
architectureEmulation |
best-effort, required, or native-only; native-only
|
Docker Sandboxes. |
native-only skips the QEMU attempt and verifies the native guest and private Docker architecture. best-effort attempts bundled QEMU handlers and continues with a warning when QEMU/binfmt is unavailable. required fails creation unless QEMU handlers are active. |
recoveryMode |
exclusive-auto or observe; exclusive-auto
|
Docker Sandboxes. |
exclusive-auto is the default and permits EPAR one bounded stop-wait-start recovery attempt per create-admission incident with the known sandbox-container signature; bounded inventory control-plane failures retain their existing probe and backoff retries, but cannot restart the daemon while an admission incident remains open. observe leaves those failures unhandled, does not probe or mutate the daemon, and follows existing fail-closed startup or reconciliation behavior; use it only as an explicit maintenance opt-out. |
recoveryQuiescenceSeconds |
integer from 1 through 300; 60
|
Docker Sandboxes. | Time that the daemon must remain authoritatively stopped before EPAR starts it again. EPAR also requires repeated stable inventory after the restart. |
additionalAllow |
unique hostname or *.domain, optional port; empty |
Docker Sandboxes. | Adds sandbox-scoped allow resources. With open, it cannot re-allow EPAR's host-alias deny guardrails. |
additionalDeny |
unique hostname or *.domain, optional port; empty |
Docker Sandboxes. | Adds sandbox-scoped deny resources. A resource cannot be in both allow and deny lists. |
stagingRoot |
canonical project-relative .local/... path; .local/cache/docker-sandboxes/staging
|
Docker Sandboxes. | Per-create disposable staging root; cannot be absolute, escape .local, or overlap .local/bin or .local/state. |
cpus |
positive integer; 4
|
Docker Sandboxes. | CPU allocation for each sandbox. |
memory |
positive byte size; 8GiB
|
Docker Sandboxes. | Per-sandbox memory allocation written by the wizard. |
rootDisk |
auto or byte size at least 20GiB; auto
|
Docker Sandboxes. | Sparse guest-root logical maximum. auto is recalculated for each artifact as the expanded image estimate plus 5 GiB build allowance and 20 GiB writable headroom, rounded up to 10 GiB. An explicit undersized value is rejected before creation. |
dockerDisk |
byte size at least 1GiB; 50GiB
|
Docker Sandboxes. | Independent sparse logical maximum for the Docker daemon inside the sandbox; it is workload capacity and is not derived from the base image. |
maxConcurrentCreates |
positive integer; 2
|
Docker Sandboxes. | Limits concurrent sandbox creation to control capacity pressure. |
Docker Sandboxes templates always bundle the pinned tonistiigi/binfmt installer and static QEMU interpreters. With best-effort or required, EPAR runs binfmt --install all inside each sandbox VM; it does not install handlers on the host or verify a fixed target matrix. In best-effort, a failed QEMU attempt falls back only after the guest and its private Docker daemon are verified against provider.platform, and the controller emits a warning that foreign-architecture containers may fail. required keeps QEMU fail-closed, while native-only skips handler installation and performs the same native verification. Docker continues selecting image manifests normally, and EPAR never injects DOCKER_DEFAULT_PLATFORM.
| Property | Type and default | Required or applies when | Effect and caution |
|---|---|---|---|
bootSeconds |
integer; 180
|
All providers. | Time allowed for instance boot/readiness. |
githubOnlineSeconds |
integer; 180
|
All providers. | Time allowed for GitHub runner online readiness. |
commandSeconds |
integer; 900
|
All providers. | Default bound for provider command execution. |
-
provider.sourceImageis required for existing Tart, WSL, and Docker Container configurations, and forbidden for Docker Sandboxes. -
provider.rosettaTagis accepted only for Tart.provider.platformis accepted only for Docker Container or Docker Sandboxes. Docker Sandboxes accepts onlylinux/amd64andlinux/arm64. - Docker Sandboxes requires
runner.ephemeral: true,security.runnerGroup.enforcement: enforce, the exact Catthehackerfull-latestoract-latestprofile, policy generation, resource values, and a lowercase-compatible pool prefix. -
image.sourcePlatformrequiresimage.sourceType: docker-image; all byte-size fields require a positiveB,KiB,MiB,GiB, orTiBvalue. - Host-trust overlay requires a non-empty, duplicate-free scope list and
runner.ephemeral: true;useris not supported on Linux. -
pool.namePrefixis a host-wide controller and ownership boundary. Tart, WSL, and Docker Container use the configured prefix to select legacy owned resources; Docker Sandboxes uses its durable ledger of exact owned identities. EPAR rejects concurrent reuse across configs, projects, and providers; do not assume broad prefix cleanup is safe. -
runner.labelsmust never be empty, even whenrunner.noDefaultLabelsis false.
The configuration loader begins with provider-neutral defaults and requires an explicit provider.type, then applies that provider's defaults only when the corresponding key was not set explicitly. Existing Tart configurations still receive their retained Tart defaults. The first-run wizard writes a concrete Docker Sandboxes configuration by default and derives a machine-based pool prefix; use its generated values as the normal starting point.
| Provider | Source and output | Default labels and prefix |
|---|---|---|
| Docker Sandboxes (primary) | Desired image settings plus policy generation; exact template identities live in the local artifact receipt. |
self-hosted, linux, matching X64/ARM64, epar-docker-sandboxes; prefix epar-docker-sandboxes. |
| Docker Container (compatibility) | Catthehacker full Ubuntu to epar-docker-container-catthehacker-ubuntu. |
self-hosted, linux, epar-docker-container-catthehacker-ubuntu; prefix epar-docker-container. |
| WSL Docker source (compatibility) | Catthehacker full Ubuntu, linux/amd64, output work/images/epar-wsl-catthehacker-ubuntu.tar. |
self-hosted, linux, X64, epar-wsl-catthehacker-ubuntu; prefix epar-wsl. |
| WSL rootfs tar (compatibility) |
work/images/ubuntu-24.04-clean.rootfs.tar, output work/images/epar-ubuntu-24-wsl.tar. |
self-hosted, linux, X64, epar-wsl-ubuntu-24.04-base; prefix epar-wsl. |
| Tart (retired) |
ghcr.io/cirruslabs/ubuntu:latest to epar-ubuntu-24-arm64; existing configurations retain runtime/cleanup compatibility. |
self-hosted, linux, ARM64, epar-tart-ubuntu-24.04-base; prefix epar. |
Keep two Docker Container runners warm:
pool:
instances: 2
namePrefix: buildbox01-a4f9c2Use an explicit runner group with enforced least-breadth access:
runner:
group: trusted-ci
security:
runnerGroup:
enforcement: enforce
requireExplicitGroup: true
requireNonDefaultGroup: true
requiredRepositoryAccess: selected
requirePublicRepositoriesDisabled: trueAdd a host and explicit enterprise root without weakening TLS verification:
image:
hostTrustMode: overlay
hostTrustScopes: [system, user]
trustedCaCertificatePaths: [.local/enterprise-root.pem]On Linux, use hostTrustScopes: [system]. Do not disable certificate verification to work around a private CA.
Configure a private Docker proxy and mirror without embedding credentials:
docker:
registryMirrors: [https://mirror.example.test]
httpProxy: http://proxy.example.test:3128
httpsProxy: http://proxy.example.test:3128
noProxy: localhost,127.0.0.1,.example.testFor Docker Sandboxes, run ./start and let the wizard select the desired image, provision the native-platform runner template, and write the policy fingerprint and capacity settings. Do not hand-copy generated template identities between hosts; EPAR records them in the local artifact receipt.
Generated from the main repository docs at 7e156a9. Edit README.md and docs/; the wiki copy is overwritten by automation.