diff --git a/.dockerignore b/.dockerignore index d3337c5373..ada5c3325a 100644 --- a/.dockerignore +++ b/.dockerignore @@ -4,6 +4,7 @@ .husky audits docs +docker-setup scripts **/node_modules **/build diff --git a/.gitignore b/.gitignore index 2428824dcc..ff75977ec2 100644 --- a/.gitignore +++ b/.gitignore @@ -51,4 +51,5 @@ hardhat-dependency-compiler cache #docker databases -docker-db \ No newline at end of file +docker-db +graph-node-db \ No newline at end of file diff --git a/docker-setup/.env.compose b/docker-setup/.env.compose new file mode 100644 index 0000000000..7252e86817 --- /dev/null +++ b/docker-setup/.env.compose @@ -0,0 +1,21 @@ +MINIO_PORT=9000 + +# NOTE: Avoid changing this since it impact KV store urls +BACKEND_APPS_INTERNAL_PORT=5000 + +REPUTATION_ORACLE_EXPOSED_PORT=5001 +HUMAN_APP_SERVER_EXPOSED_PORT=5002 +JOB_LAUNCHER_EXPOSED_PORT=5003 +EXCHANGE_ORACLE_CVAT_EXPOSED_PORT=5004 +RECORDING_ORACLE_CVAT_EXPOSED_PORT=5005 +EXCHANGE_ORACLE_FORTUNE_EXPOSED_PORT=5006 +RECORDING_ORACLE_FORTUNE_EXPOSED_PORT=5007 + +HUMAN_APP_CLIENT_EXPOSED_PORT=3001 +JOB_LAUNCHER_CLIENT_EXPOSED_PORT=3002 +FORTUNE_CLIENT_EXPOSED_PORT=3003 + +RPC_URL_POLYGON_AMOY=https://rpc-amoy.polygon.technology + +# Might be empty +SUBGRAPH_API_KEY= diff --git a/docker-setup/Makefile b/docker-setup/Makefile new file mode 100644 index 0000000000..28786f2966 --- /dev/null +++ b/docker-setup/Makefile @@ -0,0 +1,31 @@ +.PHONY: check-env-file \ + infra-up infra-stop \ + build-services services-up services-stop + +DOCKER_PARALLEL ?= 4 + +check-env-file: + @if [ ! -f "./.env.compose.local" ]; then \ + cp ./.env.compose ./.env.compose.local ; \ + fi + +infra-up: + docker-compose --env-file .env.compose.local up -d postgres redis minio minio-client + +infra-stop: + docker-compose --env-file .env.compose.local stop postgres redis minio minio-client + +build-services: + docker-compose --env-file .env.compose.local --parallel $(DOCKER_PARALLEL) up --no-start + +services-up: + @service_names="$(wordlist 2, $(words $(MAKECMDGOALS)), $(MAKECMDGOALS))"; \ + docker-compose --env-file .env.compose.local --parallel $(DOCKER_PARALLEL) up -d $$service_names + +services-stop: + @service_names="$(wordlist 2, $(words $(MAKECMDGOALS)), $(MAKECMDGOALS))"; \ + docker-compose --env-file .env.compose.local stop $$service_names + +# catch-all and noop; to avoid warnings when using MAKECMDGOALS +%: + @: diff --git a/scripts/cvat/docker-compose.local.yml b/docker-setup/docker-compose.yml similarity index 70% rename from scripts/cvat/docker-compose.local.yml rename to docker-setup/docker-compose.yml index 59db252e5b..5ecff8c246 100644 --- a/scripts/cvat/docker-compose.local.yml +++ b/docker-setup/docker-compose.yml @@ -23,8 +23,7 @@ x-hardcoded-vars: x-general-env-variables: # GENERAL VARS subgraph_api_key: &subgraph_api_key ${SUBGRAPH_API_KEY} - sendgrid_api_key: &sendgrid_api_key ${SENDGRID_API_KEY:-sendgrid-disabled} - rpc_url_polygon_amoy: &rpc_url_polygon_amoy ${RPC_URL_POLYGON_AMOY:-} + rpc_url_polygon_amoy: &rpc_url_polygon_amoy ${RPC_URL_POLYGON_AMOY:?} # POSTGRES VARS postgres_user: &postgres_user ${POSTGRES_USER:-default} postgres_password: &postgres_password ${POSTGRES_PASSWORD:-qwerty} @@ -39,16 +38,11 @@ x-general-env-variables: bucket_name_manifests: &bucket_name_manifests ${BUCKET_NAME_MANIFESTS:-manifests} bucket_name_datasets: &bucket_name_datasets ${BUCKET_NAME_DATASETS:-datasets} bucket_name_rep_o: &bucket_name_rep_o ${BUCKET_NAME_REPUTATION_ORACLE:-reputation-oracle} - bucket_name_exc_o: &bucket_name_exc_o ${BUCKET_NAME_EXCHANGE_ORACLE:-exchange-oracle} - bucket_name_rec_o: &bucket_name_rec_o ${BUCKET_NAME_RECORDING_ORACLE:-recording-oracle} - # WEB3 ADDRESSES - reputation_oracle_address: &reputation_oracle_address ${REPUTATION_ORACLE_ADDRESS:?} - exchange_oracle_address: &exchange_oracle_address ${EXCHANGE_ORACLE_ADDRESS:?} - recording_oracle_address: &recording_oracle_address ${RECORDING_ORACLE_ADDRESS:?} + bucket_name_cvat_exc_o: &bucket_name_cvat_exc_o ${BUCKET_NAME_CVAT_EXCHANGE_ORACLE:-cvat-exchange-oracle} + bucket_name_cvat_rec_o: &bucket_name_cvat_rec_o ${BUCKET_NAME_CVAT_RECORDING_ORACLE:-cvat-recording-oracle} + bucket_name_fortune: &bucket_name_fortune ${BUCKEN_NAME_FORTUNE:-fortune} # OTHER backend_apps_internal_port: &backend_apps_internal_port ${BACKEND_APPS_INTERNAL_PORT:?} - human_app_secret_key: &human_app_secret_key ${HUMAN_APP_SECRET_KEY:?} - reputation_oracle_jwt_public_key: &reputation_oracle_jwt_public_key ${REPUTATION_ORACLE_JWT_PUBLIC_KEY:?} cvat_oracle_storage_endpoint: &cvat_oracle_storage_endpoint minio:${MINIO_PORT:?} x-service-env-vars-groups: @@ -60,13 +54,11 @@ x-service-env-vars-groups: REDIS_PORT: *redis_port nodejs_app_vars: &nodejs_app_vars NODE_ENV: *node_env - WEB3_ENV: *web3_env + SUBGRAPH_API_KEY: *subgraph_api_key RPC_URL_POLYGON_AMOY: *rpc_url_polygon_amoy - SENDGRID_API_KEY: *sendgrid_api_key + cvat_oracle_vars: &cvat_oracle_vars SUBGRAPH_API_KEY: *subgraph_api_key - HCAPTCHA_SITE_KEY: ${HCAPTCHA_SITE_KEY:-10000000-ffff-ffff-ffff-000000000001} - HCAPTCHA_SECRET: ${HCAPTCHA_SECRET:-0x0000000000000000000000000000000000000000} - HCAPTCHA_API_KEY: ${HCAPTCHA_API_KEY:-test} + POLYGON_AMOY_RPC_API_URL: *rpc_url_polygon_amoy nodejs_app_postgres_vars: &nodejs_app_postgres_vars <<: *postgres_auth_vars POSTGRES_HOST: *postgres_host @@ -188,8 +180,9 @@ services: BUCKET_MANIFESTS: *bucket_name_manifests BUCKET_DATASETS: *bucket_name_datasets BUCKET_REPUTATION_ORACLE: *bucket_name_rep_o - BUCKET_EXCHANGE_ORACLE: *bucket_name_exc_o - BUCKET_RECORDING_ORACLE: *bucket_name_rec_o + BUCKET_CVAT_EXCHANGE_ORACLE: *bucket_name_cvat_exc_o + BUCKET_CVAT_RECORDING_ORACLE: *bucket_name_cvat_rec_o + BUCKET_FORTUNE: *bucket_name_fortune entrypoint: > /bin/sh -c " mc alias set myminio http://minio:9000 $$MINIO_ROOT_USER $$MINIO_ROOT_PASSWORD @@ -206,11 +199,14 @@ services: mc mb myminio/$$BUCKET_REPUTATION_ORACLE; mc anonymous set public myminio/$$BUCKET_REPUTATION_ORACLE; - mc mb myminio/$$BUCKET_EXCHANGE_ORACLE; - mc anonymous set public myminio/$$BUCKET_EXCHANGE_ORACLE; + mc mb myminio/$$BUCKET_CVAT_EXCHANGE_ORACLE; + mc anonymous set public myminio/$$BUCKET_CVAT_EXCHANGE_ORACLE; + + mc mb myminio/$$BUCKET_CVAT_RECORDING_ORACLE; + mc anonymous set public myminio/$$BUCKET_CVAT_RECORDING_ORACLE; - mc mb myminio/$$BUCKET_RECORDING_ORACLE; - mc anonymous set public myminio/$$BUCKET_RECORDING_ORACLE; + mc mb myminio/$$BUCKET_FORTUNE; + mc anonymous set public myminio/$$BUCKET_FORTUNE; " reputation-oracle: @@ -228,7 +224,7 @@ services: logging: <<: *default-logging build: - context: ../../ + context: ../ dockerfile: packages/apps/reputation-oracle/server/Dockerfile expose: - *backend_apps_internal_port @@ -237,19 +233,18 @@ services: ports: - name: server_port target: *backend_apps_internal_port - published: ${REPUTATION_ORACLE_PORT:-5001} - env_file: ./.env.reputation-oracle.local + published: ${REPUTATION_ORACLE_EXPOSED_PORT:?} environment: <<: [*nodejs_app_vars, *nodejs_app_postgres_vars, *nodejs_app_s3_vars] HOST: *all_interfaces_ip PORT: *backend_apps_internal_port POSTGRES_DATABASE: reputation-oracle S3_BUCKET: *bucket_name_rep_o - HUMAN_APP_SECRET_KEY: *human_app_secret_key # It is accessed by user, not from container # so put here exposed port, not internal - FE_URL: http://localhost:${HUMAN_APP_CLIENT_PORT:?} - JWT_PUBLIC_KEY: *reputation_oracle_jwt_public_key + FE_URL: http://localhost:${HUMAN_APP_CLIENT_EXPOSED_PORT:?} + # User for KV store setup + SERVER_URL: http://reputation-oracle:${BACKEND_APPS_INTERNAL_PORT:?} human-app-server: container_name: human-app-server @@ -262,7 +257,7 @@ services: logging: <<: *default-logging build: - context: ../../ + context: ../ dockerfile: packages/apps/human-app/server/Dockerfile expose: - *backend_apps_internal_port @@ -271,17 +266,14 @@ services: ports: - name: server_port target: *backend_apps_internal_port - published: ${HUMAN_APP_SERVER_PORT:-5002} - env_file: ./.env.human-app-server.local + published: ${HUMAN_APP_SERVER_EXPOSED_PORT:?} environment: <<: [*nodejs_app_vars, *redis_app_vars] HOST: *all_interfaces_ip PORT: *backend_apps_internal_port REDIS_DB: 1 + REPUTATION_ORACLE_URL: http://reputation-oracle:${BACKEND_APPS_INTERNAL_PORT:?} RPC_URL: *rpc_url_polygon_amoy - HUMAN_APP_SECRET_KEY: *human_app_secret_key - REPUTATION_ORACLE_URL: "http://reputation-oracle:${BACKEND_APPS_INTERNAL_PORT:?}" - REPUTATION_ORACLE_ADDRESS: *reputation_oracle_address human-app-client: container_name: human-app-client @@ -294,7 +286,7 @@ services: logging: <<: *default-logging build: - context: ../../ + context: ../ dockerfile: packages/apps/human-app/frontend/Dockerfile expose: - *frontend_default_port @@ -303,11 +295,11 @@ services: ports: - name: server_port target: *frontend_default_port - published: ${HUMAN_APP_CLIENT_PORT:?} + published: ${HUMAN_APP_CLIENT_EXPOSED_PORT:?} environment: PORT: *frontend_default_port - exchange-oracle: + exchange-oracle-cvat: container_name: exchange-oracle-cvat image: human-protocol/exchange-oracle-cvat pull_policy: build @@ -324,7 +316,7 @@ services: logging: <<: *default-logging build: - context: ../../packages/examples/cvat/exchange-oracle + context: ../packages/examples/cvat/exchange-oracle dockerfile: ./Dockerfile expose: - *backend_apps_internal_port @@ -336,29 +328,26 @@ services: ports: - name: server_port target: *backend_apps_internal_port - published: ${EXCHANGE_ORACLE_PORT:-5003} - env_file: ./.env.exchange-oracle.local + published: ${EXCHANGE_ORACLE_CVAT_EXPOSED_PORT:?} environment: HOST: *all_interfaces_ip PORT: *backend_apps_internal_port <<: [ + *cvat_oracle_vars, *cvat_oracle_postgres_vars, *redis_app_vars, *cvat_oracle_storage_connection_vars, *cvat_connection_vars ] REDIS_DB: 2 - PG_DB: exchange-oracle - POLYGON_AMOY_RPC_API_URL: *rpc_url_polygon_amoy - POLYGON_AMOY_ADDR: *exchange_oracle_address - STORAGE_BUCKET_NAME: *bucket_name_exc_o - HUMAN_APP_JWT_KEY: *reputation_oracle_jwt_public_key + PG_DB: exchange-oracle-cvat + STORAGE_BUCKET_NAME: *bucket_name_cvat_exc_o CVAT_INCOMING_WEBHOOKS_URL: "http://exchange-oracle.app:${BACKEND_APPS_INTERNAL_PORT:?}/cvat-webhook" - LOCALHOST_RECORDING_ORACLE_URL: "http://recording-oracle:${BACKEND_APPS_INTERNAL_PORT:?}/webhook" - LOCALHOST_JOB_LAUNCHER_URL: "http://job-launcher:${BACKEND_APPS_INTERNAL_PORT:?}/webhook" - LOCALHOST_RECORDING_ORACLE_ADDRESS: *recording_oracle_address + ENABLE_CUSTOM_CLOUD_HOST: yes + # User for KV store setup + SERVER_URL: http://exchange-oracle-cvat:${BACKEND_APPS_INTERNAL_PORT:?} - recording-oracle: + recording-oracle-cvat: container_name: recording-oracle-cvat image: human-protocol/recording-oracle-cvat pull_policy: build @@ -373,7 +362,7 @@ services: logging: <<: *default-logging build: - context: ../../packages/examples/cvat/recording-oracle + context: ../packages/examples/cvat/recording-oracle dockerfile: ./Dockerfile expose: - *backend_apps_internal_port @@ -383,30 +372,22 @@ services: ports: - name: server_port target: *backend_apps_internal_port - published: ${RECORDING_ORACLE_PORT:-5004} - env_file: ./.env.recording-oracle.local + published: ${RECORDING_ORACLE_CVAT_EXPOSED_PORT:?} environment: HOST: *all_interfaces_ip PORT: *backend_apps_internal_port <<: [ + *cvat_oracle_vars, *cvat_oracle_postgres_vars, *cvat_oracle_storage_connection_vars, *cvat_connection_vars ] - PG_DB: recording-oracle - POLYGON_AMOY_RPC_API_URL: *rpc_url_polygon_amoy - POLYGON_AMOY_ADDR: *recording_oracle_address - STORAGE_RESULTS_BUCKET_NAME: *bucket_name_rec_o + PG_DB: recording-oracle-cvat + STORAGE_RESULTS_BUCKET_NAME: *bucket_name_cvat_rec_o STORAGE_USE_PATH_STYLE: "true" - EXCHANGE_ORACLE_STORAGE_PROVIDER: *cvat_oracle_storage_provider - EXCHANGE_ORACLE_STORAGE_ENDPOINT_URL: *cvat_oracle_storage_endpoint - EXCHANGE_ORACLE_STORAGE_ACCESS_KEY: *minio_services_access_key - EXCHANGE_ORACLE_STORAGE_SECRET_KEY: *minio_services_secret_key - EXCHANGE_ORACLE_STORAGE_RESULTS_BUCKET_NAME: *bucket_name_exc_o - EXCHANGE_ORACLE_STORAGE_USE_SSL: 'false' - LOCALHOST_EXCHANGE_ORACLE_URL: "http://exchange-oracle:${BACKEND_APPS_INTERNAL_PORT:?}/webhook" - LOCALHOST_REPUTATION_ORACLE_URL: "http://reputation-oracle:${BACKEND_APPS_INTERNAL_PORT:?}/webhook" - LOCALHOST_EXCHANGE_ORACLE_ADDRESS: *exchange_oracle_address + ENABLE_CUSTOM_CLOUD_HOST: "yes" + # User for KV store setup + SERVER_URL: http://recording-oracle-cvat:${BACKEND_APPS_INTERNAL_PORT:?} job-launcher: container_name: job-launcher @@ -423,7 +404,7 @@ services: logging: <<: *default-logging build: - context: ../../ + context: ../ dockerfile: packages/apps/job-launcher/server/Dockerfile expose: - *backend_apps_internal_port @@ -432,19 +413,16 @@ services: ports: - name: server_port target: *backend_apps_internal_port - published: ${JOB_LAUNCHER_PORT:-5005} - env_file: ./.env.job-launcher.local + published: ${JOB_LAUNCHER_EXPOSED_PORT:?} environment: <<: [*nodejs_app_vars, *nodejs_app_postgres_vars, *nodejs_app_s3_vars] HOST: *all_interfaces_ip PORT: *backend_apps_internal_port POSTGRES_DATABASE: job-launcher S3_BUCKET: *bucket_name_manifests - REPUTATION_ORACLES: *reputation_oracle_address - REPUTATION_ORACLE_ADDRESS: *reputation_oracle_address - CVAT_EXCHANGE_ORACLE_ADDRESS: *exchange_oracle_address - CVAT_RECORDING_ORACLE_ADDRESS: *recording_oracle_address - FE_URL: http://localhost:${JOB_LAUNCHER_CLIENT_PORT:?} + FE_URL: http://localhost:${JOB_LAUNCHER_CLIENT_EXPOSED_PORT:?} + # User for KV store setup + SERVER_URL: http://job-launcher:${BACKEND_APPS_INTERNAL_PORT:?} job-launcher-client: container_name: job-launcher-client @@ -457,7 +435,7 @@ services: logging: <<: *default-logging build: - context: ../../ + context: ../ dockerfile: packages/apps/job-launcher/client/Dockerfile expose: - *frontend_default_port @@ -466,10 +444,99 @@ services: ports: - name: server_port target: *frontend_default_port - published: ${JOB_LAUNCHER_CLIENT_PORT:?} + published: ${JOB_LAUNCHER_CLIENT_EXPOSED_PORT:?} + environment: + PORT: *frontend_default_port + + exchange-oracle-fortune: + container_name: exchange-oracle-fortune + image: human-protocol/exchange-oracle-fortune + pull_policy: build + depends_on: + postgres: + condition: service_healthy + minio: + condition: service_healthy + minio-client: + condition: service_completed_successfully + restart: *default-restart + logging: + <<: *default-logging + build: + context: ../ + dockerfile: packages/apps/fortune/exchange-oracle/server/Dockerfile + expose: + - *backend_apps_internal_port + networks: + - human_protocol + ports: + - name: server_port + target: *backend_apps_internal_port + published: ${EXCHANGE_ORACLE_FORTUNE_EXPOSED_PORT:?} + environment: + <<: [*nodejs_app_vars, *nodejs_app_postgres_vars, *nodejs_app_s3_vars] + HOST: *all_interfaces_ip + PORT: *backend_apps_internal_port + POSTGRES_DATABASE: exchange-oracle-fortune + S3_BUCKET: *bucket_name_fortune + # User for KV store setup + SERVER_URL: http://exchange-oracle-fortune:${BACKEND_APPS_INTERNAL_PORT:?} + + fortune-client: + container_name: fortune-client + image: human-protocol/fortune-client + pull_policy: build + depends_on: + exchange-oracle-fortune: + condition: service_started + restart: *default-restart + logging: + <<: *default-logging + build: + context: ../ + dockerfile: packages/apps/fortune/exchange-oracle/client/Dockerfile + expose: + - *frontend_default_port + networks: + - human_protocol + ports: + - name: server_port + target: *frontend_default_port + published: ${FORTUNE_CLIENT_EXPOSED_PORT:?} environment: PORT: *frontend_default_port + recording-oracle-fortune: + container_name: recording-oracle-fortune + image: human-protocol/recording-oracle-fortune + pull_policy: build + depends_on: + minio: + condition: service_healthy + minio-client: + condition: service_completed_successfully + restart: *default-restart + logging: + <<: *default-logging + build: + context: ../ + dockerfile: packages/apps/fortune/recording-oracle/Dockerfile + expose: + - *backend_apps_internal_port + networks: + - human_protocol + ports: + - name: server_port + target: *backend_apps_internal_port + published: ${RECORDING_ORACLE_FORTUNE_EXPOSED_PORT:?} + environment: + <<: [*nodejs_app_vars, *nodejs_app_s3_vars] + HOST: *all_interfaces_ip + PORT: *backend_apps_internal_port + S3_BUCKET: *bucket_name_fortune + # User for KV store setup + SERVER_URL: http://recording-oracle-fortune:${BACKEND_APPS_INTERNAL_PORT:?} + volumes: # When init for the first time postgres requires empty directory # that is exclusive to its user, so providing a separate volume diff --git a/docker-setup/initdb/create-dbs.sql b/docker-setup/initdb/create-dbs.sql new file mode 100644 index 0000000000..da24368f29 --- /dev/null +++ b/docker-setup/initdb/create-dbs.sql @@ -0,0 +1,5 @@ +CREATE DATABASE "reputation-oracle"; +CREATE DATABASE "job-launcher"; +CREATE DATABASE "exchange-oracle-cvat"; +CREATE DATABASE "recording-oracle-cvat"; +CREATE DATABASE "exchange-oracle-fortune"; diff --git a/package.json b/package.json index 4bb0c41bee..d92d51468a 100644 --- a/package.json +++ b/package.json @@ -10,7 +10,9 @@ "lint": "yarn workspaces foreach --all -p run lint", "build:core": "yarn workspace @human-protocol/core build", "build:sdk": "yarn workspace @human-protocol/sdk build", - "build:libs": "yarn build:core && yarn build:sdk" + "build:libs": "yarn build:core && yarn build:sdk", + "docker:infra-up": "make -C ./docker-setup check-env-file infra-up", + "docker:stop": "make -C ./docker-setup services-stop" }, "workspaces": [ "packages/**" diff --git a/packages/apps/dashboard/client/.env.example b/packages/apps/dashboard/client/.env.example index 62ebf481d3..7308b99ba5 100644 --- a/packages/apps/dashboard/client/.env.example +++ b/packages/apps/dashboard/client/.env.example @@ -1,22 +1,26 @@ -# link to api -VITE_API_URL= -# links to navbar items -VITE_NAVBAR_LINK_GITBOOK= -VITE_NAVBAR_LINK_FAUCETS= -VITE_NAVBAR_LINK_HUMAN_WEBSITE= -VITE_NAVBAR_LINK_LAUNCH_JOBS= -VITE_NAVBAR_LINK_WORK_AND_EARN= -# link to button on 'Role details' page -VITE_HUMANPROTOCOL_CORE_ARCHITECTURE= -# links to footer socials -VITE_FOOTER_LINK_GITHUB= -VITE_FOOTER_LINK_DISCORD= -VITE_FOOTER_LINK_X= -VITE_FOOTER_LINK_TELEGRAM= -VITE_FOOTER_LINK_LINKEDIN= -# other footer links -VITE_FOOTER_LINK_TERMS_OF_SERVICE= -VITE_FOOTER_LINK_PRIVACY_POLICY= -VITE_FOOTER_LINK_HUMAN_PROTOCOL= +# General +VITE_API_URL=http://0.0.0.0:5006 +VITE_ENABLED_CHAIN_IDS=97,80002,11155111 + +# Links to navbar items +VITE_NAVBAR_LINK_GITBOOK=https://docs.humanprotocol.org/ +VITE_NAVBAR_LINK_FAUCETS=https://faucet.humanprotocol.org +VITE_NAVBAR_LINK_HUMAN_WEBSITE=https://humanprotocol.org/ +VITE_NAVBAR_LINK_LAUNCH_JOBS=https://job-launcher.humanprotocol.org/ +VITE_NAVBAR_LINK_WORK_AND_EARN=https://app.humanprotocol.org/ + +# Link to button on 'Role details' page +VITE_HUMANPROTOCOL_CORE_ARCHITECTURE=https://docs.humanprotocol.org/hub/human-tech-docs/architecture + +# Links to footer socials +VITE_FOOTER_LINK_GITHUB=https://github.com/humanprotocol/human-protocol +VITE_FOOTER_LINK_DISCORD=https://discord.com/invite/5sHfvE8y8p +VITE_FOOTER_LINK_X=https://x.com/intent/follow?screen_name=human_protocol +VITE_FOOTER_LINK_TELEGRAM=https://t.me/human_protocol_community +VITE_FOOTER_LINK_LINKEDIN=https://www.linkedin.com/company/human-protocol + +# Other footer links +VITE_FOOTER_LINK_TERMS_OF_SERVICE=https://humanprotocol.org/privacy-policy +VITE_FOOTER_LINK_PRIVACY_POLICY=https://humanprotocol.org/privacy-policy +VITE_FOOTER_LINK_HUMAN_PROTOCOL=https://humanprotocol.org/ -VITE_ENABLED_CHAIN_IDS= diff --git a/packages/apps/dashboard/client/vite.config.ts b/packages/apps/dashboard/client/vite.config.ts index accd21e3a9..9f7cc79504 100644 --- a/packages/apps/dashboard/client/vite.config.ts +++ b/packages/apps/dashboard/client/vite.config.ts @@ -36,6 +36,6 @@ export default defineConfig({ }, }, server: { - port: 3001, + port: 3004, }, }); diff --git a/packages/apps/dashboard/server/.env.example b/packages/apps/dashboard/server/.env.example index f3ac7f4f39..4d02bcd63d 100644 --- a/packages/apps/dashboard/server/.env.example +++ b/packages/apps/dashboard/server/.env.example @@ -1,36 +1,30 @@ # App -NODE_ENV=development -HOST=localhost -PORT=3000 -CORS_ENABLED= -CORS_ALLOWED_ORIGIN= -CORS_ALLOWED_HEADERS= -SUBGRAPH_API_KEY= -HMT_PRICE_SOURCE= -HMT_PRICE_SOURCE_API_KEY= -HMT_PRICE_FROM= -HMT_PRICE_TO= -HCAPTCHA_API_KEY= -HCAPTCHA_STATS_ENABLED= -NETWORK_USAGE_FILTER_MONTHS= -NETWORKS_OPERATING_CACHE_TTL= +HOST=0.0.0.0 +PORT=5006 +CORS_ENABLED=true +CORS_ALLOWED_ORIGIN=* + +# API keys +HMT_PRICE_SOURCE_API_KEY=replace_me +HCAPTCHA_API_KEY=replace_me # Redis -REDIS_HOST=localhost -REDIS_PORT=6379 -CACHE_HMT_PRICE_TTL=60 -CACHE_HMT_GENERAL_STATS_TTL=120 -HMT_PRICE_CACHE_KEY= -REPUTATION_SOURCE_URL= +REDIS_HOST=0.0.0.0 +REDIS_PORT=6380 # S3 -S3_ENDPOINT= -S3_PORT= -S3_ACCESS_KEY= -S3_SECRET_KEY= -S3_USE_SSL= -S3_BUCKET= +S3_ENDPOINT=0.0.0.0 +S3_PORT=9000 +S3_ACCESS_KEY=human-oracle +S3_SECRET_KEY=human-oracle-s3-secret +S3_BUCKET=dashboard-hcaptcha-historical-stats +S3_USE_SSL=false #Web3 -WEB3_ENV= -RPC_URL_POLYGON= +WEB3_ENV=testnet +RPC_URL_POLYGON=https://rpc-amoy.polygon.technology +RPC_URL_BSC_TESTNET=https://bsc-testnet.drpc.org +RPC_URL_SEPOLIA=https://rpc.sepolia.org + +# Reputation Oracle URL +REPUTATION_SOURCE_URL=http://0.0.0.0:5001 diff --git a/packages/apps/dashboard/server/docker-compose.yml b/packages/apps/dashboard/server/docker-compose.yml deleted file mode 100644 index 6258fe800c..0000000000 --- a/packages/apps/dashboard/server/docker-compose.yml +++ /dev/null @@ -1,10 +0,0 @@ -name: 'dashboard-server' - -services: - redis: - image: redis:latest - container_name: dashboard-cache - ports: - - '6379:6379' - volumes: - - ./redis_data:/data \ No newline at end of file diff --git a/packages/apps/faucet/client/vite.config.ts b/packages/apps/faucet/client/vite.config.ts index 82dc93a9c0..3c407bc5d4 100644 --- a/packages/apps/faucet/client/vite.config.ts +++ b/packages/apps/faucet/client/vite.config.ts @@ -33,7 +33,7 @@ export default defineConfig(({ mode }) => { }, }, server: { - port: 3002, + port: 3006, }, }; }); diff --git a/packages/apps/fortune/exchange-oracle/client/.env.example b/packages/apps/fortune/exchange-oracle/client/.env.example index da2c159e02..1956902a37 100644 --- a/packages/apps/fortune/exchange-oracle/client/.env.example +++ b/packages/apps/fortune/exchange-oracle/client/.env.example @@ -1,11 +1,7 @@ -VITE_APP_EXCHANGE_ORACLE_SERVER_URL= +# General +VITE_APP_EXCHANGE_ORACLE_SERVER_URL=http://0.0.0.0:5006 +VITE_APP_WALLETCONNECT_PROJECT_ID=replace_me + +# Web3 VITE_APP_ENVIRONMENT=testnet -VITE_APP_RPC_URL_POLYGON= -VITE_APP_RPC_URL_BSC= -VITE_APP_RPC_URL_POLYGON_AMOY= -VITE_APP_RPC_URL_GOERLI= -VITE_APP_RPC_URL_SEPOLIA= -VITE_APP_RPC_URL_MOONBEAM= -VITE_APP_RPC_URL_BSC_TESTNET= -VITE_APP_RPC_URL_LOCALHOST=http://0.0.0.0:8545/ -VITE_APP_WALLETCONNECT_PROJECT_ID= \ No newline at end of file +VITE_APP_SUPPORTED_CHAINS=80002 \ No newline at end of file diff --git a/packages/apps/fortune/exchange-oracle/client/Dockerfile b/packages/apps/fortune/exchange-oracle/client/Dockerfile new file mode 100644 index 0000000000..b47c3f4c23 --- /dev/null +++ b/packages/apps/fortune/exchange-oracle/client/Dockerfile @@ -0,0 +1,35 @@ +# Using bullseye instead of slim because it needs Python and build tools for node-gyp +FROM node:22.14-bullseye +ARG APP_PATH=packages/apps/fortune/exchange-oracle/client + +# Create app directory +WORKDIR /usr/src/app + +# Copy expected yarn dist +COPY .yarn ./.yarn +COPY .yarnrc.yml ./ + +# Copy files for deps installation +COPY package.json yarn.lock ./ +COPY ${APP_PATH}/package.json ./${APP_PATH}/ + +# Some deps are referenced as "workspace:*", +# so we need to copy and build them +COPY packages/core ./packages/core +COPY packages/sdk ./packages/sdk + +RUN yarn install + +# Copy base TS config that is required to build pacakges +COPY tsconfig.base.json ./ +# Build libs +RUN yarn build:libs + +# Copy everything else +COPY ${APP_PATH} ./${APP_PATH} + +WORKDIR ./${APP_PATH} +RUN yarn build + +# Start the server using the build +CMD [ "yarn", "start:prod" ] \ No newline at end of file diff --git a/packages/apps/fortune/exchange-oracle/client/package.json b/packages/apps/fortune/exchange-oracle/client/package.json index 747202275c..e6c3b2b24d 100644 --- a/packages/apps/fortune/exchange-oracle/client/package.json +++ b/packages/apps/fortune/exchange-oracle/client/package.json @@ -6,7 +6,7 @@ "scripts": { "clean": "rm -rf dist", "lint": "eslint \"**/*.{ts,tsx}\"", - "start": "vite --port 3006", + "start": "vite", "build": "vite build", "preview": "vite preview", "start:prod": "serve -s dist", @@ -27,7 +27,10 @@ ] }, "dependencies": { + "@emotion/react": "^11.11.3", + "@emotion/styled": "^11.11.0", "@human-protocol/sdk": "workspace:^", + "@mui/icons-material": "^7.0.1", "@mui/material": "^5.16.7", "@tanstack/query-sync-storage-persister": "^5.68.0", "@tanstack/react-query": "^5.67.2", diff --git a/packages/apps/fortune/exchange-oracle/client/vite.config.ts b/packages/apps/fortune/exchange-oracle/client/vite.config.ts index 147fdcb76f..9dd2c1afd3 100644 --- a/packages/apps/fortune/exchange-oracle/client/vite.config.ts +++ b/packages/apps/fortune/exchange-oracle/client/vite.config.ts @@ -25,6 +25,6 @@ export default defineConfig({ }, }, server: { - port: 3006, + port: 3003, }, }); diff --git a/packages/apps/fortune/exchange-oracle/server/.env.example b/packages/apps/fortune/exchange-oracle/server/.env.example index 4e8005d39f..6c0f17db8b 100644 --- a/packages/apps/fortune/exchange-oracle/server/.env.example +++ b/packages/apps/fortune/exchange-oracle/server/.env.example @@ -1,43 +1,59 @@ # General -NODE_ENV=development -PORT= -CRON_SECRET= +HOST=0.0.0.0 +PORT=5006 # Database POSTGRES_HOST=0.0.0.0 -POSTGRES_USER=operator +POSTGRES_PORT=5433 +POSTGRES_USER=default POSTGRES_PASSWORD=qwerty -POSTGRES_DATABASE=exchange-oracle -POSTGRES_SYNC=false -POSTGRES_PORT=5432 +POSTGRES_DATABASE=exchange-oracle-fortune POSTGRES_SSL=false -POSTGRES_LOGGING='all' - # S3 -S3_ENDPOINT= -S3_PORT= -S3_ACCESS_KEY= -S3_SECRET_KEY= -S3_USE_SSL= -S3_BUCKET= +S3_ENDPOINT=0.0.0.0 +S3_PORT=9000 +S3_ACCESS_KEY=human-oracle +S3_SECRET_KEY=human-oracle-s3-secret +S3_BUCKET=fortune +S3_USE_SSL=false # Web3 -WEB3_ENV=localhost -WEB3_PRIVATE_KEY= -RPC_URL_POLYGON= -RPC_URL_BSC= -RPC_URL_POLYGON_AMOY= -RPC_URL_SEPOLIA= -RPC_URL_MOONBEAM= -RPC_URL_BSC_TESTNET= -RPC_URL_XLAYER= -RPC_URL_LOCALHOST= +WEB3_ENV=testnet +WEB3_PRIVATE_KEY=replace_me +RPC_URL_POLYGON_AMOY=https://rpc-amoy.polygon.technology # PGP -PGP_ENCRYPT= -PGP_PRIVATE_KEY= -PGP_PASSPHRASE= +PGP_ENCRYPT=true +PGP_PRIVATE_KEY="-----BEGIN PGP PRIVATE KEY BLOCK----- + +xYYEaCsZkBYJKwYBBAHaRw8BAQdA57OtWky46JfMXjUuc0Lb7DhlfLuLYIfI +j/k/vJiuL+D+CQMI2p74jVMUUM3g8z+mhvW3+G5ajp6G3kwqlwMA5GXvbPsI +AwMt8q3dT51U0FpaeFR0vzbokC/3J2yn44MrHT5W1ZaKbWLlx5QGiAqkl9D3 +ec0AwowEEBYKAD4FgmgrGZAECwkHCAmQsDLkiO/wmn8DFQgKBBYAAgECGQEC +mwMCHgEWIQStAYPfywhyBWsDk4WwMuSI7/CafwAAjXYA/AxG1Y6vL3JJnm/0 +8BpA2X1I2mAf36tfpWh79EI1YzcSAQD2Nx6hzzl+zTk9usms4iyl0ZkA5GqR +EQQggrHIZEvKCseLBGgrGZASCisGAQQBl1UBBQEBB0Cf3IqFfpNHTpIM6QQK +z9MtsKJsoaIdoBq5o65jX+v4CQMBCAf+CQMIYLeP6Ua7BsHgqKKEO4VYdHu8 +tIoEcZkDffm5NQ3BmS1c4tYp63d4jxZmkbyw3xHj6QS3D9a7IF+/R2+rrYf1 +Y0HFz1H9TSsJnuvOCf2wiMJ4BBgWCgAqBYJoKxmQCZCwMuSI7/CafwKbDBYh +BK0Bg9/LCHIFawOThbAy5Ijv8Jp/AACRFgEA0cwrCjODyF7GleZK/SHff9xn +oRSkBzq+CCaA/eqQ/ikBALfxC5M+OM7od4w9xKBThNG2M2lC4D9enGU5+cGE +BRoN +=gvnq +-----END PGP PRIVATE KEY BLOCK-----" +PGP_PASSPHRASE=6fD8WuRhT85mxP11PfX +# Put it here just to easily set up KV later; not needed to run +PGP_PUBLIC_KEY="-----BEGIN PGP PUBLIC KEY BLOCK----- -# Cron Job Secret -CRON_SECRET="cron-secret" \ No newline at end of file +xjMEaCsZkBYJKwYBBAHaRw8BAQdA57OtWky46JfMXjUuc0Lb7DhlfLuLYIfI +j/k/vJiuL+DNAMKMBBAWCgA+BYJoKxmQBAsJBwgJkLAy5Ijv8Jp/AxUICgQW +AAIBAhkBApsDAh4BFiEErQGD38sIcgVrA5OFsDLkiO/wmn8AAI12APwMRtWO +ry9ySZ5v9PAaQNl9SNpgH9+rX6Voe/RCNWM3EgEA9jceoc85fs05PbrJrOIs +pdGZAORqkREEIIKxyGRLygrOOARoKxmQEgorBgEEAZdVAQUBAQdAn9yKhX6T +R06SDOkECs/TLbCibKGiHaAauaOuY1/r+AkDAQgHwngEGBYKACoFgmgrGZAJ +kLAy5Ijv8Jp/ApsMFiEErQGD38sIcgVrA5OFsDLkiO/wmn8AAJEWAQDRzCsK +M4PIXsaV5kr9Id9/3GehFKQHOr4IJoD96pD+KQEAt/ELkz44zuh3jD3EoFOE +0bYzaULgP16cZTn5wYQFGg0= +=ppFH +-----END PGP PUBLIC KEY BLOCK-----" diff --git a/packages/apps/fortune/exchange-oracle/server/Dockerfile b/packages/apps/fortune/exchange-oracle/server/Dockerfile index 53a10f4234..29c97e32f6 100644 --- a/packages/apps/fortune/exchange-oracle/server/Dockerfile +++ b/packages/apps/fortune/exchange-oracle/server/Dockerfile @@ -1,18 +1,35 @@ -# Base image -FROM node:18 +FROM node:22.14-slim +ARG APP_PATH=packages/apps/fortune/exchange-oracle/server # Create app directory WORKDIR /usr/src/app -# Bundle app source -COPY . . +# Copy expected yarn dist +COPY .yarn ./.yarn +COPY .yarnrc.yml ./ + +# Copy files for deps installation +COPY package.json yarn.lock ./ +COPY ${APP_PATH}/package.json ./${APP_PATH}/ + +# Some deps are referenced as "workspace:*", +# so we need to copy and build them +COPY packages/core ./packages/core +COPY packages/sdk ./packages/sdk -# Install app dependencies RUN yarn install + +# Copy base TS config that is required to build pacakges +COPY tsconfig.base.json ./ +# Build libs RUN yarn build:libs +# Copy everything else +COPY ${APP_PATH} ./${APP_PATH} + +WORKDIR ./${APP_PATH} # Creates a "dist" folder with the production build -RUN yarn workspace @human-protocol/fortune-exchange-oracle-server build +RUN yarn build -# Start the server using the production build -CMD [ "node", "packages/apps/fortune/exchange-oracle/server/dist/src/main.js" ] +# Start the server using the build +CMD [ "yarn", "start:prod" ] diff --git a/packages/apps/fortune/exchange-oracle/server/ENV.md b/packages/apps/fortune/exchange-oracle/server/ENV.md deleted file mode 100644 index 3a718a5cfc..0000000000 --- a/packages/apps/fortune/exchange-oracle/server/ENV.md +++ /dev/null @@ -1,92 +0,0 @@ -# Environment Variables - -### The URL for connecting to the PostgreSQL database. -POSTGRES_URL= - -### The hostname or IP address of the PostgreSQL database server. Default: '127.0.0.1' -POSTGRES_HOST="127.0.0.1" - -### The port number on which the PostgreSQL database server is listening. Default: 5432 -POSTGRES_PORT="5432" - -### The username for authenticating with the PostgreSQL database. Default: 'operator' -POSTGRES_USER="operator" - -### The password for authenticating with the PostgreSQL database. Default: 'qwerty' -POSTGRES_PASSWORD="qwerty" - -### The name of the PostgreSQL database to connect to. Default: 'exchange-oracle' -POSTGRES_DATABASE="exchange-oracle" - -### Indicates whether to use SSL for connections to the PostgreSQL database. Default: false -POSTGRES_SSL="false" - -### The logging level for PostgreSQL operations (e.g., 'debug', 'info'). Default: 'log,info,warn,error' -POSTGRES_LOGGING="log,info,warn,error" - -### The RPC URL for the Sepolia network. -RPC_URL_SEPOLIA= - -### The RPC URL for the Polygon network. -RPC_URL_POLYGON= - -### The RPC URL for the Polygon Amoy network. -RPC_URL_POLYGON_AMOY= - -### The RPC URL for the BSC Mainnet network. -RPC_URL_BSC_MAINNET= - -### The RPC URL for the BSC Testnet network. -RPC_URL_BSC_TESTNET= - -### The RPC URL for the Localhost network. -RPC_URL_LOCALHOST= - -### Indicates whether PGP encryption should be used. Default: false -PGP_ENCRYPT="false" - -### The private key used for PGP encryption or decryption. -PGP_PRIVATE_KEY= - -### The passphrase associated with the PGP private key. -PGP_PASSPHRASE= - -### The endpoint URL for connecting to the S3 service. Default: '127.0.0.1' -S3_ENDPOINT="127.0.0.1" - -### The port number for connecting to the S3 service. Default: 9000 -S3_PORT="9000" - -### The access key ID used to authenticate requests to the S3 service. Required -S3_ACCESS_KEY= - -### The secret access key used to authenticate requests to the S3 service. Required -S3_SECRET_KEY= - -### The name of the S3 bucket where files will be stored. Default: 'exchange' -S3_BUCKET="exchange" - -### Indicates whether to use SSL (HTTPS) for connections to the S3 service. Default: false -S3_USE_SSL="false" - -### The environment in which the server is running (e.g., 'development', 'production'). Default: 'development' -NODE_ENV="development" - -### The hostname or IP address on which the server will run. Default: 'localhost' -HOST="localhost" - -### The port number on which the server will listen for incoming connections. Default: 5000 -PORT="5000" - -### The URL of the frontend application that the server will communicate with. Default: 'http://localhost:3005' -FE_URL="http://localhost:3005" - -### The maximum number of retry attempts for certain operations. Default: 5 -MAX_RETRY_COUNT="5" - -### The environment in which the Web3 application is running. Default: 'testnet' -WEB3_ENV="testnet" - -### The private key used for signing transactions. Required -WEB3_PRIVATE_KEY= - diff --git a/packages/apps/fortune/exchange-oracle/server/README.md b/packages/apps/fortune/exchange-oracle/server/README.md index 3a4ce72618..10e135d71a 100644 --- a/packages/apps/fortune/exchange-oracle/server/README.md +++ b/packages/apps/fortune/exchange-oracle/server/README.md @@ -45,11 +45,11 @@ First of all, postgres needs to be installed, please see here - /bin/sh -c " - /usr/bin/mc config host add myminio http://minio:9000 dev devdevdev; - /usr/bin/mc mb myminio/solution; - /usr/bin/mc anonymous set public myminio/solution; - " diff --git a/packages/apps/fortune/exchange-oracle/server/package.json b/packages/apps/fortune/exchange-oracle/server/package.json index 2f71d2c961..f808bbe57a 100644 --- a/packages/apps/fortune/exchange-oracle/server/package.json +++ b/packages/apps/fortune/exchange-oracle/server/package.json @@ -20,26 +20,37 @@ "migration:revert": "yarn build && typeorm-ts-node-commonjs migration:revert -d typeorm.config.ts", "migration:run": "yarn build && typeorm-ts-node-commonjs migration:run -d typeorm.config.ts", "migration:show": "yarn build && typeorm-ts-node-commonjs migration:show -d typeorm.config.ts", - "docker:db:up": "docker compose up -d && yarn migration:run", - "docker:db:down": "docker compose down", "test:watch": "jest --watch", "test:cov": "jest --coverage", "test:debug": "node --inspect-brk -r tsconfig-paths/register -r ts-node/register node_modules/.bin/jest --runInBand", "setup:local": "ts-node ./test/setup.ts", + "setup:kvstore": "ts-node ./scripts/setup-kv-store.ts", "generate-env-doc": "ts-node scripts/generate-env-doc.ts" }, "dependencies": { "@human-protocol/sdk": "workspace:*", "@nestjs/axios": "^3.1.2", "@nestjs/common": "^10.2.7", + "@nestjs/config": "^3.1.1", "@nestjs/core": "^10.3.10", + "@nestjs/passport": "^10.0.0", + "@nestjs/platform-express": "^10.3.10", + "@nestjs/schedule": "^4.0.1", + "@nestjs/swagger": "^7.4.2", "@nestjs/terminus": "^11.0.0", "@nestjs/typeorm": "^10.0.1", + "@types/passport-jwt": "^4.0.1", "axios": "^1.3.1", + "body-parser": "^1.20.3", "class-transformer": "^0.5.1", "class-validator": "0.14.1", + "dotenv": "^16.3.2", "ethers": "~6.13.5", "joi": "^17.13.3", + "jsonwebtoken": "^9.0.2", + "minio": "7.1.3", + "passport": "^0.7.0", + "passport-jwt": "^4.0.1", "pg": "8.13.1", "reflect-metadata": "^0.2.2", "rxjs": "^7.2.0", @@ -51,9 +62,12 @@ "@nestjs/cli": "^10.3.2", "@nestjs/schematics": "^11.0.2", "@nestjs/testing": "^10.4.6", + "@types/body-parser": "^1", "@types/express": "^4.17.13", "@types/jest": "29.5.12", + "@types/jsonwebtoken": "^9.0.7", "@types/node": "22.10.5", + "@types/passport": "^0", "@types/pg": "8.11.10", "@types/supertest": "^6.0.2", "@typescript-eslint/eslint-plugin": "^5.0.0", diff --git a/packages/apps/fortune/exchange-oracle/server/scripts/set-manifest-url.ts b/packages/apps/fortune/exchange-oracle/server/scripts/set-manifest-url.ts deleted file mode 100644 index 3dc3946559..0000000000 --- a/packages/apps/fortune/exchange-oracle/server/scripts/set-manifest-url.ts +++ /dev/null @@ -1,67 +0,0 @@ -//This script reads manifest urls from the blockchain and set them in the database in the new column manifest_url - -import { EscrowClient } from '@human-protocol/sdk'; -import * as dotenv from 'dotenv'; -import { Client } from 'pg'; -import { ethers } from 'ethers'; - -dotenv.config({ - path: '.env', -}); - -const dbConfig = { - user: process.env.POSTGRES_USER, - host: process.env.POSTGRES_HOST, - database: process.env.POSTGRES_DATABASE, - password: process.env.POSTGRES_PASSWORD, - port: +process.env.POSTGRES_PORT!, - ssl: process.env.POSTGRES_SSL == 'true', -}; - -async function createProvider() { - const provider = new ethers.JsonRpcProvider(process.env.RPC_URL); - return provider; -} - -async function updateJobsWithManifestUrls() { - const client = new Client(dbConfig); - - try { - await client.connect(); - - const provider = await createProvider(); - const escrowClient = await EscrowClient.build(provider); - - console.log('Connected to the database.'); - - const res = await client.query( - 'SELECT * FROM "hmt"."jobs" WHERE manifest_url IS NULL', - ); - const jobsWithoutManifest = res.rows; - - for (const job of jobsWithoutManifest) { - const { escrow_address: escrowAddress, id } = job; - - try { - const manifestUrl = await escrowClient.getManifestUrl(escrowAddress); - - if (manifestUrl) { - await client.query( - 'UPDATE "hmt"."jobs" SET manifest_url = $1 WHERE id = $2', - [manifestUrl, id], - ); - console.log(`Updated job ${id} with manifestUrl: ${manifestUrl}`); - } - } catch (error) { - console.error(`Failed to update job ${id}:`, error); - } - } - } catch (error) { - console.error('Failed to update manifest URLs:', error); - } finally { - await client.end(); - console.log('Disconnected from the database.'); - } -} - -updateJobsWithManifestUrls(); diff --git a/packages/apps/fortune/exchange-oracle/server/scripts/setup-kv-store.ts b/packages/apps/fortune/exchange-oracle/server/scripts/setup-kv-store.ts new file mode 100644 index 0000000000..d7344a3d54 --- /dev/null +++ b/packages/apps/fortune/exchange-oracle/server/scripts/setup-kv-store.ts @@ -0,0 +1,152 @@ +import 'dotenv/config'; +import { KVStoreClient, KVStoreKeys, Role } from '@human-protocol/sdk'; +import { Wallet, ethers } from 'ethers'; +import * as Minio from 'minio'; + +const SUPPORTED_JOB_TYPES = 'fortune'; +const ROLE = Role.ExchangeOracle; + +async function setupCommonValues(kvStoreClient: KVStoreClient): Promise { + const { SERVER_URL = 'http://localhost:5006', FEE = '1' } = process.env; + + if (SUPPORTED_JOB_TYPES.split(',').length === 0) { + throw new Error('SUPPORTED_JOB_TYPES should be comma-separated list'); + } + try { + new URL(SERVER_URL || ''); + } catch (noop) { + throw new Error('Invalid SERVER_URL'); + } + let url = SERVER_URL.endsWith('/') ? SERVER_URL.slice(0, -1) : SERVER_URL; + if (!url.startsWith('http')) { + url = `http://${url}`; + } + + const fee = Number(FEE); + if (!Number.isInteger(fee) || fee < 1) { + throw new Error('Fee must be positive integer'); + } + + await kvStoreClient.setBulk( + [ + KVStoreKeys.role, + KVStoreKeys.fee, + KVStoreKeys.url, + KVStoreKeys.webhookUrl, + KVStoreKeys.jobTypes, + ], + [ROLE, fee.toString(), url, `${url}/webhook`, SUPPORTED_JOB_TYPES], + ); +} + +type SetupPublicKeyFileMeta = { + keyName: string; + publicKey: string; + s3Bucket: string; + s3Endpoint: string; + s3Port: string; + kvKey: string; +}; + +async function setupPublicKeyFile( + kvStoreClient: KVStoreClient, + minioClient: Minio.Client, + meta: SetupPublicKeyFileMeta, +): Promise { + const { keyName, kvKey, publicKey, s3Bucket, s3Endpoint, s3Port } = meta; + const exists = await minioClient.bucketExists(s3Bucket); + if (!exists) { + throw new Error('Bucket does not exists'); + } + + await minioClient.putObject(s3Bucket, keyName, publicKey, { + 'Content-Type': 'text/plain', + 'Cache-Control': 'no-store', + }); + /** + * Protocol is required for 'setFileUrlAndHash' + */ + const _s3Endpoint = s3Endpoint.startsWith('http') + ? s3Endpoint + : `http://${s3Endpoint}`; + const fileUrl = `${_s3Endpoint}:${s3Port}/${s3Bucket}/${keyName}`; + await kvStoreClient.setFileUrlAndHash(fileUrl, kvKey); +} + +async function setup(): Promise { + const { WEB3_PRIVATE_KEY, RPC_URL_POLYGON_AMOY: RPC_URL } = process.env; + if (!WEB3_PRIVATE_KEY) { + throw new Error('Private key is empty'); + } + if (!RPC_URL) { + throw new Error('RPC url is empty'); + } + + const provider = new ethers.JsonRpcProvider(RPC_URL); + const wallet = new Wallet(WEB3_PRIVATE_KEY, provider); + + const kvStoreClient = await KVStoreClient.build(wallet); + + await setupCommonValues(kvStoreClient); + + const { + S3_ENDPOINT, + S3_PORT, + S3_USE_SSL, + S3_ACCESS_KEY, + S3_SECRET_KEY, + S3_BUCKET, + } = process.env; + + if ( + [S3_ENDPOINT, S3_PORT, S3_ACCESS_KEY, S3_SECRET_KEY, S3_BUCKET].some( + (value) => !value, + ) + ) { + throw new Error('Missing S3 config value'); + } + + const s3Endpoint = S3_ENDPOINT as string; + const s3Port = S3_PORT as string; + const s3AccessKey = S3_ACCESS_KEY as string; + const s3SecretKey = S3_SECRET_KEY as string; + const s3Bucket = S3_BUCKET as string; + + const minioClient = new Minio.Client({ + endPoint: s3Endpoint, + port: parseInt(s3Port, 10), + useSSL: S3_USE_SSL === 'true', + accessKey: s3AccessKey, + secretKey: s3SecretKey, + }); + + const { + PGP_ENCRYPT, + PGP_PUBLIC_KEY, + PGP_PUBLIC_KEY_FILE = 'pgp-public-key-exco', + } = process.env; + if (PGP_ENCRYPT && PGP_ENCRYPT === 'true') { + if (!PGP_PUBLIC_KEY) { + throw new Error('PGP public key is empty'); + } + + await setupPublicKeyFile(kvStoreClient, minioClient, { + s3Endpoint, + s3Port, + s3Bucket, + publicKey: PGP_PUBLIC_KEY, + keyName: PGP_PUBLIC_KEY_FILE, + kvKey: KVStoreKeys.publicKey, + }); + } +} + +(async () => { + try { + await setup(); + process.exit(0); + } catch (error) { + console.error('Failed to setup KV', error); + process.exit(1); + } +})(); diff --git a/packages/apps/fortune/exchange-oracle/server/src/app.module.ts b/packages/apps/fortune/exchange-oracle/server/src/app.module.ts index b2bc81423f..03f66a01ae 100644 --- a/packages/apps/fortune/exchange-oracle/server/src/app.module.ts +++ b/packages/apps/fortune/exchange-oracle/server/src/app.module.ts @@ -51,9 +51,10 @@ import { HttpValidationPipe } from './common/pipes'; CronJobModule, UserModule, ConfigModule.forRoot({ - envFilePath: process.env.NODE_ENV - ? `.env.${process.env.NODE_ENV as string}` - : '.env', + /** + * First value found takes precendece + */ + envFilePath: [`.env.${process.env.NODE_ENV}`, '.env'], validationSchema: envValidator, }), DatabaseModule, diff --git a/packages/apps/fortune/exchange-oracle/server/src/common/config/server-config.service.ts b/packages/apps/fortune/exchange-oracle/server/src/common/config/server-config.service.ts index 130dbabd19..7b140780c5 100644 --- a/packages/apps/fortune/exchange-oracle/server/src/common/config/server-config.service.ts +++ b/packages/apps/fortune/exchange-oracle/server/src/common/config/server-config.service.ts @@ -31,10 +31,10 @@ export class ServerConfigService { /** * The URL of the frontend application that the server will communicate with. - * Default: 'http://localhost:3005' + * Default: 'http://localhost:3003' */ get feURL(): string { - return this.configService.get('FE_URL', 'http://localhost:3006'); + return this.configService.get('FE_URL', 'http://localhost:3003'); } /** diff --git a/packages/apps/fortune/recording-oracle/.env.example b/packages/apps/fortune/recording-oracle/.env.example index ac59dac283..c2a7c1bc38 100644 --- a/packages/apps/fortune/recording-oracle/.env.example +++ b/packages/apps/fortune/recording-oracle/.env.example @@ -1,29 +1,50 @@ -#General -NODE_ENV=development -HOST=localhost -PORT=5002 -SESSION_SECRET= +# General +HOST=0.0.0.0 +PORT=5007 +# S3 +S3_ENDPOINT=0.0.0.0 +S3_PORT=9000 +S3_ACCESS_KEY=human-oracle +S3_SECRET_KEY=human-oracle-s3-secret +S3_BUCKET=fortune +S3_USE_SSL=false -#Web3 -WEB3_PRIVATE_KEY= -RPC_URL_POLYGON= -RPC_URL_BSC= -RPC_URL_POLYGON_AMOY= -RPC_URL_SEPOLIA= -RPC_URL_MOONBEAM= -RPC_URL_BSC_TESTNET= -RPC_URL_LOCALHOST= +# Web3 +WEB3_PRIVATE_KEY=replace_me +RPC_URL_POLYGON_AMOY=https://rpc-amoy.polygon.technology -# S3 -S3_ENDPOINT= -S3_PORT= -S3_ACCESS_KEY= -S3_SECRET_KEY= -S3_BUCKET= -S3_USE_SSL= +# Encryption +PGP_ENCRYPT=true +PGP_PRIVATE_KEY="-----BEGIN PGP PRIVATE KEY BLOCK----- + +xYYEaCsnrRYJKwYBBAHaRw8BAQdADWMKa+9YvRJV474d+BDsLv7a+aSkMMkR +FZOWJG1ePjT+CQMIZhNMm+tnPeTgihnx8ru0E3sqYcofEvRM9VrSIyrs/U+H +LsK5rsa+NV8Ui+9cKcmtCW4EJ12LNmTg1xYJsxQnn4eZQzSmlMkK5N61KyJ+ +zM0AwowEEBYKAD4FgmgrJ60ECwkHCAmQuTtXvy2rDmoDFQgKBBYAAgECGQEC +mwMCHgEWIQRhezz+qPdIIiGIyyS5O1e/LasOagAASiUBAL2ngIhlne91+Z7h +RHU0F4ENomy/e1S6w/gn/dVLfE1OAP9ZG9x1gksN1R1O9Fgq1WfGkHNJi/8U +DF7yO8H8sDw2D8eLBGgrJ60SCisGAQQBl1UBBQEBB0A9v5ubU6UB6C9yoUPc +Zqu8ZyQHa55VFR3figyExeVtRwMBCAf+CQMIU0kTC9Fq7ozgh/iv/ybvydCJ +pdU7fNuD2Ipb4ZfRVMrogkQLolOKgRd8468OSoNFuk4RnYkBsyafZmI4KGkG ++oroKa+1mThKi6ePu7GO/cJ4BBgWCgAqBYJoKyetCZC5O1e/LasOagKbDBYh +BGF7PP6o90giIYjLJLk7V78tqw5qAACsjwD+O/d9B6wJDDd2FRp3JmZPt/sJ +vyg2sQLiIXbjACHXCI4BALbO+tfsyeSxYiK0j67etKnFzoG+1ek1vukDdIf7 +tMcN +=qkIF +-----END PGP PRIVATE KEY BLOCK-----" +PGP_PASSPHRASE=tt8Bn946gusiJm4r5wX +# Put it here just to easily set up KV later; not needed to run +PGP_PUBLIC_KEY="-----BEGIN PGP PUBLIC KEY BLOCK----- -#Encryption -PGP_ENCRYPT= -PGP_PRIVATE_KEY= -PGP_PASSPHRASE= \ No newline at end of file +xjMEaCsnrRYJKwYBBAHaRw8BAQdADWMKa+9YvRJV474d+BDsLv7a+aSkMMkR +FZOWJG1ePjTNAMKMBBAWCgA+BYJoKyetBAsJBwgJkLk7V78tqw5qAxUICgQW +AAIBAhkBApsDAh4BFiEEYXs8/qj3SCIhiMskuTtXvy2rDmoAAEolAQC9p4CI +ZZ3vdfme4UR1NBeBDaJsv3tUusP4J/3VS3xNTgD/WRvcdYJLDdUdTvRYKtVn +xpBzSYv/FAxe8jvB/LA8Ng/OOARoKyetEgorBgEEAZdVAQUBAQdAPb+bm1Ol +AegvcqFD3GarvGckB2ueVRUd34oMhMXlbUcDAQgHwngEGBYKACoFgmgrJ60J +kLk7V78tqw5qApsMFiEEYXs8/qj3SCIhiMskuTtXvy2rDmoAAKyPAP47930H +rAkMN3YVGncmZk+3+wm/KDaxAuIhduMAIdcIjgEAts761+zJ5LFiIrSPrt60 +qcXOgb7V6TW+6QN0h/u0xw0= +=Hpds +-----END PGP PUBLIC KEY BLOCK-----" diff --git a/packages/apps/fortune/recording-oracle/Dockerfile b/packages/apps/fortune/recording-oracle/Dockerfile new file mode 100644 index 0000000000..bfe85f163b --- /dev/null +++ b/packages/apps/fortune/recording-oracle/Dockerfile @@ -0,0 +1,35 @@ +FROM node:22.14-slim +ARG APP_PATH=packages/apps/fortune/recording-oracle + +# Create app directory +WORKDIR /usr/src/app + +# Copy expected yarn dist +COPY .yarn ./.yarn +COPY .yarnrc.yml ./ + +# Copy files for deps installation +COPY package.json yarn.lock ./ +COPY ${APP_PATH}/package.json ./${APP_PATH}/ + +# Some deps are referenced as "workspace:*", +# so we need to copy and build them +COPY packages/core ./packages/core +COPY packages/sdk ./packages/sdk + +RUN yarn install + +# Copy base TS config that is required to build pacakges +COPY tsconfig.base.json ./ +# Build libs +RUN yarn build:libs + +# Copy everything else +COPY ${APP_PATH} ./${APP_PATH} + +WORKDIR ./${APP_PATH} +# Creates a "dist" folder with the production build +RUN yarn build + +# Start the server using the build +CMD [ "yarn", "start:prod" ] diff --git a/packages/apps/fortune/recording-oracle/ENV.md b/packages/apps/fortune/recording-oracle/ENV.md deleted file mode 100644 index 705df340a2..0000000000 --- a/packages/apps/fortune/recording-oracle/ENV.md +++ /dev/null @@ -1,62 +0,0 @@ -# Environment Variables - -### The RPC URL for the Polygon network. -RPC_URL_POLYGON= - -### The RPC URL for the Polygon Amoy network. -RPC_URL_POLYGON_AMOY= - -### The RPC URL for the Sepolia network. -RPC_URL_SEPOLIA= - -### The RPC URL for the BSC Mainnet network. -RPC_URL_BSC_MAINNET= - -### The RPC URL for the BSC Testnet network. -RPC_URL_BSC_TESTNET= - -### The RPC URL for the Localhost network. -RPC_URL_LOCALHOST= - -### Indicates whether PGP encryption should be used. Default: false -PGP_ENCRYPT="false" - -### The private key used for PGP encryption or decryption. -PGP_PRIVATE_KEY= - -### The passphrase associated with the PGP private key. -PGP_PASSPHRASE= - -### The endpoint URL for connecting to the S3 service. Default: '127.0.0.1' -S3_ENDPOINT="127.0.0.1" - -### The port number for connecting to the S3 service. Default: 9000 -S3_PORT="9000" - -### The access key ID used to authenticate requests to the S3 service. Required -S3_ACCESS_KEY= - -### The secret access key used to authenticate requests to the S3 service. Required -S3_SECRET_KEY= - -### The name of the S3 bucket where files will be stored. Default: 'recording' -S3_BUCKET="recording" - -### Indicates whether to use SSL (HTTPS) for connections to the S3 service. Default: false -S3_USE_SSL="false" - -### The environment in which the server is running (e.g., 'development', 'production'). Default: 'development' -NODE_ENV="development" - -### The hostname or IP address on which the server will run. Default: 'localhost' -HOST="localhost" - -### The port number on which the server will listen for incoming connections. Default: 5000 -PORT="5000" - -### The secret key used for session encryption and validation. Default: 'session_key' -SESSION_SECRET="session_key" - -### The private key used for signing transactions. Required -WEB3_PRIVATE_KEY= - diff --git a/packages/apps/fortune/recording-oracle/docker-compose.yml b/packages/apps/fortune/recording-oracle/docker-compose.yml deleted file mode 100644 index 329fcd6ca6..0000000000 --- a/packages/apps/fortune/recording-oracle/docker-compose.yml +++ /dev/null @@ -1,34 +0,0 @@ -version: '3.7' - -services: - minio: - container_name: minio - image: minio/minio:RELEASE.2022-05-26T05-48-41Z - ports: - - 9001:9001 - - 9000:9000 - environment: - MINIO_ROOT_USER: dev - MINIO_ROOT_PASSWORD: devdevdev - entrypoint: 'sh' - command: - -c "minio server /data --console-address ':9001'" - healthcheck: - test: ["CMD", "curl", "-f", "http://localhost:9000/minio/health/live"] - interval: 5s - timeout: 5s - retries: 3 - minio-mc: - container_name: minio-mc - image: minio/mc - depends_on: - minio: - condition: service_healthy - entrypoint: > - /bin/sh -c " - /usr/bin/mc config host add myminio http://minio:9000 dev devdevdev; - /usr/bin/mc mb myminio/launcher; - /usr/bin/mc anonymous set public myminio/launcher; - /usr/bin/mc mb myminio/solution; - /usr/bin/mc anonymous set public myminio/solution; - " diff --git a/packages/apps/fortune/recording-oracle/package.json b/packages/apps/fortune/recording-oracle/package.json index a2a45defba..0ffebff104 100644 --- a/packages/apps/fortune/recording-oracle/package.json +++ b/packages/apps/fortune/recording-oracle/package.json @@ -18,10 +18,8 @@ "test": "jest", "test:watch": "jest --watch", "test:cov": "jest --coverage", - "postgres": "docker compose up -d postgres", - "docker": "docker compose up -d", - "local": "docker compose down && (concurrently --hide 0 \"yarn docker\" \"yarn recording-oracle:dev\" )", "setup:local": "ts-node ./test/setup.ts", + "setup:kvstore": "ts-node ./scripts/setup-kv-store.ts", "generate-env-doc": "ts-node scripts/generate-env-doc.ts" }, "dependencies": { @@ -30,11 +28,16 @@ "@nestjs/common": "^10.2.7", "@nestjs/config": "^3.1.1", "@nestjs/core": "^10.3.10", + "@nestjs/platform-express": "^10.3.10", "@nestjs/swagger": "^7.4.2", "axios": "^1.3.1", "body-parser": "^1.20.2", + "class-transformer": "^0.5.1", "class-validator": "0.14.1", + "dotenv": "^16.3.2", "helmet": "^7.1.0", + "joi": "^17.13.3", + "minio": "7.1.3", "reflect-metadata": "^0.2.2", "rxjs": "^7.2.0" }, diff --git a/packages/apps/fortune/recording-oracle/scripts/setup-kv-store.ts b/packages/apps/fortune/recording-oracle/scripts/setup-kv-store.ts new file mode 100644 index 0000000000..c1ad796570 --- /dev/null +++ b/packages/apps/fortune/recording-oracle/scripts/setup-kv-store.ts @@ -0,0 +1,152 @@ +import 'dotenv/config'; +import { KVStoreClient, KVStoreKeys, Role } from '@human-protocol/sdk'; +import { Wallet, ethers } from 'ethers'; +import * as Minio from 'minio'; + +const SUPPORTED_JOB_TYPES = 'fortune'; +const ROLE = Role.RecordingOracle; + +async function setupCommonValues(kvStoreClient: KVStoreClient): Promise { + const { SERVER_URL = 'http://localhost:5007', FEE = '1' } = process.env; + + if (SUPPORTED_JOB_TYPES.split(',').length === 0) { + throw new Error('SUPPORTED_JOB_TYPES should be comma-separated list'); + } + try { + new URL(SERVER_URL || ''); + } catch (noop) { + throw new Error('Invalid SERVER_URL'); + } + let url = SERVER_URL.endsWith('/') ? SERVER_URL.slice(0, -1) : SERVER_URL; + if (!url.startsWith('http')) { + url = `http://${url}`; + } + + const fee = Number(FEE); + if (!Number.isInteger(fee) || fee < 1) { + throw new Error('Fee must be positive integer'); + } + + await kvStoreClient.setBulk( + [ + KVStoreKeys.role, + KVStoreKeys.fee, + KVStoreKeys.url, + KVStoreKeys.webhookUrl, + KVStoreKeys.jobTypes, + ], + [ROLE, fee.toString(), url, `${url}/webhook`, SUPPORTED_JOB_TYPES], + ); +} + +type SetupPublicKeyFileMeta = { + keyName: string; + publicKey: string; + s3Bucket: string; + s3Endpoint: string; + s3Port: string; + kvKey: string; +}; + +async function setupPublicKeyFile( + kvStoreClient: KVStoreClient, + minioClient: Minio.Client, + meta: SetupPublicKeyFileMeta, +): Promise { + const { keyName, kvKey, publicKey, s3Bucket, s3Endpoint, s3Port } = meta; + const exists = await minioClient.bucketExists(s3Bucket); + if (!exists) { + throw new Error('Bucket does not exists'); + } + + await minioClient.putObject(s3Bucket, keyName, publicKey, { + 'Content-Type': 'text/plain', + 'Cache-Control': 'no-store', + }); + /** + * Protocol is required for 'setFileUrlAndHash' + */ + const _s3Endpoint = s3Endpoint.startsWith('http') + ? s3Endpoint + : `http://${s3Endpoint}`; + const fileUrl = `${_s3Endpoint}:${s3Port}/${s3Bucket}/${keyName}`; + await kvStoreClient.setFileUrlAndHash(fileUrl, kvKey); +} + +async function setup(): Promise { + const { WEB3_PRIVATE_KEY, RPC_URL_POLYGON_AMOY: RPC_URL } = process.env; + if (!WEB3_PRIVATE_KEY) { + throw new Error('Private key is empty'); + } + if (!RPC_URL) { + throw new Error('RPC url is empty'); + } + + const provider = new ethers.JsonRpcProvider(RPC_URL); + const wallet = new Wallet(WEB3_PRIVATE_KEY, provider); + + const kvStoreClient = await KVStoreClient.build(wallet); + + await setupCommonValues(kvStoreClient); + + const { + S3_ENDPOINT, + S3_PORT, + S3_USE_SSL, + S3_ACCESS_KEY, + S3_SECRET_KEY, + S3_BUCKET, + } = process.env; + + if ( + [S3_ENDPOINT, S3_PORT, S3_ACCESS_KEY, S3_SECRET_KEY, S3_BUCKET].some( + (value) => !value, + ) + ) { + throw new Error('Missing S3 config value'); + } + + const s3Endpoint = S3_ENDPOINT as string; + const s3Port = S3_PORT as string; + const s3AccessKey = S3_ACCESS_KEY as string; + const s3SecretKey = S3_SECRET_KEY as string; + const s3Bucket = S3_BUCKET as string; + + const minioClient = new Minio.Client({ + endPoint: s3Endpoint, + port: parseInt(s3Port, 10), + useSSL: S3_USE_SSL === 'true', + accessKey: s3AccessKey, + secretKey: s3SecretKey, + }); + + const { + PGP_ENCRYPT, + PGP_PUBLIC_KEY, + PGP_PUBLIC_KEY_FILE = 'pgp-public-key-reco', + } = process.env; + if (PGP_ENCRYPT && PGP_ENCRYPT === 'true') { + if (!PGP_PUBLIC_KEY) { + throw new Error('PGP public key is empty'); + } + + await setupPublicKeyFile(kvStoreClient, minioClient, { + s3Endpoint, + s3Port, + s3Bucket, + publicKey: PGP_PUBLIC_KEY, + keyName: PGP_PUBLIC_KEY_FILE, + kvKey: KVStoreKeys.publicKey, + }); + } +} + +(async () => { + try { + await setup(); + process.exit(0); + } catch (error) { + console.error('Failed to setup KV', error); + process.exit(1); + } +})(); diff --git a/packages/apps/fortune/recording-oracle/src/app.module.ts b/packages/apps/fortune/recording-oracle/src/app.module.ts index 9a352672b2..8646dcfc09 100644 --- a/packages/apps/fortune/recording-oracle/src/app.module.ts +++ b/packages/apps/fortune/recording-oracle/src/app.module.ts @@ -33,9 +33,10 @@ import { ExceptionFilter } from './common/exceptions/exception.filter'; ], imports: [ ConfigModule.forRoot({ - envFilePath: process.env.NODE_ENV - ? `.env.${process.env.NODE_ENV as string}` - : '.env', + /** + * First value found takes precendece + */ + envFilePath: [`.env.${process.env.NODE_ENV}`, '.env'], validationSchema: envValidator, }), JobModule, diff --git a/packages/apps/fortune/recording-oracle/src/common/config/env-schema.ts b/packages/apps/fortune/recording-oracle/src/common/config/env-schema.ts index 5d73ebeeea..a2605048c3 100644 --- a/packages/apps/fortune/recording-oracle/src/common/config/env-schema.ts +++ b/packages/apps/fortune/recording-oracle/src/common/config/env-schema.ts @@ -5,7 +5,6 @@ export const envValidator = Joi.object({ NODE_ENV: Joi.string(), HOST: Joi.string(), PORT: Joi.string(), - SESSION_SECRET: Joi.string(), // Web3 WEB3_PRIVATE_KEY: Joi.string().required(), RPC_URL_POLYGON: Joi.string(), diff --git a/packages/apps/fortune/recording-oracle/src/common/config/server-config.service.ts b/packages/apps/fortune/recording-oracle/src/common/config/server-config.service.ts index 9de873ef72..037d70e5ac 100644 --- a/packages/apps/fortune/recording-oracle/src/common/config/server-config.service.ts +++ b/packages/apps/fortune/recording-oracle/src/common/config/server-config.service.ts @@ -28,12 +28,4 @@ export class ServerConfigService { get port(): number { return +this.configService.get('PORT', 5002); } - - /** - * The secret key used for session encryption and validation. - * Default: 'session_key' - */ - get sessionSecret(): string { - return this.configService.get('SESSION_SECRET', 'session_key'); - } } diff --git a/packages/apps/human-app/frontend/.env.example b/packages/apps/human-app/frontend/.env.example index a18d929d1d..66bd2c755b 100644 --- a/packages/apps/human-app/frontend/.env.example +++ b/packages/apps/human-app/frontend/.env.example @@ -1,64 +1,38 @@ -# api url -VITE_API_URL= #string -# link to privacy policy page -VITE_PRIVACY_POLICY_URL= #string -# link to terms of service -VITE_TERMS_OF_SERVICE_URL= #string -# link to help page -VITE_HUMAN_PROTOCOL_HELP_URL= #string -# email for "Contact Support" links -VITE_HUMAN_SUPPORT_EMAIL= #string -# link to human web page -VITE_HUMAN_PROTOCOL_URL= #string -# link to human web page in main page navbar -VITE_NAVBAR__LINK__PROTOCOL_URL= #string -# link to human web page section in main page navbar -VITE_NAVBAR__LINK__HOW_IT_WORK_URL= #string -# capthca site key for captcha other than labeling -VITE_H_CAPTCHA_SITE_KEY= #string -# HMT daily spent limit -VITE_HMT_DAILY_SPENT_LIMIT= #number -# daily solved captcha limit -VITE_DAILY_SOLVED_CAPTCHA_LIMIT= #number -# capthca url for captcha other than labeling -VITE_H_CAPTCHA_EXCHANGE_URL= #string -# capthca url for labeling -VITE_H_CAPTCHA_LABELING_BASE_URL= #string -# ID of project created with https://cloud.walletconnect.com/sign-in -VITE_WALLET_CONNECT_PROJECT_ID= #string -# Dapp name for wallet connect -VITE_DAPP_META_NAME= #string -# Dapp description for wallet connect -VITE_DAPP_META_DESCRIPTION= #string -# Dapp url for wallet connect -VITE_DAPP_META_URL= #string -# Dapp icons for wallet connect -VITE_DAPP_ICONS= #string => lists of icons eg.: icon1,icon2... +# General +VITE_API_URL=http://localhost:5002 +VITE_NETWORK=testnet -# This data will be use to add first oracle in the oracles table -# string -VITE_H_CAPTCHA_ORACLE_ANNOTATION_TOOL= -# string -VITE_H_CAPTCHA_ORACLE_ROLE= -# string -VITE_H_CAPTCHA_ORACLE_ADDRESS= -# job types list string -VITE_H_CAPTCHA_ORACLE_TASK_TYPES= #string => lists of job types eg.: Image labeling, BBoxes... +# Reown project id +VITE_WALLET_CONNECT_PROJECT_ID=replace_me +VITE_DAPP_ICONS=icon1,icon2 +VITE_DAPP_META_DESCRIPTION=Complete jobs, earn HMT +VITE_DAPP_META_NAME=Human App Local +VITE_DAPP_META_URL=http://localhost:3001 -# if network is equal to 'testnet' app will use first testnet chain from .src/smart-contracts/chains.ts -# and first mainnet chain for 'mainnet' -VITE_NETWORK= # mainnet|testnet -VITE_GOVERNOR_ADDRESS= -VITE_GOVERNANCE_URL= +# hCapthca +VITE_H_CAPTCHA_EXCHANGE_URL=https://foundation-yellow-exchange.hmt.ai +VITE_H_CAPTCHA_LABELING_BASE_URL=https://foundation-yellow-accounts.hmt.ai +VITE_H_CAPTCHA_SITE_KEY=10000000-ffff-ffff-ffff-000000000001 +VITE_DAILY_SOLVED_CAPTCHA_LIMIT=0 +VITE_HMT_DAILY_SPENT_LIMIT=0 + +# hCaptcha annotation tool +VITE_H_CAPTCHA_ORACLE_ADDRESS=replace_me +VITE_H_CAPTCHA_ORACLE_ANNOTATION_TOOL=hcaptcha +VITE_H_CAPTCHA_ORACLE_ROLE=hcaptcha +VITE_H_CAPTCHA_ORACLE_TASK_TYPES=image_points,image_boxes -## Web3 setup -# set SC addresses according to https://human-protocol.gitbook.io/hub/human-tech-docs/architecture/components/smart-contracts/contract-addresses +# Other +VITE_HUMAN_PROTOCOL_HELP_URL=https://docs.humanprotocol.org/ +VITE_HUMAN_PROTOCOL_URL=https://humanprotocol.org/ +VITE_HUMAN_SUPPORT_EMAIL=support@local.app +VITE_NAVBAR__LINK__HOW_IT_WORK_URL=https://humanprotocol.org/ +VITE_NAVBAR__LINK__PROTOCOL_URL=https://humanprotocol.org/ +VITE_PRIVACY_POLICY_URL=http://local.app/privacy-policy/ +VITE_TERMS_OF_SERVICE_URL=http://local.app/terms-and-conditions/ -## other networks -# if you wish to add new network follow this instruction: -# - add your env-s set to .env file -# - add new env-s to validation schema in: ./src/shared/env.ts -# - include new valid env-s in: ./src/smart-contracts/contracts.ts -# - add chain data in: .src/smart-contracts/chains.ts +VITE_GOVERNOR_ADDRESS= +VITE_GOVERNANCE_URL= -# all new chains will be available in wallet-connect modal \ No newline at end of file +# Feature flags +VITE_FEATURE_FLAG_JOBS_DISCOVERY=true diff --git a/packages/apps/human-app/frontend/package.json b/packages/apps/human-app/frontend/package.json index 108b24b0e6..42c9c07bd5 100644 --- a/packages/apps/human-app/frontend/package.json +++ b/packages/apps/human-app/frontend/package.json @@ -4,7 +4,7 @@ "version": "1.0.0", "scripts": { "clean": "tsc --build --clean && rm -rf dist", - "dev": "vite", + "start": "vite", "build": "tsc --build && vite build", "start:prod": "serve -s dist", "lint": "eslint . --ext ts,tsx --report-unused-disable-directives --max-warnings 0", diff --git a/packages/apps/human-app/server/.env.example b/packages/apps/human-app/server/.env.example index 3e2e15827b..86af25dbfe 100644 --- a/packages/apps/human-app/server/.env.example +++ b/packages/apps/human-app/server/.env.example @@ -1,34 +1,36 @@ -HOST= # string, example: localhost -PORT= # number, example: 5010 -REPUTATION_ORACLE_URL= # string -REPUTATION_ORACLE_ADDRESS= # string -REDIS_HOST= # string, example: localhost -REDIS_PORT= # number, example: 6379 -RPC_URL= # string -CHAIN_IDS_ENABLED= # number array, example: 80002,80001 -HCAPTCHA_LABELING_STATS_API_URL= # string -HCAPTCHA_LABELING_VERIFY_API_URL= # string -HCAPTCHA_LABELING_API_KEY= # string -IS_AXIOS_REQUEST_LOGGING_ENABLED= #string, true if enabled, disabled otherwise -ALLOWED_HOST= #string, example 'localhost:3000' -HUMAN_APP_SECRET_KEY= # string -# CACHE TTL VALUES - in seconds -CACHE_TTL_ORACLE_DISCOVERY= # number, example: 43200 -CACHE_TTL_ORACLE_STATS= # number, example: 900 -CACHE_TTL_USER_STATS= # number, example: 86400 -CACHE_TTL_EXCHANGE_ORACLE_URL= # number: example 86400 -CACHE_TTL_HCAPTCHA_USER_STATS= # number: example 86400 -CACHE_TTL_DAILY_HMT_SPENT= # number: example 86400 -CACHE_TTL_JOB_TYPES= # number: example 86400 -# E2E TESTING -E2E_TESTING_EMAIL_ADDRESS= # string -E2E_TESTING_PASSWORD= # string -E2E_TESTING_EXCHANGE_ORACLE_URL= # string -E2E_TESTING_ESCROW_ADDRESS= # string -E2E_TESTING_ESCROW_CHAIN_ID= # number +# General +HOST=0.0.0.0 +PORT=5002 +ALLOWED_HOST=localhost:5002 + # CORS -CORS_ALLOWED_ORIGIN= # string example: http://localhost:5173 -CORS_ALLOWED_HEADERS= # string, example: 'Content-Type,Authorization,X-Requested-With,Accept,Origin' -CORS_ENABLED= # boolean, example: true -IS_CACHE_TO_RESTART= # boolean, example: false -FEATURE_FLAG_JOBS_DISCOVERY= # boolean, example: false +CORS_ALLOWED_ORIGIN=* +CORS_ALLOWED_HEADERS='Content-Type,Authorization,X-Requested-With,Accept,Origin' +CORS_ENABLED=true + +# Reputation Oracle +REPUTATION_ORACLE_URL=http://0.0.0.0:5001 +# Web3 address +REPUTATION_ORACLE_ADDRESS=replace_me +# Auth key +HUMAN_APP_SECRET_KEY=sk_example_1VwUpBMO8H0v4Pmu4TPiWFEwuMguW4PkozSban4Rfbc + +# Redis +REDIS_HOST=0.0.0.0 +REDIS_PORT=6380 +REIDS_DB=1 +# Flush DB on startup +IS_CACHE_TO_RESTART=false + +# Web3 +RPC_URL=https://rpc-amoy.polygon.technology +# Comma-separated array +CHAIN_IDS_ENABLED=80002 + +# hCaptcha +HCAPTCHA_LABELING_STATS_API_URL=disabled +HCAPTCHA_LABELING_VERIFY_API_URL=disabled +HCAPTCHA_LABELING_API_KEY=disabled + +# Feature flags +FEATURE_FLAG_JOBS_DISCOVERY=true diff --git a/packages/apps/human-app/server/ENV.md b/packages/apps/human-app/server/ENV.md deleted file mode 100644 index ae4a763e38..0000000000 --- a/packages/apps/human-app/server/ENV.md +++ /dev/null @@ -1,107 +0,0 @@ -# Environment Variables - -### The hostname or IP address on which the server will run. Default: 'localhost' -HOST="localhost" - -### The port number on which the server will listen for incoming connections. Default: 5000 -PORT="5000" - -### The URL of the reputation oracle service. Required -GIT_HASH= - -### The address of the reputation oracle service. Required -REPUTATION_ORACLE_URL= - -### Flag indicating if Axios request logging is enabled. Default: false -REPUTATION_ORACLE_ADDRESS="false" - -### The allowed host for the application. Required -IS_AXIOS_REQUEST_LOGGING_ENABLED= - -### The port number for the Redis cache server. Required -ALLOWED_HOST= - -### The hostname or IP address of the Redis cache server. Required -REDIS_PORT= - -### The DB number of the Redis cache server -REDIS_HOST= - -### The cache time-to-live (TTL) for oracle statistics. Default: 12 hours -REDIS_DB="12 hours" - -### The cache time-to-live (TTL) for user statistics. Default: 15 minutes -CACHE_TTL_ORACLE_STATS="15 minutes" - -### The cache time-to-live (TTL) for daily HMT spent data. Default: 24 hours -CACHE_TTL_USER_STATS="24 hours" - -### The cache time-to-live (TTL) for hCaptcha user statistics. Default: 12 hours -CACHE_TTL_DAILY_HMT_SPENT="12 hours" - -### The cache time-to-live (TTL) for oracle discovery. Default: 24 hours -CACHE_TTL_HCAPTCHA_USER_STATS="24 hours" - -### Number of days without updates assignments data is retained. Default: 45 days -CACHE_TTL_ORACLE_DISCOVERY="45 days" - -### The RPC URL used for communication. Required -JOB_ASSIGNMENTS_DATA_RETENTION_DAYS= - -### Flag indicating if CORS is enabled. Default: false -RPC_URL="false" - -### The allowed origin for CORS requests. Default: 'http://localhost:5173' -CORS_ENABLED="http://localhost:5173" - -### The allowed headers for CORS requests. Default: 'Content-Type,Authorization,X-Requested-With,Accept,Origin' -CORS_ALLOWED_ORIGIN="Content-Type,Authorization,X-Requested-With,Accept,Origin" - -### The cache time-to-live (TTL) for exchange oracle URLs. Default: 24 hours -CORS_ALLOWED_HEADERS="24 hours" - -### The cache time-to-live (TTL) for job types. Default: 24 hours -CACHE_TTL_EXCHANGE_ORACLE_URL="24 hours" - -### The cache time-to-live (TTL) for exchange oracle registration needed. Default: 24 hours -CACHE_TTL_JOB_TYPES="24 hours" - -### The API URL for hCaptcha labeling statistics. Required -CACHE_TTL_EXCHANGE_ORACLE_REGISTRATION_NEEDED= - -### The API URL for hCaptcha labeling verification. Required -HCAPTCHA_LABELING_STATS_API_URL= - -### The API key for hCaptcha labeling. Required -HCAPTCHA_LABELING_VERIFY_API_URL= - -### The list of enabled chain IDs. Required -HCAPTCHA_LABELING_API_KEY= - -### Flag indicating if the cache should be restarted. Default: false -CHAIN_IDS_ENABLED="false" - -### The email address for the human app. Required -IS_CACHE_TO_RESTART= - -### The secret key for Reputation Oracle. Required -HUMAN_APP_SECRET_KEY= - -### Feature flag for job discovery -MAX_EXECUTIONS_TO_SKIP= - -### The email address used for end-to-end (E2E) testing. Default: empty string -E2E_TESTING_EMAIL_ADDRESS="empty string" - -### The password used for end-to-end (E2E) testing. Default: empty string -E2E_TESTING_PASSWORD="empty string" - -### The URL of the exchange oracle service used for end-to-end (E2E) testing. Default: empty string -E2E_TESTING_EXCHANGE_ORACLE_URL="empty string" - -### The escrow address used for end-to-end (E2E) testing. Default: empty string -E2E_TESTING_ESCROW_ADDRESS="empty string" - -### The chain ID for the escrow service used for end-to-end (E2E) testing. Default: empty string -E2E_TESTING_ESCROW_CHAIN_ID="empty string" - diff --git a/packages/apps/human-app/server/docker-compose.yml b/packages/apps/human-app/server/docker-compose.yml deleted file mode 100644 index 70b3f4db38..0000000000 --- a/packages/apps/human-app/server/docker-compose.yml +++ /dev/null @@ -1,32 +0,0 @@ -name: 'human-app-server' - -services: - human-app: - container_name: human-app - restart: unless-stopped - build: - context: ../../../../ - dockerfile: packages/apps/human-app/server/Dockerfile - expose: - - '${PORT}' - ports: - - '${LOCAL_PORT}:${PORT}' - environment: - NODE_ENV: ${NODE_ENV} - HOST: ${HOST} - PORT: ${PORT} - REPUTATION_ORACLE_URL: ${REPUTATION_ORACLE_URL} - REPUTATION_ORACLE_ADDRESS: ${REPUTATION_ORACLE_ADDRESS} - REDIS_PORT: ${REDIS_PORT} - REDIS_HOST: redis - CACHE_TTL_ORACLE_DISCOVERY: ${CACHE_TTL_ORACLE_DISCOVERY} - RPC_URL: ${RPC_URL} - depends_on: - - redis - redis: - image: redis:latest - container_name: human_app_cache - ports: - - '${REDIS_PORT}:6379' - volumes: - - ./redis_data:/data \ No newline at end of file diff --git a/packages/apps/human-app/server/src/app.module.ts b/packages/apps/human-app/server/src/app.module.ts index f6f3414bc2..245654afe5 100644 --- a/packages/apps/human-app/server/src/app.module.ts +++ b/packages/apps/human-app/server/src/app.module.ts @@ -52,7 +52,7 @@ const JOI_BOOLEAN_STRING_SCHEMA = Joi.string().valid('true', 'false'); @Module({ imports: [ ConfigModule.forRoot({ - envFilePath: '.env', + envFilePath: [`.env.${process.env.NODE_ENV}`, '.env'], isGlobal: true, validationSchema: Joi.object({ HOST: Joi.string().required(), @@ -81,7 +81,6 @@ const JOI_BOOLEAN_STRING_SCHEMA = Joi.string().valid('true', 'false'); .required(), HUMAN_APP_SECRET_KEY: Joi.string().required(), IS_AXIOS_REQUEST_LOGGING_ENABLED: JOI_BOOLEAN_STRING_SCHEMA, - ALLOWED_HOST: Joi.string().required(), CORS_ENABLED: JOI_BOOLEAN_STRING_SCHEMA, CORS_ALLOWED_ORIGIN: Joi.string(), CORS_ALLOWED_HEADERS: Joi.string(), diff --git a/packages/apps/job-launcher/client/.env.example b/packages/apps/job-launcher/client/.env.example index 7e3f7a2bb5..6c6209f0dc 100644 --- a/packages/apps/job-launcher/client/.env.example +++ b/packages/apps/job-launcher/client/.env.example @@ -1,20 +1,13 @@ -VITE_APP_JOB_LAUNCHER_SERVER_URL= -VITE_APP_WALLETCONNECT_PROJECT_ID= -VITE_APP_STRIPE_PUBLISHABLE_KEY= -VITE_APP_HCAPTCHA_SITE_KEY= -VITE_APP_ENVIRONMENT= -VITE_APP_SUPPORTED_CHAINS= +# General +VITE_APP_JOB_LAUNCHER_SERVER_URL=http://0.0.0.0:5003 +VITE_APP_WALLETCONNECT_PROJECT_ID=replace_me -# RPC URLS -VITE_APP_RPC_URL_MAINNET="" -VITE_APP_RPC_URL_SEPOLIA="" -VITE_APP_RPC_URL_BSC_MAINNET="" -VITE_APP_RPC_URL_BSC_TESTNET="" -VITE_APP_RPC_URL_POLYGON="" -VITE_APP_RPC_URL_POLYGON_AMOY="" -VITE_APP_RPC_URL_MOONBEAM="" -VITE_APP_RPC_URL_MOONBASE_ALPHA="" -VITE_APP_RPC_URL_AVALANCHE="" -VITE_APP_RPC_URL_AVALANCHE_TESTNET="" -VITE_APP_RPC_URL_CELO="" -VITE_APP_RPC_URL_CELO_ALFAJORES="" +# Stripe +VITE_APP_STRIPE_PUBLISHABLE_KEY=disabled + +# hCaptcha +VITE_APP_HCAPTCHA_SITE_KEY=10000000-ffff-ffff-ffff-000000000001 + +# Web3 +VITE_APP_ENVIRONMENT=testnet +VITE_APP_SUPPORTED_CHAINS=80002 diff --git a/packages/apps/job-launcher/client/package.json b/packages/apps/job-launcher/client/package.json index 8b1b7aac3a..36bbddc8c3 100644 --- a/packages/apps/job-launcher/client/package.json +++ b/packages/apps/job-launcher/client/package.json @@ -44,7 +44,7 @@ "scripts": { "clean": "rm -rf dist", "lint": "eslint \"**/*.{ts,tsx}\"", - "start": "vite --port 3005", + "start": "vite", "build": "vite build", "preview": "vite preview", "start:prod": "serve -s dist", diff --git a/packages/apps/job-launcher/client/src/vite-env.d.ts b/packages/apps/job-launcher/client/src/vite-env.d.ts index 36339cae4f..a4d7339cd6 100644 --- a/packages/apps/job-launcher/client/src/vite-env.d.ts +++ b/packages/apps/job-launcher/client/src/vite-env.d.ts @@ -6,21 +6,6 @@ interface ImportMetaEnv { readonly VITE_APP_STRIPE_PUBLISHABLE_KEY: string; readonly VITE_APP_HCAPTCHA_SITE_KEY: string; readonly VITE_APP_ENVIRONMENT: string; - - readonly VITE_APP_RPC_URL_MAINNET: string; - readonly VITE_APP_RPC_URL_SEPOLIA: string; - readonly VITE_APP_RPC_URL_BSC_MAINNET: string; - readonly VITE_APP_RPC_URL_BSC_TESTNET: string; - readonly VITE_APP_RPC_URL_POLYGON: string; - readonly VITE_APP_RPC_URL_POLYGON_AMOY: string; - readonly VITE_APP_RPC_URL_MOONBEAM: string; - readonly VITE_APP_RPC_URL_MOONBASE_ALPHA: string; - readonly VITE_APP_RPC_URL_AVALANCHE: string; - readonly VITE_APP_RPC_URL_AVALANCHE_TESTNET: string; - readonly VITE_APP_RPC_URL_CELO: string; - readonly VITE_APP_RPC_URL_CELO_ALFAJORES: string; - readonly VITE_APP_RPC_URL_XLAYER: string; - readonly VITE_APP_RPC_URL_XLAYER_TESTNET: string; } interface ImportMeta { diff --git a/packages/apps/job-launcher/client/vite.config.ts b/packages/apps/job-launcher/client/vite.config.ts index a84bcaaa6b..07ac3961c7 100644 --- a/packages/apps/job-launcher/client/vite.config.ts +++ b/packages/apps/job-launcher/client/vite.config.ts @@ -38,6 +38,6 @@ export default defineConfig({ }, }, server: { - port: 3005, + port: 3002, }, }); diff --git a/packages/apps/job-launcher/server/.env.example b/packages/apps/job-launcher/server/.env.example index 84b6fa86f8..00453220c9 100644 --- a/packages/apps/job-launcher/server/.env.example +++ b/packages/apps/job-launcher/server/.env.example @@ -1,80 +1,101 @@ # General -NODE_ENV=development -HOST=localhost -PORT=3000 -FE_URL=http://localhost:3001 +HOST=0.0.0.0 +PORT=5003 +FE_URL=http://localhost:3002 # Database POSTGRES_HOST=0.0.0.0 -POSTGRES_USER=operator +POSTGRES_PORT=5433 +POSTGRES_USER=default POSTGRES_PASSWORD=qwerty POSTGRES_DATABASE=job-launcher -POSTGRES_PORT=5432 POSTGRES_SSL=false -POSTGRES_LOGGING='all' + +# S3 +S3_ENDPOINT=0.0.0.0 +S3_PORT=9000 +S3_ACCESS_KEY=human-oracle +S3_SECRET_KEY=human-oracle-s3-secret +S3_BUCKET=manifests +S3_USE_SSL=false # Web3 WEB3_ENV=testnet -WEB3_PRIVATE_KEY= -GAS_PRICE_MULTIPLIER=1 -PGP_PRIVATE_KEY= -PGP_ENCRYPT= -PGP_PASSPHRASE= -REPUTATION_ORACLE_ADDRESS= -CVAT_EXCHANGE_ORACLE_ADDRESS= -CVAT_RECORDING_ORACLE_ADDRESS= -AUDINO_EXCHANGE_ORACLE_ADDRESS= -AUDINO_RECORDING_ORACLE_ADDRESS= -HCAPTCHA_ORACLE_ADDRESS= -HCAPTCHA_RECORDING_ORACLE_URI= -HCAPTCHA_REPUTATION_ORACLE_URI= -HCAPTCHA_SITE_KEY= -RPC_URL_SEPOLIA= -RPC_URL_POLYGON= -RPC_URL_POLYGON_AMOY= -RPC_URL_BSC_MAINNET= -RPC_URL_BSC_TESTNET= -RPC_URL_MOONBEAM= -RPC_URL_XLAYER_TESTNET= -RPC_URL_XLAYER= -RPC_URL_LOCALHOST= +WEB3_PRIVATE_KEY=replace_me +RPC_URL_POLYGON_AMOY=https://rpc-amoy.polygon.technology +REPUTATION_ORACLES=replace_me +REPUTATION_ORACLE_ADDRESS=replace_me +CVAT_EXCHANGE_ORACLE_ADDRESS=replace_me_if_needed +CVAT_RECORDING_ORACLE_ADDRESS=replace_me_if_needed +HCAPTCHA_ORACLE_ADDRESS=replace_me_if_needed +HCAPTCHA_RECORDING_ORACLE_URI=replace_me_if_needed +HCAPTCHA_REPUTATION_ORACLE_URI=replace_me_if_needed -# Auth -JWT_PRIVATE_KEY= -JWT_PUBLIC_KEY= -JWT_ACCESS_TOKEN_EXPIRES_IN=86400 -REFRESH_TOKEN_EXPIRES_IN=86400 -VERIFY_EMAIL_TOKEN_EXPIRES_IN=86400 -FORGOT_PASSWORD_TOKEN_EXPIRES_IN=86400 +# Encryption +PGP_ENCRYPT=true +PGP_PRIVATE_KEY="-----BEGIN PGP PRIVATE KEY BLOCK----- -# APIKEY -APIKEY_ITERATIONS= -APIKEY_KEY_LENGTH= +lIYEZ4+zchYJKwYBBAHaRw8BAQdA1ql3NCl4pZANEvM3jaxoHLeh5t0PM237WLkG +hCoxjK7+BwMCBJL1H5pd3HT/JxeY7rqJs8sfBOfMbbAxRds/uLdMgGcVzjpj7htU +yzg7PHhWESAgycZmk9QpjgEQYlHl7KbZNNidG1zdCKX9GDce6W5PB7QlSm9iIExh +dW5jaGVyIDxqb2ItbGF1bmNoZXJAbG9jYWwuYXBwPoiTBBMWCgA7FiEEUlUidK34 +MNfYCc0xkWfqgp0A/m4FAmePs3ICGwMFCwkIBwICIgIGFQoJCAsCBBYCAwECHgcC +F4AACgkQkWfqgp0A/m7q3wD/V7G/uxy7LZOX9aW2uPcYfRInVDcyElwJza0Pcken +9qEBAJF0XBJJHkOVOyfmPv5nqAJ3DI6kRiHml+Ri3VjQp24OnIsEZ4+zchIKKwYB +BAGXVQEFAQEHQAGE7HHBGkVnFFPHpXdC/2uY+DC1vMkqTy8fzY0k2jQhAwEIB/4H +AwKFPSSA1sF9iP+Aepg/tiJFDyGqJsSKFlvj07zHjSKxeIOGcuC1llJCju70AcR5 +cQ3itvWUrDIpwI3GnHTy5k183GIIt2cRhLRnLUqIWXLliHgEGBYKACAWIQRSVSJ0 +rfgw19gJzTGRZ+qCnQD+bgUCZ4+zcgIbDAAKCRCRZ+qCnQD+bsXqAP0duGYm6z58 +mBdnv9k5Ed2wEw5hFnjcKXEQBFcMORVgdgD/RssEZjY0Vli5ofBezTOvURLAZRY2 +FryLSAroIMtuIAk= +=of7b +-----END PGP PRIVATE KEY BLOCK-----" +PGP_PASSPHRASE=ixS5G0GE8Eh!fn +# Put it here just to easily set up KV later; not needed to run +PGP_PUBLIC_KEY="-----BEGIN PGP PUBLIC KEY BLOCK----- -# S3 -S3_ENDPOINT=localhost -S3_PORT=9000 -S3_ACCESS_KEY=access-key -S3_SECRET_KEY=secret-key -S3_BUCKET=manifests -S3_USE_SSL=false +mDMEZ4+zchYJKwYBBAHaRw8BAQdA1ql3NCl4pZANEvM3jaxoHLeh5t0PM237WLkG +hCoxjK60JUpvYiBMYXVuY2hlciA8am9iLWxhdW5jaGVyQGxvY2FsLmFwcD6IkwQT +FgoAOxYhBFJVInSt+DDX2AnNMZFn6oKdAP5uBQJnj7NyAhsDBQsJCAcCAiICBhUK +CQgLAgQWAgMBAh4HAheAAAoJEJFn6oKdAP5u6t8A/1exv7scuy2Tl/Wltrj3GH0S +J1Q3MhJcCc2tD3JHp/ahAQCRdFwSSR5DlTsn5j7+Z6gCdwyOpEYh5pfkYt1Y0Kdu +Drg4BGePs3ISCisGAQQBl1UBBQEBB0ABhOxxwRpFZxRTx6V3Qv9rmPgwtbzJKk8v +H82NJNo0IQMBCAeIeAQYFgoAIBYhBFJVInSt+DDX2AnNMZFn6oKdAP5uBQJnj7Ny +AhsMAAoJEJFn6oKdAP5uxeoA/R24ZibrPnyYF2e/2TkR3bATDmEWeNwpcRAEVww5 +FWB2AP9GywRmNjRWWLmh8F7NM69REsBlFjYWvItICuggy24gCQ== +=d9DF +-----END PGP PUBLIC KEY BLOCK-----" + +# Auth +JWT_PRIVATE_KEY="-----BEGIN PRIVATE KEY----- +MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQgjwW8ZeWIKizY9pSl +phyKfwYFp3aRHeMuV+jOKp49hX6hRANCAATeitytad5Rh0tx6AP/VHptsRvsZ+Xp +/24PICdk4nsMxZEAe76InmWdqhud13JV76Jl02DVenFEJVM5IjRk+mLG +-----END PRIVATE KEY-----" +JWT_PUBLIC_KEY="-----BEGIN PUBLIC KEY----- +MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE3orcrWneUYdLcegD/1R6bbEb7Gfl +6f9uDyAnZOJ7DMWRAHu+iJ5lnaobnddyVe+iZdNg1XpxRCVTOSI0ZPpixg== +-----END PUBLIC KEY-----" + +# hCaptcha +HCAPTCHA_SITE_KEY=10000000-ffff-ffff-ffff-000000000001 +HCAPTCHA_SECRET=0x0000000000000000000000000000000000000000 # Stripe -STRIPE_SECRET_KEY= -STRIPE_API_VERSION= -STRIPE_APP_NAME= -STRIPE_APP_VERSION= -STRIPE_APP_INFO_URL= +STRIPE_SECRET_KEY=disabled +STRIPE_APP_NAME=Launcher Server Local +STRIPE_APP_VERSION=1.0.0 +STRIPE_APP_INFO_URL=http://local.app # Sendgrid -SENDGRID_API_KEY= +SENDGRID_API_KEY=sendgrid-disabled # Vision -GOOGLE_PROJECT_ID= -GOOGLE_PRIVATE_KEY= -GOOGLE_CLIENT_EMAIL= -GCV_MODERATION_RESULTS_FILES_PATH= -GCV_MODERATION_RESULTS_BUCKET= +GOOGLE_PROJECT_ID=disabled +GOOGLE_PRIVATE_KEY=disabled +GOOGLE_CLIENT_EMAIL=disabled +GCV_MODERATION_RESULTS_FILES_PATH=disabled +GCV_MODERATION_RESULTS_BUCKET=disabled # Slack -SLACK_ABUSE_NOTIFICATION_WEBHOOK_URL= \ No newline at end of file +SLACK_ABUSE_NOTIFICATION_WEBHOOK_URL=disabled diff --git a/packages/apps/job-launcher/server/ENV.md b/packages/apps/job-launcher/server/ENV.md deleted file mode 100644 index 398fc7302b..0000000000 --- a/packages/apps/job-launcher/server/ENV.md +++ /dev/null @@ -1,203 +0,0 @@ -# Environment Variables - -### The private key used for signing JSON Web Tokens (JWT). Required -JWT_PRIVATE_KEY= - -### The public key used for verifying JSON Web Tokens (JWT). Required -JWT_PUBLIC_KEY= - -### The expiration time (in seconds) for access tokens. Default: 600 -JWT_ACCESS_TOKEN_EXPIRES_IN="600" - -### The expiration time (in seconds) for refresh tokens. Default: 3600 -REFRESH_TOKEN_EXPIRES_IN="3600" - -### The expiration time (in seconds) for email verification tokens. Default: 86400 -VERIFY_EMAIL_TOKEN_EXPIRES_IN="86400" - -### The expiration time (in seconds) for forgot password tokens. Default: 86400 -FORGOT_PASSWORD_TOKEN_EXPIRES_IN="86400" - -### The number of iterations used for generating API keys. Default: 1000 -APIKEY_ITERATIONS="1000" - -### The length of the API key in characters. Default: 64 -APIKEY_KEY_LENGTH="64" - -### The site key for hCaptcha, used for CAPTCHA protection. Required -HCAPTCHA_SITE_KEY= - -### The secret key for hCaptcha, used for verifying CAPTCHA responses. Required -HCAPTCHA_SECRET= - -### The URL for the hCaptcha protection service. Default: 'https://api.hcaptcha.com' -HCAPTCHA_PROTECTION_URL="https://api.hcaptcha.com" - -### The size of the job in CVAT, typically representing the number of items or tasks. Default: 10 -CVAT_JOB_SIZE="10" - -### The maximum allowed time (in seconds) for a CVAT job to be completed. Default: 300 -CVAT_MAX_TIME="300" - -### The size of validation jobs in CVAT, usually representing the number of validation items. Default: 2 -CVAT_VAL_SIZE="2" - -### The multiplier for the size of skeleton jobs in CVAT, used to scale the job size for skeleton tasks. Default: 6 -CVAT_SKELETONS_JOB_SIZE_MULTIPLIER="6" - -### The URL for connecting to the PostgreSQL database. -POSTGRES_URL= - -### The hostname or IP address of the PostgreSQL database server. Default: '127.0.0.1' -POSTGRES_HOST="127.0.0.1" - -### The port number on which the PostgreSQL database server is listening. Default: 5432 -POSTGRES_PORT="5432" - -### The username for authenticating with the PostgreSQL database. Default: 'operator' -POSTGRES_USER="operator" - -### The password for authenticating with the PostgreSQL database. Default: 'qwerty' -POSTGRES_PASSWORD="qwerty" - -### The name of the PostgreSQL database to connect to. Default: 'job-launcher' -POSTGRES_DATABASE="job-launcher" - -### Indicates whether to use SSL for connections to the PostgreSQL database. Default: false -POSTGRES_SSL="false" - -### The logging level for PostgreSQL operations (e.g., 'debug', 'info'). Default: 'log,info,warn,error' -POSTGRES_LOGGING="log,info,warn,error" - -### The RPC URL for the Sepolia network. -RPC_URL_SEPOLIA= - -### The RPC URL for the Polygon network. -RPC_URL_POLYGON= - -### The RPC URL for the Polygon Amoy network. -RPC_URL_POLYGON_AMOY= - -### The RPC URL for the BSC Mainnet network. -RPC_URL_BSC_MAINNET= - -### The RPC URL for the BSC Testnet network. -RPC_URL_BSC_TESTNET= - -### The RPC URL for the Localhost network. -RPC_URL_LOCALHOST= - -### Indicates whether PGP encryption should be used. Default: false -PGP_ENCRYPT="false" - -### The private key used for PGP encryption or decryption. -PGP_PRIVATE_KEY= - -### The passphrase associated with the PGP private key. -PGP_PASSPHRASE= - -### The endpoint URL for connecting to the S3 service. Default: '127.0.0.1' -S3_ENDPOINT="127.0.0.1" - -### The port number for connecting to the S3 service. Default: 9000 -S3_PORT="9000" - -### The access key ID used to authenticate requests to the S3 service. Required -S3_ACCESS_KEY= - -### The secret access key used to authenticate requests to the S3 service. Required -S3_SECRET_KEY= - -### The name of the S3 bucket where files will be stored. Default: 'launcher' -S3_BUCKET="launcher" - -### Indicates whether to use SSL (HTTPS) for connections to the S3 service. Default: false -S3_USE_SSL="false" - -### The API key used for authenticating requests to the SendGrid API. Required -SENDGRID_API_KEY= - -### The email address that will be used as the sender's address in emails sent via SendGrid. Default: 'job-launcher@hmt.ai' -SENDGRID_FROM_EMAIL="job-launcher@hmt.ai" - -### The name that will be used as the sender's name in emails sent via SendGrid. Default: 'Human Protocol Job Launcher' -SENDGRID_FROM_NAME="Human Protocol Job Launcher" - -### The environment in which the server is running (e.g., 'development', 'production'). Default: 'development' -NODE_ENV="development" - -### The hostname or IP address on which the server will run. Default: 'localhost' -HOST="localhost" - -### The port number on which the server will listen for incoming connections. Default: 5000 -PORT="5000" - -### The URL of the frontend application that the server will communicate with. Default: 'http://localhost:3005' -FE_URL="http://localhost:3005" - -### The maximum number of retry attempts for certain operations. Default: 5 -MAX_RETRY_COUNT="5" - -### The minimum transaction fee in USD. Default: 0.01 -MINIMUM_FEE_USD="0.01" - -### The time (in seconds) for which rate information will be cached. Default: 30 -RATE_CACHE_TIME="30" - -### The API key for accessing CoinGecko data. -COINGECKO_API_KEY= - -### The amount to charge abusive users. -ABUSE_AMOUNT= - -### The secret key used for authenticating requests to the Stripe API. Required -STRIPE_SECRET_KEY= - -### The version of the Stripe API to use for requests. Default: '2022-11-15' -STRIPE_API_VERSION="2022-11-15" - -### The name of the application interacting with the Stripe API. Default: 'Fortune' -STRIPE_APP_NAME="Fortune" - -### The version of the application interacting with the Stripe API. Default: '0.0.1' -STRIPE_APP_VERSION="0.0.1" - -### The URL of the application's information page. Default: 'https://hmt.ai' -STRIPE_APP_INFO_URL="https://hmt.ai" - -### The environment in which the Web3 application is running. Default: 'testnet' -WEB3_ENV="testnet" - -### The private key used for signing transactions. Required -WEB3_PRIVATE_KEY= - -### Multiplier for gas price adjustments. Default: 1 -GAS_PRICE_MULTIPLIER="1" - -### Address of the reputation oracle contract. Required -REPUTATION_ORACLE_ADDRESS= - -### List of reputation oracle addresses, typically comma-separated. Required -REPUTATION_ORACLES= - -### Address of the CVAT exchange oracle contract. Required -CVAT_EXCHANGE_ORACLE_ADDRESS= - -### Address of the CVAT recording oracle contract. Required -CVAT_RECORDING_ORACLE_ADDRESS= - -### Address of the Audino exchange oracle contract. Required -AUDINO_EXCHANGE_ORACLE_ADDRESS= - -### Address of the Audino recording oracle contract. Required -AUDINO_RECORDING_ORACLE_ADDRESS= - -### Address of the hCaptcha oracle contract. Required -HCAPTCHA_ORACLE_ADDRESS= - -### URI for the hCaptcha recording oracle service. Required -HCAPTCHA_RECORDING_ORACLE_URI= - -### URI for the hCaptcha reputation oracle service. Required -HCAPTCHA_REPUTATION_ORACLE_URI= - diff --git a/packages/apps/job-launcher/server/README.md b/packages/apps/job-launcher/server/README.md index c9a5b013ca..116445661c 100644 --- a/packages/apps/job-launcher/server/README.md +++ b/packages/apps/job-launcher/server/README.md @@ -57,12 +57,12 @@ yarn migration:run ``` ### Set up the database with Docker - -To run with docker, you need to enter the following command, which raises the container with postgres and runs the migrations: +To run with docker, you need to enter the following command, which raises necessary infra containers: ```bash -yarn docker:db:up +yarn workspace human-protocol docker:infra-up ``` +After that you can run migration. ## 🚀 Usage @@ -111,16 +111,6 @@ $ yarn migration:run $ yarn migration:show ``` -### Docker - -```bash -# Up a postgres container and run migrations -$ docker:db:up - -# Down postgres container -$ docker:db:down -``` - ## 📚 Documentation For detailed information about the Exchange Oracle, please refer to the [Human Protocol Tech Docs](https://human-protocol.gitbook.io/hub/human-tech-docs/architecture/components/job-launcher). diff --git a/packages/apps/job-launcher/server/docker-compose.yml b/packages/apps/job-launcher/server/docker-compose.yml deleted file mode 100644 index a8c9a7b86b..0000000000 --- a/packages/apps/job-launcher/server/docker-compose.yml +++ /dev/null @@ -1,57 +0,0 @@ -version: '3.8' -services: - postgres: - container_name: postgres - image: postgres:latest - restart: always - logging: - options: - max-size: 10m - max-file: "3" - ports: - - 5432:5432 - # volumes: - # - ./db:/var/lib/postgresql/data - environment: - POSTGRES_DB: ${POSTGRES_DATABASE} - POSTGRES_PASSWORD: ${POSTGRES_PASSWORD} - POSTGRES_USER: ${POSTGRES_USER} - minio: - container_name: minio - image: minio/minio:RELEASE.2022-05-26T05-48-41Z - ports: - - 9001:9001 - - 9000:9000 - entrypoint: 'sh' - command: - -c "minio server /data --console-address ':9001'" - healthcheck: - test: ["CMD", "curl", "-f", "http://localhost:9000/minio/health/live"] - interval: 5s - timeout: 5s - retries: 3 - minio-mc: - container_name: minio-mc - image: minio/mc - depends_on: - minio: - condition: service_healthy - entrypoint: > - /bin/sh -c " - /usr/bin/mc config host add myminio http://minio:9000 minioadmin minioadmin; - /usr/bin/mc mb myminio/manifests; - /usr/bin/mc anonymous set public myminio/manifests; - " - # job-launcher: - # container_name: job-launcher - # restart: unless-stopped - # build: - # context: ../../../../ - # dockerfile: packages/apps/job-launcher/server/Dockerfile - # expose: - # - '${PORT}' - # ports: - # - '${LOCAL_PORT}:${PORT}' - # env_file: - # - path: ./.env.development - # required: true # default diff --git a/packages/apps/job-launcher/server/package.json b/packages/apps/job-launcher/server/package.json index 11f11e9a82..76da90322b 100644 --- a/packages/apps/job-launcher/server/package.json +++ b/packages/apps/job-launcher/server/package.json @@ -18,9 +18,8 @@ "migration:revert": "yarn build && typeorm-ts-node-commonjs migration:revert -d typeorm.config.ts", "migration:run": "yarn build && typeorm-ts-node-commonjs migration:run -d typeorm.config.ts", "migration:show": "yarn build && typeorm-ts-node-commonjs migration:show -d typeorm.config.ts", - "docker:db:up": "docker compose up -d postgres && yarn migration:run", - "docker:db:down": "docker compose down", "setup:local": "ts-node ./test/setup.ts", + "setup:kvstore": "ts-node ./scripts/setup-kv-store.ts", "lint": "eslint \"{src,test}/**/*.ts\" --fix", "test": "jest", "test:watch": "jest --watch", @@ -54,9 +53,11 @@ "class-transformer": "^0.5.1", "class-validator": "0.14.1", "decimal.js": "^10.4.3", + "dotenv": "^16.3.2", "helmet": "^7.1.0", "joi": "^17.13.3", "json-stable-stringify": "^1.2.1", + "minio": "7.1.3", "nestjs-minio-client": "^2.2.0", "node-cache": "^5.1.2", "passport": "^0.7.0", diff --git a/packages/apps/job-launcher/server/scripts/setup-kv-store.ts b/packages/apps/job-launcher/server/scripts/setup-kv-store.ts new file mode 100644 index 0000000000..2312158bfa --- /dev/null +++ b/packages/apps/job-launcher/server/scripts/setup-kv-store.ts @@ -0,0 +1,157 @@ +import 'dotenv/config'; +import { KVStoreClient, KVStoreKeys, Role } from '@human-protocol/sdk'; +import { Wallet, ethers } from 'ethers'; +import * as Minio from 'minio'; + +const DEFAULT_SUPPORTED_JOB_TYPES = + 'fortune,image_boxes,image_boxes_from_points,image_points,image_polygons,image_skeletons_from_boxes'; +const ROLE = Role.JobLauncher; + +async function setupCommonValues(kvStoreClient: KVStoreClient): Promise { + const { + SUPPORTED_JOB_TYPES = DEFAULT_SUPPORTED_JOB_TYPES, + SERVER_URL = 'http://localhost:5003', + FEE = '1', + } = process.env; + + if (SUPPORTED_JOB_TYPES.split(',').length === 0) { + throw new Error('SUPPORTED_JOB_TYPES should be comma-separated list'); + } + try { + new URL(SERVER_URL || ''); + } catch (_noop) { + throw new Error('Invalid SERVER_URL'); + } + let url = SERVER_URL.endsWith('/') ? SERVER_URL.slice(0, -1) : SERVER_URL; + if (!url.startsWith('http')) { + url = `http://${url}`; + } + + const fee = Number(FEE); + if (!Number.isInteger(fee) || fee < 1) { + throw new Error('Fee must be positive integer'); + } + + await kvStoreClient.setBulk( + [ + KVStoreKeys.role, + KVStoreKeys.fee, + KVStoreKeys.url, + KVStoreKeys.webhookUrl, + KVStoreKeys.jobTypes, + ], + [ROLE, fee.toString(), url, `${url}/webhook`, SUPPORTED_JOB_TYPES], + ); +} + +type SetupPublicKeyFileMeta = { + keyName: string; + publicKey: string; + s3Bucket: string; + s3Endpoint: string; + s3Port: string; + kvKey: string; +}; + +async function setupPublicKeyFile( + kvStoreClient: KVStoreClient, + minioClient: Minio.Client, + meta: SetupPublicKeyFileMeta, +): Promise { + const { keyName, kvKey, publicKey, s3Bucket, s3Endpoint, s3Port } = meta; + const exists = await minioClient.bucketExists(s3Bucket); + if (!exists) { + throw new Error('Bucket does not exists'); + } + + await minioClient.putObject(s3Bucket, keyName, publicKey, { + 'Content-Type': 'text/plain', + 'Cache-Control': 'no-store', + }); + /** + * Protocol is required for 'setFileUrlAndHash' + */ + const _s3Endpoint = s3Endpoint.startsWith('http') + ? s3Endpoint + : `http://${s3Endpoint}`; + const fileUrl = `${_s3Endpoint}:${s3Port}/${s3Bucket}/${keyName}`; + await kvStoreClient.setFileUrlAndHash(fileUrl, kvKey); +} + +async function setup(): Promise { + const { WEB3_PRIVATE_KEY, RPC_URL_POLYGON_AMOY: RPC_URL } = process.env; + if (!WEB3_PRIVATE_KEY) { + throw new Error('Private key is empty'); + } + if (!RPC_URL) { + throw new Error('RPC url is empty'); + } + + const provider = new ethers.JsonRpcProvider(RPC_URL); + const wallet = new Wallet(WEB3_PRIVATE_KEY, provider); + + const kvStoreClient = await KVStoreClient.build(wallet); + + await setupCommonValues(kvStoreClient); + + const { + S3_ENDPOINT, + S3_PORT, + S3_USE_SSL, + S3_ACCESS_KEY, + S3_SECRET_KEY, + S3_BUCKET, + } = process.env; + + if ( + [S3_ENDPOINT, S3_PORT, S3_ACCESS_KEY, S3_SECRET_KEY, S3_BUCKET].some( + (value) => !value, + ) + ) { + throw new Error('Missing S3 config value'); + } + + const s3Endpoint = S3_ENDPOINT as string; + const s3Port = S3_PORT as string; + const s3AccessKey = S3_ACCESS_KEY as string; + const s3SecretKey = S3_SECRET_KEY as string; + const s3Bucket = S3_BUCKET as string; + + const minioClient = new Minio.Client({ + endPoint: s3Endpoint, + port: parseInt(s3Port, 10), + useSSL: S3_USE_SSL === 'true', + accessKey: s3AccessKey, + secretKey: s3SecretKey, + }); + + const { + PGP_ENCRYPT, + PGP_PUBLIC_KEY, + PGP_PUBLIC_KEY_FILE = 'pgp-public-key', + } = process.env; + if (PGP_ENCRYPT && PGP_ENCRYPT === 'true') { + if (!PGP_PUBLIC_KEY) { + throw new Error('PGP public key is empty'); + } + + await setupPublicKeyFile(kvStoreClient, minioClient, { + s3Endpoint, + s3Port, + s3Bucket, + publicKey: PGP_PUBLIC_KEY, + keyName: PGP_PUBLIC_KEY_FILE, + kvKey: KVStoreKeys.publicKey, + }); + } +} + +(async () => { + try { + await setup(); + process.exit(0); + } catch (error) { + console.error('Failed to setup KV', error); + process.exit(1); + } +})(); diff --git a/packages/apps/job-launcher/server/src/app.module.ts b/packages/apps/job-launcher/server/src/app.module.ts index 322ef389d1..32fcb810cc 100644 --- a/packages/apps/job-launcher/server/src/app.module.ts +++ b/packages/apps/job-launcher/server/src/app.module.ts @@ -51,9 +51,10 @@ import { TransformEnumInterceptor } from './common/interceptors/transform-enum.i imports: [ ScheduleModule.forRoot(), ConfigModule.forRoot({ - envFilePath: process.env.NODE_ENV - ? `.env.${process.env.NODE_ENV as string}` - : '.env', + /** + * First value found takes precendece + */ + envFilePath: [`.env.${process.env.NODE_ENV}`, '.env'], validationSchema: envValidator, }), DatabaseModule, diff --git a/packages/apps/job-launcher/server/src/common/config/server-config.service.ts b/packages/apps/job-launcher/server/src/common/config/server-config.service.ts index 50ff98a9c3..6f26a2a109 100644 --- a/packages/apps/job-launcher/server/src/common/config/server-config.service.ts +++ b/packages/apps/job-launcher/server/src/common/config/server-config.service.ts @@ -31,10 +31,10 @@ export class ServerConfigService { /** * The URL of the frontend application that the server will communicate with. - * Default: 'http://localhost:3005' + * Default: 'http://localhost:3002' */ get feURL(): string { - return this.configService.get('FE_URL', 'http://localhost:3005'); + return this.configService.get('FE_URL', 'http://localhost:3002'); } /** diff --git a/packages/apps/reputation-oracle/server/.env.example b/packages/apps/reputation-oracle/server/.env.example index 952da47ff0..e08449b539 100644 --- a/packages/apps/reputation-oracle/server/.env.example +++ b/packages/apps/reputation-oracle/server/.env.example @@ -1,89 +1,98 @@ # General -HOST=localhost -PORT=3008 -FE_URL=http://localhost:3009 -MAX_RETRY_COUNT=5 -QUALIFICATION_MIN_VALIDITY=1 +HOST=0.0.0.0 +PORT=5001 +FE_URL=http://localhost:3001 # Database POSTGRES_HOST=0.0.0.0 -POSTGRES_USER=operator +POSTGRES_PORT=5433 +POSTGRES_USER=default POSTGRES_PASSWORD=qwerty POSTGRES_DATABASE=reputation-oracle -POSTGRES_SYNC=false -POSTGRES_PORT=5432 POSTGRES_SSL=false -POSTGRES_LOGGING='all' + +# S3 +S3_ENDPOINT=0.0.0.0 +S3_PORT=9000 +S3_ACCESS_KEY=human-oracle +S3_SECRET_KEY=human-oracle-s3-secret +S3_BUCKET=reputation-oracle +S3_USE_SSL=false # Auth -JWT_PRIVATE_KEY="-----BEGIN EC PRIVATE KEY----- -MHcCAQEEIEwNR7Y1W3ftWIpgwqCvto5idqDIz9Sfw4enT8rxj5RRoAoGCCqGSM49 -AwEHoUQDQgAEaanJgehbzgHuQ9fbhv0K0pMZ5JwrBU5wq02mlVzAFyqf50VD36z/ -s0qK3aXoFe/jlDvdLRwcHyJSfhULefS42g== ------END EC PRIVATE KEY-----" +JWT_PRIVATE_KEY="-----BEGIN PRIVATE KEY----- +MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQg9T4TcNz4sFIvOZTE +wBHX986G90H20Cryp4++7APQfu6hRANCAASQ96QPer3ose3gh+9jVRjVi6RN4R8r +5evI9eFTnucq6FlcE9GtD6UwN4WlikdakaoD8rnvqf6sO+NsGAd9CIcq +-----END PRIVATE KEY-----" JWT_PUBLIC_KEY="-----BEGIN PUBLIC KEY----- -MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEaanJgehbzgHuQ9fbhv0K0pMZ5Jwr -BU5wq02mlVzAFyqf50VD36z/s0qK3aXoFe/jlDvdLRwcHyJSfhULefS42g== +MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEkPekD3q96LHt4IfvY1UY1YukTeEf +K+XryPXhU57nKuhZXBPRrQ+lMDeFpYpHWpGqA/K576n+rDvjbBgHfQiHKg== -----END PUBLIC KEY-----" -JWT_ACCESS_TOKEN_EXPIRES_IN=1000000000 -JWT_REFRESH_TOKEN_EXPIRES_IN=1000000000 - # HCaptcha HCAPTCHA_SITE_KEY=10000000-ffff-ffff-ffff-000000000001 -HCAPTCHA_API_KEY=test HCAPTCHA_SECRET=0x0000000000000000000000000000000000000000 +HCAPTCHA_API_KEY=replace_me_if_needed - -# S3 -S3_ENDPOINT=localhost -S3_PORT=9000 -S3_ACCESS_KEY=dev -S3_SECRET_KEY=devdevdev -S3_BUCKET=reputation -S3_USE_SSL=false +# KYC +KYC_API_KEY=disabled +KYC_API_PRIVATE_KEY=none # Email -SENDGRID_API_KEY= -EMAIL_FROM=test@example.com -EMAIL_FROM_NAME="Reputation oracle" +SENDGRID_API_KEY=disabled +EMAIL_FROM=reputation-oracle@local.app +EMAIL_FROM_NAME="Reputation Oracle Local" # Web3 WEB3_ENV=testnet -WEB3_PRIVATE_KEY= -GAS_PRICE_MULTIPLIER= -RPC_URL_SEPOLIA= -RPC_URL_POLYGON= -RPC_URL_POLYGON_AMOY= -RPC_URL_BSC_MAINNET= -RPC_URL_BSC_TESTNET= -RPC_URL_MOONBEAM= -RPC_URL_XLAYER= -RPC_URL_LOCALHOST= -RPC_URL_XLAYER_TESTNET= - -# Reputation Level -REPUTATION_LEVEL_LOW=300 -REPUTATION_LEVEL_HIGH=700 +WEB3_PRIVATE_KEY=replace_me +RPC_URL_POLYGON_AMOY=https://rpc-amoy.polygon.technology # Encryption -PGP_PRIVATE_KEY= -PGP_PASSPHRASE= -PGP_ENCRYPT= +PGP_ENCRYPT=true +PGP_PRIVATE_KEY="-----BEGIN PGP PRIVATE KEY BLOCK----- + +lIYEZ4lbOhYJKwYBBAHaRw8BAQdAgyoVs1EoBCW7THMZLKJ8wVIXqINDDp0dQMoh +DXV0iTH+BwMCb6qyWpKmegj/IpdlppS+qycJNtMQ6RDaSZlMsq+UTRBEM64jxs3y +EKOI8P9sCP1qBJl1wIWCifBSmTAKcTeOIuLB4P6cljz8DSo3D4lxM7RXUmVwdXRh +dGlvbiBPcmFjbGUgKEV4YW1wbGUgcGdwIGtleSBmb3IgcmVwdXRhdGlvbiBvcmFj +bGUpIDxyZXB1dGF0aW9uLW9yYWNsZUBobXQubG9jYWw+iJMEExYKADsWIQTYqYVR +HpEWi8IdtKTm/YtkpDwV7QUCZ4lbOgIbAwULCQgHAgIiAgYVCgkICwIEFgIDAQIe +BwIXgAAKCRDm/YtkpDwV7b4pAQCmCmKS7PyC3DKwt65bo7iFEc4ZPrVC3SElktaM +sONZ5gEAzl292RHsJFlN3fhm7w5PM6eCqwkuBq7GchWFfz0oYAWciwRniVs6Egor +BgEEAZdVAQUBAQdAvuHJsFMJQJKNud0PBglT26Tq+fx2yM1+fYvrzTuqwhYDAQgH +/gcDAqscEWOQgpOz//4EYtR175elc/o1/0XqW74aSScCylvAMWa3QQ/TU7m39TiD +P45fKGJAYPXJEYCz36g+NSeLP1iZyWQAkweEZoQERWLgbpaIeAQYFgoAIBYhBNip +hVEekRaLwh20pOb9i2SkPBXtBQJniVs6AhsMAAoJEOb9i2SkPBXtDBUA/31dsyJ7 +AxylargNkQx/Q/5Ws/WaIT1zRJauE9kpO71iAP98o89Exq+rc268uXSN+2/edJ/D +Sq+xksFikJ/P/WeXBg== +=kI8h +-----END PGP PRIVATE KEY BLOCK-----" +PGP_PASSPHRASE=avg3GJT-asd5kgk_kgx +# Put it here just to easily set up KV later; not needed to run +PGP_PUBLIC_KEY="-----BEGIN PGP PUBLIC KEY BLOCK----- -# Synaps Kyc -SYNAPS_API_KEY= -SYNAPS_WEBHOOK_SECRET= -SYNAPS_BASE_URL= -SYNAPS_STEP_DOCUMENT_ID= +mDMEZ4lbOhYJKwYBBAHaRw8BAQdAgyoVs1EoBCW7THMZLKJ8wVIXqINDDp0dQMoh +DXV0iTG0V1JlcHV0YXRpb24gT3JhY2xlIChFeGFtcGxlIHBncCBrZXkgZm9yIHJl +cHV0YXRpb24gb3JhY2xlKSA8cmVwdXRhdGlvbi1vcmFjbGVAaG10LmxvY2FsPoiT +BBMWCgA7FiEE2KmFUR6RFovCHbSk5v2LZKQ8Fe0FAmeJWzoCGwMFCwkIBwICIgIG +FQoJCAsCBBYCAwECHgcCF4AACgkQ5v2LZKQ8Fe2+KQEApgpikuz8gtwysLeuW6O4 +hRHOGT61Qt0hJZLWjLDjWeYBAM5dvdkR7CRZTd34Zu8OTzOngqsJLgauxnIVhX89 +KGAFuDgEZ4lbOhIKKwYBBAGXVQEFAQEHQL7hybBTCUCSjbndDwYJU9uk6vn8dsjN +fn2L6807qsIWAwEIB4h4BBgWCgAgFiEE2KmFUR6RFovCHbSk5v2LZKQ8Fe0FAmeJ +WzoCGwwACgkQ5v2LZKQ8Fe0MFQD/fV2zInsDHKVquA2RDH9D/laz9ZohPXNElq4T +2Sk7vWIA/3yjz0TGr6tzbry5dI37b950n8NKr7GSwWKQn8/9Z5cG +=SrHM +-----END PGP PUBLIC KEY BLOCK-----" # Slack notifications -ABUSE_SLACK_WEBHOOK_URL= -ABUSE_SLACK_OAUTH_TOKEN= -ABUSE_SLACK_SIGNING_SECRET= +ABUSE_SLACK_WEBHOOK_URL=http://disabled-for-local.app +ABUSE_SLACK_SIGNING_SECRET=disabled +ABUSE_SLACK_OAUTH_TOKEN=disabled # NDA -NDA_URL= +NDA_URL=https://humanprotocol.org # HUMAN App secret key for auth in RepO HUMAN_APP_SECRET_KEY=sk_example_1VwUpBMO8H0v4Pmu4TPiWFEwuMguW4PkozSban4Rfbc diff --git a/packages/apps/reputation-oracle/server/README.md b/packages/apps/reputation-oracle/server/README.md index 8b6523ca59..1ef93bdeb7 100644 --- a/packages/apps/reputation-oracle/server/README.md +++ b/packages/apps/reputation-oracle/server/README.md @@ -57,12 +57,12 @@ yarn migration:run ``` ### Set up the database with Docker - -To run with docker, you need to enter the following command, which raises the container with postgres and runs the migrations: +To run with docker, you need to enter the following command, which raises necessary infra containers: ```bash -yarn docker:db:up +yarn workspace human-protocol docker:infra-up ``` +After that you can run migration. ## 🚀 Usage diff --git a/packages/apps/reputation-oracle/server/docker-compose.yml b/packages/apps/reputation-oracle/server/docker-compose.yml deleted file mode 100644 index f3b01e2911..0000000000 --- a/packages/apps/reputation-oracle/server/docker-compose.yml +++ /dev/null @@ -1,85 +0,0 @@ -version: '3.8' - -services: - postgres: - container_name: postgres - image: postgres:latest - restart: always - environment: - - POSTGRES_HOST=${POSTGRES_HOST} - - POSTGRES_USER=${POSTGRES_USER} - - POSTGRES_PASSWORD=${POSTGRES_PASSWORD} - - POSTGRES_DB=${POSTGRES_DATABASE} - - POSTGRES_PORT=${POSTGRES_PORT} - - POSTGRES_SYNC=${POSTGRES_SYNC} - logging: - options: - max-size: 10m - max-file: "3" - ports: - - '${POSTGRES_PORT}:${POSTGRES_PORT}' - # volumes: - # - ./db:/var/lib/postgresql/data - - minio: - container_name: minio - image: minio/minio:RELEASE.2022-05-26T05-48-41Z - ports: - - 9001:9001 - - 9000:9000 - entrypoint: 'sh' - command: - -c "minio server /data --console-address ':9001'" - healthcheck: - test: ["CMD", "curl", "-f", "http://localhost:9000/minio/health/live"] - interval: 5s - timeout: 5s - retries: 3 - minio-mc: - container_name: minio-mc - image: minio/mc - depends_on: - minio: - condition: service_healthy - entrypoint: > - /bin/sh -c " - /usr/bin/mc config host add myminio http://minio:9000 minioadmin minioadmin; - /usr/bin/mc mb myminio/reputation; - /usr/bin/mc anonymous set public myminio/reputation; - " - reputation-oracle: - container_name: reputation-oracle - restart: unless-stopped - build: - context: ../../../../ - dockerfile: packages/apps/reputation-oracle/server/Dockerfile - expose: - - '${PORT}' - ports: - - '${LOCAL_PORT}:${PORT}' - environment: - NODE_ENV: ${NODE_ENV} - HOST: ${HOST} - PORT: ${PORT} - FE_URL: ${FE_URL} - SESSION_SECRET: ${SESSION_SECRET} - POSTGRES_HOST: ${POSTGRES_HOST} - POSTGRES_USER: ${POSTGRES_USER} - POSTGRES_PASSWORD: ${POSTGRES_PASSWORD} - POSTGRES_DATABASE: ${POSTGRES_DATABASE} - POSTGRES_SSL: ${POSTGRES_SSL} - POSTGRES_SYNC: ${POSTGRES_SYNC} - POSTGRES_PORT: ${POSTGRES_PORT} - WEB3_PRIVATE_KEY: ${WEB3_PRIVATE_KEY} - JWT_SECRET: ${JWT_SECRET} - JWT_ACCESS_TOKEN_EXPIRES_IN: ${JWT_ACCESS_TOKEN_EXPIRES_IN} - JWT_REFRESH_TOKEN_EXPIRES_IN: ${JWT_REFRESH_TOKEN_EXPIRES_IN} - S3_ENDPOINT: ${S3_ENDPOINT} - S3_PORT: ${S3_PORT} - S3_ACCESS_KEY: ${S3_ACCESS_KEY} - S3_SECRET_KEY: ${S3_SECRET_KEY} - S3_BUCKET: ${S3_BUCKET} - S3_USE_SSL: ${S3_USE_SSL} - SENDGRID_API_KEY: ${SENDGRID_API_KEY} - REPUTATION_LEVEL_LOW: ${REPUTATION_LEVEL_LOW} - REPUTATION_LEVEL_HIGH: ${REPUTATION_LEVEL_HIGH} \ No newline at end of file diff --git a/packages/apps/reputation-oracle/server/package.json b/packages/apps/reputation-oracle/server/package.json index 2ebd5736bb..f4d91c2a12 100644 --- a/packages/apps/reputation-oracle/server/package.json +++ b/packages/apps/reputation-oracle/server/package.json @@ -18,9 +18,8 @@ "migration:revert": "yarn build && typeorm-ts-node-commonjs migration:revert -d typeorm-migrations-datasource.ts", "migration:run": "yarn build && typeorm-ts-node-commonjs migration:run -d typeorm-migrations-datasource.ts", "migration:show": "yarn build && typeorm-ts-node-commonjs migration:show -d typeorm-migrations-datasource.ts", - "docker:db:up": "docker compose up -d postgres && yarn migration:run", - "docker:db:down": "docker compose down postgres", "setup:local": "ts-node ./scripts/setup-kv-store.ts", + "setup:kvstore": "ts-node ./scripts/setup-kv-store.ts", "lint": "eslint \"{src,apps,libs,test}/**/*.ts\" --fix", "test": "jest", "test:watch": "jest --watch", diff --git a/packages/apps/reputation-oracle/server/scripts/setup-kv-store.ts b/packages/apps/reputation-oracle/server/scripts/setup-kv-store.ts index cd51e5822d..38e117cc00 100644 --- a/packages/apps/reputation-oracle/server/scripts/setup-kv-store.ts +++ b/packages/apps/reputation-oracle/server/scripts/setup-kv-store.ts @@ -3,10 +3,18 @@ import { KVStoreClient, KVStoreKeys, Role } from '@human-protocol/sdk'; import { Wallet, ethers } from 'ethers'; import * as Minio from 'minio'; +const DEFAULT_SUPPORTED_JOB_TYPES = + 'fortune,image_boxes,image_boxes_from_points,image_points,image_polygons,image_skeletons_from_boxes'; +const ROLE = Role.ReputationOracle; + async function setupCommonValues(kvStoreClient: KVStoreClient): Promise { - const { SUPPORTED_JOB_TYPES = '', SERVER_URL = '', FEE = '' } = process.env; + const { + SUPPORTED_JOB_TYPES = DEFAULT_SUPPORTED_JOB_TYPES, + SERVER_URL = 'http://localhost:5001', + FEE = '1', + } = process.env; - if (!SUPPORTED_JOB_TYPES || SUPPORTED_JOB_TYPES.split(',').length === 0) { + if (SUPPORTED_JOB_TYPES.split(',').length === 0) { throw new Error('SUPPORTED_JOB_TYPES should be comma-separated list'); } try { @@ -32,13 +40,7 @@ async function setupCommonValues(kvStoreClient: KVStoreClient): Promise { KVStoreKeys.webhookUrl, KVStoreKeys.jobTypes, ], - [ - Role.ReputationOracle, - `${fee}`, - url, - `${url}/webhook`, - SUPPORTED_JOB_TYPES, - ], + [ROLE, fee.toString(), url, `${url}/webhook`, SUPPORTED_JOB_TYPES], ); } @@ -77,7 +79,7 @@ async function setupPublicKeyFile( } async function setup(): Promise { - const { WEB3_PRIVATE_KEY, RPC_URL } = process.env; + const { WEB3_PRIVATE_KEY, RPC_URL_POLYGON_AMOY: RPC_URL } = process.env; if (!WEB3_PRIVATE_KEY) { throw new Error('Private key is empty'); } @@ -108,24 +110,26 @@ async function setup(): Promise { ) { throw new Error('Missing S3 config value'); } - if (!S3_ACCESS_KEY || !S3_SECRET_KEY) { - throw new Error('S3 key is missing'); - } - if (!S3_BUCKET) { - throw new Error('S3 bucket is missing'); - } - const s3Endpoint = S3_ENDPOINT || 'localhost'; - const s3Port = S3_PORT || '9000'; + const s3Endpoint = S3_ENDPOINT as string; + const s3Port = S3_PORT as string; + const s3AccessKey = S3_ACCESS_KEY as string; + const s3SecretKey = S3_SECRET_KEY as string; + const s3Bucket = S3_BUCKET as string; + const minioClient = new Minio.Client({ endPoint: s3Endpoint, port: parseInt(s3Port, 10), useSSL: S3_USE_SSL === 'true', - accessKey: S3_ACCESS_KEY, - secretKey: S3_SECRET_KEY, + accessKey: s3AccessKey, + secretKey: s3SecretKey, }); - const { PGP_ENCRYPT, PGP_PUBLIC_KEY } = process.env; + const { + PGP_ENCRYPT, + PGP_PUBLIC_KEY, + PGP_PUBLIC_KEY_FILE = 'pgp-public-key', + } = process.env; if (PGP_ENCRYPT && PGP_ENCRYPT === 'true') { if (!PGP_PUBLIC_KEY) { throw new Error('PGP public key is empty'); @@ -133,9 +137,9 @@ async function setup(): Promise { await setupPublicKeyFile(kvStoreClient, minioClient, { s3Endpoint, s3Port, - s3Bucket: S3_BUCKET, + s3Bucket, publicKey: PGP_PUBLIC_KEY, - keyName: 'pgp-public-key', + keyName: PGP_PUBLIC_KEY_FILE, kvKey: KVStoreKeys.publicKey, }); } @@ -147,7 +151,7 @@ async function setup(): Promise { await setupPublicKeyFile(kvStoreClient, minioClient, { s3Endpoint, s3Port, - s3Bucket: S3_BUCKET, + s3Bucket, publicKey: JWT_PUBLIC_KEY, keyName: 'jwt-public-key', kvKey: 'jwt_public_key', diff --git a/packages/apps/staking/.env.example b/packages/apps/staking/.env.example index 611f637438..6108cf5bc5 100644 --- a/packages/apps/staking/.env.example +++ b/packages/apps/staking/.env.example @@ -1,15 +1,19 @@ -VITE_APP_DASHBOARD_API_URL= +# General +VITE_APP_DASHBOARD_API_URL=http://0.0.0.0:5006 VITE_APP_ENVIRONMENT=testnet VITE_APP_SUPPORTED_CHAINS=80002 -# links to header -VITE_HEADER_LINK_DASHBOARD= -# links to footer socials -VITE_FOOTER_LINK_GITHUB= -VITE_FOOTER_LINK_DISCORD= -VITE_FOOTER_LINK_X= -VITE_FOOTER_LINK_TELEGRAM= -VITE_FOOTER_LINK_LINKEDIN= -# other footer links -VITE_FOOTER_LINK_TERMS_OF_SERVICE= -VITE_FOOTER_LINK_PRIVACY_POLICY= -VITE_FOOTER_LINK_HUMAN_PROTOCOL= \ No newline at end of file + +# Links to header +VITE_HEADER_LINK_DASHBOARD=http://localhost:3004 + +# Links to footer socials +VITE_FOOTER_LINK_GITHUB=https://github.com/humanprotocol/human-protocol +VITE_FOOTER_LINK_DISCORD=https://discord.com/invite/5sHfvE8y8p +VITE_FOOTER_LINK_X=https://x.com/intent/follow?screen_name=human_protocol +VITE_FOOTER_LINK_TELEGRAM=https://t.me/human_protocol_community +VITE_FOOTER_LINK_LINKEDIN=https://www.linkedin.com/company/human-protocol + +# Other footer links +VITE_FOOTER_LINK_TERMS_OF_SERVICE=https://humanprotocol.org/privacy-policy +VITE_FOOTER_LINK_PRIVACY_POLICY=https://humanprotocol.org/privacy-policy +VITE_FOOTER_LINK_HUMAN_PROTOCOL=https://humanprotocol.org/ \ No newline at end of file diff --git a/packages/apps/staking/package.json b/packages/apps/staking/package.json index 71a7588241..f5336e073d 100644 --- a/packages/apps/staking/package.json +++ b/packages/apps/staking/package.json @@ -6,7 +6,7 @@ "scripts": { "clean": "rm -rf dist", "lint": "eslint \"**/*.{ts,tsx}\"", - "start": "vite --port 3006", + "start": "vite", "build": "vite build", "preview": "vite preview", "start:prod": "serve -s dist", diff --git a/packages/apps/staking/vite.config.ts b/packages/apps/staking/vite.config.ts index 546d38f7fe..fd034b78df 100644 --- a/packages/apps/staking/vite.config.ts +++ b/packages/apps/staking/vite.config.ts @@ -33,6 +33,6 @@ export default defineConfig({ }, }, server: { - port: 3006, + port: 3005, }, }); diff --git a/packages/examples/cvat/exchange-oracle/.dockerignore b/packages/examples/cvat/exchange-oracle/.dockerignore deleted file mode 100644 index ae6030127f..0000000000 --- a/packages/examples/cvat/exchange-oracle/.dockerignore +++ /dev/null @@ -1,4 +0,0 @@ -# dockerfiles/.dockerignore - -# Exclude the .env file in the src directory -src/.env \ No newline at end of file diff --git a/packages/examples/cvat/exchange-oracle/src/.env.example b/packages/examples/cvat/exchange-oracle/src/.env.example new file mode 100644 index 0000000000..e3fa11e377 --- /dev/null +++ b/packages/examples/cvat/exchange-oracle/src/.env.example @@ -0,0 +1,93 @@ +# General +HOST=0.0.0.0 +PORT=5004 + +# Postgres config +PG_HOST=0.0.0.0 +PG_PORT=5433 +PG_USER=default +PG_PASSWORD=qwerty +PG_DB=exchange-oracle-cvat + +# Redis config +REDIS_HOST=0.0.0.0 +REDIS_PORT=6380 +REDIS_DB=2 + +# Storage Config (S3/GCS/Minio) +STORAGE_PROVIDER=aws +STORAGE_ENDPOINT_URL=minio:9000 +STORAGE_ACCESS_KEY=human-oracle +STORAGE_SECRET_KEY=human-oracle-s3-secret +STORAGE_BUCKET_NAME=cvat-exchange-oracle +STORAGE_USE_SSL=false + +# Polygon Amoy Config +POLYGON_AMOY_RPC_API_URL=https://rpc-amoy.polygon.technology +POLYGON_AMOY_PRIVATE_KEY=replace_me +POLYGON_AMOY_ADDR=replace_me + +# Cron Config +PROCESS_JOB_LAUNCHER_WEBHOOKS_INT=10 +PROCESS_RECORDING_ORACLE_WEBHOOKS_INT=10 +TRACK_COMPLETED_PROJECTS_INT=10 +TRACK_COMPLETED_TASKS_INT=10 +TRACK_COMPLETED_ESCROWS_INT=10 +TRACK_CREATING_TASKS_INT=10 +TRACK_ASSIGNMENTS_INT=10 +TRACK_ESCROW_CREATION_INT=10 +TRACK_ESCROW_VALIDATIONS_INT=10 + +# CVAT Config +CVAT_URL=http://cvat-lb:8080 +CVAT_ADMIN=human-protocol +CVAT_ADMIN_PASS=qwe123qwe123Q! +CVAT_ORG_SLUG=HumanAppLocal + +# Features +ENABLE_CUSTOM_CLOUD_HOST="yes" + +# Core +DEFAULT_ASSIGNMENT_TIME=600 + +# HUMAN App config +HUMAN_APP_JWT_KEY="-----BEGIN PUBLIC KEY----- +MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEkPekD3q96LHt4IfvY1UY1YukTeEf +K+XryPXhU57nKuhZXBPRrQ+lMDeFpYpHWpGqA/K576n+rDvjbBgHfQiHKg== +-----END PUBLIC KEY-----" + +# Encryption +PGP_PRIVATE_KEY="-----BEGIN PGP PRIVATE KEY BLOCK----- + +lIYEZ4+21RYJKwYBBAHaRw8BAQdAgnSCXFMaftE221PbAvaliZTq+G5rTsAGjIpd +e8YOMBH+BwMCFUpbjvBTcm3/4iq8P/neJEdtL2uJ/OL8jNIOJ88yC7iokBzUZ+e6 +lhbmxybD+dxjuZf16iXzDjYYI2R/VnmKt4chtNqrt0X+DBx2a2DjfLQ/Y3ZhdC1l +eGNoYW5nZS1vcmFjbGVAbG9jYWwuYXBwIDxjdmF0LWV4Y2hhbmdlLW9yYWNsZUBs +b2NhbC5hcHA+iJMEExYKADsWIQSOUPmSUTqBxtsdHRxJkcIKPK7cJAUCZ4+21QIb +AwULCQgHAgIiAgYVCgkICwIEFgIDAQIeBwIXgAAKCRBJkcIKPK7cJPhsAQCzUx0u +Sv+TkPWyn2zauMcMnffwzkTdC6v0nh3lsm6oewD/SnZVrFqIOoeBlUM57val6JwG +YyKKHt/mjISs2Dqo8wCciwRnj7bVEgorBgEEAZdVAQUBAQdAJjhRu8SX7Ryn+rYY +AkVxrBPI3GXQoWFSO/B4HopIJi0DAQgH/gcDAhXjA3yGYNM5/+uG9U29B/vFW2So +v7A4eMI+J+8/K8RObR2tTM3KEC7dXJKR9YTYqIVR10AwI4iR6XplSqjP2Un6jMlI +pSMN2l0vuJpxdzSIeAQYFgoAIBYhBI5Q+ZJROoHG2x0dHEmRwgo8rtwkBQJnj7bV +AhsMAAoJEEmRwgo8rtwkoLYBAJMZnNZqp+7uXomSguiPujFwgMobR1jXFsOASZF8 +HPLwAQD6uUWeuPdHXen+STls/0g4MI2jn2PwtAT/cpQ7tsoTDA== +=Uhu5 +-----END PGP PRIVATE KEY BLOCK-----" +PGP_PASSPHRASE=SfR1I92e66G2OJoA +# Put it here just to easily set up KV later; not needed to run +PGP_PUBLIC_KEY="-----BEGIN PGP PUBLIC KEY BLOCK----- + +mDMEZ4+21RYJKwYBBAHaRw8BAQdAgnSCXFMaftE221PbAvaliZTq+G5rTsAGjIpd +e8YOMBG0P2N2YXQtZXhjaGFuZ2Utb3JhY2xlQGxvY2FsLmFwcCA8Y3ZhdC1leGNo +YW5nZS1vcmFjbGVAbG9jYWwuYXBwPoiTBBMWCgA7FiEEjlD5klE6gcbbHR0cSZHC +Cjyu3CQFAmePttUCGwMFCwkIBwICIgIGFQoJCAsCBBYCAwECHgcCF4AACgkQSZHC +Cjyu3CT4bAEAs1MdLkr/k5D1sp9s2rjHDJ338M5E3Qur9J4d5bJuqHsA/0p2Vaxa +iDqHgZVDOe72peicBmMiih7f5oyErNg6qPMAuDgEZ4+21RIKKwYBBAGXVQEFAQEH +QCY4UbvEl+0cp/q2GAJFcawTyNxl0KFhUjvweB6KSCYtAwEIB4h4BBgWCgAgFiEE +jlD5klE6gcbbHR0cSZHCCjyu3CQFAmePttUCGwwACgkQSZHCCjyu3CSgtgEAkxmc +1mqn7u5eiZKC6I+6MXCAyhtHWNcWw4BJkXwc8vABAPq5RZ6490dd6f5JOWz/SDgw +jaOfY/C0BP9ylDu2yhMM +=YMyq +-----END PGP PUBLIC KEY BLOCK-----" +PGP_PUBLIC_KEY_URL=http://minio:9000/cvat-exchange-oracle/pgp-public-key diff --git a/packages/examples/cvat/recording-oracle/src/.env.example b/packages/examples/cvat/recording-oracle/src/.env.example new file mode 100644 index 0000000000..5ad1b49ccd --- /dev/null +++ b/packages/examples/cvat/recording-oracle/src/.env.example @@ -0,0 +1,82 @@ +# General +HOST=0.0.0.0 +PORT=5005 + +# Postgres config +PG_HOST=0.0.0.0 +PG_PORT=5433 +PG_USER=default +PG_PASSWORD=qwerty +PG_DB=recording + +# Polygon Amoy +POLYGON_AMOY_RPC_API_URL=https://rpc-amoy.polygon.technology +POLYGON_AMOY_PRIVATE_KEY=replace_me +POLYGON_AMOY_ADDR=replace_me + +# Cron jobs +PROCESS_EXCHANGE_ORACLE_WEBHOOKS_INT=10 +PROCESS_REPUTATION_ORACLE_WEBHOOKS_INT=10 + +# Storage Config (S3/GCS/Minio) +STORAGE_PROVIDER=aws +STORAGE_ENDPOINT_URL=minio:9000 +STORAGE_ACCESS_KEY=human-oracle +STORAGE_SECRET_KEY=human-oracle-s3-secret +STORAGE_BUCKET_NAME=cvat-exchange-oracle +STORAGE_USE_SSL=false +STORAGE_RESULTS_BUCKET_NAME=cvat-recording-oracle +STORAGE_USE_PATH_STYLE=true + +# Exchange Oracle Storage +STORAGE_BUCKET_NAME=cvat-exchange-oracle +EXCHANGE_ORACLE_STORAGE_PROVIDER=aws +EXCHANGE_ORACLE_STORAGE_ENDPOINT_URL=minio:9000 +EXCHANGE_ORACLE_STORAGE_ACCESS_KEY=human-oracle +EXCHANGE_ORACLE_STORAGE_SECRET_KEY=human-oracle-s3-secret +EXCHANGE_ORACLE_STORAGE_RESULTS_BUCKET_NAME=cvat-exchange-oracle +EXCHANGE_ORACLE_STORAGE_USE_SSL=false + +# CVAT Config +CVAT_URL=http://cvat-lb:8080 +CVAT_ADMIN=human-protocol +CVAT_ADMIN_PASS=qwe123qwe123Q! +CVAT_ORG_SLUG=HumanAppLocal + +# Features +ENABLE_CUSTOM_CLOUD_HOST=true + +# Encryption +PGP_PRIVATE_KEY="-----BEGIN PGP PRIVATE KEY BLOCK----- + +lIYEZ4+5ghYJKwYBBAHaRw8BAQdAT3FAHszcuVoku0YlOyJrgqJf8NmnKc6qKU5N +eHznpx/+BwMCO3NOItWdTgX/JDQWQQIm+JyvWIZQjFsvXJKClXXM21hA0z1bux9a +Qx9+YAIbiwnu0YFUJMvI8cfBv3hGkiA325NmqLZ5kUzqvjxp9w92JbQtUmVjb3Jk +aW5nIE9yYWNsZSA8cmVjb3JkaW5nLW9yYWNsZUBsb2NhbC5hcHA+iJMEExYKADsW +IQSSY2XwNs+1ey1IByhZ3rDnTiC9mQUCZ4+5ggIbAwULCQgHAgIiAgYVCgkICwIE +FgIDAQIeBwIXgAAKCRBZ3rDnTiC9mZztAP46luOhfAnAaf/fNav6SPL9FdVftx4K +xvojSjYyPQmyRQEA/V5+F1boR+rQOycthh0o05TTarnNfY6Yaz3lw2+qeAuciwRn +j7mCEgorBgEEAZdVAQUBAQdATYTo/hz3TJRzFy6dYlTPi/EwL5fMZ5XAVIA4WIj+ +HmwDAQgH/gcDAi05Ryta4lXG/9+5H6+kj44u2Nxs9/84+Yaq5dxIBxl8d5cj/iub +0QvB8xUiEr3+AxofKy4U0I1hgep+1ucS0Px+fJQotwbS0t7RaUZOQa+IeAQYFgoA +IBYhBJJjZfA2z7V7LUgHKFnesOdOIL2ZBQJnj7mCAhsMAAoJEFnesOdOIL2ZnL8A +/Rf4dbJuIr4HhUCmpETEAfbrgb1VHVD+RcuJCFVUyK+ZAP96fCqI6ZBT8SsTz0gR +K08s/F2A8VTKYHyxzIftNMAHBg== +=1L/X +-----END PGP PRIVATE KEY BLOCK-----" +PGP_PASSPHRASE=kGcW5BcuQ7H4eVsfvP1 +# Put it here just to easily set up KV later; not needed to run +PGP_PUBLIC_KEY="-----BEGIN PGP PUBLIC KEY BLOCK----- + +mDMEZ4+5ghYJKwYBBAHaRw8BAQdAT3FAHszcuVoku0YlOyJrgqJf8NmnKc6qKU5N +eHznpx+0LVJlY29yZGluZyBPcmFjbGUgPHJlY29yZGluZy1vcmFjbGVAbG9jYWwu +YXBwPoiTBBMWCgA7FiEEkmNl8DbPtXstSAcoWd6w504gvZkFAmePuYICGwMFCwkI +BwICIgIGFQoJCAsCBBYCAwECHgcCF4AACgkQWd6w504gvZmc7QD+OpbjoXwJwGn/ +3zWr+kjy/RXVX7ceCsb6I0o2Mj0JskUBAP1efhdW6Efq0DsnLYYdKNOU02q5zX2O +mGs95cNvqngLuDgEZ4+5ghIKKwYBBAGXVQEFAQEHQE2E6P4c90yUcxcunWJUz4vx +MC+XzGeVwFSAOFiI/h5sAwEIB4h4BBgWCgAgFiEEkmNl8DbPtXstSAcoWd6w504g +vZkFAmePuYICGwwACgkQWd6w504gvZmcvwD9F/h1sm4ivgeFQKakRMQB9uuBvVUd +UP5Fy4kIVVTIr5kA/3p8KojpkFPxKxPPSBErTyz8XYDxVMpgfLHMh+00wAcG +=CYWX +-----END PGP PUBLIC KEY BLOCK-----" +PGP_PUBLIC_KEY_URL=http://minio:9000/cvat-recording-oracle/pgp-public-key diff --git a/scripts/cvat/Makefile b/scripts/cvat/Makefile deleted file mode 100644 index 03ca3c11fe..0000000000 --- a/scripts/cvat/Makefile +++ /dev/null @@ -1,18 +0,0 @@ -.PHONY: copy-env-files - -copy-env-files: -# Copying .env file for compose itself - @cp ./env-files/.env.compose .env.compose.local -# Copying .env files for backend services - @cp ./env-files/.env.reputation-oracle ./.env.reputation-oracle.local - @cp ./env-files/.env.human-app-server .env.human-app-server.local - @cp ./env-files/.env.job-launcher ./.env.job-launcher.local - @cp ./env-files/.env.exchange-oracle ./.env.exchange-oracle.local - @cp ./env-files/.env.recording-oracle ./.env.recording-oracle.local -# Copying .env files for client apps. -# It should be placed in corresponding app folder -# because used during Docker image build process - @cp ./env-files/.env.human-app-client ../../packages/apps/human-app/frontend/.env.local - @cp ./env-files/.env.job-launcher-client ../../packages/apps/job-launcher/client/.env.local -# Restore original files - @git checkout . > /dev/null 2>&1 \ No newline at end of file diff --git a/scripts/cvat/env-files/.env.compose b/scripts/cvat/env-files/.env.compose deleted file mode 100644 index 01ac15ef8b..0000000000 --- a/scripts/cvat/env-files/.env.compose +++ /dev/null @@ -1,21 +0,0 @@ -MINIO_PORT=9000 - -BACKEND_APPS_INTERNAL_PORT=5000 -REPUTATION_ORACLE_EXPOSED_PORT=5001 -HUMAN_APP_CLIENT_PORT=3001 -JOB_LAUNCHER_CLIENT_PORT=3002 - -HUMAN_APP_SECRET_KEY=sk_local_3Hc0kWL9Y8iwyHucW636Cl7tfFZI0rAUljPEbbfDrok -REPUTATION_ORACLE_JWT_PUBLIC_KEY="-----BEGIN PUBLIC KEY----- -MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEkPekD3q96LHt4IfvY1UY1YukTeEf -K+XryPXhU57nKuhZXBPRrQ+lMDeFpYpHWpGqA/K576n+rDvjbBgHfQiHKg== ------END PUBLIC KEY-----" - -RPC_URL_POLYGON_AMOY=https://rpc-amoy.polygon.technology -# Oracle addresses -REPUTATION_ORACLE_ADDRESS=replace_me -EXCHANGE_ORACLE_ADDRESS=replace_me -RECORDING_ORACLE_ADDRESS=replace_me - -# Might be empty -SUBGRAPH_API_KEY= diff --git a/scripts/cvat/env-files/.env.exchange-oracle b/scripts/cvat/env-files/.env.exchange-oracle deleted file mode 100644 index 6ee37a5497..0000000000 --- a/scripts/cvat/env-files/.env.exchange-oracle +++ /dev/null @@ -1,57 +0,0 @@ -## Polygon Amoy Config -POLYGON_AMOY_PRIVATE_KEY=replace_me - -## Cron Config -## To make environment more convenient with faster updates -PROCESS_JOB_LAUNCHER_WEBHOOKS_INT=10 -PROCESS_RECORDING_ORACLE_WEBHOOKS_INT=10 -TRACK_COMPLETED_PROJECTS_INT=10 -TRACK_COMPLETED_TASKS_INT=10 -TRACK_COMPLETED_ESCROWS_INT=10 -TRACK_CREATING_TASKS_INT=10 -TRACK_ASSIGNMENTS_INT=10 -TRACK_ESCROW_CREATION_INT=100 - -## Features -ENABLE_CUSTOM_CLOUD_HOST="yes" -REQUEST_LOGGING_ENABLED="yes" -PROFILING_ENABLED="yes" - -## Core -DEFAULT_ASSIGNMENT_TIME=600 - -## PGP Keys data -PGP_PRIVATE_KEY="-----BEGIN PGP PRIVATE KEY BLOCK----- - -xYYEZ4+2FxYJKwYBBAHaRw8BAQdAodfgvZwd1/s2tStzumk9T+WhuirhI8AD -eEOG4jdMhdD+CQMI9hA7Uf00eCXgAmMXD7ffmZaIpOjJXd3I4GM8mvKqP2DV -Ts6iDtfTy0f/jqEdTgNoh9Q5Q6uXW3/zAXivDtc7hGaMMA6/ITQsk7tg7LtL -HM0rRXhjaGFuZ2UgT3JhY2xlIDxleGNoYW5nZS1vcmFjbGVAbG9jYWwuYXBw -PsKMBBAWCgA+BYJnj7YXBAsJBwgJkNHy48FpPLsnAxUICgQWAAIBAhkBApsD -Ah4BFiEEydMT95OC9OCzQFjL0fLjwWk8uycAALavAP9RKP8wUxhuFKxFQ7IB -SQTTAZgamwezk0KqEuy6U70UtwEAiWyjFo3Y5oTzaOABs3YTogumq3v+Kmnn -yYNl/UHyZwXHiwRnj7YXEgorBgEEAZdVAQUBAQdA0THKoGl7/bviCOOm0MZ2 -6CSyN/PbPL5j9C6m5T/90GcDAQgH/gkDCBJs91BQdiVL4PZj8WlKnyu+7sBD -p1pKRAqCxx/DDnYWGTFyW8JMgM6bcEfCIl+q5WeO35k1SXFJKUu2Wd1Cl5r1 -kp/DonyJmiRM+Lo/evbCeAQYFgoAKgWCZ4+2FwmQ0fLjwWk8uycCmwwWIQTJ -0xP3k4L04LNAWMvR8uPBaTy7JwAAVCEBAKBllZtzefLZsoE0behnwu5SCnSS -ORb+9kItQJMdBcnWAP9HcsCq3Ve6pOUXBuMWlmQ8IspXQ/oPHdQ7gEJ8+q6H -Bw== -=w1I+ ------END PGP PRIVATE KEY BLOCK-----" -PGP_PASSPHRASE=exc-o-pgp-password -PGP_PUBLIC_KEY="-----BEGIN PGP PUBLIC KEY BLOCK----- - -xjMEZ4+2FxYJKwYBBAHaRw8BAQdAodfgvZwd1/s2tStzumk9T+WhuirhI8AD -eEOG4jdMhdDNK0V4Y2hhbmdlIE9yYWNsZSA8ZXhjaGFuZ2Utb3JhY2xlQGxv -Y2FsLmFwcD7CjAQQFgoAPgWCZ4+2FwQLCQcICZDR8uPBaTy7JwMVCAoEFgAC -AQIZAQKbAwIeARYhBMnTE/eTgvTgs0BYy9Hy48FpPLsnAAC2rwD/USj/MFMY -bhSsRUOyAUkE0wGYGpsHs5NCqhLsulO9FLcBAIlsoxaN2OaE82jgAbN2E6IL -pqt7/ipp58mDZf1B8mcFzjgEZ4+2FxIKKwYBBAGXVQEFAQEHQNExyqBpe/27 -4gjjptDGdugksjfz2zy+Y/QupuU//dBnAwEIB8J4BBgWCgAqBYJnj7YXCZDR -8uPBaTy7JwKbDBYhBMnTE/eTgvTgs0BYy9Hy48FpPLsnAABUIQEAoGWVm3N5 -8tmygTRt6GfC7lIKdJI5Fv72Qi1Akx0FydYA/0dywKrdV7qk5RcG4xaWZDwi -yldD+g8d1DuAQnz6rocH -=AVB0 ------END PGP PUBLIC KEY BLOCK-----" -PGP_PUBLIC_KEY_URL=http://minio:9000/exchange-oracle/pgp-public-key diff --git a/scripts/cvat/env-files/.env.human-app-client b/scripts/cvat/env-files/.env.human-app-client deleted file mode 100644 index c70c0f5f49..0000000000 --- a/scripts/cvat/env-files/.env.human-app-client +++ /dev/null @@ -1,31 +0,0 @@ -VITE_API_URL=http://localhost:5002 -VITE_NETWORK=testnet -# Reown project id -VITE_WALLET_CONNECT_PROJECT_ID=replace_me -VITE_DAPP_ICONS=icon1,icon2 -VITE_DAPP_META_DESCRIPTION=Complete jobs, earn HMT -VITE_DAPP_META_NAME=Human App Local -VITE_DAPP_META_URL=http://localhost:3001 -# Keep it empty -VITE_H_CAPTCHA_EXCHANGE_URL= -# Keep it empty -VITE_H_CAPTCHA_LABELING_BASE_URL= -VITE_H_CAPTCHA_SITE_KEY=10000000-ffff-ffff-ffff-000000000001 -VITE_DAILY_SOLVED_CAPTCHA_LIMIT=0 -VITE_HMT_DAILY_SPENT_LIMIT=0 -VITE_HUMAN_PROTOCOL_HELP_URL=https://docs.humanprotocol.org/ -VITE_HUMAN_PROTOCOL_URL=https://humanprotocol.org/ -VITE_HUMAN_SUPPORT_EMAIL=support@local.app -VITE_NAVBAR__LINK__HOW_IT_WORK_URL=https://humanprotocol.org/ -VITE_NAVBAR__LINK__PROTOCOL_URL=https://humanprotocol.org/ -VITE_PRIVACY_POLICY_URL=http://local.app/privacy-policy/ -VITE_TERMS_OF_SERVICE_URL=http://local.app/terms-and-conditions/ -VITE_H_CAPTCHA_ORACLE_ANNOTATION_TOOL=hcaptcha -VITE_H_CAPTCHA_ORACLE_ROLE=hcaptcha -# Keep it empty -VITE_H_CAPTCHA_ORACLE_ADDRESS= -VITE_H_CAPTCHA_ORACLE_TASK_TYPES=image_points,image_boxes -VITE_FEATURE_FLAG_JOBS_DISCOVERY=true -# Keep it empty -VITE_GOVERNOR_ADDRESS= -VITE_GOVERNANCE_URL= \ No newline at end of file diff --git a/scripts/cvat/env-files/.env.human-app-server b/scripts/cvat/env-files/.env.human-app-server deleted file mode 100644 index f87f8c2440..0000000000 --- a/scripts/cvat/env-files/.env.human-app-server +++ /dev/null @@ -1,13 +0,0 @@ -CHAIN_IDS_ENABLED=80002 -HCAPTCHA_LABELING_STATS_API_URL=disabled -HCAPTCHA_LABELING_VERIFY_API_URL=disabled -HCAPTCHA_LABELING_API_KEY=disabled -# Should be the one you will use to access human-app-server API -ALLOWED_HOST=localhost:5002 -# CORS -CORS_ALLOWED_ORIGIN=* -CORS_ALLOWED_HEADERS='Content-Type,Authorization,X-Requested-With,Accept,Origin' -CORS_ENABLED=true -IS_CACHE_TO_RESTART=false -# FEATURE FLAGS -FEATURE_FLAG_JOBS_DISCOVERY=true diff --git a/scripts/cvat/env-files/.env.job-launcher b/scripts/cvat/env-files/.env.job-launcher deleted file mode 100644 index 9ec113276b..0000000000 --- a/scripts/cvat/env-files/.env.job-launcher +++ /dev/null @@ -1,73 +0,0 @@ -# Database -POSTGRES_DATABASE=job-launcher - -# Web3 -WEB3_PRIVATE_KEY=replace_me - -GAS_PRICE_MULTIPLIER=1 - -# Encryption -PGP_ENCRYPT=true -PGP_PRIVATE_KEY="-----BEGIN PGP PRIVATE KEY BLOCK----- - -xYYEZ4+y/xYJKwYBBAHaRw8BAQdAlIkUUttKB25Zf/g3lf26lU15V4PcS6eM -YiqfFUeyZGn+CQMIW8oNkxnBpSfgI4VBMN4ZamblXNYjg3u6HdSvuPrSjryR -zEVPcE/QPTE+sljRLve2E4MEcGcs9c/JWxmD0Dlq7gpbctghQKkEbViwsj36 -L80lSm9iIExhdW5jaGVyIDxqb2ItbGF1bmNoZXJAbG9jYWwuYXBwPsKMBBAW -CgA+BYJnj7L/BAsJBwgJkFvOlfsfiS2NAxUICgQWAAIBAhkBApsDAh4BFiEE -nhDZweAQiTFNFnMEW86V+x+JLY0AAFrrAQDUTb30NvyMX1rvIAUdX7OnEQFu -u+IkL52ZcvH0lJBHsAEA+iDL/03LCLIDK1g1l2mBZNUudEqncB0i0rAifeli -hwLHiwRnj7L/EgorBgEEAZdVAQUBAQdASe/9TcJE/EnMLYE2K0o/ROxsRDi8 -cRtPEKSNVNLeCB4DAQgH/gkDCHtTPVsCMa9X4H1NkDo5Ijnyp74a2ZklE5l6 -coHvKRndTyT/UwxRPUo38pq3mI5U/bRCvrwFD6ehWWhlsfjm/D0Xsjj7J6jF -uKxZgW+CGwfCeAQYFgoAKgWCZ4+y/wmQW86V+x+JLY0CmwwWIQSeENnB4BCJ -MU0WcwRbzpX7H4ktjQAAZqoBAJ5Llw1V+5i9w9bOTS2NlQDSqtQAClCECEhD -z9cFhU1RAQCBG62i7Cjsy+4RXxubBqVhNWCk02JhSn+vDAYT/TeqBA== -=B2Ed ------END PGP PRIVATE KEY BLOCK-----" -PGP_PASSPHRASE=job-launcher-pgp-password -# Put it here just to easily set up KV later -PGP_PUBLIC_KEY="-----BEGIN PGP PUBLIC KEY BLOCK----- - -xjMEZ4+y/xYJKwYBBAHaRw8BAQdAlIkUUttKB25Zf/g3lf26lU15V4PcS6eM -YiqfFUeyZGnNJUpvYiBMYXVuY2hlciA8am9iLWxhdW5jaGVyQGxvY2FsLmFw -cD7CjAQQFgoAPgWCZ4+y/wQLCQcICZBbzpX7H4ktjQMVCAoEFgACAQIZAQKb -AwIeARYhBJ4Q2cHgEIkxTRZzBFvOlfsfiS2NAABa6wEA1E299Db8jF9a7yAF -HV+zpxEBbrviJC+dmXLx9JSQR7ABAPogy/9NywiyAytYNZdpgWTVLnRKp3Ad -ItKwIn3pYocCzjgEZ4+y/xIKKwYBBAGXVQEFAQEHQEnv/U3CRPxJzC2BNitK -P0TsbEQ4vHEbTxCkjVTS3ggeAwEIB8J4BBgWCgAqBYJnj7L/CZBbzpX7H4kt -jQKbDBYhBJ4Q2cHgEIkxTRZzBFvOlfsfiS2NAABmqgEAnkuXDVX7mL3D1s5N -LY2VANKq1AAKUIQISEPP1wWFTVEBAIEbraLsKOzL7hFfG5sGpWE1YKTTYmFK -f68MBhP9N6oE -=dNxu ------END PGP PUBLIC KEY BLOCK-----" - -HCAPTCHA_RECORDING_ORACLE_URI=disabled -HCAPTCHA_REPUTATION_ORACLE_URI=disabled - -# Auth -JWT_PRIVATE_KEY="-----BEGIN PRIVATE KEY----- -MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQgjwW8ZeWIKizY9pSl -phyKfwYFp3aRHeMuV+jOKp49hX6hRANCAATeitytad5Rh0tx6AP/VHptsRvsZ+Xp -/24PICdk4nsMxZEAe76InmWdqhud13JV76Jl02DVenFEJVM5IjRk+mLG ------END PRIVATE KEY-----" -JWT_PUBLIC_KEY="-----BEGIN PUBLIC KEY----- -MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE3orcrWneUYdLcegD/1R6bbEb7Gfl -6f9uDyAnZOJ7DMWRAHu+iJ5lnaobnddyVe+iZdNg1XpxRCVTOSI0ZPpixg== ------END PUBLIC KEY-----" - -# Stripe -STRIPE_SECRET_KEY=disabled -STRIPE_APP_NAME=Launcher Server Local -STRIPE_APP_VERSION=1.0.0 -STRIPE_APP_INFO_URL=http://local.app - -# Vision -GOOGLE_PROJECT_ID=disabled -GOOGLE_PRIVATE_KEY=disabled -GOOGLE_CLIENT_EMAIL=disabled -GCV_MODERATION_RESULTS_FILES_PATH=disabled -GCV_MODERATION_RESULTS_BUCKET=disabled - -# Slack -SLACK_ABUSE_NOTIFICATION_WEBHOOK_URL=disabled diff --git a/scripts/cvat/env-files/.env.job-launcher-client b/scripts/cvat/env-files/.env.job-launcher-client deleted file mode 100644 index aaa46b98bf..0000000000 --- a/scripts/cvat/env-files/.env.job-launcher-client +++ /dev/null @@ -1,10 +0,0 @@ -VITE_APP_JOB_LAUNCHER_SERVER_URL=http://localhost:5005 -# Reown project id -VITE_APP_WALLETCONNECT_PROJECT_ID=replace_me -VITE_APP_STRIPE_PUBLISHABLE_KEY=disabled -VITE_APP_HCAPTCHA_SITE_KEY=10000000-ffff-ffff-ffff-000000000001 -VITE_APP_HCAPTCHA_EXCHANGE_URL=disabled -VITE_APP_HCAPTCHA_LABELING_BASE_URL=disabled -VITE_APP_ENVIRONMENT=testnet -VITE_APP_RPC_URL_POLYGON_AMOY=https://rpc-amoy.polygon.technology -VITE_APP_SUPPORTED_CHAINS=80002 diff --git a/scripts/cvat/env-files/.env.recording-oracle b/scripts/cvat/env-files/.env.recording-oracle deleted file mode 100644 index bf0805d59d..0000000000 --- a/scripts/cvat/env-files/.env.recording-oracle +++ /dev/null @@ -1,44 +0,0 @@ -# Polygon Amoy -POLYGON_AMOY_PRIVATE_KEY=replace_me - -# Cron jobs -PROCESS_EXCHANGE_ORACLE_WEBHOOKS_INT=10 -PROCESS_REPUTATION_ORACLE_WEBHOOKS_INT=10 - -# Features -ENABLE_CUSTOM_CLOUD_HOST="yes" - - -# Encryption -PGP_PRIVATE_KEY="-----BEGIN PGP PRIVATE KEY BLOCK----- - -xYYEZ+KclxYJKwYBBAHaRw8BAQdAQmPWFqgCHKBl5orZ14BjdEge9LL3VbyJ -kXqRRe7xJkv+CQMIk7BjanLIRJrgAkRNCk3U5RwAyZax53wbK8NfV+2i7cjY -NFkbiOK8yuq+QG0T/PoKyXFOa126gwsBTlKmyPT5/am8rTFf6k39NzCn8f7D -y80AwowEEBYKAD4FgmfinJcECwkHCAmQ0JGHkZYk1mYDFQgKBBYAAgECGQEC -mwMCHgEWIQQcpeN3tBh8ex2F8HjQkYeRliTWZgAADaMA/0wSvCfUTDYN3gzn -HDDdmqEqg+ji5NTUNjj3jVtLm+XeAP4v2KpGFWXQnCcexTf1USll9ddZC/6H -ZlcFmCuvWX/1B8eLBGfinJcSCisGAQQBl1UBBQEBB0DSGXpmTLBqiPz59qLa -Cuarsa6Q09QJKB6GSEa3Me4zSAMBCAf+CQMI+V7xRESw/5Hg2tbHs6q0oWuF -/jMu2bLAu4n+C5tw+7eZK5imqu9iocp/ZRMBAQgTp/VIUbFopHk18THVGZKE -Vh5zLxinmAP4zkMPm8SsCcJ4BBgWCgAqBYJn4pyXCZDQkYeRliTWZgKbDBYh -BByl43e0GHx7HYXweNCRh5GWJNZmAAAz0wEAgXxWZUkSDk1HfVGb77/jR562 -Kt8i8+ZdOuY7CehB7JIBAPip5C1mea5bxHrOHt/BzUC0oWcvP+U4W6K6Ccdy -/8UO -=IMpo ------END PGP PRIVATE KEY BLOCK-----" -PGP_PASSPHRASE=rec-o-pgp-password -PGP_PUBLIC_KEY="-----BEGIN PGP PUBLIC KEY BLOCK----- - -xjMEZ+KclxYJKwYBBAHaRw8BAQdAQmPWFqgCHKBl5orZ14BjdEge9LL3VbyJ -kXqRRe7xJkvNAMKMBBAWCgA+BYJn4pyXBAsJBwgJkNCRh5GWJNZmAxUICgQW -AAIBAhkBApsDAh4BFiEEHKXjd7QYfHsdhfB40JGHkZYk1mYAAA2jAP9MErwn -1Ew2Dd4M5xww3ZqhKoPo4uTU1DY4941bS5vl3gD+L9iqRhVl0JwnHsU39VEp -ZfXXWQv+h2ZXBZgrr1l/9QfOOARn4pyXEgorBgEEAZdVAQUBAQdA0hl6Zkyw -aoj8+fai2grmq7GukNPUCSgehkhGtzHuM0gDAQgHwngEGBYKACoFgmfinJcJ -kNCRh5GWJNZmApsMFiEEHKXjd7QYfHsdhfB40JGHkZYk1mYAADPTAQCBfFZl -SRIOTUd9UZvvv+NHnrYq3yLz5l065jsJ6EHskgEA+KnkLWZ5rlvEes4e38HN -QLShZy8/5ThboroJx3L/xQ4= -=eS/4 ------END PGP PUBLIC KEY BLOCK-----" -PGP_PUBLIC_KEY_URL=http://minio:9000/recording-oracle/pgp-public-key diff --git a/scripts/cvat/env-files/.env.reputation-oracle b/scripts/cvat/env-files/.env.reputation-oracle deleted file mode 100644 index e597c5c08e..0000000000 --- a/scripts/cvat/env-files/.env.reputation-oracle +++ /dev/null @@ -1,55 +0,0 @@ -# Auth -JWT_PRIVATE_KEY="-----BEGIN PRIVATE KEY----- -MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQg9T4TcNz4sFIvOZTE -wBHX986G90H20Cryp4++7APQfu6hRANCAASQ96QPer3ose3gh+9jVRjVi6RN4R8r -5evI9eFTnucq6FlcE9GtD6UwN4WlikdakaoD8rnvqf6sO+NsGAd9CIcq ------END PRIVATE KEY-----" - -# web3 -WEB3_PRIVATE_KEY=replace_me - -# Encryption -PGP_ENCRYPT=true -PGP_PRIVATE_KEY="-----BEGIN PGP PRIVATE KEY BLOCK----- - -xYYEZ4+FFhYJKwYBBAHaRw8BAQdA/BEzpkXk107UOpQrUro20UxYryOW4g8x -yAXIh2cH5ff+CQMI0h7UaI9LgBXgKHJF0y9LMaRyjZwkKYQa/yn5T1pfkgTn -T2piULy9a+2w8EWyve2cv8zMBtZAcno75sV0X3BbMpkf9ru8hOoWQvkv8arN -Wc01UmVwdXRhdGlvbiBPcmFjbGUgTG9jYWwgPHJlcHV0YXRpb24tb3JhY2xl -QGxvY2FsLmFwcD7CjAQQFgoAPgWCZ4+FFgQLCQcICZCe6Z27JtHYsAMVCAoE -FgACAQIZAQKbAwIeARYhBMXQP7WbhM4roaDkzZ7pnbsm0diwAACDdAEAkLuS -rUp2eLBD2MEBP96wU8FqIUGsyju5Esd+yS7VGzIBAO8hmR8QEwk/+P2lKqLg -6lgQnT0xubb7PqcNmJNoSX8Hx4sEZ4+FFhIKKwYBBAGXVQEFAQEHQJHtNaFR -30ahNwXuUoYRyIA22K3B686H+mZCF5Nfy6JDAwEIB/4JAwj2Ltq6kZ0KfuC6 -78oX1t2wh/ZYJA9hZRa+8qyizfHZ9WKe7IWEXBW8yRc4IHNL0nYFCF5w5zoc -NMHddSoQdIWhja8s5odZqA0uV1YaDHuOwngEGBYKACoFgmePhRYJkJ7pnbsm -0diwApsMFiEExdA/tZuEziuhoOTNnumduybR2LAAAFNTAQDL0L2pHyi6CPPV -fw6LtGasCu9iLT59kNj+gUabWgYVtQEApNxRcbFcYRyqmFjDDNXtyZhZB8Jj -F8tN26blow3txgI= -=68Rz ------END PGP PRIVATE KEY BLOCK-----" -PGP_PASSPHRASE=rep-o-pgp-password -# Put it here just to easily set up KV later -PGP_PUBLIC_KEY="-----BEGIN PGP PUBLIC KEY BLOCK----- - -xjMEZ4+FFhYJKwYBBAHaRw8BAQdA/BEzpkXk107UOpQrUro20UxYryOW4g8x -yAXIh2cH5ffNNVJlcHV0YXRpb24gT3JhY2xlIExvY2FsIDxyZXB1dGF0aW9u -LW9yYWNsZUBsb2NhbC5hcHA+wowEEBYKAD4FgmePhRYECwkHCAmQnumduybR -2LADFQgKBBYAAgECGQECmwMCHgEWIQTF0D+1m4TOK6Gg5M2e6Z27JtHYsAAA -g3QBAJC7kq1KdniwQ9jBAT/esFPBaiFBrMo7uRLHfsku1RsyAQDvIZkfEBMJ -P/j9pSqi4OpYEJ09Mbm2+z6nDZiTaEl/B844BGePhRYSCisGAQQBl1UBBQEB -B0CR7TWhUd9GoTcF7lKGEciANtitwevOh/pmQheTX8uiQwMBCAfCeAQYFgoA -KgWCZ4+FFgmQnumduybR2LACmwwWIQTF0D+1m4TOK6Gg5M2e6Z27JtHYsAAA -U1MBAMvQvakfKLoI89V/Dou0ZqwK72ItPn2Q2P6BRptaBhW1AQCk3FFxsVxh -HKqYWMMM1e3JmFkHwmMXy03bpuWjDe3GAg== -=pqBc ------END PGP PUBLIC KEY BLOCK-----" - -KYC_API_KEY=disabled -KYC_API_PRIVATE_KEY=none - -NDA_URL=https://humanprotocol.org - -ABUSE_SLACK_WEBHOOK_URL=http://disabled-for-local.app -ABUSE_SLACK_SIGNING_SECRET=disabled -ABUSE_SLACK_OAUTH_TOKEN=disabled \ No newline at end of file diff --git a/scripts/cvat/initdb/create-dbs.sql b/scripts/cvat/initdb/create-dbs.sql deleted file mode 100644 index 3b5f93e98e..0000000000 --- a/scripts/cvat/initdb/create-dbs.sql +++ /dev/null @@ -1,4 +0,0 @@ -CREATE DATABASE "reputation-oracle"; -CREATE DATABASE "exchange-oracle"; -CREATE DATABASE "recording-oracle"; -CREATE DATABASE "job-launcher"; diff --git a/scripts/fortune/.env.jl-server b/scripts/fortune/.env.jl-server index f110c2637d..dbb026aa83 100644 --- a/scripts/fortune/.env.jl-server +++ b/scripts/fortune/.env.jl-server @@ -2,7 +2,7 @@ NODE_ENV=development HOST=localhost PORT=5000 -FE_URL=http://localhost:3005 +FE_URL=http://localhost:3002 SESSION_SECRET=test # Database diff --git a/yarn.lock b/yarn.lock index e10b08aa6b..387e52425f 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3973,7 +3973,10 @@ __metadata: version: 0.0.0-use.local resolution: "@human-protocol/fortune-exchange-oracle-client@workspace:packages/apps/fortune/exchange-oracle/client" dependencies: + "@emotion/react": "npm:^11.11.3" + "@emotion/styled": "npm:^11.11.0" "@human-protocol/sdk": "workspace:^" + "@mui/icons-material": "npm:^7.0.1" "@mui/material": "npm:^5.16.7" "@tanstack/query-sync-storage-persister": "npm:^5.68.0" "@tanstack/react-query": "npm:^5.67.2" @@ -4011,27 +4014,42 @@ __metadata: "@nestjs/axios": "npm:^3.1.2" "@nestjs/cli": "npm:^10.3.2" "@nestjs/common": "npm:^10.2.7" + "@nestjs/config": "npm:^3.1.1" "@nestjs/core": "npm:^10.3.10" + "@nestjs/passport": "npm:^10.0.0" + "@nestjs/platform-express": "npm:^10.3.10" + "@nestjs/schedule": "npm:^4.0.1" "@nestjs/schematics": "npm:^11.0.2" + "@nestjs/swagger": "npm:^7.4.2" "@nestjs/terminus": "npm:^11.0.0" "@nestjs/testing": "npm:^10.4.6" "@nestjs/typeorm": "npm:^10.0.1" + "@types/body-parser": "npm:^1" "@types/express": "npm:^4.17.13" "@types/jest": "npm:29.5.12" + "@types/jsonwebtoken": "npm:^9.0.7" "@types/node": "npm:22.10.5" + "@types/passport": "npm:^0" + "@types/passport-jwt": "npm:^4.0.1" "@types/pg": "npm:8.11.10" "@types/supertest": "npm:^6.0.2" "@typescript-eslint/eslint-plugin": "npm:^5.0.0" "@typescript-eslint/parser": "npm:^5.0.0" axios: "npm:^1.3.1" + body-parser: "npm:^1.20.3" class-transformer: "npm:^0.5.1" class-validator: "npm:0.14.1" + dotenv: "npm:^16.3.2" eslint: "npm:^8.55.0" eslint-config-prettier: "npm:^9.1.0" eslint-plugin-prettier: "npm:^5.2.1" ethers: "npm:~6.13.5" jest: "npm:29.7.0" joi: "npm:^17.13.3" + jsonwebtoken: "npm:^9.0.2" + minio: "npm:7.1.3" + passport: "npm:^0.7.0" + passport-jwt: "npm:^4.0.1" pg: "npm:8.13.1" prettier: "npm:^3.4.2" reflect-metadata: "npm:^0.2.2" @@ -4057,6 +4075,7 @@ __metadata: "@nestjs/common": "npm:^10.2.7" "@nestjs/config": "npm:^3.1.1" "@nestjs/core": "npm:^10.3.10" + "@nestjs/platform-express": "npm:^10.3.10" "@nestjs/schematics": "npm:^11.0.2" "@nestjs/swagger": "npm:^7.4.2" "@nestjs/testing": "npm:^10.4.6" @@ -4064,10 +4083,14 @@ __metadata: "@types/node": "npm:^22.15.16" axios: "npm:^1.3.1" body-parser: "npm:^1.20.2" + class-transformer: "npm:^0.5.1" class-validator: "npm:0.14.1" + dotenv: "npm:^16.3.2" eslint: "npm:^8.55.0" helmet: "npm:^7.1.0" jest: "npm:^29.7.0" + joi: "npm:^17.13.3" + minio: "npm:7.1.3" prettier: "npm:^3.4.2" reflect-metadata: "npm:^0.2.2" rxjs: "npm:^7.2.0" @@ -4301,6 +4324,7 @@ __metadata: class-transformer: "npm:^0.5.1" class-validator: "npm:0.14.1" decimal.js: "npm:^10.4.3" + dotenv: "npm:^16.3.2" eslint: "npm:^8.55.0" eslint-config-prettier: "npm:^9.1.0" eslint-plugin-prettier: "npm:^5.2.1" @@ -4308,6 +4332,7 @@ __metadata: jest: "npm:29.7.0" joi: "npm:^17.13.3" json-stable-stringify: "npm:^1.2.1" + minio: "npm:7.1.3" nestjs-minio-client: "npm:^2.2.0" node-cache: "npm:^5.1.2" passport: "npm:^0.7.0" @@ -9336,7 +9361,7 @@ __metadata: languageName: node linkType: hard -"@types/body-parser@npm:*": +"@types/body-parser@npm:*, @types/body-parser@npm:^1": version: 1.19.5 resolution: "@types/body-parser@npm:1.19.5" dependencies: @@ -9882,6 +9907,15 @@ __metadata: languageName: node linkType: hard +"@types/passport@npm:^0": + version: 0.4.7 + resolution: "@types/passport@npm:0.4.7" + dependencies: + "@types/express": "npm:*" + checksum: 10c0/58ca21800b7910385961b7a3dc9071fc9db6223242b96ff88d16c9d004ce7173524e7c17c63363595565af3f85ad932ee301efc8cc3e378bea172eebc9e07703 + languageName: node + linkType: hard + "@types/pbkdf2@npm:^3.0.0": version: 3.1.2 resolution: "@types/pbkdf2@npm:3.1.2"