orun is pre-release, experimental software. Use it at your own risk and expect breaking changes between versions.
The reconciliation loop
Every node runs a continuous loop: fetch the latest manifests from Git, compare them to the containers currently running on the host, then apply whatever changes are needed. This happens automatically on every poll tick without any external trigger. The loop consists of five stages:Commit your manifest changes
Edit your
deployments/, services/, or nodes/ manifests and push to the branch your node tracks. This is the only action you take — the rest is automatic.Node polls the repository
orun runs a
git pull against the origin remote on a configurable interval (default: 5s). If the HEAD commit hash changes, a reconciliation pass is triggered immediately.Agent loads and compares desired state
The agent parses all manifests from the local clone and builds a picture of the desired state: which containers should exist, with which images, ports, volumes, and environment variables. It then inspects the Docker daemon on the host to determine actual state.
Agent applies changes
For each difference between desired and actual state, the agent acts: pulling new or updated images, starting containers that should be running, stopping containers that have been removed, and updating port bindings or mounts as needed.
No push model
orun has no control plane and no inbound channel. Your laptop, your CI system, and your Git host never send commands to a node. The node initiates all communication — outbound to the Git remote, outbound to the container daemon. This means:- No open ports for orchestration. The node does not expose an API that accepts deployment commands.
- No credentials to rotate on the node. The node holds a read-only deploy key for the Git remote; that is its only secret.
- No single point of failure. Each node is independent. A network partition between nodes does not stop any of them from reconciling.
Pull-based resilience
Because nodes pull their state rather than receive it, they keep running correctly even when your laptop is offline, your CI pipeline is broken, or the network between nodes is partitioned. The node continues running the last-known desired state and retries the Git poll on the next tick. If a poll fails — for example, because the Git remote is temporarily unreachable —gitsync applies exponential backoff, doubling the poll interval on each consecutive failure up to a maximum of 5 minutes. Once the remote becomes reachable again, the backoff resets and the node returns to its configured pollInterval.
The default poll interval is
5s. You can override it per node with the pollInterval field in your Node manifest. Changes pushed to Git are visible to the node within one poll cycle.Agent startup
The orun agent is installed as asystemd service during orun bootstrap. It starts automatically on boot and restarts on failure without any manual intervention. After bootstrap, you do not need SSH access to the node for day-to-day operations.
Observability
The agent exposes a lightweight status API on port9100. Use it to check sync health and overall node status without SSH access.
- Status
- Health check
journald and can be forwarded to any log aggregation system. For container-level monitoring, deploy a sidecar tool such as Beszel or Dozzle alongside your workloads.
Manifest repository
Learn how to structure your nodes/, deployments/, and services/ directories.
Environments
Use Git branches and worktrees to separate production from non-production environments.
