From c628503fd692035546bdf41b1819d9057a6fd7c2 Mon Sep 17 00:00:00 2001 From: cornholio <0@mcornholio.ru> Date: Mon, 3 Jun 2024 16:32:37 +0200 Subject: [PATCH] Dropping microservices setup * Removed Dockerfiles in all auxiliary packages * Removed entrypoints (e.g. run.ts) in all auxiliary packages * Removed Dockerfile-dev's, as they served no purpose * Removed esbuild and build:prod commands, as they weren't used in production setup * Removed worker package, as it's not used in monolith setup * Removed everything regarding redis * Removed docker-compose.yml and docker-compose.microservice.yml (docker-compose.current.yml became docker-compose.yml) * Removed configs for microservices setup * Updated docs --- .gitignore | 4 +- Dockerfile-dev | 16 -- README.md | 99 +------ docker-compose.current.yml | 44 --- docker-compose.microservice.yml | 168 ------------ docker-compose.yml | 256 +++--------------- docs/architecture/microservice.png | Bin 338762 -> 0 bytes docs/docs/backend/backend.md | 60 +--- docs/docs/backend/config.md | 33 --- package.json | 33 +-- packages/common/Dockerfile | 7 - packages/common/Dockerfile-dev | 4 - packages/common/esbuild.js | 98 ------- packages/common/package.json | 1 - packages/common/src/config.ts | 5 - .../src/scorekeeper/jobs/JobsRunnerFactory.ts | 5 +- .../scorekeeper/jobs/MicroserviceJobRunner.ts | 83 ------ packages/core/Dockerfile | 7 - packages/core/Dockerfile-dev | 7 - .../kusama.microservice.dev.sample.json | 137 ---------- .../config/kusama.microservice.sample.json | 95 ------- packages/core/config/main.sample.json | 4 - .../polkadot.microservice.dev.sample.json | 112 -------- .../config/polkadot.microservice.sample.json | 113 -------- packages/core/esbuild.js | 87 ------ packages/core/package.json | 12 +- packages/core/tsconfig.json | 6 +- packages/gateway/Dockerfile | 7 - packages/gateway/Dockerfile-dev | 8 - packages/gateway/config/sample.json | 5 - packages/gateway/esbuild.mjs | 97 ------- packages/gateway/package.json | 5 - packages/gateway/src/constants.ts | 1 + packages/gateway/src/controllers/Candidate.ts | 2 +- packages/gateway/src/controllers/EraPoints.ts | 2 +- packages/gateway/src/controllers/Location.ts | 2 +- .../gateway/src/controllers/Nomination.ts | 2 +- packages/gateway/src/controllers/Nominator.ts | 2 +- packages/gateway/src/controllers/Score.ts | 2 +- packages/gateway/src/controllers/Stats.ts | 2 +- .../gateway/src/controllers/Validators.ts | 4 +- packages/gateway/src/routes/setupRoutes.ts | 84 ------ packages/gateway/src/run.ts | 41 --- packages/gateway/tsconfig.json | 1 - packages/scorekeeper-status-ui/package.json | 1 - packages/telemetry/Dockerfile | 7 - packages/telemetry/Dockerfile-dev | 8 - packages/telemetry/esbuild.mjs | 85 ------ packages/telemetry/package.json | 5 - packages/telemetry/src/run.ts | 54 ---- packages/telemetry/tsconfig.json | 1 - packages/worker/.dockerignore | 5 - packages/worker/.eslintrc.js | 16 -- packages/worker/Dockerfile | 7 - packages/worker/Dockerfile-dev | 8 - packages/worker/config/kusama.sample.json | 61 ----- packages/worker/config/polkadot.sample.json | 59 ---- packages/worker/esbuild.js | 85 ------ packages/worker/package.json | 31 --- packages/worker/prettierrc.js | 7 - packages/worker/src/index.ts | 5 - packages/worker/src/queues/BlockQueue.ts | 74 ----- packages/worker/src/queues/ChainDataQueue.ts | 169 ------------ packages/worker/src/queues/ContraintsQueue.ts | 61 ----- .../worker/src/queues/ReleaseMonitorQueue.ts | 29 -- packages/worker/src/queues/index.ts | 59 ---- packages/worker/src/run.ts | 62 ----- packages/worker/src/worker.ts | 65 ----- packages/worker/src/workers/BlockWorker.ts | 29 -- .../worker/src/workers/ChainDataWorker.ts | 19 -- .../worker/src/workers/ConstraintsWorker.ts | 22 -- .../src/workers/ReleaseMonitorWorker.ts | 18 -- packages/worker/src/workers/index.ts | 3 - packages/worker/tsconfig.json | 78 ------ yarn.lock | 7 - 75 files changed, 69 insertions(+), 2834 deletions(-) delete mode 100644 Dockerfile-dev delete mode 100644 docker-compose.current.yml delete mode 100644 docker-compose.microservice.yml delete mode 100644 docs/architecture/microservice.png delete mode 100644 packages/common/Dockerfile delete mode 100644 packages/common/Dockerfile-dev delete mode 100644 packages/common/esbuild.js delete mode 100644 packages/common/src/scorekeeper/jobs/MicroserviceJobRunner.ts delete mode 100644 packages/core/Dockerfile delete mode 100644 packages/core/Dockerfile-dev delete mode 100644 packages/core/config/kusama.microservice.dev.sample.json delete mode 100644 packages/core/config/kusama.microservice.sample.json delete mode 100644 packages/core/config/polkadot.microservice.dev.sample.json delete mode 100644 packages/core/config/polkadot.microservice.sample.json delete mode 100644 packages/core/esbuild.js delete mode 100644 packages/gateway/Dockerfile delete mode 100644 packages/gateway/Dockerfile-dev delete mode 100644 packages/gateway/esbuild.mjs create mode 100644 packages/gateway/src/constants.ts delete mode 100644 packages/gateway/src/run.ts delete mode 100644 packages/telemetry/Dockerfile delete mode 100644 packages/telemetry/Dockerfile-dev delete mode 100644 packages/telemetry/esbuild.mjs delete mode 100644 packages/telemetry/src/run.ts delete mode 100644 packages/worker/.dockerignore delete mode 100644 packages/worker/.eslintrc.js delete mode 100644 packages/worker/Dockerfile delete mode 100644 packages/worker/Dockerfile-dev delete mode 100644 packages/worker/config/kusama.sample.json delete mode 100644 packages/worker/config/polkadot.sample.json delete mode 100644 packages/worker/esbuild.js delete mode 100644 packages/worker/package.json delete mode 100644 packages/worker/prettierrc.js delete mode 100644 packages/worker/src/index.ts delete mode 100644 packages/worker/src/queues/BlockQueue.ts delete mode 100644 packages/worker/src/queues/ChainDataQueue.ts delete mode 100644 packages/worker/src/queues/ContraintsQueue.ts delete mode 100644 packages/worker/src/queues/ReleaseMonitorQueue.ts delete mode 100644 packages/worker/src/queues/index.ts delete mode 100644 packages/worker/src/run.ts delete mode 100644 packages/worker/src/worker.ts delete mode 100644 packages/worker/src/workers/BlockWorker.ts delete mode 100644 packages/worker/src/workers/ChainDataWorker.ts delete mode 100644 packages/worker/src/workers/ConstraintsWorker.ts delete mode 100644 packages/worker/src/workers/ReleaseMonitorWorker.ts delete mode 100644 packages/worker/src/workers/index.ts delete mode 100644 packages/worker/tsconfig.json diff --git a/.gitignore b/.gitignore index f3f34e58a..7106ecba9 100644 --- a/.gitignore +++ b/.gitignore @@ -28,8 +28,6 @@ dist **/config/main.json **/config/secret.json -redis/ - docs/.DS_Store /packages/core/kusama-matrix.txt /packages/core/polkadot-matrix.txt @@ -43,4 +41,4 @@ docs/.DS_Store build/** dist/** .next/** -coverage/** \ No newline at end of file +coverage/** diff --git a/Dockerfile-dev b/Dockerfile-dev deleted file mode 100644 index 733599d1f..000000000 --- a/Dockerfile-dev +++ /dev/null @@ -1,16 +0,0 @@ -FROM node:18-slim AS builder -RUN apt-get update && apt-get install -y curl -ARG MATRIX_TOKEN -ARG PACKAGE -ENV PACKAGE ${PACKAGE} -COPY . /code -WORKDIR /code -RUN echo "building ${PACKAGE}... " && \ - yarn install && \ - echo "yarn install done. Building...." && \ - yarn build && \ - echo "building ${PACKAGE} done." && \ - apt-get update && \ - apt-get install -y libssl-dev && \ - apt-get clean -CMD yarn run start:dev:${PACKAGE} diff --git a/README.md b/README.md index 8aa5181ec..dad866e32 100644 --- a/README.md +++ b/README.md @@ -26,16 +26,13 @@ The nominating backend will routinely change its nominations at every era. The b > A monorepo containing TypeScript microservices for the Thousand Validators Program. -The following is a monorepo of packages for the Thousand Validators Program. Each package is a microservice that can be run independently or together with other microservices. +The following is a monorepo of packages for the Thousand Validators Program. The monorepo is managed using Yarn workspaces, and contains the following packages: - [`packages/common`](packages/common): A package containing common code shared across all microservices. - [`packages/core`](packages/core): A package containing the core logic of the Thousand Validators Program. - [`packages/gateway`](packages/gateway): A package for an API gateway that exposes the backend with a REST API. - [`packages/telemetry`](packages/telemetry): A package for a telemetry client that monitors uptime -- [`packages/worker`](packages/worker): A packages for job queue workers that perform background tasks. - - ## Installation & Setup @@ -43,16 +40,9 @@ The monorepo is managed using Yarn workspaces, and contains the following packag There's a few ways of running the backend with docker containers, either in kubernetes, or with docker-compose. -There is the `Current / Monolith` way of running instances, and the `Microservice` way of running instances. - -`Current / Monolith` Architecture: - -![Current / Monolith Architecture](./docs/architecture/monolith.png) +Current architecture: - -`Microservice` Architecture: - -![Microservice Architecture](./docs/architecture/microservice.png) +![Current Architecture](./docs/architecture/monolith.png) The following are different ways of running in either `Current` or `Microservice` architecture with either `Kusama` or `Polkadot`, and either `Development` or `Production`: @@ -60,18 +50,6 @@ The following are different ways of running in either `Current` or `Microservice - Running as a monolith with production values - `Polkadot Current` - Running as a monolith with production values -- `Kusama Microservice` - - Running as microservices with production values -- `Polkadot Microservice` - - Running as microservices with production values -- `Polkadot Current Dev` - - Running as a monolith with development values -- `Kusama Current Dev` - - Running as a monolith with development values -- `Kusama Microservice Dev` - - Running as microservices with development values -- `Polkadot Microservice Dev` - - Running as microservices with development values Each package contains a `Dockerfile`, which is used for running in production, and `Dockerfile-dev`, which is used for development. The development images will use run with `nodemon` so that each time files is saved/changed it will rebuild the image and restart the container. Any changes for the regular run `Dockerfile` will need a manual rebuilding of the docker image. @@ -86,8 +64,7 @@ cd 1k-validators-be ### Installing System Dependencies Ensure the following are installed on your machine: -- [Node.js](https://nodejs.org/en/) (v12 or higher) -- [Yarn](https://yarnpkg.com/) (v1.22 or higher) +- [Node.js](https://nodejs.org/en/) (v21 or higher) - [Docker](https://www.docker.com/) (v19 or higher) @@ -121,30 +98,6 @@ Polkadot Current / Monolith Dev: yarn docker:polkadot-current-dev:start ``` -Kusama Microservice Production: - -```bash -yarn docker:kusama-microscervice:start -``` - -Kusama Microservice Dev: - -```bash -yarn docker:kusama-microservice-dev:start -``` - -Polkadot Microservice Production: - -```bash -yarn docker:polkadot-current:start -``` - -Polkadot Microservice Dev: - -```bash -yarn docker:polkadot-current-dev:start -``` - ### Install Yarn Dependencies ```bash yarn install @@ -170,50 +123,6 @@ This will create a configuration file for a Kusama instance that mirrors what is yarn create-config-polkadot-current ``` -Kusama Microservice Config: -This will create configuration files for a Kusama instance for each microservice that runs with production values. This runs `core`, `gateway`, `telemetry`, and `worker` as separate processes in their own container - each one needs it's own configuration file. -```bash -yarn create-config-kusama-microservice -``` - -Polkadot Microservice Config: -This will create configuration files for a Polkadot instance for each microservice that runs with production values. This runs `core`, `gateway`, `telemetry`, and `worker` as separate processes in their own container - each one needs it's own configuration file. -```bash -yarn create-config-polkadot-microservice -``` - - - -### Running the Microservices - -#### Running `Kusama Current` or `Polkadot Current`: - -Either is from the same `docker-compose.current.yml` file, and runs only the `core` container, `mongo` container, and `mongo-express` container. - -Build and run as detached daemon: -```bash -docker compose -f docker-compose.current.yml up -d --build -``` - -#### Running `Kusama Microservice` or `Polkadot Microservice`: - -Either is from the same `docker-compose.microservice.yml` file. This runs `core`, `gateway`, `telemetry`, and `worker` as separate processes in their own container - each one needs it's own configuration file. It additionally runs a `redis`, `mongo`, and `mongo-express` container. - -Build and run as detached daemon: -```bash -docker compose -f docker-compose.microservice.yml up -d --build -``` - -#### Running `Kusama Current Dev`, `Polkadot Current Dev`, `Kusama Microservice Dev`, or `Polkadot Microservice Dev` - -Either is from the same `docker-compose.yml` file. - -Build and run as detached daemon: -```bash -docker compose -f docker-compose.yml up -d --build -``` - - ### Viewing Logs To view the aggregated logs of all the containers: diff --git a/docker-compose.current.yml b/docker-compose.current.yml deleted file mode 100644 index d692b1a9a..000000000 --- a/docker-compose.current.yml +++ /dev/null @@ -1,44 +0,0 @@ -version: '3' -services: - 1kv-core: - build: - context: . - args: - PACKAGE: core - dockerfile: ./Dockerfile - ports: - - "127.0.0.1:3300:3300" - networks: - testing_net: - ipv4_address: 172.28.1.1 - - mongo: - image: mongo - restart: always - ports: - - "127.0.0.1:27017:27017" - networks: - testing_net: - ipv4_address: 172.28.1.2 - - mongo-express: - image: mongo-express - environment: - - ME_CONFIG_MONGODB_SERVER=mongo - - ME_CONFIG_MONGODB_PORT=27017 - - ME_CONFIG_MONGODB_ENABLE_ADMIN=true - - ME_CONFIG_MONGODB_AUTH_DATABASE=admin - depends_on: - - mongo - ports: - - "127.0.0.1:8888:8081" - networks: - testing_net: - ipv4_address: 172.28.1.3 - -networks: - testing_net: - ipam: - driver: default - config: - - subnet: 172.28.0.0/16 diff --git a/docker-compose.microservice.yml b/docker-compose.microservice.yml deleted file mode 100644 index f6928d75c..000000000 --- a/docker-compose.microservice.yml +++ /dev/null @@ -1,168 +0,0 @@ -version: '3.8' -services: - - 1kv-core: - build: - context: . - args: - PACKAGE: core - dockerfile: ./Dockerfile - depends_on: - - redis - ports: - - "127.0.0.1:3300:3300" - healthcheck: - test: [ "CMD-SHELL", "curl -f http://localhost:3300/healthcheck" ] - interval: 60s - timeout: 60s - retries: 3 - start_period: 180s - deploy: - restart_policy: - condition: on-failure - delay: 300s - max_attempts: 3 - window: 120s - networks: - testing_net: - ipv4_address: 172.28.1.1 - - 1kv-gateway: - build: - context: . - args: - PACKAGE: gateway - dockerfile: ./Dockerfile - depends_on: - - redis - ports: - - "127.0.0.1:3301:3301" - healthcheck: - test: ["CMD", "curl", "-f", "http://localhost:3301/healthcheck"] - interval: 30s - timeout: 10s - retries: 3 - start_period: 60s - deploy: - restart_policy: - condition: on-failure - delay: 300s - max_attempts: 3 - window: 120s - networks: - testing_net: - ipv4_address: 172.28.1.2 - - - 1kv-telemetry: - build: - context: . - args: - PACKAGE: telemetry - dockerfile: ./Dockerfile - depends_on: - - redis - ports: - - "127.0.0.1:3302:3302" - healthcheck: - test: [ "CMD-SHELL", "curl -f http://localhost:3302/healthcheck" ] - interval: 30s - timeout: 10s - retries: 3 - start_period: 30s - deploy: - restart_policy: - condition: on-failure - delay: 300s - max_attempts: 3 - window: 120s - networks: - testing_net: - ipv4_address: 172.28.1.3 - - 1kv-worker: - build: - context: . - args: - PACKAGE: worker - dockerfile: ./Dockerfile - deploy: - # mode: replicated - # replicas: 8 - restart_policy: - condition: on-failure - delay: 30s - max_attempts: 3 - window: 120s - depends_on: - - redis - - mongo - ports: - - "127.0.0.1:3303:3303" - restart: on-failure - healthcheck: - test: [ "CMD-SHELL", "curl -f http://localhost:3303/healthcheck" ] - interval: 30s - timeout: 60s - retries: 3 - start_period: 180s - networks: - testing_net: -# ipv4_address: 172.28.1.3 - - - mongo: - image: mongo - restart: always - ports: - - "127.0.0.1:27017:27017" - networks: - testing_net: - ipv4_address: 172.28.1.4 - logging: - driver: "json-file" - options: - max-size: "50m" - - mongo-express: - image: mongo-express - environment: - - ME_CONFIG_MONGODB_SERVER=mongo - - ME_CONFIG_MONGODB_PORT=27017 - - ME_CONFIG_MONGODB_ENABLE_ADMIN=true - - ME_CONFIG_MONGODB_AUTH_DATABASE=admin - depends_on: - - mongo - ports: - - "127.0.0.1:8888:8081" - networks: - testing_net: - ipv4_address: 172.28.1.5 - logging: - driver: "json-file" - options: - max-size: "50m" - - redis: - image: redis:alpine - expose: - - "6379" - volumes: - - ./redis:/data - restart: always - command: ["redis-server", "--bind", "172.28.1.6", "--port", "6379"] - logging: - driver: "json-file" - options: - max-size: "50m" - networks: - testing_net: - ipv4_address: 172.28.1.6 - - -networks: - testing_net: - ipam: - driver: default - config: - - subnet: 172.28.0.0/16 diff --git a/docker-compose.yml b/docker-compose.yml index f849e6b2e..d692b1a9a 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,218 +1,44 @@ -version: '3.8' +version: '3' services: - - autoheal: - restart: always - image: willfarrell/autoheal - environment: - - AUTOHEAL_CONTAINER_LABEL=all - volumes: - - /var/run/docker.sock:/var/run/docker.sock - - 1kv-core: - environment: - - PACKAGE=core - image: 1kv-core:latest - build: - context: . - args: - PACKAGE: core - dockerfile: ./Dockerfile-dev - restart: on-failure - depends_on: - - redis - - mongo - volumes: - - .:/code - ports: - - "127.0.0.1:3300:3300" - healthcheck: - test: [ "CMD-SHELL", "curl -f http://localhost:3300/healthcheck" ] - interval: 60s - timeout: 60s - retries: 3 - start_period: 180s - deploy: - restart_policy: - condition: on-failure - delay: 300s - max_attempts: 3 - window: 120s - networks: - testing_net: - ipv4_address: 172.28.1.7 - logging: - driver: "json-file" - options: - max-size: "50m" - - 1kv-gateway: - environment: - - PACKAGE=gateway - image: 1kv-gateway:latest - build: - context: . - args: - PACKAGE: gateway - dockerfile: ./Dockerfile-dev - restart: on-failure - depends_on: - - redis - - mongo - volumes: - - .:/code - ports: - - "127.0.0.1:3301:3301" - healthcheck: - test: ["CMD", "curl", "-f", "http://localhost:3301/healthcheck"] - interval: 30s - timeout: 10s - retries: 3 - start_period: 60s - deploy: - restart_policy: - condition: on-failure - delay: 300s - max_attempts: 3 - window: 120s - networks: - testing_net: - ipv4_address: 172.28.1.8 - logging: - driver: "json-file" - options: - max-size: "50m" - - 1kv-telemetry: - environment: - - PACKAGE=telemetry - image: 1kv-telemetry:latest - build: - context: . - args: - PACKAGE: telemetry - dockerfile: ./Dockerfile-dev - restart: on-failure - depends_on: - - redis - - mongo - volumes: - - .:/code - ports: - - "127.0.0.1:3302:3302" - healthcheck: - test: [ "CMD-SHELL", "curl -f http://localhost:3302/healthcheck" ] - interval: 30s - timeout: 10s - retries: 3 - start_period: 30s - deploy: - restart_policy: - condition: on-failure - delay: 300s - max_attempts: 3 - window: 120s - networks: - testing_net: - ipv4_address: 172.28.1.9 - logging: - driver: "json-file" - options: - max-size: "50m" - - 1kv-worker: - environment: - - PACKAGE=worker - image: 1kv-worker:latest - build: - context: . - args: - PACKAGE: worker - dockerfile: ./Dockerfile-dev - volumes: - - .:/code - deploy: -# mode: replicated -# replicas: 8 - restart_policy: - condition: on-failure - delay: 30s - max_attempts: 3 - window: 120s - depends_on: - - redis - - mongo - ports: - - "127.0.0.1:3303:3303" - restart: on-failure - healthcheck: - test: [ "CMD-SHELL", "curl -f http://localhost:3303/healthcheck" ] - interval: 30s - timeout: 60s - retries: 3 - start_period: 180s - networks: - testing_net: -# ipv4_address: 172.28.1.16 - logging: - driver: "json-file" - options: - max-size: "50m" - - mongo: - image: mongo - restart: always - ports: - - "127.0.0.1:27017:27017" - networks: - testing_net: - ipv4_address: 172.28.1.12 - logging: - driver: "json-file" - options: - max-size: "50m" - - mongo-express: - image: mongo-express - environment: - - ME_CONFIG_MONGODB_SERVER=mongo - - ME_CONFIG_MONGODB_PORT=27017 - - ME_CONFIG_MONGODB_ENABLE_ADMIN=true - - ME_CONFIG_MONGODB_AUTH_DATABASE=admin - depends_on: - - mongo - ports: - - "127.0.0.1:8888:8081" - networks: - testing_net: - ipv4_address: 172.28.1.14 - logging: - driver: "json-file" - options: - max-size: "50m" - - redis: - image: redis:latest - ports: - - "127.0.0.1:6379:6379" - expose: - - "6379" - volumes: - - ./redis:/data - restart: always -# command: ["redis-server", "--bind", "172.28.1.13", "--port", "6379"] - command: ["redis-server", "--port", "6379"] - logging: - driver: "json-file" - options: - max-size: "50m" - networks: - testing_net: - ipv4_address: 172.28.1.13 + 1kv-core: + build: + context: . + args: + PACKAGE: core + dockerfile: ./Dockerfile + ports: + - "127.0.0.1:3300:3300" + networks: + testing_net: + ipv4_address: 172.28.1.1 + + mongo: + image: mongo + restart: always + ports: + - "127.0.0.1:27017:27017" + networks: + testing_net: + ipv4_address: 172.28.1.2 + + mongo-express: + image: mongo-express + environment: + - ME_CONFIG_MONGODB_SERVER=mongo + - ME_CONFIG_MONGODB_PORT=27017 + - ME_CONFIG_MONGODB_ENABLE_ADMIN=true + - ME_CONFIG_MONGODB_AUTH_DATABASE=admin + depends_on: + - mongo + ports: + - "127.0.0.1:8888:8081" + networks: + testing_net: + ipv4_address: 172.28.1.3 networks: - testing_net: - ipam: - driver: default - config: - - subnet: 172.28.0.0/16 + testing_net: + ipam: + driver: default + config: + - subnet: 172.28.0.0/16 diff --git a/docs/architecture/microservice.png b/docs/architecture/microservice.png deleted file mode 100644 index 092be76458b1d8aa64d3f2ba0233d8ab4217eca1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 338762 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 diff --git a/docs/docs/backend/backend.md b/docs/docs/backend/backend.md index 2a6715774..e2c3da0be 100644 --- a/docs/docs/backend/backend.md +++ b/docs/docs/backend/backend.md @@ -18,15 +18,13 @@ A monorepo containing TypeScript microservices for the . # Overview -> A monorepo containing TypeScript microservices +> A monorepo containing TypeScript packages The monorepo is managed using Yarn workspaces, and contains the following packages: -- [`packages/common`](packages/common): A package containing common code shared across all microservices. +- [`packages/common`](packages/common): A package containing common code shared across all packages. - [`packages/core`](packages/core): A package containing the core logic of the Thousand Validators Program. - [`packages/gateway`](packages/gateway): A package for an API gateway that exposes the backend with a REST API. - [`packages/telemetry`](packages/telemetry): A package for a telemetry client that monitors uptime -- [`packages/worker`](packages/worker): A packages for job queue workers that perform background tasks. - ## Installation & Setup @@ -35,39 +33,10 @@ The monorepo is managed using Yarn workspaces, and contains the following packag There's a few ways of running the backend with docker containers, either in kubernetes, or with docker-compose. -There is the `Current / Monolith` way of running instances, and the `Microservice` way of running instances. - -`Current / Monolith` Architecture: - -![Current / Monolith Architecture](../../architecture/monolith.png) - - -`Microservice` Architecture: - -![Microservice Architecture](../../architecture/microservice.png) +Current Architecture: -The following are different ways of running in either `Current` or `Microservice` architecture with either `Kusama` or `Polkadot`, and either `Development` or `Production`: +![Current Architecture](../../architecture/monolith.png) -- `Kusama Current` - - Running as a monolith with production values -- `Polkadot Current` - - Running as a monolith with production values -- `Kusama Microservice` - - Running as microservices with production values -- `Polkadot Microservice` - - Running as microservices with production values -- `Polkadot Current Dev` - - Running as a monolith with development values -- `Kusama Current Dev` - - Running as a monolith with development values -- `Kusama Microservice Dev` - - Running as microservices with development values -- `Polkadot Microservice Dev` - - Running as microservices with development values - -Each package contains a `Dockerfile`, which is used for running in production, and `Dockerfile-dev`, which is used for development. The development images will use run with `nodemon` so that each time files is saved/changed it will rebuild the image and restart the container. Any changes for the regular run `Dockerfile` will need a manual rebuilding of the docker image. - -The difference of running as either `Current` or `Microservice` is in which docker containers get run with `docker-compose` (Microservices have services separated out as their own containers, and additionally rely on Redis for messages queues). Outside of this everything else (whether it's run as a Kusama or Polkadot instance) is determined by the JSON configuration files that get generated. ### Cloning the Repository ```bash @@ -180,32 +149,13 @@ yarn create-config-polkadot-microservice #### Running `Kusama Current` or `Polkadot Current`: -Either is from the same `docker-compose.current.yml` file, and runs only the `core` container, `mongo` container, and `mongo-express` container. - -Build and run as detached daemon: -```bash -docker compose -f docker-compose.current.yml up -d --build -``` - -#### Running `Kusama Microservice` or `Polkadot Microservice`: - -Either is from the same `docker-compose.microservice.yml` file. This runs `core`, `gateway`, `telemetry`, and `worker` as separate processes in their own container - each one needs it's own configuration file. It additionally runs a `redis`, `mongo`, and `mongo-express` container. - -Build and run as detached daemon: -```bash -docker compose -f docker-compose.microservice.yml up -d --build -``` - -#### Running `Kusama Current Dev`, `Polkadot Current Dev`, `Kusama Microservice Dev`, or `Polkadot Microservice Dev` - -Either is from the same `docker-compose.yml` file. +Either is from the same `docker-compose.yml` file, and runs only the `core` container, `mongo` container, and `mongo-express` container. Build and run as detached daemon: ```bash docker compose -f docker-compose.yml up -d --build ``` - ### Viewing Logs To view the aggregated logs of all the containers: diff --git a/docs/docs/backend/config.md b/docs/docs/backend/config.md index 3488b36db..d8203d8bc 100644 --- a/docs/docs/backend/config.md +++ b/docs/docs/backend/config.md @@ -360,24 +360,6 @@ The format - `forceRound`: Boolean. upon `scorekeeper` starting, will initiate new nominations immediately, regardless of the time since the last nomination. **required**, defaults to `false`. This can be useful to do nominations when there are issues with proxy transations getting stuck for example. - `nominating`: Boolean. Indicates whether the nominator account will create and submit transactions or not. **required**. Nominators will only submit transactions when this is set to `true`, otherwise when a nomination is supposed to occur the process will not do anything when set to `false`. -## Redis - -Configuration for Redis. Redis is used when run as microservices for messages queue passing. When run as a monolith it is not used and not required. When run as microservices, `core`, `gateway`, and `worker` will need to have their own redis parameters specified in their respective config files. - -An example config may look something like: - -```json - "redis": { - "enable": true, - "host": "redis", - "port": 6379 - }, -``` - -- `enable`: Boolean. Enables or disables Redis. **optional**. defaults to `false if not specified -- `host`: String. Redis host. **required** if run as microservices, **optional** if not. -- `port`: Integer. Redis port. **required** if run as microservices, **optional** if not. - ## Server THe `gateway` package uses Koa to serve various db queries from specified endpoints. `gateway` may either be run as a monolith or as a microservice. If run as a microservice, the `gateway` service will need to have its own `server` parameters specified in its config file. @@ -508,11 +490,6 @@ An example `core` config run as microservices may look something like: "forceRound": false, "nominating": false }, - "redis": { - "enable": true, - "host": "redis", - "port": 6379 - }, "server": { "enable": false, "port": 3300 @@ -544,11 +521,6 @@ An example gateway config run as microservices may look something like: "uri": "mongodb://mongo:27017" } }, - "redis": { - "enable": true, - "host": "redis", - "port": 6379 - }, "server": { "enable": true, "port": 3301, @@ -640,11 +612,6 @@ An example Worker config run as microservices may look something like: "useOpenGovDelegation": true, "useRpc": true, "useClient": true - }, - "redis": { - "enable": true, - "host": "redis", - "port": 6379 } } diff --git a/package.json b/package.json index 2b7c7171e..03bd3e6d3 100644 --- a/package.json +++ b/package.json @@ -6,7 +6,6 @@ "workspaces": [ "packages/scorekeeper-status-ui", "packages/common", - "packages/worker", "packages/gateway", "packages/telemetry", "packages/core" @@ -17,44 +16,21 @@ "scorekeeper-status-ui:dev": "yarn workspace @1kv/scorekeeper-status-ui dev", "open:polkadot-apps": "open-cli https://polkadot.js.org/apps/?rpc=ws%3A%2F%2F127.0.0.1%3A9944#/staking", "open:bull": "open-cli http://localhost:3301/bull", - "open:mongo-express: ": "open-cli http://localhost:8888", + "open:mongo-express": "open-cli http://localhost:8888", "create-config-kusama-current": "yarn workspace @1kv/core run create-config-kusama-current", "create-config-polkadot-current": "yarn workspace @1kv/core run create-config-polkadot-current", - "create-config-kusama-current-dev": "yarn workspace @1kv/core run create-config-kusama-current-dev", - "create-config-polkadot-current-dev": "yarn workspace @1kv/core run create-config-polkadot-current-dev", - "create-config-kusama-microservice": "yarn workspaces foreach run create-config-kusama-microservice", - "create-config-polkadot-microservice": "yarn workspaces foreach run create-config-polkadot-microservice", - "create-config-kusama-microservice-dev": "yarn workspaces foreach run create-config-kusama-microservice-dev", - "create-config-polkadot-microservice-dev": "yarn workspaces foreach run create-config-polkadot-microservice-dev", - "docker:kusama-current:start": "yarn run create-config-kusama-current && docker compose -f docker-compose.current.yml up -d --build && yarn run docker:logs", - "docker:polkadot-current:start": "yarn run create-config-polkadot-current && docker compose -f docker-compose.current.yml up -d --build && yarn run docker:logs", - "docker:kusama-current-dev:start": "yarn run create-config-kusama-current-dev && docker compose -f docker-compose.yml up -d --build && yarn run docker:logs", - "docker:polkadot-current-dev:start": "yarn run create-config-polkadot-current-dev && docker compose -f docker-compose.yml up -d --build && yarn run docker:logs", - "docker:kusama-microservice:start": "yarn run create-config-kusama-microservice && docker compose -f docker-compose.microservice.yml up -d --build && yarn run docker:logs", - "docker:kusama-microservice-dev:start": "yarn run create-config-kusama-microservice-dev && docker compose -f docker-compose.yml up -d --build && yarn run docker:logs", - "docker:polkadot-microservice:start": "yarn run create-config-polkadot-microservice && docker compose -f docker-compose.microservice.yml up -d --build && yarn run docker:logs", - "docker:polkadot-microservice-dev:start": "yarn run create-config-polkadot-microservice-dev && docker compose -f docker-compose.yml up -d --build && yarn run docker:logs", + "docker:kusama-current:start": "yarn run create-config-kusama-current && docker compose -f docker-compose.yml up -d --build && yarn run docker:logs", + "docker:polkadot-current:start": "yarn run create-config-polkadot-current && docker compose -f docker-compose.yml up -d --build && yarn run docker:logs", "docker:logs": "docker compose logs -f", "docker:logs:core": "docker logs 1k-validators-be-1kv-core-1 -f", - "docker:logs:gateway": "docker logs 1k-validators-be-1kv-gateway-1 -f", - "docker:logs:telemetry": "docker logs 1k-validators-be-1kv-telemetry-1 -f", - "docker:logs:worker": "docker logs 1k-validators-be-1kv-worker-1 -f", "docker:stop": "docker compose down", "lint": "yarn workspaces foreach run lint", "lint:fix": "yarn workspaces foreach run lint:fix", - "clean": "rm -rf redis/ && yarn workspaces foreach run clean", + "clean": "yarn workspaces foreach run clean", "build": "yarn run docs && yarn workspaces foreach -t run build", - "build:prod": "yarn workspaces foreach -pt run build:prod", - "build:core": "yarn workspace @1kv/common run build run build && yarn workspace @1kv/gateway run build && yarn workspace @1kv/telemetry run build && yarn workspace @1kv/worker run build && yarn workspace @1kv/core run build", "build:clean": "yarn workspaces foreach run clean:build", - "start:dev:gateway": "yarn workspace @1kv/gateway run start:dev", - "start:js:gateway": "NODE_OPTIONS='--max-old-space-size=10096' yarn workspace @1kv/gateway run js:start", "start:dev:core": "yarn workspace @1kv/core run start:dev", "start:js:core": "NODE_OPTIONS='--max-old-space-size=10096' yarn workspace @1kv/core run js:start", - "start:dev:telemetry": "yarn workspace @1kv/telemetry run start:dev", - "start:js:telemetry": "NODE_OPTIONS='--max-old-space-size=10096' yarn workspace @1kv/telemetry run js:start", - "start:dev:worker": "yarn workspace @1kv/worker run start:dev", - "start:js:worker": "NODE_OPTIONS='--max-old-space-size=10096' yarn workspace @1kv/worker run js:start", "test:core": "yarn workspace @1kv/core run test", "test:common:int": "yarn workspace @1kv/common run test:int", "test:common:unit": "yarn workspace @1kv/common run test:unit", @@ -99,7 +75,6 @@ "@1kv/common": "workspace:*", "@1kv/gateway": "workspace:*", "@1kv/telemetry": "workspace:*", - "@1kv/worker": "workspace:*", "@bull-board/api": "^5.15.1", "@bull-board/koa": "^5.15.0", "@koa/router": "^12.0.1", diff --git a/packages/common/Dockerfile b/packages/common/Dockerfile deleted file mode 100644 index 8fd6d5bed..000000000 --- a/packages/common/Dockerfile +++ /dev/null @@ -1,7 +0,0 @@ -FROM node:17-slim -ARG MATRIX_TOKEN -WORKDIR /code -COPY . . -RUN ["npm", "i"] -RUN ["npm", "run", "build"] -CMD ["npm", "run", "js:start"] diff --git a/packages/common/Dockerfile-dev b/packages/common/Dockerfile-dev deleted file mode 100644 index 7b2ec4f15..000000000 --- a/packages/common/Dockerfile-dev +++ /dev/null @@ -1,4 +0,0 @@ -FROM node:18 AS builder -COPY . /app -WORKDIR /app -RUN npm install -g typescript && yarn set version 3.2.2 && yarn install && yarn workspace @1kv/common build diff --git a/packages/common/esbuild.js b/packages/common/esbuild.js deleted file mode 100644 index 8bd0743c8..000000000 --- a/packages/common/esbuild.js +++ /dev/null @@ -1,98 +0,0 @@ -import esbuild from "esbuild"; - -const isProduction = process.argv.includes("--prod"); - -const externalPackages = [ - "@polkadot/api-augment", - "velocityjs", - "dustjs-linkedin", - "atpl", - "liquor", - "twig", - "eco", - "jazz", - "jqtpl", - "hamljs", - "hamlet", - "whiskers", - "haml-coffee", - "hogan.js", - "templayed", - "underscore", - "walrus", - "mustache", - "just", - "ect", - "mote", - "toffee", - "dot", - "bracket-template", - "ractive", - "htmling", - "babel-core", - "plates", - "vash", - "slm", - "marko", - "teacup/lib/express", - "coffee-script", - "squirrelly", - "twing", - "matris-js-sdk", - "@1kv/telemetry", - "@1kv/gateway", - "@1kv/common", - "mongoose", - "logform", - "winston", - "ws", - "form-data", - "combined-stream", - "proxy-from-env", - "follow-redirects", - "cron", - "coingecko-api-v3", - "matrix-js-sdk", - "node-mongodb-native", - "mongoose", -]; - -const buildOptions = { - entryPoints: ["src/index.ts"], - bundle: true, - minify: isProduction, - platform: "node", - target: "node18", - external: externalPackages, - outdir: "build", - tsconfig: "tsconfig.json", - // splitting: true, - format: "esm", - sourcemap: !isProduction, - logLevel: "info", -}; - -if (process.argv.includes("--watch")) { - buildOptions.watch = { - onRebuild(error, result) { - if (error) console.error("watch build failed:", error); - else - console.log( - "watch build succeeded at", - new Date().toLocaleTimeString(), - ); - }, - }; - console.log("watch mode enabled"); -} - -if (isProduction) { - buildOptions.define = { - "process.env.NODE_ENV": "'production'", - }; -} - -esbuild.build(buildOptions).catch((error) => { - console.error(error); - process.exit(1); -}); diff --git a/packages/common/package.json b/packages/common/package.json index 0d49037e1..c2054dae7 100644 --- a/packages/common/package.json +++ b/packages/common/package.json @@ -6,7 +6,6 @@ "types": "build/index.d.ts", "scripts": { "build": "tsc --build tsconfig.json", - "build:prod": "node esbuild.js --prod", "docker": "docker-compose rm -f; docker-compose build --no-cache; docker-compose up -d", "lint": "../../node_modules/.bin/eslint 'src/**/*.{js,ts,tsx}' --quiet", "lint:fix": "../../node_modules/.bin/eslint 'src/**/*.{js,ts,tsx, json}' --quiet --fix", diff --git a/packages/common/src/config.ts b/packages/common/src/config.ts index 5f28061e1..b34c2e813 100644 --- a/packages/common/src/config.ts +++ b/packages/common/src/config.ts @@ -100,11 +100,6 @@ export type ConfigSchema = { room: string; userId: string; }; - redis: { - enable: boolean; - host: string; - port: number; - }; proxy: { timeDelayBlocks: number; blacklistedAnnouncements: string[]; diff --git a/packages/common/src/scorekeeper/jobs/JobsRunnerFactory.ts b/packages/common/src/scorekeeper/jobs/JobsRunnerFactory.ts index 52912d8af..508e99134 100644 --- a/packages/common/src/scorekeeper/jobs/JobsRunnerFactory.ts +++ b/packages/common/src/scorekeeper/jobs/JobsRunnerFactory.ts @@ -1,4 +1,3 @@ -import { MicroserviceJobRunner } from "./MicroserviceJobRunner"; import { MonolithJobRunner } from "./MonolithJobRunner"; import { JobsRunner } from "./JobRunner"; import { JobRunnerMetadata } from "./JobsClass"; @@ -7,8 +6,6 @@ export class JobsRunnerFactory { static makeJobs = async ( metadata: JobRunnerMetadata, ): Promise => { - if (!metadata.config?.redis?.host && metadata.config?.redis?.port) - return new MicroserviceJobRunner(metadata); - else return new MonolithJobRunner(metadata); + return new MonolithJobRunner(metadata); }; } diff --git a/packages/common/src/scorekeeper/jobs/MicroserviceJobRunner.ts b/packages/common/src/scorekeeper/jobs/MicroserviceJobRunner.ts deleted file mode 100644 index 72502b537..000000000 --- a/packages/common/src/scorekeeper/jobs/MicroserviceJobRunner.ts +++ /dev/null @@ -1,83 +0,0 @@ -import { logger } from "../..//index"; - -// import { otvWorker } from "@1kv/worker"; -import { scorekeeperLabel } from "../scorekeeper"; -import { JobsRunner } from "./JobRunner"; -import { Job } from "./JobsClass"; - -export class MicroserviceJobRunner extends JobsRunner { - _startSpecificJobs = async (): Promise => { - const { config, chaindata } = this.metadata; - if (!config?.redis?.host || !config?.redis?.port) { - logger.error( - `No redis config found. Microservice Jobs will not be started.`, - scorekeeperLabel, - ); - return []; - } - try { - // Jobs get run in separate worker - logger.info(`Starting bullmq Queues and Workers....`, scorekeeperLabel); - // const releaseMonitorQueue = - // await otvWorker.queues.createReleaseMonitorQueue( - // config.redis.host, - // config.redis.port, - // ); - // const constraintsQueue = await otvWorker.queues.createConstraintsQueue( - // config.redis.host, - // config.redis.port, - // ); - // const chaindataQueue = await otvWorker.queues.createChainDataQueue( - // config.redis.host, - // config.redis.port, - // ); - // const blockQueue = await otvWorker.queues.createBlockQueue( - // config.redis.host, - // config.redis.port, - // ); - // - // const removeRepeatableJobs = true; - // if (removeRepeatableJobs) { - // logger.info(`remove jobs: ${removeRepeatableJobs}`, scorekeeperLabel); - // // Remove any previous repeatable jobs - // await otvWorker.queues.removeRepeatableJobsFromQueues([ - // releaseMonitorQueue, - // constraintsQueue, - // chaindataQueue, - // blockQueue, - // ]); - // } - // - // const obliterateQueues = false; - // if (obliterateQueues) { - // await otvWorker.queues.obliterateQueues([ - // releaseMonitorQueue, - // constraintsQueue, - // chaindataQueue, - // blockQueue, - // ]); - // } - // - // // Add repeatable jobs to the queues - // // Queues need to have different repeat time intervals - // await otvWorker.queues.addReleaseMonitorJob(releaseMonitorQueue, 60000); - // await otvWorker.queues.addValidityJob(constraintsQueue, 1000001); - // await otvWorker.queues.addScoreJob(constraintsQueue, 100002); - // await otvWorker.queues.addActiveValidatorJob(chaindataQueue, 100003); - // await otvWorker.queues.addEraPointsJob(chaindataQueue, 100006); - // await otvWorker.queues.addEraStatsJob(chaindataQueue, 110008); - // await otvWorker.queues.addInclusionJob(chaindataQueue, 100008); - // await otvWorker.queues.addNominatorJob(chaindataQueue, 100009); - // await otvWorker.queues.addSessionKeyJob(chaindataQueue, 100010); - // await otvWorker.queues.addValidatorPrefJob(chaindataQueue, 100101); - // await otvWorker.queues.addAllBlocks(blockQueue, chaindata); - // TODO update this as queue job - // await startLocationStatsJob(this.config, this.chaindata); - return []; - } catch (e) { - logger.error(JSON.stringify(e), scorekeeperLabel); - logger.error("Error starting microservice jobs", scorekeeperLabel); - return []; - } - }; -} diff --git a/packages/core/Dockerfile b/packages/core/Dockerfile deleted file mode 100644 index 8fd6d5bed..000000000 --- a/packages/core/Dockerfile +++ /dev/null @@ -1,7 +0,0 @@ -FROM node:17-slim -ARG MATRIX_TOKEN -WORKDIR /code -COPY . . -RUN ["npm", "i"] -RUN ["npm", "run", "build"] -CMD ["npm", "run", "js:start"] diff --git a/packages/core/Dockerfile-dev b/packages/core/Dockerfile-dev deleted file mode 100644 index 6e4e0a919..000000000 --- a/packages/core/Dockerfile-dev +++ /dev/null @@ -1,7 +0,0 @@ -FROM node:18 AS builder -COPY . /app -WORKDIR /app -RUN yarn set version 3.2.2 && \ - yarn install && \ - yarn workspace @1kv/core build -CMD yarn start:dev:core diff --git a/packages/core/config/kusama.microservice.dev.sample.json b/packages/core/config/kusama.microservice.dev.sample.json deleted file mode 100644 index 7a8cc3128..000000000 --- a/packages/core/config/kusama.microservice.dev.sample.json +++ /dev/null @@ -1,137 +0,0 @@ -{ - "global": { - "dryRun": false, - "networkPrefix": 2, - "apiEndpoints": [ - "wss://kusama-rpc-tn.dwellir.com", - "wss://kusama-rpc.dwellir.com", - "wss://kusama.public.curie.radiumblock.xyz/ws", - "wss://rpc.ibp.network/kusama", - "wss://rpc.dotters.network/kusama", - "wss://ksm-rpc.stakeworld.io" - ], - "apiPeopleEndpoints": ["wss://kusama-people-rpc.polkadot.io"], - "kusamaBootstrapEndpoint": "https://kusama.w3f.community", - "polkadotBootstrapEndpoint": "https://polkadot.w3f.community", - "candidatesUrl": "https://raw.githubusercontent.com/w3f/1k-validators-be/master/candidates/kusama.json" - }, - "cron": { - "monitorEnabled": true, - "clearOfflineEnabled": true, - "validityEnabled": true, - "scoreEnabled": true, - "executionEnabled": true, - "scorekeeperEnabled": true, - "rewardClaimingEnabled": true, - "cancelEnabled": true, - "staleEnabled": true, - "eraPointsEnabled": true, - "eraStatsEnabled": true, - "activeValidatorEnabled": true, - "inclusionEnabled": true, - "sessionKeyEnabled": true, - "unclaimedErasEnabled": true, - "validatorPrefEnabled": true, - "nominatorEnabled": true, - "locationStatsEnabled": true, - "blockEnabled": true - }, - "constraints": { - "skipConnectionTime": true, - "skipIdentity": false, - "skipUnclaimed": false, - "clientUpgrade": { - "skip": false - }, - "minSelfStake": 10000000000000, - "commission": 150000000, - "unclaimedEraThreshold": 4, - "sanctionedGeoArea": { - "skip": false, - "sanctionedCountries": ["XXX"], - "sanctionedRegions": ["XXX"] - } - }, - "db": { - "mongo": { - "uri": "mongodb://mongo:27017" - } - }, - "matrix": { - "enabled": false, - "baseUrl": "https://matrix.org", - "room": "!mdugGIKqSTweIOpTlA:web3.foundation", - "userId": "@1kv-stats:matrix.org" - }, - "proxy": { - "timeDelayBlocks": "10850", - "blacklistedAnnouncements": [] - }, - "score": { - "inclusion": "200", - "spanInclusion": "200", - "discovered": "5", - "nominated": "30", - "rank": "5", - "bonded": "50", - "faults": "5", - "offline": "2", - "location": "40", - "region": "10", - "country": "10", - "provider": "100", - "nominations": "100", - "rpc": "100", - "client": "100", - "useInclusion": true, - "useSpanInclusion": true, - "useDiscovered": true, - "useNominated": true, - "useRank": true, - "useBonded": true, - "useFaults": true, - "useOffline": true, - "useLocation": true, - "useRegion": true, - "useCountry": true, - "useProvider": true, - "useNominations": true, - "useDelegations": true, - "useOpenGov": true, - "useOpenGovDelegation": true, - "useRpc": true, - "useClient": true - }, - "scorekeeper": { - "forceRound": false, - "nominating": false - }, - "redis": { - "enable": true, - "host": "redis", - "port": 6379 - }, - "server": { - "onlyHealth": true, - "port": 3300 - }, - "telemetry": { - "blacklistedProviders": [ - "Hetzner Online GmbH", - "Contabo Inc.", - "Contabo GmbH" - ], - "enable": false, - "chains": [ - "0xb0a8d493285c2df73290dfb7e61f870f17b41801197a149ca93654499ea3dafe" - ], - "host": "wss://telemetry-backend.w3f.community/feed" - }, - "logger": { - "level": "info", - "excludedLabels": [ - "Location", - "ValidatorPrefJob" - ] - } -} diff --git a/packages/core/config/kusama.microservice.sample.json b/packages/core/config/kusama.microservice.sample.json deleted file mode 100644 index 951b6fcaa..000000000 --- a/packages/core/config/kusama.microservice.sample.json +++ /dev/null @@ -1,95 +0,0 @@ -{ - "global": { - "networkPrefix": 2, - "apiEndpoints": [ - "wss://kusama-rpc-tn.dwellir.com", - "wss://kusama-rpc.dwellir.com", - "wss://kusama.public.curie.radiumblock.xyz/ws", - "wss://rpc.ibp.network/kusama", - "wss://rpc.dotters.network/kusama", - "wss://ksm-rpc.stakeworld.io" - ], - "apiPeopleEndpoints": ["wss://kusama-people-rpc.polkadot.io"], - "kusamaBootstrapEndpoint": "https://kusama.w3f.community", - "polkadotBootstrapEndpoint": "https://polkadot.w3f.community", - "candidatesUrl": "https://raw.githubusercontent.com/w3f/1k-validators-be/master/candidates/kusama.json" - }, - "constraints": { - "skipConnectionTime": true, - "skipIdentity": false, - "skipUnclaimed": false, - "clientUpgrade": { - "skip": false - }, - "minSelfStake": 10000000000000, - "commission": 150000000, - "unclaimedEraThreshold": 4, - "sanctionedGeoArea": { - "skip": false, - "sanctionedCountries": ["XXX"], - "sanctionedRegions": ["XXX"] - } - }, - "db": { - "mongo": { - "uri": "mongodb://mongo:27017" - } - }, - "matrix": { - "enabled": false, - "baseUrl": "https://matrix.org", - "room": "!mdugGIKqSTweIOpTlA:web3.foundation", - "userId": "@1kv-stats:matrix.org" - }, - "proxy": { - "timeDelayBlocks": "10850", - "blacklistedAnnouncements": [] - }, - "score": { - "inclusion": "200", - "spanInclusion": "200", - "discovered": "5", - "nominated": "30", - "rank": "5", - "bonded": "50", - "faults": "5", - "offline": "2", - "location": "40", - "region": "10", - "country": "10", - "provider": "100", - "nominations": "100" - }, - "scorekeeper": { - "forceRound": false, - "nominating": false - }, - "redis": { - "enable": true, - "host": "redis", - "port": 6379 - }, - "server": { - "onlyHealth": true, - "port": 3300 - }, - "telemetry": { - "blacklistedProviders": [ - "Hetzner Online GmbH", - "Contabo Inc.", - "Contabo GmbH" - ], - "enable": false, - "chains": [ - "0xb0a8d493285c2df73290dfb7e61f870f17b41801197a149ca93654499ea3dafe" - ], - "host": "wss://telemetry-backend.w3f.community/feed" - }, - "logger": { - "level": "info", - "excludedLabels": [ - "Location", - "ValidatorPrefJob" - ] - } -} diff --git a/packages/core/config/main.sample.json b/packages/core/config/main.sample.json index e8a952a27..4f02f73ac 100644 --- a/packages/core/config/main.sample.json +++ b/packages/core/config/main.sample.json @@ -123,10 +123,6 @@ "enable": true, "port": 3300 }, - "redis": { - "host": "redis", - "port": 6379 - }, "telemetry": { "blacklistedProviders": [ "Hetzner Online GmbH", diff --git a/packages/core/config/polkadot.microservice.dev.sample.json b/packages/core/config/polkadot.microservice.dev.sample.json deleted file mode 100644 index 177a762f7..000000000 --- a/packages/core/config/polkadot.microservice.dev.sample.json +++ /dev/null @@ -1,112 +0,0 @@ -{ - "global": { - "networkPrefix": 0, - "apiEndpoints": [ - "wss://rpc.dotters.network/polkadot", - "wss://dot-rpc.stakeworld.io", - "wss://polkadot.public.curie.radiumblock.co/ws", - "wss://rpc.ibp.network/polkadot", - "wss://polkadot-rpc-tn.dwellir.com" - ], - "kusamaBootstrapEndpoint": "https://kusama.w3f.community", - "polkadotBootstrapEndpoint": "https://polkadot.w3f.community", - "candidatesUrl": "https://raw.githubusercontent.com/w3f/1k-validators-be/master/candidates/polkadot.json" - }, - "constraints": { - "skipConnectionTime": false, - "skipIdentity": false, - "skipUnclaimed": true, - "clientUpgrade": { - "skip": false - }, - "minSelfStake": 50000000000000, - "commission": 50000000, - "unclaimedEraThreshold": 1, - "sanctionedGeoArea": { - "skip": false, - "sanctionedCountries": ["XXX"], - "sanctionedRegions": ["XXX"] - } - }, - "db": { - "mongo": { - "uri": "mongodb://mongo:27017" - } - }, - "matrix": { - "enabled": false, - "baseUrl": "https://matrix.org", - "room": "!mdugGIKqSTweIOpTlA:web3.foundation", - "userId": "@1kv-stats:matrix.org" - }, - "proxy": { - "timeDelayBlocks": "10850", - "blacklistedAnnouncements": [] - }, - "score": { - "inclusion": "200", - "spanInclusion": "200", - "discovered": "5", - "nominated": "30", - "rank": "5", - "bonded": "50", - "faults": "5", - "offline": "2", - "location": "40", - "region": "10", - "country": "10", - "provider": "100", - "nominations": "100", - "rpc": "100", - "client": "100", - "useInclusion": true, - "useSpanInclusion": true, - "useDiscovered": true, - "useNominated": true, - "useRank": true, - "useBonded": true, - "useFaults": true, - "useOffline": true, - "useLocation": true, - "useRegion": true, - "useCountry": true, - "useProvider": true, - "useNominations": true, - "useDelegations": true, - "useOpenGov": true, - "useOpenGovDelegation": true, - "useRpc": true, - "useClient": true - }, - "scorekeeper": { - "forceRound": false, - "nominating": false - }, - "redis": { - "host": "redis", - "port": 6379 - }, - "server": { - "onlyHealth": true, - "port": 3300 - }, - "telemetry": { - "blacklistedProviders": [ - "Hetzner Online GmbH", - "Contabo Inc.", - "Contabo GmbH" - ], - "enable": false, - "chains": [ - "0xb0a8d493285c2df73290dfb7e61f870f17b41801197a149ca93654499ea3dafe" - ], - "host": "wss://telemetry-backend.w3f.community/feed" - }, - "logger": { - "level": "info", - "excludedLabels": [ - "Location", - "ValidatorPrefJob" - ] - } -} diff --git a/packages/core/config/polkadot.microservice.sample.json b/packages/core/config/polkadot.microservice.sample.json deleted file mode 100644 index 9ad6bf7d3..000000000 --- a/packages/core/config/polkadot.microservice.sample.json +++ /dev/null @@ -1,113 +0,0 @@ -{ - "global": { - "networkPrefix": 0, - "apiEndpoints": [ - "wss://rpc.dotters.network/polkadot", - "wss://dot-rpc.stakeworld.io", - "wss://polkadot.public.curie.radiumblock.co/ws", - "wss://rpc.ibp.network/polkadot", - "wss://polkadot-rpc-tn.dwellir.com" - ], - "kusamaBootstrapEndpoint": "https://kusama.w3f.community", - "polkadotBootstrapEndpoint": "https://polkadot.w3f.community", - "candidatesUrl": "https://raw.githubusercontent.com/w3f/1k-validators-be/master/candidates/polkadot.json" - }, - "constraints": { - "skipConnectionTime": false, - "skipIdentity": false, - "skipUnclaimed": true, - "clientUpgrade": { - "skip": false - }, - "minSelfStake": 50000000000000, - "commission": 50000000, - "unclaimedEraThreshold": 1, - "sanctionedGeoArea": { - "skip": false, - "sanctionedCountries": ["XXX"], - "sanctionedRegions": ["XXX"] - } - }, - "db": { - "mongo": { - "uri": "mongodb://mongo:27017" - } - }, - "matrix": { - "enabled": false, - "baseUrl": "https://matrix.org", - "room": "!mdugGIKqSTweIOpTlA:web3.foundation", - "userId": "@1kv-stats:matrix.org" - }, - "proxy": { - "timeDelayBlocks": "10850", - "blacklistedAnnouncements": [] - }, - "score": { - "inclusion": "200", - "spanInclusion": "200", - "discovered": "5", - "nominated": "30", - "rank": "5", - "bonded": "50", - "faults": "5", - "offline": "2", - "location": "40", - "region": "10", - "country": "10", - "provider": "100", - "nominations": "100", - "rpc": "100", - "client": "100", - "useInclusion": true, - "useSpanInclusion": true, - "useDiscovered": true, - "useNominated": true, - "useRank": true, - "useBonded": true, - "useFaults": true, - "useOffline": true, - "useLocation": true, - "useRegion": true, - "useCountry": true, - "useProvider": true, - "useNominations": true, - "useDelegations": true, - "useOpenGov": true, - "useOpenGovDelegation": true, - "useRpc": true, - "useClient": true - }, - "scorekeeper": { - "forceRound": false, - "nominating": false - }, - "redis": { - "enable": true, - "host": "redis", - "port": 6379 - }, - "server": { - "onlyHealth": true, - "port": 3300 - }, - "telemetry": { - "blacklistedProviders": [ - "Hetzner Online GmbH", - "Contabo Inc.", - "Contabo GmbH" - ], - "enable": false, - "chains": [ - "0xb0a8d493285c2df73290dfb7e61f870f17b41801197a149ca93654499ea3dafe" - ], - "host": "wss://telemetry-backend.w3f.community/feed" - }, - "logger": { - "level": "info", - "excludedLabels": [ - "Location", - "ValidatorPrefJob" - ] - } -} diff --git a/packages/core/esbuild.js b/packages/core/esbuild.js deleted file mode 100644 index 1f0e2edf6..000000000 --- a/packages/core/esbuild.js +++ /dev/null @@ -1,87 +0,0 @@ -import esbuild from "esbuild"; - -const externalPackages = [ - "@polkadot/api-augment", - "velocityjs", - "dustjs-linkedin", - "atpl", - "liquor", - "twig", - "eco", - "jazz", - "jqtpl", - "hamljs", - "hamlet", - "whiskers", - "haml-coffee", - "hogan.js", - "templayed", - "underscore", - "walrus", - "mustache", - "just", - "ect", - "mote", - "toffee", - "dot", - "bracket-template", - "ractive", - "htmling", - "babel-core", - "plates", - "vash", - "slm", - "marko", - "teacup/lib/express", - "coffee-script", - "squirrelly", - "twing", - "matris-js-sdk", - "@1kv/telemetry", - "@1kv/gateway", - "@1kv/common", -]; - -const isProduction = process.argv.includes("--prod"); - -const buildOptions = { - entryPoints: ["src/index.ts"], - bundle: true, - minify: isProduction, - platform: "node", - target: "node18", - external: externalPackages, - outdir: "build", - // entryNames: "[dir]/[name].mjs", - tsconfig: "tsconfig.json", - splitting: true, - format: "esm", - // outExtension: { ".js": ".mjs" }, - sourcemap: !isProduction, - logLevel: "info", -}; - -if (process.argv.includes("--watch")) { - buildOptions.watch = { - onRebuild(error, result) { - if (error) console.error("watch build failed:", error); - else - console.log( - "watch build succeeded at", - new Date().toLocaleTimeString(), - ); - }, - }; - console.log("watch mode enabled"); -} - -if (isProduction) { - buildOptions.define = { - "process.env.NODE_ENV": "'production'", - }; -} - -esbuild.build(buildOptions).catch((error) => { - console.error(error); - process.exit(1); -}); diff --git a/packages/core/package.json b/packages/core/package.json index 7f3434789..179579053 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -7,23 +7,15 @@ "open:polkadot-apps": "open-cli https://polkadot.js.org/apps/?rpc=ws%3A%2F%2F127.0.0.1%3A9944#/staking", "open:telemetry": "open-cli http://localhost:3000", "build": "tsc --build tsconfig.json", - "build:prod": "node esbuild.js --prod", "docker": "docker-compose rm -f; docker-compose build --no-cache; docker-compose up -d", "clean": "../../node_modules/.bin/rimraf ./build tsconfig.tsbuildinfo combined.log", "clean:build": "yarn clean && yarn build", - "create-config-kusama-current-dev": "cp ./config/kusama.current.dev.sample.json ./config/main.json && cp ./config/secret.sample.json ./config/secret.json", - "create-config-polkadot-current-dev": "cp ./config/polkadot.current.dev.sample.json ./config/main.json && cp ./config/secret.sample.json ./config/secret.json", - "create-config-kusama-microservice-dev": "cp ./config/kusama.microservice.dev.sample.json ./config/main.json && cp ./config/secret.sample.json ./config/secret.json", - "create-config-polkadot-microservice-dev": "cp ./config/polkadot.microservice.dev.sample.json ./config/main.json && cp ./config/secret.sample.json ./config/secret.json", "create-config-kusama-current": "cp ./config/kusama.current.sample.json ./config/main.json && cp ./config/secret.sample.json ./config/secret.json", "create-config-polkadot-current": "cp ./config/polkadot.current.sample.json ./config/main.json && cp ./config/secret.sample.json ./config/secret.json", - "create-config-kusama-microservice": "cp ./config/kusama.microservice.sample.json ./config/main.json && cp ./config/secret.sample.json ./config/secret.json", - "create-config-polkadot-microservice": "cp ./config/polkadot.microservice.sample.json ./config/main.json && cp ./config/secret.sample.json ./config/secret.json", "lint": "../../node_modules/.bin/eslint 'src/**/*.{js,ts,tsx}' --quiet", "lint:fix": "../../node_modules/.bin/eslint 'src/**/*.{js,ts,tsx, json}' --quiet --fix", - "start": "NODE_OPTIONS='--max-old-space-size=8096' ts-node src/index.ts start", - "start:watch": "nodemon --watch build --exec node --max-old-space-size=8024 build/index.js", - "start:dev": "node esbuild.js --watch & npx nodemon --watch build --exec node --max-old-space-size=8024 build/index.mjs", + "start:dev": "NODE_OPTIONS='--max-old-space-size=8096' ts-node src/index.ts start", + "watch": "npx nodemon --watch src -x \"yarn start:dev\"", "js:start": "NODE_OPTIONS='--max-old-space-size=10096' node build/index.js start", "test": "yarn test:unit && yarn test:int", "test:unit": "jest --config=jest.unit.config.js --verbose", diff --git a/packages/core/tsconfig.json b/packages/core/tsconfig.json index a934b32cf..acb774fb1 100644 --- a/packages/core/tsconfig.json +++ b/packages/core/tsconfig.json @@ -10,8 +10,7 @@ "paths": { "@1kv/common": ["../common/build"], "@1kv/gateway": ["../gateway/build"], - "@1kv/telemetry": ["../telemetry/build"], - "@1kv/worker": ["../worker/build"] + "@1kv/telemetry": ["../telemetry/build"] }, /* Basic Options */ "target": "es2015", /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017','ES2018' or 'ESNEXT'. */ @@ -74,7 +73,6 @@ "references": [ { "path": "../common" }, { "path": "../gateway" }, - { "path": "../telemetry" }, - { "path": "../worker" } + { "path": "../telemetry" } ] } diff --git a/packages/gateway/Dockerfile b/packages/gateway/Dockerfile deleted file mode 100644 index 8fd6d5bed..000000000 --- a/packages/gateway/Dockerfile +++ /dev/null @@ -1,7 +0,0 @@ -FROM node:17-slim -ARG MATRIX_TOKEN -WORKDIR /code -COPY . . -RUN ["npm", "i"] -RUN ["npm", "run", "build"] -CMD ["npm", "run", "js:start"] diff --git a/packages/gateway/Dockerfile-dev b/packages/gateway/Dockerfile-dev deleted file mode 100644 index 33b50a4a7..000000000 --- a/packages/gateway/Dockerfile-dev +++ /dev/null @@ -1,8 +0,0 @@ -FROM node:18 AS builder -COPY . /app -WORKDIR /app -RUN yarn set version 3.2.2 && \ - yarn install && \ - yarn workspace @1kv/common build && \ - yarn workspace @1kv/gateway build -CMD yarn start:dev:gateway diff --git a/packages/gateway/config/sample.json b/packages/gateway/config/sample.json index 01c25d60b..9be5e3971 100644 --- a/packages/gateway/config/sample.json +++ b/packages/gateway/config/sample.json @@ -4,11 +4,6 @@ "uri": "mongodb://mongo:27017" } }, - "redis": { - "host": "redis", - "port": 6379, - "cache": 180000 - }, "server": { "port": 3301 } diff --git a/packages/gateway/esbuild.mjs b/packages/gateway/esbuild.mjs deleted file mode 100644 index df171caab..000000000 --- a/packages/gateway/esbuild.mjs +++ /dev/null @@ -1,97 +0,0 @@ -import esbuild from "esbuild"; -import packageJson from '../../package.json' assert {type: 'json'}; - -const deps = Object.keys(packageJson.dependencies || {}); - - -const externalPackages = [ - "@polkadot/api-augment", - "velocityjs", - "dustjs-linkedin", - "atpl", - "liquor", - "twig", - "eco", - "jazz", - "jqtpl", - "hamljs", - "hamlet", - "whiskers", - "haml-coffee", - "hogan.js", - "templayed", - "underscore", - "walrus", - "mustache", - "just", - "ect", - "mote", - "toffee", - "dot", - "bracket-template", - "ractive", - "htmling", - "babel-core", - "plates", - "vash", - "slm", - "marko", - "teacup/lib/express", - "coffee-script", - "squirrelly", - "twing", - "matris-js-sdk", - "@1kv/telemetry", - "@1kv/gateway", - "tty", - "koa", - "coingecko-api-v3", - "node-mongodb-native", - "mongoose", - "events" - "@bull-board" - // "@1kv/common" -]; - -const isProduction = process.argv.includes("--prod"); - -const buildOptions = { - entryPoints: ["src/index.ts"], - bundle: true, - minify: isProduction, - platform: "node", - target: "node18", - external: [...deps, ...externalPackages], - outdir: "build", - tsconfig: "tsconfig.json", - splitting: false, - format: "esm", - chunkNames: "chunks/[name]-[hash]", - sourcemap: !isProduction, - logLevel: "info", -}; - -if (process.argv.includes("--watch")) { - buildOptions.watch = { - onRebuild(error, result) { - if (error) console.error("watch build failed:", error); - else - console.log( - "watch build succeeded at", - new Date().toLocaleTimeString(), - ); - }, - }; - console.log("watch mode enabled"); -} - -if (isProduction) { - buildOptions.define = { - "process.env.NODE_ENV": "'production'", - }; -} - -esbuild.build(buildOptions).catch((error) => { - console.error(error); - process.exit(1); -}); diff --git a/packages/gateway/package.json b/packages/gateway/package.json index 0ad3e4e1b..88ca7d299 100644 --- a/packages/gateway/package.json +++ b/packages/gateway/package.json @@ -6,13 +6,8 @@ "types": "build/index.d.ts", "scripts": { "build": "tsc --build tsconfig.json", - "build:prod": "node esbuild.mjs --prod", "clean": "../../node_modules/.bin/rimraf ./build tsconfig.tsbuildinfo combined.log", "clean:build": "yarn clean && yarn build", - "create-config-kusama-microservice": "cp config/sample.json ./config/main.json", - "create-config-kusama-microservice-dev": "cp config/sample.json ./config/main.json", - "create-config-polkadot-microservice": "cp config/sample.json ./config/main.json", - "create-config-polkadot-microservice-dev": "cp config/sample.json ./config/main.json", "docker": "docker-compose rm -f; docker-compose build --no-cache; docker-compose up -d", "lint": "../../node_modules/.bin/eslint 'src/**/*.{js,ts,tsx}' --quiet", "lint:fix": "../../node_modules/.bin/eslint 'src/**/*.{js,ts,tsx}' --quiet --fix", diff --git a/packages/gateway/src/constants.ts b/packages/gateway/src/constants.ts new file mode 100644 index 000000000..d2d3fb711 --- /dev/null +++ b/packages/gateway/src/constants.ts @@ -0,0 +1 @@ +export const gatewayLabel = { label: "Gateway" }; diff --git a/packages/gateway/src/controllers/Candidate.ts b/packages/gateway/src/controllers/Candidate.ts index 9e6fe75c8..962fb5686 100644 --- a/packages/gateway/src/controllers/Candidate.ts +++ b/packages/gateway/src/controllers/Candidate.ts @@ -1,7 +1,7 @@ import * as CandidateService from "../services/Candidate"; import { response } from "./index"; import { logger } from "@1kv/common"; -import { gatewayLabel } from "../run"; +import { gatewayLabel } from "../constants"; import { requestEmitter } from "../events/requestEmitter"; export default class CandidateController { diff --git a/packages/gateway/src/controllers/EraPoints.ts b/packages/gateway/src/controllers/EraPoints.ts index 3d57849ad..a775772b0 100644 --- a/packages/gateway/src/controllers/EraPoints.ts +++ b/packages/gateway/src/controllers/EraPoints.ts @@ -1,7 +1,7 @@ import { response } from "./index"; import * as EraPointsService from "../services/EraPoints"; import { logger } from "@1kv/common"; -import { gatewayLabel } from "../run"; +import { gatewayLabel } from "../constants"; import { requestEmitter } from "../events/requestEmitter"; export default class EraPointsController { diff --git a/packages/gateway/src/controllers/Location.ts b/packages/gateway/src/controllers/Location.ts index 4d7503bb2..ee00173be 100644 --- a/packages/gateway/src/controllers/Location.ts +++ b/packages/gateway/src/controllers/Location.ts @@ -1,7 +1,7 @@ import { response } from "./index"; import * as LocationService from "../services/LocationService"; import { logger } from "@1kv/common"; -import { gatewayLabel } from "../run"; +import { gatewayLabel } from "../constants"; import { requestEmitter } from "../events/requestEmitter"; export default class LocationController { diff --git a/packages/gateway/src/controllers/Nomination.ts b/packages/gateway/src/controllers/Nomination.ts index 341fbbb50..15b492b65 100644 --- a/packages/gateway/src/controllers/Nomination.ts +++ b/packages/gateway/src/controllers/Nomination.ts @@ -1,7 +1,7 @@ import { logger } from "@1kv/common"; import { response } from "./index"; import * as NominationService from "../services/Nomination"; -import { gatewayLabel } from "../run"; +import { gatewayLabel } from "../constants"; import { requestEmitter } from "../events/requestEmitter"; export default class NominationController { diff --git a/packages/gateway/src/controllers/Nominator.ts b/packages/gateway/src/controllers/Nominator.ts index 2ebab5ace..4b979d611 100644 --- a/packages/gateway/src/controllers/Nominator.ts +++ b/packages/gateway/src/controllers/Nominator.ts @@ -1,7 +1,7 @@ import { response } from "./index"; import * as NominatorService from "../services/Nominator"; import { logger } from "@1kv/common"; -import { gatewayLabel } from "../run"; +import { gatewayLabel } from "../constants"; import { requestEmitter } from "../events/requestEmitter"; export default class NominatorController { diff --git a/packages/gateway/src/controllers/Score.ts b/packages/gateway/src/controllers/Score.ts index 470d00eae..d7a924f62 100644 --- a/packages/gateway/src/controllers/Score.ts +++ b/packages/gateway/src/controllers/Score.ts @@ -1,7 +1,7 @@ import { response } from "./index"; import * as ScoreService from "../services/Score"; import { logger } from "@1kv/common"; -import { gatewayLabel } from "../run"; +import { gatewayLabel } from "../constants"; import { requestEmitter } from "../events/requestEmitter"; export default class ScoreController { diff --git a/packages/gateway/src/controllers/Stats.ts b/packages/gateway/src/controllers/Stats.ts index d97040fde..deb0a53a9 100644 --- a/packages/gateway/src/controllers/Stats.ts +++ b/packages/gateway/src/controllers/Stats.ts @@ -1,7 +1,7 @@ import { logger } from "@1kv/common"; import { response } from "./index"; import * as StatsService from "../services/Stats"; -import { gatewayLabel } from "../run"; +import { gatewayLabel } from "../constants"; export default class StatsController { public static async getLocationStats(context: any): Promise { diff --git a/packages/gateway/src/controllers/Validators.ts b/packages/gateway/src/controllers/Validators.ts index 7323a09c9..15be90560 100644 --- a/packages/gateway/src/controllers/Validators.ts +++ b/packages/gateway/src/controllers/Validators.ts @@ -1,10 +1,8 @@ import { response } from "./index"; import * as ValidatorService from "../services/Validator"; import { logger } from "@1kv/common"; -import { gatewayLabel } from "../run"; import { requestEmitter } from "../events/requestEmitter"; - -const label = { label: "Gateway" }; +import { gatewayLabel } from "../constants"; export default class ValidatorController { public static async getLatestValidatorSet(context: any): Promise { diff --git a/packages/gateway/src/routes/setupRoutes.ts b/packages/gateway/src/routes/setupRoutes.ts index a9c10136f..9ed1cba3f 100644 --- a/packages/gateway/src/routes/setupRoutes.ts +++ b/packages/gateway/src/routes/setupRoutes.ts @@ -131,87 +131,6 @@ export const setupDocs = (app: Koa, config: Config.ConfigSchema): boolean => { } }; -// export const setupMicroserviceRoutes = async ( -// app: Koa, -// config: Config.ConfigSchema, -// queues: Queue[], -// ): Promise => { -// try { -// if (config?.redis?.host && config?.redis?.port) { -// await addQueues(config, queues); -// setupBullBoard(app, queues); -// } -// return true; -// } catch (e) { -// logger.error(`Error setting up microservice routes: ${e}`, { -// label: "Gateway", -// }); -// return false; -// } -// }; - -// Add BullMQ Queues for Microservice Jobs -// export const addQueues = async ( -// config: Config.ConfigSchema, -// queues: Queue[], -// ): Promise => { -// try { -// const releaseMonitorQueue = new Queue("releaseMonitor", { -// connection: { -// host: config?.redis?.host, -// port: config?.redis?.port, -// }, -// }); -// const constraintsQueue = new Queue("constraints", { -// connection: { -// host: config?.redis?.host, -// port: config?.redis?.port, -// }, -// }); -// const chaindataQueue = new Queue("chaindata", { -// connection: { -// host: config?.redis?.host, -// port: config?.redis?.port, -// }, -// }); -// const blockQueue = new Queue("block", { -// connection: { -// host: config?.redis?.host, -// port: config?.redis?.port, -// }, -// }); -// -// queues.push( -// releaseMonitorQueue, -// constraintsQueue, -// chaindataQueue, -// blockQueue, -// ); -// return true; -// } catch (e) { -// logger.error(`Error adding queues: ${e}`, { label: "Gateway" }); -// return false; -// } -// }; - -// export const setupBullBoard = (app: Koa, queues: Queue[]): boolean => { -// try { -// const serverAdapter = new KoaAdapter(); -// createBullBoard({ -// queues: queues.map((queue) => { -// return new BullMQAdapter(queue); -// }), -// serverAdapter, -// }); -// serverAdapter.setBasePath("/bull"); -// app.use(serverAdapter.registerPlugin()); -// return true; -// } catch (e) { -// logger.error(`Error setting up BullBoard: ${e}`, { label: "Gateway" }); -// return false; -// } -// }; - export const setupCache = (app: Koa, configCache: number): boolean => { try { logger.info(`Cache set to ${configCache}`, { label: "Gateway" }); @@ -273,9 +192,6 @@ export const setupRoutes = async ( setupScorekeeperRoutes(router, app, scorekeeper); setupDocs(app, config); - // Setup microservice routes if Redis is configured in config - // await setupMicroserviceRoutes(app, config, queues); - // Serve all other routes app.use(router.routes()); } diff --git a/packages/gateway/src/run.ts b/packages/gateway/src/run.ts deleted file mode 100644 index cbc03aa3b..000000000 --- a/packages/gateway/src/run.ts +++ /dev/null @@ -1,41 +0,0 @@ -import Server from "./server"; -import { Command } from "commander"; -import { Config, Db, logger } from "@1kv/common"; -import path from "path"; - -const version = "v2.6.87"; - -const catchAndQuit = async (fn: any) => { - try { - await fn; - } catch (e) { - console.error(JSON.stringify(e)); - process.exit(1); - } -}; - -export const gatewayLabel = { label: "Gateway" }; - -const start = async (cmd: { config: string }) => { - const config = Config.loadConfig(path.join(cmd.config, "main.json")); - - logger.info(`starting the backend services. ${version}`, gatewayLabel); - const db = await Db.create(config.db.mongo.uri); - const server = new Server(config); - server.start(); -}; - -const program = new Command(); - -if (require.main === module) { - program - .option( - "--config ", - "The path to the config directory.", - "config", - ) - .action((cmd: { config: string }) => catchAndQuit(start(cmd))); - - program.version(version); - program.parse(process.argv); -} diff --git a/packages/gateway/tsconfig.json b/packages/gateway/tsconfig.json index 00fa5fc96..00a07d46c 100644 --- a/packages/gateway/tsconfig.json +++ b/packages/gateway/tsconfig.json @@ -3,7 +3,6 @@ "exclude": ["test", "node_modules"], "include": ["src/**/*.ts", "src/**/*.yml"], "files": [ - "src/run.ts", "src/index.ts", "src/server.ts", ], diff --git a/packages/scorekeeper-status-ui/package.json b/packages/scorekeeper-status-ui/package.json index 8355cfa08..3bba366a9 100644 --- a/packages/scorekeeper-status-ui/package.json +++ b/packages/scorekeeper-status-ui/package.json @@ -6,7 +6,6 @@ "scripts": { "dev": "vite", "build": "tsc && vite build", - "build:prod": "vite build", "preview": "vite preview", "clean": "rm -rf dist" }, diff --git a/packages/telemetry/Dockerfile b/packages/telemetry/Dockerfile deleted file mode 100644 index 8fd6d5bed..000000000 --- a/packages/telemetry/Dockerfile +++ /dev/null @@ -1,7 +0,0 @@ -FROM node:17-slim -ARG MATRIX_TOKEN -WORKDIR /code -COPY . . -RUN ["npm", "i"] -RUN ["npm", "run", "build"] -CMD ["npm", "run", "js:start"] diff --git a/packages/telemetry/Dockerfile-dev b/packages/telemetry/Dockerfile-dev deleted file mode 100644 index 029641d54..000000000 --- a/packages/telemetry/Dockerfile-dev +++ /dev/null @@ -1,8 +0,0 @@ -FROM node:18 AS builder -COPY . /app -WORKDIR /app -RUN yarn set version 3.2.2 && \ - yarn install && \ - yarn workspace @1kv/common build && \ - yarn workspace @1kv/telemetry build -CMD yarn start:dev:telemetry diff --git a/packages/telemetry/esbuild.mjs b/packages/telemetry/esbuild.mjs deleted file mode 100644 index e610f3526..000000000 --- a/packages/telemetry/esbuild.mjs +++ /dev/null @@ -1,85 +0,0 @@ -import esbuild from "esbuild"; - -const externalPackages = [ - "@polkadot/api-augment", - "velocityjs", - "dustjs-linkedin", - "atpl", - "liquor", - "twig", - "eco", - "jazz", - "jqtpl", - "hamljs", - "hamlet", - "whiskers", - "haml-coffee", - "hogan.js", - "templayed", - "underscore", - "walrus", - "mustache", - "just", - "ect", - "mote", - "toffee", - "dot", - "bracket-template", - "ractive", - "htmling", - "babel-core", - "plates", - "vash", - "slm", - "marko", - "teacup/lib/express", - "coffee-script", - "squirrelly", - "twing", - "matris-js-sdk", - "@1kv/telemetry", - "@1kv/gateway", -]; - -const isProduction = process.argv.includes("--prod"); - -const buildOptions = { - entryPoints: ["src/index.ts"], - bundle: true, - minify: isProduction, - platform: "node", - target: "node18", - external: externalPackages, - outdir: "build", - tsconfig: "tsconfig.json", - splitting: true, - format: "esm", - chunkNames: "chunks/[name]-[hash]", - sourcemap: !isProduction, - logLevel: "error", -}; - -if (process.argv.includes("--watch")) { - buildOptions.watch = { - onRebuild(error, result) { - if (error) console.error("watch build failed:", error); - else - console.log( - "watch build succeeded at", - new Date().toLocaleTimeString(), - ); - }, - }; - console.log("watch mode enabled"); -} - -if (isProduction) { - buildOptions.define = { - "process.env.NODE_ENV": "'production'", - }; -} - -esbuild.build(buildOptions).catch((error) => { - console.error(error); - process.exit(1); -}); diff --git a/packages/telemetry/package.json b/packages/telemetry/package.json index aa8dd4a59..2d6c199f6 100644 --- a/packages/telemetry/package.json +++ b/packages/telemetry/package.json @@ -6,13 +6,8 @@ "types": "build/index.d.ts", "scripts": { "build": "tsc --build tsconfig.json", - "build:prod": "node esbuild.mjs --prod", "clean": "../../node_modules/.bin/rimraf ./build tsconfig.tsbuildinfo combined.log", "clean:build": "yarn clean && yarn build", - "create-config-kusama-microservice": "cp config/kusama.sample.json ./config/main.json", - "create-config-kusama-microservice-dev": "cp config/kusama.sample.json ./config/main.json", - "create-config-polkadot-microservice": "cp config/polkadot.sample.json ./config/main.json", - "create-config-polkadot-microservice-dev": "cp config/polkadot.sample.json ./config/main.json", "docker": "docker-compose rm -f; docker-compose build --no-cache; docker-compose up -d", "lint": "tsc --noEmit && eslint 'src/**/*.{js,ts,tsx}' --quiet", "lint:fix": "tsc --noEmit && eslint 'src/**/*.{js,ts,tsx}' --quiet --fix", diff --git a/packages/telemetry/src/run.ts b/packages/telemetry/src/run.ts deleted file mode 100644 index a4f5def90..000000000 --- a/packages/telemetry/src/run.ts +++ /dev/null @@ -1,54 +0,0 @@ -import { Config, Db, logger } from "@1kv/common"; -import { Command } from "commander"; -import path from "path"; -import { Server } from "@1kv/gateway"; -import TelemetryClient from "./Telemetry/Telemetry"; - -const version = "v2.6.87"; - -export const telemetryLabel = { label: "Telemetry" }; - -const catchAndQuit = async (fn: any) => { - try { - await fn; - } catch (e) { - console.error(e); - process.exit(1); - } -}; - -export const createServer = async (config) => { - try { - logger.info(`Creating Server`, telemetryLabel); - const server = new Server(config); - await server.start(); - } catch (e) { - logger.error(JSON.stringify(e)); - process.exit(1); - } -}; -const start = async (cmd: { config: string }) => { - const config = Config.loadConfig(path.join(cmd.config, "main.json")); - await createServer(config); - - logger.info(`Starting the backend services: ${version}`, telemetryLabel); - - const db = await Db.create(config.db.mongo.uri); - const telemetry = new TelemetryClient(config); - await telemetry.start(); -}; - -const program = new Command(); - -if (require.main === module) { - program - .option( - "--config ", - "The path to the config directory.", - "config", - ) - .action((cmd: { config: string }) => catchAndQuit(start(cmd))); - - program.version(version); - program.parse(process.argv); -} diff --git a/packages/telemetry/tsconfig.json b/packages/telemetry/tsconfig.json index 028391696..f0798cf42 100644 --- a/packages/telemetry/tsconfig.json +++ b/packages/telemetry/tsconfig.json @@ -4,7 +4,6 @@ "include": ["src/**/*.ts"], "files": [ - "src/run.ts", "src/index.ts", ], "compilerOptions": { diff --git a/packages/worker/.dockerignore b/packages/worker/.dockerignore deleted file mode 100644 index 3ced431fe..000000000 --- a/packages/worker/.dockerignore +++ /dev/null @@ -1,5 +0,0 @@ -* -!package.json -!tsconfig.json -!src -!config diff --git a/packages/worker/.eslintrc.js b/packages/worker/.eslintrc.js deleted file mode 100644 index fb9c98819..000000000 --- a/packages/worker/.eslintrc.js +++ /dev/null @@ -1,16 +0,0 @@ -module.exports = { - parser: "@typescript-eslint/parser", // Specifies the ESLint parser - extends: [ - "plugin:@typescript-eslint/recommended", // Uses the recommended rules from the @typescript-eslint/eslint-plugin - "plugin:security/recommended", - "prettier", // Uses eslint-config-prettier to disable ESLint rules from @typescript-eslint/eslint-plugin that would conflict with prettier - "plugin:prettier/recommended" // Enables eslint-plugin-prettier and eslint-config-prettier. This will display prettier errors as ESLint errors. Make sure this is always the last configuration in the extends array. - ], - parserOptions: { - ecmaVersion: 2018, // Allows for the parsing of modern ECMAScript features - sourceType: "module" // Allows for the use of imports - }, - rules: { - "@typescript-eslint/ban-ts-comment": "off" - } -}; diff --git a/packages/worker/Dockerfile b/packages/worker/Dockerfile deleted file mode 100644 index 8fd6d5bed..000000000 --- a/packages/worker/Dockerfile +++ /dev/null @@ -1,7 +0,0 @@ -FROM node:17-slim -ARG MATRIX_TOKEN -WORKDIR /code -COPY . . -RUN ["npm", "i"] -RUN ["npm", "run", "build"] -CMD ["npm", "run", "js:start"] diff --git a/packages/worker/Dockerfile-dev b/packages/worker/Dockerfile-dev deleted file mode 100644 index 33b50a4a7..000000000 --- a/packages/worker/Dockerfile-dev +++ /dev/null @@ -1,8 +0,0 @@ -FROM node:18 AS builder -COPY . /app -WORKDIR /app -RUN yarn set version 3.2.2 && \ - yarn install && \ - yarn workspace @1kv/common build && \ - yarn workspace @1kv/gateway build -CMD yarn start:dev:gateway diff --git a/packages/worker/config/kusama.sample.json b/packages/worker/config/kusama.sample.json deleted file mode 100644 index f48623a57..000000000 --- a/packages/worker/config/kusama.sample.json +++ /dev/null @@ -1,61 +0,0 @@ -{ - "global": { - "apiEndpoints": [ - "wss://kusama-rpc.polkadot.io", - "wss://kusama-rpc.dwellir.com", - "wss://kusama.public.curie.radiumblock.xyz/ws" - ] - }, - "db": { - "mongo": { - "uri": "mongodb://mongo:27017" - } - }, - "server": { - "onlyHealth": true, - "port": 3303 - }, - "score": { - "inclusion": "200", - "spanInclusion": "200", - "discovered": "5", - "nominated": "30", - "rank": "5", - "bonded": "50", - "faults": "5", - "offline": "2", - "location": "40", - "region": "10", - "country": "10", - "provider": "100", - "nominations": "100", - "delegations": "60", - "openGov": "100", - "openGovDelegation": "100", - "rpc": "100", - "client": "100", - "useInclusion": true, - "useSpanInclusion": true, - "useDiscovered": true, - "useNominated": true, - "useRank": true, - "useBonded": true, - "useFaults": true, - "useOffline": true, - "useLocation": true, - "useRegion": true, - "useCountry": true, - "useProvider": true, - "useNominations": true, - "useDelegations": true, - "useOpenGov": true, - "useOpenGovDelegation": true, - "useRpc": true, - "useClient": true - }, - "redis": { - "enable": true, - "host": "redis", - "port": 6379 - } -} diff --git a/packages/worker/config/polkadot.sample.json b/packages/worker/config/polkadot.sample.json deleted file mode 100644 index 862534925..000000000 --- a/packages/worker/config/polkadot.sample.json +++ /dev/null @@ -1,59 +0,0 @@ -{ - "global": { - "apiEndpoints": [ - "wss://kusama-rpc.polkadot.io" - ] - }, - "db": { - "mongo": { - "uri": "mongodb://mongo:27017" - }, - }, - "server": { - "onlyHealth": true, - "port": 3303 - }, - "score": { - "inclusion": "200", - "spanInclusion": "200", - "discovered": "5", - "nominated": "30", - "rank": "5", - "bonded": "50", - "faults": "5", - "offline": "2", - "location": "40", - "region": "10", - "country": "10", - "provider": "100", - "nominations": "100", - "delegations": "60", - "openGov": "100", - "openGovDelegation": "100", - "rpc": "100", - "client": "100", - "useInclusion": true, - "useSpanInclusion": true, - "useDiscovered": true, - "useNominated": true, - "useRank": true, - "useBonded": true, - "useFaults": true, - "useOffline": true, - "useLocation": true, - "useRegion": true, - "useCountry": true, - "useProvider": true, - "useNominations": true, - "useDelegations": true, - "useOpenGov": true, - "useOpenGovDelegation": true, - "useRpc": true, - "useClient": true - }, - "redis": { - "enable": true, - "host": "redis", - "port": 6379 - } -} diff --git a/packages/worker/esbuild.js b/packages/worker/esbuild.js deleted file mode 100644 index 1b57f9983..000000000 --- a/packages/worker/esbuild.js +++ /dev/null @@ -1,85 +0,0 @@ -const esbuild = require("esbuild"); - -const externalPackages = [ - "@polkadot/api-augment", - "velocityjs", - "dustjs-linkedin", - "atpl", - "liquor", - "twig", - "eco", - "jazz", - "jqtpl", - "hamljs", - "hamlet", - "whiskers", - "haml-coffee", - "hogan.js", - "templayed", - "underscore", - "walrus", - "mustache", - "just", - "ect", - "mote", - "toffee", - "dot", - "bracket-template", - "ractive", - "htmling", - "babel-core", - "plates", - "vash", - "slm", - "marko", - "teacup/lib/express", - "coffee-script", - "squirrelly", - "twing", - "matris-js-sdk", - "@1kv/telemetry", - "@1kv/gateway", -]; - -const isProduction = process.argv.includes("--prod"); - -const buildOptions = { - entryPoints: ["src/index.ts"], - bundle: true, - minify: isProduction, - platform: "node", - target: "node18", - external: externalPackages, - outdir: "build", - tsconfig: "tsconfig.json", - splitting: true, - format: "esm", - chunkNames: "chunks/[name]-[hash]", - sourcemap: !isProduction, - logLevel: "info", -}; - -if (process.argv.includes("--watch")) { - buildOptions.watch = { - onRebuild(error, result) { - if (error) console.error("watch build failed:", error); - else - console.log( - "watch build succeeded at", - new Date().toLocaleTimeString(), - ); - }, - }; - console.log("watch mode enabled"); -} - -if (isProduction) { - buildOptions.define = { - "process.env.NODE_ENV": "'production'", - }; -} - -esbuild.build(buildOptions).catch((error) => { - console.error(error); - process.exit(1); -}); diff --git a/packages/worker/package.json b/packages/worker/package.json deleted file mode 100644 index f4f9c808a..000000000 --- a/packages/worker/package.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "name": "@1kv/worker", - "version": "3.3.0", - "description": "Services for running the Thousand Validator Program.", - "main": "build/index.js", - "types": "build/index.d.ts", - "scripts": { - "build": "tsc --build tsconfig.json", - "build:prod": "node esbuild.js --prod", - "clean": "../../node_modules/.bin/rimraf ./build tsconfig.tsbuildinfo combined.log", - "clean:build": "yarn clean && yarn build", - "create-config-kusama-microservice": "cp config/kusama.sample.json ./config/main.json", - "create-config-kusama-microservice-dev": "cp config/kusama.sample.json ./config/main.json", - "create-config-polkadot-microservice": "cp config/polkadot.sample.json ./config/main.json", - "create-config-polkadot-microservice-dev": "cp config/polkadot.sample.json ./config/main.json", - "docker": "docker-compose rm -f; docker-compose build --no-cache; docker-compose up -d", - "lint": "tsc --noEmit && eslint 'src/**/*.{js,ts,tsx}' --quiet", - "lint:fix": "tsc --noEmit && eslint 'src/**/*.{js,ts,tsx}' --quiet --fix", - "start": "NODE_OPTIONS='--max-old-space-size=14096' ts-node src/run.ts start", - "start:watch": "NODE_OPTIONS='--max-old-space-size=16096' nodemon --watch build --exec node build/run.js", - "start:dev": "concurrently \"tsc -w\" \"yarn start:watch\"", - "js:start": "NODE_OPTIONS='--max-old-space-size=6096' node build/run.js start" - }, - "author": "Web3 Foundation ", - "license": "GPL-3.0", - "config": { - "mongodbMemoryServer": { - "debug": "on" - } - } -} diff --git a/packages/worker/prettierrc.js b/packages/worker/prettierrc.js deleted file mode 100644 index aed7d4a6d..000000000 --- a/packages/worker/prettierrc.js +++ /dev/null @@ -1,7 +0,0 @@ -module.exports = { - semi: true, - trailingComma: "all", - singleQuote: true, - printWidth: 120, - tabWidth: 2, -}; diff --git a/packages/worker/src/index.ts b/packages/worker/src/index.ts deleted file mode 100644 index 488dd3f6f..000000000 --- a/packages/worker/src/index.ts +++ /dev/null @@ -1,5 +0,0 @@ -import * as worker from "./worker"; -import * as queues from "./queues"; -import * as workers from "./workers"; - -export const otvWorker = { worker, queues, workers }; diff --git a/packages/worker/src/queues/BlockQueue.ts b/packages/worker/src/queues/BlockQueue.ts deleted file mode 100644 index 37030e49c..000000000 --- a/packages/worker/src/queues/BlockQueue.ts +++ /dev/null @@ -1,74 +0,0 @@ -import { Queue } from "bullmq"; -import { ChainData, logger, queries } from "@1kv/common"; - -const label = { label: "BlockQueue" }; - -export const createBlockQueue = async (host, port) => { - const queue = new Queue("block", { - connection: { - host: host, - port: port, - }, - }); - return queue; -}; - -// Add new blocks to the queue -export const addAllBlocks = async (queue: Queue, chaindata: ChainData) => { - // Get the latest block from the chain - const latestBlock = await chaindata.getLatestBlock(); - - // get the indices of the earliest and latest blocks in the database - const blockIndex = await queries.getBlockIndex(); - const latest = blockIndex?.latest || latestBlock; - const earliest = blockIndex?.earliest || latestBlock; - - // If there is no block index in the database, add the latest block to the queue and set the block index to the latest block - if (!blockIndex) { - await addBlockJob(queue, latestBlock); - await queries.setBlockIndex(latestBlock, latestBlock); - } - - const threshold = 500000; - - // If the current chain block is higher than what is in the db, add all the blocks from the current one until the most recent indexed one to the queue - if (blockIndex?.latest && latestBlock > blockIndex.latest) { - logger.info( - `latest block: ${latestBlock} db block: ${blockIndex.latest}, adding ${ - latestBlock - blockIndex.latest - } blocks to queue`, - label, - ); - for (let i = blockIndex.latest + 1; i < latestBlock; i++) { - await addBlockJob(queue, i); - } - } - - if (earliest) { - const targetEarliest = earliest - threshold > 0 ? earliest - threshold : 0; - logger.info( - `earliest ${earliest} target earliest: ${targetEarliest}, adding ${ - earliest - targetEarliest - } to the queue`, - label, - ); - for (let i = earliest; i > targetEarliest; i--) { - await addBlockJob(queue, i); - } - } -}; - -export const addBlockJob = async (queue: Queue, blockNumber: number) => { - await queue.add( - "block", - { blockNumber: blockNumber }, - { - jobId: `block${blockNumber}`, - attempts: 10, - backoff: { - type: "exponential", - delay: 1000, - }, - }, - ); -}; diff --git a/packages/worker/src/queues/ChainDataQueue.ts b/packages/worker/src/queues/ChainDataQueue.ts deleted file mode 100644 index 35162227d..000000000 --- a/packages/worker/src/queues/ChainDataQueue.ts +++ /dev/null @@ -1,169 +0,0 @@ -import { Queue } from "bullmq"; -import { Jobs, logger, queries } from "@1kv/common"; - -const label = { label: "ChainDataQueue" }; - -export const createChainDataQueue = async (host, port) => { - const queue = await new Queue("chaindata", { - connection: { - host: host, - port: port, - }, - }); - return queue; -}; - -export const addActiveValidatorJob = async (queue: Queue, repeat: number) => { - logger.info(`adding Active Validator Job to Queue.....`, label); - await queue.add( - "chaindata", - { jobType: Jobs.ACTIVE_VALIDATOR_JOB }, - { - repeat: { - every: repeat, - // limit: 1000, - }, - attempts: 10, - backoff: { - type: "exponential", - delay: 1000, - }, - }, - ); -}; - -export const addEraPointsJob = async (queue: Queue, repeat: number) => { - logger.info(`adding Era Points Job to Queue.....`); - await queue.add( - "chaindata", - { jobType: Jobs.ERA_POINTS_JOB }, - { - repeat: { - every: repeat, - // limit: 1000, - }, - attempts: 10, - backoff: { - type: "exponential", - delay: 1000, - }, - }, - ); -}; - -export const addEraStatsJob = async (queue: Queue, repeat: number) => { - logger.info(`adding Era Stats Job to Queue.....`); - await queue.add( - "chaindata", - { jobType: Jobs.ERA_STATS_JOB }, - { - repeat: { - every: repeat, - // limit: 1000, - }, - attempts: 10, - backoff: { - type: "exponential", - delay: 1000, - }, - }, - ); -}; - -export const addInclusionJob = async (queue: Queue, repeat: number) => { - logger.info(`adding Inclusion Job to Queue.....`); - await queue.add( - "chaindata", - { jobType: Jobs.INCLUSION_JOB }, - { - repeat: { - every: repeat, - // limit: 1000, - }, - attempts: 10, - backoff: { - type: "exponential", - delay: 1000, - }, - }, - ); -}; - -export const addNominatorJob = async (queue: Queue, repeat: number) => { - logger.info(`adding Nominator Job to Queue.....`); - await queue.add( - "chaindata", - { jobType: Jobs.NOMINATOR_JOB }, - { - repeat: { - every: repeat, - // limit: 1000, - }, - attempts: 10, - backoff: { - type: "exponential", - delay: 1000, - }, - }, - ); -}; - -export const addSessionKeyJob = async (queue: Queue, repeat: number) => { - logger.info(`adding Session Key Job to Queue.....`); - await queue.add( - "chaindata", - { jobType: Jobs.SESSION_KEY_JOB }, - { - repeat: { - every: repeat, - // limit: 1000, - }, - attempts: 10, - backoff: { - type: "exponential", - delay: 1000, - }, - }, - ); -}; - -// Adds a single job to the queue that processes all validators -export const addValidatorPrefJobAll = async (queue: Queue, repeat: number) => { - await queue.add( - "chaindata", - { jobType: Jobs.VALIDATOR_PREF_JOB }, - { - repeat: { - every: repeat, - // limit: 1000, - }, - attempts: 10, - backoff: { - type: "exponential", - delay: 1000, - }, - }, - ); -}; - -export const addValidatorPrefJob = async (queue: Queue, repeat: number) => { - logger.info(`adding Validator Pref Job to Queue.....`); - const candidates = await queries.allCandidates(); - for (const [index, candidate] of candidates.entries()) { - await queue.add( - "chaindata", - { jobType: Jobs.VALIDATOR_PREF_JOB, candidateAddress: candidate.stash }, - { - repeat: { - every: repeat + index, - // limit: 1000, - }, - attempts: 10, - backoff: { - type: "exponential", - delay: 1000, - }, - }, - ); - } -}; diff --git a/packages/worker/src/queues/ContraintsQueue.ts b/packages/worker/src/queues/ContraintsQueue.ts deleted file mode 100644 index 1b9488f94..000000000 --- a/packages/worker/src/queues/ContraintsQueue.ts +++ /dev/null @@ -1,61 +0,0 @@ -import { Queue } from "bullmq"; -import { logger } from "@1kv/common"; - -const constraintsLabel = { label: "ConstraintsQueue" }; - -export const createConstraintsQueue = async (host, port) => { - const queue = await new Queue("constraints", { - connection: { - host: host, - port: port, - }, - }); - return queue; -}; - -export const addValidityJob = async (queue: Queue, repeat: number) => { - logger.info(`adding Validity Job to Queue.....`, constraintsLabel); - // const candidates = await queries.allCandidates(); - // for (const [index, candidate] of candidates.entries()) { - await queue.add( - "constraints", - { - jobType: "validityJob", - }, - { - repeat: { - every: repeat, - // limit: 1000, - }, - attempts: 10, - backoff: { - type: "exponential", - delay: 1000, - }, - }, - ); - // } -}; - -export const addScoreJob = async (queue: Queue, repeat: number) => { - // const candidates = await queries.allCandidates(); - // logger.info(`adding ${candidates.length} to be scored...`); - // for (const [index, candidate] of candidates.entries()) { - await queue.add( - "constraints", - { jobType: "scoreJob" }, - { - repeat: { - every: repeat, - // limit: 100, - }, - attempts: 10, - backoff: { - type: "exponential", - delay: 1000, - }, - }, - ); - // } - logger.info(`adding Score Job to Queue.....`, constraintsLabel); -}; diff --git a/packages/worker/src/queues/ReleaseMonitorQueue.ts b/packages/worker/src/queues/ReleaseMonitorQueue.ts deleted file mode 100644 index c6f775c72..000000000 --- a/packages/worker/src/queues/ReleaseMonitorQueue.ts +++ /dev/null @@ -1,29 +0,0 @@ -import { Queue } from "bullmq"; - -export const createReleaseMonitorQueue = async (host, port) => { - const queue = await new Queue("releaseMonitor", { - connection: { - host: host, - port: port, - }, - }); - return queue; -}; - -export const addReleaseMonitorJob = async (queue: Queue, repeat: number) => { - await queue.add( - "releaseMonitor", - {}, - { - repeat: { - every: repeat, - limit: 100, - }, - attempts: 10, - backoff: { - type: "exponential", - delay: 1000, - }, - }, - ); -}; diff --git a/packages/worker/src/queues/index.ts b/packages/worker/src/queues/index.ts deleted file mode 100644 index 4c437215c..000000000 --- a/packages/worker/src/queues/index.ts +++ /dev/null @@ -1,59 +0,0 @@ -import { logger } from "@1kv/common"; - -export * from "./ReleaseMonitorQueue"; -export * from "./ContraintsQueue"; -export * from "./ChainDataQueue"; -export * from "./BlockQueue"; -import { Queue } from "bullmq"; - -export const removeRepeatableJobsFromQueues = async (queues: Queue[]) => { - logger.info("Removing repeatable jobs", { label: "Queue" }); - for (const queue of queues) { - try { - await removeRepeatableJobs(queue); - } catch (e) { - logger.error(JSON.stringify(e)); - } - } -}; - -export const removeRepeatableJobs = async (queue: Queue) => { - const repeatableJobs = await queue.getRepeatableJobs(); - repeatableJobs.forEach((job) => { - try { - queue.removeRepeatableByKey(job.key); - } catch (e) { - logger.error(JSON.stringify(e)); - } - }); -}; - -export const drainQueues = async (queues: Queue[]) => { - logger.info("Draining queues", { label: "Queue" }); - for (const queue of queues) { - try { - await drainQueue(queue); - } catch (e) { - logger.error(JSON.stringify(e)); - } - } -}; - -export const drainQueue = async (queue: Queue) => { - await queue.drain(); -}; - -export const obliterateQueues = async (queues: Queue[]) => { - logger.info("Obliterating queues", { label: "Queue" }); - for (const queue of queues) { - try { - await obliterateQueue(queue); - } catch (e) { - logger.error(JSON.stringify(e)); - } - } -}; - -export const obliterateQueue = async (queue: Queue) => { - await queue.obliterate(); -}; diff --git a/packages/worker/src/run.ts b/packages/worker/src/run.ts deleted file mode 100644 index 5e4576da5..000000000 --- a/packages/worker/src/run.ts +++ /dev/null @@ -1,62 +0,0 @@ -import Worker from "./worker"; -import { Command } from "commander"; -import { Config, Db, logger } from "@1kv/common"; -import path from "path"; -import { Server } from "@1kv/gateway"; - -const version = process.env.npm_package_version; - -const catchAndQuit = async (fn: any) => { - try { - await fn; - } catch (e) { - logger.info("There was an error!"); - logger.error(JSON.stringify(e)); - process.exit(1); - } -}; -export const createServer = async (config) => { - try { - logger.info(`Creating Server`, { label: "Worker" }); - const server = new Server(config); - await server.start(); - } catch (e) { - logger.error(JSON.stringify(e)); - process.exit(1); - } -}; -const start = async (cmd: { config: string }) => { - const config = Config.loadConfig(path.join(cmd.config, "main.json")); - await createServer(config); - - logger.info(`Starting the backend services. ${version}`, { - label: "Worker", - }); - const db = await Db.create(config.db.mongo.uri); - const worker = new Worker(config); - await worker.startWorker(); -}; - -const program = new Command(); - -if (require.main === module) { - program - .option( - "--config ", - "The path to the config directory.", - "config", - ) - .action((cmd: { config: string }) => catchAndQuit(start(cmd))); - - program.version(version); - program.parse(process.argv); -} - -process - .on("unhandledRejection", (reason, p) => { - console.error(reason, "Unhandled Rejection at Promise", p); - }) - .on("uncaughtException", (err) => { - console.error(err, "Uncaught Exception thrown"); - process.exit(1); - }); diff --git a/packages/worker/src/worker.ts b/packages/worker/src/worker.ts deleted file mode 100644 index 4f7b56b1f..000000000 --- a/packages/worker/src/worker.ts +++ /dev/null @@ -1,65 +0,0 @@ -import { ApiHandler, Config, Constraints, logger } from "@1kv/common"; - -export const workerLabel = { label: "Worker" }; - -class Worker { - private api: ApiHandler; - private apiEndpoints: string[]; - private config: Config.ConfigSchema; - private host: string; - private port: number; - private constraints: Constraints.OTV; - - constructor(config: Config.ConfigSchema) { - this.config = config; - this.apiEndpoints = this.config.global.apiEndpoints; - this.host = this.config.redis.host; - this.port = this.config.redis.port; - logger.info(`Redis host: ${this.host} port: ${this.port}`, workerLabel); - } - - async initializeAPI(): Promise { - const endpoints = this.apiEndpoints.sort(() => Math.random() - 0.5); - logger.info(`ApiHandler connecting to ${endpoints[0]}`, workerLabel); - this.api = new ApiHandler(endpoints); - await this.api.getApi(); - } - - async initializeConstraints(): Promise { - //this.constraints = new Constraints.OTV(this.api, this.config); - } - - async startWorker(): Promise { - logger.info(`starting worker....`, workerLabel); - // await this.initializeAPI(); - // await this.initializeConstraints(); - // logger.info(`Redis host: ${this.host} port: ${this.port}`, workerLabel); - // const releaseMonitorWorker = await createReleaseMonitorWorker( - // this.host, - // this.port, - // ); - // logger.info( - // `Created release monitor worker: ${releaseMonitorWorker.id}`, - // workerLabel, - // ); - // const constraintsWorker = await createConstraintsWorker( - // this.host, - // this.port, - // this.constraints, - // ); - // logger.info( - // `Created constraints worker: ${constraintsWorker.id}`, - // workerLabel, - // ); - // const chaindataWorker = await createChainDataWorker( - // this.host, - // this.port, - // this.api, - // ); - // logger.info(`Created chaindata worker: ${chaindataWorker.id}`, workerLabel); - // const blockWorker = await createBlockWorker(this.host, this.port, this.api); - // logger.info(`Created block worker: ${blockWorker.id}`, workerLabel); - } -} - -export default Worker; diff --git a/packages/worker/src/workers/BlockWorker.ts b/packages/worker/src/workers/BlockWorker.ts deleted file mode 100644 index bd61d3fa1..000000000 --- a/packages/worker/src/workers/BlockWorker.ts +++ /dev/null @@ -1,29 +0,0 @@ -import { ApiHandler, logger } from "@1kv/common"; - -export const createBlockWorker = async (host, port, api: ApiHandler) => { - logger.info(`Creating Block Worker...`, { label: "BlockWorker" }); - // const chaindata = new ChainData(api); - // const worker = await new Worker( - // "block", - // (job) => () => { - // console.log(); - // }, //Jobs.processBlockDataJob(job, chaindata), - // { - // connection: { - // host: host, - // port: port, - // }, - // concurrency: 4, - // lockDuration: 300000, - // }, - // ); - // worker.on("completed", (job, result) => { - // // job has completed - // const blockNumber = job.data.blockNumber; - // const executionTime = result; - // // logger.info(`Indexed block #${blockNumber} (${executionTime}s)`, { - // // label: "BlockWorker", - // // }); - // }); - // return worker; -}; diff --git a/packages/worker/src/workers/ChainDataWorker.ts b/packages/worker/src/workers/ChainDataWorker.ts deleted file mode 100644 index 77577a737..000000000 --- a/packages/worker/src/workers/ChainDataWorker.ts +++ /dev/null @@ -1,19 +0,0 @@ -import { ApiHandler, ChainData, logger } from "@1kv/common"; - -export const createChainDataWorker = async (host, port, api: ApiHandler) => { - logger.info(`Creating constraints worker...`); - //const chaindata = new ChainData(api); - // const worker = await new Worker( - // "chaindata", - // (job) => console.log(), //Jobs.processChainDataJob(job, chaindata), - // { - // connection: { - // host: host, - // port: port, - // }, - // concurrency: 6, - // lockDuration: 3000000, - // }, - // ); - // return worker; -}; diff --git a/packages/worker/src/workers/ConstraintsWorker.ts b/packages/worker/src/workers/ConstraintsWorker.ts deleted file mode 100644 index d9da81dcf..000000000 --- a/packages/worker/src/workers/ConstraintsWorker.ts +++ /dev/null @@ -1,22 +0,0 @@ -import { Constraints, logger } from "@1kv/common"; - -export const createConstraintsWorker = async ( - host, - port, - constraints: Constraints.OTV, -) => { - logger.info(`Creating constraints worker...`); - // const worker = await new Worker( - // "constraints", - // (job) => console.log(), //Jobs.processConstraintsJob(job, constraints), - // { - // connection: { - // host: host, - // port: port, - // }, - // concurrency: 10, - // lockDuration: 3000000, - // }, - // ); - // return worker; -}; diff --git a/packages/worker/src/workers/ReleaseMonitorWorker.ts b/packages/worker/src/workers/ReleaseMonitorWorker.ts deleted file mode 100644 index eae5e3bf2..000000000 --- a/packages/worker/src/workers/ReleaseMonitorWorker.ts +++ /dev/null @@ -1,18 +0,0 @@ -import { logger } from "@1kv/common"; - -export const createReleaseMonitorWorker = async (host, port) => { - logger.info(`Creating releaseMonitor worker...`); - // const worker = await new Worker( - // "releaseMonitor", - // (job) => console.log(), //Jobs.processReleaseMonitorJob(job), - // { - // connection: { - // host: host, - // port: port, - // }, - // concurrency: 4, - // lockDuration: 300000, - // }, - // ); - // return worker; -}; diff --git a/packages/worker/src/workers/index.ts b/packages/worker/src/workers/index.ts deleted file mode 100644 index 2639012f2..000000000 --- a/packages/worker/src/workers/index.ts +++ /dev/null @@ -1,3 +0,0 @@ -export * from "./ReleaseMonitorWorker"; -export * from "./ConstraintsWorker"; -export * from "./ChainDataWorker"; diff --git a/packages/worker/tsconfig.json b/packages/worker/tsconfig.json deleted file mode 100644 index 972df6aee..000000000 --- a/packages/worker/tsconfig.json +++ /dev/null @@ -1,78 +0,0 @@ -{ - "extends": "../../tsconfig.json", - "exclude": ["test", "node_modules"], - "include": ["src/**/*.ts"], - - "files": [ - "src/run.ts", - "src/index.ts", - "src/worker.ts", - ], - "compilerOptions": { - "paths": { - "@1kv/common": ["../common/build"], - "@1kv/gateway": ["../gateway/build"] - }, - /* Basic Options */ - "target": "es2015", /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017','ES2018' or 'ESNEXT'. */ - "module": "commonjs", /* Specify module code generation: 'none', 'commonjs', 'amd', 'system', 'umd', 'es2015', or 'ESNext'. */ - "lib": ["ES2015", "dom"], - // "allowJs": true, /* Allow javascript files to be compiled. */ - // "checkJs": true, /* Report errors in .js files. */ - // "jsx": "preserve", /* Specify JSX code generation: 'preserve', 'react-native', or 'react'. */ - // "declaration": true, /* Generates corresponding '.d.ts' file. */ - // "declarationMap": true, /* Generates a sourcemap for each corresponding '.d.ts' file. */ - // "sourceMap": true, /* Generates corresponding '.map' file. */ - // "outFile": "./", /* Concatenate and emit output to single file. */ - "outDir": "build", - "skipLibCheck": true, /* Redirect output structure to the directory. */ - "rootDir": "src", /* Specify the root directory of input files. Use to control the output directory structure with --outDir. */ - "composite": true, /* Enable project compilation */ - // "removeComments": true, /* Do not emit comments to output. */ - // "noEmit": true, /* Do not emit outputs. */ - // "importHelpers": true, /* Import emit helpers from 'tslib'. */ - // "downlevelIteration": true, /* Provide full support for iterables in 'for-of', spread, and destructuring when targeting 'ES5' or 'ES3'. */ - // "isolatedModules": true, /* Transpile each file as a separate module (similar to 'ts.transpileModule'). */ - - /* Strict Type-Checking Options */ - "strict": false, /* Enable all strict type-checking options. */ - // "noImplicitAny": true, /* Raise error on expressions and declarations with an implied 'any' type. */ - // "strictNullChecks": true, /* Enable strict null checks. */ - // "strictFunctionTypes": true, /* Enable strict checking of function types. */ - // "strictPropertyInitialization": true, /* Enable strict checking of property initialization in classes. */ - // "noImplicitThis": true, /* Raise error on 'this' expressions with an implied 'any' type. */ - // "alwaysStrict": true, /* Parse in strict mode and emit "use strict" for each source file. */ - - /* Additional Checks */ - // "noUnusedLocals": true, /* Report errors on unused locals. */ - // "noUnusedParameters": true, /* Report errors on unused parameters. */ - // "noImplicitReturns": true, /* Report error when not all code paths in function return a value. */ - // "noFallthroughCasesInSwitch": true, /* Report errors for fallthrough cases in switch statement. */ - - /* Module Resolution Options */ - "moduleResolution": "node", /* Specify module resolution strategy: 'node' (Node.js) or 'classic' (TypeScript pre-1.6). */ - // "baseUrl": "./", /* Base directory to resolve non-absolute module names. */ - // "paths": {}, /* A series of entries which re-map imports to lookup locations relative to the 'baseUrl'. */ - // "rootDirs": [], /* List of root folders whose combined content represents the structure of the project at runtime. */ - // "typeRoots": [], /* List of folders to include type definitions from. */ - // "types": [], /* Type declaration files to be included in compilation. */ - // "allowSyntheticDefaultImports": true, /* Allow default imports from modules with no default export. This does not affect code emit, just typechecking. */ - "esModuleInterop": true, /* Enables emit interoperability between CommonJS and ES Modules via creation of namespace objects for all imports. Implies 'allowSyntheticDefaultImports'. */ - // "preserveSymlinks": true, /* Do not resolve the real path of symlinks. */ - - /* Source Map Options */ - // "sourceRoot": "./", /* Specify the location where debugger should locate TypeScript files instead of source locations. */ - // "mapRoot": "./", /* Specify the location where debugger should locate map files instead of generated locations. */ - // "inlineSourceMap": true, /* Emit a single file with source maps instead of having a separate file. */ - // "inlineSources": true, /* Emit the source alongside the sourcemaps within a single file; requires '--inlineSourceMap' or '--sourceMap' to be set. */ - - /* Experimental Options */ - // "experimentalDecorators": true, /* Enables experimental support for ES7 decorators. */ - // "emitDecoratorMetadata": true, /* Enables experimental support for emitting type metadata for decorators. */ - "resolveJsonModule": true - }, - "references": [ - { "path": "../common" }, - { "path": "../gateway" } - ] -} diff --git a/yarn.lock b/yarn.lock index 26f2b0ccd..1cfb35ade 100644 --- a/yarn.lock +++ b/yarn.lock @@ -12,7 +12,6 @@ __metadata: "@1kv/common": "workspace:*" "@1kv/gateway": "workspace:*" "@1kv/telemetry": "workspace:*" - "@1kv/worker": "workspace:*" "@ava/typescript": ^4.1.0 "@babel/preset-react": ^7.23.3 "@bull-board/api": ^5.15.1 @@ -149,12 +148,6 @@ __metadata: languageName: unknown linkType: soft -"@1kv/worker@workspace:*, @1kv/worker@workspace:packages/worker": - version: 0.0.0-use.local - resolution: "@1kv/worker@workspace:packages/worker" - languageName: unknown - linkType: soft - "@aashutoshrathi/word-wrap@npm:^1.2.3": version: 1.2.6 resolution: "@aashutoshrathi/word-wrap@npm:1.2.6"