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.
64 lines
1.8 KiB
Bash
Executable File
64 lines
1.8 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
#
|
|
# disk-monitor.sh — Check disk usage and alert when above threshold.
|
|
#
|
|
# Usage:
|
|
# disk-monitor.sh # print usage, warn at 80%
|
|
# disk-monitor.sh --warn-percent 90 # custom threshold
|
|
#
|
|
# Requires GNU coreutils df (standard on Debian). Uses --output for
|
|
# deterministic column ordering regardless of locale.
|
|
#
|
|
# Exit code 0 if under threshold, 1 if at or above.
|
|
|
|
set -euo pipefail
|
|
|
|
WARN_PERCENT=80
|
|
|
|
while [[ $# -gt 0 ]]; do
|
|
case "$1" in
|
|
--warn-percent)
|
|
WARN_PERCENT="$2"
|
|
shift 2
|
|
;;
|
|
*)
|
|
echo "Unknown argument: $1" >&2
|
|
exit 2
|
|
;;
|
|
esac
|
|
done
|
|
|
|
GREEN='\033[0;32m'
|
|
YELLOW='\033[1;33m'
|
|
RED='\033[0;31m'
|
|
NC='\033[0m'
|
|
|
|
EXIT_CODE=0
|
|
|
|
# Partitions to check: install root and /var (Docker data-root is often here)
|
|
PARTITIONS="${PARTITIONS:-/ /var}"
|
|
|
|
for partition in $PARTITIONS; do
|
|
if [[ ! -d "$partition" ]]; then
|
|
continue
|
|
fi
|
|
# GNU df --output columns: pcent (Use%), size, avail, target (Mounted on)
|
|
read -r USAGE_PCT SIZE AVAIL MOUNT <<< "$(df -h --output=pcent,size,avail,target "$partition" | awk 'NR==2 {gsub(/%/,"",$1); print $1, $2, $3, $4}')"
|
|
|
|
if [[ -z "${USAGE_PCT:-}" || ! "${USAGE_PCT:-}" =~ ^[0-9]+$ ]]; then
|
|
echo " [skip] Could not read usage for ${partition}"
|
|
continue
|
|
fi
|
|
|
|
if [[ "$USAGE_PCT" -ge "$WARN_PERCENT" ]]; then
|
|
echo -e " ${RED}WARN${NC} ${MOUNT}: ${USAGE_PCT}% used (${AVAIL} avail of ${SIZE}) — threshold ${WARN_PERCENT}%"
|
|
EXIT_CODE=1
|
|
elif [[ "$USAGE_PCT" -ge $((WARN_PERCENT - 10)) ]]; then
|
|
echo -e " ${YELLOW}NOTE${NC} ${MOUNT}: ${USAGE_PCT}% used (${AVAIL} avail of ${SIZE}) — approaching threshold"
|
|
else
|
|
echo -e " ${GREEN}OK${NC} ${MOUNT}: ${USAGE_PCT}% used (${AVAIL} avail of ${SIZE})"
|
|
fi
|
|
done
|
|
|
|
exit "$EXIT_CODE"
|