#!/bin/bash # Start relay service with proper environment loading cd "$(dirname "$0")" PROJECT_ROOT="$(cd ../.. && pwd)" PROFILE="${1:-}" # Production relays run on Proxmox (/opt/smom-dbis-138), not operator workstation checkouts. if [[ -f "$PROJECT_ROOT/../../scripts/lib/chainlink-production-placement.sh" ]]; then # shellcheck source=../../scripts/lib/chainlink-production-placement.sh source "$PROJECT_ROOT/../../scripts/lib/chainlink-production-placement.sh" require_ccip_relay_on_proxmox || exit 1 elif [[ "$(pwd)" == *"/projects/"*"/services/relay"* ]] && [[ "${CCIP_RELAY_ALLOW_LOCAL:-0}" != "1" ]]; then echo "ERROR: CCIP relay must run on Proxmox r630-01 (/opt/smom-dbis-138/services/relay). Set CCIP_RELAY_ALLOW_LOCAL=1 for dev." >&2 exit 1 fi SKIP_ENV_LOCAL="${RELAY_SKIP_ENV_LOCAL:-0}" declare -A ORIGINAL_ENV_VARS=() while IFS='=' read -r key _; do [ -n "$key" ] || continue ORIGINAL_ENV_VARS["$key"]=1 done < <(env) # Try to load NVM if available if [ -f "$HOME/.nvm/nvm.sh" ]; then source "$HOME/.nvm/nvm.sh" nvm use node 2>/dev/null || nvm use --lts 2>/dev/null || true elif [ -f "/usr/local/nvm/nvm.sh" ]; then source "/usr/local/nvm/nvm.sh" nvm use node 2>/dev/null || nvm use --lts 2>/dev/null || true fi load_env_file() { local env_file="$1" [ -f "$env_file" ] || return 0 while IFS= read -r line || [ -n "$line" ]; do [[ "$line" =~ ^#.*$ ]] && continue [[ -z "$line" ]] && continue local key="${line%%=*}" local value="${line#*=}" if [[ -n "${ORIGINAL_ENV_VARS[$key]:-}" ]]; then continue fi if [[ "$value" == *'${PRIVATE_KEY'* ]] && [ -n "${PRIVATE_KEY:-}" ] && [[ "$key" == "PRIVATE_KEY" || "$key" == "RELAYER_PRIVATE_KEY" ]]; then export "$key=$PRIVATE_KEY" continue fi if [[ "$line" =~ \$\{PRIVATE_KEY\} ]] && [ -n "${PRIVATE_KEY:-}" ]; then export "${line//\$\{PRIVATE_KEY\}/$PRIVATE_KEY}" continue fi export "$line" done < "$env_file" } # Load project env through the shared loader so secure-secrets fallbacks and RPC cleanup # behave the same way they do in deployment scripts. if [ -f "$PROJECT_ROOT/scripts/load-env.sh" ]; then # shellcheck disable=SC1090 source "$PROJECT_ROOT/scripts/load-env.sh" >/dev/null 2>&1 elif [ -f "$PROJECT_ROOT/.env" ]; then source "$PROJECT_ROOT/.env" fi if [ -f .env ]; then load_env_file .env fi # Profile-specific env should win over repo defaults, but .env.local remains the # highest-precedence operator override for ad hoc experiments. if [ -n "$PROFILE" ] && [ -f ".env.$PROFILE" ]; then load_env_file ".env.$PROFILE" fi # Named profiles (mainnet-cw, bsc, …) must not inherit destination overrides from .env.local # unless explicitly allowed — mixing caused mainnet router addresses on Avalanche RPC. if [ "$SKIP_ENV_LOCAL" != "1" ] && [ -f .env.local ]; then if [ -n "$PROFILE" ] && [ "${RELAY_ALLOW_ENV_LOCAL:-0}" != "1" ]; then echo "Note: skipping .env.local for profile=$PROFILE (set RELAY_ALLOW_ENV_LOCAL=1 to override)" else load_env_file .env.local fi fi if [ -n "$PROFILE" ]; then export RELAY_PROFILE="$PROFILE" fi # Ensure PRIVATE_KEY is exported if [ -n "$PRIVATE_KEY" ]; then export PRIVATE_KEY if { [ "$PROFILE" = "mainnet-link-138" ] || [ -z "$PROFILE" ]; } && [ -n "${CCIP_MAINNET_LINK138_RELAYER_PRIVATE_KEY:-}" ]; then : # dedicated relayer set below else export RELAYER_PRIVATE_KEY="$PRIVATE_KEY" fi fi # Dedicated relayer for mainnet-link-138 and default WETH lane (wins over deployer PRIVATE_KEY). if { [ "$PROFILE" = "mainnet-link-138" ] || [ -z "$PROFILE" ]; } && [ -n "${CCIP_MAINNET_LINK138_RELAYER_PRIVATE_KEY:-}" ]; then export RELAYER_PRIVATE_KEY="$CCIP_MAINNET_LINK138_RELAYER_PRIVATE_KEY" if [ -n "${CCIP_MAINNET_LINK138_RELAYER_ADDRESS:-}" ]; then export RELAYER_ADDRESS="$CCIP_MAINNET_LINK138_RELAYER_ADDRESS" fi fi # Check if npm is available if ! command -v npm > /dev/null 2>&1; then echo "Error: npm is not found. Please install Node.js and npm first." echo "Install with: curl -fsSL https://deb.nodesource.com/setup_20.x | sudo -E bash - && sudo apt-get install -y nodejs" exit 1 fi # Start service npm start