From 5b0361fb1c52a8a65efad275b1069b2888ca4d56 Mon Sep 17 00:00:00 2001 From: kaladinlight <35275952+kaladinlight@users.noreply.github.com> Date: Mon, 19 Jan 2026 10:59:35 -0700 Subject: [PATCH 1/5] user service railway config --- apps/user-service/railway.toml | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) create mode 100644 apps/user-service/railway.toml diff --git a/apps/user-service/railway.toml b/apps/user-service/railway.toml new file mode 100644 index 0000000..80b622b --- /dev/null +++ b/apps/user-service/railway.toml @@ -0,0 +1,16 @@ +[build] +builder = "DOCKERFILE" +dockerfilePath = "../../Dockerfile" +dockerContext = "../../" + +[build.args] +COINSTACK = "user-service" + +[deploy] +numReplicas=1 +preDeployCommand = "./node_modules/.bin/prisma migrate deploy" +startCommand = "yarn start:prod" +#healthcheckPath = "/health" +#healthcheckTimeout = 30 +restartPolicyType = "ON_FAILURE" +restartPolicyMaxRetries = 3 From 44a46d663d58190901af2a908e63fe420749851d Mon Sep 17 00:00:00 2001 From: kaladinlight <35275952+kaladinlight@users.noreply.github.com> Date: Mon, 19 Jan 2026 11:36:31 -0700 Subject: [PATCH 2/5] railpack test --- apps/user-service/railway.toml | 19 ++++++++----------- Dockerfile => d | 0 2 files changed, 8 insertions(+), 11 deletions(-) rename Dockerfile => d (100%) diff --git a/apps/user-service/railway.toml b/apps/user-service/railway.toml index 80b622b..54ecb91 100644 --- a/apps/user-service/railway.toml +++ b/apps/user-service/railway.toml @@ -1,16 +1,13 @@ [build] -builder = "DOCKERFILE" -dockerfilePath = "../../Dockerfile" -dockerContext = "../../" - -[build.args] -COINSTACK = "user-service" +builder = "railpack" +buildCommand = "yarn build" +watchPatterns = ["apps/user-service/**", "packages/**"] [deploy] -numReplicas=1 -preDeployCommand = "./node_modules/.bin/prisma migrate deploy" -startCommand = "yarn start:prod" -#healthcheckPath = "/health" -#healthcheckTimeout = 30 +preDeployCommand = "cd apps/user-service && ./node_modules/.bin/prisma migrate deploy" +startCommand = "cd apps/user-service && yarn start:prod" restartPolicyType = "ON_FAILURE" restartPolicyMaxRetries = 3 + +[deploy.multiRegionConfig] +us-west2 = { numReplicas = 1 } diff --git a/Dockerfile b/d similarity index 100% rename from Dockerfile rename to d From 69c0189459278698d6b31ad8ea4473f5e590a4ff Mon Sep 17 00:00:00 2001 From: kaladinlight <35275952+kaladinlight@users.noreply.github.com> Date: Mon, 19 Jan 2026 12:57:59 -0700 Subject: [PATCH 3/5] update swap service and notifications service and remove pulumi --- Dockerfile.dev | 7 --- apps/notifications-service/pulumi/Pulumi.yaml | 3 -- apps/notifications-service/pulumi/index.ts | 53 ------------------- .../notifications-service/pulumi/package.json | 9 ---- .../pulumi/tsconfig.json | 7 --- apps/notifications-service/railway.toml | 13 +++++ apps/swap-service/pulumi/Pulumi.yaml | 3 -- apps/swap-service/pulumi/index.ts | 53 ------------------- apps/swap-service/pulumi/package.json | 9 ---- apps/swap-service/pulumi/tsconfig.json | 7 --- apps/swap-service/railway.toml | 13 +++++ apps/user-service/pulumi/Pulumi.yaml | 3 -- apps/user-service/pulumi/index.ts | 53 ------------------- apps/user-service/pulumi/package.json | 9 ---- apps/user-service/pulumi/tsconfig.json | 7 --- apps/user-service/railway.toml | 2 +- d | 43 --------------- docker-compose.yml | 37 +++++-------- 18 files changed, 40 insertions(+), 291 deletions(-) delete mode 100644 Dockerfile.dev delete mode 100644 apps/notifications-service/pulumi/Pulumi.yaml delete mode 100644 apps/notifications-service/pulumi/index.ts delete mode 100644 apps/notifications-service/pulumi/package.json delete mode 100644 apps/notifications-service/pulumi/tsconfig.json create mode 100644 apps/notifications-service/railway.toml delete mode 100644 apps/swap-service/pulumi/Pulumi.yaml delete mode 100644 apps/swap-service/pulumi/index.ts delete mode 100644 apps/swap-service/pulumi/package.json delete mode 100644 apps/swap-service/pulumi/tsconfig.json create mode 100644 apps/swap-service/railway.toml delete mode 100644 apps/user-service/pulumi/Pulumi.yaml delete mode 100644 apps/user-service/pulumi/index.ts delete mode 100644 apps/user-service/pulumi/package.json delete mode 100644 apps/user-service/pulumi/tsconfig.json delete mode 100644 d diff --git a/Dockerfile.dev b/Dockerfile.dev deleted file mode 100644 index 2c23e99..0000000 --- a/Dockerfile.dev +++ /dev/null @@ -1,7 +0,0 @@ -FROM node:22-alpine - -RUN corepack enable - -USER node - -WORKDIR /workspace diff --git a/apps/notifications-service/pulumi/Pulumi.yaml b/apps/notifications-service/pulumi/Pulumi.yaml deleted file mode 100644 index 81c29b9..0000000 --- a/apps/notifications-service/pulumi/Pulumi.yaml +++ /dev/null @@ -1,3 +0,0 @@ -name: notifications-service -runtime: nodejs -description: shapeshift notifications service diff --git a/apps/notifications-service/pulumi/index.ts b/apps/notifications-service/pulumi/index.ts deleted file mode 100644 index 1122f24..0000000 --- a/apps/notifications-service/pulumi/index.ts +++ /dev/null @@ -1,53 +0,0 @@ -import { readFileSync } from 'fs'; -import { execSync } from 'child_process'; -import * as k8s from '@pulumi/kubernetes'; -import { - Outputs, - getConfig, - deployApi, - createSecret, - DeployApiArgs, -} from '@shapeshiftoss/unchained-pulumi'; - -//https://www.pulumi.com/docs/intro/languages/javascript/#entrypoint -export = async (): Promise => { - const appName = 'shapeshift'; - const coinstack = 'notifications-service'; - - const { kubeconfig, config, namespace } = await getConfig(); - const sampleEnv = readFileSync('../.env.example'); - - const assetName = config.assetName; - const provider = new k8s.Provider('kube-provider', { kubeconfig }); - - createSecret({ name: assetName, env: sampleEnv, namespace }, { provider }); - - const gitRoot = execSync('git rev-parse --show-toplevel', { encoding: 'utf8' }).trim(); - const gitSha = execSync( - `git -C ${gitRoot} log -1 --format=%h -- Dockerfile package.json yarn.lock apps/${coinstack} packages/`, - { encoding: 'utf8' }, - ).trim(); - - const docker: DeployApiArgs['docker'] = { - context: '../../../', - tag: gitSha, - command: [ - 'sh', - '-c', - './node_modules/.bin/prisma migrate deploy && yarn start:prod', - ], - }; - - await deployApi({ - appName, - assetName, - coinstack, - config, - docker, - namespace, - provider, - sampleEnv, - }); - - return {}; -}; diff --git a/apps/notifications-service/pulumi/package.json b/apps/notifications-service/pulumi/package.json deleted file mode 100644 index 4117e02..0000000 --- a/apps/notifications-service/pulumi/package.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "name": "@shapeshift/notifications-service-pulumi", - "version": "0.0.1", - "license": "UNLICENSED", - "private": true, - "scripts": { - "clean": "rm -rf node_modules" - } -} diff --git a/apps/notifications-service/pulumi/tsconfig.json b/apps/notifications-service/pulumi/tsconfig.json deleted file mode 100644 index 3823091..0000000 --- a/apps/notifications-service/pulumi/tsconfig.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "extends": "../../../tsconfig.json", - "compilerOptions": { - "outDir": "dist", - }, - "include": ["./"] -} diff --git a/apps/notifications-service/railway.toml b/apps/notifications-service/railway.toml new file mode 100644 index 0000000..ab7789d --- /dev/null +++ b/apps/notifications-service/railway.toml @@ -0,0 +1,13 @@ +[build] +builder = "railpack" +buildCommand = "yarn build" +watchPatterns = ["apps/notifications-service/**", "packages/**"] + +[deploy] +preDeployCommand = "cd apps/notifications-service && yarn db:migrate" +startCommand = "cd apps/notifications-service && yarn start:prod" +restartPolicyType = "ON_FAILURE" +restartPolicyMaxRetries = 3 + +[deploy.multiRegionConfig] +us-west2 = { numReplicas = 1 } diff --git a/apps/swap-service/pulumi/Pulumi.yaml b/apps/swap-service/pulumi/Pulumi.yaml deleted file mode 100644 index b56fd66..0000000 --- a/apps/swap-service/pulumi/Pulumi.yaml +++ /dev/null @@ -1,3 +0,0 @@ -name: swap-service -runtime: nodejs -description: shapeshift swap service diff --git a/apps/swap-service/pulumi/index.ts b/apps/swap-service/pulumi/index.ts deleted file mode 100644 index 2d8057b..0000000 --- a/apps/swap-service/pulumi/index.ts +++ /dev/null @@ -1,53 +0,0 @@ -import { readFileSync } from 'fs'; -import { execSync } from 'child_process'; -import * as k8s from '@pulumi/kubernetes'; -import { - Outputs, - getConfig, - deployApi, - createSecret, - DeployApiArgs, -} from '@shapeshiftoss/unchained-pulumi'; - -//https://www.pulumi.com/docs/intro/languages/javascript/#entrypoint -export = async (): Promise => { - const appName = 'shapeshift'; - const coinstack = 'swap-service'; - - const { kubeconfig, config, namespace } = await getConfig(); - const sampleEnv = readFileSync('../.env.example'); - - const assetName = config.assetName; - const provider = new k8s.Provider('kube-provider', { kubeconfig }); - - createSecret({ name: assetName, env: sampleEnv, namespace }, { provider }); - - const gitRoot = execSync('git rev-parse --show-toplevel', { encoding: 'utf8' }).trim(); - const gitSha = execSync( - `git -C ${gitRoot} log -1 --format=%h -- Dockerfile package.json yarn.lock apps/${coinstack} packages/`, - { encoding: 'utf8' }, - ).trim(); - - const docker: DeployApiArgs['docker'] = { - context: '../../../', - tag: gitSha, - command: [ - 'sh', - '-c', - './node_modules/.bin/prisma migrate deploy && yarn start:prod', - ], - }; - - await deployApi({ - appName, - assetName, - coinstack, - config, - docker, - namespace, - provider, - sampleEnv, - }); - - return {}; -}; diff --git a/apps/swap-service/pulumi/package.json b/apps/swap-service/pulumi/package.json deleted file mode 100644 index 203be5f..0000000 --- a/apps/swap-service/pulumi/package.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "name": "@shapeshift/swap-service-pulumi", - "version": "0.0.1", - "license": "UNLICENSED", - "private": true, - "scripts": { - "clean": "rm -rf node_modules" - } -} diff --git a/apps/swap-service/pulumi/tsconfig.json b/apps/swap-service/pulumi/tsconfig.json deleted file mode 100644 index 3823091..0000000 --- a/apps/swap-service/pulumi/tsconfig.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "extends": "../../../tsconfig.json", - "compilerOptions": { - "outDir": "dist", - }, - "include": ["./"] -} diff --git a/apps/swap-service/railway.toml b/apps/swap-service/railway.toml new file mode 100644 index 0000000..d82a300 --- /dev/null +++ b/apps/swap-service/railway.toml @@ -0,0 +1,13 @@ +[build] +builder = "railpack" +buildCommand = "yarn build" +watchPatterns = ["apps/swap-service/**", "packages/**"] + +[deploy] +preDeployCommand = "cd apps/swap-service && yarn db:migrate" +startCommand = "cd apps/swap-service && yarn start:prod" +restartPolicyType = "ON_FAILURE" +restartPolicyMaxRetries = 3 + +[deploy.multiRegionConfig] +us-west2 = { numReplicas = 1 } diff --git a/apps/user-service/pulumi/Pulumi.yaml b/apps/user-service/pulumi/Pulumi.yaml deleted file mode 100644 index cead5db..0000000 --- a/apps/user-service/pulumi/Pulumi.yaml +++ /dev/null @@ -1,3 +0,0 @@ -name: user-service -runtime: nodejs -description: shapeshift user service diff --git a/apps/user-service/pulumi/index.ts b/apps/user-service/pulumi/index.ts deleted file mode 100644 index 0649012..0000000 --- a/apps/user-service/pulumi/index.ts +++ /dev/null @@ -1,53 +0,0 @@ -import { readFileSync } from 'fs'; -import { execSync } from 'child_process'; -import * as k8s from '@pulumi/kubernetes'; -import { - Outputs, - getConfig, - deployApi, - createSecret, - DeployApiArgs, -} from '@shapeshiftoss/unchained-pulumi'; - -//https://www.pulumi.com/docs/intro/languages/javascript/#entrypoint -export = async (): Promise => { - const appName = 'shapeshift'; - const coinstack = 'user-service'; - - const { kubeconfig, config, namespace } = await getConfig(); - const sampleEnv = readFileSync('../.env.example'); - - const assetName = config.assetName; - const provider = new k8s.Provider('kube-provider', { kubeconfig }); - - createSecret({ name: assetName, env: sampleEnv, namespace }, { provider }); - - const gitRoot = execSync('git rev-parse --show-toplevel', { encoding: 'utf8' }).trim(); - const gitSha = execSync( - `git -C ${gitRoot} log -1 --format=%h -- Dockerfile package.json yarn.lock apps/${coinstack} packages/`, - { encoding: 'utf8' }, - ).trim(); - - const docker: DeployApiArgs['docker'] = { - context: '../../../', - tag: gitSha, - command: [ - 'sh', - '-c', - './node_modules/.bin/prisma migrate deploy && yarn start:prod', - ], - }; - - await deployApi({ - appName, - assetName, - coinstack, - config, - docker, - namespace, - provider, - sampleEnv, - }); - - return {}; -}; diff --git a/apps/user-service/pulumi/package.json b/apps/user-service/pulumi/package.json deleted file mode 100644 index 5f4cc51..0000000 --- a/apps/user-service/pulumi/package.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "name": "@shapeshift/user-service-pulumi", - "version": "0.0.1", - "license": "UNLICENSED", - "private": true, - "scripts": { - "clean": "rm -rf node_modules" - } -} diff --git a/apps/user-service/pulumi/tsconfig.json b/apps/user-service/pulumi/tsconfig.json deleted file mode 100644 index 3823091..0000000 --- a/apps/user-service/pulumi/tsconfig.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "extends": "../../../tsconfig.json", - "compilerOptions": { - "outDir": "dist", - }, - "include": ["./"] -} diff --git a/apps/user-service/railway.toml b/apps/user-service/railway.toml index 54ecb91..edfc616 100644 --- a/apps/user-service/railway.toml +++ b/apps/user-service/railway.toml @@ -4,7 +4,7 @@ buildCommand = "yarn build" watchPatterns = ["apps/user-service/**", "packages/**"] [deploy] -preDeployCommand = "cd apps/user-service && ./node_modules/.bin/prisma migrate deploy" +preDeployCommand = "cd apps/user-service && yarn db:migrate" startCommand = "cd apps/user-service && yarn start:prod" restartPolicyType = "ON_FAILURE" restartPolicyMaxRetries = 3 diff --git a/d b/d deleted file mode 100644 index 9e4a3d3..0000000 --- a/d +++ /dev/null @@ -1,43 +0,0 @@ -FROM node:22-alpine AS base - -WORKDIR /workspace - -RUN corepack enable - -# Install dependencies and build -FROM base AS builder - -ARG COINSTACK - -COPY package.json yarn.lock .yarnrc.yml turbo.json tsconfig*.json ./ -COPY packages ./packages -COPY apps/ ./apps - -RUN yarn install --immutable -RUN yarn build -RUN yarn workspaces focus --all --production - -# Production image -FROM base AS runner - -ARG COINSTACK - -COPY --from=builder /workspace/.yarnrc.yml ./.yarnrc.yml -COPY --from=builder /workspace/package.json ./package.json -COPY --from=builder /workspace/yarn.lock ./yarn.lock -COPY --from=builder /workspace/node_modules ./node_modules - -COPY --from=builder /workspace/packages/shared-types/package.json ./packages/shared-types/package.json -COPY --from=builder /workspace/packages/shared-types/dist ./packages/shared-types/dist - -COPY --from=builder /workspace/packages/shared-utils/package.json ./packages/shared-utils/package.json -COPY --from=builder /workspace/packages/shared-utils/dist ./packages/shared-utils/dist - -COPY --from=builder /workspace/apps/${COINSTACK}/package.json ./apps/${COINSTACK}/package.json -COPY --from=builder /workspace/apps/${COINSTACK}/node_modules ./apps/${COINSTACK}/node_modules -COPY --from=builder /workspace/apps/${COINSTACK}/dist ./apps/${COINSTACK}/dist -COPY --from=builder /workspace/apps/${COINSTACK}/prisma ./apps/${COINSTACK}/prisma - -RUN corepack prepare - -WORKDIR /workspace/apps/${COINSTACK} diff --git a/docker-compose.yml b/docker-compose.yml index cb00af5..6928283 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,10 +1,6 @@ -x-build: &build - build: - context: . - dockerfile: Dockerfile.dev - -x-service-base: &service-base - <<: *build +x-node-base: &node-base + image: node:22-alpine + working_dir: /workspace volumes: - .:/workspace @@ -18,27 +14,20 @@ x-db-base: &db-base services: init: - <<: *build - working_dir: /workspace - command: sh -c "yarn && yarn build" - volumes: - - .:/workspace - - /workspace/apps/notifications-service/pulumi + <<: *node-base + command: sh -c "corepack yarn && corepack yarn build" packages: - <<: *build - working_dir: /workspace - command: sh -c "yarn turbo run dev --filter='@shapeshift/shared-types' --filter='@shapeshift/shared-utils'" - volumes: - - .:/workspace + <<: *node-base + command: sh -c "corepack yarn turbo run dev --filter='@shapeshift/shared-types' --filter='@shapeshift/shared-utils'" depends_on: init: condition: service_completed_successfully user-service: - <<: *service-base + <<: *node-base working_dir: /workspace/apps/user-service - command: sh -c "yarn db:push && yarn start:dev" + command: sh -c "corepack yarn db:push && corepack yarn start:dev" ports: - "3002:3002" env_file: @@ -53,9 +42,9 @@ services: condition: service_healthy swap-service: - <<: *service-base + <<: *node-base working_dir: /workspace/apps/swap-service - command: sh -c "yarn db:push && yarn start:dev" + command: sh -c "corepack yarn db:push && corepack yarn start:dev" ports: - "3001:3001" env_file: @@ -70,9 +59,9 @@ services: condition: service_healthy notifications-service: - <<: *service-base + <<: *node-base working_dir: /workspace/apps/notifications-service - command: sh -c "yarn db:push && yarn start:dev" + command: sh -c "corepack yarn db:push && corepack yarn start:dev" ports: - "3003:3003" env_file: From 191ead619c0a5a2d8d2fab956c351380e64af3d4 Mon Sep 17 00:00:00 2001 From: kaladinlight <35275952+kaladinlight@users.noreply.github.com> Date: Mon, 19 Jan 2026 13:32:19 -0700 Subject: [PATCH 4/5] refine github actions to lint and test only on pr --- .github/workflows/ci.yml | 32 ++++++ .github/workflows/deploy.yml | 207 ----------------------------------- 2 files changed, 32 insertions(+), 207 deletions(-) create mode 100644 .github/workflows/ci.yml delete mode 100644 .github/workflows/deploy.yml diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 0000000..2a06ddf --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,32 @@ +name: CI + +on: + pull_request: + branches: + - main + +env: + NODE_VERSION: '22.5.1' + +jobs: + lint-and-test: + name: Lint and Test + runs-on: ubuntu-latest + steps: + - name: Checkout code + uses: actions/checkout@v4 + with: + fetch-depth: 0 + + - name: Setup Node and Dependencies + uses: ./.github/actions/setup-node-and-deps + with: + node-version: ${{ env.NODE_VERSION }} + + - name: Lint + run: yarn lint + continue-on-error: true + + - name: Run tests + run: yarn test + continue-on-error: true diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml deleted file mode 100644 index f263a5f..0000000 --- a/.github/workflows/deploy.yml +++ /dev/null @@ -1,207 +0,0 @@ -name: Build and Deploy - -on: - push: - branches: - - main - pull_request: - branches: - - main - -env: - NODE_VERSION: '22.5.1' - -jobs: - lint-and-test: - name: Lint and Test - runs-on: ubuntu-latest - steps: - - name: Checkout code - uses: actions/checkout@v4 - with: - fetch-depth: 0 - - - name: Setup Node and Dependencies - uses: ./.github/actions/setup-node-and-deps - with: - node-version: ${{ env.NODE_VERSION }} - - - name: Lint - run: yarn lint - continue-on-error: true - - - name: Run tests - run: yarn test - continue-on-error: true - - deploy: - name: Deploy ${{ matrix.service }} (${{ matrix.environment }}) - runs-on: ubuntu-latest - needs: lint-and-test - if: github.event_name == 'push' - environment: ${{ matrix.environment }} - concurrency: - group: deploy-${{ matrix.environment }}-${{ matrix.service }} - cancel-in-progress: false - strategy: - matrix: - include: - # Development environment - - service: notifications-service - environment: dev - pulumi_stack: public-dev-us-east-2 - db_secret: NOTIFICATIONS_SERVICE_DATABASE_URL - cpu_limit: 250m - memory_limit: 250Mi - replicas: 1 - - service: swap-service - environment: dev - pulumi_stack: public-dev-us-east-2 - db_secret: SWAP_SERVICE_DATABASE_URL - cpu_limit: 250m - memory_limit: 250Mi - replicas: 1 - - service: user-service - environment: dev - pulumi_stack: public-dev-us-east-2 - db_secret: USER_SERVICE_DATABASE_URL - cpu_limit: 250m - memory_limit: 250Mi - replicas: 1 - # Production environment - #- service: notifications-service - # environment: prod - # pulumi_stack: public-us-east-2 - # db_secret: NOTIFICATIONS_SERVICE_DATABASE_URL - # cpu_limit: 250m - # memory_limit: 250Mi - # replicas: 2 - #- service: swap-service - # environment: prod - # pulumi_stack: public-us-east-2 - # db_secret: SWAP_SERVICE_DATABASE_URL - # cpu_limit: 250m - # memory_limit: 250Mi - # replicas: 2 - #- service: user-service - # environment: prod - # pulumi_stack: public-us-east-2 - # db_secret: USER_SERVICE_DATABASE_URL - # cpu_limit: 250m - # memory_limit: 250Mi - # replicas: 2 - steps: - - name: Checkout code - uses: actions/checkout@v4 - with: - fetch-depth: 0 - - - name: Setup Node and Dependencies - uses: ./.github/actions/setup-node-and-deps - with: - node-version: ${{ env.NODE_VERSION }} - - - name: Set up Docker Buildx - uses: docker/setup-buildx-action@v3 - - - name: Configure AWS Credentials - uses: aws-actions/configure-aws-credentials@v4 - with: - aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }} - aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }} - aws-region: us-east-2 - - - name: Install Pulumi CLI - uses: pulumi/actions@v5 - - - name: Configure and Deploy with Pulumi - working-directory: apps/${{ matrix.service }}/pulumi - run: | - pulumi stack select unchained/${{ matrix.pulumi_stack }} - pulumi config set --path unchained:coinstack.assetName ${{ matrix.service }} - pulumi config set --path unchained:coinstack.stack unchained/common/dependencies-us-east-2 - ${{ matrix.environment == 'dev' && 'pulumi config set --path unchained:coinstack.environment dev' || 'echo "Skipping environment config for prod"' }} - pulumi config set --path unchained:coinstack.network mainnet - pulumi config set --path unchained:coinstack.api.cpuLimit ${{ matrix.cpu_limit }} - pulumi config set --path unchained:coinstack.api.memoryLimit ${{ matrix.memory_limit }} - pulumi config set --path unchained:coinstack.api.replicas ${{ matrix.replicas }} - pulumi up -f --yes --refresh --suppress-outputs - env: - ADDITIONAL_ROOT_DOMAIN_NAME: shapeshift.com - DOCKER_BUILDKIT: 1 - PULUMI_ACCESS_TOKEN: ${{ secrets.PULUMI_ACCESS_TOKEN }} - - # Service URLs - USER_SERVICE_URL: http://user-service-svc.unchained${{ matrix.environment == 'dev' && '-dev' || '' }}.svc.cluster.local:3000 - NOTIFICATIONS_SERVICE_URL: http://notifications-service-svc.unchained${{ matrix.environment == 'dev' && '-dev' || '' }}.svc.cluster.local:3000 - SWAP_SERVICE_URL: http://swap-service-svc.unchained${{ matrix.environment == 'dev' && '-dev' || '' }}.svc.cluster.local:3000 - - # Unchained API URLs (dynamic based on environment) - VITE_UNCHAINED_ETHEREUM_HTTP_URL: https://${{ matrix.environment == 'dev' && 'dev-' || '' }}api.ethereum.shapeshift.com - VITE_UNCHAINED_ETHEREUM_WS_URL: wss://${{ matrix.environment == 'dev' && 'dev-' || '' }}api.ethereum.shapeshift.com - VITE_UNCHAINED_AVALANCHE_HTTP_URL: https://${{ matrix.environment == 'dev' && 'dev-' || '' }}api.avalanche.shapeshift.com - VITE_UNCHAINED_AVALANCHE_WS_URL: wss://${{ matrix.environment == 'dev' && 'dev-' || '' }}api.avalanche.shapeshift.com - VITE_UNCHAINED_OPTIMISM_HTTP_URL: https://${{ matrix.environment == 'dev' && 'dev-' || '' }}api.optimism.shapeshift.com - VITE_UNCHAINED_OPTIMISM_WS_URL: wss://${{ matrix.environment == 'dev' && 'dev-' || '' }}api.optimism.shapeshift.com - VITE_UNCHAINED_BNBSMARTCHAIN_HTTP_URL: https://${{ matrix.environment == 'dev' && 'dev-' || '' }}api.bnbsmartchain.shapeshift.com - VITE_UNCHAINED_BNBSMARTCHAIN_WS_URL: wss://${{ matrix.environment == 'dev' && 'dev-' || '' }}api.bnbsmartchain.shapeshift.com - VITE_UNCHAINED_POLYGON_HTTP_URL: https://${{ matrix.environment == 'dev' && 'dev-' || '' }}api.polygon.shapeshift.com - VITE_UNCHAINED_POLYGON_WS_URL: wss://${{ matrix.environment == 'dev' && 'dev-' || '' }}api.polygon.shapeshift.com - VITE_UNCHAINED_GNOSIS_HTTP_URL: https://${{ matrix.environment == 'dev' && 'dev-' || '' }}api.gnosis.shapeshift.com - VITE_UNCHAINED_GNOSIS_WS_URL: wss://${{ matrix.environment == 'dev' && 'dev-' || '' }}api.gnosis.shapeshift.com - VITE_UNCHAINED_ARBITRUM_HTTP_URL: https://${{ matrix.environment == 'dev' && 'dev-' || '' }}api.arbitrum.shapeshift.com - VITE_UNCHAINED_ARBITRUM_WS_URL: wss://${{ matrix.environment == 'dev' && 'dev-' || '' }}api.arbitrum.shapeshift.com - VITE_UNCHAINED_ARBITRUM_NOVA_HTTP_URL: https://${{ matrix.environment == 'dev' && 'dev-' || '' }}api.arbitrum-nova.shapeshift.com - VITE_UNCHAINED_ARBITRUM_NOVA_WS_URL: wss://${{ matrix.environment == 'dev' && 'dev-' || '' }}api.arbitrum-nova.shapeshift.com - VITE_UNCHAINED_BASE_HTTP_URL: https://${{ matrix.environment == 'dev' && 'dev-' || '' }}api.base.shapeshift.com - VITE_UNCHAINED_BASE_WS_URL: wss://${{ matrix.environment == 'dev' && 'dev-' || '' }}api.base.shapeshift.com - VITE_UNCHAINED_BITCOIN_HTTP_URL: https://${{ matrix.environment == 'dev' && 'dev-' || '' }}api.bitcoin.shapeshift.com - VITE_UNCHAINED_BITCOIN_WS_URL: wss://${{ matrix.environment == 'dev' && 'dev-' || '' }}api.bitcoin.shapeshift.com - VITE_UNCHAINED_DOGECOIN_HTTP_URL: https://${{ matrix.environment == 'dev' && 'dev-' || '' }}api.dogecoin.shapeshift.com - VITE_UNCHAINED_DOGECOIN_WS_URL: wss://${{ matrix.environment == 'dev' && 'dev-' || '' }}api.dogecoin.shapeshift.com - VITE_UNCHAINED_LITECOIN_HTTP_URL: https://${{ matrix.environment == 'dev' && 'dev-' || '' }}api.litecoin.shapeshift.com - VITE_UNCHAINED_LITECOIN_WS_URL: wss://${{ matrix.environment == 'dev' && 'dev-' || '' }}api.litecoin.shapeshift.com - VITE_UNCHAINED_BITCOINCASH_HTTP_URL: https://${{ matrix.environment == 'dev' && 'dev-' || '' }}api.bitcoincash.shapeshift.com - VITE_UNCHAINED_BITCOINCASH_WS_URL: wss://${{ matrix.environment == 'dev' && 'dev-' || '' }}api.bitcoincash.shapeshift.com - VITE_UNCHAINED_COSMOS_HTTP_URL: https://${{ matrix.environment == 'dev' && 'dev-' || '' }}api.cosmos.shapeshift.com - VITE_UNCHAINED_COSMOS_WS_URL: wss://${{ matrix.environment == 'dev' && 'dev-' || '' }}api.cosmos.shapeshift.com - VITE_UNCHAINED_THORCHAIN_HTTP_URL: https://${{ matrix.environment == 'dev' && 'dev-' || '' }}api.thorchain.shapeshift.com - VITE_UNCHAINED_THORCHAIN_WS_URL: wss://${{ matrix.environment == 'dev' && 'dev-' || '' }}api.thorchain.shapeshift.com - VITE_UNCHAINED_MAYACHAIN_HTTP_URL: https://${{ matrix.environment == 'dev' && 'dev-' || '' }}api.mayachain.shapeshift.com - VITE_UNCHAINED_MAYACHAIN_WS_URL: wss://${{ matrix.environment == 'dev' && 'dev-' || '' }}api.mayachain.shapeshift.com - VITE_UNCHAINED_SOLANA_HTTP_URL: https://${{ matrix.environment == 'dev' && 'dev-' || '' }}api.solana.shapeshift.com - VITE_UNCHAINED_SOLANA_WS_URL: wss://${{ matrix.environment == 'dev' && 'dev-' || '' }}api.solana.shapeshift.com - - # Node URLs (dynamic based on environment) - VITE_ETHEREUM_NODE_URL: https://${{ matrix.environment == 'dev' && 'dev-' || '' }}api.ethereum.shapeshift.com/api/v1/jsonrpc - VITE_AVALANCHE_NODE_URL: https://${{ matrix.environment == 'dev' && 'dev-' || '' }}api.avalanche.shapeshift.com/api/v1/jsonrpc - VITE_OPTIMISM_NODE_URL: https://${{ matrix.environment == 'dev' && 'dev-' || '' }}api.optimism.shapeshift.com/api/v1/jsonrpc - VITE_BNBSMARTCHAIN_NODE_URL: https://${{ matrix.environment == 'dev' && 'dev-' || '' }}api.bnbsmartchain.shapeshift.com/api/v1/jsonrpc - VITE_POLYGON_NODE_URL: https://${{ matrix.environment == 'dev' && 'dev-' || '' }}api.polygon.shapeshift.com/api/v1/jsonrpc - VITE_GNOSIS_NODE_URL: https://${{ matrix.environment == 'dev' && 'dev-' || '' }}api.gnosis.shapeshift.com/api/v1/jsonrpc - VITE_ARBITRUM_NODE_URL: https://${{ matrix.environment == 'dev' && 'dev-' || '' }}api.arbitrum.shapeshift.com/api/v1/jsonrpc - VITE_ARBITRUM_NOVA_NODE_URL: https://${{ matrix.environment == 'dev' && 'dev-' || '' }}api.arbitrum-nova.shapeshift.com/api/v1/jsonrpc - VITE_BASE_NODE_URL: https://${{ matrix.environment == 'dev' && 'dev-' || '' }}api.base.shapeshift.com/api/v1/jsonrpc - VITE_THORCHAIN_NODE_URL: https://${{ matrix.environment == 'dev' && 'dev-' || '' }}api.thorchain.shapeshift.com/lcd - VITE_MAYACHAIN_NODE_URL: https://${{ matrix.environment == 'dev' && 'dev-' || '' }}api.mayachain.shapeshift.com/lcd - VITE_SOLANA_NODE_URL: https://${{ matrix.environment == 'dev' && 'dev-' || '' }}api.solana.shapeshift.com/api/v1/jsonrpc - - # Midgard URLs (dynamic based on environment) - VITE_THORCHAIN_MIDGARD_URL: https://${{ matrix.environment == 'dev' && 'dev-' || '' }}api.thorchain.shapeshift.com/midgard/v2 - VITE_MAYACHAIN_MIDGARD_URL: https://${{ matrix.environment == 'dev' && 'dev-' || '' }}api.mayachain.shapeshift.com/midgard/v2 - - # DEX/Swapper URLs - VITE_CHAINFLIP_API_URL: https://chainflip-broker.io - VITE_COWSWAP_BASE_URL: https://api.cow.fi - VITE_JUPITER_API_URL: https://quote-api.jup.ag/v6 - VITE_PORTALS_BASE_URL: https://api.portals.fi - VITE_RELAY_API_URL: https://api.relay.link - VITE_ZRX_BASE_URL: https://${{ matrix.environment == 'dev' && 'dev-' || '' }}api.proxy.shapeshift.com/api/v1/zrx/ - - # Secrets (from GitHub Secrets) - ACCOUNT_ID_SALT: ${{ secrets.ACCOUNT_ID_SALT }} - DATABASE_URL: ${{ secrets[matrix.db_secret] }} - EXPO_ACCESS_TOKEN: ${{ secrets.EXPO_ACCESS_TOKEN }} - VITE_BEBOP_API_KEY: ${{ secrets.BEBOP_API_KEY }} - VITE_CHAINFLIP_API_KEY: ${{ secrets.CHAINFLIP_API_KEY }} - VITE_NEAR_INTENTS_API_KEY: ${{ secrets.NEAR_INTENTS_API_KEY }} \ No newline at end of file From 08833b9fcc0805070cd9db45788e4682c65becf5 Mon Sep 17 00:00:00 2001 From: kaladinlight <35275952+kaladinlight@users.noreply.github.com> Date: Mon, 19 Jan 2026 14:16:54 -0700 Subject: [PATCH 5/5] generate init migrations for all services --- .../prisma/migrations/0_init/migration.sql | 12 +-- .../prisma/migrations/migration_lock.toml | 3 + .../prisma/migrations/0_init/migration.sql | 66 ++++++++++++++ .../prisma/migrations/migration_lock.toml | 3 + .../prisma/migrations/0_init/migration.sql | 86 +++++++++++++++++++ .../prisma/migrations/migration_lock.toml | 3 + 6 files changed, 168 insertions(+), 5 deletions(-) create mode 100644 apps/notifications-service/prisma/migrations/migration_lock.toml create mode 100644 apps/swap-service/prisma/migrations/0_init/migration.sql create mode 100644 apps/swap-service/prisma/migrations/migration_lock.toml create mode 100644 apps/user-service/prisma/migrations/0_init/migration.sql create mode 100644 apps/user-service/prisma/migrations/migration_lock.toml diff --git a/apps/notifications-service/prisma/migrations/0_init/migration.sql b/apps/notifications-service/prisma/migrations/0_init/migration.sql index ac84054..0409e23 100644 --- a/apps/notifications-service/prisma/migrations/0_init/migration.sql +++ b/apps/notifications-service/prisma/migrations/0_init/migration.sql @@ -1,11 +1,13 @@ -- CreateTable -CREATE TABLE "notifications" ( - "id" TEXT NOT NULL PRIMARY KEY, +CREATE TABLE "public"."notifications" ( + "id" TEXT NOT NULL, "title" TEXT NOT NULL, "body" TEXT NOT NULL, "type" TEXT NOT NULL, - "sentAt" TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, - "deliveredAt" TIMESTAMP, + "sentAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "deliveredAt" TIMESTAMP(3), "userId" TEXT NOT NULL, - "swapId" TEXT + "swapId" TEXT, + + CONSTRAINT "notifications_pkey" PRIMARY KEY ("id") ); diff --git a/apps/notifications-service/prisma/migrations/migration_lock.toml b/apps/notifications-service/prisma/migrations/migration_lock.toml new file mode 100644 index 0000000..044d57c --- /dev/null +++ b/apps/notifications-service/prisma/migrations/migration_lock.toml @@ -0,0 +1,3 @@ +# Please do not edit this file manually +# It should be added in your version-control system (e.g., Git) +provider = "postgresql" diff --git a/apps/swap-service/prisma/migrations/0_init/migration.sql b/apps/swap-service/prisma/migrations/0_init/migration.sql new file mode 100644 index 0000000..69c1bf0 --- /dev/null +++ b/apps/swap-service/prisma/migrations/0_init/migration.sql @@ -0,0 +1,66 @@ +-- CreateTable +CREATE TABLE "public"."swaps" ( + "id" TEXT NOT NULL, + "swapId" TEXT NOT NULL, + "sellAsset" JSONB NOT NULL, + "buyAsset" JSONB NOT NULL, + "sellAmountCryptoBaseUnit" TEXT NOT NULL, + "expectedBuyAmountCryptoBaseUnit" TEXT NOT NULL, + "sellAmountCryptoPrecision" TEXT NOT NULL, + "expectedBuyAmountCryptoPrecision" TEXT NOT NULL, + "actualBuyAmountCryptoPrecision" TEXT, + "status" TEXT NOT NULL DEFAULT 'PENDING', + "source" TEXT NOT NULL, + "swapperName" TEXT NOT NULL, + "sellAccountId" TEXT NOT NULL, + "buyAccountId" TEXT, + "receiveAddress" TEXT, + "sellTxHash" TEXT, + "buyTxHash" TEXT, + "txLink" TEXT, + "statusMessage" TEXT, + "isStreaming" BOOLEAN NOT NULL DEFAULT false, + "estimatedCompletion" TIMESTAMP(3), + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updatedAt" TIMESTAMP(3) NOT NULL, + "metadata" JSONB NOT NULL, + "chainflipSwapId" INTEGER, + "relayTransactionMetadata" JSONB, + "relayerExplorerTxLink" TEXT, + "relayerTxHash" TEXT, + "stepIndex" INTEGER NOT NULL DEFAULT 0, + "streamingSwapMetadata" JSONB, + "userId" TEXT NOT NULL, + "sellAmountUsd" TEXT, + "referralCode" TEXT, + "isReferralEligible" BOOLEAN NOT NULL DEFAULT true, + "isAffiliateVerified" BOOLEAN, + "affiliateVerificationDetails" JSONB, + "affiliateVerifiedAt" TIMESTAMP(3), + + CONSTRAINT "swaps_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "public"."notifications" ( + "id" TEXT NOT NULL, + "title" TEXT NOT NULL, + "body" TEXT NOT NULL, + "type" TEXT NOT NULL, + "sentAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "deliveredAt" TIMESTAMP(3), + "userId" TEXT NOT NULL, + "deviceId" TEXT, + "swapId" TEXT, + + CONSTRAINT "notifications_pkey" PRIMARY KEY ("id") +); + +-- CreateIndex +CREATE UNIQUE INDEX "swaps_swapId_key" ON "public"."swaps"("swapId"); + +-- CreateIndex +CREATE INDEX "swaps_referralCode_idx" ON "public"."swaps"("referralCode"); + +-- AddForeignKey +ALTER TABLE "public"."notifications" ADD CONSTRAINT "notifications_swapId_fkey" FOREIGN KEY ("swapId") REFERENCES "public"."swaps"("id") ON DELETE SET NULL ON UPDATE CASCADE; diff --git a/apps/swap-service/prisma/migrations/migration_lock.toml b/apps/swap-service/prisma/migrations/migration_lock.toml new file mode 100644 index 0000000..044d57c --- /dev/null +++ b/apps/swap-service/prisma/migrations/migration_lock.toml @@ -0,0 +1,3 @@ +# Please do not edit this file manually +# It should be added in your version-control system (e.g., Git) +provider = "postgresql" diff --git a/apps/user-service/prisma/migrations/0_init/migration.sql b/apps/user-service/prisma/migrations/0_init/migration.sql new file mode 100644 index 0000000..f9f0d34 --- /dev/null +++ b/apps/user-service/prisma/migrations/0_init/migration.sql @@ -0,0 +1,86 @@ +-- CreateTable +CREATE TABLE "public"."users" ( + "id" TEXT NOT NULL, + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updatedAt" TIMESTAMP(3) NOT NULL, + + CONSTRAINT "users_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "public"."user_accounts" ( + "id" TEXT NOT NULL, + "accountId" TEXT NOT NULL, + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "userId" TEXT NOT NULL, + + CONSTRAINT "user_accounts_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "public"."devices" ( + "id" TEXT NOT NULL, + "deviceToken" TEXT NOT NULL, + "deviceType" TEXT NOT NULL, + "isActive" BOOLEAN NOT NULL DEFAULT true, + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updatedAt" TIMESTAMP(3) NOT NULL, + "userId" TEXT NOT NULL, + + CONSTRAINT "devices_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "public"."referral_codes" ( + "id" TEXT NOT NULL, + "code" TEXT NOT NULL, + "ownerAddress" TEXT NOT NULL, + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updatedAt" TIMESTAMP(3) NOT NULL, + "isActive" BOOLEAN NOT NULL DEFAULT true, + "maxUses" INTEGER, + "expiresAt" TIMESTAMP(3), + + CONSTRAINT "referral_codes_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "public"."referral_usages" ( + "id" TEXT NOT NULL, + "referralCode" TEXT NOT NULL, + "refereeAddress" TEXT NOT NULL, + "usedAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "isActive" BOOLEAN NOT NULL DEFAULT true, + + CONSTRAINT "referral_usages_pkey" PRIMARY KEY ("id") +); + +-- CreateIndex +CREATE UNIQUE INDEX "user_accounts_userId_accountId_key" ON "public"."user_accounts"("userId", "accountId"); + +-- CreateIndex +CREATE UNIQUE INDEX "devices_deviceToken_key" ON "public"."devices"("deviceToken"); + +-- CreateIndex +CREATE UNIQUE INDEX "referral_codes_code_key" ON "public"."referral_codes"("code"); + +-- CreateIndex +CREATE INDEX "referral_codes_ownerAddress_idx" ON "public"."referral_codes"("ownerAddress"); + +-- CreateIndex +CREATE UNIQUE INDEX "referral_usages_refereeAddress_key" ON "public"."referral_usages"("refereeAddress"); + +-- CreateIndex +CREATE INDEX "referral_usages_referralCode_idx" ON "public"."referral_usages"("referralCode"); + +-- CreateIndex +CREATE INDEX "referral_usages_refereeAddress_idx" ON "public"."referral_usages"("refereeAddress"); + +-- AddForeignKey +ALTER TABLE "public"."user_accounts" ADD CONSTRAINT "user_accounts_userId_fkey" FOREIGN KEY ("userId") REFERENCES "public"."users"("id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "public"."devices" ADD CONSTRAINT "devices_userId_fkey" FOREIGN KEY ("userId") REFERENCES "public"."users"("id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "public"."referral_usages" ADD CONSTRAINT "referral_usages_referralCode_fkey" FOREIGN KEY ("referralCode") REFERENCES "public"."referral_codes"("code") ON DELETE RESTRICT ON UPDATE CASCADE; diff --git a/apps/user-service/prisma/migrations/migration_lock.toml b/apps/user-service/prisma/migrations/migration_lock.toml new file mode 100644 index 0000000..044d57c --- /dev/null +++ b/apps/user-service/prisma/migrations/migration_lock.toml @@ -0,0 +1,3 @@ +# Please do not edit this file manually +# It should be added in your version-control system (e.g., Git) +provider = "postgresql"