Skip to content

ProxCenter #2322

Open
Open

Description

@MickLesk

Name of the Script

ProxCenter

Script Type

CT (LXC Container)

Does this script support arm64?

arm64 supported

📋 Script Details

ProxCenter is the unified management platform for your Proxmox VE and PBS infrastructures. Featuring intelligent DRS for automatic load balancing, NSX-inspired network micro-segmentation, real-time Ceph monitoring with AI-powered predictive analytics, cross-cluster replication with disaster recovery, centralized backup management, multi-channel alerts, CVE vulnerability scanning, custom infrastructure reports, Green IT energy metrics, and enterprise-grade RBAC with LDAP/AD/SSO integration.

There is a Community Edition for free that can be installed via this command: curl -fsSL https://proxcenter.io/install/community | sudo bash

community-scripts/ProxmoxVE#12036

Activity

  1. github-actions commented on Sep 27, 2026

    @github-actions
    Contributor

    The ProxCenter script is ready for testing:

    bash -c "$(curl -fsSL https://github.com/community-scripts/ProxmoxVED/raw/main/ct/proxcenter.sh)"
    

    There is no default account. The first visit to port 3000 opens a setup page that creates the administrator, and anyone who reaches that port can use it until then, so create the account right after the install.
    Connect your clusters with a dedicated Proxmox user and API token rather than root@pam. Keep Privilege Separation on and grant only what the features you use need: https://docs.proxcenter.io/getting-started/connect-proxmox#proxmox-permissions. On PBS, grant the ACL to the token itself as well, since PBS tokens inherit nothing from their user.
    This is the Community Edition. DRS load balancing, alerts, reports and notifications, MSP mode and high availability are Enterprise features that need ProxCenter's closed-source orchestrator, which this script does not install. A license key alone does not unlock them here.
    NEXTAUTH_URL and APP_URL in /opt/proxcenter_data/.env point at the container IP. If the IP changes, or you put ProxCenter behind a reverse proxy or a domain, update both and run systemctl restart proxcenter.

    Note: This is not in the official repo yet—it's just a dev version! After merging into ProxmoxVE, it will need to be recreated.

    Discord testing thread: https://discord.com/channels/1302816934508630047/1553709652921946303

  2. MickLesk commented on Sep 27, 2026

    @MickLesk
    MemberAuthor

    Currently it errors out;

      ✖️  in line 27: exit code 1 (General error / Operation not permitted): while executing command npm run build
    
      --- Last 20 lines of log ---
      48 |         imported++
      49 |       }
    
    Static analysis determined that this filesystem access causes the whole project to be traced and included in the output.
    This is usually unintentional and leads to all source files (including the public folder) to be deployed as part of the server code.
    This can slow down deployments or lead to failures when size limits are exceeded.
    To resolve this, you can
    - make sure the path is statically scoped to some subfolder, for example path.join(process.cwd(), 'data', bar), or
    - only use them in development, or
    - opt out by adding an ignore comment to the highlighted call: path.join(/*turbopackIgnore: true*/ ...), or
    - remove them.
    
    Import trace:
      Instrumentation:
        ./src/lib/branding/importDiskAssets.ts
        ./src/instrumentation-node.ts
        ./src/instrumentation.ts
    
    
    [2026-09-27 12:19:54] [ERROR] in line 27: exit code 1 (General error / Operation not permitted): while executing command npm run build
      -----------------------------------

    => Because it get an OOM, does the tool need more then 4GB for building? Did you check if you can serve an prebuild?

    940:FATAL ERROR: Ineffective mark-compacts near heap limit Allocation failed - JavaScript heap out of memory
    944: 2: 0x8410bd node::OOMErrorHandler(char const*, v8::OOMDetails const&) [/usr/bin/node]
    956:Failed to type check.
  3. adminsyspro commented on Sep 27, 2026

    @adminsyspro

    Thanks for testing! The Turbopack message about importDiskAssets.ts is only a warning. The build actually fails on the out-of-memory error during Next.js type checking. At 4 GB the build runs out of heap.

    Two options that should get it through:

    • raise the build memory: var_ram to 6144 or more, plus export NODE_OPTIONS="--max-old-space-size=6144" before npm run build
    • or skip the type check in the build step, since the release is already type checked in our CI

    We don't publish a prebuilt tarball today. Only the Docker images are prebuilt. The container runs fine with far less memory once the build is done.

  4. MickLesk commented on Sep 27, 2026

    @MickLesk
    MemberAuthor

    it fails with 8 Core and 8G too. I tested both;

    Here the 8CPU / 8G Run:

    found 0 vulnerabilities
    npm notice run proxcenter@1.4.10 build:icons
    npm notice run tsx src/assets/iconify-icons/bundle-icons-css.mjs
    Saved CSS to /opt/proxcenter/frontend/src/assets/iconify-icons/generated-icons.css!
    npm notice run proxcenter@1.4.10 npx
    npm notice run 'prisma' generate
    Loaded Prisma config from prisma.config.ts.
    
    Prisma schema loaded from prisma/schema.prisma.
    
    ✔ Generated Prisma Client (v7.9.1) to ./node_modules/@prisma/client in 384ms
    
    Start by importing your Prisma Client (See: https://pris.ly/d/importing-client)
    
    
    npm notice run proxcenter@1.4.10 build
    npm notice run next build
    ▲ Next.js 16.3.5 (Turbopack)
    ✓ Running next.config.mjs took 32ms
    Attention: Next.js now collects completely anonymous telemetry regarding usage.
    This information is used to shape Next.js' roadmap and prioritize features.
    You can learn more, including how to opt-out if you'd not like to participate in this anonymous program, by visiting the following URL:
    https://nextjs.org/telemetry
    
    - Experiments (use with caution):
      · proxyClientMaxBodySize: "10gb"
      · serverActions
    
      Creating an optimized production build ...
    ✓ Compiled successfully in 48s
    
    <--- Last few GCs --->
    
    [7009:0xb5a1000]    12774 ms: Incremental Mark-Compact (reduce) 1021.2 (1026.1) -> 1020.5 (1025.3) MB, pooled: 0.0 MB, 269.74 / 0.00 ms (+ 0.0 ms in 0 steps since start of marking, biggest step 0.0 ms, walltime since start of marking 272 ms) (average mu =[7009:0xb5a1000]    13116 ms: Mark-Compact 1020.5 (1025.3) -> 1020.5 (1025.3) MB, pooled: 0.0 MB, 341.79 / 0.00 ms (average mu = 0.160, current mu = 0.000) allocation failure; scavenge might not succeed
    
    FATAL ERROR: Ineffective mark-compacts near heap limit Allocation failed - JavaScript heap out of memory
    ----- Native stack trace -----
    
     1: 0x840e50  [/usr/bin/node]
     2: 0x8410bd node::OOMErrorHandler(char const*, v8::OOMDetails const&) [/usr/bin/node]
     3: 0xcd68bb  [/usr/bin/node]
     4: 0xf461e5  [/usr/bin/node]
     5: 0xf443ec  [/usr/bin/node]
     6: 0xf374b1  [/usr/bin/node]
     7: 0xf372ac  [/usr/bin/node]
     8: 0xf36c3f  [/usr/bin/node]
     9: 0xf1155d  [/usr/bin/node]
    10: 0xef6823  [/usr/bin/node]
    11: 0x12a0178  [/usr/bin/node]
    12: 0x13c5ae2  [/usr/bin/node]
    13: 0x1ae5a76  [/usr/bin/node]
    Failed to type check.
    
    Turbopack build encountered 12 warnings:
    ./src/lib/branding/importDiskAssets.ts:46:22
    Warning: The file pattern (<dynamic> '/branding/' <dynamic> '/' <dynamic> | <dynamic> 'branding/' <dynamic> '/' <dynamic> | <dynamic> '/' <dynamic> '/' <dynamic> '/' <dynamic> | <dynamic> '/' <dynamic> '/' <dynamic> | <dynamic> '/login-bg/' <dynamic> '/' <dynamic> | <dynamic> 'login-bg/' <dynamic> '/' <dynamic> | <dynamic> '/branding' <dynamic> '/' <dynamic> | <dynamic> 'branding' <dynamic> '/' <dynamic> | <dynamic> '/' <dynamic> '/' <dynamic> | <dynamic> '/' <dynamic> | <dynamic> '/login-bg' <dynamic> '/' <dynamic> | <dynamic> 'login-bg' <dynamic> '/' <dynamic> | <dynamic> '/branding/' <dynamic> | <dynamic> 'branding/' <dynamic> | <dynamic> '/' <dynamic> '/' <dynamic> | <dynamic> '/' <dynamic> | <dynamic> '/login-bg/' <dynamic> | <dynamic> 'login-bg/' <dynamic> | <dynamic> '/branding' <dynamic> | <dynamic> 'branding' <dynamic> | <dynamic> '/' <dynamic> | <dynamic> | <dynamic> '/login-bg' <dynamic> | <dynamic> 'login-bg' <dynamic>) matches 10393 files in [project]/
      44 |         const existing = await getAsset(tenantId, kind, slot)
      45 |         if (existing) { skipped++; continue }
    > 46 |         const data = fs.readFileSync(path.join(tenantDir, file))
         |                      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
      47 |         await putAsset(tenantId, kind, slot, ext, contentType, data)
      48 |         imported++
      49 |       }
    
    Overly broad patterns can lead to build performance issues and over bundling.
    
    Import trace:
      Instrumentation:
        ./src/lib/branding/importDiskAssets.ts
        ./src/instrumentation-node.ts
        ./src/instrumentation.ts
    
    
    ./src/lib/branding/importDiskAssets.ts:46:38
    Warning: The file pattern (<dynamic> '/branding/' <dynamic> '/' <dynamic> | <dynamic> 'branding/' <dynamic> '/' <dynamic> | <dynamic> '/' <dynamic> '/' <dynamic> '/' <dynamic> | <dynamic> '/' <dynamic> '/' <dynamic> | <dynamic> '/login-bg/' <dynamic> '/' <dynamic> | <dynamic> 'login-bg/' <dynamic> '/' <dynamic> | <dynamic> '/branding' <dynamic> '/' <dynamic> | <dynamic> 'branding' <dynamic> '/' <dynamic> | <dynamic> '/' <dynamic> '/' <dynamic> | <dynamic> '/' <dynamic> | <dynamic> '/login-bg' <dynamic> '/' <dynamic> | <dynamic> 'login-bg' <dynamic> '/' <dynamic> | <dynamic> '/branding/' <dynamic> | <dynamic> 'branding/' <dynamic> | <dynamic> '/' <dynamic> '/' <dynamic> | <dynamic> '/' <dynamic> | <dynamic> '/login-bg/' <dynamic> | <dynamic> 'login-bg/' <dynamic> | <dynamic> '/branding' <dynamic> | <dynamic> 'branding' <dynamic> | <dynamic> '/' <dynamic> | <dynamic> | <dynamic> '/login-bg' <dynamic> | <dynamic> 'login-bg' <dynamic>) matches 20456 files in [project]/
      44 |         const existing = await getAsset(tenantId, kind, slot)
      45 |         if (existing) { skipped++; continue }
    > 46 |         const data = fs.readFileSync(path.join(tenantDir, file))
         |                                      ^^^^^^^^^^^^^^^^^^^^^^^^^^
      47 |         await putAsset(tenantId, kind, slot, ext, contentType, data)
      48 |         imported++
      49 |       }
    
    Overly broad patterns can lead to build performance issues and over bundling.
    
    Import trace:
      Instrumentation:
        ./src/lib/branding/importDiskAssets.ts
        ./src/instrumentation-node.ts
        ./src/instrumentation.ts
    
    
    ./src/lib/branding/importDiskAssets.ts:37:25
    Warning: The file pattern (<dynamic> '/branding/' <dynamic> | <dynamic> 'branding/' <dynamic> | <dynamic> '/' <dynamic> '/' <dynamic> | <dynamic> '/' <dynamic> | <dynamic> '/login-bg/' <dynamic> | <dynamic> 'login-bg/' <dynamic> | <dynamic> '/branding' <dynamic> | <dynamic> 'branding' <dynamic> | <dynamic> '/' <dynamic> | <dynamic> | <dynamic> '/login-bg' <dynamic> | <dynamic> 'login-bg' <dynamic>) matches 10393 files in [project]/
      35 |     if (!fs.existsSync(kindDir)) continue
      36 |     for (const tenantId of fs.readdirSync(kindDir)) {
    > 37 |       const tenantDir = path.join(kindDir, tenantId)
         |                         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
      38 |       if (!fs.statSync(tenantDir).isDirectory()) continue
      39 |       for (const file of fs.readdirSync(tenantDir)) {
      40 |         const ext = (file.split('.').pop() || '').toLowerCase()
    
    Overly broad patterns can lead to build performance issues and over bundling.
    
    Import trace:
      Instrumentation:
        ./src/lib/branding/importDiskAssets.ts
        ./src/instrumentation-node.ts
        ./src/instrumentation.ts
    
    
    ./src/lib/branding/importDiskAssets.ts:39:26
    Warning: The file pattern (<dynamic> '/branding/' <dynamic> | <dynamic> 'branding/' <dynamic> | <dynamic> '/' <dynamic> '/' <dynamic> | <dynamic> '/' <dynamic> | <dynamic> '/login-bg/' <dynamic> | <dynamic> 'login-bg/' <dynamic> | <dynamic> '/branding' <dynamic> | <dynamic> 'branding' <dynamic> | <dynamic> '/' <dynamic> | <dynamic> | <dynamic> '/login-bg' <dynamic> | <dynamic> 'login-bg' <dynamic>) matches 10393 files in [project]/
      37 |       const tenantDir = path.join(kindDir, tenantId)
      38 |       if (!fs.statSync(tenantDir).isDirectory()) continue
    > 39 |       for (const file of fs.readdirSync(tenantDir)) {
         |                          ^^^^^^^^^^^^^^^^^^^^^^^^^
      40 |         const ext = (file.split('.').pop() || '').toLowerCase()
      41 |         const contentType = MIME_BY_EXT[ext]
      42 |         if (!contentType) { skipped++; continue }
    
    Overly broad patterns can lead to build performance issues and over bundling.
    
    Import trace:
      Instrumentation:
        ./src/lib/branding/importDiskAssets.ts
        ./src/instrumentation-node.ts
        ./src/instrumentation.ts
    
    
    ./src/lib/branding/importDiskAssets.ts:35:10
    Warning: Dynamic filesystem access causes tracing of the whole project
      33 |   for (const { dir, kind } of KIND_DIRS) {
      34 |     const kindDir = path.join(rootDir, dir)
    > 35 |     if (!fs.existsSync(kindDir)) continue
         |          ^^^^^^^^^^^^^^^^^^^^^^
      36 |     for (const tenantId of fs.readdirSync(kindDir)) {
      37 |       const tenantDir = path.join(kindDir, tenantId)
      38 |       if (!fs.statSync(tenantDir).isDirectory()) continue
    
    Static analysis determined that this filesystem access causes the whole project to be traced and included in the output.
    This is usually unintentional and leads to all source files (including the public folder) to be deployed as part of the server code.
    This can slow down deployments or lead to failures when size limits are exceeded.
    To resolve this, you can
    - make sure the path is statically scoped to some subfolder, for example path.join(process.cwd(), 'data', bar), or
    - only use them in development, or
    - opt out by adding an ignore comment to the highlighted call: fs.existsSync(/*turbopackIgnore: true*/ ...), or
    - remove them.
    
    Import trace:
      Instrumentation:
        ./src/lib/branding/importDiskAssets.ts
        ./src/instrumentation-node.ts
        ./src/instrumentation.ts
    
    
    ./src/lib/branding/importDiskAssets.ts:46:22
    Warning: Dynamic filesystem access causes tracing of the whole project
      44 |         const existing = await getAsset(tenantId, kind, slot)
      45 |         if (existing) { skipped++; continue }
    > 46 |         const data = fs.readFileSync(path.join(tenantDir, file))
         |                      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
      47 |         await putAsset(tenantId, kind, slot, ext, contentType, data)
      48 |         imported++
      49 |       }
    
    Static analysis determined that this filesystem access causes the whole project to be traced and included in the output.
    This is usually unintentional and leads to all source files (including the public folder) to be deployed as part of the server code.
    This can slow down deployments or lead to failures when size limits are exceeded.
    To resolve this, you can
    - make sure the path is statically scoped to some subfolder, for example path.join(process.cwd(), 'data', bar), or
    - only use them in development, or
    - opt out by adding an ignore comment to the highlighted call: fs.readFileSync(/*turbopackIgnore: true*/ ...), or
    - remove them.
    
    Import trace:
      Instrumentation:
        ./src/lib/branding/importDiskAssets.ts
        ./src/instrumentation-node.ts
        ./src/instrumentation.ts
    
    
    ./src/lib/branding/importDiskAssets.ts:36:28
    Warning: Dynamic filesystem access causes tracing of the whole project
      34 |     const kindDir = path.join(rootDir, dir)
      35 |     if (!fs.existsSync(kindDir)) continue
    > 36 |     for (const tenantId of fs.readdirSync(kindDir)) {
         |                            ^^^^^^^^^^^^^^^^^^^^^^^
      37 |       const tenantDir = path.join(kindDir, tenantId)
      38 |       if (!fs.statSync(tenantDir).isDirectory()) continue
      39 |       for (const file of fs.readdirSync(tenantDir)) {
    
    Static analysis determined that this filesystem access causes the whole project to be traced and included in the output.
    This is usually unintentional and leads to all source files (including the public folder) to be deployed as part of the server code.
    This can slow down deployments or lead to failures when size limits are exceeded.
    To resolve this, you can
    - make sure the path is statically scoped to some subfolder, for example path.join(process.cwd(), 'data', bar), or
    - only use them in development, or
    - opt out by adding an ignore comment to the highlighted call: fs.readdir(/*turbopackIgnore: true*/ ...), or
    - remove them.
    
    Import trace:
      Instrumentation:
        ./src/lib/branding/importDiskAssets.ts
        ./src/instrumentation-node.ts
        ./src/instrumentation.ts
    
    
    ./src/lib/branding/importDiskAssets.ts:39:26
    Warning: Dynamic filesystem access causes tracing of the whole project
      37 |       const tenantDir = path.join(kindDir, tenantId)
      38 |       if (!fs.statSync(tenantDir).isDirectory()) continue
    > 39 |       for (const file of fs.readdirSync(tenantDir)) {
         |                          ^^^^^^^^^^^^^^^^^^^^^^^^^
      40 |         const ext = (file.split('.').pop() || '').toLowerCase()
      41 |         const contentType = MIME_BY_EXT[ext]
      42 |         if (!contentType) { skipped++; continue }
    
    Static analysis determined that this filesystem access causes the whole project to be traced and included in the output.
    This is usually unintentional and leads to all source files (including the public folder) to be deployed as part of the server code.
    This can slow down deployments or lead to failures when size limits are exceeded.
    To resolve this, you can
    - make sure the path is statically scoped to some subfolder, for example path.join(process.cwd(), 'data', bar), or
    - only use them in development, or
    - opt out by adding an ignore comment to the highlighted call: fs.readdir(/*turbopackIgnore: true*/ ...), or
    - remove them.
    
    Import trace:
      Instrumentation:
        ./src/lib/branding/importDiskAssets.ts
        ./src/instrumentation-node.ts
        ./src/instrumentation.ts
    
    
    ./src/lib/branding/importDiskAssets.ts:38:12
    Warning: Dynamic filesystem access causes tracing of the whole project
      36 |     for (const tenantId of fs.readdirSync(kindDir)) {
      37 |       const tenantDir = path.join(kindDir, tenantId)
    > 38 |       if (!fs.statSync(tenantDir).isDirectory()) continue
         |            ^^^^^^^^^^^^^^^^^^^^^^
      39 |       for (const file of fs.readdirSync(tenantDir)) {
      40 |         const ext = (file.split('.').pop() || '').toLowerCase()
      41 |         const contentType = MIME_BY_EXT[ext]
    
    Static analysis determined that this filesystem access causes the whole project to be traced and included in the output.
    This is usually unintentional and leads to all source files (including the public folder) to be deployed as part of the server code.
    This can slow down deployments or lead to failures when size limits are exceeded.
    To resolve this, you can
    - make sure the path is statically scoped to some subfolder, for example path.join(process.cwd(), 'data', bar), or
    - only use them in development, or
    - opt out by adding an ignore comment to the highlighted call: fs.statSync(/*turbopackIgnore: true*/ ...), or
    - remove them.
    
    Import trace:
      Instrumentation:
        ./src/lib/branding/importDiskAssets.ts
        ./src/instrumentation-node.ts
        ./src/instrumentation.ts
    
    
    ./src/lib/branding/importDiskAssets.ts:34:21
    Warning: Dynamic filesystem access causes tracing of the whole project
      32 |
      33 |   for (const { dir, kind } of KIND_DIRS) {
    > 34 |     const kindDir = path.join(rootDir, dir)
         |                     ^^^^^^^^^^^^^^^^^^^^^^^
      35 |     if (!fs.existsSync(kindDir)) continue
      36 |     for (const tenantId of fs.readdirSync(kindDir)) {
      37 |       const tenantDir = path.join(kindDir, tenantId)
    
    Static analysis determined that this filesystem access causes the whole project to be traced and included in the output.
    This is usually unintentional and leads to all source files (including the public folder) to be deployed as part of the server code.
    This can slow down deployments or lead to failures when size limits are exceeded.
    To resolve this, you can
    - make sure the path is statically scoped to some subfolder, for example path.join(process.cwd(), 'data', bar), or
    - only use them in development, or
    - opt out by adding an ignore comment to the highlighted call: path.join(/*turbopackIgnore: true*/ ...), or
    - remove them.
    
    Import trace:
      Instrumentation:
        ./src/lib/branding/importDiskAssets.ts
        ./src/instrumentation-node.ts
        ./src/instrumentation.ts
    
    
    ./src/lib/branding/importDiskAssets.ts:37:25
    Warning: Dynamic filesystem access causes tracing of the whole project
      35 |     if (!fs.existsSync(kindDir)) continue
      36 |     for (const tenantId of fs.readdirSync(kindDir)) {
    > 37 |       const tenantDir = path.join(kindDir, tenantId)
         |                         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
      38 |       if (!fs.statSync(tenantDir).isDirectory()) continue
      39 |       for (const file of fs.readdirSync(tenantDir)) {
      40 |         const ext = (file.split('.').pop() || '').toLowerCase()
    
    Static analysis determined that this filesystem access causes the whole project to be traced and included in the output.
    This is usually unintentional and leads to all source files (including the public folder) to be deployed as part of the server code.
    This can slow down deployments or lead to failures when size limits are exceeded.
    To resolve this, you can
    - make sure the path is statically scoped to some subfolder, for example path.join(process.cwd(), 'data', bar), or
    - only use them in development, or
    - opt out by adding an ignore comment to the highlighted call: path.join(/*turbopackIgnore: true*/ ...), or
    - remove them.
    
    Import trace:
      Instrumentation:
        ./src/lib/branding/importDiskAssets.ts
        ./src/instrumentation-node.ts
        ./src/instrumentation.ts
    
    
    ./src/lib/branding/importDiskAssets.ts:46:38
    Warning: Dynamic filesystem access causes tracing of the whole project
      44 |         const existing = await getAsset(tenantId, kind, slot)
      45 |         if (existing) { skipped++; continue }
    > 46 |         const data = fs.readFileSync(path.join(tenantDir, file))
         |                                      ^^^^^^^^^^^^^^^^^^^^^^^^^^
      47 |         await putAsset(tenantId, kind, slot, ext, contentType, data)
      48 |         imported++
      49 |       }
    
    Static analysis determined that this filesystem access causes the whole project to be traced and included in the output.
    This is usually unintentional and leads to all source files (including the public folder) to be deployed as part of the server code.
    This can slow down deployments or lead to failures when size limits are exceeded.
    To resolve this, you can
    - make sure the path is statically scoped to some subfolder, for example path.join(process.cwd(), 'data', bar), or
    - only use them in development, or
    - opt out by adding an ignore comment to the highlighted call: path.join(/*turbopackIgnore: true*/ ...), or
    - remove them.
    
    Import trace:
      Instrumentation:
        ./src/lib/branding/importDiskAssets.ts
        ./src/instrumentation-node.ts
        ./src/instrumentation.ts
    
  5. MickLesk commented on Sep 27, 2026

    @MickLesk
    MemberAuthor

    I'm going to remove the testing feature for now until this issue is resolved; after all, it doesn't do users any good if they're constantly running out of memory.

  6. adminsyspro commented on Sep 27, 2026

    @adminsyspro

    The build needs more than 6 GB because next build keeps about 3.3 GB after compiling, while its TypeScript check needs another 3 GB of heap. That check has already run in our CI for every released tag.

    adminsyspro/proxcenter-ui#1020 is merged: setting PROXCENTER_SKIP_TYPECHECK=1 skips it. In a 2 vCPU / 4 GB LXC, the build then completes in about 100 s, and the app runs at around 300 MB. It will be available in v1.4.11, which ships next week. The only change needed in the install script is:

    export PROXCENTER_SKIP_TYPECHECK=1
    $STD npm run build

    The README now also has a "Build from source" section.

  7. github-actions commented on Oct 7, 2026

    @github-actions
    Contributor
  8. github-actions commented on Oct 16, 2026

    @github-actions
    Contributor

    A PR has been created for proxcenter: community-scripts/ProxmoxVE#17961

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions