You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
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 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.
✖️ 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.
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.
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
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.
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.
Activity
github-actions commentedon Sep 27, 2026
The ProxCenter script is ready for testing:
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
MickLesk commentedon Sep 27, 2026
Currently it errors out;
=> Because it get an OOM, does the tool need more then 4GB for building? Did you check if you can serve an prebuild?
adminsyspro commentedon Sep 27, 2026
Thanks for testing! The Turbopack message about
importDiskAssets.tsis 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:
var_ramto 6144 or more, plusexport NODE_OPTIONS="--max-old-space-size=6144"beforenpm run buildWe 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.
MickLesk commentedon Sep 27, 2026
it fails with 8 Core and 8G too. I tested both;
Here the 8CPU / 8G Run:
MickLesk commentedon Sep 27, 2026
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.
adminsyspro commentedon Sep 27, 2026
The build needs more than 6 GB because
next buildkeeps 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=1skips 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:The README now also has a "Build from source" section.
github-actions commentedon Oct 7, 2026
github-actions commentedon Oct 16, 2026
A PR has been created for proxcenter: community-scripts/ProxmoxVE#17961