Files
aitbc/scripts/utils/coordinated_chain_regen.sh
aitbc 4f870e9d8d fix: update init_mempool calls to use db_url instead of db_path
- Update scripts/utils/init_production_genesis.py to use db_url
- Update apps/blockchain-node/tests/test_mempool.py to use db_url
- Update apps/blockchain-node/src/aitbc_chain/p2p_network.py to use db_url
- Add MEMPOOL_DB_URL to /etc/aitbc/.env on both nodes for PostgreSQL mempool
2026-05-03 21:14:26 +02:00

162 lines
3.4 KiB
Bash
Executable File

#!/usr/bin/env bash
set -euo pipefail
CHAIN_ID="${CHAIN_ID:-ait-mainnet}"
SERVICE_NAME="${SERVICE_NAME:-aitbc-blockchain-node.service}"
LEADER="${LEADER:-aitbc1}"
NODES_RAW="${NODES:-localhost aitbc1 gitea-runner}"
UTILITY="${UTILITY:-/opt/aitbc/scripts/utils/chain_regen_node.py}"
PYTHON_BIN="${PYTHON_BIN:-/opt/aitbc/venv/bin/python}"
TIMESTAMP="${TIMESTAMP:-$(date -u +%Y%m%dT%H%M%SZ)}"
STARTUP_WAIT_SECONDS="${STARTUP_WAIT_SECONDS:-8}"
FOLLOWER_START_WAIT_SECONDS="${FOLLOWER_START_WAIT_SECONDS:-8}"
VERIFY_RETRIES="${VERIFY_RETRIES:-6}"
VERIFY_RETRY_SECONDS="${VERIFY_RETRY_SECONDS:-10}"
usage() {
cat <<USAGE
Usage: $0 <preflight|backup|set-roles|stop|reset|start|verify|rollout|clear-roles>
Environment:
CHAIN_ID=$CHAIN_ID
SERVICE_NAME=$SERVICE_NAME
LEADER=$LEADER
NODES="$NODES_RAW"
TIMESTAMP=$TIMESTAMP
USAGE
}
node_cmd() {
local node="$1"
shift
if [[ "$node" == "localhost" || "$node" == "local" || "$node" == "$(hostname)" ]]; then
"$@"
else
ssh "$node" "$*"
fi
}
run_node_utility() {
local node="$1"
shift
node_cmd "$node" "$PYTHON_BIN" "$UTILITY" --chain-id "$CHAIN_ID" --service-name "$SERVICE_NAME" "$@"
}
for_each_node() {
local action="$1"
shift
local node
for node in $NODES_RAW; do
echo "===== $node :: $action ====="
"$@" "$node"
done
}
preflight_node() {
run_node_utility "$1" preflight
}
backup_node() {
run_node_utility "$1" backup --timestamp "$TIMESTAMP"
}
set_role_node() {
local node="$1"
if [[ "$node" == "$LEADER" ]]; then
run_node_utility "$node" set-role leader
else
run_node_utility "$node" set-role follower
fi
}
clear_role_node() {
run_node_utility "$1" set-role clear
}
stop_node() {
node_cmd "$1" systemctl stop "$SERVICE_NAME"
}
reset_node() {
run_node_utility "$1" reset --yes
}
start_leader() {
echo "===== $LEADER :: start leader ====="
node_cmd "$LEADER" systemctl start "$SERVICE_NAME"
sleep "$STARTUP_WAIT_SECONDS"
}
start_followers() {
local node
for node in $NODES_RAW; do
if [[ "$node" == "$LEADER" ]]; then
continue
fi
echo "===== $node :: start follower ====="
node_cmd "$node" systemctl start "$SERVICE_NAME"
done
sleep "$FOLLOWER_START_WAIT_SECONDS"
}
verify_node() {
run_node_utility "$1" verify --require-nonzero-root
}
verify_node_with_retry() {
local node="$1"
local attempt
for attempt in $(seq 1 "$VERIFY_RETRIES"); do
if run_node_utility "$node" verify --require-nonzero-root; then
return 0
fi
if [[ "$attempt" == "$VERIFY_RETRIES" ]]; then
return 1
fi
echo "verify failed for $node, retrying in ${VERIFY_RETRY_SECONDS}s (${attempt}/${VERIFY_RETRIES})" >&2
sleep "$VERIFY_RETRY_SECONDS"
done
}
case "${1:-}" in
preflight)
for_each_node preflight preflight_node
;;
backup)
for_each_node backup backup_node
;;
set-roles)
for_each_node set-roles set_role_node
;;
clear-roles)
for_each_node clear-roles clear_role_node
;;
stop)
for_each_node stop stop_node
;;
reset)
for_each_node reset reset_node
;;
start)
start_leader
start_followers
;;
verify)
for_each_node verify verify_node
;;
rollout)
for_each_node preflight preflight_node
for_each_node set-roles set_role_node
for_each_node backup backup_node
for_each_node stop stop_node
for_each_node reset reset_node
start_leader
start_followers
for_each_node verify verify_node_with_retry
;;
*)
usage
exit 64
;;
esac