diff --git a/service-provider-setup/README.md b/service-provider-setup/README.md index cfb9745..6a9cc78 100644 --- a/service-provider-setup/README.md +++ b/service-provider-setup/README.md @@ -62,14 +62,13 @@ To get started, follow the [installation](../README.md#installation) guide to se # password of the user you want to setup on the target host password: "" - # path to the ssh key on your machine, eg: "/home/dev/.ssh/id_rsa.pub" + # path to the ssh key on your machine, eg: "/home/user/.ssh/id_rsa.pub" path_to_ssh_key: "" ``` - Execute the `setup-user.yml` Ansible playbook to create a user with passwordless sudo permissions: ```bash - cd ../ LANG=en_US.utf8 ansible-playbook setup-user.yml -i hosts.ini --extra-vars='{ "target_host": "deployment_host" }' ``` @@ -118,6 +117,8 @@ To get started, follow the [installation](../README.md#installation) guide to se authority_name: "" # eg: my-org-name cpu_reservation: "" # Minimum number of cpu cores to be used, eg: 2 memory_reservation: "" # Minimum amount of memory in GB to be used, eg: 4G + cpu_limit: "" # Maximum number of cpu cores to be used, eg: 6 + memory_limit: "" # Maximum amount of memory in GB to be used, eg: 8G deployer_gpg_passphrase: "" # passphrase for creating GPG key used by webapp-deployer, eg: SECRET ``` @@ -161,3 +162,13 @@ To get started, follow the [installation](../README.md#installation) guide to se ```bash LANG=en_US.utf8 ansible-playbook service-provider-setup.yml -i hosts.ini --extra-vars='{ target_host: "deployment_host" }' --user $USER ``` + +### Result + +After the playbook finishes executing, the following services will be deployed (your setup should look similar to the example below): + +- laconicd chain RPC endpoint: http://lcn-daemon.laconic.com:26657 +- laconic console: http://lcn-daemon.laconic.com:8080/registry +- laconicd GQL endpoint: http://lcn-daemon.laconic.com:9473/api +- webapp deployer API: https://webapp-deployer-api.pwa.laconic.com +- webapp deployer UI: https://webapp-deployer-ui.pwa.laconic.com diff --git a/service-provider-setup/run-laconic-console.yml b/service-provider-setup/run-laconic-console.yml index 43655e7..d47e3dd 100644 --- a/service-provider-setup/run-laconic-console.yml +++ b/service-provider-setup/run-laconic-console.yml @@ -48,6 +48,19 @@ set_fact: ALICE_PK: "{{ alice_pk.stdout }}" + - name: Check if DNS resolves for daemon + command: getent ahosts {{ org_id }}-daemon.{{ full_domain }} + register: dns_check + retries: 5 + delay: 5 + until: dns_check.rc == 0 + ignore_errors: yes + + - name: Fail if DNS does not resolve after retries + fail: + msg: "DNS resolution failed for example.com after 5 retries" + when: dns_check.rc != 0 + - name: Start the laconic console deployment command: laconic-so deployment --dir laconic-console-deployment start diff --git a/service-provider-setup/setup-dns.yml b/service-provider-setup/setup-dns.yml index 18d6c18..1e7d424 100644 --- a/service-provider-setup/setup-dns.yml +++ b/service-provider-setup/setup-dns.yml @@ -3,6 +3,7 @@ vars_files: - vars/dns-vars.yml + - vars/k8s-vars.yml tasks: - name: Create a domain @@ -21,6 +22,15 @@ name: "{{ subdomain_prefix }}-cluster-control" data: "{{ service_provider_ip }}" + - name: Create record for daemon machine + community.digitalocean.digital_ocean_domain_record: + state: present + oauth_token: "{{ do_api_token }}" + domain: "{{ full_domain }}" + type: A + name: "{{ org_id }}-daemon" + data: "{{ service_provider_ip }}" + - name: Create CNAME record for www community.digitalocean.digital_ocean_domain_record: state: present @@ -38,16 +48,57 @@ data: "{{ subdomain_cluster_control }}.{{ full_domain }}" domain: "{{ full_domain }}" type: CNAME - name: "{{ subdomain_prefix }}" + name: "{{ subdomain_prefix }}.{{ full_domain }}" ttl: 43200 - - name: Create wildcard CNAME record for subdomain + - name: Create CNAME record for laconicd endpoint community.digitalocean.digital_ocean_domain_record: state: present oauth_token: "{{ do_api_token }}" - data: "{{ subdomain_cluster_control }}.{{ full_domain }}" + data: "{{ org_id }}-daemon.{{ full_domain }}" domain: "{{ full_domain }}" type: CNAME + name: "laconicd.{{ full_domain }}" + ttl: 43200 + + - name: Create CNAME record for backend + community.digitalocean.digital_ocean_domain_record: + state: present + oauth_token: "{{ do_api_token }}" + data: "{{ org_id }}-daemon.{{ full_domain }}" + domain: "{{ full_domain }}" + type: CNAME + name: "{{ org_id }}-backend.{{ full_domain }}" + ttl: 43200 + + - name: Create CNAME record for console + community.digitalocean.digital_ocean_domain_record: + state: present + oauth_token: "{{ do_api_token }}" + data: "{{ org_id }}-daemon.{{ full_domain }}" + domain: "{{ full_domain }}" + type: CNAME + name: "{{ org_id }}-console.{{ full_domain }}" + ttl: 43200 + + - name: Create CNAME record for org and location + community.digitalocean.digital_ocean_domain_record: + state: present + oauth_token: "{{ do_api_token }}" + data: "{{ org_id }}-daemon.{{ full_domain }}" + domain: "{{ full_domain }}" + type: CNAME + name: "{{ subdomain_prefix }}" + ttl: 43200 + + - name: Create wildcard A record for subdomain + community.digitalocean.digital_ocean_domain_record: + state: present + oauth_token: "{{ do_api_token }}" + name: "{{ subdomain_cluster_control }}.{{ full_domain }}" + data: "{{ service_provider_ip }}" + domain: "{{ full_domain }}" + type: A name: "*.{{ subdomain_prefix }}" ttl: 43200 @@ -61,12 +112,13 @@ name: "pwa" ttl: 43200 - - name: Create wildcard CNAME record for pwa + - name: Create wildcard A record for pwa community.digitalocean.digital_ocean_domain_record: state: present oauth_token: "{{ do_api_token }}" - data: "{{ subdomain_cluster_control }}.{{ full_domain }}" + name: "{{ subdomain_cluster_control }}.{{ full_domain }}" + data: "{{ service_provider_ip }}" domain: "{{ full_domain }}" - type: CNAME + type: A name: "*.pwa" ttl: 43200 diff --git a/service-provider-setup/setup-k8s.yml b/service-provider-setup/setup-k8s.yml index e28e8c6..bb46a95 100644 --- a/service-provider-setup/setup-k8s.yml +++ b/service-provider-setup/setup-k8s.yml @@ -28,6 +28,7 @@ name: "{{ ansible_user }}" groups: docker append: true + become: yes - name: Install Ansible on remote host pip: diff --git a/service-provider-setup/setup-system.yml b/service-provider-setup/setup-system.yml index b729e45..9c71616 100644 --- a/service-provider-setup/setup-system.yml +++ b/service-provider-setup/setup-system.yml @@ -48,6 +48,7 @@ hostname: name: "{{ inventory_hostname }}" when: ansible_hostname != inventory_hostname + become: yes - name: Verify status of firewalld and enable sshguard systemd: @@ -72,11 +73,13 @@ - snapd.seeded - snapd.snap-repair.timer ignore_errors: yes + become: yes - name: Purge snapd apt: name: snapd state: absent + become: yes - name: Remove snap directories file: diff --git a/service-provider-setup/templates/configs/console-config.env.j2 b/service-provider-setup/templates/configs/console-config.env.j2 index 6c0e8a9..c9e72b3 100644 --- a/service-provider-setup/templates/configs/console-config.env.j2 +++ b/service-provider-setup/templates/configs/console-config.env.j2 @@ -1,5 +1,5 @@ CERC_LACONICD_USER_KEY={{ALICE_PK}} CERC_LACONICD_BOND_ID={{BOND_ID}} -CERC_LACONICD_RPC_ENDPOINT=http://{{ org_id }}-{{ location_id }}-cluster-control.{{ full_domain }}:26657 -CERC_LACONICD_GQL_ENDPOINT=http://{{ org_id }}-{{ location_id }}-cluster-control.{{ full_domain }}:9473/api -LACONIC_HOSTED_ENDPOINT=http://{{ org_id }}-{{ location_id }}-cluster-control.{{ full_domain }}:9473 +CERC_LACONICD_RPC_ENDPOINT=http://{{ org_id }}-daemon.{{ full_domain }}:26657 +CERC_LACONICD_GQL_ENDPOINT=http://{{ org_id }}-daemon.{{ full_domain }}:9473/api +LACONIC_HOSTED_ENDPOINT=http://{{ org_id }}-daemon.{{ full_domain }}:9473 diff --git a/service-provider-setup/templates/configs/webapp-ui-config.env.j2 b/service-provider-setup/templates/configs/webapp-ui-config.env.j2 index c31574e..2836229 100644 --- a/service-provider-setup/templates/configs/webapp-ui-config.env.j2 +++ b/service-provider-setup/templates/configs/webapp-ui-config.env.j2 @@ -1,3 +1,3 @@ CERC_WEBAPP_DEBUG=0.1.0 LACONIC_HOSTED_CONFIG_app_api_url=https://webapp-deployer-api.pwa.{{ full_domain }} -LACONIC_HOSTED_CONFIG_app_console_link=http://{{ org_id }}-{{ location_id }}-cluster-control.{{ full_domain }}:9473/console?query=%0A%20%20fragment%20ValueParts%20on%20Value%20%7B%0A%20%20%20%20...%20on%20BooleanValue%20%7B%0A%20%20%20%20%20%20bool%3A%20value%0A%20%20%20%20%7D%0A%20%20%20%20...%20on%20IntValue%20%7B%0A%20%20%20%20%20%20int%3A%20value%0A%20%20%20%20%7D%0A%20%20%20%20...%20on%20FloatValue%20%7B%0A%20%20%20%20%20%20float%3A%20value%0A%20%20%20%20%7D%0A%20%20%20%20...%20on%20StringValue%20%7B%0A%20%20%20%20%20%20string%3A%20value%0A%20%20%20%20%7D%0A%20%20%20%20...%20on%20BytesValue%20%7B%0A%20%20%20%20%20%20bytes%3A%20value%0A%20%20%20%20%7D%0A%20%20%20%20...%20on%20LinkValue%20%7B%0A%20%20%20%20%20%20link%3A%20value%0A%20%20%20%20%7D%0A%20%20%7D%0A%0A%20%20fragment%20AttrParts%20on%20Attribute%20%7B%0A%20%20%20%20key%0A%20%20%20%20value%20%7B%0A%20%20%20%20%20%20...ValueParts%0A%20%20%20%20%20%20...%20on%20ArrayValue%20%7B%0A%20%20%20%20%20%20%20%20value%20%7B%0A%20%20%20%20%20%20%20%20%20%20...ValueParts%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%0A%20%20%7D%0A%0A%20%20%7B%0A%20%20%20%20getRecordsByIds(ids%3A%20%5B%22#RQID#%22%5D)%20%7B%0A%20%20%20%20%20%20id%0A%20%20%20%20%20%20names%0A%20%20%20%20%20%20bondId%0A%20%20%20%20%20%20createTime%0A%20%20%20%20%20%20expiryTime%0A%20%20%20%20%20%20owners%0A%20%20%20%20%20%20attributes%20%7B%0A%20%20%20%20%20%20%20%20...AttrParts%0A%20%20%20%20%20%20%20%20value%20%7B%0A%20%20%20%20%20%20%20%20%20%20...%20on%20MapValue%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20map%3A%20value%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20...AttrParts%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%0A%20%20%7D%0A +LACONIC_HOSTED_CONFIG_app_console_link=http://{{ org_id }}-daemon.{{ full_domain }}:9473/console?query=%0A%20%20fragment%20ValueParts%20on%20Value%20%7B%0A%20%20%20%20...%20on%20BooleanValue%20%7B%0A%20%20%20%20%20%20bool%3A%20value%0A%20%20%20%20%7D%0A%20%20%20%20...%20on%20IntValue%20%7B%0A%20%20%20%20%20%20int%3A%20value%0A%20%20%20%20%7D%0A%20%20%20%20...%20on%20FloatValue%20%7B%0A%20%20%20%20%20%20float%3A%20value%0A%20%20%20%20%7D%0A%20%20%20%20...%20on%20StringValue%20%7B%0A%20%20%20%20%20%20string%3A%20value%0A%20%20%20%20%7D%0A%20%20%20%20...%20on%20BytesValue%20%7B%0A%20%20%20%20%20%20bytes%3A%20value%0A%20%20%20%20%7D%0A%20%20%20%20...%20on%20LinkValue%20%7B%0A%20%20%20%20%20%20link%3A%20value%0A%20%20%20%20%7D%0A%20%20%7D%0A%0A%20%20fragment%20AttrParts%20on%20Attribute%20%7B%0A%20%20%20%20key%0A%20%20%20%20value%20%7B%0A%20%20%20%20%20%20...ValueParts%0A%20%20%20%20%20%20...%20on%20ArrayValue%20%7B%0A%20%20%20%20%20%20%20%20value%20%7B%0A%20%20%20%20%20%20%20%20%20%20...ValueParts%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%0A%20%20%7D%0A%0A%20%20%7B%0A%20%20%20%20getRecordsByIds(ids%3A%20%5B%22#RQID#%22%5D)%20%7B%0A%20%20%20%20%20%20id%0A%20%20%20%20%20%20names%0A%20%20%20%20%20%20bondId%0A%20%20%20%20%20%20createTime%0A%20%20%20%20%20%20expiryTime%0A%20%20%20%20%20%20owners%0A%20%20%20%20%20%20attributes%20%7B%0A%20%20%20%20%20%20%20%20...AttrParts%0A%20%20%20%20%20%20%20%20value%20%7B%0A%20%20%20%20%20%20%20%20%20%20...%20on%20MapValue%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20map%3A%20value%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20...AttrParts%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%0A%20%20%7D%0A diff --git a/service-provider-setup/templates/laconic.yml.j2 b/service-provider-setup/templates/laconic.yml.j2 index dd09501..c9e625a 100644 --- a/service-provider-setup/templates/laconic.yml.j2 +++ b/service-provider-setup/templates/laconic.yml.j2 @@ -1,7 +1,7 @@ services: registry: - rpcEndpoint: 'http://{{ subdomain_cluster_control }}.{{ full_domain }}:26657' - gqlEndpoint: 'http://{{ subdomain_cluster_control}}.{{ full_domain }}:9473/api' + rpcEndpoint: 'http://{{ org_id }}-daemon.{{ full_domain }}:26657' + gqlEndpoint: 'http://{{ org_id }}-daemon.{{ full_domain }}:9473/api' userKey: "{{ ALICE_PK }}" bondId: "{{ BOND_ID }}" chainId: lorotestnet-1 diff --git a/service-provider-setup/templates/specs/webapp-deployer.spec.j2 b/service-provider-setup/templates/specs/webapp-deployer.spec.j2 index b1a037b..71e7f3a 100644 --- a/service-provider-setup/templates/specs/webapp-deployer.spec.j2 +++ b/service-provider-setup/templates/specs/webapp-deployer.spec.j2 @@ -25,11 +25,11 @@ security: resources: containers: reservations: - cpus: "{{ cpu_reservation }}" - memory: "{{ memory_reservation }}" + cpus: {{ cpu_reservation }} + memory: {{ memory_reservation }} limits: - cpus: 6 - memory: 16G + cpus: {{ cpu_limit }} + memory: {{ memory_limit }} volumes: reservations: storage: 200G diff --git a/service-provider-setup/vars/webapp-vars.example.yml b/service-provider-setup/vars/webapp-vars.example.yml index 04aa3fb..491192c 100644 --- a/service-provider-setup/vars/webapp-vars.example.yml +++ b/service-provider-setup/vars/webapp-vars.example.yml @@ -3,4 +3,6 @@ BOND_ID: "{{ BOND_ID }}" authority_name: "" cpu_reservation: "" memory_reservation: "" +cpu_limit: "6" +memory_limit: "8G" deployer_gpg_passphrase: ""