DEPLOYMENT
Deployment guide
Control plane production checklist¶
- Use a stable persistent volume for the state file.
- Set
ZYVOR_FLEET_ADMIN_PASSWORDbefore first bootstrap. - Set a stable random
ZYVOR_FLEET_SESSION_SECRETwith at least 32 bytes. - Put the service behind HTTPS (or provide
--tls-certand--tls-keydirectly). - Back up the state file and test restore (
scripts/backup-state.sh,scripts/restore-drill.sh,scripts/restore-state.sh— see PRODUCTION.md). - Keep one control-plane replica for the embedded-store mode.
- Restrict network access to the UI/API as appropriate, while permitting outbound edge agents to reach it.
- Use short-lived, low-use enrollment tokens.
Bare binary¶
make build
sudo install -m 0755 bin/fleetd /usr/local/bin/fleetd
sudo install -d -m 0750 -o zyvor-fleet -g zyvor-fleet /var/lib/zyvor-fleet
Use the provided systemd unit as a starting point and place secrets in /etc/zyvor-fleet/fleet.env with mode 0600.
TLS¶
Direct TLS:
fleetd \
--listen :8443 \
--tls-cert /etc/zyvor-fleet/tls.crt \
--tls-key /etc/zyvor-fleet/tls.key
If TLS terminates at a reverse proxy, keep the private control-plane hop appropriately protected and set ZYVOR_FLEET_SECURE_COOKIES=1. Cookies are automatically marked Secure when direct TLS is configured. With Helm, set secureCookies=true when exposing Fleet through HTTPS ingress.
Docker Compose¶
The included compose stack is an evaluation environment:
docker compose up --build
It starts one control plane and two demo agents.
Kubernetes¶
Helm¶
Recommended:
helm upgrade --install zyvor-fleet ./deploy/helm/zyvor-fleet \
-n zyvor-fleet --create-namespace \
--set admin.password="$ADMIN_PASSWORD" \
--set sessionSecret="$SESSION_SECRET"
Use an existing Secret in production:
kubectl -n zyvor-fleet create secret generic fleet-prod \
--from-literal=admin-password="$ADMIN_PASSWORD" \
--from-literal=session-secret="$SESSION_SECRET"
helm upgrade --install zyvor-fleet ./deploy/helm/zyvor-fleet \
-n zyvor-fleet --create-namespace \
--set existingSecret=fleet-prod
Why one replica¶
The v0.3 embedded store is intentionally single-writer and file-backed. Running multiple replicas against a ReadWriteMany filesystem would not produce a correct distributed database. The chart therefore fixes the server at one replica and uses Recreate strategy.
Agent as a Linux service¶
The usual edge deployment is a direct Linux service, not a pod. The provided systemd unit reads /etc/zyvor-fleet/agent.env. After first enrollment the durable site credential lives in the configured agent state file; remove the enrollment token from the environment when practical.
Port collisions and OTA TLS¶
On shared lab hosts, :8080 (and nearby ports) may already be in use. Pass
--port 18090 (or another free port) to scripts/deploy-remote.sh.
Zyvor OTA requires HTTPS for fleet_url. Prefer direct TLS on fleetd
(--tls-cert / --tls-key) with a SAN that includes the address agents use
(127.0.0.1 for co-located demos). Install the CA into the host trust store
(or set OTA fleet_ca) so Go TLS clients accept it. Full topology and
recorded results: LAB.md.
Remote smoke deploy¶
./scripts/deploy-remote.sh HOST USER --key --port 18090
Demo mode (--demo) is for evaluation only — see the production checklist
above and PRODUCTION.md.