From ebfece8f56ef18ba6dbb413778fbf7f56de06683 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jakub=20Soko=C5=82owski?= Date: Mon, 13 May 2024 10:30:52 +0200 Subject: [PATCH] service: move config flags to separate TOML file MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This can be useful in the future to expose config. It also makes it easier to run service by hand when debugging. Signed-off-by: Jakub SokoĊ‚owski --- README.md | 78 +++++++++++++++--------------- defaults/main.yml | 8 ++- tasks/config.yml | 7 +++ tasks/service.yml | 71 +++------------------------ templates/config.toml.j2 | 102 +++++++++++++++++++++++++++++++++++++++ 5 files changed, 164 insertions(+), 102 deletions(-) create mode 100644 templates/config.toml.j2 diff --git a/README.md b/README.md index 8facc15..c93ccdf 100644 --- a/README.md +++ b/README.md @@ -45,55 +45,57 @@ beacon_node_exec_layer_urls: ``` The order of Web Socket URLs matters. First is the default, the rest are fallbacks. +Most non-sensitive configuration resides in `conf/config.toml` file in service directory. + # Management ## Service The services are managed using [WinSW](https://github.com/winsw/winsw). ``` -admin@windows-01 MINGW64 .../nimbus/beacon-node-prater-stable -$ ls -l -total 665 --rwxr-xr-x 1 admin 197121 655872 Jul 16 14:37 beacon-node-prater-stable.exe* --rw-r--r-- 1 admin 197121 1358 Oct 26 09:02 beacon-node-prater-stable.yml -drwxr-xr-x 1 admin 197121 0 Oct 21 13:23 bin/ --rwxr-xr-x 1 admin 197121 2639 Oct 7 07:51 build.sh* -drwxr-xr-x 1 admin 197121 0 Jul 16 14:49 data/ -drwxr-xr-x 1 admin 197121 0 Oct 26 09:03 logs/ -drwxr-xr-x 1 admin 197121 0 Oct 21 13:03 repo/ +admin@windows-01 MINGW64 .../nimbus/beacon-node-prater-stable +$ ls -l +total 665 +-rwxr-xr-x 1 admin 197121 655872 Jul 16 14:37 beacon-node-prater-stable.exe* +-rw-r--r-- 1 admin 197121 1358 Oct 26 09:02 beacon-node-prater-stable.yml +drwxr-xr-x 1 admin 197121 0 Oct 21 13:23 bin/ +-rwxr-xr-x 1 admin 197121 2639 Oct 7 07:51 build.sh* +drwxr-xr-x 1 admin 197121 0 Jul 16 14:49 data/ +drwxr-xr-x 1 admin 197121 0 Oct 26 09:03 logs/ +drwxr-xr-x 1 admin 197121 0 Oct 21 13:03 repo/ -rwxr-xr-x 1 admin 197121 682 Oct 7 07:51 rpc.sh* -admin@windows-01 MINGW64 .../nimbus/beacon-node-prater-stable -$ ./beacon-node-prater-stable.exe status -Started - -admin@windows-01 MINGW64 .../nimbus/beacon-node-prater-stable -$ ./beacon-node-prater-stable.exe restart -2021-09-29 17:33:27,563 INFO - Stopping service 'Beacon Node prater (stale) (beacon-node-prater-stable)'... -2021-09-29 17:33:27,825 INFO - Starting service 'Beacon Node prater (stale) (beacon-node-prater-stable)'... -2021-09-29 17:33:28,366 INFO - Service 'Beacon Node prater (stale) (beacon-node-prater-stable)' restarted successfully. +admin@windows-01 MINGW64 .../nimbus/beacon-node-prater-stable +$ ./beacon-node-prater-stable.exe status +Started + +admin@windows-01 MINGW64 .../nimbus/beacon-node-prater-stable +$ ./beacon-node-prater-stable.exe restart +2021-09-29 17:33:27,563 INFO - Stopping service 'Beacon Node prater (stale) (beacon-node-prater-stable)'... +2021-09-29 17:33:27,825 INFO - Starting service 'Beacon Node prater (stale) (beacon-node-prater-stable)'... +2021-09-29 17:33:28,366 INFO - Service 'Beacon Node prater (stale) (beacon-node-prater-stable)' restarted successfully. ``` ## Builds Builds are performed via a Bash `build.sh` script located in the service directory. ``` -admin@windows-01 MINGW64 .../nimbus/beacon-node-prater-stable -$ ./build.sh - >>> Fetching changes... -HEAD is now at 9e8081e4 Merge branch 'stable' into unstable - >>> Binaries already built. - >>> No binaries required update. +admin@windows-01 MINGW64 .../nimbus/beacon-node-prater-stable +$ ./build.sh + >>> Fetching changes... +HEAD is now at 9e8081e4 Merge branch 'stable' into unstable + >>> Binaries already built. + >>> No binaries required update. >>> SUCCESS! ``` The scheduled tasks that trigger node builds can be checked with `Get-ScheduledTask`: ```log -PS C:\Users\admin> Get-ScheduledTask -TaskName 'build-beacon-node*' | ft State,TaskName,Description,Date - -State TaskName Description Date ------ -------- ----------- ---- -Ready build-beacon-node-prater-stable Daily rebuild of Nimbus beacon node binaries 2021-09-29T13:00:00 -Ready build-beacon-node-prater-testing Daily rebuild of Nimbus beacon node binaries 2021-09-29T17:00:00 +PS C:\Users\admin> Get-ScheduledTask -TaskName 'build-beacon-node*' | ft State,TaskName,Description,Date + +State TaskName Description Date +----- -------- ----------- ---- +Ready build-beacon-node-prater-stable Daily rebuild of Nimbus beacon node binaries 2021-09-29T13:00:00 +Ready build-beacon-node-prater-testing Daily rebuild of Nimbus beacon node binaries 2021-09-29T17:00:00 Ready build-beacon-node-prater-unstable Daily rebuild of Nimbus beacon node binaries 2021-09-29T15:00:00 ``` The task can be started using [`Start-ScheduledTask`](https://docs.microsoft.com/en-us/powershell/module/scheduledtasks/start-scheduledtask) and its logs can be looked up using [`Get-WinEvent`](https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.diagnostics/get-winevent): @@ -110,13 +112,13 @@ TimeCreated Message And the logs from the build script itself can be found in the `logs` directory: ``` -admin@windows-01 MINGW64 .../nimbus/beacon-node-prater-stable -$ tail -n5 logs/build.log - >>> Fetching changes... -HEAD is now at 9e8081e4 Merge branch 'stable' into unstable - >>> Binaries already built. - >>> No binaries required update. - >>> SUCCESS! +admin@windows-01 MINGW64 .../nimbus/beacon-node-prater-stable +$ tail -n5 logs/build.log + >>> Fetching changes... +HEAD is now at 9e8081e4 Merge branch 'stable' into unstable + >>> Binaries already built. + >>> No binaries required update. + >>> SUCCESS! ``` # Known Issues diff --git a/defaults/main.yml b/defaults/main.yml index 2739cb3..46bec88 100644 --- a/defaults/main.yml +++ b/defaults/main.yml @@ -1,10 +1,13 @@ ---- + beacon_node_service_name: 'beacon-node-{{ beacon_node_network }}-{{ beacon_node_repo_branch }}' beacon_node_service_user_name: 'nimbus' beacon_node_service_user_pass: '{{ ansible_date_time.epoch | password_hash("sha512") }}' beacon_node_service_home: 'C:\Users\{{ beacon_node_service_user_name }}' beacon_node_service_path: '{{ beacon_node_service_home }}\{{ beacon_node_service_name }}' beacon_node_data_path: '{{ beacon_node_service_path }}\data' +beacon_node_config_path: '{{ beacon_node_service_path }}\conf' +beacon_node_config_file_path: '{{ beacon_node_config_path }}\config.toml' +beacon_node_netkey_path: '{{ beacon_node_data_path }}\netkey' beacon_node_era_dir_path: '{{ beacon_node_data_path }}\era' beacon_node_secrets_path: '{{ beacon_node_data_path }}\secrets' beacon_node_validators_path: '{{ beacon_node_data_path }}\validators' @@ -28,8 +31,11 @@ beacon_node_network: 'mainnet' beacon_node_log_level: 'INFO' # TRACE DEBUG INFO NOTICE WARN ERROR FATAL NONE beacon_node_log_format: 'json' # auto colors nocolors json none beacon_node_history_retention: 'prune' # archive / prune +beacon_node_sync_light_client: false beacon_node_subscribe_all: false beacon_node_doppelganger_detection: true +# Ability to prevernt restarts after service changes. +beacon_node_service_restart: true beacon_node_extra_flags: [] # Validator Monitoring diff --git a/tasks/config.yml b/tasks/config.yml index 4f05664..e9d9972 100644 --- a/tasks/config.yml +++ b/tasks/config.yml @@ -5,6 +5,7 @@ state: 'directory' with_items: - '{{ beacon_node_service_path }}' + - '{{ beacon_node_config_path }}' - '{{ beacon_node_service_logs_path }}' - '{{ beacon_node_data_path }}' @@ -50,3 +51,9 @@ win_owner: path: '{{ beacon_node_exec_layer_jwt_secret_path }}' user: '{{ beacon_node_service_user_name }}' + +- name: Create node config + win_template: + src: 'config.toml.j2' + dest: '{{ beacon_node_config_file_path }}' + register: beacon_node_config_file diff --git a/tasks/service.yml b/tasks/service.yml index 2d232d9..c8ef190 100644 --- a/tasks/service.yml +++ b/tasks/service.yml @@ -4,74 +4,19 @@ vars: winsw_service_name: 'Beacon Node {{ beacon_node_network }} ({{ beacon_node_repo_branch }})' winsw_service_description: 'Nimbus Eth2 Beacon Node running on {{ beacon_node_network }} network using {{ beacon_node_repo_branch }} branch.' - winsw_service_id: '{{ beacon_node_service_name }}' - winsw_service_path: '{{ beacon_node_service_path }}' - winsw_service_user: '{{ beacon_node_service_user_name }}' - winsw_service_logon_enabled: true + winsw_service_id: '{{ beacon_node_service_name }}' + winsw_service_path: '{{ beacon_node_service_path }}' + winsw_service_user: '{{ beacon_node_service_user_name }}' + winsw_service_restart: '{{ beacon_node_config_file.changed }}' winsw_service_logon_domain: '{{ ansible_netbios_name }}' - winsw_service_logon_pass: '{{ beacon_node_service_user_pass }}' + winsw_service_logon_pass: '{{ beacon_node_service_user_pass }}' + winsw_service_logon_enabled: true winsw_service_log_size: 1024000 winsw_service_log_keep: 10 winsw_service_log_stderr_disabled: true - winsw_service_exe_path: '{{ beacon_node_service_exe }}' + winsw_service_exe_path: '{{ beacon_node_service_exe }}' winsw_service_arguments: | - --non-interactive - --network={{ beacon_node_network }} - --data-dir="{{ beacon_node_data_path }}" - --secrets-dir="{{ beacon_node_secrets_path }}" - --validators-dir="{{ beacon_node_validators_path }}" - --era-dir="{{ beacon_node_era_dir_path }}" - --history="{{ beacon_node_history_retention }}" - {% if beacon_node_exec_layer_urls|length == 0 %} - --no-el=true - {% else %} - {% for url in beacon_node_exec_layer_urls | mandatory %} - --el="{{ url | mandatory }}" - {% endfor %} - {% endif %} - {% if beacon_node_exec_layer_jwt_secret is defined %} - --jwt-secret="{{ beacon_node_exec_layer_jwt_secret_path | mandatory }}" - {% endif %} + --config-file={{ beacon_node_config_file_path }} {% if beacon_node_suggested_fee_recipient is defined %} --suggested-fee-recipient={{ beacon_node_suggested_fee_recipient | mandatory }} {% endif %} - --log-format={{ beacon_node_log_format }} - --log-level={{ beacon_node_log_level }} - --nat=extip:{{ beacon_node_public_address }} - --tcp-port={{ beacon_node_listening_port }} - --udp-port={{ beacon_node_discovery_port }} - --max-peers={{ beacon_node_max_peers }} - --num-threads={{ beacon_node_threads }} - --insecure-netkey-password=true - --subscribe-all-subnets={{ beacon_node_subscribe_all | to_json }} - --doppelganger-detection={{ beacon_node_doppelganger_detection | to_json }} - --rest={{ beacon_node_rest_enabled | to_json }} - {% if beacon_node_rest_enabled %} - --rest-address={{ beacon_node_rest_address }} - --rest-port={{ beacon_node_rest_port }} - --rest-max-body-size={{ beacon_node_rest_max_body_size | mandatory }} - --rest-max-headers-size={{ beacon_node_rest_max_headers_size | mandatory }} - {% if beacon_node_rest_allow_origin != '' %} - --rest-allow-origin="{{ beacon_node_rest_allow_origin }}" - {% endif %} - {% endif %} - --metrics={{ beacon_node_metrics_enabled | to_json }} - {% if beacon_node_metrics_enabled %} - --metrics-address={{ beacon_node_metrics_address }} - --metrics-port={{ beacon_node_metrics_port }} - {% endif %} - --validator-monitor-auto={{ beacon_node_validator_monitor_auto | to_json }} - --validator-monitor-details={{ beacon_node_validator_monitor_details | to_json }} - {% for pubkey in beacon_node_validator_monitor_pubkeys %} - --validator-monitor-pubkey={{ pubkey }} - {% endfor %} - {% if beacon_node_light_client_data_enabled %} - --light-client-data-serve={{ beacon_node_light_client_data_serve | to_json }} - --light-client-data-import-mode={{ beacon_node_light_client_data_import_mode }} - {% if beacon_node_light_client_data_max_periods >= 0 %} - --light-client-data-max-periods={{ beacon_node_light_client_data_max_periods }} - {% endif %} - {% endif %} - {% for extra_flag in beacon_node_extra_flags %} - {{ extra_flag }} - {% endfor %} diff --git a/templates/config.toml.j2 b/templates/config.toml.j2 new file mode 100644 index 0000000..32a7ed8 --- /dev/null +++ b/templates/config.toml.j2 @@ -0,0 +1,102 @@ +# Hostname: {{ dns_entry }} + +## WARNING: Do not put sensitive configuration here. Use service definition. + +### General +network = {{ beacon_node_network | to_json }} +history = {{ beacon_node_history_retention | to_json }} +num-threads = {{ beacon_node_threads }} +sync-light-client = {{ beacon_node_sync_light_client | to_json }} +subscribe-all-subnets = {{ beacon_node_subscribe_all | to_json }} +non-interactive = true + +### Logs +log-format = {{ beacon_node_log_format | to_json }} +log-level = {{ beacon_node_log_level | to_json }} + +### Network +nat = "extip:{{ beacon_node_public_address }}" +tcp-port = {{ beacon_node_listening_port }} +udp-port = {{ beacon_node_discovery_port }} +max-peers = {{ beacon_node_max_peers }} + +### Exec Layer +{% if beacon_node_exec_layer_urls|length == 0 %} +no-el = true +{% else %} +{% if beacon_node_exec_layer_urls %} +el = [ +{% for url in beacon_node_exec_layer_urls | mandatory %} + {{ url | mandatory | to_json }}, +{% endfor %}] +{% else %} +el = [] +{% endif %} +{% endif %} + +### Dirs +data-dir = {{ beacon_node_data_path | to_json }} +secrets-dir = {{ beacon_node_secrets_path | to_json }} +validators-dir = {{ beacon_node_validators_path | to_json }} +era-dir = {{ beacon_node_era_dir_path | to_json }} + +### Security +netkey-file = {{ beacon_node_netkey_path | to_json }} +{% if beacon_node_exec_layer_jwt_secret is defined %} +jwt-secret = {{ beacon_node_exec_layer_jwt_secret_path | mandatory | to_json }} +{% endif %} +doppelganger-detection = {{ beacon_node_doppelganger_detection | to_json }} +insecure-netkey-password = true +{% if beacon_node_payload_builder_enabled %} + +### Payload Builder +payload-builder = {{ beacon_node_payload_builder_enabled | to_json | to_json }} +payload-builder-url = {{ beacon_node_payload_builder_url | mandatory | to_json }} +{% endif %} + +### REST API +rest = {{ beacon_node_rest_enabled | to_json }} +{% if beacon_node_rest_enabled %} +rest-address = {{ beacon_node_rest_address | to_json }} +rest-port = {{ beacon_node_rest_port }} +{% if beacon_node_rest_allow_origin != '' %} +rest-allow-origin = {{ beacon_node_rest_allow_origin | to_json }} +{% endif %} +rest-max-body-size = {{ beacon_node_rest_max_body_size | mandatory }} +rest-max-headers-size = {{ beacon_node_rest_max_headers_size | mandatory }} +{% endif %} + +### Metrics +metrics = {{ beacon_node_metrics_enabled | to_json }} +{% if beacon_node_metrics_enabled %} +metrics-address = {{ beacon_node_metrics_address | to_json }} +metrics-port = {{ beacon_node_metrics_port }} +{% endif %} + +### Monitoring +validator-monitor-auto = {{ beacon_node_validator_monitor_auto | to_json }} +validator-monitor-details = {{ beacon_node_validator_monitor_details | to_json }} +{% if beacon_node_validator_monitor_pubkeys %} +validator-monitor-pubkey = [ +{% for pubkey in beacon_node_validator_monitor_pubkeys %} + {{ pubkey | to_json }}, +{% endfor %}] +{% else %} +validator-monitor-pubkey = [] +{% endif %} + +{% if beacon_node_light_client_data_enabled %} +### Light Client +light-client-data-serve = {{ beacon_node_light_client_data_serve | to_json }} +light-client-data-import-mode = {{ beacon_node_light_client_data_import_mode | to_json }} +{% if beacon_node_light_client_data_max_periods >= 0 %} +light-client-data-max-periods = {{ beacon_node_light_client_data_max_periods }} +{% endif %} +{% endif -%} +{% if beacon_node_extra_flags %} + +### Extra Flags +{% for key,value in beacon_node_extra_flags %} +{{ key }} = {{ value | to_json }} +{% endfor %} +{% endif %}