#!/usr/bin/env bash # deploy.sh — Deploy the serverAppConfigs repo to a target and restart its stack. # # Implements the git deployment workflow from AGENTS.md. Assumes local changes # are committed and pushed, then: # 1. Pushes main to origin # 2. Pulls the repo on the target # 3. Copies shared configs into place # 4. Restarts the podman stack (podman-compose up -d) # 5. Waits for the Caddy homepage to respond # # Usage: # ./scripts/deploy.sh [--dry-run] # # Targets: # dankclaw - AI/search/dev/observability stack (dankclaw/compose.yaml) # dankserver - media/library stack (dankserver/compose.yaml) # # Example: # ./scripts/deploy.sh dankclaw # ./scripts/deploy.sh dankserver --dry-run set -euo pipefail # --------------------------------------------------------------------------- # Target configuration # --------------------------------------------------------------------------- declare -A REMOTE_USER REMOTE_HOST REMOTE_DIR COMPOSE HEALTH_URL REMOTE_USER[dankclaw]=dank REMOTE_HOST[dankclaw]=dankclaw REMOTE_DIR[dankclaw]="/home/dank/serverAppConfigs" COMPOSE[dankclaw]="dankclaw/compose.yaml" HEALTH_URL[dankclaw]="http://127.0.0.1/" REMOTE_USER[dankserver]=dank REMOTE_HOST[dankserver]=dankserver REMOTE_DIR[dankserver]="/home/dank/serverAppConfigs" COMPOSE[dankserver]="dankserver/compose.yaml" HEALTH_URL[dankserver]="http://127.0.0.1/" TARGET="${1:-}" DRY_RUN=0 if [ "${2:-}" = "--dry-run" ]; then DRY_RUN=1 fi # --------------------------------------------------------------------------- # Validation # --------------------------------------------------------------------------- if [ -z "${TARGET:-}" ]; then echo "Usage: $0 [--dry-run]" exit 1 fi if [ -z "${REMOTE_HOST[$TARGET]:-}" ]; then echo "Unknown target: $TARGET" exit 1 fi # --------------------------------------------------------------------------- # Local checks (pre-flight) # --------------------------------------------------------------------------- cd "$(dirname "$0")/.." if ! git diff --quiet HEAD; then echo "FAIL: Local working tree has uncommitted changes." echo "Commit or stash them before deploying." exit 1 fi if [ "$(git rev-parse --abbrev-ref HEAD)" != "main" ]; then echo "WARN: Not on 'main'; deploying a non-main branch." fi echo "=== Deploying to ${TARGET} ===" echo " host: ${REMOTE_HOST[$TARGET]}" echo " dir: ${REMOTE_DIR[$TARGET]}" echo " compose: ${COMPOSE[$TARGET]}" echo " health: ${HEALTH_URL[$TARGET]}" echo "" # --------------------------------------------------------------------------- # Push (unless dry-run) # --------------------------------------------------------------------------- if [ "$DRY_RUN" = "1" ]; then echo "[dry-run] Would push local main to origin" echo "[dry-run] Would SSH to ${REMOTE_HOST[$TARGET]} and git pull" else echo "[1/4] Pushing local main to origin..." git push origin main fi REMOTE="$( printf '%s@%s' "${REMOTE_USER[$TARGET]}" "${REMOTE_HOST[$TARGET]}" )" # --------------------------------------------------------------------------- # Remote: pull + copy shared configs + restart stack # --------------------------------------------------------------------------- REMOTE_SCRIPT=" set -euo pipefail cd '${REMOTE_DIR[$TARGET]}' echo '[2/4] Pulling repo on ${TARGET}...' git pull origin main echo '[3/4] Copying shared configs into place...' mkdir -p /opt/searxng/config /opt/prometheus/config /opt/loki/config /opt/alloy/config cp shared/searxng/settings.yml /opt/searxng/config/settings.yml cp shared/prometheus/prometheus.yml /opt/prometheus/config/prometheus.yml cp shared/loki/loki-config.yaml /opt/loki/config/loki-config.yaml cp shared/alloy/config.alloy /opt/alloy/config/config.alloy if [ -f .env ]; then echo ' .env present, using it' else echo ' WARN: no .env on target; copy the .env.example and fill it in' fi echo '[4/4] Restarting stack...' podman-compose -f '${COMPOSE[$TARGET]}' up -d --pull=missing " if [ "$DRY_RUN" = "1" ]; then echo "[dry-run] Remote commands would run:" echo "$REMOTE_SCRIPT" else # shellcheck disable=SC2087 ssh "$REMOTE" bash -s < /dev/null 2>&1; then echo " Homepage healthy after approx $((i * 2))s" echo "" echo "=== Deploy complete: ${TARGET} ===" exit 0 fi sleep 2 done echo "FAIL: Homepage did not become healthy in 120s" exit 1 fi