> For the complete documentation index, see [llms.txt](https://docs-zkevm.cronos.com/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs-zkevm.cronos.com/for-node-hosts/running-nodes/cronos-zkevm-sepolia-testnet.md).

# Cronos zkEVM Sepolia Testnet

This guide covers running a node for Cronos zkEVM testnet (Chain ID: 240) with external-node v24.23.0 on docker.

Pre-requisites

* [Docker](https://www.docker.com/get-started) and [Docker-compose](https://docs.docker.com/compose/install/)&#x20;

### Prepare your machine

This configuration is approximate and should be considered as minimal requirements:

{% tabs %}
{% tab title="Full Node" %}
{% hint style="info" %}
**Full Node** - is configured to build and store the last 7 days of data for Cronos zkEVM Sepolia Testnet by default. Check [here](https://github.com/matter-labs/zksync-era/blob/main/docs/guides/external-node/08_pruning.md#configuration) for details on the pruning setting.&#x20;
{% endhint %}

* 4-core of CPU
* 16GB of RAM
* 100G of SSD storage
  {% endtab %}

{% tab title="Archive Node" %}
{% hint style="info" %}
**Archive Node** - is configured to build an archive of ***all historical data*** of Cronos zkEVM Sepolia Testnet;
{% endhint %}

* 4-core of CPU
* 32GB of RAM
* 500G of SSD storage
  {% endtab %}
  {% endtabs %}

## **Step 1:  Download the DB Dump**

### 1.1  - Download the pgdump

Create a new folder and download the dump file into it by:

```bash
wget https://storage.googleapis.com/cronos-zkevm-testnet-en-pgdump/external_node.tar.gz
```

### 1.2 - Extract the data from dump

After extracting the file, locate the `dump` folder and the `pg_restore.list` file. Put both to the main directory, instead of default under “external\_node”.

## Step 2: Docker Preparations

### 2.1 - Pull Docker Image

Under the same directory, pull docker image from[ Github Container Registry](https://github.com/cronos-labs/cronos-zkevm/pkgs/container/external-node):

```bash
docker pull http://ghcr.io/cronos-labs/external-node:v26.2.1-20250213
```

### 2.2 - Create Docker Compose Configuration

Inside that directory, create and edit `docker-compose.yml` :

```bash
nano docker-compose.yml
```

Add the following configuration to `docker-compose.yml`:

{% tabs %}
{% tab title="Full Node" %}

```yaml
services: 
  cronoszk:
    image: "ghcr.io/cronos-labs/external-node:testnet-v24.23.0"
    network_mode: host
    restart: unless-stopped
    stop_grace_period: "120s"
    user: 0:0  
    volumes:
        - "${PWD}:/db" # Path to the rocksdb you unzipped
    environment:
      DATABASE_POOL_SIZE: 10
      DATABASE_URL: "postgresql://zksync:password@localhost:5432/mydb"
      EN_ETH_CLIENT_URL: "https://ethereum-sepolia-rpc.publicnode.com"
      EN_HEALTHCHECK_PORT: 3081
      EN_HTTP_PORT: 3060
      EN_L1_BATCH_COMMIT_DATA_GENERATOR_MODE: "Validium"
      EN_L1_CHAIN_ID: 11155111
      EN_L2_CHAIN_ID: 240
      EN_MAIN_NODE_URL: "https://seed.testnet.zkevm.cronos.org/"    
      EN_MERKLE_TREE_PATH: "./db/ext-node/lightweight"
      EN_PROMETHEUS_PORT: 3312
      EN_PRUNING_ENABLED: "true" #Note: Default value is false, i.e. no purning
      EN_REQ_ENTITIES_LIMIT: 1000
      EN_SNAPSHOTS_RECOVERY_ENABLED: "true"
      EN_SNAPSHOTS_OBJECT_STORE_BUCKET_BASE_URL: "cronos-zkevm-testnet-en-snapshot"
      EN_SNAPSHOTS_OBJECT_STORE_MODE: "GCSAnonymousReadOnly"
      EN_STATE_CACHE_PATH: "./db/ext-node/state_keeper"
      EN_WS_PORT: 3061
      RUST_LOG: "warn,zksync=info,zksync_core::metadata_calculator=debug,zksync_state=debug,zksync_utils=debug,zksync_web3_decl::client=error"
  postgres:
    image: postgres:16
    restart: unless-stopped
    stop_grace_period: "120s"
    network_mode: host
    environment:
      POSTGRES_DB: mydb
      POSTGRES_USER: zksync
      POSTGRES_PASSWORD: password
    ulimits:
      nofile: 60000
      nproc: 60000
      memlock: -1
    volumes:
      - "${PWD}/pgsql_data:/var/lib/postgresql/data/"
      - "${PWD}:/dump" # This is the location of where the dump is.
```

{% endtab %}

{% tab title="Archive Node" %}

```yaml
services: 
  cronoszk:
    image: "ghcr.io/cronos-labs/external-node:testnet-v24.23.0"
    network_mode: host
    restart: unless-stopped
    stop_grace_period: "120s"
    user: 0:0  
    volumes:
        - "${PWD}:/db" # Path to the rocksdb you unzipped
    environment:
      DATABASE_POOL_SIZE: 10
      DATABASE_URL: "postgresql://zksync:password@localhost:5432/mydb"
      EN_ETH_CLIENT_URL: "https://ethereum-sepolia-rpc.publicnode.com"
      EN_HEALTHCHECK_PORT: 3081
      EN_HTTP_PORT: 3060
      EN_L1_BATCH_COMMIT_DATA_GENERATOR_MODE: "Validium"
      EN_L1_CHAIN_ID: 11155111
      EN_L2_CHAIN_ID: 282
      EN_MAIN_NODE_URL: "https://seed.testnet.zkevm.cronos.org/"    
      EN_MERKLE_TREE_PATH: "./db/ext-node/lightweight"
      EN_PROMETHEUS_PORT: 3312
      EN_PRUNING_ENABLED: "false" #Note: Default value is false, i.e. no purning
      EN_REQ_ENTITIES_LIMIT: 1000
      EN_SNAPSHOTS_RECOVERY_ENABLED: "false"
      EN_SNAPSHOTS_OBJECT_STORE_BUCKET_BASE_URL: "cronos-zkevm-testnet-en-snapshot"
      EN_SNAPSHOTS_OBJECT_STORE_MODE: "GCSAnonymousReadOnly"
      EN_STATE_CACHE_PATH: "./db/ext-node/state_keeper"
      EN_WS_PORT: 3061
      RUST_LOG: "warn,zksync=info,zksync_core::metadata_calculator=debug,zksync_state=debug,zksync_utils=debug,zksync_web3_decl::client=error"
  postgres:
    image: postgres:16
    restart: unless-stopped
    stop_grace_period: "120s"
    network_mode: host
    environment:
      POSTGRES_DB: mydb
      POSTGRES_USER: zksync
      POSTGRES_PASSWORD: password
    ulimits:
      nofile: 60000
      nproc: 60000
      memlock: -1
    volumes:
      - "${PWD}/pgsql_data:/var/lib/postgresql/data/"
      - "${PWD}:/dump" # This is the location of where the dump is.
```

{% endtab %}
{% endtabs %}

{% hint style="warning" %}
**Important**

Make sure you have the correct vars, volume attachment under the correct path.
{% endhint %}

{% hint style="info" %}
**Note**

* **`EN_PRUNING_ENABLED`**: Determines whether the node is set to pruning mode. When enabled, the node retains only recent chain data and discards older data to conserve storage space.
* **`EN_SNAPSHOTS_RECOVERY_ENABLED`**, **`EN_SNAPSHOTS_OBJECT_STORE_BUCKET_BASE_URL`**, and **`EN_SNAPSHOTS_OBJECT_STORE_MODE`**: Enable snapshots recovery (similar to state-sync) and allows the node to recover from the latest batch without containing the full historical data.
* **Add** **`debug`** to namespaces: Enables debug tracing and saves debug data.`EN_API_NAMESPACES:`Defines the enabled API namespaces, including `eth`, `net, web3, zks, pubsub, and debug`.
* Read more on Snapshots Recovery [here](https://github.com/matter-labs/zksync-era/blob/c83cca8fe7fa105ec6b1491e4efb9f9e4bd66d41/docs/guides/external-node/07_snapshots_recovery.md).
  {% endhint %}

## Step 3: Database Restoration

### 3.1  - Start PostgreSQL Container:

```bash
docker compose up -d postgres
```

Please note `postgres` was named in docker-compose.

When container is running, list containers to find the container ID:

```bash
docker ps
```

Below is the example output:

```bash
CONTAINER ID   IMAGE         COMMAND                  CREATED          STATUS          PORTS     NAMES
e0955341a0dd   postgres:16   "docker-entrypoint.s…"   5 hours ago      Up 4 hours              zkevmtest-postgres-1
```

### 3.2 - Restore Database from Dump

Run the following and docker retrieve and manipulate the data from data dump:

```bash
docker exec -it <container_ID> pg_restore -x -O -j2 -L <pg_restore.list_location>  -d <database_name> -U <username>  <path_to_dump_you_attached_in_volumes_docker_compose>
```

Example:&#x20;

```bash
docker exec -it ad4c924d075a pg_restore -x -O -j2 -L /dump/pg_restore.list  -d mydb -U zksync  /dump/dump
```

{% hint style="info" %}
**NOTE**

The `username` and `database` names were defined in the`docker-compose`; in this example, they are `zksync` and `mydb`, respectively.
{% endhint %}

During the process, on the docker side, you should see:

<figure><img src="https://3199918912-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FuSKiKu5wNi55i329LvV2%2Fuploads%2FleRDTZx3ffiC0qtvSNqL%2FScreenshot%202024-09-11%20at%2012.25.17%E2%80%AFAM.png?alt=media&amp;token=3c9623a9-faab-482d-b8f2-e909b54b1579" alt=""><figcaption></figcaption></figure>

Depending on the specs, the process might take several hours.

## Step 4: Run everything

Once the pg restore completed, start the cronoszk node service:

```bash
docker compose up -d 
```

Example output should be like:&#x20;

```bash
[+] Running 2/2
 ✔ Container zkevmtest-cronoszk-1  Started    0.1s 
 ✔ Container zkevmtest-postgres-1  Started    0.1s 
```

You should see in the Docker logs that the node is fetching block data from the RPCs.&#x20;

For example:

<figure><img src="https://3199918912-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FuSKiKu5wNi55i329LvV2%2Fuploads%2FDxoC2fsemTNAl2Cl2tvs%2FScreenshot%202024-09-11%20at%2012.24.11%E2%80%AFAM.png?alt=media&amp;token=c9bf696a-96a2-4712-9326-36e7e4e9479a" alt=""><figcaption></figcaption></figure>

Once the node is synchronized, you may use `EN_HTTP_PORT: 3060` as defined for ETH-JSON RPC calls.<br>
