diff --git a/.env.example b/.env.example index 799e44525b..52b172b72c 100644 --- a/.env.example +++ b/.env.example @@ -68,6 +68,18 @@ DEBUG_CONSOLE=false # UID=1000 # GID=1000 +#==============# +# Node Options # +#==============# + +# NOTE: NODE_MAX_OLD_SPACE_SIZE is NOT recognized by Node.js directly. +# This variable is used as a build argument for Docker or CI/CD workflows, +# and is NOT used by Node.js to set the heap size at runtime. +# To configure Node.js memory, use NODE_OPTIONS, e.g.: +# NODE_OPTIONS="--max-old-space-size=6144" +# See: https://nodejs.org/api/cli.html#--max-old-space-sizesize-in-mib +NODE_MAX_OLD_SPACE_SIZE=6144 + #===============# # Configuration # #===============# diff --git a/.github/workflows/backend-review.yml b/.github/workflows/backend-review.yml index 8375f398c3..2379b8fee7 100644 --- a/.github/workflows/backend-review.yml +++ b/.github/workflows/backend-review.yml @@ -24,6 +24,7 @@ jobs: BAN_DURATION: ${{ secrets.BAN_DURATION }} BAN_INTERVAL: ${{ secrets.BAN_INTERVAL }} NODE_ENV: CI + NODE_OPTIONS: '--max-old-space-size=${{ secrets.NODE_MAX_OLD_SPACE_SIZE || 6144 }}' steps: - uses: actions/checkout@v4 - name: Use Node.js 20.x diff --git a/.github/workflows/frontend-review.yml b/.github/workflows/frontend-review.yml index 907d07d307..989e2e4abe 100644 --- a/.github/workflows/frontend-review.yml +++ b/.github/workflows/frontend-review.yml @@ -16,6 +16,8 @@ jobs: name: Run frontend unit tests on Ubuntu timeout-minutes: 60 runs-on: ubuntu-latest + env: + NODE_OPTIONS: '--max-old-space-size=${{ secrets.NODE_MAX_OLD_SPACE_SIZE || 6144 }}' steps: - uses: actions/checkout@v4 - name: Use Node.js 20.x @@ -38,6 +40,8 @@ jobs: name: Run frontend unit tests on Windows timeout-minutes: 60 runs-on: windows-latest + env: + NODE_OPTIONS: '--max-old-space-size=${{ secrets.NODE_MAX_OLD_SPACE_SIZE || 6144 }}' steps: - uses: actions/checkout@v4 - name: Use Node.js 20.x diff --git a/Dockerfile b/Dockerfile index 4b00949300..e382da466a 100644 --- a/Dockerfile +++ b/Dockerfile @@ -14,6 +14,9 @@ ENV LD_PRELOAD=/usr/lib/libjemalloc.so.2 COPY --from=ghcr.io/astral-sh/uv:0.9.5-python3.12-alpine /usr/local/bin/uv /usr/local/bin/uvx /bin/ RUN uv --version +# Set configurable max-old-space-size with default +ARG NODE_MAX_OLD_SPACE_SIZE=6144 + RUN mkdir -p /app && chown node:node /app WORKDIR /app @@ -39,8 +42,8 @@ RUN \ COPY --chown=node:node . . RUN \ - # React client build - NODE_OPTIONS="--max-old-space-size=2048" npm run frontend; \ + # React client build with configurable memory + NODE_OPTIONS="--max-old-space-size=${NODE_MAX_OLD_SPACE_SIZE}" npm run frontend; \ npm prune --production; \ npm cache clean --force diff --git a/Dockerfile.multi b/Dockerfile.multi index c106b5e5fa..ac58aa21b6 100644 --- a/Dockerfile.multi +++ b/Dockerfile.multi @@ -1,12 +1,16 @@ # Dockerfile.multi # v0.8.1 +# Set configurable max-old-space-size with default +ARG NODE_MAX_OLD_SPACE_SIZE=6144 + # Base for all builds FROM node:20-alpine AS base-min # Install jemalloc RUN apk add --no-cache jemalloc # Set environment variable to use jemalloc ENV LD_PRELOAD=/usr/lib/libjemalloc.so.2 + WORKDIR /app RUN apk --no-cache add curl RUN npm config set fetch-retry-maxtimeout 600000 && \ @@ -59,7 +63,7 @@ COPY client ./ COPY --from=data-provider-build /app/packages/data-provider/dist /app/packages/data-provider/dist COPY --from=client-package-build /app/packages/client/dist /app/packages/client/dist COPY --from=client-package-build /app/packages/client/src /app/packages/client/src -ENV NODE_OPTIONS="--max-old-space-size=2048" +ENV NODE_OPTIONS="--max-old-space-size=${NODE_MAX_OLD_SPACE_SIZE}" RUN npm run build # API setup (including client dist) diff --git a/api/package.json b/api/package.json index cdcb71e748..bbdd2f4472 100644 --- a/api/package.json +++ b/api/package.json @@ -7,7 +7,7 @@ "server-dev": "echo 'please run this from the root directory'", "test": "cross-env NODE_ENV=test jest", "b:test": "NODE_ENV=test bun jest", - "test:ci": "jest --ci", + "test:ci": "jest --ci --logHeapUsage", "add-balance": "node ./add-balance.js", "list-balances": "node ./list-balances.js", "user-stats": "node ./user-stats.js", diff --git a/api/test/.env.test.example b/api/test/.env.test.example index 9b7a75a996..587a739cc3 100644 --- a/api/test/.env.test.example +++ b/api/test/.env.test.example @@ -11,3 +11,7 @@ OPENAI_API_KEY=your-api-key BAN_VIOLATIONS=true BAN_DURATION=7200000 BAN_INTERVAL=20 + +# NODE_MAX_OLD_SPACE_SIZE is only used as a Docker build argument. +# Node.js does NOT recognize this environment variable for heap size. +NODE_MAX_OLD_SPACE_SIZE=6144 diff --git a/client/package.json b/client/package.json index 27224493ce..c9c323dd2a 100644 --- a/client/package.json +++ b/client/package.json @@ -12,7 +12,7 @@ "dev": "cross-env NODE_ENV=development vite", "preview-prod": "cross-env NODE_ENV=development vite preview", "test": "cross-env NODE_ENV=development jest --watch", - "test:ci": "cross-env NODE_ENV=development jest --ci", + "test:ci": "cross-env NODE_ENV=development jest --ci --logHeapUsage", "b:test": "NODE_ENV=test bunx jest --watch", "b:build": "NODE_ENV=production bun --bun vite build", "b:dev": "NODE_ENV=development bunx vite" diff --git a/packages/data-provider/package.json b/packages/data-provider/package.json index 4e5d0d5220..692d6b4f07 100644 --- a/packages/data-provider/package.json +++ b/packages/data-provider/package.json @@ -23,7 +23,7 @@ "build:watch": "rollup -c -w", "rollup:api": "npx rollup -c server-rollup.config.js --bundleConfigAsCjs", "test": "jest --coverage --watch", - "test:ci": "jest --coverage --ci", + "test:ci": "jest --coverage --ci --logHeapUsage", "verify": "npm run test:ci", "b:clean": "bun run rimraf dist", "b:build": "bun run b:clean && bun run rollup -c --silent --bundleConfigAsCjs"