From 8000886e72ca5c0c7dcdbd1fdf7892765c7776b1 Mon Sep 17 00:00:00 2001 From: Keyan <34140557+huumn@users.noreply.github.com> Date: Wed, 31 Jul 2024 19:44:08 -0500 Subject: [PATCH] dont expect unrun services in dev (#1279) --- .env.development | 3 +-- README.md | 24 +++++++++++------------- api/resolvers/blockHeight.js | 2 ++ docker-compose.yml | 2 ++ lib/sndev.js | 6 ++++++ sndev | 11 ++++++----- worker/index.js | 35 +++++++++++++++++++++-------------- 7 files changed, 49 insertions(+), 34 deletions(-) create mode 100644 lib/sndev.js diff --git a/.env.development b/.env.development index b52e346e..a943f72f 100644 --- a/.env.development +++ b/.env.development @@ -1,6 +1,7 @@ PRISMA_SLOW_LOGS_MS= GRAPHQL_SLOW_LOGS_MS= NODE_ENV=development +COMPOSE_PROFILES='minimal,images,search,payments,wallets,email,capture' ############################################################################ # OPTIONAL SECRETS # @@ -114,8 +115,6 @@ POSTGRES_DB=stackernews # opensearch container stuff OPENSEARCH_INITIAL_ADMIN_PASSWORD=mVchg1T5oA9wudUh -plugins.security.disabled=true -discovery.type=single-node DISABLE_SECURITY_DASHBOARDS_PLUGIN=true # bitcoind container stuff diff --git a/README.md b/README.md index 093fb034..cb259286 100644 --- a/README.md +++ b/README.md @@ -76,6 +76,7 @@ COMMANDS sn: login login as a nym + fund_user fund a nym without using an LN invoice lnd: fund pay a bolt11 for funding @@ -92,12 +93,14 @@ COMMANDS dev: pr fetch and checkout a pr lint run linters + open open container url in browser other: compose docker compose passthrough sn_lndcli lncli passthrough on sn_lnd stacker_lndcli lncli passthrough on stacker_lnd stacker_clncli lightning-cli passthrough on stacker_cln + stacker_litcli litcli passthrough on litd ``` @@ -105,23 +108,16 @@ COMMANDS #### Running specific services -By default all services will be run. If you want to exclude specific services from running, set `COMPOSE_PROFILES` to use one or more of `minimal|images|search|payments|wallets|email|capture`. To only run mininal services without images, search, email, wallets, or payments: +By default all services will be run. If you want to exclude specific services from running, set `COMPOSE_PROFILES` in a `.env.local` file to one or more of `minimal,images,search,payments,wallets,email,capture`. To only run mininal necessary without things like payments in `.env.local`: -```sh -$ COMPOSE_PROFILES=minimal ./sndev start -``` - -Or, as I would recommend: - -```sh -$ export COMPOSE_PROFILES=minimal -$ ./sndev start +```.env +COMPOSE_PROFILES=minimal ``` To run with images and payments services: -```sh -$ COMPOSE_PROFILES=images,payments ./sndev start +```.env +COMPOSE_PROFILES=images,payments ``` #### Merging compose files @@ -460,7 +456,9 @@ In addition, we run other critical services the above services interact with lik ## Wallet transaction safety -To ensure stackers balances are kept sane, all wallet updates are run in [serializable transactions](https://www.postgresql.org/docs/current/transaction-iso.html#XACT-SERIALIZABLE) at the database level. Because early versions of prisma had relatively poor support for transactions most wallet touching code is written in [plpgsql](https://www.postgresql.org/docs/current/plpgsql.html) stored procedures and can be found in the `prisma/migrations` folder. +To ensure stackers balances are kept sane, some wallet updates are run in [serializable transactions](https://www.postgresql.org/docs/current/transaction-iso.html#XACT-SERIALIZABLE) at the database level. Because early versions of prisma had relatively poor support for transactions most wallet touching code is written in [plpgsql](https://www.postgresql.org/docs/current/plpgsql.html) stored procedures and can be found in the `prisma/migrations` folder. + +*UPDATE*: Most wallet updates are now run in [read committed](https://www.postgresql.org/docs/current/transaction-iso.html#XACT-READ-COMMITTED) transactions. See `api/paidAction/README.md` for more information.
diff --git a/api/resolvers/blockHeight.js b/api/resolvers/blockHeight.js index 0be9a0ea..dc702ee6 100644 --- a/api/resolvers/blockHeight.js +++ b/api/resolvers/blockHeight.js @@ -1,11 +1,13 @@ import lndService from 'ln-service' import lnd from '@/api/lnd' +import { isServiceEnabled } from '@/lib/sndev' const cache = new Map() const expiresIn = 1000 * 30 // 30 seconds in milliseconds async function fetchBlockHeight () { let blockHeight = 0 + if (!isServiceEnabled('payments')) return blockHeight try { const height = await lndService.getHeight({ lnd }) blockHeight = height.current_block_height diff --git a/docker-compose.yml b/docker-compose.yml index 5b0b4b89..5c0975d5 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -150,6 +150,8 @@ services: env_file: *env_file environment: - OPENSEARCH_INITIAL_ADMIN_PASSWORD=mVchg1T5oA9wudUh + - plugins.security.disabled=true + - discovery.type=single-node ports: - 9200:9200 # REST API - 9600:9600 # Performance Analyzer diff --git a/lib/sndev.js b/lib/sndev.js new file mode 100644 index 00000000..b2d74b77 --- /dev/null +++ b/lib/sndev.js @@ -0,0 +1,6 @@ +export function isServiceEnabled (service) { + if (process.env.NODE_ENV !== 'development') return true + + const services = (process.env.COMPOSE_PROFILES ?? '').split(',') + return services.includes(service) +} diff --git a/sndev b/sndev index e89a7172..2712f2e1 100755 --- a/sndev +++ b/sndev @@ -1,6 +1,11 @@ #!/bin/sh set -e +set -a # automatically export all variables +. .env.development +if [ -f .env.local ]; then + . .env.local +fi docker__compose() { if [ ! -x "$(command -v docker)" ]; then @@ -9,16 +14,12 @@ docker__compose() { exit 0 fi - if [ -z "$COMPOSE_PROFILES" ]; then - COMPOSE_PROFILES="images,search,payments,wallets,email,capture" - fi - ENV_LOCAL= if [ -f .env.local ]; then ENV_LOCAL='--env-file .env.local' fi - CURRENT_UID=$(id -u) CURRENT_GID=$(id -g) COMPOSE_PROFILES=$COMPOSE_PROFILES command docker compose --env-file .env.development $ENV_LOCAL "$@" + CURRENT_UID=$(id -u) CURRENT_GID=$(id -g) command docker compose --env-file .env.development $ENV_LOCAL "$@" } docker__exec() { diff --git a/worker/index.js b/worker/index.js index e856c295..c201d4ed 100644 --- a/worker/index.js +++ b/worker/index.js @@ -27,6 +27,7 @@ import { saltAndHashEmails } from './saltAndHashEmails.js' import { remindUser } from './reminder.js' import { holdAction, settleAction, settleActionError } from './paidAction.js' import { thisDay } from './thisDay.js' +import { isServiceEnabled } from '@/lib/sndev.js' const { loadEnvConfig } = nextEnv const { ApolloClient, HttpLink, InMemoryCache } = apolloClient @@ -82,17 +83,29 @@ async function work () { await boss.start() - await subscribeToWallet(args) - await boss.work('finalizeHodlInvoice', jobWrapper(finalizeHodlInvoice)) - await boss.work('checkPendingDeposits', jobWrapper(checkPendingDeposits)) - await boss.work('checkPendingWithdrawals', jobWrapper(checkPendingWithdrawals)) - await boss.work('autoDropBolt11s', jobWrapper(autoDropBolt11s)) - await boss.work('autoWithdraw', jobWrapper(autoWithdraw)) + if (isServiceEnabled('payments')) { + await subscribeToWallet(args) + await boss.work('finalizeHodlInvoice', jobWrapper(finalizeHodlInvoice)) + await boss.work('checkPendingDeposits', jobWrapper(checkPendingDeposits)) + await boss.work('checkPendingWithdrawals', jobWrapper(checkPendingWithdrawals)) + await boss.work('autoDropBolt11s', jobWrapper(autoDropBolt11s)) + await boss.work('autoWithdraw', jobWrapper(autoWithdraw)) + await boss.work('settleActionError', jobWrapper(settleActionError)) + await boss.work('settleAction', jobWrapper(settleAction)) + await boss.work('checkInvoice', jobWrapper(checkInvoice)) + await boss.work('holdAction', jobWrapper(holdAction)) + } + if (isServiceEnabled('search')) { + await boss.work('indexItem', jobWrapper(indexItem)) + await boss.work('indexAllItems', jobWrapper(indexAllItems)) + } + if (isServiceEnabled('images')) { + await boss.work('imgproxy', jobWrapper(imgproxy)) + await boss.work('deleteUnusedImages', jobWrapper(deleteUnusedImages)) + } await boss.work('repin-*', jobWrapper(repin)) await boss.work('trust', jobWrapper(trust)) await boss.work('timestampItem', jobWrapper(timestampItem)) - await boss.work('indexItem', jobWrapper(indexItem)) - await boss.work('indexAllItems', jobWrapper(indexAllItems)) await boss.work('auction', jobWrapper(auction)) await boss.work('earn', jobWrapper(earn)) await boss.work('streak', jobWrapper(computeStreaks)) @@ -100,18 +113,12 @@ async function work () { await boss.work('nip57', jobWrapper(nip57)) await boss.work('views-*', jobWrapper(views)) await boss.work('rankViews', jobWrapper(rankViews)) - await boss.work('imgproxy', jobWrapper(imgproxy)) await boss.work('deleteItem', jobWrapper(deleteItem)) - await boss.work('deleteUnusedImages', jobWrapper(deleteUnusedImages)) await boss.work('territoryBilling', jobWrapper(territoryBilling)) await boss.work('territoryRevenue', jobWrapper(territoryRevenue)) await boss.work('ofac', jobWrapper(ofac)) await boss.work('saltAndHashEmails', jobWrapper(saltAndHashEmails)) await boss.work('reminder', jobWrapper(remindUser)) - await boss.work('settleActionError', jobWrapper(settleActionError)) - await boss.work('settleAction', jobWrapper(settleAction)) - await boss.work('holdAction', jobWrapper(holdAction)) - await boss.work('checkInvoice', jobWrapper(checkInvoice)) await boss.work('thisDay', jobWrapper(thisDay)) console.log('working jobs')