NEW

The Chainlink Hackathon kicks off April 28th! Register today to compete for $350K+ in prizes.

Running a Chainlink Node

This guide will teach you how to run a Chainlink node locally using Docker. The Chainlink node will be configured to connect to the Ethereum Sepolia or Goerli testnet.

To run a Chainlink node from source, use the following instructions. However, it’s recommended to run the Chainlink node with Docker. This is because we continuously build and deploy the code from our repository on Github, which means you don’t need a complete development environment to run a node.

Chainlink is blockchain agnostic technology. The LINK Token Contracts page details networks which support the LINK token. You can setup your node to provide data to any of these blockchains.

Ganache is a mock testnet. Although you can run nodes on Ganache, it is not officially supported. Most node operators should use one of the supported testnets for development and testing.

Requirements

  • As explained in the requirements page, make sure there are enough resources to run a Chainlink node and a PostgreSQL database.
  • Install Docker Desktop. You will run the Chainlink node and PostgreSQL in Docker containers.
  • Chainlink nodes must be able to connect to an Ethereum client with an active websocket connection. See Running an Ethereum Client for details. In this tutorial, you can use an external service as your client.

Using Docker

Run PostgreSQL

  1. Run PostgreSQL in a Docker container. You can replace mysecretpassword with your own password.

    docker run --name cl-postgres -e POSTGRES_PASSWORD=mysecretpassword -p 5432:5432 -d postgres
  2. Confirm that the container is running. Note the 5432 port is published 0.0.0.0:5432->5432/tcp and therefore accessible outside of Docker.

    docker ps -a -f name=cl-postgres
    
    CONTAINER ID   IMAGE      COMMAND                  CREATED         STATUS         PORTS                    NAMES
    dc08cfad2a16   postgres   "docker-entrypoint.s…"   3 minutes ago   Up 3 minutes   0.0.0.0:5432->5432/tcp   cl-postgres

Configure your node

  1. Create a local directory to hold the Chainlink data:

    Sepolia Goerli ```shell Sepolia mkdir ~/.chainlink-sepolia ``` ```shell Goerli mkdir ~/.chainlink-goerli ```
  2. Run the following as a command to create a config.toml file and populate with variables specific to the network you’re running on. For a full list of available configuration variables, see the Node Config page. Be sure to update the value for CHANGEME to the value given by your external Ethereum provider.

    Sepolia Goerli ```shell Sepolia echo "[Log] Level = 'warn'

    [WebServer] AllowOrigins = ’*’ SecureCookies = false

    [WebServer.TLS] HTTPSPort = 0

    [[EVM]] ChainID = ‘11155111’

    [[EVM.Nodes]] Name = ‘Sepolia’ WSURL = ‘wss://CHANGE_ME’ HTTPURL = ‘https://CHANGE_ME’ ” > ~/.chainlink-sepolia/config.toml

    </Fragment>
    <Fragment slot="panel.2">
    ```shell Goerli
    echo "[Log]
    Level = 'warn'
    
    [WebServer]
    AllowOrigins = '*'
    SecureCookies = false
    
    [WebServer.TLS]
    HTTPSPort = 0
    
    [[EVM]]
    ChainID = '5'
    
    [[EVM.Nodes]]
    Name = 'Goerli'
    WSURL = 'wss://CHANGE_ME'
    HTTPURL = 'https://CHANGE_ME'
    " > ~/.chainlink-goerli/config.toml
  3. Create a secrets.toml file with a keystore password and the URL to your database. Update the value for mysecretpassword to the chosen password in Run PostgreSQL. Specify a complex keystore password. This will be your wallet password that you can use to unlock the keystore file generated for you.

    Sepolia Goerli ```shell Sepolia echo "[Password] Keystore = 'mysecretkeystorepassword'

    [Database] URL = ‘postgresql://postgres

    @host.docker.internal:5432/postgres?sslmode=disable’ ” > ~/.chainlink-sepolia/secrets.toml

    </Fragment>
    <Fragment slot="panel.2">
    ```shell Goerli
    echo "[Password]
    Keystore = 'mysecretkeystorepassword'
    
    [Database]
    URL = 'postgresql://postgres:mysecretpassword@host.docker.internal:5432/postgres?sslmode=disable'
    " > ~/.chainlink-goerli/secrets.toml

    Because you are testing locally, add ?sslmode=disable to the end of your DATABASE_URL. However you should never do this on a production node.

  4. Start the Chainlink Node. Now you can run the Docker image. Replace <version> with your desired version. Tag versions are available in the Chainlink docker hub. The latest version does not work.

    Sepolia Goerli ```shell Sepolia cd ~/.chainlink-sepolia && docker run --platform linux/x86_64/v8 --name chainlink -v ~/.chainlink-sepolia:/chainlink -it -p 6688:6688 --add-host=host.docker.internal:host-gateway smartcontract/chainlink: -config /chainlink/config.toml -secrets /chainlink/secrets.toml node start ``` ```shell Goerli cd ~/.chainlink-goerli && docker run --platform linux/x86_64/v8 --name chainlink -v ~/.chainlink-goerli:/chainlink -it -p 6688:6688 --add-host=host.docker.internal:host-gateway smartcontract/chainlink: -config /chainlink/config.toml -secrets /chainlink/secrets.toml node start ```

    The first time running the image, the node asks you to enter an API Email and Password. This will be used to expose the API for the GUI interface, and will be used every time you log into your node.

  5. Check the container is running. Note the 6688 port is published 0.0.0.0:6688->6688/tcp and therefore accessible outside of Docker.

    docker ps -a -f name=chainlink
    
    CONTAINER ID   IMAGE                            COMMAND                CREATED         STATUS                   PORTS                    NAMES
    feff39f340d6   smartcontract/chainlink:1.13.0   "chainlink node start" 4 minutes ago   Up 4 minutes (healthy)   0.0.0.0:6688->6688/tcp   chainlink
  6. You can now connect to your Chainlink node’s UI interface by navigating to http://localhost:6688. If using a VPS, you can create an SSH tunnel to your node for 6688:localhost:6688 to enable connectivity to the GUI. Typically this is done with ssh -i $KEY $USER@$REMOTE-IP -L 6688:localhost:6688 -N. An SSH tunnel is recommended over opening public-facing ports specific to the Chainlink node. See the Security and Operation Best Practices page for more details on securing your node.

What's next

Stay updated on the latest Chainlink news