# Deploy NEAR Validator Node

In this tutorial, we will learn how to deploy a NEAR validator node, and load a validator key into it.

### Generate Validator Key

Generate validator account using [NEAR CLI](https://github.com/near/near-cli) tool. Which can be installed using:

```bash
npm install -g near-cli
```

{% hint style="warning" %}
Validator account must have the name `validator.`
{% endhint %}

```bash
near generate-key validator
```

An ed25519 private key will be generated and saved in current user home directory under `.near-credentials/testnet`

```bash
cat ~/.near-credentials/testnet/validator.json
```

It will return an output similar to the following

```json
{
  "account_id": "validator",
  "public_key": "ed25519:CdTBLXMmu9gzoCbNKdUnej1tJNMz5tzRjJF2a9DwAgUr",
  "private_key": "ed25519:4k83DwbSpD3zzai4ZPdeRJcfXttU3Uq68mWWhni6ra2RKnG3jyVKEZyP14gDJZ9W1oqFujpAkidoNrYY4TLqijsG"
}
```

{% hint style="warning" %}
Change `private_key` field to `secret_key`.
{% endhint %}

### Generate Secret for Validator Private Key

Create a Kubernetes secret from the generated private key in the previous step:

```bash
kubectl create secret generic validator-key  --from-file=key=$HOME/.near-credentials/testnet/validator.json
```

### Deploy NEAR Validator Node

The following manifest describes a NEAR node that syncs NEAR testnet `network: testnet`, enables HTTP JSON-RPC server `rpc: true`, loads validator key from the Kubernetes secret that we've created in the previous step, and uses [NEAR Core](https://github.com/near/nearcore) client:

{% code title="near.yaml" %}

```yaml
apiVersion: near.kotal.io/v1alpha1
kind: Node
metadata:
  name: near-node
spec:
  network: testnet
  validatorSecretName: validator-key
  rpc: true
```

{% endcode %}

Apply `near.yaml` manifest:

```bash
kubectl apply -f near.yaml
```

Kotal operator will notice your `near-node` and will create all the necessary pods, persistent volumes, services, configmaps, and secrets neccessary.

You can fetch the deployed NEAR `Node` using:

```bash
kubectl get nodes.near
```

It will return an output similar to the following:

```bash
NAME         NETWORK    CLIENT      VALIDATOR
near-node    testnet    nearcore    true
```

Note that validator is true in the prevous output 😇

### Fetch Node Logs

Get the pods that has been created by Kotal for the node:

```bash
kubectl get pods
```

It will return an output similar to the following:

```bash
NAME              READY   STATUS    RESTARTS   AGE
near-node-0       1/1     Running   0          1m
```

Get the logs of the running node:

```bash
kubectl logs -f near-node-0
```

It will return node logs similar to the following:

```
Apr 08 12:24:09.930  INFO neard: Version: 1.23.1, Build: 1.23.0-9-gc0551c84b-modified, Latest Protocol: 50
Apr 08 12:24:09.937  INFO near: Did not find "/home/near/kotal-data/data" path, will be creating new store database
Apr 08 12:24:10.438  INFO stats: Server listening at ed25519:GK2bMCbzgjFrdAQPFu2qSc6rViwX4MUb8WZb97CAfUMr@0.0.0.0:24567
Apr 08 12:24:20.444  INFO stats: # 9820210 Downloading headers 0.00% (53273496)   5/3/40 peers ⬇ 0.7kiB/s ⬆ 0.2kiB/s 0.00 bps 0 gas/s CPU: 0%, Mem: 0 B
Apr 08 12:24:30.447  INFO stats: # 9820210 Downloading headers 0.00% (53273498)   5/3/40 peers ⬇ 0.7kiB/s ⬆ 0.2kiB/s 0.00 bps 0 gas/s CPU: 4%, Mem: 78.4 MiB
Apr 08 12:24:40.417  INFO stats: # 9820210 Downloading headers 0.00% (53273497)   5/3/40 peers ⬇ 0.7kiB/s ⬆ 0.2kiB/s 0.00 bps 0 gas/s CPU: 10%, Mem: 99.6 MiB
...
```

Finally you can delete the node by:

```bash
kubectl delete -f near.yaml
```

Kubernetes garbage collector will delete all the resources that has been created by Kotal NEAR `Node` controller.

### Further Reading

1. [Deploy NEAR stacking pool](https://near-nodes.io/validator/deploy-on-mainnet)
2. [Staking on NEAR](https://near-nodes.io/validator/staking-and-delegation)
3. [Upgradable staking pool](https://near-nodes.io/validator/staking-pool-migration)
4. [NEAR validator bootcamp](https://near-nodes.io/validator/validator-bootcamp)


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://docs.kotal.co/tutorials/near/validator.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
