Skip to content

Deploy

Agent quickstart

You operate both containers. Trigora provides the remote durability authority. The host container runs the published image. The application container compiles the project and runs trigora pulse connect against the host’s socket.

Terminal window
docker pull ghcr.io/trigora-dev/pulse:1.0.0

That image is Pulse v1.0.0: host 1.0.0, adapter protocol 1, Linux AMD64 and ARM64. Building trigora-pulse from source is for a change to the host. It is not the production install.

Both services share one socket directory and the same numeric user. The example uses uid 1000. Any uid works when both containers use it and that user can write the socket directory. The host rejects a peer uid that is not its own.

TRIGORA_TOKEN belongs only on the host. Do not put it on the application container. The socket stays on the shared volume. Do not publish it.

services:
pulse:
image: ghcr.io/trigora-dev/pulse:1.0.0
user: "1000:1000"
environment:
TRIGORA_TOKEN: ${TRIGORA_TOKEN:?}
volumes:
- pulse-sock:/pulse
healthcheck:
test: ["CMD", "trigora-pulse", "--check", "/pulse"]
app:
image: pulse-app:local
user: "1000:1000"
depends_on:
pulse:
condition: service_healthy
environment:
PULSE_DIR: /pulse
PULSE_EXECUTION_ID: ${PULSE_EXECUTION_ID:-}
PULSE_RESUME_EXECUTION_ID: ${PULSE_RESUME_EXECUTION_ID:-}
volumes:
- pulse-sock:/pulse
volumes:
pulse-sock:

The application container registers with that host:

Terminal window
trigora pulse connect --dir /pulse

--prepare writes the handler manifest and exits. The reference image uses it when it needs to select one source file before it connects.

PULSE_EXECUTION_ID starts that execution. PULSE_RESUME_EXECUTION_ID resumes an id you already have. Leave both empty when the replacement should discover abandoned work on its own. The artifact the adapter registers has to be the artifact the execution was pinned to.

Stop the containers with a grace period longer than the host’s 10-second shutdown deadline. The reference uses 15 seconds for docker stop and 30 seconds for a Pod.

A Docker named volume is the socket directory that the recovery proof uses. A Docker Desktop bind mount cannot chmod a Unix socket.

Kubernetes can run the same two processes. The reference is one Pod: the host and the application are sidecars, they share an emptyDir at /pulse, and the token Secret is mounted only on the host container. An init container gives the shared uid ownership of that volume. Both containers then run as that uid.

That layout is for people who already run Kubernetes. It is not an install path, and Trigora does not schedule or replace Pods for you. A replacement Pod can resume an execution id you already have. Bringing up a compatible host, and keeping it able to see the execution, is your deployment. See Recovery.