Files
lvmh/deploy/deploy.sh
T

46 lines
1.7 KiB
Bash
Executable File

#!/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=<random>, ZAI_RENAUD_API_KEY=<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"
# A dotfiles-less checkout must not wipe the remote's baked pi config
# (daemon catalog + worker image depend on it).
PIAGENT_EXCLUDE=""
if [ ! -f docker/pi-agent/settings.json ]; then
echo "no local pi config — preserving remote docker/pi-agent"
PIAGENT_EXCLUDE="--exclude /docker/pi-agent"
fi
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 \
${PIAGENT_EXCLUDE} \
./ "$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"