forked from cerc-io/stack-orchestrator
		
	Add a Ajna watcher stack (#781)
Part of https://www.notion.so/Generate-ajna-finance-subgraph-watcher-with-codegen-5b80ac149b3f449fb138f5d92cc5485e Reviewed-on: cerc-io/stack-orchestrator#781 Co-authored-by: Prathamesh Musale <prathamesh.musale0@gmail.com> Co-committed-by: Prathamesh Musale <prathamesh.musale0@gmail.com>
This commit is contained in:
		
							parent
							
								
									aeddc82ebc
								
							
						
					
					
						commit
						cd50832038
					
				| @ -0,0 +1,76 @@ | ||||
| version: '3.2' | ||||
| 
 | ||||
| services: | ||||
|   ajna-watcher-db: | ||||
|     restart: unless-stopped | ||||
|     image: postgres:14-alpine | ||||
|     environment: | ||||
|       - POSTGRES_USER=vdbm | ||||
|       - POSTGRES_MULTIPLE_DATABASES=ajna-watcher,ajna-watcher-job-queue | ||||
|       - POSTGRES_EXTENSION=ajna-watcher-job-queue:pgcrypto | ||||
|       - POSTGRES_PASSWORD=password | ||||
|     volumes: | ||||
|       - ../config/postgresql/multiple-postgressql-databases.sh:/docker-entrypoint-initdb.d/multiple-postgressql-databases.sh | ||||
|       - ajna_watcher_db_data:/var/lib/postgresql/data | ||||
|     ports: | ||||
|       - "5432" | ||||
|     healthcheck: | ||||
|       test: ["CMD", "nc", "-v", "localhost", "5432"] | ||||
|       interval: 20s | ||||
|       timeout: 5s | ||||
|       retries: 15 | ||||
|       start_period: 10s | ||||
| 
 | ||||
|   ajna-watcher-job-runner: | ||||
|     restart: unless-stopped | ||||
|     depends_on: | ||||
|       ajna-watcher-db: | ||||
|         condition: service_healthy | ||||
|     image: cerc/watcher-ajna:local | ||||
|     environment: | ||||
|       CERC_SCRIPT_DEBUG: ${CERC_SCRIPT_DEBUG} | ||||
|       CERC_ETH_RPC_ENDPOINT: ${CERC_ETH_RPC_ENDPOINT} | ||||
|     command: ["bash", "./start-job-runner.sh"] | ||||
|     volumes: | ||||
|       - ../config/watcher-ajna/watcher-config-template.toml:/app/environments/watcher-config-template.toml | ||||
|       - ../config/watcher-ajna/start-job-runner.sh:/app/start-job-runner.sh | ||||
|     ports: | ||||
|       - "9000" | ||||
|     healthcheck: | ||||
|       test: ["CMD", "nc", "-v", "localhost", "9000"] | ||||
|       interval: 20s | ||||
|       timeout: 5s | ||||
|       retries: 15 | ||||
|       start_period: 5s | ||||
|     extra_hosts: | ||||
|       - "host.docker.internal:host-gateway" | ||||
| 
 | ||||
|   ajna-watcher-server: | ||||
|     restart: unless-stopped | ||||
|     depends_on: | ||||
|       ajna-watcher-db: | ||||
|         condition: service_healthy | ||||
|       ajna-watcher-job-runner: | ||||
|         condition: service_healthy | ||||
|     image: cerc/watcher-ajna:local | ||||
|     environment: | ||||
|       CERC_SCRIPT_DEBUG: ${CERC_SCRIPT_DEBUG} | ||||
|       CERC_ETH_RPC_ENDPOINT: ${CERC_ETH_RPC_ENDPOINT} | ||||
|     command: ["bash", "./start-server.sh"] | ||||
|     volumes: | ||||
|       - ../config/watcher-ajna/watcher-config-template.toml:/app/environments/watcher-config-template.toml | ||||
|       - ../config/watcher-ajna/start-server.sh:/app/start-server.sh | ||||
|     ports: | ||||
|       - "3008" | ||||
|       - "9001" | ||||
|     healthcheck: | ||||
|       test: ["CMD", "nc", "-v", "localhost", "3008"] | ||||
|       interval: 20s | ||||
|       timeout: 5s | ||||
|       retries: 15 | ||||
|       start_period: 5s | ||||
|     extra_hosts: | ||||
|       - "host.docker.internal:host-gateway" | ||||
| 
 | ||||
| volumes: | ||||
|   ajna_watcher_db_data: | ||||
							
								
								
									
										20
									
								
								stack_orchestrator/data/config/watcher-ajna/start-job-runner.sh
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										20
									
								
								stack_orchestrator/data/config/watcher-ajna/start-job-runner.sh
									
									
									
									
									
										Executable file
									
								
							| @ -0,0 +1,20 @@ | ||||
| #!/bin/sh | ||||
| 
 | ||||
| set -e | ||||
| if [ -n "$CERC_SCRIPT_DEBUG" ]; then | ||||
|   set -x | ||||
| fi | ||||
| set -u | ||||
| 
 | ||||
| echo "Using ETH RPC endpoint ${CERC_ETH_RPC_ENDPOINT}" | ||||
| 
 | ||||
| # Read in the config template TOML file and modify it | ||||
| WATCHER_CONFIG_TEMPLATE=$(cat environments/watcher-config-template.toml) | ||||
| WATCHER_CONFIG=$(echo "$WATCHER_CONFIG_TEMPLATE" | \ | ||||
|   sed -E "s|REPLACE_WITH_CERC_ETH_RPC_ENDPOINT|${CERC_ETH_RPC_ENDPOINT}| ") | ||||
| 
 | ||||
| # Write the modified content to a new file | ||||
| echo "$WATCHER_CONFIG" > environments/local.toml | ||||
| 
 | ||||
| echo "Running job-runner..." | ||||
| DEBUG=vulcanize:* exec node --enable-source-maps dist/job-runner.js | ||||
							
								
								
									
										20
									
								
								stack_orchestrator/data/config/watcher-ajna/start-server.sh
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										20
									
								
								stack_orchestrator/data/config/watcher-ajna/start-server.sh
									
									
									
									
									
										Executable file
									
								
							| @ -0,0 +1,20 @@ | ||||
| #!/bin/sh | ||||
| 
 | ||||
| set -e | ||||
| if [ -n "$CERC_SCRIPT_DEBUG" ]; then | ||||
|   set -x | ||||
| fi | ||||
| set -u | ||||
| 
 | ||||
| echo "Using ETH RPC endpoint ${CERC_ETH_RPC_ENDPOINT}" | ||||
| 
 | ||||
| # Read in the config template TOML file and modify it | ||||
| WATCHER_CONFIG_TEMPLATE=$(cat environments/watcher-config-template.toml) | ||||
| WATCHER_CONFIG=$(echo "$WATCHER_CONFIG_TEMPLATE" | \ | ||||
|   sed -E "s|REPLACE_WITH_CERC_ETH_RPC_ENDPOINT|${CERC_ETH_RPC_ENDPOINT}| ") | ||||
| 
 | ||||
| # Write the modified content to a new file | ||||
| echo "$WATCHER_CONFIG" > environments/local.toml | ||||
| 
 | ||||
| echo "Running server..." | ||||
| DEBUG=vulcanize:* exec node --enable-source-maps dist/server.js | ||||
| @ -0,0 +1,98 @@ | ||||
| [server] | ||||
|   host = "0.0.0.0" | ||||
|   port = 3008 | ||||
|   kind = "active" | ||||
|   gqlPath = "/graphql" | ||||
| 
 | ||||
|   # Checkpointing state. | ||||
|   checkpointing = true | ||||
| 
 | ||||
|   # Checkpoint interval in number of blocks. | ||||
|   checkpointInterval = 2000 | ||||
| 
 | ||||
|   # Enable state creation | ||||
|   # CAUTION: Disable only if state creation is not desired or can be filled subsequently | ||||
|   enableState = false | ||||
| 
 | ||||
|   subgraphPath = "./subgraph-build" | ||||
| 
 | ||||
|   # Interval to restart wasm instance periodically | ||||
|   wasmRestartBlocksInterval = 20 | ||||
| 
 | ||||
|   # Interval in number of blocks at which to clear entities cache. | ||||
|   clearEntitiesCacheInterval = 1000 | ||||
| 
 | ||||
|   # Max block range for which to return events in eventsInRange GQL query. | ||||
|   # Use -1 for skipping check on block range. | ||||
|   maxEventsBlockRange = 1000 | ||||
| 
 | ||||
|   # Flag to specify whether RPC endpoint supports block hash as block tag parameter | ||||
|   rpcSupportsBlockHashParam = false | ||||
| 
 | ||||
|   # GQL cache settings | ||||
|   [server.gqlCache] | ||||
|     enabled = true | ||||
| 
 | ||||
|     # Max in-memory cache size (in bytes) (default 8 MB) | ||||
|     # maxCacheSize | ||||
| 
 | ||||
|     # GQL cache-control max-age settings (in seconds) | ||||
|     maxAge = 15 | ||||
|     timeTravelMaxAge = 86400 # 1 day | ||||
| 
 | ||||
| [metrics] | ||||
|   host = "0.0.0.0" | ||||
|   port = 9000 | ||||
|   [metrics.gql] | ||||
|     port = 9001 | ||||
| 
 | ||||
| [database] | ||||
|   type = "postgres" | ||||
|   host = "ajna-watcher-db" | ||||
|   port = 5432 | ||||
|   database = "ajna-watcher" | ||||
|   username = "vdbm" | ||||
|   password = "password" | ||||
|   synchronize = true | ||||
|   logging = false | ||||
| 
 | ||||
| [upstream] | ||||
|   [upstream.ethServer] | ||||
|     rpcProviderEndpoint = "REPLACE_WITH_CERC_ETH_RPC_ENDPOINT" | ||||
| 
 | ||||
|     # Boolean flag to specify if rpc-eth-client should be used for RPC endpoint instead of ipld-eth-client (ipld-eth-server GQL client) | ||||
|     rpcClient = true | ||||
| 
 | ||||
|     # Boolean flag to specify if rpcProviderEndpoint is an FEVM RPC endpoint | ||||
|     isFEVM = true | ||||
| 
 | ||||
|     # Boolean flag to filter event logs by contracts | ||||
|     filterLogsByAddresses = true | ||||
|     # Boolean flag to filter event logs by topics | ||||
|     filterLogsByTopics = true | ||||
| 
 | ||||
|   [upstream.cache] | ||||
|     name = "requests" | ||||
|     enabled = false | ||||
|     deleteOnStart = false | ||||
| 
 | ||||
| [jobQueue] | ||||
|   dbConnectionString = "postgres://vdbm:password@ajna-watcher-db/ajna-watcher-job-queue" | ||||
|   maxCompletionLagInSecs = 300 | ||||
|   jobDelayInMilliSecs = 100 | ||||
|   eventsInBatch = 50 | ||||
|   subgraphEventsOrder = true | ||||
|   # Filecoin block time: https://docs.filecoin.io/basics/the-blockchain/blocks-and-tipsets#blocktime | ||||
|   blockDelayInMilliSecs = 30000 | ||||
| 
 | ||||
|   # Boolean to switch between modes of processing events when starting the server. | ||||
|   # Setting to true will fetch filtered events and required blocks in a range of blocks and then process them. | ||||
|   # Setting to false will fetch blocks consecutively with its events and then process them (Behaviour is followed in realtime processing near head). | ||||
|   useBlockRanges = true | ||||
| 
 | ||||
|   # Block range in which logs are fetched during historical blocks processing | ||||
|   historicalLogsBlockRange = 2000 | ||||
| 
 | ||||
|   # Max block range of historical processing after which it waits for completion of events processing | ||||
|   # If set to -1 historical processing does not wait for events processing and completes till latest canonical block | ||||
|   historicalMaxFetchAhead = 10000 | ||||
| @ -0,0 +1,10 @@ | ||||
| FROM node:18.17.1-alpine3.18 | ||||
| 
 | ||||
| RUN apk --update --no-cache add git python3 alpine-sdk bash curl jq | ||||
| 
 | ||||
| WORKDIR /app | ||||
| 
 | ||||
| COPY . . | ||||
| 
 | ||||
| RUN echo "Installing dependencies and building ajna-watcher-ts" && \ | ||||
|   yarn && yarn build | ||||
							
								
								
									
										9
									
								
								stack_orchestrator/data/container-build/cerc-watcher-ajna/build.sh
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										9
									
								
								stack_orchestrator/data/container-build/cerc-watcher-ajna/build.sh
									
									
									
									
									
										Executable file
									
								
							| @ -0,0 +1,9 @@ | ||||
| #!/usr/bin/env bash | ||||
| # Build cerc/watcher-ajna | ||||
| 
 | ||||
| source ${CERC_CONTAINER_BASE_DIR}/build-base.sh | ||||
| 
 | ||||
| # See: https://stackoverflow.com/a/246128/1701505 | ||||
| SCRIPT_DIR=$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd ) | ||||
| 
 | ||||
| docker build -t cerc/watcher-ajna:local -f ${SCRIPT_DIR}/Dockerfile ${build_command_args} ${CERC_REPO_BASE_DIR}/ajna-watcher-ts | ||||
							
								
								
									
										118
									
								
								stack_orchestrator/data/stacks/ajna/README.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										118
									
								
								stack_orchestrator/data/stacks/ajna/README.md
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,118 @@ | ||||
| # Ajna Watcher | ||||
| 
 | ||||
| ## Setup | ||||
| 
 | ||||
| Clone required repositories: | ||||
| 
 | ||||
| ```bash | ||||
| laconic-so --stack ajna setup-repositories --git-ssh --pull | ||||
| ``` | ||||
| 
 | ||||
| Build the container images: | ||||
| 
 | ||||
| ```bash | ||||
| laconic-so --stack ajna build-containers | ||||
| ``` | ||||
| 
 | ||||
| ## Deploy | ||||
| 
 | ||||
| Create a spec file for the deployment: | ||||
| 
 | ||||
| ```bash | ||||
| laconic-so --stack ajna deploy init --output ajna-spec.yml | ||||
| ``` | ||||
| 
 | ||||
| ### Ports | ||||
| 
 | ||||
| Edit `network` in the spec file to map container ports to host ports as required: | ||||
| 
 | ||||
| ```yml | ||||
| ... | ||||
| network: | ||||
|   ports: | ||||
|     ajna-watcher-db: | ||||
|      - 15432:5432 | ||||
|     ajna-watcher-job-runner: | ||||
|      - 9000:9000 | ||||
|     ajna-watcher-server: | ||||
|      - 3008:3008 | ||||
|      - 9001:9001 | ||||
| ``` | ||||
| 
 | ||||
| ### Create a deployment | ||||
| 
 | ||||
| Create a deployment from the spec file: | ||||
| 
 | ||||
| ```bash | ||||
| laconic-so --stack ajna deploy create --spec-file ajna-spec.yml --deployment-dir ajna-deployment | ||||
| ``` | ||||
| 
 | ||||
| ### Configuration | ||||
| 
 | ||||
| Inside deployment directory, open the `config.env` file  and set following env variables: | ||||
| 
 | ||||
| ```bash | ||||
| # External Filecoin (ETH RPC) endpoint to point the watcher to | ||||
| CERC_ETH_RPC_ENDPOINT=https://example-lotus-endpoint/rpc/v1 | ||||
| ``` | ||||
| 
 | ||||
| ### Start the deployment | ||||
| 
 | ||||
| ```bash | ||||
| laconic-so deployment --dir ajna-deployment start | ||||
| ``` | ||||
| 
 | ||||
| * To list down and monitor the running containers: | ||||
| 
 | ||||
|   ```bash | ||||
|   # With status | ||||
|   docker ps -a | ||||
| 
 | ||||
|   # Check logs for a container | ||||
|   docker logs -f <CONTAINER_ID> | ||||
|   ``` | ||||
| 
 | ||||
| * Open the GQL playground at <http://localhost:3008/graphql> | ||||
| 
 | ||||
|   ```graphql | ||||
|   # Example query | ||||
|   query { | ||||
|     _meta { | ||||
|       block { | ||||
|         hash | ||||
|         number | ||||
|         timestamp | ||||
|       } | ||||
|       deployment | ||||
|       hasIndexingErrors | ||||
|     } | ||||
| 
 | ||||
|     accounts { | ||||
|       id | ||||
|       txCount | ||||
|       tokensDelegated | ||||
|       rewardsClaimed | ||||
|     } | ||||
|   } | ||||
|   ``` | ||||
| 
 | ||||
| ## Clean up | ||||
| 
 | ||||
| Stop all the ajna services running in background: | ||||
| 
 | ||||
| ```bash | ||||
| # Only stop the docker containers | ||||
| laconic-so deployment --dir ajna-deployment stop | ||||
| 
 | ||||
| # Run 'start' to restart the deployment | ||||
| ``` | ||||
| 
 | ||||
| To stop all the ajna services and also delete data: | ||||
| 
 | ||||
| ```bash | ||||
| # Stop the docker containers | ||||
| laconic-so deployment --dir ajna-deployment stop --delete-volumes | ||||
| 
 | ||||
| # Remove deployment directory (deployment will have to be recreated for a re-run) | ||||
| rm -r ajna-deployment | ||||
| ``` | ||||
							
								
								
									
										9
									
								
								stack_orchestrator/data/stacks/ajna/stack.yml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										9
									
								
								stack_orchestrator/data/stacks/ajna/stack.yml
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,9 @@ | ||||
| version: "1.0" | ||||
| name: ajna | ||||
| description: "Ajna watcher stack" | ||||
| repos: | ||||
|   - git.vdb.to/cerc-io/ajna-watcher-ts | ||||
| containers: | ||||
|   - cerc/watcher-ajna | ||||
| pods: | ||||
|   - watcher-ajna | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user