#!/usr/bin/env bash # deploy.sh — push-based deploy from the dev machine (SPEC-007). # Rollback = run again with the previous tag (DEP-06); restore the # bot.db.pre- backup first when the schema version moved (PER-06). set -euo pipefail HOST="${1:?usage: deploy.sh }" TAG="${2:?usage: deploy.sh }" case "$HOST" in fjerkroa) SERVICE=kroa CONFIG=kroa.toml ;; ggg) SERVICE=luma CONFIG=ggg.toml ;; *) echo "unknown host: $HOST (known: fjerkroa, ggg)" >&2; exit 1 ;; esac # Tags only — no branch/commit deploys (DEP-01) git rev-parse -q --verify "refs/tags/$TAG" >/dev/null || { echo "not a tag: $TAG" >&2; exit 1; } # Restaurant service window (DEP-05) if [ "$HOST" = fjerkroa ] && [ "${DEPLOY_FORCE:-0}" != 1 ]; then HOUR=$(TZ=Europe/Oslo date +%H) if [ "$HOUR" -ge 11 ] && [ "$HOUR" -lt 22 ]; then echo "refusing kroa deploy during service hours (11-22 Europe/Oslo); DEPLOY_FORCE=1 overrides (DEP-05)" >&2 exit 1 fi fi echo "== deploy $TAG -> $HOST (service $SERVICE, config $CONFIG) ==" # Code push: tag tree over ~/fjerkroa_bot; untracked config/state survives (DEP-01) git archive "$TAG" | ssh "$HOST" 'mkdir -p ~/fjerkroa_bot && tar -x -C ~/fjerkroa_bot' ssh "$HOST" "set -e [ -x ~/venv-bot/bin/python ] || python3.11 -m venv ~/venv-bot ~/venv-bot/bin/pip install -q --upgrade pip ~/venv-bot/bin/pip install -q ~/fjerkroa_bot printf '#!/bin/sh\ncd %s/fjerkroa_bot || exit 1\nexec %s/venv-bot/bin/python -m fjerkroa_bot --config $CONFIG\n' \"\$HOME\" \"\$HOME\" > ~/fjerkroa_bot/start.sh chmod +x ~/fjerkroa_bot/start.sh ~/venv-bot/bin/python -c 'import fjerkroa_bot' find ~/fjerkroa_bot -maxdepth 3 -name bot.db | while read -r db; do cp \"\$db\" \"\$db.pre-$TAG\"; done # DEP-03 supervisorctl restart $SERVICE" echo "== waiting for startsecs ==" sleep 35 # Smoke (DEP-04) ssh "$HOST" "supervisorctl status $SERVICE | grep -q RUNNING" \ || { echo "SMOKE FAIL: $SERVICE not RUNNING on $HOST — rollback: deploy.sh $HOST (DEP-06)" >&2; exit 1; } ssh "$HOST" "tail -80 ~/logs/supervisord.log | grep -q 'We have logged in as'" \ || { echo "SMOKE FAIL: no fresh Discord login line on $HOST — check logs, consider rollback (DEP-06)" >&2; exit 1; } echo "== OK: $HOST runs $TAG — RUNNING + logged in (DEP-04) =="