Files
proxmox/scripts/deployment/provision-oracle-publisher-lxc-3500.sh
defiQUG e0bb17eff7 ops: oracle publisher LXC 3500/3501, CT migrate docs, Besu/RPC maintenance
- Provision oracle-publisher on CT 3500 (quoted DATA_SOURCE URLs, dotenv).
- Host-side pct-lxc-3501-net-up for ccip-monitor eth0 after migrate.
- CoinGecko key script: avoid sed & corruption; document quoted URLs.
- Besu node list reload, fstrim/RPC scripts, storage health docs.
- Submodule smom-dbis-138: web3 v6 pin, oracle check default host r630-02.

Made-with: Cursor
2026-03-28 15:22:23 -07:00

137 lines
5.8 KiB
Bash
Executable File

#!/usr/bin/env bash
# Install Oracle Publisher on LXC 3500 (fresh Ubuntu template). Run from project root on LAN.
# Sources scripts/lib/load-project-env.sh for PRIVATE_KEY, AGGREGATOR_ADDRESS, COINGECKO_API_KEY, etc.
#
# Usage: ./scripts/deployment/provision-oracle-publisher-lxc-3500.sh
# Env: ORACLE_LXC_PROXMOX_HOST (default 192.168.11.12 — node where VMID 3500 runs; do not use root PROXMOX_HOST)
# ORACLE_VMID (default 3500)
set -euo pipefail
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
PROJECT_ROOT="$(cd "$SCRIPT_DIR/../.." && pwd)"
# shellcheck source=/dev/null
source "${PROJECT_ROOT}/scripts/lib/load-project-env.sh"
PROXMOX_HOST="${ORACLE_LXC_PROXMOX_HOST:-${PROXMOX_HOST_R630_02:-192.168.11.12}}"
ORACLE_VMID="${ORACLE_VMID:-3500}"
ORACLE_HOME="/opt/oracle-publisher"
ORACLE_USER="${ORACLE_USER:-oracle}"
RPC_URL="${RPC_URL:-http://192.168.11.211:8545}"
AGGREGATOR_ADDRESS="${AGGREGATOR_ADDRESS:-${ORACLE_AGGREGATOR_ADDRESS:-0x99b3511a2d315a497c8112c1fdd8d508d4b1e506}}"
ORACLE_PROXY_ADDRESS="${ORACLE_PROXY_ADDRESS:-0x3304b747e565a97ec8ac220b0b6a1f6ffdb837e6}"
SSH_OPTS=(-o ConnectTimeout=25 -o StrictHostKeyChecking=accept-new)
if [[ -z "${PRIVATE_KEY:-}" ]]; then
echo "ERROR: PRIVATE_KEY not set. Source smom-dbis-138/.env or export PRIVATE_KEY before running." >&2
exit 1
fi
PY_SRC="${PROJECT_ROOT}/smom-dbis-138/services/oracle-publisher/oracle_publisher.py"
REQ="${PROJECT_ROOT}/smom-dbis-138/services/oracle-publisher/requirements.txt"
[[ -f "$PY_SRC" ]] || { echo "ERROR: missing $PY_SRC" >&2; exit 1; }
[[ -f "$REQ" ]] || { echo "ERROR: missing $REQ" >&2; exit 1; }
remote() { ssh "${SSH_OPTS[@]}" "root@${PROXMOX_HOST}" "$@"; }
echo "=== Provisioning Oracle Publisher: host=${PROXMOX_HOST} vmid=${ORACLE_VMID} ==="
remote "pct status ${ORACLE_VMID}" >/dev/null
echo "[1/6] OS packages + oracle user..."
remote "pct exec ${ORACLE_VMID} -- bash -es" <<EOS
export DEBIAN_FRONTEND=noninteractive
apt-get update -qq
apt-get install -y -qq python3 python3-pip python3-venv ca-certificates curl
if ! id -u ${ORACLE_USER} &>/dev/null; then
useradd -r -s /bin/bash -d ${ORACLE_HOME} -m ${ORACLE_USER}
fi
mkdir -p ${ORACLE_HOME}
chown -R ${ORACLE_USER}:${ORACLE_USER} ${ORACLE_HOME}
EOS
echo "[2/6] Push Python app + requirements..."
scp "${SSH_OPTS[@]}" "$PY_SRC" "root@${PROXMOX_HOST}:/tmp/oracle_publisher.py"
scp "${SSH_OPTS[@]}" "$REQ" "root@${PROXMOX_HOST}:/tmp/oracle-requirements.txt"
remote "pct push ${ORACLE_VMID} /tmp/oracle_publisher.py ${ORACLE_HOME}/oracle_publisher.py"
remote "pct push ${ORACLE_VMID} /tmp/oracle-requirements.txt ${ORACLE_HOME}/requirements.txt"
remote "pct exec ${ORACLE_VMID} -- chown ${ORACLE_USER}:${ORACLE_USER} ${ORACLE_HOME}/oracle_publisher.py ${ORACLE_HOME}/requirements.txt"
remote "pct exec ${ORACLE_VMID} -- chmod 755 ${ORACLE_HOME}/oracle_publisher.py"
echo "[3/6] Python venv + pip..."
remote "pct exec ${ORACLE_VMID} -- bash -es" <<EOS
sudo -u ${ORACLE_USER} python3 -m venv ${ORACLE_HOME}/venv
sudo -u ${ORACLE_USER} ${ORACLE_HOME}/venv/bin/pip install -q --upgrade pip
sudo -u ${ORACLE_USER} ${ORACLE_HOME}/venv/bin/pip install -q -r ${ORACLE_HOME}/requirements.txt || true
# Minimal set if optional OTEL packages fail; web3 v7 breaks geth_poa_middleware — pin v6
sudo -u ${ORACLE_USER} ${ORACLE_HOME}/venv/bin/pip install -q 'web3>=6.15,<7' eth-account requests python-dotenv prometheus-client || true
EOS
echo "[4/6] Write .env (no stdout of secrets)..."
ENV_TMP="$(mktemp)"
chmod 600 "$ENV_TMP"
# Quote URLs for systemd EnvironmentFile: unquoted "&" can break parsing / concatenation.
DS1_URL="https://api.coingecko.com/api/v3/simple/price?ids=ethereum&vs_currencies=usd"
if [[ -n "${COINGECKO_API_KEY:-}" ]]; then
DS1_URL="${DS1_URL}&x_cg_demo_api_key=${COINGECKO_API_KEY}"
fi
{
echo "RPC_URL=${RPC_URL}"
echo "AGGREGATOR_ADDRESS=${AGGREGATOR_ADDRESS}"
echo "PRIVATE_KEY=${PRIVATE_KEY}"
echo "HEARTBEAT=60"
echo "DEVIATION_THRESHOLD=0.5"
echo "ORACLE_ADDRESS=${ORACLE_PROXY_ADDRESS}"
echo "CHAIN_ID=138"
echo "COINGECKO_API_KEY=${COINGECKO_API_KEY:-}"
echo "DATA_SOURCE_1_URL=\"${DS1_URL}\""
echo "DATA_SOURCE_1_PARSER=ethereum.usd"
echo "DATA_SOURCE_2_URL=\"https://api.coinbase.com/v2/prices/ETH-USD/spot\""
echo "DATA_SOURCE_2_PARSER=data.amount"
# Match smom-dbis-138/scripts/update-oracle-price.sh (100k was OOG on aggregator)
echo "GAS_LIMIT=400000"
echo "GAS_PRICE=1000000000"
} > "$ENV_TMP"
scp "${SSH_OPTS[@]}" "$ENV_TMP" "root@${PROXMOX_HOST}:/tmp/oracle-publisher.env"
rm -f "$ENV_TMP"
remote "pct push ${ORACLE_VMID} /tmp/oracle-publisher.env ${ORACLE_HOME}/.env"
remote "pct exec ${ORACLE_VMID} -- chown ${ORACLE_USER}:${ORACLE_USER} ${ORACLE_HOME}/.env"
remote "pct exec ${ORACLE_VMID} -- chmod 600 ${ORACLE_HOME}/.env"
remote "rm -f /tmp/oracle-publisher.env"
echo "[5/6] systemd unit..."
remote "pct exec ${ORACLE_VMID} -- bash -es" <<EOF
cat > /etc/systemd/system/oracle-publisher.service <<'UNIT'
[Unit]
Description=Oracle Publisher Service (Chain 138)
After=network.target
Wants=network-online.target
[Service]
Type=simple
User=${ORACLE_USER}
Group=${ORACLE_USER}
WorkingDirectory=${ORACLE_HOME}
Environment="PATH=${ORACLE_HOME}/venv/bin:/usr/local/bin:/usr/bin:/bin"
EnvironmentFile=-${ORACLE_HOME}/.env
ExecStart=${ORACLE_HOME}/venv/bin/python ${ORACLE_HOME}/oracle_publisher.py
Restart=always
RestartSec=15
NoNewPrivileges=true
[Install]
WantedBy=multi-user.target
UNIT
systemctl daemon-reload
systemctl enable oracle-publisher.service
EOF
echo "[6/6] Start service..."
remote "pct exec ${ORACLE_VMID} -- systemctl restart oracle-publisher.service"
sleep 3
remote "pct exec ${ORACLE_VMID} -- systemctl is-active oracle-publisher.service"
echo ""
echo "OK: Oracle Publisher on VMID ${ORACLE_VMID} (${PROXMOX_HOST})."
echo "Logs: ssh root@${PROXMOX_HOST} \"pct exec ${ORACLE_VMID} -- journalctl -u oracle-publisher -n 40 --no-pager\""