feat(ops): name 1536 MB as the supported memory floor

The getting-started requirements now say a host needs 3 GB of RAM, 4 GB
recommended, and drop the advice to lower APP_MEMORY_LIMIT to 1g on a
2 GB host. The compose and .env example comments say the same.

At boot the app reads its cgroup memory limit (v2, then v1) and logs one
line when it is below MEMORY_FLOOR_MB. The support report adds the
container limit and a note below the floor, and Admin > System status
shows "below the supported floor" next to the existing low-heap flag.
The app keeps running either way.
This commit is contained in:
Marc-André Bombeck committed 2026-10-21 19:36:06 +02:00
1 parent 9941db1549
commit 07f9615dba
20 files changed
+313 -26

No files matched your search

+13 -2
View File
@@ -61,8 +61,19 @@ export interface SystemStatus {
buildTime: string;
startTime: string;
database: string;
/** The process's heap ceiling; `low` when it is below what a long-used account needs. */
memory: { heapLimitMb: number; low: boolean };
/**
* The process's heap ceiling; `low` when it is below what a long-used
* account needs. `containerLimitMb` is the container's memory limit
* (`null` when there is none or it cannot be read), `belowFloor` when it is
* under the supported floor of `floorMb`.
*/
memory: {
heapLimitMb: number;
low: boolean;
containerLimitMb: number | null;
floorMb: number;
belowFloor: boolean;
};
worker: WorkerStatus;
/**
* Queues whose jobs exhausted their retries recently. `null` means the
+15 -4
View File
@@ -164,11 +164,22 @@ export function SystemStatusSection() {
icon={MemoryStick}
label={t("admin.heapLimitLabel")}
value={
status.memory.low
? t("admin.heapLimitLow", { mb: status.memory.heapLimitMb })
: t("admin.heapLimitValue", { mb: status.memory.heapLimitMb })
status.memory.belowFloor && status.memory.containerLimitMb
? t("admin.memoryBelowFloor", {
mb: status.memory.containerLimitMb,
floor: status.memory.floorMb,
})
: status.memory.low
? t("admin.heapLimitLow", { mb: status.memory.heapLimitMb })
: t("admin.heapLimitValue", {
mb: status.memory.heapLimitMb,
})
}
tone={
status.memory.belowFloor || status.memory.low
? "warning"
: undefined
}
tone={status.memory.low ? "warning" : undefined}
/>
<StatusItem
icon={Clock}