1+ # Shared sequencer-node service body. Each node runs in its own container and reaches the others by
2+ # docker DNS name (sequencer-node-0, sequencer-node-1, ...). node_1+ are gated behind profiles so
3+ # only N_NODES of them start (see deploy_local_stack.sh).
4+ x-sequencer-node : &sequencer_node
5+ depends_on :
6+ config_injector :
7+ condition : service_completed_successfully
8+ sequencer_node_setup :
9+ condition : service_completed_successfully
10+ dummy_recorder :
11+ condition : service_started
12+ dummy_exchange_rate_oracle :
13+ condition : service_started
14+ build :
15+ context : ${SEQUENCER_ROOT_DIR}
16+ dockerfile : ${SEQUENCER_ROOT_DIR}/deployments/images/sequencer/Dockerfile
17+ args :
18+ BUILD_MODE : debug
19+ environment :
20+ - RUST_LOG=${RUST_LOG}
21+ - RUST_BACKTRACE=${RUST_BACKTRACE}
22+ volumes :
23+ - data:/data
24+ - config:/config
25+ networks :
26+ - sequencer-network
27+
128services :
229 prometheus :
330 image : prom/prometheus
@@ -31,7 +58,7 @@ services:
3158 - RUST_BACKTRACE=${RUST_BACKTRACE}
3259 entrypoint : " /bin/bash -c"
3360 command : >
34- "./target/debug/sequencer_node_setup --output-base-dir ./output --data-prefix-path /data --n-distributed 0 --n-hybrid 0 --n-consolidated 1 ;
61+ "./target/debug/sequencer_node_setup --output-base-dir ./output --data-prefix-path /data --n-distributed 0 --n-hybrid 0 --n-consolidated ${N_NODES:-1} ;
3562 cp -r ./output/data/* /data; cp -r ./output/configs/* /config"
3663 volumes :
3764 - data:/data
@@ -71,66 +98,81 @@ services:
7198 build :
7299 context : ${SEQUENCER_ROOT_DIR}
73100 dockerfile : ${SEQUENCER_ROOT_DIR}/deployments/images/sequencer/config_injector.Dockerfile
74- # TODO(Tsabary): change the setup binary to output the file to a specific path, and use it in the following command.
75- # TODO(Tsabary): the config changes need to be more robust, probably managed through a suitable rust binary.
76- command : |
77- "cp /config/node_0/node_integration_test_config_changes.json ${SEQUENCER_CONFIG_PATH} \
78- echo 'Injecting config changes...' && \
79- jq '.\"recorder_url\" = \"http://dummy_recorder:8080\"' ${SEQUENCER_CONFIG_PATH} | sponge ${SEQUENCER_CONFIG_PATH} && \
80- jq '.\"l1_gas_price_provider_config.eth_to_strk_oracle_config.url_header_list\" = \"${ETH_STRK_ORACLE_URL_HEADERS:-http://dummy_exchange_rate_oracle:9000/eth_to_strk_oracle}\"' ${SEQUENCER_CONFIG_PATH} | sponge ${SEQUENCER_CONFIG_PATH} && \
81- jq '.\"l1_gas_price_provider_config.eth_to_strk_oracle_config.lag_interval_seconds\" = ${ETH_STRK_ORACLE_LAG_SECONDS:-60}' ${SEQUENCER_CONFIG_PATH} | sponge ${SEQUENCER_CONFIG_PATH} && \
82- jq '.\"l1_gas_price_provider_config.strk_to_usd_oracle_config.url_header_list\" = \"${STRK_USD_ORACLE_URL_HEADERS:-http://dummy_exchange_rate_oracle:9000/eth_to_strk_oracle}\"' ${SEQUENCER_CONFIG_PATH} | sponge ${SEQUENCER_CONFIG_PATH} && \
83- jq '.\"l1_gas_price_provider_config.strk_to_usd_oracle_config.lag_interval_seconds\" = ${STRK_USD_ORACLE_LAG_SECONDS:-60}' ${SEQUENCER_CONFIG_PATH} | sponge ${SEQUENCER_CONFIG_PATH} && \
84- jq '.\"http_server_config.static_config.ip\" = \"0.0.0.0\"' ${SEQUENCER_CONFIG_PATH} | sponge ${SEQUENCER_CONFIG_PATH} && \
85- jq '.\"http_server_config.static_config.port\" = ${SEQUENCER_HTTP_PORT}' ${SEQUENCER_CONFIG_PATH} | sponge ${SEQUENCER_CONFIG_PATH} && \
86- jq '.\"monitoring_endpoint_config.port\" = ${SEQUENCER_MONITORING_PORT}' ${SEQUENCER_CONFIG_PATH} | sponge ${SEQUENCER_CONFIG_PATH} && \
87- # These are here to avoid using an L1 baselayer. This is because anvil was deliberately disabled in the docker test.
88- jq '.\"components.l1_events_scraper.execution_mode\" = \"Disabled\"' ${SEQUENCER_CONFIG_PATH} | sponge ${SEQUENCER_CONFIG_PATH} && \
89- jq '.\"l1_events_scraper_config.#is_none\" = true' ${SEQUENCER_CONFIG_PATH} | sponge ${SEQUENCER_CONFIG_PATH} && \
90- jq '.\"l1_events_provider_config.dummy_mode\" = true' ${SEQUENCER_CONFIG_PATH} | sponge ${SEQUENCER_CONFIG_PATH} && \
91- jq '.\"components.l1_gas_price_scraper.execution_mode\" = \"Disabled\"' ${SEQUENCER_CONFIG_PATH} | sponge ${SEQUENCER_CONFIG_PATH} && \
92- jq '.\"l1_gas_price_scraper_config.#is_none\" = true' ${SEQUENCER_CONFIG_PATH} | sponge ${SEQUENCER_CONFIG_PATH} && \
93- echo 'Printing final config:' && \
94- echo '----------------------------------------' && \
95- cat ${SEQUENCER_CONFIG_PATH} && \
96- echo '----------------------------------------' && \
97- echo 'Done'"
101+ # Inject local-stack overrides into each node's config. Single $ is interpolated by docker
102+ # compose (host env); $$ is passed through to the container shell. For N>1 the localhost
103+ # full-mesh P2P bootstrap addresses are rewritten to per-node DNS names (entry j -> node j, since
104+ # the list is node-index ordered and identical across nodes).
105+ command :
106+ - |
107+ set -e
108+ N_NODES=${N_NODES:-1}
109+ for i in $$(seq 0 $$((N_NODES - 1))); do
110+ cfg=/config/node_$$i/config.json
111+ cp /config/node_$$i/node_integration_test_config_changes.json "$$cfg"
112+ jq '."recorder_url" = "http://dummy_recorder:8080"' "$$cfg" | sponge "$$cfg"
113+ jq --arg v "${ETH_STRK_ORACLE_URL_HEADERS:-http://dummy_exchange_rate_oracle:9000/eth_to_strk_oracle}" '."l1_gas_price_provider_config.eth_to_strk_oracle_config.url_header_list" = $$v' "$$cfg" | sponge "$$cfg"
114+ jq --argjson v ${ETH_STRK_ORACLE_LAG_SECONDS:-60} '."l1_gas_price_provider_config.eth_to_strk_oracle_config.lag_interval_seconds" = $$v' "$$cfg" | sponge "$$cfg"
115+ jq --arg v "${STRK_USD_ORACLE_URL_HEADERS:-http://dummy_exchange_rate_oracle:9000/eth_to_strk_oracle}" '."l1_gas_price_provider_config.strk_to_usd_oracle_config.url_header_list" = $$v' "$$cfg" | sponge "$$cfg"
116+ jq --argjson v ${STRK_USD_ORACLE_LAG_SECONDS:-60} '."l1_gas_price_provider_config.strk_to_usd_oracle_config.lag_interval_seconds" = $$v' "$$cfg" | sponge "$$cfg"
117+ jq '."http_server_config.static_config.ip" = "0.0.0.0"' "$$cfg" | sponge "$$cfg"
118+ jq '."http_server_config.static_config.port" = 8081' "$$cfg" | sponge "$$cfg"
119+ jq '."monitoring_endpoint_config.port" = 8082' "$$cfg" | sponge "$$cfg"
120+ jq '."components.l1_events_scraper.execution_mode" = "Disabled"' "$$cfg" | sponge "$$cfg"
121+ jq '."l1_events_scraper_config.#is_none" = true' "$$cfg" | sponge "$$cfg"
122+ jq '."l1_events_provider_config.dummy_mode" = true' "$$cfg" | sponge "$$cfg"
123+ jq '."components.l1_gas_price_scraper.execution_mode" = "Disabled"' "$$cfg" | sponge "$$cfg"
124+ jq '."l1_gas_price_scraper_config.#is_none" = true' "$$cfg" | sponge "$$cfg"
125+ if [ "$$N_NODES" -gt 1 ]; then
126+ for key in consensus_manager_config.network_config.bootstrap_peer_multiaddr mempool_p2p_config.network_config.bootstrap_peer_multiaddr state_sync_config.static_config.network_config.bootstrap_peer_multiaddr; do
127+ jq --arg k "$$key" '.[$$k] |= (split(",") | to_entries | map(.key as $$j | .value | sub("/ip4/[0-9.]+/"; "/dns4/sequencer-node-\($$j)/")) | join(","))' "$$cfg" | sponge "$$cfg"
128+ done
129+ fi
130+ done
98131 volumes :
99132 - config:/config
100133 networks :
101134 - sequencer-network
102135
103- sequencer_node :
104- depends_on :
105- config_injector :
106- condition : service_completed_successfully
107- dummy_recorder :
108- condition : service_started
109- sequencer_node_setup :
110- condition : service_completed_successfully
111- build :
112- context : ${SEQUENCER_ROOT_DIR}
113- dockerfile : ${SEQUENCER_ROOT_DIR}/deployments/images/sequencer/Dockerfile
114- args :
115- BUILD_MODE : debug
116- environment :
117- - RUST_LOG=${RUST_LOG}
118- - RUST_BACKTRACE=${RUST_BACKTRACE}
136+ sequencer-node-0 :
137+ << : *sequencer_node
119138 ports :
120- - ${SEQUENCER_HTTP_PORT}:${SEQUENCER_HTTP_PORT}
121- - ${SEQUENCER_MONITORING_PORT}:${SEQUENCER_MONITORING_PORT}
139+ - " 8081:8081 "
140+ - " 8082:8082 "
122141 command :
123142 - " --config_file"
124- - " ${SEQUENCER_CONFIG_PATH}"
125- volumes :
126- - data:/data
127- - config:/config
128- networks :
129- - sequencer-network
143+ - " /config/node_0/config.json"
144+
145+ sequencer-node-1 :
146+ << : *sequencer_node
147+ profiles : ["node1"]
148+ command :
149+ - " --config_file"
150+ - " /config/node_1/config.json"
151+
152+ sequencer-node-2 :
153+ << : *sequencer_node
154+ profiles : ["node2"]
155+ command :
156+ - " --config_file"
157+ - " /config/node_2/config.json"
158+
159+ sequencer-node-3 :
160+ << : *sequencer_node
161+ profiles : ["node3"]
162+ command :
163+ - " --config_file"
164+ - " /config/node_3/config.json"
165+
166+ sequencer-node-4 :
167+ << : *sequencer_node
168+ profiles : ["node4"]
169+ command :
170+ - " --config_file"
171+ - " /config/node_4/config.json"
130172
131173 sequencer_simulator :
132174 depends_on :
133- - sequencer_node
175+ - sequencer-node-0
134176 build :
135177 context : ${SEQUENCER_ROOT_DIR}
136178 dockerfile : ${SEQUENCER_ROOT_DIR}/deployments/images/sequencer/simulator.Dockerfile
@@ -141,10 +183,10 @@ services:
141183 entrypoint : " /bin/bash -c"
142184 command : >
143185 "./target/debug/sequencer_simulator \
144- --http-url http://sequencer_node \
145- --http-port ${SEQUENCER_HTTP_PORT} \
146- --monitoring-url http://sequencer_node \
147- --monitoring-port ${SEQUENCER_MONITORING_PORT} \
186+ --http-url http://sequencer-node-0 \
187+ --http-port 8081 \
188+ --monitoring-url http://sequencer-node-0 \
189+ --monitoring-port 8082 \
148190 $$(if [ \"$$SIMULATOR_RUN_FOREVER\" = \"true\" ]; then echo '--run-forever'; fi)"
149191 networks :
150192 - sequencer-network
0 commit comments