/ 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 "$@"