diff --git a/.github/workflows/code-quality.yml b/.github/workflows/code-quality.yml index 8a01559a9..98a247460 100644 --- a/.github/workflows/code-quality.yml +++ b/.github/workflows/code-quality.yml @@ -163,3 +163,65 @@ jobs: run: cp .env.example .env - name: Build run: pnpm turbo build --affected + + memory-regression: + runs-on: ubuntu-latest + timeout-minutes: 15 + steps: + - uses: actions/checkout@v6 + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v4 + - name: Build Docker image + uses: docker/build-push-action@v7 + with: + platforms: linux/amd64 + context: . + push: false + load: true + tags: homarr-memory-test + network: host + cache-from: type=gha + cache-to: type=gha,mode=max + env: + SKIP_ENV_VALIDATION: true + - name: Start container and measure memory + run: | + docker run -d --name homarr-mem-test -p 17575:7575 homarr-memory-test + # Wait for container to be healthy (up to 60s) + healthy=false + for i in $(seq 1 30); do + if curl -sf http://localhost:17575/api/health 2>/dev/null; then + echo "Container healthy after $((i * 2))s" + healthy=true + break + fi + sleep 2 + done + if [ "$healthy" != "true" ]; then + echo "ERROR: Container never became healthy" + docker logs homarr-mem-test --tail 50 + exit 1 + fi + # Warm up: hit the dashboard page a few times + for i in $(seq 1 5); do + curl -sf http://localhost:17575/ > /dev/null 2>&1 || true + sleep 2 + done + # Measure RSS after warmup + MEM_KB=$(docker stats --no-stream --format '{{.MemUsage}}' homarr-mem-test | sed 's| /.*||') + echo "Raw memory: $MEM_KB" + # Convert to numeric MB (handles GiB and MiB suffixes) + MEM_NUM=$(echo "$MEM_KB" | awk '{ + if ($0 ~ /GiB/) { gsub(/GiB/,""); print $1 * 1024 } + else if ($0 ~ /MiB/) { gsub(/MiB/,""); print $1 } + else if ($0 ~ /KiB/) { gsub(/KiB/,""); print $1 / 1024 } + else { print $1 / 1048576 } + }') + echo "Memory usage: ${MEM_NUM} MB" + MAX_MB=700 + if awk "BEGIN {exit !($MEM_NUM > $MAX_MB)}"; then + echo "ERROR: Memory usage ${MEM_NUM} MB exceeds ${MAX_MB} MB threshold" + docker logs homarr-mem-test --tail 50 + exit 1 + fi + echo "Memory check passed: ${MEM_NUM} MB <= ${MAX_MB} MB" diff --git a/CHANGELOG.md b/CHANGELOG.md index a37858942..091f44325 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,10 @@ +## [1.68.1](https://github.com/homarr-labs/homarr/compare/v1.68.0...v1.68.1) (2026-06-30) + +### Bug Fixes + +* make source maps opt-in to restore v1.67.0 memory baseline ([57ef0af](https://github.com/homarr-labs/homarr/commit/57ef0af4a252ea39727caeba7e13587dabc6254e)), closes [#6123](https://github.com/homarr-labs/homarr/issues/6123) +* revert production source maps to restore v1.67.0 memory baseline ([60a69e3](https://github.com/homarr-labs/homarr/commit/60a69e31efc7168b8f4309daf75954d7730d883b)), closes [#6123](https://github.com/homarr-labs/homarr/issues/6123) + ## [1.68.0](https://github.com/homarr-labs/homarr/compare/v1.67.0...v1.68.0) (2026-06-26) ### Features diff --git a/Dockerfile b/Dockerfile index d50756e39..9c4d41de8 100644 --- a/Dockerfile +++ b/Dockerfile @@ -20,17 +20,6 @@ ARG DISABLE_REDIS_LOGS='true' RUN corepack enable pnpm && pnpm build -# The standalone output tracing omits server chunk source maps (.next/server/**/*.map), which is -# where production Node stack frames point. Copy the .map files into the standalone tree (preserving -# directory structure) so the existing standalone COPY ships them, keeping traces readable. -# See https://github.com/homarr-labs/homarr/issues/5891 -RUN cd apps/nextjs/.next/server && \ - find . -name '*.map' | while IFS= read -r map; do \ - dest="../standalone/apps/nextjs/.next/server/$map"; \ - mkdir -p "$(dirname "$dest")"; \ - cp "$map" "$dest"; \ - done - FROM base AS runner WORKDIR /app @@ -75,9 +64,6 @@ ENV DB_DRIVER='better-sqlite3' ENV AUTH_PROVIDERS='credentials' ENV REDIS_IS_EXTERNAL='false' ENV NODE_ENV='production' -# Tell Node to symbolicate stack traces using the shipped .map files so production logs -# show original source locations instead of minified frames, see https://github.com/homarr-labs/homarr/issues/5891 -ENV NODE_OPTIONS='--enable-source-maps' ENTRYPOINT [ "/app/entrypoint.sh" ] CMD ["sh", "run.sh"] diff --git a/apps/docs/docs/getting-started/installation/helm.md b/apps/docs/docs/getting-started/installation/helm.md index 8a3903bf1..d6a4b7342 100644 --- a/apps/docs/docs/getting-started/installation/helm.md +++ b/apps/docs/docs/getting-started/installation/helm.md @@ -2,9 +2,9 @@ homarr logo -![Version: 8.19.0](https://img.shields.io/badge/Version-8.19.0-informational?style=flat) +![Version: 8.20.0](https://img.shields.io/badge/Version-8.20.0-informational?style=flat) ![Type: application](https://img.shields.io/badge/Type-application-informational?style=flat) -![AppVersion: v1.60.0](https://img.shields.io/badge/AppVersion-v1.60.0-informational?style=flat) +![AppVersion: v1.68.0](https://img.shields.io/badge/AppVersion-v1.68.0-informational?style=flat) A Helm chart to deploy homarr for Kubernetes @@ -383,6 +383,7 @@ All available values are listed on the [artifacthub](https://artifacthub.io/pack | containerPorts | object | `{"http":{"port":7575,"protocol":"TCP"}}` | containerPorts defines the ports to open on the container. It is a map where each entry specifies: - `port` (int) (required): The port number to expose inside the container. - `protocol` (string) (required): The network protocol (TCP or UDP) used for the port. - `disabled` (bool) : Optional flag to disable this port (defaults to false). Can be overridden via Helm values. By default, this configuration exposes TCP port 7575 with the name `http`. | | database.migrationEnabled | bool | `true` | Database migration configuration. DB_MIGRATIONS_DISABLED Set to `true` to disable database migrations. Migrations are enabled by default (`false`). | | database.type | string | `"sqlite"` | Database type: sqlite, mysql or postgresql | +| env.AUTH_COOKIE_PREFIX | string | `"homarr"` | Prefix used for all authentication cookies. Change if you run another Auth.js/NextAuth app on the same hostname to avoid cookie name collisions. Only letters, numbers, hyphens and underscores. | | env.AUTH_LDAP_BASE | string | `nil` | Base dn of your LDAP server | | env.AUTH_LDAP_BIND_DN | string | `nil` | User used for finding users and groups | | env.AUTH_LDAP_GROUP_CLASS | string | `"groupOfUniqueNames"` | Class used for querying groups | @@ -395,7 +396,6 @@ All available values are listed on the [artifacthub](https://artifacthub.io/pack | env.AUTH_LDAP_USERNAME_FILTER_EXTRA_ARG | string | `nil` | Extra arguments for user search filter (& based) | | env.AUTH_LDAP_USER_MAIL_ATTRIBUTE | string | `"mail"` | Attribute used for mail field | | env.AUTH_LOGOUT_REDIRECT_URL | string | `nil` | URL to redirect to after clicking logging out. | -| env.AUTH_COOKIE_PREFIX | string | `"homarr"` | Prefix used for all authentication cookies. Change if you run another Auth.js/NextAuth app on the same hostname to avoid cookie name collisions. Only letters, numbers, hyphens and underscores. | | env.AUTH_OIDC_AUTO_LOGIN | string | `"false"` | Automatically redirect to OIDC login | | env.AUTH_OIDC_CLIENT_NAME | string | `"OIDC"` | Display name of provider (in login screen) | | env.AUTH_OIDC_GROUPS_ATTRIBUTE | string | `"groups"` | Attribute used for groups (roles) claim | diff --git a/apps/nextjs/next.config.ts b/apps/nextjs/next.config.ts index a00df48d8..636df3f52 100644 --- a/apps/nextjs/next.config.ts +++ b/apps/nextjs/next.config.ts @@ -31,8 +31,6 @@ const nextConfig: NextConfig = { }, output: "standalone", reactStrictMode: true, - // Ship browser source maps so production client stack traces are readable, see https://github.com/homarr-labs/homarr/issues/5891 - productionBrowserSourceMaps: true, // react compiler breaks mantine-react-table, so disabled for now //reactCompiler: true, /** We already do typechecking as separate tasks in CI */ @@ -43,8 +41,6 @@ const nextConfig: NextConfig = { */ serverExternalPackages: ["dockerode", "isomorphic-dompurify", "jsdom", "better-sqlite3"], experimental: { - // Ship server source maps so production Node stack traces in logs reference original source, see https://github.com/homarr-labs/homarr/issues/5891 - serverSourceMaps: true, optimizePackageImports: ["@mantine/core", "@mantine/hooks", "@tabler/icons-react"], turbopackFileSystemCacheForDev: true, preloadEntriesOnStart: false, diff --git a/package.json b/package.json index f1100ce54..3c8f2da6f 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "homarr", - "version": "1.68.0", + "version": "1.68.1", "private": true, "scripts": { "build": "cross-env CI=true turbo build",