Files
2026-07-13 15:17:19 +02:00

56 lines
2.5 KiB
Bash
Executable File

#!/usr/bin/env bash
# deploy.sh <host> <tag> — push-based deploy from the dev machine (SPEC-007).
# Rollback = run again with the previous tag (DEP-06); restore the
# bot.db.pre-<tag> backup first when the schema version moved (PER-06).
set -euo pipefail
HOST="${1:?usage: deploy.sh <fjerkroa|ggg> <tag>}"
TAG="${2:?usage: deploy.sh <fjerkroa|ggg> <tag>}"
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'
# In-place extraction does not delete files removed from the tree —
# clear known legacy packaging leftovers (they break the pip build)
ssh "$HOST" 'rm -f ~/fjerkroa_bot/setup.py ~/fjerkroa_bot/requirements.txt ~/fjerkroa_bot/pytest.ini'
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 <previous-tag> (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) =="