How to run an API Endpoint

Running an API Endpoint is a similar process as setting up a validator node.

The only differences are the ROLE environment variable. The ROLE environment variable should be set to 0 for an API Endpoint.

We also dont need to register a wallet as a validator and pay registration fee.

Prerequisites

Get the official Docker Image: iconloop/icon2-node

System Requirements

CPU:  minimum 4core, recommend 8core +
RAM:  minimum 16GB, recommend 32GB +
DISK : minimum SSD 2.5TB, recommend SSD 3TB +
Network: minimum 1Gbps, recommend 2Gbps +

External Communications
TCP 7100: TCP port used for peer-to-peer connection between peer nodes.
TCP 9000: JSON-RPC or RESTful API port serving application requests.P-Rep must allow TCP connections to port 7100 and 9000 of an external host. ( Use 0.0.0.0/0 for a source from any network )

Getting started

Create a working folder in your server on a disk with enough space as detailed in the system requirements.

For this guide we will use the following structure:

mkdir ~/icon-api-endpoint

Change to the working directory

cd ~/icon-api-endpoint

Create a docker-compose.yml file in the working directory.

touch docker-compose.yml

Open docker-compose.yml in a text editor and add the following content:

version: "3"
services:
   prep:
      image: iconloop/icon2-node
      container_name: "icon2-node"
      network_mode: host
      restart: "on-failure"
      environment:
         SERVICE: "MainNet"  # MainNet, SejongNet  ## network type
         GOLOOP_LOG_LEVEL: "debug" # trace, debug, info, warn, error, fatal, panic
         KEY_STORE_FILENAME: "INPUT_YOUR_KEY_STORE_FILENAME" # optional, a wallet will be generated for you if you don't have one
         KEY_PASSWORD: "INPUT_YOUR_KEY_PASSWORD" # optional, a wallet will be generated for you if you don't have one
         FASTEST_START: "true"    # It can be restored from latest Snapshot DB.

         ROLE: 0 # Validator = 3, API Endpoint = 0

      cap_add:
         - SYS_TIME

      volumes:
         - ./data:/goloop/data # mount a data volumes
         - ./config:/goloop/config # mount a config volumes ,Put your used keystore file here.
         - ./logs:/goloop/logs

Run the following command to start the ICON2 node and wait for the entire ledger to locally sync.

$ docker-compose pull && docker-compose up -d

To see the logs of the ICON2 node you can execute

$ tail -f logs/booting.log

$ tail -f logs/goloop.log

The following folder structure will be created:

.
β”œβ”€β”€ docker-compose.yml
β”œβ”€β”€ config              # configuration files
β”‚   └── keystore.json   # Import your keystore file

β”œβ”€β”€ data                # block data
β”‚   β”œβ”€β”€ 1
β”‚   β”œβ”€β”€ auth.json
β”‚   β”œβ”€β”€ cli.sock
β”‚   β”œβ”€β”€ ee.sock
β”‚   └── rconfig.json

└── logs   # log files
    β”œβ”€β”€ booting.log
    β”œβ”€β”€ health.log    # health state log
    β”œβ”€β”€ chain.log     # goloop chain action logs
    β”œβ”€β”€ download.log
    β”œβ”€β”€ download_error.log # download
    └── goloop.log   # goloop's log file

Docker environments settings

Namedefaulttyperequireddescription
SERVICEMainNetstrfalseService Name - (MainNet, SejongNet)
ROLE0inttrueRole of running node. 0: Citizen, 3: P-Rep
CONFIG_URLstrfalse
CONFIG_URL_FILEdefault_configure.jsonstrfalse
CONFIG_LOCAL_FILEconfigure.jsonstrfalse
IS_AUTOGEN_CERTfalseboolfalseAutomatically generate certificates
FASTEST_STARTfalseboolfalseDownload snapshot DB
KEY_STORE_FILENAMEkeystore.jsonstrtruekeystore.json file name
KEY_PASSWORDstrtruepassword of keystore.json file
USE_NTP_SYNCTrueboolfalseWhether to use NTP in container
NTP_SERVERstrfalseNTP Server
NTP_REFRESH_TIMEintfalsentp refresh time
SLACK_WH_URLstrfalseslack web hook url - If a problem occurs, you can receive an alarm with a slack.
USE_HEALTH_CHECKTrueboolfalseWhether to use health check
CHECK_TIMEOUT10intfalsesec - TIMEOUT when calling REST API for monitoring
CHECK_PEER_STACK6intfalsesec - Stack value to check the peer for monitoring.
CHECK_BLOCK_STACK10intfalsesec - Stack value to check the block for monitoring.
CHECK_INTERVAL10intfalsesec - check interval for monitoring
CHECK_STACK_LIMIT360intfalsecount - count- Restart container when stack value is reached
GOLOOP_LOG_LEVELdebugstrfalseLog Level - (trace,debug,info,warn,error,fatal,panic
LOG_OUTPUT_TYPEfilestrfalsesec - check interval for monitoring
CTRL + M