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.
89 lines
2.2 KiB
Bash
Executable File
89 lines
2.2 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
#
|
|
# rollback.sh — Roll back to the previously deployed commit.
|
|
#
|
|
# Usage:
|
|
# rollback.sh # roll back to .last-deployed-sha
|
|
# rollback.sh <sha> # roll back to a specific commit
|
|
#
|
|
# .env is gitignored and is never touched by git operations. It survives
|
|
# updates and rollbacks unchanged.
|
|
|
|
set -euo pipefail
|
|
|
|
INSTALL_DIR="${ZOPU_INSTALL_DIR:-/opt/zopu}"
|
|
SERVICE_USER="${ZOPU_SERVICE_USER:-zopu}"
|
|
|
|
GREEN='\033[0;32m'
|
|
RED='\033[0;31m'
|
|
NC='\033[0m'
|
|
|
|
log() { echo -e "${GREEN}[rollback]${NC} $*"; }
|
|
err() { echo -e "${RED}[rollback]${NC} $*" >&2; }
|
|
|
|
cd "$INSTALL_DIR"
|
|
|
|
# Determine target
|
|
ROLLBACK_SHA="${1:-}"
|
|
if [[ -z "$ROLLBACK_SHA" ]]; then
|
|
LAST_SHA_FILE="${INSTALL_DIR}/.last-deployed-sha"
|
|
if [[ ! -f "$LAST_SHA_FILE" ]]; then
|
|
err "No previous deployment recorded in ${LAST_SHA_FILE}."
|
|
err "Pass a commit SHA explicitly: rollback.sh <sha>"
|
|
exit 1
|
|
fi
|
|
ROLLBACK_SHA=$(cat "$LAST_SHA_FILE")
|
|
fi
|
|
|
|
# Validate commit exists
|
|
if ! git rev-parse --verify "${ROLLBACK_SHA}^{commit}" &>/dev/null; then
|
|
err "Commit ${ROLLBACK_SHA} does not exist in the local repository."
|
|
exit 1
|
|
fi
|
|
|
|
CURRENT_SHA=$(git rev-parse HEAD)
|
|
log "Current: ${CURRENT_SHA:0:12}"
|
|
log "Rolling back to: ${ROLLBACK_SHA:0:12}"
|
|
|
|
# Save current state before rolling back (enables re-rollback)
|
|
echo "$CURRENT_SHA" > "${INSTALL_DIR}/.pre-rollback-sha"
|
|
|
|
# Checkout target
|
|
git checkout "$ROLLBACK_SHA"
|
|
|
|
# Confirm .env is intact
|
|
if [[ -f "${INSTALL_DIR}/.env" ]]; then
|
|
log ".env preserved."
|
|
else
|
|
err ".env is missing! Restore it from backup before starting services."
|
|
fi
|
|
|
|
log "Running bun install..."
|
|
sudo -u "$SERVICE_USER" bun install
|
|
|
|
log "Building daemon..."
|
|
sudo -u "$SERVICE_USER" bun run build:daemon
|
|
|
|
log "Building agent service..."
|
|
sudo -u "$SERVICE_USER" bun run build:agents
|
|
|
|
log "Restarting services..."
|
|
systemctl restart zopu-daemon
|
|
sleep 3
|
|
systemctl restart zopu-agent
|
|
sleep 5
|
|
|
|
# Health check
|
|
HEALTH_SCRIPT="${INSTALL_DIR}/deploy/zopu-runtime/scripts/health-check.sh"
|
|
if [[ -x "$HEALTH_SCRIPT" ]]; then
|
|
log "Running health check..."
|
|
if "$HEALTH_SCRIPT"; then
|
|
log "Rollback complete and healthy."
|
|
else
|
|
err "Health check failed after rollback!"
|
|
err " journalctl -u zopu-daemon -n 50"
|
|
err " journalctl -u zopu-agent -n 50"
|
|
exit 1
|
|
fi
|
|
fi
|