Lane D deliverable: reproducible execution-plane deployment on a fresh Debian dedicated server (~12 cores, 40 GB RAM, single-node). Artifacts: - bootstrap.sh: Docker Engine, Bun, repo clone, build, systemd install, firewall (deny-by-default), optional Tailscale, disk monitor cron - .env.template: all 8 environment groups documented (Convex, Gitea, model gateway, AgentOS/RivetKit, Zopu agent, daemon, Docker sandbox, service auth) - systemd units: zopu-daemon, zopu-agent (both Restart=always), zopu-health timer (60s), zopu-docker-cleanup timer (daily) - scripts: health-check, update, rollback, docker-cleanup, disk-monitor - Caddyfile: optional reverse proxy (documentation-only by default) - README.md: full runbook with start/stop/log/update/rollback/cleanup procedures, topology documentation, and boundary notes Verified topology (from installed RivetKit source): - registry.start() boots an in-process RivetKit engine (envoy mode) with a native Rust sidecar at http://localhost:6420 (DEFAULT_ENDPOINT in chunk-YDUQHING.js line 4751). createClient() connects back to it. - No separate Rivet Engine process required for single-node operation. - Linux x64 sidecar packages (@rivet-dev/agentos-sidecar-linux-x64-gnu) are available as optional dependencies. Docker / Orb boundary: - Docker Engine installed and zopu user in docker group. - No Docker-backed sandbox code wired; Orb lane contract not yet landed. - Volume pruning omitted from docker-cleanup.sh to protect durable data. Validated: bash -n on all 6 shell scripts; mocked health-check smoke (nc-based TCP probes, mocked systemctl/docker); systemd unit structural checks. No JS/TS/agent files changed.
37 lines
1.2 KiB
Bash
Executable File
37 lines
1.2 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
#
|
|
# docker-cleanup.sh — Remove stopped containers, dangling images, and unused networks.
|
|
#
|
|
# Safe to run via systemd timer (daily). Uses Docker's built-in pruning
|
|
# commands with conservative scope.
|
|
#
|
|
# Does NOT prune volumes. Named volumes may hold durable data and cannot be
|
|
# safely auto-pruned in a deployment that mixes stateful workloads. When the
|
|
# Orb lane lands with labeled resources, volume pruning can be scoped to
|
|
# Orb-managed labels (e.g. --filter label=org.openputer.orb). Until then,
|
|
# manage volumes manually.
|
|
|
|
set -euo pipefail
|
|
|
|
echo "[docker-cleanup] $(date -u +%Y-%m-%dT%H:%M:%SZ)"
|
|
|
|
# Remove stopped containers older than 24 hours
|
|
echo "[docker-cleanup] Pruning stopped containers (>24h old)..."
|
|
docker container prune -f --filter "until=24h"
|
|
|
|
# Remove dangling images (untagged intermediate layers only)
|
|
echo "[docker-cleanup] Pruning dangling images..."
|
|
docker image prune -f
|
|
|
|
# Remove unused networks
|
|
echo "[docker-cleanup] Pruning unused networks..."
|
|
docker network prune -f
|
|
|
|
# Volumes are intentionally NOT pruned. See header comment.
|
|
|
|
# Show remaining disk usage
|
|
echo "[docker-cleanup] Docker disk usage:"
|
|
docker system df
|
|
|
|
echo "[docker-cleanup] Done."
|