From 66af7ebcf55eebbe68ecbb0376ef3fe65ccb0ee7 Mon Sep 17 00:00:00 2001 From: Andres Pinto <143480783+apsantiso@users.noreply.github.com> Date: Fri, 6 Nov 2026 15:12:12 +0100 Subject: [PATCH 1/4] fix(docker): use node:16 image and drop apt step bullseye packages return 404. node:16 already ships build tools. --- Dockerfile | 7 +------ infrastructure/preview.Dockerfile | 7 +------ 2 files changed, 2 insertions(+), 12 deletions(-) diff --git a/Dockerfile b/Dockerfile index bfcc16ca..11e5675c 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,13 +1,8 @@ -FROM node:16-bullseye-slim +FROM node:16 # Create a non-root user RUN groupadd -r myuser && useradd -r -g myuser myuser -d /app -# Create package cache -RUN apt update && apt upgrade -y && apt autoremove -y \ - && apt install -y --no-install-recommends curl build-essential python3 git \ - && apt clean - # Create the application directory and set permissions RUN mkdir -p /app && chown -R myuser:myuser /app diff --git a/infrastructure/preview.Dockerfile b/infrastructure/preview.Dockerfile index f3296616..fc4791ef 100644 --- a/infrastructure/preview.Dockerfile +++ b/infrastructure/preview.Dockerfile @@ -1,13 +1,8 @@ -FROM node:16-bullseye-slim +FROM node:16 # Create a non-root user RUN groupadd -r myuser && useradd -r -g myuser myuser -d /app -# Create package cache -RUN apt update && apt upgrade -y && apt autoremove -y \ - && apt install -y --no-install-recommends curl build-essential python3 git \ - && apt clean - # Create the application directory and set permissions RUN mkdir -p /app && chown -R myuser:myuser /app From 7cb5b9f858b992c50b0f317d7b61109a9fda8b67 Mon Sep 17 00:00:00 2001 From: Andres Pinto <143480783+apsantiso@users.noreply.github.com> Date: Fri, 6 Nov 2026 15:12:12 +0100 Subject: [PATCH 2/4] ci: run tests inside production image on PRs Move test stack and env to compose. Exclude .env files from image. --- .dockerignore | 3 +- .env.test | 41 +++++++++++++++++++++ .github/workflows/ci.yml | 77 ++-------------------------------------- docker-compose.test.yml | 31 ++++++++++++++++ 4 files changed, 76 insertions(+), 76 deletions(-) create mode 100644 .env.test create mode 100644 docker-compose.test.yml diff --git a/.dockerignore b/.dockerignore index b512c09d..6a0d87ef 100644 --- a/.dockerignore +++ b/.dockerignore @@ -1 +1,2 @@ -node_modules \ No newline at end of file +node_modules +.env* diff --git a/.env.test b/.env.test new file mode 100644 index 00000000..4b47ef64 --- /dev/null +++ b/.env.test @@ -0,0 +1,41 @@ +# Fake values for the test stack only. Never put real secrets here. +inxtbridge_storage__mongoUrl=mongodb://admin:password@mongo:27017/bridge-test +inxtbridge_storage__mongoOpts__user=admin +inxtbridge_storage__mongoOpts__pass=password +inxtbridge_storage__mongoOpts__dbName=bridge-test +inxtbridge_server__port=0 +inxtbridge_api_keys__segment_test=inxtbridge_api_keys__segment_test +inxtbridge_application__CLUSTER__0=inxtbridge_application__CLUSTER__0 +inxtbridge_logger__level=5 +inxtbridge_storage__mongoOpts__authSource=admin +inxtbridge_stripe__PK_LIVE=inxtbridge_stripe__PK_LIVE +inxtbridge_api_keys__segment=inxtbridge_api_keys__segment +inxtbridge_stripe__SK_LIVE=inxtbridge_stripe__SK_LIVE +inxtbridge_redis__port=6379 +inxtbridge_server__ssl__redirect=443 +inxtbridge_redis__password= +inxtbridge_redis__host=redis +inxtbridge_complex__rpcUser=inxtbridge_complex__rpcUser +inxtbridge_stripe__SIG_TEST=inxtbridge_stripe__SIG_TEST +inxtbridge_gateway__username=inxtbridge_gateway__username +inxtbridge_mailer__auth__pass=inxtbridge_mailer__auth__pass +inxtbridge_stripe__PK_TEST=inxtbridge_stripe__PK_TEST +inxtbridge_complex__rpcPassword=inxtbridge_complex__rpcPassword +inxtbridge_mailer__host=inxtbridge_mailer__host +inxtbridge_server__public__host=inxtbridge_server__public__host +inxtbridge_stripe__SK_TEST=inxtbridge_stripe__SK_TEST +inxtbridge_complex__rpcUrl=inxtbridge_complex__rpcUrl +inxtbridge_mailer__auth__user=inxtbridge_mailer__auth__user +inxtbridge_mailer__sendgrid__api_key=inxtbridge_mailer__sendgrid__api_key +inxtbridge_storage__mongoOpts__server__poolSize=100 +inxtbridge_stripe__SIG=inxtbridge_stripe__SIG +inxtbridge_drive__api=inxtbridge_drive__api +inxtbridge_server__public__port=443 +inxtbridge_mailer__port=465 +inxtbridge_gateway__password=inxtbridge_gateway__password +inxtbridge_NEW_QUEUE_HOST=network-queue +inxtbridge_NEW_QUEUE_PORT=6379 +inxtbridge_NEW_QUEUE_USERNAME=admin +inxtbridge_NEW_QUEUE_PASSWORD=password +inxtbridge_gateway__SIGN_JWT_SECRET=LS0tLS1CRUdJTiBSU0EgUFJJVkFURSBLRVktLS0tLQpNSUlCT3dJQkFBSkJBTDlDTVRlZGEramdIcGJuTmtlSm51TlpnYzg5TGFvMGNQNkl6dlJrYTJ0MUVKbnh5ZTA1CndSWGZLMXFpbTFOMGU3cGhkd0RkRWYvNGJ1eFc5V2g1UWxzQ0F3RUFBUUpCQUpnRXljLzF2VDdGWFNyK3JpTWcKWFAxQ09LNTdaeCtCUFVyamZQTytHYSszWk1MRHhqaG44dGZmV1E4VUpKemJ5VkQ0Q0JqTmNra2xRN3phQ29BNwo1WWtDSVFEd0h2MXhVRkFVUkI2b3QwL0JMMWNxek5SNU80dFBMT0NjL2gyK0o4Y09WUUloQU12b0FrMm5IQWhSClpRNmhNZGFTdWtPVTE3MTYvRGxnNWNiSXNWYXh0bDN2QWlBTUdTT2YzL0lJODEyd0ZueFlPWEJrNGFrYTZwc2MKUkNDVkNHQ3JRZ25QZVFJZ2NTU2E2cFc0YzFFZTN5Qkl0RVNVZ0YxOTNKRDZsYWdUdDlxeXRHVkZ5UmNDSVFDYgp6dE85ampXcERmYTlnWTV2dVB4MFgyUkcxbjJQb0ZYVjVXT29RanNqbnc9PQotLS0tLUVORCBSU0EgUFJJVkFURSBLRVktLS0tLQo= +inxtbridge_gateway__JWT_SECRET=LS0tLS1CRUdJTiBQVUJMSUMgS0VZLS0tLS0KTUZ3d0RRWUpLb1pJaHZjTkFRRUJCUUFEU3dBd1NBSkJBTDlDTVRlZGEramdIcGJuTmtlSm51TlpnYzg5TGFvMApjUDZJenZSa2EydDFFSm54eWUwNXdSWGZLMXFpbTFOMGU3cGhkd0RkRWYvNGJ1eFc5V2g1UWxzQ0F3RUFBUT09Ci0tLS0tRU5EIFBVQkxJQyBLRVktLS0tLQo= diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 3c95fb66..e1ce04ab 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -1,8 +1,5 @@ name: ci on: - push: - branches: - - 'master' pull_request: branches: - 'master' @@ -11,78 +8,8 @@ jobs: runs-on: ubuntu-latest permissions: contents: read - packages: read - strategy: - matrix: - node-version: [16.x] - env: - DATABASE_URI: ${{ secrets.DATABASE_URI }} - inxtbridge_storage__mongoUrl: mongodb://admin:password@127.0.0.1:27017/bridge-test - inxtbridge_storage__mongoOpts__user: admin - inxtbridge_storage__mongoOpts__pass: password - inxtbridge_storage__mongoOpts__dbName: bridge-test - inxtbridge_server__port: 0 - inxtbridge_api_keys__segment_test: inxtbridge_api_keys__segment_test - inxtbridge_application__CLUSTER__0: inxtbridge_application__CLUSTER__0 - inxtbridge_logger__level: 5 - inxtbridge_storage__mongoOpts__authSource: admin - inxtbridge_stripe__PK_LIVE: inxtbridge_stripe__PK_LIVE - inxtbridge_api_keys__segment: inxtbridge_api_keys__segment - inxtbridge_stripe__SK_LIVE: inxtbridge_stripe__SK_LIVE - inxtbridge_redis__port: 6379 - inxtbridge_server__ssl__redirect: 443 - inxtbridge_redis__password: - inxtbridge_redis__host: 127.0.0.1 - inxtbridge_complex__rpcUser: inxtbridge_complex__rpcUser - inxtbridge_stripe__SIG_TEST: inxtbridge_stripe__SIG_TEST - inxtbridge_gateway__username: inxtbridge_gateway__username - inxtbridge_mailer__auth__pass: inxtbridge_mailer__auth__pass - inxtbridge_stripe__PK_TEST: inxtbridge_stripe__PK_TEST - inxtbridge_complex__rpcPassword: inxtbridge_complex__rpcPassword - inxtbridge_mailer__host: inxtbridge_mailer__host - inxtbridge_server__public__host: inxtbridge_server__public__host - inxtbridge_stripe__SK_TEST: inxtbridge_stripe__SK_TEST - inxtbridge_complex__rpcUrl: inxtbridge_complex__rpcUrl - inxtbridge_mailer__auth__user: inxtbridge_mailer__auth__user - inxtbridge_mailer__sendgrid__api_key: inxtbridge_mailer__sendgrid__api_key - inxtbridge_storage__mongoOpts__server__poolSize: 100 - inxtbridge_stripe__SIG: inxtbridge_stripe__SIG - inxtbridge_drive__api: inxtbridge_drive__api - inxtbridge_server__public__port: 443 - inxtbridge_mailer__port: 465 - inxtbridge_gateway__password: inxtbridge_gateway__password - inxtbridge_NEW_QUEUE_HOST: network-queue - inxtbridge_NEW_QUEUE_PORT: 6379 - inxtbridge_NEW_QUEUE_USERNAME: admin - inxtbridge_NEW_QUEUE_PASSWORD: password - inxtbridge_gateway__SIGN_JWT_SECRET: LS0tLS1CRUdJTiBSU0EgUFJJVkFURSBLRVktLS0tLQpNSUlCT3dJQkFBSkJBTDlDTVRlZGEramdIcGJuTmtlSm51TlpnYzg5TGFvMGNQNkl6dlJrYTJ0MUVKbnh5ZTA1CndSWGZLMXFpbTFOMGU3cGhkd0RkRWYvNGJ1eFc5V2g1UWxzQ0F3RUFBUUpCQUpnRXljLzF2VDdGWFNyK3JpTWcKWFAxQ09LNTdaeCtCUFVyamZQTytHYSszWk1MRHhqaG44dGZmV1E4VUpKemJ5VkQ0Q0JqTmNra2xRN3phQ29BNwo1WWtDSVFEd0h2MXhVRkFVUkI2b3QwL0JMMWNxek5SNU80dFBMT0NjL2gyK0o4Y09WUUloQU12b0FrMm5IQWhSClpRNmhNZGFTdWtPVTE3MTYvRGxnNWNiSXNWYXh0bDN2QWlBTUdTT2YzL0lJODEyd0ZueFlPWEJrNGFrYTZwc2MKUkNDVkNHQ3JRZ25QZVFJZ2NTU2E2cFc0YzFFZTN5Qkl0RVNVZ0YxOTNKRDZsYWdUdDlxeXRHVkZ5UmNDSVFDYgp6dE85ampXcERmYTlnWTV2dVB4MFgyUkcxbjJQb0ZYVjVXT29RanNqbnc9PQotLS0tLUVORCBSU0EgUFJJVkFURSBLRVktLS0tLQo= - inxtbridge_gateway__JWT_SECRET: LS0tLS1CRUdJTiBQVUJMSUMgS0VZLS0tLS0KTUZ3d0RRWUpLb1pJaHZjTkFRRUJCUUFEU3dBd1NBSkJBTDlDTVRlZGEramdIcGJuTmtlSm51TlpnYzg5TGFvMApjUDZJenZSa2EydDFFSm54eWUwNXdSWGZLMXFpbTFOMGU3cGhkd0RkRWYvNGJ1eFc5V2g1UWxzQ0F3RUFBUT09Ci0tLS0tRU5EIFBVQkxJQyBLRVktLS0tLQo= - - steps: - - name: Start MongoDB - run: docker run -p 27017:27017 -e MONGO_INITDB_ROOT_USERNAME=admin -e MONGO_INITDB_ROOT_PASSWORD=password -e MONGO_INITDB_DATABASE=bridge-test -d mongo:4.4 - - name: Start Redis - run: docker run -p 6379:6379 -d redis:latest - - uses: actions/checkout@v2 - - name: Use Node.js ${{ matrix.node-version }} - uses: actions/setup-node@v2 - with: - node-version: ${{ matrix.node-version }} - registry-url: https://npm.pkg.github.com/ - - - run: yarn --ignore-engines - name: Install dependencies - env: - NODE_AUTH_TOKEN: ${{ secrets.PERSONAL_ACCESS_TOKEN }} - - - run: yarn run test - name: Run Tests - - run: yarn run test:e2e - name: Run E2E Tests - # - # - run: yarn run test-mongo-init - # - run: yarn run test-mongo - + - name: Run tests in production image + run: docker compose -f docker-compose.test.yml run --rm --build bridge diff --git a/docker-compose.test.yml b/docker-compose.test.yml new file mode 100644 index 00000000..c93ca11a --- /dev/null +++ b/docker-compose.test.yml @@ -0,0 +1,31 @@ +services: + bridge: + build: . + env_file: .env.test + command: sh -c "yarn run test && yarn run test:e2e" + depends_on: + mongo: + condition: service_healthy + redis: + condition: service_healthy + + mongo: + image: mongo:4.4 + environment: + MONGO_INITDB_ROOT_USERNAME: admin + MONGO_INITDB_ROOT_PASSWORD: password + MONGO_INITDB_DATABASE: bridge-test + healthcheck: + # Uses the hostname because the init server only listens on localhost. + test: mongo --host "$$(hostname)" --quiet --eval "db.adminCommand('ping').ok" + interval: 2s + timeout: 5s + retries: 30 + + redis: + image: redis:latest + healthcheck: + test: redis-cli ping + interval: 2s + timeout: 5s + retries: 30 From c874360a755d0f9e8cb21b8802820a28001137da Mon Sep 17 00:00:00 2001 From: Andres Pinto <143480783+apsantiso@users.noreply.github.com> Date: Fri, 6 Nov 2026 15:18:39 +0100 Subject: [PATCH 3/4] fix(docker): use node:16 in development image --- infrastructure/development.Dockerfile | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/infrastructure/development.Dockerfile b/infrastructure/development.Dockerfile index f3296616..fc4791ef 100644 --- a/infrastructure/development.Dockerfile +++ b/infrastructure/development.Dockerfile @@ -1,13 +1,8 @@ -FROM node:16-bullseye-slim +FROM node:16 # Create a non-root user RUN groupadd -r myuser && useradd -r -g myuser myuser -d /app -# Create package cache -RUN apt update && apt upgrade -y && apt autoremove -y \ - && apt install -y --no-install-recommends curl build-essential python3 git \ - && apt clean - # Create the application directory and set permissions RUN mkdir -p /app && chown -R myuser:myuser /app From 3aa5a21fa71f3a201a57c1b14679e41afb883e8c Mon Sep 17 00:00:00 2001 From: Andres Pinto <143480783+apsantiso@users.noreply.github.com> Date: Fri, 6 Nov 2026 15:47:11 +0100 Subject: [PATCH 4/4] test: use mongo 7.0.40 in test stack --- docker-compose.test.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docker-compose.test.yml b/docker-compose.test.yml index c93ca11a..f6ce4189 100644 --- a/docker-compose.test.yml +++ b/docker-compose.test.yml @@ -10,14 +10,14 @@ services: condition: service_healthy mongo: - image: mongo:4.4 + image: mongo:7.0.40 environment: MONGO_INITDB_ROOT_USERNAME: admin MONGO_INITDB_ROOT_PASSWORD: password MONGO_INITDB_DATABASE: bridge-test healthcheck: # Uses the hostname because the init server only listens on localhost. - test: mongo --host "$$(hostname)" --quiet --eval "db.adminCommand('ping').ok" + test: mongosh --host "$$(hostname)" --quiet --eval "db.adminCommand('ping').ok" interval: 2s timeout: 5s retries: 30