diff --git a/docker/external-node.yml b/docker/external-node.yml index 8e17335..f9f454e 100644 --- a/docker/external-node.yml +++ b/docker/external-node.yml @@ -1,122 +1,133 @@ -name: "abstract-${NETWORK}-external-node" -services: - prometheus: - image: prom/prometheus:v2.35.0 - volumes: - - prometheus-data:/prometheus - - ./prometheus/prometheus.yml:/etc/prometheus/prometheus.yml - expose: - - 9090 - grafana: - image: grafana/grafana:9.3.6 - volumes: - - grafana-data:/var/lib/grafana - - ./grafana/provisioning:/etc/grafana/provisioning - environment: - GF_AUTH_ANONYMOUS_ORG_ROLE: "Admin" - GF_AUTH_ANONYMOUS_ENABLED: "true" - GF_AUTH_DISABLE_LOGIN_FORM: "true" - ports: - - "127.0.0.1:3000:3000" - postgres: - image: "postgres:16" - command: > - postgres - -c max_connections=200 - -c log_error_verbosity=terse - -c shared_buffers=2GB - -c effective_cache_size=4GB - -c maintenance_work_mem=1GB - -c checkpoint_completion_target=0.9 - -c random_page_cost=1.1 - -c effective_io_concurrency=200 - -c min_wal_size=4GB - -c max_wal_size=16GB - -c max_worker_processes=16 - -c checkpoint_timeout=1800 - expose: - - 5430 - volumes: - - postgres:/var/lib/postgresql/data - healthcheck: - interval: 1s - timeout: 3s - test: - [ - "CMD-SHELL", - 'psql -U postgres -c "select exists (select * from pg_stat_activity where datname = ''{{ database_name }}'' and application_name = ''pg_restore'')" | grep -e ".f$$"', - ] - environment: - - POSTGRES_PASSWORD=${DB_PASSWORD:-notsecurepassword} - - PGPORT=5430 - # Generation of consensus secrets. - # The secrets are generated iff the secrets file doesn't already exist. - generate-secrets: - image: "matterlabs/external-node:${EN_VERSION:-9734bf2-1787057993929}@${EN_DIGEST:-sha256:5dadc06bdf3bb09b7ac508e6761e164bca22fae09860cf8bc57041302f80f40b}" - entrypoint: - [ - "/configs/generate_secrets.sh", - "/configs/consensus_secrets.yaml", - ] - volumes: - - ./configs:/configs - external-node: - image: "matterlabs/external-node:${EN_VERSION:-9734bf2-1787057993929}@${EN_DIGEST:-sha256:5dadc06bdf3bb09b7ac508e6761e164bca22fae09860cf8bc57041302f80f40b}" - entrypoint: ["/usr/bin/entrypoint.sh"] - restart: always - depends_on: - postgres: - condition: service_healthy - generate-secrets: - condition: service_completed_successfully - ports: - - "127.0.0.1:${EN_HTTP_PORT:-3060}:${EN_HTTP_PORT:-3060}" - - "127.0.0.1:${EN_WS_PORT:-3061}:${EN_WS_PORT:-3061}" - - "127.0.0.1:${EN_HEALTHCHECK_PORT:-3081}:${EN_HEALTHCHECK_PORT:-3081}" - - "127.0.0.1:${EN_PROMETHEUS_PORT:-3322}:${EN_PROMETHEUS_PORT:-3322}" - # Consensus is currently disabled for Abstract - # - "127.0.0.1:${EN_CONSENSUS_PORT:-3054}:${EN_CONSENSUS_PORT:-3054}" - #- "127.0.0.1:${EN_CONSENSUS_DEBUG_PAGE_PORT:-5000}:${EN_CONSENSUS_DEBUG_PAGE_PORT:-5000}" - volumes: - - rocksdb:/db - - ./configs:/configs - expose: - - 3322 - environment: - DATABASE_URL: "postgres://postgres:${DB_PASSWORD:-notsecurepassword}@postgres:5430/abstract_local_ext_node" - DATABASE_POOL_SIZE: 10 - - EN_HTTP_PORT: ${EN_HTTP_PORT:-3060} - EN_WS_PORT: ${EN_WS_PORT:-3061} - EN_HEALTHCHECK_PORT: ${EN_HEALTHCHECK_PORT:-3081} - EN_PROMETHEUS_PORT: ${EN_PROMETHEUS_PORT:-3322} - EN_ETH_CLIENT_URL: ${EN_ETH_CLIENT_URL:-https://eth.drpc.org} - EN_MAIN_NODE_URL: ${EN_MAIN_NODE_URL:-https://api.mainnet.abs.xyz} - EN_L1_CHAIN_ID: ${EN_L1_CHAIN_ID:-1} - EN_L2_CHAIN_ID: ${EN_L2_CHAIN_ID:-2741} - EN_PRUNING_ENABLED: ${EN_PRUNING_ENABLED:-true} - - EN_GAS_PRICE_SCALE_FACTOR: "1.5" - EN_ESTIMATE_GAS_SCALE_FACTOR: "1.3" - EN_ESTIMATE_GAS_ACCEPTABLE_OVERESTIMATION: "5000" - - EN_STATE_CACHE_PATH: "./db/ext-node/state_keeper" - EN_MERKLE_TREE_PATH: "./db/ext-node/lightweight" - EN_SNAPSHOTS_RECOVERY_ENABLED: ${EN_SNAPSHOTS_RECOVERY_ENABLED:-true} - EN_SNAPSHOTS_OBJECT_STORE_BUCKET_BASE_URL: ${EN_SNAPSHOTS_OBJECT_STORE_BUCKET_BASE_URL:-raas-abstract-mainnet-external-node-snapshots} - EN_SNAPSHOTS_OBJECT_STORE_MODE: "GCSAnonymousReadOnly" - RUST_LOG: ${RUST_LOG:-warn,zksync=info,zksync_core::metadata_calculator=debug,zksync_state=debug,zksync_utils=debug,zksync_web3_decl::client=error} - # Consensus is currently disabled for Abstract - #EN_CONSENSUS_CONFIG_PATH: "/configs/consensus_config.yaml" - #EN_CONSENSUS_SECRETS_PATH: "/configs/consensus_secrets.yaml" - # Statekeeper config for block times - EN_STATE_KEEPER_L2_BLOCK_COMMIT_DEADLINE: ${EN_STATE_KEEPER_L2_BLOCK_COMMIT_DEADLINE:-"200 ms"} - # API configuration for eth_sendRawTransactionSync timeouts - EN_API_SEND_RAW_TX_SYNC_DEFAULT_TIMEOUT_MS: ${EN_API_SEND_RAW_TX_SYNC_DEFAULT_TIMEOUT_MS:-2000} - EN_API_SEND_RAW_TX_SYNC_MAX_TIMEOUT_MS: ${EN_API_SEND_RAW_TX_SYNC_MAX_TIMEOUT_MS:-10000} - -volumes: - postgres: {} - rocksdb: {} - prometheus-data: {} - grafana-data: {} +name: "abstract-${NETWORK}-external-node" +services: + prometheus: + image: prom/prometheus:v2.35.0 + volumes: + - prometheus-data:/prometheus + - ./prometheus/prometheus.yml:/etc/prometheus/prometheus.yml + expose: + - 9090 + grafana: + image: grafana/grafana:9.3.6 + volumes: + - grafana-data:/var/lib/grafana + - ./grafana/provisioning:/etc/grafana/provisioning + environment: + # Anonymous access is enabled and the login form is disabled, so this role is + # granted to every request that reaches Grafana. "Admin" would let anyone with + # access to port 3000 (including anything on the host or an SSH tunnel) create + # datasources, which Grafana proxies server-side and can be abused to reach + # internal endpoints such as the cloud metadata service. "Viewer" still allows + # reading the provisioned dashboards; set GRAFANA_ANONYMOUS_ROLE=Admin to + # restore the previous behaviour if you edit dashboards from the UI. + GF_AUTH_ANONYMOUS_ORG_ROLE: "${GRAFANA_ANONYMOUS_ROLE:-Viewer}" + GF_AUTH_ANONYMOUS_ENABLED: "true" + GF_AUTH_DISABLE_LOGIN_FORM: "true" + ports: + - "127.0.0.1:3000:3000" + postgres: + image: "postgres:16" + # The external node is "restart: always" and depends on postgres being healthy. + # Without a restart policy here, a postgres crash or a host reboot leaves the + # database stopped and the node stuck in a restart loop until manual action. + restart: always + command: > + postgres + -c max_connections=200 + -c log_error_verbosity=terse + -c shared_buffers=2GB + -c effective_cache_size=4GB + -c maintenance_work_mem=1GB + -c checkpoint_completion_target=0.9 + -c random_page_cost=1.1 + -c effective_io_concurrency=200 + -c min_wal_size=4GB + -c max_wal_size=16GB + -c max_worker_processes=16 + -c checkpoint_timeout=1800 + expose: + - 5430 + volumes: + - postgres:/var/lib/postgresql/data + healthcheck: + interval: 1s + timeout: 3s + test: + [ + "CMD-SHELL", + 'psql -U postgres -c "select exists (select * from pg_stat_activity where datname = ''{{ database_name }}'' and application_name = ''pg_restore'')" | grep -e ".f$$"', + ] + environment: + - POSTGRES_PASSWORD=${DB_PASSWORD:-notsecurepassword} + - PGPORT=5430 + # Generation of consensus secrets. + # The secrets are generated iff the secrets file doesn't already exist. + generate-secrets: + image: "matterlabs/external-node:${EN_VERSION:-9734bf2-1787057993929}@${EN_DIGEST:-sha256:5dadc06bdf3bb09b7ac508e6761e164bca22fae09860cf8bc57041302f80f40b}" + entrypoint: + [ + "/configs/generate_secrets.sh", + "/configs/consensus_secrets.yaml", + ] + volumes: + - ./configs:/configs + external-node: + image: "matterlabs/external-node:${EN_VERSION:-9734bf2-1787057993929}@${EN_DIGEST:-sha256:5dadc06bdf3bb09b7ac508e6761e164bca22fae09860cf8bc57041302f80f40b}" + entrypoint: ["/usr/bin/entrypoint.sh"] + restart: always + depends_on: + postgres: + condition: service_healthy + generate-secrets: + condition: service_completed_successfully + ports: + - "127.0.0.1:${EN_HTTP_PORT:-3060}:${EN_HTTP_PORT:-3060}" + - "127.0.0.1:${EN_WS_PORT:-3061}:${EN_WS_PORT:-3061}" + - "127.0.0.1:${EN_HEALTHCHECK_PORT:-3081}:${EN_HEALTHCHECK_PORT:-3081}" + - "127.0.0.1:${EN_PROMETHEUS_PORT:-3322}:${EN_PROMETHEUS_PORT:-3322}" + # Consensus is currently disabled for Abstract + # - "127.0.0.1:${EN_CONSENSUS_PORT:-3054}:${EN_CONSENSUS_PORT:-3054}" + #- "127.0.0.1:${EN_CONSENSUS_DEBUG_PAGE_PORT:-5000}:${EN_CONSENSUS_DEBUG_PAGE_PORT:-5000}" + volumes: + - rocksdb:/db + - ./configs:/configs + expose: + - 3322 + environment: + DATABASE_URL: "postgres://postgres:${DB_PASSWORD:-notsecurepassword}@postgres:5430/abstract_local_ext_node" + DATABASE_POOL_SIZE: 10 + + EN_HTTP_PORT: ${EN_HTTP_PORT:-3060} + EN_WS_PORT: ${EN_WS_PORT:-3061} + EN_HEALTHCHECK_PORT: ${EN_HEALTHCHECK_PORT:-3081} + EN_PROMETHEUS_PORT: ${EN_PROMETHEUS_PORT:-3322} + EN_ETH_CLIENT_URL: ${EN_ETH_CLIENT_URL:-https://eth.drpc.org} + EN_MAIN_NODE_URL: ${EN_MAIN_NODE_URL:-https://api.mainnet.abs.xyz} + EN_L1_CHAIN_ID: ${EN_L1_CHAIN_ID:-1} + EN_L2_CHAIN_ID: ${EN_L2_CHAIN_ID:-2741} + EN_PRUNING_ENABLED: ${EN_PRUNING_ENABLED:-true} + + EN_GAS_PRICE_SCALE_FACTOR: "1.5" + EN_ESTIMATE_GAS_SCALE_FACTOR: "1.3" + EN_ESTIMATE_GAS_ACCEPTABLE_OVERESTIMATION: "5000" + + EN_STATE_CACHE_PATH: "./db/ext-node/state_keeper" + EN_MERKLE_TREE_PATH: "./db/ext-node/lightweight" + EN_SNAPSHOTS_RECOVERY_ENABLED: ${EN_SNAPSHOTS_RECOVERY_ENABLED:-true} + EN_SNAPSHOTS_OBJECT_STORE_BUCKET_BASE_URL: ${EN_SNAPSHOTS_OBJECT_STORE_BUCKET_BASE_URL:-raas-abstract-mainnet-external-node-snapshots} + EN_SNAPSHOTS_OBJECT_STORE_MODE: "GCSAnonymousReadOnly" + RUST_LOG: ${RUST_LOG:-warn,zksync=info,zksync_core::metadata_calculator=debug,zksync_state=debug,zksync_utils=debug,zksync_web3_decl::client=error} + # Consensus is currently disabled for Abstract + #EN_CONSENSUS_CONFIG_PATH: "/configs/consensus_config.yaml" + #EN_CONSENSUS_SECRETS_PATH: "/configs/consensus_secrets.yaml" + # Statekeeper config for block times + EN_STATE_KEEPER_L2_BLOCK_COMMIT_DEADLINE: ${EN_STATE_KEEPER_L2_BLOCK_COMMIT_DEADLINE:-"200 ms"} + # API configuration for eth_sendRawTransactionSync timeouts + EN_API_SEND_RAW_TX_SYNC_DEFAULT_TIMEOUT_MS: ${EN_API_SEND_RAW_TX_SYNC_DEFAULT_TIMEOUT_MS:-2000} + EN_API_SEND_RAW_TX_SYNC_MAX_TIMEOUT_MS: ${EN_API_SEND_RAW_TX_SYNC_MAX_TIMEOUT_MS:-10000} + +volumes: + postgres: {} + rocksdb: {} + prometheus-data: {} + grafana-data: {}