Files
awoooi/scripts/ops/awooop-rls-preflight.sh
Your Name 0bc1878778
All checks were successful
Code Review / ai-code-review (push) Successful in 13s
chore(ops): 新增 RLS preflight 與 registry certbot 修復包
2026-05-12 18:25:53 +08:00

101 lines
2.9 KiB
Bash
Executable File

#!/usr/bin/env bash
# Read-only AwoooP RLS preflight runner.
#
# Default path runs inside the production API pod through the 120 control-plane
# host, so DATABASE_URL stays inside Kubernetes and is never printed locally.
set -euo pipefail
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
PY_SCRIPT="${SCRIPT_DIR}/awooop_rls_preflight.py"
NAMESPACE="${AWOOOP_RLS_NAMESPACE:-awoooi-prod}"
DEPLOYMENT="${AWOOOP_RLS_DEPLOYMENT:-deployment/awoooi-api}"
CONTAINER="${AWOOOP_RLS_CONTAINER:-api}"
SSH_TARGET="${AWOOOP_RLS_SSH_TARGET:-wooo@192.168.0.120}"
REMOTE_KUBECTL="${AWOOOP_RLS_REMOTE_KUBECTL:-sudo kubectl}"
KUBECTL="${AWOOOP_RLS_KUBECTL:-kubectl}"
USE_SSH=1
PY_ARGS=()
SSH_OPTS=(-o BatchMode=yes -o ConnectTimeout=8)
usage() {
cat <<'USAGE'
Usage: bash scripts/ops/awooop-rls-preflight.sh [options]
Read-only checks for AwoooP PostgreSQL RLS readiness. The script runs the Python
probe inside the API pod and exits 2 when RLS is not ready to enable.
Options:
--exact-counts Run exact COUNT(*) project_id backfill checks.
--json Print JSON output from the pod.
--local Use local kubectl instead of SSH to 120.
--ssh USER@HOST Override SSH target. Default: wooo@192.168.0.120.
-h, --help Show this help.
Environment:
AWOOOP_RLS_NAMESPACE Default: awoooi-prod
AWOOOP_RLS_DEPLOYMENT Default: deployment/awoooi-api
AWOOOP_RLS_CONTAINER Default: api
AWOOOP_RLS_REMOTE_KUBECTL Default: sudo kubectl
AWOOOP_RLS_KUBECTL Default: kubectl
USAGE
}
while [ "$#" -gt 0 ]; do
case "$1" in
--exact-counts)
PY_ARGS+=(--exact-counts)
;;
--json)
PY_ARGS+=(--json)
;;
--local)
USE_SSH=0
;;
--ssh)
shift
SSH_TARGET="${1:-}"
if [ -z "$SSH_TARGET" ]; then
echo "--ssh requires USER@HOST" >&2
exit 64
fi
USE_SSH=1
;;
-h|--help)
usage
exit 0
;;
*)
echo "Unknown argument: $1" >&2
usage >&2
exit 64
;;
esac
shift
done
if [ ! -f "$PY_SCRIPT" ]; then
echo "Missing Python probe: $PY_SCRIPT" >&2
exit 66
fi
if [ "$USE_SSH" -eq 1 ]; then
printf -v namespace_q "%q" "$NAMESPACE"
printf -v deployment_q "%q" "$DEPLOYMENT"
printf -v container_q "%q" "$CONTAINER"
remote_cmd="${REMOTE_KUBECTL} -n ${namespace_q} exec -i ${deployment_q} -c ${container_q} -- python -"
if [ "${#PY_ARGS[@]}" -gt 0 ]; then
for arg in "${PY_ARGS[@]}"; do
printf -v arg_q "%q" "$arg"
remote_cmd="${remote_cmd} ${arg_q}"
done
fi
ssh "${SSH_OPTS[@]}" "$SSH_TARGET" "$remote_cmd" < "$PY_SCRIPT"
else
if [ "${#PY_ARGS[@]}" -gt 0 ]; then
"$KUBECTL" -n "$NAMESPACE" exec -i "$DEPLOYMENT" -c "$CONTAINER" -- python - "${PY_ARGS[@]}" < "$PY_SCRIPT"
else
"$KUBECTL" -n "$NAMESPACE" exec -i "$DEPLOYMENT" -c "$CONTAINER" -- python - < "$PY_SCRIPT"
fi
fi