From 281068a7529fd4f008d3acb50ad843bf37c23226 Mon Sep 17 00:00:00 2001 From: tomg10 Date: Thu, 21 Mar 2024 16:01:41 +0100 Subject: [PATCH] support for snapshots recovery --- README.md | 11 ++++++++++- defaults/main.yml | 4 ++++ templates/external_node.env.j2 | 6 ++++++ templates/restore_dump.sh.j2 | 2 +- 4 files changed, 21 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 1e09f9c..4dc73fe 100644 --- a/README.md +++ b/README.md @@ -87,6 +87,7 @@ Basic auth secret can be generated by `htpasswd` and `sed` for interpolation: `ansible-galaxy collection install community.general` 2. Prepare the latest database backup on your host. you can download it from our public GCS buckets: +Skip this step if you are recovering from a snapshot! * [Era Mainnet latest dump](https://storage.googleapis.com/zksync-era-mainnet-external-node-backups/external_node_latest.pgdump) * [Era Sepolia Testnet latest dump](https://storage.googleapis.com/zksync-era-boojnet-external-node-snapshots/external_node_latest.pgdump) @@ -95,6 +96,7 @@ Basic auth secret can be generated by `htpasswd` and `sed` for interpolation: Downloaded dump file should be placed into `{{ storage_directory }}/pg_backups` directory (`/usr/src/en/pg_backups` by default) 3. **OPTIONAL**: If you already have running node, you can copy its tree and state directory to a new host's `{{ storage_directory }}/db`. (`/usr/src/en/db` by default) +Skip this step if you are recovering from a snapshot! **Keep in mind that tree and state should be older than PostgreSQL database backup.** @@ -110,6 +112,14 @@ vm_auth_password 5. Connect to your host, and see status of `postgres` container. It can take a lot of time before PostgreSQL database backup will be restored (hours to days, depending on your disk throughput and IOPS), after which PostgreSQL server will be ready for use. Once `postgres` becomes "healthy", `external_node` runs automatically. +## Snapshots Recovery + +example config enabling recovery from a snapshot +```yaml +- enable_snapshots_recovery: true +- snapshots_bucket_base_url: "zksync-era-mainnet-external-node-snapshots" +``` + ## Example Playbook ```yaml @@ -125,7 +135,6 @@ vm_auth_password l2_chain_id: "324" l1_chain_id: "1" enable_tls: false - partner_id: matterlabs vars_files: - secrets/mainnet_secrets.yml roles: diff --git a/defaults/main.yml b/defaults/main.yml index 464f8a9..58aa4bc 100644 --- a/defaults/main.yml +++ b/defaults/main.yml @@ -68,6 +68,10 @@ basic_auth_secret: "" # Force restore pg database force_pg_restore: false +# Use a snapshot to recover +enable_snapshots_recovery: false +snapshots_bucket_base_url: "" + # External node and database options database_name: "" database_username: "" diff --git a/templates/external_node.env.j2 b/templates/external_node.env.j2 index 3931794..20c5a50 100644 --- a/templates/external_node.env.j2 +++ b/templates/external_node.env.j2 @@ -2,4 +2,10 @@ EN_ETH_CLIENT_URL="{{ eth_l1_url | mandatory }}" EN_MAIN_NODE_URL="{{ main_node_url | mandatory }}" EN_L2_CHAIN_ID="{{ l2_chain_id | mandatory }}" EN_L1_CHAIN_ID="{{ l1_chain_id | mandatory }}" +{% if enable_snapshots_recovery %} +EN_SNAPSHOTS_RECOVERY_ENABLED="true" +EN_SNAPSHOTS_OBJECT_STORE_MODE="GCSAnonymousReadOnly" +EN_SNAPSHOTS_OBJECT_STORE_BUCKET_BASE_URL="{{ snapshots_bucket_base_url | mandatory }}" +{% endif %} + DATABASE_URL="postgres://{{ database_username | mandatory }}:{{ database_password | mandatory }}@postgres/{{ database_name | mandatory }}" diff --git a/templates/restore_dump.sh.j2 b/templates/restore_dump.sh.j2 index 43db63e..6f1295d 100644 --- a/templates/restore_dump.sh.j2 +++ b/templates/restore_dump.sh.j2 @@ -3,7 +3,7 @@ set -e {% if force_pg_restore %} pg_restore --clean --exit-on-error -j $(nproc --all) -d postgres -U $POSTGRES_USER --no-owner --no-privileges --disable-triggers --create /pg_backups/external_node_latest.pgdump -{% else %} +{% elif not enable_snapshots_recovery %} if psql -U $POSTGRES_USER -d postgres -lqt | cut -d \| -f 1 | grep -qw "{{ database_name }}"; then echo "Database already exists" else