Files
SkyMoney/scripts/guard-prod-volume.sh
Ricearoni1245 78595a052a
Some checks failed
Security Tests / security-non-db (push) Successful in 18s
Security Tests / security-db (push) Successful in 22s
Deploy / deploy (push) Failing after 42s
attempting to fix frozen deploy step
2026-03-02 14:05:52 -06:00

34 lines
1.4 KiB
Bash

#!/usr/bin/env bash
set -euo pipefail
VOLUME_NAME="${PROD_DB_VOLUME_NAME:-skymoney_pgdata}"
ALLOW_EMPTY="${ALLOW_EMPTY_PROD_VOLUME:-0}"
DOCKER_CMD="${DOCKER_CMD:-docker}"
PROBE_TIMEOUT_SEC="${PROD_VOLUME_GUARD_TIMEOUT_SEC:-20}"
if ! $DOCKER_CMD volume inspect "$VOLUME_NAME" >/dev/null 2>&1; then
if [[ "$ALLOW_EMPTY" == "1" ]]; then
echo "WARN: volume '$VOLUME_NAME' is missing, but ALLOW_EMPTY_PROD_VOLUME=1; continuing."
exit 0
fi
echo "ERROR: required volume '$VOLUME_NAME' does not exist."
echo "Refusing deploy because this can indicate destructive data loss (e.g., volume deletion)."
echo "If this is an intentional first-time init, set ALLOW_EMPTY_PROD_VOLUME=1 for one run."
exit 1
fi
if timeout "${PROBE_TIMEOUT_SEC}"s $DOCKER_CMD run --rm -v "${VOLUME_NAME}:/var/lib/postgresql/data" alpine sh -lc "test -f /var/lib/postgresql/data/PG_VERSION"; then
echo "Production volume guard passed: '$VOLUME_NAME' contains PostgreSQL data."
exit 0
fi
if [[ "$ALLOW_EMPTY" == "1" ]]; then
echo "WARN: volume '$VOLUME_NAME' is empty/uninitialized, but ALLOW_EMPTY_PROD_VOLUME=1; continuing."
exit 0
fi
echo "ERROR: volume '$VOLUME_NAME' exists but appears empty/uninitialized (missing PG_VERSION)."
echo "Refusing deploy to prevent silent database re-initialization."
echo "If this is an intentional rebuild, set ALLOW_EMPTY_PROD_VOLUME=1 for one run."
exit 1