diff --git a/README.md b/README.md index 4213297c..0175c120 100644 --- a/README.md +++ b/README.md @@ -57,6 +57,9 @@ Ansible configuration is stored in the `*.yml` file. The file contains the majority of playbook options. The rest are defined in [ansible roles](https://github.com/dashpay/dash-network-deploy/tree/master/ansible/roles). +Standalone quorum API hosts can be enabled with `quorum_list_server_count`. +See [Standalone Quorum List Server](docs/quorum-list-server.md) for details. + Configure your credentials in the `.env` file. ### Using git diff --git a/ansible/deploy.yml b/ansible/deploy.yml index 60633a9a..3a5c941b 100644 --- a/ansible/deploy.yml +++ b/ansible/deploy.yml @@ -374,6 +374,19 @@ - dashmate_deploy +- name: Set up quorum list servers + hosts: quorum_list_servers + become: true + gather_facts: false + strategy: free + roles: + - role: quorum_list_server + when: quorum_list_server_enabled | bool + tags: + - full_deploy + - dashmate_deploy + - quorum_list_server + - name: Set up protx diff script hosts: masternodes become: true diff --git a/ansible/roles/quorum_list_server/defaults/main.yml b/ansible/roles/quorum_list_server/defaults/main.yml new file mode 100644 index 00000000..a2e2c27c --- /dev/null +++ b/ansible/roles/quorum_list_server/defaults/main.yml @@ -0,0 +1,21 @@ +--- + +quorum_list_server_enabled: true +quorum_list_server_image: dashpay/quorum-list-server:latest +quorum_list_server_pull: true +quorum_list_server_container_name: quorum-list-server +quorum_list_server_config_dir: /etc/quorum-list-server +quorum_list_server_config_path: "{{ quorum_list_server_config_dir }}/config.toml" +quorum_list_server_host: "0.0.0.0" +quorum_list_server_port: 8080 +quorum_list_server_previous_blocks_offset: 8 + +quorum_list_server_rpc_host: "{{ (groups['seed_nodes'] | default([]) | first) | default('') }}" +quorum_list_server_rpc_url: "http://{{ hostvars[quorum_list_server_rpc_host].private_ip }}:{{ dashd_rpc_port }}" +quorum_list_server_rpc_user: "{{ dashd_rpc_user }}" +quorum_list_server_rpc_password: "{{ dashd_rpc_password }}" +quorum_list_server_network: "{{ dash_network }}" +quorum_list_server_health_host: "{{ '127.0.0.1' if quorum_list_server_host in ['0.0.0.0', '::'] else quorum_list_server_host }}" + +quorum_list_server_version_check_host: "" +quorum_list_server_address_host_override: "" diff --git a/ansible/roles/quorum_list_server/tasks/main.yml b/ansible/roles/quorum_list_server/tasks/main.yml new file mode 100644 index 00000000..1de00212 --- /dev/null +++ b/ansible/roles/quorum_list_server/tasks/main.yml @@ -0,0 +1,52 @@ +--- + +- name: Check quorum-list-server RPC target + ansible.builtin.assert: + that: + - groups['seed_nodes'] | default([]) | length > 0 + - quorum_list_server_rpc_host is defined + - quorum_list_server_rpc_host | length > 0 + - quorum_list_server_rpc_host in hostvars + - hostvars[quorum_list_server_rpc_host].private_ip is defined + fail_msg: "quorum_list_server_rpc_host must point at an inventory host with a private_ip" + +- name: Create quorum-list-server config dir + ansible.builtin.file: + path: "{{ quorum_list_server_config_dir }}" + state: directory + owner: root + group: root + mode: "0750" + +- name: Write quorum-list-server config + ansible.builtin.template: + src: config.toml.j2 + dest: "{{ quorum_list_server_config_path }}" + owner: root + group: root + mode: "0640" + no_log: true + register: quorum_list_server_config + +- name: Start quorum-list-server + community.docker.docker_container: + name: "{{ quorum_list_server_container_name }}" + image: "{{ quorum_list_server_image }}" + state: started + restart_policy: always + pull: "{{ quorum_list_server_pull | bool }}" + recreate: "{{ quorum_list_server_config.changed }}" + user: "appuser:root" + network_mode: host + volumes: + - "{{ quorum_list_server_config_path }}:/app/config.toml:ro" + +- name: Wait for quorum-list-server health endpoint + ansible.builtin.uri: + url: "http://{{ quorum_list_server_health_host }}:{{ quorum_list_server_port }}/health" + status_code: 200 + timeout: 3 + register: quorum_list_server_health + until: quorum_list_server_health.status == 200 + retries: 30 + delay: 2 diff --git a/ansible/roles/quorum_list_server/templates/config.toml.j2 b/ansible/roles/quorum_list_server/templates/config.toml.j2 new file mode 100644 index 00000000..4b5c4143 --- /dev/null +++ b/ansible/roles/quorum_list_server/templates/config.toml.j2 @@ -0,0 +1,23 @@ +network = {{ quorum_list_server_network | to_json }} + +[server] +port = {{ quorum_list_server_port | int }} +host = {{ quorum_list_server_host | to_json }} + +[rpc] +url = {{ quorum_list_server_rpc_url | to_json }} +username = {{ quorum_list_server_rpc_user | to_json }} +password = {{ quorum_list_server_rpc_password | to_json }} + +[quorum] +previous_blocks_offset = {{ quorum_list_server_previous_blocks_offset | int }} + +{% if quorum_list_server_version_check_host | length > 0 or quorum_list_server_address_host_override | length > 0 %} +[docker] +{% if quorum_list_server_version_check_host | length > 0 %} +version_check_host = {{ quorum_list_server_version_check_host | to_json }} +{% endif %} +{% if quorum_list_server_address_host_override | length > 0 %} +address_host_override = {{ quorum_list_server_address_host_override | to_json }} +{% endif %} +{% endif %} diff --git a/docs/quorum-list-server.md b/docs/quorum-list-server.md new file mode 100644 index 00000000..39edf334 --- /dev/null +++ b/docs/quorum-list-server.md @@ -0,0 +1,83 @@ +# Standalone Quorum List Server + +`dash-network-deploy` can provision a standalone `dashpay/quorum-list-server` +node for networks that need a public quorum API endpoint. + +Each enabled network gets a separate EC2 instance running the +`dashpay/quorum-list-server` Docker image, a private RPC connection to its seed +node, and a network-specific public HTTPS endpoint. + +## Enable + +Set a non-zero `quorum_list_server_count` in the network Terraform vars: + +```hcl +quorum_list_server_count = 1 +``` + +Optional Terraform settings: + +```hcl +quorum_list_server_port = 8080 +quorum_list_server_instance_size = "micro" +quorum_list_server_root_disk_size = 20 +``` + +Terraform creates: + +- `quorum-list-server-N` EC2 host(s) +- An Ansible inventory group named `quorum_list_servers` +- A classic ELB with an HTTPS listener and an internal HTTP health check +- An ACM certificate for `quorums..` +- A Route53 CNAME for `quorums..` + +For devnets, `` is derived generically from the Terraform workspace +name: `devnet-` produces `quorums..`. + +## Provisioning + +The deploy playbook applies the `quorum_list_server` Ansible role to hosts in +the `quorum_list_servers` inventory group. The role writes +`/etc/quorum-list-server/config.toml` as root-readable group material and starts +the non-root Docker process with the root group so it can read the mounted +configuration while using host networking. + +By default, the server reads quorum data from the first seed node over the +private VPC RPC endpoint: + +```text +http://:20002 +``` + +The role uses the network's existing Dash Core RPC credentials from Ansible +vars. The HTTP JSON-RPC hop stays on private VPC addresses and is restricted by +the network security groups; it is not exposed through the public ELB. Do not +commit those credentials into docs or examples. + +Optional Ansible vars: + +```yaml +quorum_list_server_image: dashpay/quorum-list-server:latest +quorum_list_server_pull: true +quorum_list_server_port: 8080 +quorum_list_server_previous_blocks_offset: 8 +quorum_list_server_rpc_host: seed-1 +quorum_list_server_version_check_host: "" +quorum_list_server_address_host_override: "" +``` + +The role passes the generic Dash network class (`mainnet`, `testnet`, `devnet`, +or `regtest`) to `quorum-list-server`. The Terraform workspace keeps the +specific `devnet-` deployment identity, while the service receives +`devnet` and selects the standard Platform devnet LLMQ settings. Set +`quorum_list_server_pull: false` only for an image tag built locally on the +target host. + +## Verify + +After deploy: + +```bash +curl -fsS https://quorums../health +curl -fsS https://quorums../quorums +``` diff --git a/terraform/aws/.terraform.lock.hcl b/terraform/aws/.terraform.lock.hcl index 22651e57..b029ce58 100644 --- a/terraform/aws/.terraform.lock.hcl +++ b/terraform/aws/.terraform.lock.hcl @@ -2,44 +2,45 @@ # Manual edits may be lost in future updates. provider "registry.terraform.io/hashicorp/aws" { - version = "5.21.0" + version = "5.100.0" constraints = "~> 5.21" hashes = [ - "h1:N8sP6VZjHbtgmaCU6BKPox51UIypWXQRal7JMecEXQw=", - "zh:1ba1411e4f8c047950db94c236f146d4590790320c68320b4e56082d8746a507", - "zh:3185e4a34cfcad35dcf11439290a4bd0ad52d462eca2ab5d4940488a2db72833", - "zh:3c6b901f874b4d9a85301a653d0bd507b052992bd84fc81100f4e5f73b1adab7", - "zh:45d3fdbbc5804f295576b7155fdca527dedff17a014ed40c215af3bc60c329db", - "zh:47b64b453d2c373062e47a54f3df33335dc29bce6ddbbf2da9e7be768c560abe", - "zh:5cdf57ffd465288d9732d14ba13b377a8d389e0ba0ce3ac4773fd6fdfc09d6a1", - "zh:81ec4c662581a2446c78da7b27d7e0d5c2e4d50925294789ec13661817f4b5a4", + "h1:edXOJWE4ORX8Fm+dpVpICzMZJat4AX0VRCAy/xkcOc0=", + "zh:054b8dd49f0549c9a7cc27d159e45327b7b65cf404da5e5a20da154b90b8a644", + "zh:0b97bf8d5e03d15d83cc40b0530a1f84b459354939ba6f135a0086c20ebbe6b2", + "zh:1589a2266af699cbd5d80737a0fe02e54ec9cf2ca54e7e00ac51c7359056f274", + "zh:6330766f1d85f01ae6ea90d1b214b8b74cc8c1badc4696b165b36ddd4cc15f7b", + "zh:7c8c2e30d8e55291b86fcb64bdf6c25489d538688545eb48fd74ad622e5d3862", + "zh:99b1003bd9bd32ee323544da897148f46a527f622dc3971af63ea3e251596342", "zh:9b12af85486a96aedd8d7984b0ff811a4b42e3d88dad1a3fb4c0b580d04fa425", - "zh:ac248464fd4ce1f020c05f27e3182532a7d1af4b8185a4b4be8b906b30b0ca5a", - "zh:bbbedc6b6eaffcce0b31b397d607464f0c21c1b9406182163d504d3f392cc68d", - "zh:c2afc111f9503829ed055e2ae91d873670c57bd16acc1a3246ac3957f6998d4e", - "zh:cd3c8175b2152848113482da70e5b9c7cb4c951f2046fc0b832715300bd88b97", - "zh:cf89b0c09d426d489f9477209d4084e64ad1b598036284fa688b41de626b58e6", - "zh:d9d127637c3b9ff6e2d0a2c30f54bd48ab1de34f725a5df1a6a3d039b021e636", - "zh:dccca1090e4054d6558218406385fb0421ab4ac3b75e121641973be481a81f01", + "zh:9f8b909d3ec50ade83c8062290378b1ec553edef6a447c56dadc01a99f4eaa93", + "zh:aaef921ff9aabaf8b1869a86d692ebd24fbd4e12c21205034bb679b9caf883a2", + "zh:ac882313207aba00dd5a76dbd572a0ddc818bb9cbf5c9d61b28fe30efaec951e", + "zh:bb64e8aff37becab373a1a0cc1080990785304141af42ed6aa3dd4913b000421", + "zh:dfe495f6621df5540d9c92ad40b8067376350b005c637ea6efac5dc15028add4", + "zh:f0ddf0eaf052766cfe09dea8200a946519f653c384ab4336e2a4a64fdd6310e9", + "zh:f1b7e684f4c7ae1eed272b6de7d2049bb87a0275cb04dbb7cda6636f600699c9", + "zh:ff461571e3f233699bf690db319dfe46aec75e58726636a0d97dd9ac6e32fb70", ] } provider "registry.terraform.io/hashicorp/null" { - version = "3.2.4" + version = "3.3.1" hashes = [ - "h1:hkf5w5B6q8e2A42ND2CjAvgvSN3puAosDmOJb3zCVQM=", - "zh:59f6b52ab4ff35739647f9509ee6d93d7c032985d9f8c6237d1f8a59471bbbe2", + "h1:TuxJq10DVnRP7c5HBZPyyvQGcckNVfijyU1eXEu5e4M=", + "zh:08c59776542ea16e5a8545752787b17ff412922182b4cfabe16139197be8ac44", + "zh:123109cc7e5ed6d515787fbc212f2a3fd5e75647bb24ab7c801ccd4d4ed42451", + "zh:14b3fa4372754b54844b41d5dbd4671a292d8d6828b90169061feb4d7b15dd05", + "zh:56a4daaa3212f57b764bf3d1f333141c6610c5f21abb240e0111221f7c7fa4d4", "zh:78d5eefdd9e494defcb3c68d282b8f96630502cac21d1ea161f53cfe9bb483b3", - "zh:795c897119ff082133150121d39ff26cb5f89a730a2c8c26f3a9c1abf81a9c43", - "zh:7b9c7b16f118fbc2b05a983817b8ce2f86df125857966ad356353baf4bff5c0a", - "zh:85e33ab43e0e1726e5f97a874b8e24820b6565ff8076523cc2922ba671492991", - "zh:9d32ac3619cfc93eb3c4f423492a8e0f79db05fec58e449dee9b2d5873d5f69f", - "zh:9e15c3c9dd8e0d1e3731841d44c34571b6c97f5b95e8296a45318b94e5287a6e", - "zh:b4c2ab35d1b7696c30b64bf2c0f3a62329107bd1a9121ce70683dec58af19615", - "zh:c43723e8cc65bcdf5e0c92581dcbbdcbdcf18b8d2037406a5f2033b1e22de442", - "zh:ceb5495d9c31bfb299d246ab333f08c7fb0d67a4f82681fbf47f2a21c3e11ab5", - "zh:e171026b3659305c558d9804062762d168f50ba02b88b231d20ec99578a6233f", - "zh:ed0fe2acdb61330b01841fa790be00ec6beaac91d41f311fb8254f74eb6a711f", + "zh:7e888a026dbacd2474a42264227ae35f639780f0f0c613529d10a95cd61988b3", + "zh:85a53646267e87d600df7124e4767ffde9bba3b6356d45d961618bdd68131cc7", + "zh:8ffa0e9c7c39b2ab0905b472465d6e35ef0b776b3f6273bb34c150340b61bff1", + "zh:9846510a1841530d4403f4818e233f91e3b3bade7441047599fbf800742f65be", + "zh:afa98d44860875f037c6def0a7e6ff208e042712ba771f620482b143cd336891", + "zh:bdca130d9ef27488ae0b13bc8fd8019e8bbdd4f2ceff29da066bd333165d68c5", + "zh:cb3b94cbca88210dd0d1f11e2b8a89333f48c3857faf8f70f589072ce7c28610", + "zh:f0c0ba87925fe32f84b80f7513b1efb1b0866f51f899ba825e95ad59ff09b018", ] } diff --git a/terraform/aws/ansible_inventory_output.tf b/terraform/aws/ansible_inventory_output.tf index 6c19b3ce..6bc5d59c 100644 --- a/terraform/aws/ansible_inventory_output.tf +++ b/terraform/aws/ansible_inventory_output.tf @@ -35,7 +35,19 @@ locals { ) ] - mixer_hosts = [ + quorum_list_server_hosts = [ + for n in range(length(aws_instance.quorum_list_server)) : templatefile( + "${path.module}/templates/inventory/hostname.tpl", + { + index = n + 1 + name = element(aws_instance.quorum_list_server.*.tags.Hostname, n) + public_ip = element(aws_instance.quorum_list_server.*.public_ip, n) + private_ip = element(aws_instance.quorum_list_server.*.private_ip, n) + } + ) + ] + + mixer_hosts = [ for n in range(length(aws_instance.mixer)) : templatefile( "${path.module}/templates/inventory/hostname.tpl", { @@ -168,6 +180,7 @@ locals { local.web_hosts.*, local.logs_hosts.*, local.wallet_node_hosts.*, + local.quorum_list_server_hosts.*, local.mixer_hosts.*, local.seed_node_hosts.*, local.miner_hosts.*, @@ -178,16 +191,18 @@ locals { local.metrics_hosts.*, ), ) - web_hosts = join("\n", concat(aws_instance.web.*.tags.Hostname)) - logs_hosts = join("\n", concat(aws_instance.logs.*.tags.Hostname)) - wallet_node_hosts = join("\n", concat(aws_instance.dashd_wallet.*.tags.Hostname)) - mixer_hosts = join("\n", concat(aws_instance.mixer.*.tags.Hostname)) - miner_hosts = join("\n", concat(aws_instance.miner.*.tags.Hostname)) - masternode_hosts = join("\n", concat(aws_instance.masternode_amd.*.tags.Hostname), concat(aws_instance.masternode_arm.*.tags.Hostname)) - hp_masternode_hosts = join("\n", concat(aws_instance.hp_masternode_amd.*.tags.Hostname), concat(aws_instance.hp_masternode_arm.*.tags.Hostname)) - seed_hosts = join("\n", concat(aws_instance.seed_node.*.tags.Hostname)) - load_test_hosts = join("\n", concat(aws_instance.load_test.*.tags.Hostname)) - metrics_hosts = join("\n", concat(aws_instance.metrics.*.tags.Hostname)) + web_hosts = join("\n", concat(aws_instance.web.*.tags.Hostname)) + logs_hosts = join("\n", concat(aws_instance.logs.*.tags.Hostname)) + wallet_node_hosts = join("\n", concat(aws_instance.dashd_wallet.*.tags.Hostname)) + quorum_list_servers = join("\n", concat(aws_instance.quorum_list_server.*.tags.Hostname)) + quorum_list_server_port = var.quorum_list_server_port + mixer_hosts = join("\n", concat(aws_instance.mixer.*.tags.Hostname)) + miner_hosts = join("\n", concat(aws_instance.miner.*.tags.Hostname)) + masternode_hosts = join("\n", concat(aws_instance.masternode_amd.*.tags.Hostname), concat(aws_instance.masternode_arm.*.tags.Hostname)) + hp_masternode_hosts = join("\n", concat(aws_instance.hp_masternode_amd.*.tags.Hostname), concat(aws_instance.hp_masternode_arm.*.tags.Hostname)) + seed_hosts = join("\n", concat(aws_instance.seed_node.*.tags.Hostname)) + load_test_hosts = join("\n", concat(aws_instance.load_test.*.tags.Hostname)) + metrics_hosts = join("\n", concat(aws_instance.metrics.*.tags.Hostname)) } ) } diff --git a/terraform/aws/instances.tf b/terraform/aws/instances.tf index 57be76ca..baf6dc0f 100644 --- a/terraform/aws/instances.tf +++ b/terraform/aws/instances.tf @@ -159,6 +159,43 @@ resource "aws_instance" "miner" { } +resource "aws_instance" "quorum_list_server" { + count = var.quorum_list_server_count + + ami = var.main_host_arch == "arm64" ? data.aws_ami.ubuntu_arm.id : data.aws_ami.ubuntu_amd.id + instance_type = join(".", [var.main_host_arch == "arm64" ? "t4g" : "t3", var.quorum_list_server_instance_size]) + key_name = aws_key_pair.auth.id + iam_instance_profile = aws_iam_instance_profile.monitoring.name + + root_block_device { + volume_size = var.quorum_list_server_root_disk_size + volume_type = var.volume_type + } + + vpc_security_group_ids = [ + aws_security_group.default.id, + aws_security_group.quorum_list_server.id, + ] + + subnet_id = element(aws_subnet.public.*.id, count.index) + + volume_tags = { + Name = "dn-${terraform.workspace}-quorum-list-server-${count.index + 1}" + Hostname = "quorum-list-server-${count.index + 1}" + DashNetwork = terraform.workspace + } + + tags = { + Name = "dn-${terraform.workspace}-quorum-list-server-${count.index + 1}" + Hostname = "quorum-list-server-${count.index + 1}" + DashNetwork = terraform.workspace + } + + lifecycle { + ignore_changes = [ami] + } +} + # masternodes (amd) resource "aws_instance" "masternode_amd" { count = var.masternode_amd_count diff --git a/terraform/aws/main.tf b/terraform/aws/main.tf index 3845f5ad..16656f43 100644 --- a/terraform/aws/main.tf +++ b/terraform/aws/main.tf @@ -331,6 +331,80 @@ resource "aws_route53_record" "insight" { count = length(var.main_domain) > 1 ? 1 : 0 } +resource "aws_elb" "quorum_list_server" { + name = "${var.public_network_name}-quorums" + + subnets = aws_subnet.public.*.id + + count = var.quorum_list_server_count > 0 && length(var.main_domain) > 1 ? 1 : 0 + + security_groups = [ + aws_security_group.elb.id, + ] + + instances = aws_instance.quorum_list_server.*.id + + listener { + instance_port = var.quorum_list_server_port + instance_protocol = "http" + lb_port = 443 + lb_protocol = "https" + ssl_certificate_id = aws_acm_certificate_validation.quorum_list_server[0].certificate_arn + } + + health_check { + healthy_threshold = 2 + interval = 30 + target = "HTTP:${var.quorum_list_server_port}/health" + timeout = 10 + unhealthy_threshold = 5 + } + + tags = { + Name = "dn-${terraform.workspace}-quorum-list-server" + DashNetwork = terraform.workspace + } +} + +resource "aws_acm_certificate" "quorum_list_server" { + count = var.quorum_list_server_count > 0 && length(var.main_domain) > 1 ? 1 : 0 + domain_name = "quorums.${var.public_network_name}.${var.main_domain}" + validation_method = "DNS" +} + +resource "aws_route53_record" "quorum_list_server_validation" { + for_each = var.quorum_list_server_count > 0 && length(var.main_domain) > 1 ? { + for dvo in aws_acm_certificate.quorum_list_server[0].domain_validation_options : dvo.domain_name => { + name = dvo.resource_record_name + record = dvo.resource_record_value + type = dvo.resource_record_type + } + } : {} + + zone_id = data.aws_route53_zone.main_domain[0].zone_id + allow_overwrite = true + name = each.value.name + records = [each.value.record] + ttl = 60 + type = each.value.type +} + +resource "aws_acm_certificate_validation" "quorum_list_server" { + count = var.quorum_list_server_count > 0 && length(var.main_domain) > 1 ? 1 : 0 + certificate_arn = aws_acm_certificate.quorum_list_server[0].arn + validation_record_fqdns = [for record in aws_route53_record.quorum_list_server_validation : record.fqdn] +} + +resource "aws_route53_record" "quorum_list_server" { + zone_id = data.aws_route53_zone.main_domain[count.index].zone_id + name = "quorums.${var.public_network_name}.${var.main_domain}" + type = "CNAME" + ttl = "300" + records = [aws_elb.quorum_list_server[count.index].dns_name] + + count = var.quorum_list_server_count > 0 && length(var.main_domain) > 1 ? 1 : 0 +} + resource "aws_elb" "status" { name = "${var.public_network_name}-status" diff --git a/terraform/aws/security_groups.tf b/terraform/aws/security_groups.tf index 663eb0e3..e4aa3686 100644 --- a/terraform/aws/security_groups.tf +++ b/terraform/aws/security_groups.tf @@ -226,6 +226,25 @@ resource "aws_security_group" "http" { } } +resource "aws_security_group" "quorum_list_server" { + name = "${terraform.workspace}-quorum-list-server" + description = "standalone quorum list server" + vpc_id = aws_vpc.default.id + + ingress { + from_port = var.quorum_list_server_port + to_port = var.quorum_list_server_port + protocol = "tcp" + description = "Quorum list server API" + security_groups = [aws_security_group.elb.id] + } + + tags = { + Name = "dn-${terraform.workspace}-quorum-list-server" + DashNetwork = terraform.workspace + } +} + resource "aws_security_group" "logs" { name = "${terraform.workspace}-logs" description = "logs node" diff --git a/terraform/aws/templates/inventory/ansible_inventory.tpl b/terraform/aws/templates/inventory/ansible_inventory.tpl index 58be98a3..b22d302c 100644 --- a/terraform/aws/templates/inventory/ansible_inventory.tpl +++ b/terraform/aws/templates/inventory/ansible_inventory.tpl @@ -9,6 +9,12 @@ ${logs_hosts} [wallet_nodes] ${wallet_node_hosts} +[quorum_list_servers] +${quorum_list_servers} + +[quorum_list_servers:vars] +quorum_list_server_port=${quorum_list_server_port} + [mixer_nodes] ${mixer_hosts} diff --git a/terraform/aws/variables.tf b/terraform/aws/variables.tf index a40e8bfe..b079078b 100644 --- a/terraform/aws/variables.tf +++ b/terraform/aws/variables.tf @@ -41,6 +41,16 @@ variable "status_port" { default = 3010 } +variable "quorum_list_server_count" { + description = "Number of standalone quorum-list-server instances to create" + default = 0 +} + +variable "quorum_list_server_port" { + description = "HTTP port for the standalone quorum-list-server API" + default = 8080 +} + variable "ssh_port" { description = "SSH port" default = 22 @@ -266,6 +276,16 @@ variable "wallet_node_instance_size" { default = "micro" } +variable "quorum_list_server_instance_size" { + description = "Instance size of quorum-list-server nodes" + default = "micro" +} + +variable "quorum_list_server_root_disk_size" { + description = "Root disk size of quorum-list-server nodes" + default = 20 +} + variable "volume_type" { description = "Type of volume to use for block devices" default = "gp3"