├── .gitignore ├── ansible ├── group_vars │ └── all.yaml.example ├── monitoring │ ├── grafana │ │ ├── grafana.ini │ │ ├── dashboards.yml │ │ ├── datasource.yml │ │ └── dashboards │ │ │ └── chains_dashboard.json │ ├── README.md │ ├── prometheus │ │ └── prometheus.yml │ └── monitoring.yaml ├── ansible.cfg ├── inventory.yaml.example └── cosmos-mainnets │ ├── templates │ ├── client.toml.tpl │ ├── app.toml.tpl │ └── config.toml.tpl │ ├── canto │ ├── README.md │ └── canto.yaml │ └── konstellation │ ├── README.md │ └── konstellation.yaml └── README.md /.gitignore: -------------------------------------------------------------------------------- 1 | ansible/inventory.yaml 2 | ansible/group_vars/*.yaml 3 | -------------------------------------------------------------------------------- /ansible/group_vars/all.yaml.example: -------------------------------------------------------------------------------- 1 | canto_keypasswd: mySuperStrongNodeWalletPassword1 2 | -------------------------------------------------------------------------------- /ansible/monitoring/grafana/grafana.ini: -------------------------------------------------------------------------------- 1 | [auth.anonymous] 2 | enabled = true 3 | ; org_role = Admin 4 | org_role = Viewer 5 | 6 | [feature_toggles] 7 | publicDashboards = true 8 | -------------------------------------------------------------------------------- /ansible/monitoring/grafana/dashboards.yml: -------------------------------------------------------------------------------- 1 | apiVersion: 1 2 | 3 | providers: 4 | - name: dashboards 5 | type: file 6 | updateIntervalSeconds: 30 7 | options: 8 | path: /etc/dashboards 9 | -------------------------------------------------------------------------------- /ansible/monitoring/README.md: -------------------------------------------------------------------------------- 1 | ``` 2 | cd ansible 3 | ``` 4 | 5 | ### Install 6 | 7 | ``` 8 | ansible-playbook monitoring/monitoring.yaml \ 9 | --extra-vars="target=monitoring" \ 10 | --diff --check 11 | ``` 12 | -------------------------------------------------------------------------------- /ansible/ansible.cfg: -------------------------------------------------------------------------------- 1 | [defaults] 2 | roles_path = roles 3 | inventory = inventory.yaml 4 | timeout = 20 5 | host_key_checking = False 6 | pipelining = True 7 | forks = 50 8 | ssh_args = -o ControlMaster=auto -o ControlPersist=60s 9 | -------------------------------------------------------------------------------- /ansible/inventory.yaml.example: -------------------------------------------------------------------------------- 1 | all: 2 | hosts: 3 | my.host.xyz: 4 | ansible_host: 11.22.33.44 5 | vars: 6 | NODES_DIR: /opt/nodes 7 | NODES_DATA_DIR: /opt/nodes_data 8 | 9 | cosmosMainnets: 10 | hosts: 11 | my.host.xyz: 12 | -------------------------------------------------------------------------------- /ansible/monitoring/prometheus/prometheus.yml: -------------------------------------------------------------------------------- 1 | global: 2 | scrape_interval: 12s # Set the scrape interval to every 12 seconds. Default is every 1 minute. 3 | evaluation_interval: 12s # Evaluate rules every 12 seconds. The default is every 1 minute. 4 | 5 | scrape_configs: 6 | - job_name: "node-exporter" 7 | static_configs: 8 | - targets: ["node-exporter:9100"] 9 | - job_name: "canto-node" 10 | static_configs: 11 | - targets: ["canto-node:26660"] 12 | - job_name: "konstellation-node" 13 | static_configs: 14 | - targets: ["konstellation-node:26660"] 15 | -------------------------------------------------------------------------------- /ansible/cosmos-mainnets/templates/client.toml.tpl: -------------------------------------------------------------------------------- 1 | # This is a TOML config file. 2 | # For more information, see https://github.com/toml-lang/toml 3 | 4 | ############################################################################### 5 | ### Client Configuration ### 6 | ############################################################################### 7 | 8 | # The network chain ID 9 | chain-id = "{{ chain_id }}" 10 | # The keyring's backend, where the keys are stored (os|file|kwallet|pass|test|memory) 11 | keyring-backend = "os" 12 | # CLI output format (text|json) 13 | output = "text" 14 | # : to Tendermint RPC interface for this chain 15 | node = "tcp://{{ project_name}}-node:26657" 16 | # Transaction broadcasting mode (sync|async|block) 17 | broadcast-mode = "sync" 18 | -------------------------------------------------------------------------------- /ansible/cosmos-mainnets/canto/README.md: -------------------------------------------------------------------------------- 1 | ``` 2 | cd ansible 3 | ``` 4 | 5 | ### First init and download genesis 6 | 7 | ``` 8 | ansible-playbook cosmos-mainnets/canto/canto.yaml \ 9 | --extra-vars="target=cosmosMainnets" \ 10 | --extra-vars="init=True" \ 11 | --extra-vars="rebuild=True" \ 12 | --diff --check 13 | ``` 14 | 15 | ### Set configs 16 | 17 | ``` 18 | ansible-playbook cosmos-mainnets/canto/canto.yaml \ 19 | --extra-vars="target=cosmosMainnets" \ 20 | --extra-vars="config=True" \ 21 | --diff --check 22 | ``` 23 | 24 | ### Run node 25 | 26 | ``` 27 | ansible-playbook cosmos-mainnets/canto/canto.yaml \ 28 | --extra-vars="target=cosmosMainnets" \ 29 | --extra-vars="run_node=True" \ 30 | --diff --check 31 | ``` 32 | 33 | ### Upgrade 34 | 35 | ``` 36 | ansible-playbook cosmos-mainnets/canto/canto.yaml \ 37 | --extra-vars="target=cosmosMainnets" \ 38 | --extra-vars="rebuild=True" \ 39 | --diff --check 40 | ``` 41 | -------------------------------------------------------------------------------- /ansible/cosmos-mainnets/konstellation/README.md: -------------------------------------------------------------------------------- 1 | ``` 2 | cd ansible 3 | ``` 4 | 5 | ### First init and download genesis 6 | 7 | ``` 8 | ansible-playbook cosmos-mainnets/konstellation/konstellation.yaml \ 9 | --extra-vars="target=cosmosMainnets" \ 10 | --extra-vars="init=True" \ 11 | --extra-vars="rebuild=True" \ 12 | --diff --check 13 | ``` 14 | 15 | ### Set configs 16 | 17 | ``` 18 | ansible-playbook cosmos-mainnets/konstellation/konstellation.yaml \ 19 | --extra-vars="target=cosmosMainnets" \ 20 | --extra-vars="config=True" \ 21 | --diff --check 22 | ``` 23 | 24 | ### Run node 25 | 26 | ``` 27 | ansible-playbook cosmos-mainnets/konstellation/konstellation.yaml \ 28 | --extra-vars="target=cosmosMainnets" \ 29 | --extra-vars="run_node=True" \ 30 | --diff --check 31 | ``` 32 | 33 | ### Upgrade 34 | 35 | ``` 36 | ansible-playbook cosmos-mainnets/konstellation/konstellation.yaml \ 37 | --extra-vars="target=cosmosMainnets" \ 38 | --extra-vars="rebuild=True" \ 39 | --diff --check 40 | ``` 41 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ## Note 2 | 3 | > :atom: We didn't have intention to make this repo reusable for everyone.
4 | > It's just an example part of our infrastructure and scripts which we use to speed up our node management and to control configuration changes. 5 | 6 | To start you have to configure following things: 7 | 8 | 1. Add `inventory.yaml` 9 | This file contain list of your nodes / group nodes and some global variables for them. 10 | There is `inventory.yaml.example` which you can use as example. 11 | 2. Add secret varaibles to `group_vars/` directory. 12 | There is an example in file `all.yaml.example` 13 | 3. Change moniker, wallet address, valoper address and other variables in manifests if it is necessary. 14 | 15 | > :eyes: `inventory.yaml` and `group_vars/.yaml` added to gitignore you feel free to keep them in your folder and do not worry about accidentally adding them to the repository 16 | 17 | Some directories contains own README.md with some cheatsheets how to use this manifests. 18 | 19 | ## Repository content 20 | 21 | In our configurations we mostly use ansible and docker. 22 | We have already tried to use nomad to as workload management system but decided not to use it and looking closely to cheap k8s providers. 23 | 24 | If you have any suggesstions how to substitute ansible we are glad to hear it in chats/issues/PR's 25 | 26 | `ansible/cosmos-mainnets` - our mainnet nodes and their configurations 27 | `ansible/monitoring` - our monitoring stack 28 | -------------------------------------------------------------------------------- /ansible/monitoring/grafana/datasource.yml: -------------------------------------------------------------------------------- 1 | # config file version 2 | apiVersion: 1 3 | 4 | # list of datasources that should be deleted from the database 5 | deleteDatasources: 6 | - name: Prometheus 7 | orgId: 1 8 | 9 | # list of datasources to insert/update depending 10 | # whats available in the database 11 | datasources: 12 | # name of the datasource. Required 13 | - name: Prometheus 14 | # datasource type. Required 15 | type: prometheus 16 | # org id. will default to orgId 1 if not specified 17 | orgId: 1 18 | # url 19 | url: http://prometheus:9090 20 | # database password, if used 21 | password: 22 | # database user, if used 23 | user: 24 | # database name, if used 25 | database: 26 | # enable/disable basic auth 27 | basicAuth: false 28 | # enable/disable with credentials headers 29 | withCredentials: 30 | # mark as default datasource. Max one per org 31 | isDefault: true 32 | # fields that will be converted to json and stored in json_data 33 | jsonData: 34 | graphiteVersion: "1.1" 35 | tlsAuth: false 36 | tlsAuthWithCACert: false 37 | # json object of data that will be encrypted. 38 | secureJsonData: 39 | tlsCACert: "..." 40 | tlsClientCert: "..." 41 | tlsClientKey: "..." 42 | version: 1 43 | # allow users to edit datasources from the UI. 44 | editable: true 45 | -------------------------------------------------------------------------------- /ansible/monitoring/monitoring.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | - name: Deploy monitoring 3 | hosts: "{{ target }}" 4 | become: yes 5 | 6 | tasks: 7 | - name: Set variables 8 | ansible.builtin.set_fact: 9 | project_name: monitoring 10 | 11 | - name: "Speed up making directories" 12 | shell: | 13 | mkdir -p {{ NODES_DIR }}/{{ project_name}}/grafana 14 | mkdir -p {{ NODES_DIR }}/{{ project_name}}/prometheus 15 | mkdir -p {{ NODES_DATA_DIR }}/{{ project_name}}/grafana 16 | mkdir -p {{ NODES_DATA_DIR }}/{{ project_name}}/prometheus 17 | chmod -vR 777 {{ NODES_DATA_DIR }}/{{ project_name}}/grafana 18 | chmod -vR 777 {{ NODES_DATA_DIR }}/{{ project_name}}/prometheus 19 | 20 | - name: Create a network 21 | community.docker.docker_network: 22 | name: "{{ project_name }}" 23 | 24 | - name: Copy configs grafana 25 | ansible.builtin.copy: 26 | src: grafana/ 27 | dest: "{{ NODES_DIR }}/{{ project_name}}/grafana/" 28 | 29 | - name: Copy configs prom 30 | ansible.builtin.template: 31 | src: prometheus/prometheus.yml 32 | dest: "{{ NODES_DIR }}/{{ project_name}}/prometheus/" 33 | 34 | - name: Run prom node 35 | docker_container: 36 | name: "prometheus" 37 | image: "prom/prometheus:latest" 38 | networks: 39 | - name: "{{ project_name}}" 40 | - name: "konstellation" 41 | - name: "canto" 42 | restart_policy: unless-stopped 43 | pull: true 44 | state: started 45 | volumes: 46 | - "{{ NODES_DIR }}/{{ project_name}}/prometheus/prometheus.yml:/etc/prometheus/prometheus.yml" 47 | - "{{ NODES_DATA_DIR }}/{{ project_name}}/prometheus:/prometheus" 48 | 49 | - name: Run grafana node 50 | docker_container: 51 | name: "grafana" 52 | image: "grafana/grafana:latest" 53 | networks: 54 | - name: "{{ project_name}}" 55 | restart_policy: unless-stopped 56 | pull: true 57 | state: started 58 | volumes: 59 | - "{{ NODES_DIR }}/{{ project_name}}/grafana/datasource.yml:/etc/grafana/provisioning/datasources/datasource.yml" 60 | - "{{ NODES_DIR }}/{{ project_name}}/grafana/dashboards.yml:/etc/grafana/provisioning/dashboards/datasource.yml" 61 | - "{{ NODES_DIR }}/{{ project_name}}/grafana/grafana.ini:/etc/grafana/grafana.ini:ro" 62 | - "{{ NODES_DIR }}/{{ project_name}}/grafana/dashboards:/etc/dashboards" 63 | - "{{ NODES_DATA_DIR }}/{{ project_name}}/grafana:/var/lib/grafana" 64 | 65 | - name: Run exporter node 66 | docker_container: 67 | name: "node-exporter" 68 | image: "prom/node-exporter:latest" 69 | networks: 70 | - name: "{{ project_name}}" 71 | restart_policy: unless-stopped 72 | pull: true 73 | state: started 74 | -------------------------------------------------------------------------------- /ansible/cosmos-mainnets/canto/canto.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | - name: Node run 3 | hosts: "{{ target }}" 4 | become: yes 5 | 6 | tasks: 7 | - name: Set main variables 8 | ansible.builtin.set_fact: 9 | moniker: beething 10 | wallet_addr: "canto1mfeumsu0xptuj60nr9y4gaayw3h8l5tkgcuwxp" 11 | valoper_addr: "cantovaloper1mfeumsu0xptuj60nr9y4gaayw3h8l5tk2xm2hy" 12 | keypasswd: "{{ canto_keypasswd }}" 13 | chain_id: canto_7700-1 14 | project_name: canto 15 | external_address: "{{ ansible_host }}" 16 | external_port: 20006 17 | cosmos_data_dir: /root/.cantod 18 | cosmos_node_binary: cantod 19 | genesis_url: https://raw.githubusercontent.com/Canto-Network/Canto/genesis/Networks/Mainnet/genesis.json 20 | 21 | - name: Set config.toml variables 22 | ansible.builtin.set_fact: 23 | max_num_inbound_peers: 240 24 | max_num_outbound_peers: 30 25 | mempool_size: 10000 26 | statesync_enable: true 27 | statesync_rpc_servers: "https://rpc.canto.nodestake.top:443,https://canto-rpc.polkachu.com:443" 28 | statesync_trust_height: 708000 29 | statesync_trust_hash: "14e9a89157ad7f69202a82b8a77b331f7428974bb02fb90acd725610c889e175" 30 | statesync_trust_period: 168h 31 | seeds: "0830aa240e139fba099d1c2e831be84ecb29b73f@43.205.108.200:26656,beb82dcef7adcc3f8bc4173fa57bd310f6a6a55a@138.197.134.149:26656,9361d2cfb283da656b14eaf27e64d96cb86706f0@167.71.170.71:26656" 32 | prometheus_enable: true 33 | 34 | - name: Set app.toml variables 35 | ansible.builtin.set_fact: 36 | minimum_gas_prices: "0.0001acanto" 37 | api_enable: false 38 | grpc_enable: true 39 | grpc_web_enable: true 40 | snapshot_interval: 1500 41 | snapshot_keep_recent: 2 42 | wasm: false 43 | json_rpc: true 44 | tls: true 45 | evm: true 46 | 47 | - name: Set flow control variables 48 | ansible.builtin.set_fact: 49 | binary_version: 2.0.0-1 50 | rebuild: False 51 | init: False 52 | config: False 53 | run_node: False 54 | 55 | - name: "Speed up making directories" 56 | shell: | 57 | mkdir -p {{ NODES_DIR }}/{{ project_name }} 58 | mkdir -p {{ NODES_DATA_DIR }}/{{ project_name}} 59 | 60 | - name: Create a network 61 | community.docker.docker_network: 62 | name: "{{ project_name }}" 63 | 64 | - name: Write dockerfile 65 | copy: 66 | dest: "{{ NODES_DIR }}/{{ project_name }}/Dockerfile" 67 | content: | 68 | FROM golang:1.18-bullseye 69 | RUN mkdir -p /opt/src 70 | WORKDIR /opt/src 71 | RUN git clone https://github.com/Canto-Network/Canto.git 72 | RUN cd Canto && make install 73 | when: rebuild 74 | 75 | - name: Build image 76 | command: docker build -f Dockerfile -t {{ project_name}}:{{binary_version}} . 77 | args: 78 | chdir: "{{ NODES_DIR }}/{{ project_name}}" 79 | when: rebuild 80 | 81 | - name: Run CLI container 82 | docker_container: 83 | name: "{{ project_name}}-cli" 84 | image: "{{ project_name}}:{{binary_version}}" 85 | command: ["tail", "-f", "/dev/null"] 86 | env: 87 | daemon_name: "{{ cosmos_node_binary}}" 88 | wallet_addr: "{{ wallet_addr}}" 89 | valoper_addr: "{{ valoper_addr}}" 90 | keypasswd: "{{ keypasswd }}" 91 | networks: 92 | - name: "{{ project_name}}" 93 | restart_policy: unless-stopped 94 | pull: false 95 | state: started 96 | volumes: 97 | - "{{ NODES_DATA_DIR }}/{{ project_name}}:{{ cosmos_data_dir }}:rw" 98 | 99 | - name: Init chain 100 | community.docker.docker_container_exec: 101 | container: "{{ project_name}}-cli" 102 | command: | 103 | {{cosmos_node_binary}} init {{ moniker }} 104 | --chain-id {{ chain_id }} 105 | -o 106 | register: result 107 | when: init 108 | 109 | - name: Download genesis 110 | ansible.builtin.get_url: 111 | url: "{{ genesis_url }}" 112 | dest: "{{ NODES_DATA_DIR }}/{{ project_name}}/config/genesis.json" 113 | when: init 114 | 115 | - name: Install config.toml 116 | ansible.builtin.template: 117 | src: ../templates/config.toml.tpl 118 | dest: "{{ NODES_DATA_DIR }}/{{ project_name}}/config/config.toml" 119 | when: config 120 | 121 | - name: Install client.toml 122 | ansible.builtin.template: 123 | src: ../templates/client.toml.tpl 124 | dest: "{{ NODES_DATA_DIR }}/{{ project_name}}/config/client.toml" 125 | when: config 126 | 127 | - name: Install app.toml 128 | ansible.builtin.template: 129 | src: ../templates/app.toml.tpl 130 | dest: "{{ NODES_DATA_DIR }}/{{ project_name}}/config/app.toml" 131 | when: config 132 | 133 | - name: Run node 134 | docker_container: 135 | name: "{{ project_name}}-node" 136 | image: "{{ project_name}}:{{binary_version}}" 137 | command: | 138 | {{ cosmos_node_binary }} 139 | start 140 | --trace 141 | --json-rpc.api eth,txpool,personal,net,debug,web3 142 | networks: 143 | - name: "{{ project_name}}" 144 | published_ports: 145 | - "0.0.0.0:{{ external_port }}:26656" 146 | restart_policy: unless-stopped 147 | pull: false 148 | state: started 149 | volumes: 150 | - "{{ NODES_DATA_DIR }}/{{ project_name}}:{{ cosmos_data_dir }}:rw" 151 | when: run_node 152 | -------------------------------------------------------------------------------- /ansible/cosmos-mainnets/konstellation/konstellation.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | - name: Node run 3 | hosts: "{{ target }}" 4 | become: yes 5 | 6 | tasks: 7 | - name: Set main variables 8 | ansible.builtin.set_fact: 9 | moniker: beething 10 | wallet_addr: "darc1uxdpq5gs2gujtwp33crndwsujdmzuh32z9sacu" 11 | valoper_addr: "darcvaloper1uxdpq5gs2gujtwp33crndwsujdmzuh32npq655" 12 | keypasswd: "{{ konstellation_keypasswd }}" 13 | chain_id: darchub 14 | project_name: konstellation 15 | external_address: "{{ ansible_host }}" 16 | external_port: 20007 17 | cosmos_data_dir: /root/.knstld 18 | cosmos_node_binary: knstld 19 | genesis_url: https://raw.githubusercontent.com/knstl/konstellation/master/config/genesis.json 20 | 21 | - name: Set config.toml variables 22 | ansible.builtin.set_fact: 23 | max_num_inbound_peers: 40 24 | max_num_outbound_peers: 10 25 | mempool_size: 5000 26 | statesync_enable: true 27 | statesync_rpc_servers: "https://node1.konstellation.tech:26657,https://konstellation-rpc.polkachu.com:443" 28 | statesync_trust_height: 5258000 29 | statesync_trust_hash: "1ccc4c350c1807c4fae40a914df776bc8357c7f95eac948689fbc1ef3bff76be" 30 | statesync_trust_period: 168h 31 | seeds: "00f7f4506d84f9d1458201946e1194564b444ce0@node14.konstellation.tech:26656,06fed4bbe81ead6073a7254e860331179af74f4c@node3.konstellation.tech:26656,0f4eef8db37ec7ef9f6d3324689db2847ee8f795@node10.konstellation.tech:26656,1c9aff1ea9d1cafd584aa61a70582e7c4b0c8675@node5.konstellation.tech:26656,7e8119050ecb80450ad476b50423b9230c10c8d0@node11.konstellation.tech:26656,a32dda75cf5ffe4ab0ff9a0969e525807e01f2e5@node2.konstellation.tech:26656,d4a713a657883cca49d71b1b2cab4ab5e94b0843@node4.konstellation.tech:26656,dbb7589202f6c751f2b93c6bbcd0e660676ab91c@node12.konstellation.tech:26656,f2c2ebec24507d54fea88976e9f93f0fbfa0d6d0@node13.konstellation.tech:26656" 32 | prometheus_enable: true 33 | 34 | - name: Set app.toml variables 35 | ansible.builtin.set_fact: 36 | minimum_gas_prices: "0stake" 37 | api_enable: false 38 | grpc_enable: true 39 | grpc_web_enable: true 40 | snapshot_interval: 1500 41 | snapshot_keep_recent: 2 42 | wasm: true 43 | json_rpc: false 44 | tls: false 45 | evm: false 46 | 47 | - name: Set flow control variables 48 | ansible.builtin.set_fact: 49 | binary_version: v0.5.0 50 | rebuild: False 51 | init: False 52 | config: False 53 | run_node: False 54 | 55 | - name: "Speed up making directories" 56 | shell: | 57 | mkdir -p {{ NODES_DIR }}/{{ project_name }} 58 | mkdir -p {{ NODES_DATA_DIR }}/{{ project_name}} 59 | 60 | - name: Create a network 61 | community.docker.docker_network: 62 | name: "{{ project_name }}" 63 | 64 | - name: Write dockerfile 65 | copy: 66 | dest: "{{ NODES_DIR }}/{{ project_name }}/Dockerfile" 67 | content: | 68 | FROM golang:1.18-bullseye 69 | RUN mkdir -p /opt/src 70 | WORKDIR /opt/src 71 | RUN git clone -b {{binary_version}} https://github.com/konstellation/konstellation 72 | RUN cd konstellation && make build && mv build/knstld /usr/local/bin/ 73 | when: rebuild 74 | 75 | - name: Build image 76 | command: docker build -f Dockerfile -t {{ project_name}}:{{binary_version}} . 77 | args: 78 | chdir: "{{ NODES_DIR }}/{{ project_name}}" 79 | when: rebuild 80 | 81 | - name: Run CLI container 82 | docker_container: 83 | name: "{{ project_name}}-cli" 84 | image: "{{ project_name}}:{{binary_version}}" 85 | command: ["tail", "-f", "/dev/null"] 86 | env: 87 | daemon_name: "{{ cosmos_node_binary}}" 88 | wallet_addr: "{{ wallet_addr}}" 89 | valoper_addr: "{{ valoper_addr}}" 90 | keypasswd: "{{ keypasswd }}" 91 | networks: 92 | - name: "{{ project_name}}" 93 | restart_policy: unless-stopped 94 | pull: false 95 | state: started 96 | volumes: 97 | - "{{ NODES_DATA_DIR }}/{{ project_name}}:{{ cosmos_data_dir }}:rw" 98 | 99 | - name: Init chain 100 | community.docker.docker_container_exec: 101 | container: "{{ project_name}}-cli" 102 | command: | 103 | {{cosmos_node_binary}} init {{ moniker }} 104 | --chain-id {{ chain_id }} 105 | -o 106 | register: result 107 | when: init 108 | 109 | - name: Download genesis 110 | ansible.builtin.get_url: 111 | url: "{{ genesis_url }}" 112 | dest: "{{ NODES_DATA_DIR }}/{{ project_name}}/config/genesis.json" 113 | when: init 114 | 115 | - name: Install config.toml 116 | ansible.builtin.template: 117 | src: ../templates/config.toml.tpl 118 | dest: "{{ NODES_DATA_DIR }}/{{ project_name}}/config/config.toml" 119 | when: config 120 | 121 | - name: Install client.toml 122 | ansible.builtin.template: 123 | src: ../templates/client.toml.tpl 124 | dest: "{{ NODES_DATA_DIR }}/{{ project_name}}/config/client.toml" 125 | when: config 126 | 127 | - name: Install app.toml 128 | ansible.builtin.template: 129 | src: ../templates/app.toml.tpl 130 | dest: "{{ NODES_DATA_DIR }}/{{ project_name}}/config/app.toml" 131 | when: config 132 | 133 | - name: Run node 134 | docker_container: 135 | name: "{{ project_name}}-node" 136 | image: "{{ project_name}}:{{binary_version}}" 137 | command: | 138 | {{ cosmos_node_binary }} 139 | start 140 | networks: 141 | - name: "{{ project_name}}" 142 | published_ports: 143 | - "0.0.0.0:{{ external_port }}:26656" 144 | restart_policy: unless-stopped 145 | pull: false 146 | state: started 147 | volumes: 148 | - "{{ NODES_DATA_DIR }}/{{ project_name}}:{{ cosmos_data_dir }}:rw" 149 | when: run_node 150 | -------------------------------------------------------------------------------- /ansible/cosmos-mainnets/templates/app.toml.tpl: -------------------------------------------------------------------------------- 1 | # This is a TOML config file. 2 | # For more information, see https://github.com/toml-lang/toml 3 | 4 | ############################################################################### 5 | ### Base Configuration ### 6 | ############################################################################### 7 | 8 | # The minimum gas prices a validator is willing to accept for processing a 9 | # transaction. A transaction's fees must meet the minimum of any denomination 10 | # specified in this config (e.g. 0.25token1;0.0001token2). 11 | minimum-gas-prices = "{{ minimum_gas_prices }}" 12 | 13 | # default: the last 100 states are kept in addition to every 500th state; pruning at 10 block intervals 14 | # nothing: all historic states will be saved, nothing will be deleted (i.e. archiving node) 15 | # everything: all saved states will be deleted, storing only the current and previous state; pruning at 10 block intervals 16 | # custom: allow pruning options to be manually specified through 'pruning-keep-recent', 'pruning-keep-every', and 'pruning-interval' 17 | {% if pruning is defined and pruning|length %} 18 | pruning = "{{ pruning }}" 19 | {% else %} 20 | pruning = "default" 21 | {% endif %} 22 | 23 | # These are applied if and only if the pruning strategy is custom. 24 | {% if pruning_keep_recent is defined%} 25 | pruning-keep-recent = "{{ pruning_keep_recent }}" 26 | {% else %} 27 | pruning-keep-recent = "0" 28 | {% endif %} 29 | {% if pruning_keep_every is defined%} 30 | pruning-keep-every = "{{ pruning_keep_every }}" 31 | {% else %} 32 | pruning-keep-every = "0" 33 | {% endif %} 34 | {% if pruning_interval is defined%} 35 | pruning-interval = "{{ pruning_interval }}" 36 | {% else %} 37 | pruning-interval = "0" 38 | {% endif %} 39 | 40 | # HaltHeight contains a non-zero block height at which a node will gracefully 41 | # halt and shutdown that can be used to assist upgrades and testing. 42 | # 43 | # Note: Commitment of state will be attempted on the corresponding block. 44 | halt-height = 0 45 | 46 | # HaltTime contains a non-zero minimum block time (in Unix seconds) at which 47 | # a node will gracefully halt and shutdown that can be used to assist upgrades 48 | # and testing. 49 | # 50 | # Note: Commitment of state will be attempted on the corresponding block. 51 | halt-time = 0 52 | 53 | # MinRetainBlocks defines the minimum block height offset from the current 54 | # block being committed, such that all blocks past this offset are pruned 55 | # from Tendermint. It is used as part of the process of determining the 56 | # ResponseCommit.RetainHeight value during ABCI Commit. A value of 0 indicates 57 | # that no blocks should be pruned. 58 | # 59 | # This configuration value is only responsible for pruning Tendermint blocks. 60 | # It has no bearing on application state pruning which is determined by the 61 | # "pruning-*" configurations. 62 | # 63 | # Note: Tendermint block pruning is dependant on this parameter in conunction 64 | # with the unbonding (safety threshold) period, state pruning and state sync 65 | # snapshot parameters to determine the correct minimum value of 66 | # ResponseCommit.RetainHeight. 67 | min-retain-blocks = 0 68 | 69 | # InterBlockCache enables inter-block caching. 70 | inter-block-cache = true 71 | 72 | # IndexEvents defines the set of events in the form {eventType}.{attributeKey}, 73 | # which informs Tendermint what to index. If empty, all events will be indexed. 74 | # 75 | # Example: 76 | # ["message.sender", "message.recipient"] 77 | index-events = [] 78 | 79 | # IavlCacheSize set the size of the iavl tree cache. 80 | # Default cache size is 50mb. 81 | iavl-cache-size = 781250 82 | 83 | ############################################################################### 84 | ### Telemetry Configuration ### 85 | ############################################################################### 86 | 87 | [telemetry] 88 | 89 | # Prefixed with keys to separate services. 90 | service-name = "" 91 | 92 | # Enabled enables the application telemetry functionality. When enabled, 93 | # an in-memory sink is also enabled by default. Operators may also enabled 94 | # other sinks such as Prometheus. 95 | enabled = false 96 | 97 | # Enable prefixing gauge values with hostname. 98 | enable-hostname = false 99 | 100 | # Enable adding hostname to labels. 101 | enable-hostname-label = false 102 | 103 | # Enable adding service to labels. 104 | enable-service-label = false 105 | 106 | # PrometheusRetentionTime, when positive, enables a Prometheus metrics sink. 107 | prometheus-retention-time = 0 108 | 109 | # GlobalLabels defines a global set of name/value label tuples applied to all 110 | # metrics emitted using the wrapper functions defined in telemetry package. 111 | # 112 | # Example: 113 | # [["chain_id", "cosmoshub-1"]] 114 | global-labels = [ 115 | ] 116 | 117 | ############################################################################### 118 | ### API Configuration ### 119 | ############################################################################### 120 | 121 | [api] 122 | 123 | # Enable defines if the API server should be enabled. 124 | enable = {{ api_enable | string | lower }} 125 | 126 | # Swagger defines if swagger documentation should automatically be registered. 127 | swagger = false 128 | 129 | # Address defines the API server to listen on. 130 | address = "tcp://0.0.0.0:1317" 131 | 132 | # MaxOpenConnections defines the number of maximum open connections. 133 | max-open-connections = 1000 134 | 135 | # RPCReadTimeout defines the Tendermint RPC read timeout (in seconds). 136 | rpc-read-timeout = 10 137 | 138 | # RPCWriteTimeout defines the Tendermint RPC write timeout (in seconds). 139 | rpc-write-timeout = 0 140 | 141 | # RPCMaxBodyBytes defines the Tendermint maximum response body (in bytes). 142 | rpc-max-body-bytes = 1000000 143 | 144 | # EnableUnsafeCORS defines if CORS should be enabled (unsafe - use it at your own risk). 145 | enabled-unsafe-cors = false 146 | 147 | ############################################################################### 148 | ### Rosetta Configuration ### 149 | ############################################################################### 150 | 151 | [rosetta] 152 | 153 | # Enable defines if the Rosetta API server should be enabled. 154 | enable = false 155 | 156 | # Address defines the Rosetta API server to listen on. 157 | address = ":8080" 158 | 159 | # Network defines the name of the blockchain that will be returned by Rosetta. 160 | blockchain = "app" 161 | 162 | # Network defines the name of the network that will be returned by Rosetta. 163 | network = "network" 164 | 165 | # Retries defines the number of retries when connecting to the node before failing. 166 | retries = 3 167 | 168 | # Offline defines if Rosetta server should run in offline mode. 169 | offline = false 170 | 171 | ############################################################################### 172 | ### gRPC Configuration ### 173 | ############################################################################### 174 | 175 | [grpc] 176 | 177 | # Enable defines if the gRPC server should be enabled. 178 | enable = {{ grpc_enable | string | lower }} 179 | 180 | # Address defines the gRPC server address to bind to. 181 | address = "0.0.0.0:9090" 182 | 183 | ############################################################################### 184 | ### gRPC Web Configuration ### 185 | ############################################################################### 186 | 187 | [grpc-web] 188 | 189 | # GRPCWebEnable defines if the gRPC-web should be enabled. 190 | # NOTE: gRPC must also be enabled, otherwise, this configuration is a no-op. 191 | enable = {{ grpc_web_enable | string | lower }} 192 | 193 | # Address defines the gRPC-web server address to bind to. 194 | address = "0.0.0.0:9091" 195 | 196 | # EnableUnsafeCORS defines if CORS should be enabled (unsafe - use it at your own risk). 197 | enable-unsafe-cors = false 198 | 199 | ############################################################################### 200 | ### State Sync Configuration ### 201 | ############################################################################### 202 | 203 | # State sync snapshots allow other nodes to rapidly join the network without replaying historical 204 | # blocks, instead downloading and applying a snapshot of the application state at a given height. 205 | [state-sync] 206 | 207 | # snapshot-interval specifies the block interval at which local state sync snapshots are 208 | # taken (0 to disable). Must be a multiple of pruning-keep-every. 209 | {% if snapshot_interval is defined %} 210 | snapshot-interval = {{ snapshot_interval }} 211 | {% else %} 212 | snapshot-interval = 0 213 | {% endif %} 214 | 215 | # snapshot-keep-recent specifies the number of recent snapshots to keep and serve (0 to keep all). 216 | {% if snapshot_keep_recent is defined %} 217 | snapshot-keep-recent = {{ snapshot_keep_recent }} 218 | {% else %} 219 | snapshot-keep-recent = 10 220 | {% endif %} 221 | 222 | {% if evm %} 223 | ############################################################################### 224 | ### EVM Configuration ### 225 | ############################################################################### 226 | 227 | [evm] 228 | 229 | # Tracer defines the 'vm.Tracer' type that the EVM will use when the node is run in 230 | # debug mode. To enable tracing use the '--evm.tracer' flag when starting your node. 231 | # Valid types are: json|struct|access_list|markdown 232 | tracer = "" 233 | 234 | # MaxTxGasWanted defines the gas wanted for each eth tx returned in ante handler in check tx mode. 235 | max-tx-gas-wanted = 500000 236 | {% endif %} 237 | 238 | {% if wasm %} 239 | ############################################################################### 240 | ### WASM Configuration ### 241 | ############################################################################### 242 | 243 | [wasm] 244 | # This is the maximum sdk gas (wasm and storage) that we allow for any x/wasm "smart" queries 245 | query_gas_limit = 300000 246 | # This is the number of wasm vm instances we keep cached in memory for speed-up 247 | # Warning: this is currently unstable and may lead to crashes, best to keep for 0 unless testing locally 248 | lru_size = 0 249 | {% endif -%} 250 | 251 | {% if json_rpc %} 252 | ############################################################################### 253 | ### JSON RPC Configuration ### 254 | ############################################################################### 255 | 256 | [json-rpc] 257 | 258 | # Enable defines if the gRPC server should be enabled. 259 | enable = true 260 | 261 | # Address defines the EVM RPC HTTP server address to bind to. 262 | address = "0.0.0.0:8545" 263 | 264 | # Address defines the EVM WebSocket server address to bind to. 265 | ws-address = "0.0.0.0:8546" 266 | 267 | # API defines a list of JSON-RPC namespaces that should be enabled 268 | # Example: "eth,txpool,personal,net,debug,web3" 269 | api = "eth,net,web3" 270 | 271 | # GasCap sets a cap on gas that can be used in eth_call/estimateGas (0=infinite). Default: 25,000,000. 272 | gas-cap = 25000000 273 | 274 | # EVMTimeout is the global timeout for eth_call. Default: 5s. 275 | evm-timeout = "5s" 276 | 277 | # TxFeeCap is the global tx-fee cap for send transaction. Default: 1eth. 278 | txfee-cap = 1 279 | 280 | # FilterCap sets the global cap for total number of filters that can be created 281 | filter-cap = 200 282 | 283 | # FeeHistoryCap sets the global cap for total number of blocks that can be fetched 284 | feehistory-cap = 100 285 | 286 | # LogsCap defines the max number of results can be returned from single 'eth_getLogs' query. 287 | logs-cap = 10000 288 | 289 | # BlockRangeCap defines the max block range allowed for 'eth_getLogs' query. 290 | block-range-cap = 10000 291 | 292 | # HTTPTimeout is the read/write timeout of http json-rpc server. 293 | http-timeout = "30s" 294 | 295 | # HTTPIdleTimeout is the idle timeout of http json-rpc server. 296 | http-idle-timeout = "2m0s" 297 | 298 | # AllowUnprotectedTxs restricts unprotected (non EIP155 signed) transactions to be submitted via 299 | # the node's RPC when the global parameter is disabled. 300 | allow-unprotected-txs = false 301 | {% endif %} 302 | 303 | {% if tls %} 304 | ############################################################################### 305 | ### TLS Configuration ### 306 | ############################################################################### 307 | 308 | [tls] 309 | 310 | # Certificate path defines the cert.pem file path for the TLS configuration. 311 | certificate-path = "" 312 | 313 | # Key path defines the key.pem file path for the TLS configuration. 314 | key-path = "" 315 | {% endif %} 316 | -------------------------------------------------------------------------------- /ansible/cosmos-mainnets/templates/config.toml.tpl: -------------------------------------------------------------------------------- 1 | # This is a TOML config file. 2 | # For more information, see https://github.com/toml-lang/toml 3 | 4 | # NOTE: Any path below can be absolute (e.g. "/var/myawesomeapp/data") or 5 | # relative to the home directory (e.g. "data"). The home directory is 6 | # "$HOME/.tendermint" by default, but could be changed via $TMHOME env variable 7 | # or --home cmd flag. 8 | 9 | ####################################################################### 10 | ### Main Base Config Options ### 11 | ####################################################################### 12 | 13 | # TCP or UNIX socket address of the ABCI application, 14 | # or the name of an ABCI application compiled in with the Tendermint binary 15 | proxy_app = "tcp://127.0.0.1:26658" 16 | 17 | # A custom human readable name for this node 18 | moniker = "{{ moniker }}" 19 | 20 | # If this node is many blocks behind the tip of the chain, FastSync 21 | # allows them to catchup quickly by downloading blocks in parallel 22 | # and verifying their commits 23 | fast_sync = true 24 | 25 | # Database backend: goleveldb | cleveldb | boltdb | rocksdb | badgerdb 26 | # * goleveldb (github.com/syndtr/goleveldb - most popular implementation) 27 | # - pure go 28 | # - stable 29 | # * cleveldb (uses levigo wrapper) 30 | # - fast 31 | # - requires gcc 32 | # - use cleveldb build tag (go build -tags cleveldb) 33 | # * boltdb (uses etcd's fork of bolt - github.com/etcd-io/bbolt) 34 | # - EXPERIMENTAL 35 | # - may be faster is some use-cases (random reads - indexer) 36 | # - use boltdb build tag (go build -tags boltdb) 37 | # * rocksdb (uses github.com/tecbot/gorocksdb) 38 | # - EXPERIMENTAL 39 | # - requires gcc 40 | # - use rocksdb build tag (go build -tags rocksdb) 41 | # * badgerdb (uses github.com/dgraph-io/badger) 42 | # - EXPERIMENTAL 43 | # - use badgerdb build tag (go build -tags badgerdb) 44 | {% if db_backend is defined and db_backend|length %} 45 | db_backend = "{{ db_backend }}" 46 | {% else %} 47 | db_backend = "goleveldb" 48 | {% endif %} 49 | 50 | # Database directory 51 | db_dir = "data" 52 | 53 | # Output level for logging, including package level options 54 | {% if log_level is defined and log_level|length %} 55 | log_level = "{{ log_level }}" 56 | {% else %} 57 | log_level = "info" 58 | {% endif %} 59 | 60 | # Output format: 'plain' (colored text) or 'json' 61 | log_format = "plain" 62 | 63 | ##### additional base config options ##### 64 | 65 | # Path to the JSON file containing the initial validator set and other meta data 66 | genesis_file = "config/genesis.json" 67 | 68 | # Path to the JSON file containing the private key to use as a validator in the consensus protocol 69 | priv_validator_key_file = "config/priv_validator_key.json" 70 | 71 | # Path to the JSON file containing the last sign state of a validator 72 | priv_validator_state_file = "data/priv_validator_state.json" 73 | 74 | # TCP or UNIX socket address for Tendermint to listen on for 75 | # connections from an external PrivValidator process 76 | priv_validator_laddr = "" 77 | 78 | # Path to the JSON file containing the private key to use for node authentication in the p2p protocol 79 | node_key_file = "config/node_key.json" 80 | 81 | # Mechanism to connect to the ABCI application: socket | grpc 82 | abci = "socket" 83 | 84 | # If true, query the ABCI app on connecting to a new peer 85 | # so the app can decide if we should keep the connection or not 86 | filter_peers = false 87 | 88 | 89 | ####################################################################### 90 | ### Advanced Configuration Options ### 91 | ####################################################################### 92 | 93 | ####################################################### 94 | ### RPC Server Configuration Options ### 95 | ####################################################### 96 | [rpc] 97 | 98 | # TCP or UNIX socket address for the RPC server to listen on 99 | laddr = "tcp://0.0.0.0:26657" 100 | 101 | # A list of origins a cross-domain request can be executed from 102 | # Default value '[]' disables cors support 103 | # Use '["*"]' to allow any origin 104 | {% if cors_allowed_origins is defined %} 105 | {{ cors_allowed_origins }} 106 | {% else %} 107 | cors_allowed_origins = [] 108 | {% endif %} 109 | 110 | # A list of methods the client is allowed to use with cross-domain requests 111 | cors_allowed_methods = ["HEAD", "GET", "POST", ] 112 | 113 | # A list of non simple headers the client is allowed to use with cross-domain requests 114 | cors_allowed_headers = ["Origin", "Accept", "Content-Type", "X-Requested-With", "X-Server-Time", ] 115 | 116 | # TCP or UNIX socket address for the gRPC server to listen on 117 | # NOTE: This server only supports /broadcast_tx_commit 118 | grpc_laddr = "" 119 | 120 | # Maximum number of simultaneous connections. 121 | # Does not include RPC (HTTP&WebSocket) connections. See max_open_connections 122 | # If you want to accept a larger number than the default, make sure 123 | # you increase your OS limits. 124 | # 0 - unlimited. 125 | # Should be < {ulimit -Sn} - {MaxNumInboundPeers} - {MaxNumOutboundPeers} - {N of wal, db and other open files} 126 | # 1024 - 40 - 10 - 50 = 924 = ~900 127 | grpc_max_open_connections = 900 128 | 129 | # Activate unsafe RPC commands like /dial_seeds and /unsafe_flush_mempool 130 | unsafe = false 131 | 132 | # Maximum number of simultaneous connections (including WebSocket). 133 | # Does not include gRPC connections. See grpc_max_open_connections 134 | # If you want to accept a larger number than the default, make sure 135 | # you increase your OS limits. 136 | # 0 - unlimited. 137 | # Should be < {ulimit -Sn} - {MaxNumInboundPeers} - {MaxNumOutboundPeers} - {N of wal, db and other open files} 138 | # 1024 - 40 - 10 - 50 = 924 = ~900 139 | max_open_connections = 900 140 | 141 | # Maximum number of unique clientIDs that can /subscribe 142 | # If you're using /broadcast_tx_commit, set to the estimated maximum number 143 | # of broadcast_tx_commit calls per block. 144 | max_subscription_clients = 100 145 | 146 | # Maximum number of unique queries a given client can /subscribe to 147 | # If you're using GRPC (or Local RPC client) and /broadcast_tx_commit, set to 148 | # the estimated # maximum number of broadcast_tx_commit calls per block. 149 | max_subscriptions_per_client = 5 150 | 151 | # Experimental parameter to specify the maximum number of events a node will 152 | # buffer, per subscription, before returning an error and closing the 153 | # subscription. Must be set to at least 100, but higher values will accommodate 154 | # higher event throughput rates (and will use more memory). 155 | experimental_subscription_buffer_size = 200 156 | 157 | # Experimental parameter to specify the maximum number of RPC responses that 158 | # can be buffered per WebSocket client. If clients cannot read from the 159 | # WebSocket endpoint fast enough, they will be disconnected, so increasing this 160 | # parameter may reduce the chances of them being disconnected (but will cause 161 | # the node to use more memory). 162 | # 163 | # Must be at least the same as "experimental_subscription_buffer_size", 164 | # otherwise connections could be dropped unnecessarily. This value should 165 | # ideally be somewhat higher than "experimental_subscription_buffer_size" to 166 | # accommodate non-subscription-related RPC responses. 167 | experimental_websocket_write_buffer_size = 200 168 | 169 | # If a WebSocket client cannot read fast enough, at present we may 170 | # silently drop events instead of generating an error or disconnecting the 171 | # client. 172 | # 173 | # Enabling this experimental parameter will cause the WebSocket connection to 174 | # be closed instead if it cannot read fast enough, allowing for greater 175 | # predictability in subscription behaviour. 176 | experimental_close_on_slow_client = false 177 | 178 | # How long to wait for a tx to be committed during /broadcast_tx_commit. 179 | # WARNING: Using a value larger than 10s will result in increasing the 180 | # global HTTP write timeout, which applies to all connections and endpoints. 181 | # See https://github.com/tendermint/tendermint/issues/3435 182 | timeout_broadcast_tx_commit = "10s" 183 | 184 | # Maximum size of request body, in bytes 185 | max_body_bytes = 1000000 186 | 187 | # Maximum size of request header, in bytes 188 | max_header_bytes = 1048576 189 | 190 | # The path to a file containing certificate that is used to create the HTTPS server. 191 | # Might be either absolute path or path related to Tendermint's config directory. 192 | # If the certificate is signed by a certificate authority, 193 | # the certFile should be the concatenation of the server's certificate, any intermediates, 194 | # and the CA's certificate. 195 | # NOTE: both tls_cert_file and tls_key_file must be present for Tendermint to create HTTPS server. 196 | # Otherwise, HTTP server is run. 197 | tls_cert_file = "" 198 | 199 | # The path to a file containing matching private key that is used to create the HTTPS server. 200 | # Might be either absolute path or path related to Tendermint's config directory. 201 | # NOTE: both tls-cert-file and tls-key-file must be present for Tendermint to create HTTPS server. 202 | # Otherwise, HTTP server is run. 203 | tls_key_file = "" 204 | 205 | # pprof listen address (https://golang.org/pkg/net/http/pprof) 206 | pprof_laddr = "localhost:6060" 207 | 208 | ####################################################### 209 | ### P2P Configuration Options ### 210 | ####################################################### 211 | [p2p] 212 | 213 | # Address to listen for incoming connections 214 | laddr = "tcp://0.0.0.0:26656" 215 | 216 | # Address to advertise to peers for them to dial 217 | # If empty, will use the same port as the laddr, 218 | # and will introspect on the listener or use UPnP 219 | # to figure out the address. ip and port are required 220 | # example: 159.89.10.97:26656 221 | {% if external_address is defined and external_address|length %} 222 | external_address = "{{ external_address }}:{{ external_port }}" 223 | {% endif %} 224 | 225 | # Comma separated list of seed nodes to connect to 226 | {% if seeds is defined and seeds|length %} 227 | seeds = "{{ seeds }}" 228 | {% else %} 229 | seeds = "" 230 | {% endif %} 231 | 232 | # Comma separated list of nodes to keep persistent connections to 233 | persistent_peers = "" 234 | 235 | # UPNP port forwarding 236 | upnp = false 237 | 238 | # Path to address book 239 | addr_book_file = "config/addrbook.json" 240 | 241 | # Set true for strict address routability rules 242 | # Set false for private or local networks 243 | {% if addr_book_strict is defined %} 244 | addr_book_strict = {{ addr_book_strict | string | lower }} 245 | {% else %} 246 | addr_book_strict = true 247 | {% endif %} 248 | 249 | # Maximum number of inbound peers 250 | {% if max_num_inbound_peers is defined %} 251 | max_num_inbound_peers = {{ max_num_inbound_peers }} 252 | {% else %} 253 | max_num_inbound_peers = 100 254 | {% endif %} 255 | 256 | # Maximum number of outbound peers to connect to, excluding persistent peers 257 | {% if max_num_outbound_peers is defined %} 258 | max_num_outbound_peers = {{ max_num_outbound_peers }} 259 | {% else %} 260 | max_num_outbound_peers = 100 261 | {% endif %} 262 | 263 | # List of node IDs, to which a connection will be (re)established ignoring any existing limits 264 | unconditional_peer_ids = "" 265 | 266 | # Maximum pause when redialing a persistent peer (if zero, exponential backoff is used) 267 | persistent_peers_max_dial_period = "0s" 268 | 269 | # Time to wait before flushing messages out on the connection 270 | flush_throttle_timeout = "100ms" 271 | 272 | # Maximum size of a message packet payload, in bytes 273 | max_packet_msg_payload_size = 1024 274 | 275 | # Rate at which packets can be sent, in bytes/second 276 | send_rate = 5120000 277 | 278 | # Rate at which packets can be received, in bytes/second 279 | recv_rate = 5120000 280 | 281 | # Set true to enable the peer-exchange reactor 282 | pex = true 283 | 284 | # Seed mode, in which node constantly crawls the network and looks for 285 | # peers. If another node asks it for addresses, it responds and disconnects. 286 | # 287 | # Does not work if the peer-exchange reactor is disabled. 288 | seed_mode = false 289 | 290 | # Comma separated list of peer IDs to keep private (will not be gossiped to other peers) 291 | private_peer_ids = "" 292 | 293 | # Toggle to disable guard against peers connecting from the same ip. 294 | allow_duplicate_ip = false 295 | 296 | # Peer connection configuration. 297 | handshake_timeout = "20s" 298 | dial_timeout = "3s" 299 | 300 | ####################################################### 301 | ### Mempool Configuration Option ### 302 | ####################################################### 303 | [mempool] 304 | 305 | recheck = true 306 | broadcast = true 307 | wal_dir = "" 308 | 309 | # Maximum number of transactions in the mempool 310 | {% if mempool_size is defined %} 311 | size = {{ mempool_size }} 312 | {% else %} 313 | size = 10000 314 | {% endif %} 315 | 316 | # Limit the total size of all txs in the mempool. 317 | # This only accounts for raw transactions (e.g. given 1MB transactions and 318 | # max_txs_bytes=5MB, mempool will only accept 5 transactions). 319 | max_txs_bytes = 1073741824 320 | 321 | # Size of the cache (used to filter transactions we saw earlier) in transactions 322 | cache_size = 10000 323 | 324 | # Do not remove invalid transactions from the cache (default: false) 325 | # Set to true if it's not possible for any invalid transaction to become valid 326 | # again in the future. 327 | keep-invalid-txs-in-cache = false 328 | 329 | # Maximum size of a single transaction. 330 | # NOTE: the max size of a tx transmitted over the network is {max_tx_bytes}. 331 | max_tx_bytes = 1048576 332 | 333 | # Maximum size of a batch of transactions to send to a peer 334 | # Including space needed by encoding (one varint per transaction). 335 | # XXX: Unused due to https://github.com/tendermint/tendermint/issues/5796 336 | max_batch_bytes = 0 337 | 338 | ####################################################### 339 | ### State Sync Configuration Options ### 340 | ####################################################### 341 | [statesync] 342 | # State sync rapidly bootstraps a new node by discovering, fetching, and restoring a state machine 343 | # snapshot from peers instead of fetching and replaying historical blocks. Requires some peers in 344 | # the network to take and serve state machine snapshots. State sync is not attempted if the node 345 | # has any local state (LastBlockHeight > 0). The node will have a truncated block history, 346 | # starting from the height of the snapshot. 347 | enable = {{ statesync_enable | string | lower }} 348 | 349 | # RPC servers (comma-separated) for light client verification of the synced state machine and 350 | # retrieval of state data for node bootstrapping. Also needs a trusted height and corresponding 351 | # header hash obtained from a trusted source, and a period during which validators can be trusted. 352 | # 353 | # For Cosmos SDK-based chains, trust_period should usually be about 2/3 of the unbonding time (~2 354 | # weeks) during which they can be financially punished (slashed) for misbehavior. 355 | rpc_servers = "{{ statesync_rpc_servers }}" 356 | trust_height = {{ statesync_trust_height }} 357 | trust_hash = "{{ statesync_trust_hash }}" 358 | {% if statesync_trust_period is defined and statesync_trust_period|length %} 359 | trust_period = "{{ statesync_trust_period }}" 360 | {% else %} 361 | trust_period = "168h0m0s" 362 | {% endif %} 363 | 364 | # Time to spend discovering snapshots before initiating a restore. 365 | discovery_time = "15s" 366 | 367 | # Temporary directory for state sync snapshot chunks, defaults to the OS tempdir (typically /tmp). 368 | # Will create a new, randomly named directory within, and remove it when done. 369 | temp_dir = "" 370 | 371 | # The timeout duration before re-requesting a chunk, possibly from a different 372 | # peer (default: 1 minute). 373 | chunk_request_timeout = "10s" 374 | 375 | # The number of concurrent chunk fetchers to run (default: 1). 376 | chunk_fetchers = "4" 377 | 378 | ####################################################### 379 | ### Fast Sync Configuration Connections ### 380 | ####################################################### 381 | [fastsync] 382 | 383 | # Fast Sync version to use: 384 | # 1) "v0" (default) - the legacy fast sync implementation 385 | # 2) "v1" - refactor of v0 version for better testability 386 | # 2) "v2" - complete redesign of v0, optimized for testability & readability 387 | version = "v0" 388 | 389 | ####################################################### 390 | ### Consensus Configuration Options ### 391 | ####################################################### 392 | [consensus] 393 | 394 | wal_file = "data/cs.wal/wal" 395 | 396 | # How long we wait for a proposal block before prevoting nil 397 | timeout_propose = "3s" 398 | # How much timeout_propose increases with each round 399 | timeout_propose_delta = "500ms" 400 | # How long we wait after receiving +2/3 prevotes for “anything” (ie. not a single block or nil) 401 | timeout_prevote = "1s" 402 | # How much the timeout_prevote increases with each round 403 | timeout_prevote_delta = "500ms" 404 | # How long we wait after receiving +2/3 precommits for “anything” (ie. not a single block or nil) 405 | timeout_precommit = "1s" 406 | # How much the timeout_precommit increases with each round 407 | timeout_precommit_delta = "500ms" 408 | # How long we wait after committing a block, before starting on the new 409 | # height (this gives us a chance to receive some more precommits, even 410 | # though we already have +2/3). 411 | {% if timeout_commit is defined and timeout_commit|length %} 412 | timeout_commit = "{{ timeout_commit }}" 413 | {% else %} 414 | timeout_commit = "5s" 415 | {% endif %} 416 | 417 | # How many blocks to look back to check existence of the node's consensus votes before joining consensus 418 | # When non-zero, the node will panic upon restart 419 | # if the same consensus key was used to sign {double_sign_check_height} last blocks. 420 | # So, validators should stop the state machine, wait for some blocks, and then restart the state machine to avoid panic. 421 | double_sign_check_height = 0 422 | 423 | # Make progress as soon as we have all the precommits (as if TimeoutCommit = 0) 424 | skip_timeout_commit = false 425 | 426 | # EmptyBlocks mode and possible interval between empty blocks 427 | create_empty_blocks = true 428 | create_empty_blocks_interval = "0s" 429 | 430 | # Reactor sleep duration parameters 431 | peer_gossip_sleep_duration = "100ms" 432 | peer_query_maj23_sleep_duration = "2s" 433 | 434 | ####################################################### 435 | ### Transaction Indexer Configuration Options ### 436 | ####################################################### 437 | [tx_index] 438 | 439 | # What indexer to use for transactions 440 | # 441 | # The application will set which txs to index. In some cases a node operator will be able 442 | # to decide which txs to index based on configuration set in the application. 443 | # 444 | # Options: 445 | # 1) "null" 446 | # 2) "kv" (default) - the simplest possible indexer, backed by key-value storage (defaults to levelDB; see DBBackend). 447 | # - When "kv" is chosen "tx.height" and "tx.hash" will always be indexed. 448 | indexer = "kv" 449 | 450 | ####################################################### 451 | ### Instrumentation Configuration Options ### 452 | ####################################################### 453 | [instrumentation] 454 | 455 | # When true, Prometheus metrics are served under /metrics on 456 | # PrometheusListenAddr. 457 | # Check out the documentation for the list of available metrics. 458 | prometheus = {{ prometheus_enable | string | lower }} 459 | 460 | # Address to listen for Prometheus collector(s) connections 461 | prometheus_listen_addr = ":26660" 462 | 463 | # Maximum number of simultaneous connections. 464 | # If you want to accept a larger number than the default, make sure 465 | # you increase your OS limits. 466 | # 0 - unlimited. 467 | max_open_connections = 3 468 | 469 | # Instrumentation namespace 470 | namespace = "tendermint" 471 | -------------------------------------------------------------------------------- /ansible/monitoring/grafana/dashboards/chains_dashboard.json: -------------------------------------------------------------------------------- 1 | { 2 | "annotations": { 3 | "list": [ 4 | { 5 | "builtIn": 1, 6 | "datasource": { 7 | "type": "grafana", 8 | "uid": "-- Grafana --" 9 | }, 10 | "enable": true, 11 | "hide": true, 12 | "iconColor": "rgba(0, 211, 255, 1)", 13 | "name": "Annotations & Alerts", 14 | "target": { 15 | "limit": 100, 16 | "matchAny": false, 17 | "tags": [], 18 | "type": "dashboard" 19 | }, 20 | "type": "dashboard" 21 | } 22 | ] 23 | }, 24 | "editable": true, 25 | "fiscalYearStartMonth": 0, 26 | "graphTooltip": 1, 27 | "links": [], 28 | "liveNow": false, 29 | "panels": [ 30 | { 31 | "datasource": { 32 | "type": "prometheus", 33 | "uid": "PBFA97CFB590B2093" 34 | }, 35 | "fieldConfig": { 36 | "defaults": { 37 | "mappings": [], 38 | "thresholds": { 39 | "mode": "absolute", 40 | "steps": [ 41 | { 42 | "color": "green", 43 | "value": null 44 | } 45 | ] 46 | }, 47 | "unit": "none" 48 | }, 49 | "overrides": [] 50 | }, 51 | "gridPos": { 52 | "h": 5, 53 | "w": 3, 54 | "x": 0, 55 | "y": 0 56 | }, 57 | "id": 2, 58 | "options": { 59 | "colorMode": "background", 60 | "graphMode": "none", 61 | "justifyMode": "auto", 62 | "orientation": "auto", 63 | "reduceOptions": { 64 | "calcs": ["lastNotNull"], 65 | "fields": "", 66 | "values": false 67 | }, 68 | "textMode": "auto" 69 | }, 70 | "pluginVersion": "9.1.5", 71 | "targets": [ 72 | { 73 | "datasource": { 74 | "type": "prometheus", 75 | "uid": "PBFA97CFB590B2093" 76 | }, 77 | "editorMode": "code", 78 | "expr": "tendermint_consensus_height{job=\"$node\"}", 79 | "legendFormat": "__auto", 80 | "range": true, 81 | "refId": "A" 82 | } 83 | ], 84 | "title": "Height", 85 | "transparent": true, 86 | "type": "stat" 87 | }, 88 | { 89 | "datasource": { 90 | "type": "prometheus", 91 | "uid": "PBFA97CFB590B2093" 92 | }, 93 | "fieldConfig": { 94 | "defaults": { 95 | "mappings": [], 96 | "thresholds": { 97 | "mode": "absolute", 98 | "steps": [ 99 | { 100 | "color": "green", 101 | "value": null 102 | } 103 | ] 104 | }, 105 | "unit": "none" 106 | }, 107 | "overrides": [] 108 | }, 109 | "gridPos": { 110 | "h": 5, 111 | "w": 3, 112 | "x": 3, 113 | "y": 0 114 | }, 115 | "id": 17, 116 | "options": { 117 | "colorMode": "background", 118 | "graphMode": "none", 119 | "justifyMode": "auto", 120 | "orientation": "auto", 121 | "reduceOptions": { 122 | "calcs": ["lastNotNull"], 123 | "fields": "", 124 | "values": false 125 | }, 126 | "textMode": "auto" 127 | }, 128 | "pluginVersion": "9.1.5", 129 | "targets": [ 130 | { 131 | "datasource": { 132 | "type": "prometheus", 133 | "uid": "PBFA97CFB590B2093" 134 | }, 135 | "editorMode": "code", 136 | "expr": "tendermint_consensus_validator_last_signed_height{job=\"$node\"}", 137 | "legendFormat": "__auto", 138 | "range": true, 139 | "refId": "A" 140 | } 141 | ], 142 | "title": "Last Signed Height", 143 | "transparent": true, 144 | "type": "stat" 145 | }, 146 | { 147 | "datasource": { 148 | "type": "prometheus", 149 | "uid": "PBFA97CFB590B2093" 150 | }, 151 | "fieldConfig": { 152 | "defaults": { 153 | "color": { 154 | "mode": "palette-classic" 155 | }, 156 | "custom": { 157 | "axisCenteredZero": false, 158 | "axisColorMode": "text", 159 | "axisLabel": "", 160 | "axisPlacement": "auto", 161 | "barAlignment": 0, 162 | "drawStyle": "bars", 163 | "fillOpacity": 100, 164 | "gradientMode": "hue", 165 | "hideFrom": { 166 | "legend": false, 167 | "tooltip": false, 168 | "viz": false 169 | }, 170 | "lineInterpolation": "linear", 171 | "lineWidth": 1, 172 | "pointSize": 5, 173 | "scaleDistribution": { 174 | "type": "linear" 175 | }, 176 | "showPoints": "auto", 177 | "spanNulls": false, 178 | "stacking": { 179 | "group": "A", 180 | "mode": "none" 181 | }, 182 | "thresholdsStyle": { 183 | "mode": "off" 184 | } 185 | }, 186 | "mappings": [], 187 | "min": 0, 188 | "thresholds": { 189 | "mode": "absolute", 190 | "steps": [ 191 | { 192 | "color": "green", 193 | "value": null 194 | } 195 | ] 196 | } 197 | }, 198 | "overrides": [] 199 | }, 200 | "gridPos": { 201 | "h": 6, 202 | "w": 18, 203 | "x": 6, 204 | "y": 0 205 | }, 206 | "id": 14, 207 | "options": { 208 | "legend": { 209 | "calcs": [], 210 | "displayMode": "list", 211 | "placement": "bottom", 212 | "showLegend": false 213 | }, 214 | "tooltip": { 215 | "mode": "single", 216 | "sort": "none" 217 | } 218 | }, 219 | "pluginVersion": "9.1.5", 220 | "targets": [ 221 | { 222 | "datasource": { 223 | "type": "prometheus", 224 | "uid": "PBFA97CFB590B2093" 225 | }, 226 | "editorMode": "code", 227 | "expr": "delta(tendermint_consensus_height{job=\"$node\"}[1m])", 228 | "legendFormat": "__auto", 229 | "range": true, 230 | "refId": "A" 231 | } 232 | ], 233 | "title": "Blocks rate per minute", 234 | "transparent": true, 235 | "type": "timeseries" 236 | }, 237 | { 238 | "datasource": { 239 | "type": "prometheus", 240 | "uid": "PBFA97CFB590B2093" 241 | }, 242 | "fieldConfig": { 243 | "defaults": { 244 | "mappings": [], 245 | "thresholds": { 246 | "mode": "absolute", 247 | "steps": [ 248 | { 249 | "color": "green", 250 | "value": null 251 | } 252 | ] 253 | }, 254 | "unit": "none" 255 | }, 256 | "overrides": [] 257 | }, 258 | "gridPos": { 259 | "h": 5, 260 | "w": 6, 261 | "x": 0, 262 | "y": 5 263 | }, 264 | "id": 9, 265 | "options": { 266 | "colorMode": "background", 267 | "graphMode": "none", 268 | "justifyMode": "auto", 269 | "orientation": "auto", 270 | "reduceOptions": { 271 | "calcs": ["lastNotNull"], 272 | "fields": "", 273 | "values": false 274 | }, 275 | "textMode": "auto" 276 | }, 277 | "pluginVersion": "9.1.5", 278 | "targets": [ 279 | { 280 | "datasource": { 281 | "type": "prometheus", 282 | "uid": "PBFA97CFB590B2093" 283 | }, 284 | "editorMode": "code", 285 | "expr": "tendermint_consensus_total_txs{job=\"$node\"}", 286 | "legendFormat": "__auto", 287 | "range": true, 288 | "refId": "A" 289 | } 290 | ], 291 | "title": "Total Txs", 292 | "transparent": true, 293 | "type": "stat" 294 | }, 295 | { 296 | "datasource": { 297 | "type": "prometheus", 298 | "uid": "PBFA97CFB590B2093" 299 | }, 300 | "fieldConfig": { 301 | "defaults": { 302 | "color": { 303 | "mode": "palette-classic" 304 | }, 305 | "custom": { 306 | "axisCenteredZero": false, 307 | "axisColorMode": "text", 308 | "axisGridShow": true, 309 | "axisLabel": "", 310 | "axisPlacement": "auto", 311 | "fillOpacity": 80, 312 | "gradientMode": "none", 313 | "hideFrom": { 314 | "legend": false, 315 | "tooltip": false, 316 | "viz": false 317 | }, 318 | "lineWidth": 1, 319 | "scaleDistribution": { 320 | "type": "linear" 321 | } 322 | }, 323 | "mappings": [], 324 | "max": 100, 325 | "min": 0, 326 | "thresholds": { 327 | "mode": "absolute", 328 | "steps": [ 329 | { 330 | "color": "green", 331 | "value": null 332 | } 333 | ] 334 | } 335 | }, 336 | "overrides": [] 337 | }, 338 | "gridPos": { 339 | "h": 4, 340 | "w": 18, 341 | "x": 6, 342 | "y": 6 343 | }, 344 | "id": 16, 345 | "options": { 346 | "barRadius": 0, 347 | "barWidth": 0.97, 348 | "groupWidth": 0.7, 349 | "legend": { 350 | "calcs": [], 351 | "displayMode": "list", 352 | "placement": "bottom", 353 | "showLegend": false 354 | }, 355 | "orientation": "vertical", 356 | "showValue": "never", 357 | "stacking": "none", 358 | "tooltip": { 359 | "mode": "single", 360 | "sort": "none" 361 | }, 362 | "xTickLabelRotation": 0, 363 | "xTickLabelSpacing": 200 364 | }, 365 | "pluginVersion": "9.1.5", 366 | "targets": [ 367 | { 368 | "datasource": { 369 | "type": "prometheus", 370 | "uid": "PBFA97CFB590B2093" 371 | }, 372 | "editorMode": "builder", 373 | "expr": "changes(tendermint_consensus_validator_missed_blocks{job=\"$node\"}[$__interval])", 374 | "legendFormat": "num", 375 | "range": true, 376 | "refId": "A" 377 | } 378 | ], 379 | "title": "Missed blocks", 380 | "type": "barchart" 381 | }, 382 | { 383 | "datasource": { 384 | "type": "prometheus", 385 | "uid": "PBFA97CFB590B2093" 386 | }, 387 | "fieldConfig": { 388 | "defaults": { 389 | "color": { 390 | "mode": "palette-classic" 391 | }, 392 | "custom": { 393 | "axisCenteredZero": false, 394 | "axisColorMode": "text", 395 | "axisLabel": "", 396 | "axisPlacement": "auto", 397 | "barAlignment": 0, 398 | "drawStyle": "line", 399 | "fillOpacity": 0, 400 | "gradientMode": "none", 401 | "hideFrom": { 402 | "legend": false, 403 | "tooltip": false, 404 | "viz": false 405 | }, 406 | "lineInterpolation": "linear", 407 | "lineWidth": 1, 408 | "pointSize": 5, 409 | "scaleDistribution": { 410 | "type": "linear" 411 | }, 412 | "showPoints": "auto", 413 | "spanNulls": false, 414 | "stacking": { 415 | "group": "A", 416 | "mode": "none" 417 | }, 418 | "thresholdsStyle": { 419 | "mode": "off" 420 | } 421 | }, 422 | "mappings": [], 423 | "min": 0, 424 | "thresholds": { 425 | "mode": "absolute", 426 | "steps": [ 427 | { 428 | "color": "green", 429 | "value": null 430 | } 431 | ] 432 | } 433 | }, 434 | "overrides": [] 435 | }, 436 | "gridPos": { 437 | "h": 7, 438 | "w": 8, 439 | "x": 0, 440 | "y": 10 441 | }, 442 | "id": 4, 443 | "options": { 444 | "legend": { 445 | "calcs": [], 446 | "displayMode": "list", 447 | "placement": "bottom", 448 | "showLegend": true 449 | }, 450 | "tooltip": { 451 | "mode": "multi", 452 | "sort": "none" 453 | } 454 | }, 455 | "pluginVersion": "9.1.5", 456 | "targets": [ 457 | { 458 | "datasource": { 459 | "type": "prometheus", 460 | "uid": "PBFA97CFB590B2093" 461 | }, 462 | "editorMode": "code", 463 | "expr": "tendermint_consensus_validators{job=\"$node\"}", 464 | "legendFormat": "active", 465 | "range": true, 466 | "refId": "A" 467 | }, 468 | { 469 | "datasource": { 470 | "type": "prometheus", 471 | "uid": "PBFA97CFB590B2093" 472 | }, 473 | "editorMode": "code", 474 | "expr": "tendermint_consensus_missing_validators{job=\"$node\"}", 475 | "hide": false, 476 | "legendFormat": "missed", 477 | "range": true, 478 | "refId": "B" 479 | }, 480 | { 481 | "datasource": { 482 | "type": "prometheus", 483 | "uid": "PBFA97CFB590B2093" 484 | }, 485 | "editorMode": "code", 486 | "expr": "tendermint_consensus_byzantine_validators{job=\"$node\"}", 487 | "hide": false, 488 | "legendFormat": "byzantine", 489 | "range": true, 490 | "refId": "C" 491 | } 492 | ], 493 | "title": "Validators", 494 | "type": "timeseries" 495 | }, 496 | { 497 | "datasource": { 498 | "type": "prometheus", 499 | "uid": "PBFA97CFB590B2093" 500 | }, 501 | "fieldConfig": { 502 | "defaults": { 503 | "color": { 504 | "mode": "palette-classic" 505 | }, 506 | "custom": { 507 | "axisCenteredZero": false, 508 | "axisColorMode": "text", 509 | "axisLabel": "", 510 | "axisPlacement": "auto", 511 | "barAlignment": 0, 512 | "drawStyle": "line", 513 | "fillOpacity": 0, 514 | "gradientMode": "none", 515 | "hideFrom": { 516 | "legend": false, 517 | "tooltip": false, 518 | "viz": false 519 | }, 520 | "lineInterpolation": "linear", 521 | "lineWidth": 1, 522 | "pointSize": 5, 523 | "scaleDistribution": { 524 | "type": "linear" 525 | }, 526 | "showPoints": "auto", 527 | "spanNulls": false, 528 | "stacking": { 529 | "group": "A", 530 | "mode": "none" 531 | }, 532 | "thresholdsStyle": { 533 | "mode": "off" 534 | } 535 | }, 536 | "mappings": [], 537 | "min": 0, 538 | "thresholds": { 539 | "mode": "absolute", 540 | "steps": [ 541 | { 542 | "color": "green", 543 | "value": null 544 | } 545 | ] 546 | }, 547 | "unit": "bytes" 548 | }, 549 | "overrides": [] 550 | }, 551 | "gridPos": { 552 | "h": 7, 553 | "w": 8, 554 | "x": 8, 555 | "y": 10 556 | }, 557 | "id": 7, 558 | "options": { 559 | "legend": { 560 | "calcs": [], 561 | "displayMode": "list", 562 | "placement": "bottom", 563 | "showLegend": false 564 | }, 565 | "tooltip": { 566 | "mode": "single", 567 | "sort": "none" 568 | } 569 | }, 570 | "pluginVersion": "9.1.5", 571 | "targets": [ 572 | { 573 | "datasource": { 574 | "type": "prometheus", 575 | "uid": "PBFA97CFB590B2093" 576 | }, 577 | "editorMode": "code", 578 | "expr": "tendermint_consensus_block_size_bytes{job=\"$node\"}", 579 | "legendFormat": "block size", 580 | "range": true, 581 | "refId": "A" 582 | } 583 | ], 584 | "title": "Block Size", 585 | "type": "timeseries" 586 | }, 587 | { 588 | "datasource": { 589 | "type": "prometheus", 590 | "uid": "PBFA97CFB590B2093" 591 | }, 592 | "fieldConfig": { 593 | "defaults": { 594 | "color": { 595 | "mode": "palette-classic" 596 | }, 597 | "custom": { 598 | "axisCenteredZero": false, 599 | "axisColorMode": "text", 600 | "axisLabel": "", 601 | "axisPlacement": "auto", 602 | "barAlignment": 0, 603 | "drawStyle": "line", 604 | "fillOpacity": 0, 605 | "gradientMode": "none", 606 | "hideFrom": { 607 | "legend": false, 608 | "tooltip": false, 609 | "viz": false 610 | }, 611 | "lineInterpolation": "linear", 612 | "lineWidth": 1, 613 | "pointSize": 5, 614 | "scaleDistribution": { 615 | "type": "linear" 616 | }, 617 | "showPoints": "auto", 618 | "spanNulls": false, 619 | "stacking": { 620 | "group": "A", 621 | "mode": "none" 622 | }, 623 | "thresholdsStyle": { 624 | "mode": "off" 625 | } 626 | }, 627 | "mappings": [], 628 | "min": 0, 629 | "thresholds": { 630 | "mode": "absolute", 631 | "steps": [ 632 | { 633 | "color": "green", 634 | "value": null 635 | } 636 | ] 637 | } 638 | }, 639 | "overrides": [] 640 | }, 641 | "gridPos": { 642 | "h": 7, 643 | "w": 8, 644 | "x": 16, 645 | "y": 10 646 | }, 647 | "id": 6, 648 | "options": { 649 | "legend": { 650 | "calcs": [], 651 | "displayMode": "list", 652 | "placement": "bottom", 653 | "showLegend": true 654 | }, 655 | "tooltip": { 656 | "mode": "single", 657 | "sort": "none" 658 | } 659 | }, 660 | "pluginVersion": "9.1.5", 661 | "targets": [ 662 | { 663 | "datasource": { 664 | "type": "prometheus", 665 | "uid": "PBFA97CFB590B2093" 666 | }, 667 | "editorMode": "code", 668 | "expr": "rate(tendermint_consensus_num_txs{job=\"$node\"}[1m])", 669 | "legendFormat": "Txs/sec", 670 | "range": true, 671 | "refId": "A" 672 | } 673 | ], 674 | "title": "Total Txs/sec", 675 | "type": "timeseries" 676 | }, 677 | { 678 | "datasource": { 679 | "type": "prometheus", 680 | "uid": "PBFA97CFB590B2093" 681 | }, 682 | "fieldConfig": { 683 | "defaults": { 684 | "color": { 685 | "mode": "palette-classic" 686 | }, 687 | "custom": { 688 | "axisCenteredZero": false, 689 | "axisColorMode": "text", 690 | "axisLabel": "", 691 | "axisPlacement": "auto", 692 | "barAlignment": 0, 693 | "drawStyle": "line", 694 | "fillOpacity": 0, 695 | "gradientMode": "none", 696 | "hideFrom": { 697 | "legend": false, 698 | "tooltip": false, 699 | "viz": false 700 | }, 701 | "lineInterpolation": "linear", 702 | "lineWidth": 1, 703 | "pointSize": 5, 704 | "scaleDistribution": { 705 | "type": "linear" 706 | }, 707 | "showPoints": "auto", 708 | "spanNulls": false, 709 | "stacking": { 710 | "group": "A", 711 | "mode": "none" 712 | }, 713 | "thresholdsStyle": { 714 | "mode": "off" 715 | } 716 | }, 717 | "mappings": [], 718 | "min": 0, 719 | "thresholds": { 720 | "mode": "absolute", 721 | "steps": [ 722 | { 723 | "color": "green", 724 | "value": null 725 | } 726 | ] 727 | } 728 | }, 729 | "overrides": [] 730 | }, 731 | "gridPos": { 732 | "h": 7, 733 | "w": 8, 734 | "x": 0, 735 | "y": 17 736 | }, 737 | "id": 10, 738 | "options": { 739 | "legend": { 740 | "calcs": [], 741 | "displayMode": "list", 742 | "placement": "bottom", 743 | "showLegend": false 744 | }, 745 | "tooltip": { 746 | "mode": "single", 747 | "sort": "none" 748 | } 749 | }, 750 | "pluginVersion": "9.1.5", 751 | "targets": [ 752 | { 753 | "datasource": { 754 | "type": "prometheus", 755 | "uid": "PBFA97CFB590B2093" 756 | }, 757 | "editorMode": "code", 758 | "expr": "tendermint_p2p_peers{job=\"$node\"}", 759 | "legendFormat": "num", 760 | "range": true, 761 | "refId": "A" 762 | } 763 | ], 764 | "title": "Peers count", 765 | "type": "timeseries" 766 | }, 767 | { 768 | "datasource": { 769 | "type": "prometheus", 770 | "uid": "PBFA97CFB590B2093" 771 | }, 772 | "fieldConfig": { 773 | "defaults": { 774 | "color": { 775 | "mode": "palette-classic" 776 | }, 777 | "custom": { 778 | "axisCenteredZero": false, 779 | "axisColorMode": "text", 780 | "axisLabel": "", 781 | "axisPlacement": "auto", 782 | "barAlignment": 0, 783 | "drawStyle": "line", 784 | "fillOpacity": 0, 785 | "gradientMode": "none", 786 | "hideFrom": { 787 | "legend": false, 788 | "tooltip": false, 789 | "viz": false 790 | }, 791 | "lineInterpolation": "linear", 792 | "lineWidth": 1, 793 | "pointSize": 5, 794 | "scaleDistribution": { 795 | "type": "linear" 796 | }, 797 | "showPoints": "auto", 798 | "spanNulls": false, 799 | "stacking": { 800 | "group": "A", 801 | "mode": "none" 802 | }, 803 | "thresholdsStyle": { 804 | "mode": "off" 805 | } 806 | }, 807 | "mappings": [], 808 | "min": 0, 809 | "thresholds": { 810 | "mode": "absolute", 811 | "steps": [ 812 | { 813 | "color": "green", 814 | "value": null 815 | } 816 | ] 817 | } 818 | }, 819 | "overrides": [] 820 | }, 821 | "gridPos": { 822 | "h": 7, 823 | "w": 8, 824 | "x": 8, 825 | "y": 17 826 | }, 827 | "id": 11, 828 | "options": { 829 | "legend": { 830 | "calcs": [], 831 | "displayMode": "list", 832 | "placement": "bottom", 833 | "showLegend": false 834 | }, 835 | "tooltip": { 836 | "mode": "single", 837 | "sort": "none" 838 | } 839 | }, 840 | "pluginVersion": "9.1.5", 841 | "targets": [ 842 | { 843 | "datasource": { 844 | "type": "prometheus", 845 | "uid": "PBFA97CFB590B2093" 846 | }, 847 | "editorMode": "code", 848 | "expr": "tendermint_mempool_failed_txs{jon=\"$node\"}", 849 | "legendFormat": "num", 850 | "range": true, 851 | "refId": "A" 852 | } 853 | ], 854 | "title": "Failed Txs", 855 | "type": "timeseries" 856 | }, 857 | { 858 | "datasource": { 859 | "type": "prometheus", 860 | "uid": "PBFA97CFB590B2093" 861 | }, 862 | "fieldConfig": { 863 | "defaults": { 864 | "color": { 865 | "mode": "palette-classic" 866 | }, 867 | "custom": { 868 | "axisCenteredZero": false, 869 | "axisColorMode": "text", 870 | "axisLabel": "", 871 | "axisPlacement": "auto", 872 | "barAlignment": 0, 873 | "drawStyle": "line", 874 | "fillOpacity": 0, 875 | "gradientMode": "none", 876 | "hideFrom": { 877 | "legend": false, 878 | "tooltip": false, 879 | "viz": false 880 | }, 881 | "lineInterpolation": "linear", 882 | "lineWidth": 1, 883 | "pointSize": 5, 884 | "scaleDistribution": { 885 | "type": "linear" 886 | }, 887 | "showPoints": "auto", 888 | "spanNulls": false, 889 | "stacking": { 890 | "group": "A", 891 | "mode": "none" 892 | }, 893 | "thresholdsStyle": { 894 | "mode": "off" 895 | } 896 | }, 897 | "mappings": [], 898 | "min": 0, 899 | "thresholds": { 900 | "mode": "absolute", 901 | "steps": [ 902 | { 903 | "color": "green", 904 | "value": null 905 | } 906 | ] 907 | } 908 | }, 909 | "overrides": [] 910 | }, 911 | "gridPos": { 912 | "h": 7, 913 | "w": 8, 914 | "x": 16, 915 | "y": 17 916 | }, 917 | "id": 8, 918 | "options": { 919 | "legend": { 920 | "calcs": [], 921 | "displayMode": "list", 922 | "placement": "bottom", 923 | "showLegend": true 924 | }, 925 | "tooltip": { 926 | "mode": "single", 927 | "sort": "none" 928 | } 929 | }, 930 | "pluginVersion": "9.1.5", 931 | "targets": [ 932 | { 933 | "datasource": { 934 | "type": "prometheus", 935 | "uid": "PBFA97CFB590B2093" 936 | }, 937 | "editorMode": "code", 938 | "expr": "tendermint_consensus_block_interval_seconds{}", 939 | "legendFormat": "Txs/sec", 940 | "range": true, 941 | "refId": "A" 942 | } 943 | ], 944 | "title": "Block interval", 945 | "type": "timeseries" 946 | }, 947 | { 948 | "datasource": { 949 | "type": "prometheus", 950 | "uid": "PBFA97CFB590B2093" 951 | }, 952 | "fieldConfig": { 953 | "defaults": { 954 | "color": { 955 | "mode": "continuous-greens", 956 | "seriesBy": "last" 957 | }, 958 | "custom": { 959 | "axisCenteredZero": false, 960 | "axisColorMode": "text", 961 | "axisLabel": "", 962 | "axisPlacement": "auto", 963 | "barAlignment": 0, 964 | "drawStyle": "line", 965 | "fillOpacity": 0, 966 | "gradientMode": "scheme", 967 | "hideFrom": { 968 | "legend": false, 969 | "tooltip": false, 970 | "viz": false 971 | }, 972 | "lineInterpolation": "smooth", 973 | "lineStyle": { 974 | "dash": [0, 30], 975 | "fill": "dot" 976 | }, 977 | "lineWidth": 3, 978 | "pointSize": 5, 979 | "scaleDistribution": { 980 | "type": "linear" 981 | }, 982 | "showPoints": "never", 983 | "spanNulls": false, 984 | "stacking": { 985 | "group": "A", 986 | "mode": "normal" 987 | }, 988 | "thresholdsStyle": { 989 | "mode": "off" 990 | } 991 | }, 992 | "mappings": [], 993 | "min": 0, 994 | "thresholds": { 995 | "mode": "absolute", 996 | "steps": [ 997 | { 998 | "color": "green", 999 | "value": null 1000 | } 1001 | ] 1002 | }, 1003 | "unit": "bytes" 1004 | }, 1005 | "overrides": [] 1006 | }, 1007 | "gridPos": { 1008 | "h": 7, 1009 | "w": 12, 1010 | "x": 0, 1011 | "y": 24 1012 | }, 1013 | "id": 12, 1014 | "options": { 1015 | "legend": { 1016 | "calcs": [], 1017 | "displayMode": "list", 1018 | "placement": "bottom", 1019 | "showLegend": false 1020 | }, 1021 | "tooltip": { 1022 | "mode": "single", 1023 | "sort": "none" 1024 | } 1025 | }, 1026 | "pluginVersion": "9.1.5", 1027 | "targets": [ 1028 | { 1029 | "datasource": { 1030 | "type": "prometheus", 1031 | "uid": "PBFA97CFB590B2093" 1032 | }, 1033 | "editorMode": "code", 1034 | "expr": "rate(tendermint_p2p_peer_receive_bytes_total{job=\"$node\"}[$__rate_interval])", 1035 | "legendFormat": "__auto", 1036 | "range": true, 1037 | "refId": "A" 1038 | } 1039 | ], 1040 | "title": "Total Network Input", 1041 | "transparent": true, 1042 | "type": "timeseries" 1043 | }, 1044 | { 1045 | "datasource": { 1046 | "type": "prometheus", 1047 | "uid": "PBFA97CFB590B2093" 1048 | }, 1049 | "fieldConfig": { 1050 | "defaults": { 1051 | "color": { 1052 | "mode": "continuous-greens", 1053 | "seriesBy": "last" 1054 | }, 1055 | "custom": { 1056 | "axisCenteredZero": false, 1057 | "axisColorMode": "text", 1058 | "axisLabel": "", 1059 | "axisPlacement": "auto", 1060 | "barAlignment": 0, 1061 | "drawStyle": "line", 1062 | "fillOpacity": 0, 1063 | "gradientMode": "scheme", 1064 | "hideFrom": { 1065 | "legend": false, 1066 | "tooltip": false, 1067 | "viz": false 1068 | }, 1069 | "lineInterpolation": "smooth", 1070 | "lineStyle": { 1071 | "dash": [0, 30], 1072 | "fill": "dot" 1073 | }, 1074 | "lineWidth": 3, 1075 | "pointSize": 5, 1076 | "scaleDistribution": { 1077 | "type": "linear" 1078 | }, 1079 | "showPoints": "never", 1080 | "spanNulls": false, 1081 | "stacking": { 1082 | "group": "A", 1083 | "mode": "normal" 1084 | }, 1085 | "thresholdsStyle": { 1086 | "mode": "off" 1087 | } 1088 | }, 1089 | "mappings": [], 1090 | "min": 0, 1091 | "thresholds": { 1092 | "mode": "absolute", 1093 | "steps": [ 1094 | { 1095 | "color": "green", 1096 | "value": null 1097 | } 1098 | ] 1099 | }, 1100 | "unit": "bytes" 1101 | }, 1102 | "overrides": [] 1103 | }, 1104 | "gridPos": { 1105 | "h": 7, 1106 | "w": 12, 1107 | "x": 12, 1108 | "y": 24 1109 | }, 1110 | "id": 13, 1111 | "options": { 1112 | "legend": { 1113 | "calcs": [], 1114 | "displayMode": "list", 1115 | "placement": "bottom", 1116 | "showLegend": false 1117 | }, 1118 | "tooltip": { 1119 | "mode": "single", 1120 | "sort": "none" 1121 | } 1122 | }, 1123 | "pluginVersion": "9.1.5", 1124 | "targets": [ 1125 | { 1126 | "datasource": { 1127 | "type": "prometheus", 1128 | "uid": "PBFA97CFB590B2093" 1129 | }, 1130 | "editorMode": "code", 1131 | "expr": "rate(tendermint_p2p_peer_send_bytes_total{job=\"$node\"}[$__rate_interval])", 1132 | "legendFormat": "__auto", 1133 | "range": true, 1134 | "refId": "A" 1135 | } 1136 | ], 1137 | "title": "Total Network Output", 1138 | "transparent": true, 1139 | "type": "timeseries" 1140 | } 1141 | ], 1142 | "schemaVersion": 37, 1143 | "style": "dark", 1144 | "tags": [], 1145 | "templating": { 1146 | "list": [ 1147 | { 1148 | "current": { 1149 | "selected": true, 1150 | "text": "nodesblocks-rebus-node", 1151 | "value": "nodesblocks-rebus-node" 1152 | }, 1153 | "datasource": { 1154 | "type": "prometheus", 1155 | "uid": "PBFA97CFB590B2093" 1156 | }, 1157 | "definition": "label_values(tendermint_mempool_size,job)", 1158 | "hide": 0, 1159 | "includeAll": false, 1160 | "multi": false, 1161 | "name": "node", 1162 | "options": [], 1163 | "query": { 1164 | "query": "label_values(tendermint_mempool_size,job)", 1165 | "refId": "StandardVariableQuery" 1166 | }, 1167 | "refresh": 1, 1168 | "regex": "", 1169 | "skipUrlSync": false, 1170 | "sort": 0, 1171 | "type": "query" 1172 | } 1173 | ] 1174 | }, 1175 | "time": { 1176 | "from": "now-1h", 1177 | "to": "now" 1178 | }, 1179 | "timepicker": {}, 1180 | "timezone": "", 1181 | "title": "Chains", 1182 | "uid": "wuin9znVk", 1183 | "version": 4, 1184 | "weekStart": "" 1185 | } 1186 | --------------------------------------------------------------------------------