/ codex-node / docker-entrypoint.sh
docker-entrypoint.sh
1 #!/bin/bash 2 3 # Environment variables from files in form of foo=bar 4 # If set to file path, read the file and export the variables 5 # If set to directory path, read all files in the directory and export the variables 6 if [[ -n "${ENV_PATH}" ]]; then 7 set -a 8 [[ -f "${ENV_PATH}" ]] && source "${ENV_PATH}" || for f in "${ENV_PATH}"/*; do source "$f"; done 9 set +a 10 fi 11 12 13 # Parameters 14 if [[ -z "${CODEX_NAT}" ]]; then 15 if [[ "${NAT_IP_AUTO}" == "true" && -z "${NAT_PUBLIC_IP_AUTO}" ]]; then 16 export CODEX_NAT="extip:$(hostname --ip-address)" 17 elif [[ -n "${NAT_PUBLIC_IP_AUTO}" ]]; then 18 # Run for 60 seconds if fail 19 WAIT=120 20 SECONDS=0 21 SLEEP=5 22 while (( SECONDS < WAIT )); do 23 IP=$(curl -s -f -m 5 "${NAT_PUBLIC_IP_AUTO}") 24 # Check if exit code is 0 and returned value is not empty 25 if [[ $? -eq 0 && -n "${IP}" ]]; then 26 export CODEX_NAT="extip:${IP}" 27 break 28 else 29 # Sleep and check again 30 echo "Can't get Public IP - Retry in $SLEEP seconds / $((WAIT - SECONDS))" 31 sleep $SLEEP 32 fi 33 done 34 fi 35 fi 36 37 # Stop Codex run if can't get NAT IP when requested 38 if [[ "${NAT_IP_AUTO}" == "true" && -z "${CODEX_NAT}" ]]; then 39 echo "Can't get Private IP - Stop Codex run" 40 exit 1 41 elif [[ -n "${NAT_PUBLIC_IP_AUTO}" && -z "${CODEX_NAT}" ]]; then 42 echo "Can't get Public IP in $WAIT seconds - Stop Codex run" 43 exit 1 44 fi 45 46 # If marketplace is enabled from the testing environment, 47 # The file has to be written before Codex starts. 48 keyfile="private.key" 49 if [[ -n "${ETH_PRIVATE_KEY}" ]]; then 50 echo "${ETH_PRIVATE_KEY}" > "${keyfile}" 51 chmod 600 "${keyfile}" 52 export CODEX_ETH_PRIVATE_KEY="${keyfile}" 53 echo "Private key set" 54 fi 55 56 # Set arguments 57 if [[ "${MODE}" == "codex-node-with-marketplace" ]]; then 58 set -- "$@" persistence 59 [[ -z "${CODEX_MARKETPLACE_ADDRESS}" ]] && unset CODEX_MARKETPLACE_ADDRESS 60 elif [[ "${MODE}" == "codex-storage-node" ]]; then 61 set -- "$@" persistence prover 62 else 63 unset CODEX_ETH_PROVIDER 64 fi 65 66 # Bootstrap node from URL 67 BOOTSTRAP_NODE_FROM_URL="${BOOTSTRAP_NODE_FROM_URL:-https://spr.codex.storage/${NETWORK}}" 68 69 if [[ -n "${BOOTSTRAP_NODE_FROM_URL}" ]]; then 70 WAIT=${BOOTSTRAP_NODE_FROM_URL_WAIT:-300} 71 SECONDS=0 72 SLEEP=1 73 # Run and retry if fail 74 while (( SECONDS < WAIT )); do 75 SPR=($(curl -s -f -m 5 "${BOOTSTRAP_NODE_FROM_URL}")) 76 # Check if exit code is 0 and returned value is not empty 77 if [[ $? -eq 0 && -n "${SPR}" ]]; then 78 for node in "${SPR[@]}"; do 79 bootstrap+="--bootstrap-node=$node " 80 done 81 set -- "$@" ${bootstrap} 82 break 83 else 84 # Sleep and check again 85 echo "Can't get SPR from ${BOOTSTRAP_NODE_FROM_URL} - Retry in $SLEEP seconds / $((WAIT - SECONDS))" 86 sleep $SLEEP 87 fi 88 done 89 fi 90 91 # Update arguments 92 set -- "$@" ${EXTRA_OPTS} 93 94 # Check if the endpoint is synced 95 if [[ -n "${CODEX_ETH_PROVIDER}" ]]; then 96 echo "Marketplace is enabled - Check if the endpoint is synced" 97 98 timeout=3 99 interval=5 100 endpoint="${CODEX_ETH_PROVIDER}" 101 while true; do 102 block=$(curl -m $timeout -X POST \ 103 -s "${CODEX_ETH_PROVIDER}" \ 104 -H 'Content-Type: application/json' \ 105 -d '{"jsonrpc":"2.0","method":"eth_getBlockByNumber","params":["latest",false],"id":0}' | jq -r '.result.number') 106 block=$(("${block}")) 107 sync=$(curl -m $timeout -X POST \ 108 -s "${CODEX_ETH_PROVIDER}" \ 109 -H 'Content-Type: application/json' \ 110 -w %{time_total} \ 111 -d '{"jsonrpc":"2.0","method":"eth_syncing","params":[],"id":1}') 112 sync=$(echo $sync | tr '\n' ' ') 113 if [[ $sync == *false* ]]; then 114 echo "$(date) - Endpoint ${endpoint} is Synced, go to run - block $block - $sync" 115 break 116 else 117 echo "$(date) - Endpoint ${endpoint} is Not synced, waiting - block $block - $sync" 118 fi 119 sleep $interval 120 done 121 else 122 echo "Marketplace is disabled - Skip endpoint sync check" 123 fi 124 125 # Circuit downloader 126 # cirdl [circuitPath] [rpcEndpoint] [marketplaceAddress] 127 if [[ "$@" == *"prover"* ]]; then 128 echo "Prover is enabled - Run Circuit downloader" 129 130 # Set variables required by cirdl from command line arguments when passed 131 for arg in data-dir circuit-dir eth-provider marketplace-address; do 132 arg_value=$(grep -o "${arg}=[^ ,]\+" <<< $@ | awk -F '=' '{print $2}') 133 if [[ -n "${arg_value}" ]]; then 134 var_name=$(tr '[:lower:]' '[:upper:]' <<< "CODEX_${arg//-/_}") 135 export "${var_name}"="${arg_value}" 136 fi 137 done 138 139 # Set circuit dir from CODEX_CIRCUIT_DIR variables if set 140 if [[ -z "${CODEX_CIRCUIT_DIR}" ]]; then 141 export CODEX_CIRCUIT_DIR="${CODEX_DATA_DIR}/circuits" 142 fi 143 144 # Download circuit 145 mkdir -p "${CODEX_CIRCUIT_DIR}" 146 chmod 700 "${CODEX_CIRCUIT_DIR}" 147 download="cirdl ${CODEX_CIRCUIT_DIR} ${CODEX_ETH_PROVIDER} ${CODEX_MARKETPLACE_ADDRESS}" 148 echo "${download}" 149 eval "${download}" 150 [[ $? -ne 0 ]] && { echo "Failed to download circuit files"; exit 1; } 151 fi 152 153 # Show 154 echo -e "\nCodex run parameters:" 155 vars=$(env | grep CODEX_) 156 echo -e "${vars//CODEX_/ - CODEX_}" 157 echo -e " - $@\n" 158 159 # Run 160 echo "Run Codex node" 161 exec "$@"