[object Object]

← back to Exo Cluster Watchdog

add harden-peer.sh: per-node exo-keepalive + pmset autorestart installer

5081ca1aae21f5515b16766d50c6a77bae26e068 · 2026-08-17 11:18:00 -0700 · steve

Files touched

Diff

commit 5081ca1aae21f5515b16766d50c6a77bae26e068
Author: steve <steve@designerwallcoverings.com>
Date:   Mon Aug 17 11:18:00 2026 -0700

    add harden-peer.sh: per-node exo-keepalive + pmset autorestart installer
---
 data/latest.json |  2 +-
 harden-peer.sh   | 62 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 63 insertions(+), 1 deletion(-)

diff --git a/data/latest.json b/data/latest.json
index dac01fb..2aa2d5c 100644
--- a/data/latest.json
+++ b/data/latest.json
@@ -1 +1 @@
-{"generated_at":"2026-08-17T18:16:04Z","verdict":"WARN","status":"WARN","serving":2,"expected":3,"self_up":1,"down":"mac2","healed":"","headline":"WARN: exo cluster 2/3 serving | down: mac2"}
\ No newline at end of file
+{"generated_at":"2026-08-17T18:16:44Z","verdict":"WARN","status":"WARN","serving":2,"expected":3,"self_up":1,"down":"mac2","healed":"","headline":"WARN: exo cluster 2/3 serving | down: mac2"}
\ No newline at end of file
diff --git a/harden-peer.sh b/harden-peer.sh
new file mode 100755
index 0000000..8b57acd
--- /dev/null
+++ b/harden-peer.sh
@@ -0,0 +1,62 @@
+#!/bin/bash
+# harden-peer.sh — run this ON a peer exo node (mac1 / mac2), logged in AS the
+# auto-login GUI user (the account exo runs under — the one with ~/exo).
+# Makes exo NEVER stay off:
+#   1) installs a per-user exo-keepalive LaunchAgent (KeepAlive + RunAtLoad)
+#      -> exo auto-starts at login/boot and respawns within seconds if it crashes
+#   2) sets pmset autorestart=1 (auto power-on after a power blip) + never sleep
+# Idempotent + reversible (writes one plist + one run script under $HOME).
+set -euo pipefail
+
+USER_HOME="$HOME"
+EXO_DIR="$USER_HOME/exo"
+UV="$USER_HOME/.local/bin/uv"
+LA="$USER_HOME/Library/LaunchAgents"
+KEEP_DIR="$USER_HOME/Projects/exo-keepalive"
+LABEL="com.steve.exo-keepalive"
+
+[ -d "$EXO_DIR" ] || { echo "ERROR: no $EXO_DIR here — run this as the user that owns exo"; exit 1; }
+[ -x "$UV" ] || { echo "ERROR: no uv at $UV"; exit 1; }
+mkdir -p "$LA" "$KEEP_DIR/logs"
+
+# 1a. run script (mirrors macstudio3's pattern)
+cat > "$KEEP_DIR/run-exo.sh" <<EOF
+#!/bin/bash
+export PATH="$USER_HOME/.local/bin:/opt/homebrew/bin:/usr/local/bin:/usr/bin:/bin"
+cd "$EXO_DIR" || exit 1
+exec "$UV" run --extra mlx exo
+EOF
+chmod +x "$KEEP_DIR/run-exo.sh"
+
+# 1b. LaunchAgent
+cat > "$LA/$LABEL.plist" <<EOF
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0"><dict>
+  <key>Label</key><string>$LABEL</string>
+  <key>ProgramArguments</key><array>
+    <string>/bin/bash</string><string>$KEEP_DIR/run-exo.sh</string>
+  </array>
+  <key>EnvironmentVariables</key><dict>
+    <key>HOME</key><string>$USER_HOME</string>
+    <key>PATH</key><string>$USER_HOME/.local/bin:/opt/homebrew/bin:/usr/local/bin:/usr/bin:/bin</string>
+  </dict>
+  <key>RunAtLoad</key><true/>
+  <key>KeepAlive</key><true/>
+  <key>ThrottleInterval</key><integer>15</integer>
+  <key>StandardOutPath</key><string>$KEEP_DIR/logs/out.log</string>
+  <key>StandardErrorPath</key><string>$KEEP_DIR/logs/err.log</string>
+</dict></plist>
+EOF
+
+UIDN=$(id -u)
+launchctl bootout "gui/$UIDN/$LABEL" 2>/dev/null || true
+launchctl bootstrap "gui/$UIDN" "$LA/$LABEL.plist"
+launchctl enable "gui/$UIDN/$LABEL"
+echo "OK: exo-keepalive installed + loaded for $(whoami) (HOME=$USER_HOME)"
+launchctl list | grep "$LABEL" || echo "WARN: not showing in launchctl list yet"
+
+# 2. power resilience (needs sudo — will prompt)
+echo "--- setting pmset autorestart + never-sleep (sudo) ---"
+sudo pmset -a autorestart 1 sleep 0 disablesleep 1 && echo "OK: pmset autorestart=1, sleep=0" || echo "WARN: pmset needs sudo — run: sudo pmset -a autorestart 1 sleep 0"
+echo "DONE. exo on $(hostname) will now auto-start on boot and respawn on crash."

← aeb1f7e exo-cluster-watchdog: auto-restart crashed exo across the ri  ·  back to Exo Cluster Watchdog  ·  watchdog: mac2 set NOAUTH (probe+alert only) until key autho ed31140 →