#!/usr/bin/env bash # Deploy lvmh to alarm over ssh (tailnet). rsync source, build images there, # compose up. Requires .env on the remote (created on first run). set -euo pipefail REMOTE="${1:-alarm}" REMOTE_DIR="${2:-/zdata/root/dockerFiles/lvmh}" if ! ssh "$REMOTE" "test -f $REMOTE_DIR/.env" 2>/dev/null; then echo "ERROR: $REMOTE:$REMOTE_DIR/.env missing. Create it first (see .env.example):" echo " ssh $REMOTE 'mkdir -p $REMOTE_DIR && nano $REMOTE_DIR/.env'" echo " # LVMH_TOKEN=, ZAI_RENAUD_API_KEY=" exit 1 fi # web/dist must exist (daemon serves it) if [ ! -f web/dist/index.html ]; then echo "building web/dist first..." (cd web && bun install && bun run build) fi # Bake the user's pi config (dotfiles) into the worker image context. bash "$(dirname "$0")/rsync-pi-agent.sh" rsync -az --delete \ --exclude /.git --exclude /node_modules --exclude /web/node_modules \ --exclude /.env --exclude /.scratch --exclude /.pi --exclude /coverage \ --exclude '*.db' --exclude /daemon/lvmh-daemon --exclude /.playwright-mcp \ ./ "$REMOTE:$REMOTE_DIR/" echo "building daemon image + worker image on $REMOTE..." ssh "$REMOTE" "cd $REMOTE_DIR \ && sudo docker build -q -f daemon/Dockerfile -t lvmh-daemon:latest . \ && sudo docker build -q -f docker/worker.Dockerfile -t lvmh-worker:latest . \ && sudo docker compose up -d && sudo docker compose ps" echo "Deployed: http://$REMOTE:8686"