diff --git a/roles/go_node/README.md b/roles/dingo/README.md similarity index 96% rename from roles/go_node/README.md rename to roles/dingo/README.md index dfc4b63..635adbc 100644 --- a/roles/go_node/README.md +++ b/roles/dingo/README.md @@ -1,4 +1,4 @@ -go_node +dingo ========= This role deploys a Blink Labs Go Cardano node instance. @@ -36,7 +36,7 @@ passed in as parameters) is always nice for users too: - hosts: servers tasks: - include_role: - name: blinklabs.cardano.go_node + name: blinklabs.cardano.dingo ``` License diff --git a/roles/dingo/defaults/main.yml b/roles/dingo/defaults/main.yml new file mode 100644 index 0000000..93fd292 --- /dev/null +++ b/roles/dingo/defaults/main.yml @@ -0,0 +1,85 @@ +--- +# Install method +dingo_install_method: 'docker' + +# Cardano node version +dingo_version: '0.1.6' + +# Cardano network +dingo_network: mainnet + +# Base host directory for node data +dingo_dir: /opt/cardano + +# Config directory for host/container +dingo_config_dir: '{{ dingo_dir }}/config' +dingo_config_container_dir: '{{ dingo_config_dir }}' + +# DB directory for host/container +dingo_db_dir: '{{ dingo_dir }}/data' +dingo_db_container_dir: '{{ dingo_db_dir }}' + +# IPC directory for host/container +dingo_ipc_dir: '{{ dingo_dir }}/ipc' +dingo_ipc_container_dir: '{{ dingo_ipc_dir }}' + +# Topology directory for host/container +dingo_topology_dir: '{{ dingo_config_dir }}' +dingo_topology_container_dir: '{{ dingo_topology_dir }}' + +# Block producer keys directory for host/container +dingo_keys_dir: '{{ dingo_config_dir }}/keys' +dingo_keys_container_dir: '{{ dingo_keys_dir }}' + +# User/group for file/directory ownership +dingo_user: root +dingo_group: root + +# Docker image +dingo_docker_image: 'ghcr.io/blinklabs-io/dingo:{{ dingo_version }}' + +# Docker container name +dingo_docker_container_name: node + +# Port for host/container +dingo_container_port: 3001 +dingo_port: '{{ dingo_container_port }}' + +# Metrics port for host/container +dingo_metrics_container_port: 12798 +dingo_metrics_port: '{{ dingo_metrics_container_port }}' + +# Socket file name +dingo_socket_name: node.socket + +# Config +dingo_manage_config: false # this currently controls mounting only +dingo_config_file: '{{ dingo_config_container_dir }}/{{ dingo_network }}/config.json' + +# Topology +dingo_manage_topology: false +dingo_topology_file: '{{ dingo_topology_container_dir }}/{{ dingo_network }}/topology.json' +dingo_topology_use_ledger_after_slot: 128908821 +dingo_topology_localroots: [] +dingo_topology_publicroots: [] +# Adjust for non-mainnet deployments +dingo_topology_bootstrap_peers: + - address: 'backbone.cardano.iog.io' + port: 3001 + - address: 'backbone.mainnet.emurgornd.com' + port: 3001 + - address: 'backbone.mainnet.cardanofoundation.org' + port: 3001 + +# Install chrony +chrony_enabled: true + +# Mithril configuration +dingo_restore_snapshot: true +dingo_snapshot_digest: 'latest' + +# Block Producer (also controls mounts for keys) +dingo_block_producer: false +dingo_shelley_kes_key: '{{ dingo_keys_container_dir }}/kes.skey' +dingo_shelley_opcert: '{{ dingo_keys_container_dir }}/node.cert' +dingo_shelley_vrf_key: '{{ dingo_keys_container_dir }}/vrf.skey' diff --git a/roles/go_node/meta/main.yml b/roles/dingo/meta/main.yml similarity index 100% rename from roles/go_node/meta/main.yml rename to roles/dingo/meta/main.yml diff --git a/roles/dingo/tasks/docker.yml b/roles/dingo/tasks/docker.yml new file mode 100644 index 0000000..1bbef33 --- /dev/null +++ b/roles/dingo/tasks/docker.yml @@ -0,0 +1,54 @@ +--- +- name: Initialize dingo_docker_volumes fact + set_fact: + dingo_docker_volumes: '{{ dingo_docker_volumes | default([]) + [item] }}' + loop: + - '{{ dingo_ipc_dir }}:{{ dingo_ipc_container_dir }}' + - '{{ dingo_db_dir }}:{{ dingo_db_container_dir }}' + +- name: Add config to dingo_docker_volumes fact + set_fact: + dingo_docker_volumes: '{{ dingo_docker_volumes | default([]) + [item] }}' + loop: + - '{{ dingo_config_file }}:{{ dingo_config_file }}' + when: dingo_manage_config + +- name: Add topology to dingo_docker_volumes fact + set_fact: + dingo_docker_volumes: '{{ dingo_docker_volumes | default([]) + [item] }}' + loop: + - '{{ dingo_topology_file }}:{{ dingo_topology_file }}' + when: dingo_manage_topology + +- name: Add keys to dingo_docker_volumes fact + set_fact: + dingo_docker_volumes: '{{ dingo_docker_volumes | default([]) + [item] }}' + loop: + - '{{ dingo_keys_dir }}:{{ dingo_keys_container_dir }}' + when: dingo_block_producer | bool + +- name: Create container + docker_container: + name: '{{ dingo_docker_container_name }}' + image: '{{ dingo_docker_image }}' + command: + - --debug + restart_policy: unless-stopped + ports: + - '{{ dingo_port }}:{{ dingo_container_port }}' + - '{{ dingo_metrics_port }}:{{ dingo_metrics_container_port }}' + env: + CARDANO_BLOCK_PRODUCER: '{{ dingo_block_producer | string }}' + CARDANO_CONFIG: '{{ dingo_config_file }}' + CARDANO_DATABASE_PATH: '{{ dingo_db_container_dir }}' + CARDANO_NETWORK: '{{ dingo_network }}' + CARDANO_NODE_SOCKET_PATH: '{{ dingo_ipc_container_dir }}/{{ dingo_socket_name }}' + CARDANO_PORT: '{{ dingo_port | string }}' + CARDANO_SHELLEY_KES_KEY: '{{ dingo_shelley_kes_key }}' + CARDANO_SHELLEY_OPERATIONAL_CERTIFICATE: '{{ dingo_shelley_opcert }}' + CARDANO_SHELLEY_VRF_KEY: '{{ dingo_shelley_vrf_key }}' + CARDANO_SOCKET_PATH: '{{ dingo_ipc_container_dir }}/{{ dingo_socket_name }}' + CARDANO_TOPOLOGY: '{{ dingo_topology_file }}' + RESTORE_SNAPSHOT: '{{ dingo_restore_snapshot | string }}' + SNAPSHOT_DIGEST: '{{ dingo_snapshot_digest }}' + volumes: '{{ dingo_docker_volumes | list }}' diff --git a/roles/dingo/tasks/main.yml b/roles/dingo/tasks/main.yml new file mode 100644 index 0000000..78aee97 --- /dev/null +++ b/roles/dingo/tasks/main.yml @@ -0,0 +1,50 @@ +--- +- name: Check install method + vars: + _allowed_install_methods: ['docker'] + ansible.builtin.assert: + that: + - dingo_install_method in _allowed_install_methods + fail_msg: 'The specified install method ({{ dingo_install_method }}) is not one of the allowed values ({{ _allowed_install_methods | join(", ") }})' + +- name: Install chrony + package: + name: chrony + state: present + when: chrony_enabled + +- name: Create directories for persistent data + ansible.builtin.file: + state: directory + path: '{{ item }}' + owner: '{{ dingo_user | string }}' + group: '{{ dingo_group | string }}' + mode: '0755' + loop: + - '{{ dingo_db_dir }}' + - '{{ dingo_ipc_dir }}' + +- name: Create directories for topology + ansible.builtin.file: + state: directory + path: '{{ item }}' + owner: '{{ dingo_user | string }}' + group: '{{ dingo_group | string }}' + mode: '0755' + loop: + - '{{ dingo_topology_dir }}' + when: dingo_manage_topology + +- name: Generate custom topology config + template: + dest: '{{ dingo_topology_file }}' + src: custom-topology.json.j2 + owner: '{{ dingo_user | string }}' + group: '{{ dingo_group | string }}' + mode: 0644 + register: cardano_topology + when: dingo_manage_topology + +- name: Include docker-related tasks + ansible.builtin.include_tasks: docker.yml + when: dingo_install_method == 'docker' diff --git a/roles/go_node/templates/custom-topology.json.j2 b/roles/dingo/templates/custom-topology.json.j2 similarity index 67% rename from roles/go_node/templates/custom-topology.json.j2 rename to roles/dingo/templates/custom-topology.json.j2 index 2bb5001..5833b3b 100644 --- a/roles/go_node/templates/custom-topology.json.j2 +++ b/roles/dingo/templates/custom-topology.json.j2 @@ -1,8 +1,8 @@ { -{% set peer_count = go_node_topology_bootstrap_peers | length %} +{% set peer_count = dingo_topology_bootstrap_peers | length %} {% if peer_count > 0 %} "bootstrapPeers": [ -{% for peer in go_node_topology_bootstrap_peers %} +{% for peer in dingo_topology_bootstrap_peers %} { "address": "{{ peer.address }}", "port": {{ peer.port | int }} @@ -17,8 +17,8 @@ "localRoots": [ { "accessPoints": [ -{% set peer_count = go_node_topology_localroots | length %} -{% for peer in go_node_topology_localroots %} +{% set peer_count = dingo_topology_localroots | length %} +{% for peer in dingo_topology_localroots %} { "address": "{{ peer.address }}", "port": {{ peer.port | int }} @@ -37,8 +37,8 @@ "publicRoots": [ { "accessPoints": [ -{% set peer_count = go_node_topology_publicroots | length %} -{% for peer in go_node_topology_publicroots %} +{% set peer_count = dingo_topology_publicroots | length %} +{% for peer in dingo_topology_publicroots %} { "address": "{{ peer.address }}", "port": {{ peer.port | int }} @@ -52,5 +52,5 @@ "advertise": false } ], - "useLedgerAfterSlot": {{ go_node_topology_use_ledger_after_slot }} + "useLedgerAfterSlot": {{ dingo_topology_use_ledger_after_slot }} } diff --git a/roles/go_node/defaults/main.yml b/roles/go_node/defaults/main.yml deleted file mode 100644 index bbc3376..0000000 --- a/roles/go_node/defaults/main.yml +++ /dev/null @@ -1,85 +0,0 @@ ---- -# Install method -go_node_install_method: 'docker' - -# Cardano node version -go_node_version: '0.1.3' - -# Cardano network -go_node_network: mainnet - -# Base host directory for node data -go_node_dir: /opt/cardano - -# Config directory for host/container -go_node_config_dir: '{{ go_node_dir }}/config' -go_node_config_container_dir: '{{ go_node_config_dir }}' - -# DB directory for host/container -go_node_db_dir: '{{ go_node_dir }}/data' -go_node_db_container_dir: '{{ go_node_db_dir }}' - -# IPC directory for host/container -go_node_ipc_dir: '{{ go_node_dir }}/ipc' -go_node_ipc_container_dir: '{{ go_node_ipc_dir }}' - -# Topology directory for host/container -go_node_topology_dir: '{{ go_node_config_dir }}' -go_node_topology_container_dir: '{{ go_node_topology_dir }}' - -# Block producer keys directory for host/container -go_node_keys_dir: '{{ go_node_config_dir }}/keys' -go_node_keys_container_dir: '{{ go_node_keys_dir }}' - -# User/group for file/directory ownership -go_node_user: root -go_node_group: root - -# Docker image -go_node_docker_image: 'ghcr.io/blinklabs-io/node:{{ go_node_version }}' - -# Docker container name -go_node_docker_container_name: node - -# Port for host/container -go_node_container_port: 3001 -go_node_port: '{{ go_node_container_port }}' - -# Metrics port for host/container -go_node_metrics_container_port: 12798 -go_node_metrics_port: '{{ go_node_metrics_container_port }}' - -# Socket file name -go_node_socket_name: node.socket - -# Config -go_node_manage_config: false # this currently controls mounting only -go_node_config_file: '{{ go_node_config_container_dir }}/{{ go_node_network }}/config.json' - -# Topology -go_node_manage_topology: false -go_node_topology_file: '{{ go_node_topology_container_dir }}/{{ go_node_network }}/topology.json' -go_node_topology_use_ledger_after_slot: 128908821 -go_node_topology_localroots: [] -go_node_topology_publicroots: [] -# Adjust for non-mainnet deployments -go_node_topology_bootstrap_peers: - - address: 'backbone.cardano.iog.io' - port: 3001 - - address: 'backbone.mainnet.emurgornd.com' - port: 3001 - - address: 'backbone.mainnet.cardanofoundation.org' - port: 3001 - -# Install chrony -chrony_enabled: true - -# Mithril configuration -go_node_restore_snapshot: true -go_node_snapshot_digest: 'latest' - -# Block Producer (also controls mounts for keys) -go_node_block_producer: false -go_node_shelley_kes_key: '{{ go_node_keys_container_dir }}/kes.skey' -go_node_shelley_opcert: '{{ go_node_keys_container_dir }}/node.cert' -go_node_shelley_vrf_key: '{{ go_node_keys_container_dir }}/vrf.skey' diff --git a/roles/go_node/tasks/docker.yml b/roles/go_node/tasks/docker.yml deleted file mode 100644 index 05506ba..0000000 --- a/roles/go_node/tasks/docker.yml +++ /dev/null @@ -1,54 +0,0 @@ ---- -- name: Initialize go_node_docker_volumes fact - set_fact: - go_node_docker_volumes: '{{ go_node_docker_volumes | default([]) + [item] }}' - loop: - - '{{ go_node_ipc_dir }}:{{ go_node_ipc_container_dir }}' - - '{{ go_node_db_dir }}:{{ go_node_db_container_dir }}' - -- name: Add config to go_node_docker_volumes fact - set_fact: - go_node_docker_volumes: '{{ go_node_docker_volumes | default([]) + [item] }}' - loop: - - '{{ go_node_config_file }}:{{ go_node_config_file }}' - when: go_node_manage_config - -- name: Add topology to go_node_docker_volumes fact - set_fact: - go_node_docker_volumes: '{{ go_node_docker_volumes | default([]) + [item] }}' - loop: - - '{{ go_node_topology_file }}:{{ go_node_topology_file }}' - when: go_node_manage_topology - -- name: Add keys to go_node_docker_volumes fact - set_fact: - go_node_docker_volumes: '{{ go_node_docker_volumes | default([]) + [item] }}' - loop: - - '{{ go_node_keys_dir }}:{{ go_node_keys_container_dir }}' - when: go_node_block_producer | bool - -- name: Create container - docker_container: - name: '{{ go_node_docker_container_name }}' - image: '{{ go_node_docker_image }}' - command: - - --debug - restart_policy: unless-stopped - ports: - - '{{ go_node_port }}:{{ go_node_container_port }}' - - '{{ go_node_metrics_port }}:{{ go_node_metrics_container_port }}' - env: - CARDANO_BLOCK_PRODUCER: '{{ go_node_block_producer | string }}' - CARDANO_CONFIG: '{{ go_node_config_file }}' - CARDANO_DATABASE_PATH: '{{ go_node_db_container_dir }}' - CARDANO_NETWORK: '{{ go_node_network }}' - CARDANO_NODE_SOCKET_PATH: '{{ go_node_ipc_container_dir }}/{{ go_node_socket_name }}' - CARDANO_PORT: '{{ go_node_port | string }}' - CARDANO_SHELLEY_KES_KEY: '{{ go_node_shelley_kes_key }}' - CARDANO_SHELLEY_OPERATIONAL_CERTIFICATE: '{{ go_node_shelley_opcert }}' - CARDANO_SHELLEY_VRF_KEY: '{{ go_node_shelley_vrf_key }}' - CARDANO_SOCKET_PATH: '{{ go_node_ipc_container_dir }}/{{ go_node_socket_name }}' - CARDANO_TOPOLOGY: '{{ go_node_topology_file }}' - RESTORE_SNAPSHOT: '{{ go_node_restore_snapshot | string }}' - SNAPSHOT_DIGEST: '{{ go_node_snapshot_digest }}' - volumes: '{{ go_node_docker_volumes | list }}' diff --git a/roles/go_node/tasks/main.yml b/roles/go_node/tasks/main.yml deleted file mode 100644 index 8117467..0000000 --- a/roles/go_node/tasks/main.yml +++ /dev/null @@ -1,50 +0,0 @@ ---- -- name: Check install method - vars: - _allowed_install_methods: ['docker'] - ansible.builtin.assert: - that: - - go_node_install_method in _allowed_install_methods - fail_msg: 'The specified install method ({{ go_node_install_method }}) is not one of the allowed values ({{ _allowed_install_methods | join(", ") }})' - -- name: Install chrony - package: - name: chrony - state: present - when: chrony_enabled - -- name: Create directories for persistent data - ansible.builtin.file: - state: directory - path: '{{ item }}' - owner: '{{ go_node_user | string }}' - group: '{{ go_node_group | string }}' - mode: '0755' - loop: - - '{{ go_node_db_dir }}' - - '{{ go_node_ipc_dir }}' - -- name: Create directories for topology - ansible.builtin.file: - state: directory - path: '{{ item }}' - owner: '{{ go_node_user | string }}' - group: '{{ go_node_group | string }}' - mode: '0755' - loop: - - '{{ go_node_topology_dir }}' - when: go_node_manage_topology - -- name: Generate custom topology config - template: - dest: '{{ go_node_topology_file }}' - src: custom-topology.json.j2 - owner: '{{ go_node_user | string }}' - group: '{{ go_node_group | string }}' - mode: 0644 - register: cardano_topology - when: go_node_manage_topology - -- name: Include docker-related tasks - ansible.builtin.include_tasks: docker.yml - when: go_node_install_method == 'docker'