Skip to content

Shared hosting (cPanel/Passenger) deployment hits multiple friction points., worth documenting or defaulting away from better-sqlite3 #1833

Description

@Titianbeetle

Description

I'm a non-developer web designer/site owner (WordPress background, ~8 years on shared hosting) evaluating EmDash as a potential WordPress alternative for small client sites. I tested a real deployment on ordinary cPanel shared hosting (AltusHost), which I think represents a meaningful chunk of your target audience if EmDash aims to be a WordPress successor. Many small agencies and site owners are on exactly this kind of hosting, not a VPS.

I hit three distinct issues in sequence trying to get a scaffolded EmDash project (Blog template, Node.js deployment target, SQLite/better-sqlite3) running in production on shared hosting, detailed below.

Expected: the app runs, or documentation clearly flags upfront that this environment won't work.
Actual: three separate blockers surfaced only through trial and error (see steps to reproduce).

Steps to reproduce

  1. Scaffold a new EmDash project (npm create emdash@latest), choosing Node.js as the deployment target and the default SQLite (better-sqlite3) database
  2. Deploy to ordinary cPanel/Passenger shared hosting (requires the host to support Node.js 22+ via the Node.js Selector. Many don't by default)
  3. Run npm run build directly on the shared hosting account > fails with a JavaScript heap out-of-memory error (V8 FATAL ERROR), due to the shared account's memory ceiling (4GB shared across the whole cPanel account, not dedicated to the build process)
  4. Workaround: build locally instead, upload the resulting dist/ folder, set it as the Passenger startup file
  5. Restart the app > runtime failure:
    Error: /lib64/libm.so.6: version `GLIBC_2.29' not found (required by .../better-sqlite3/build/Release/better_sqlite3.node)
  6. This is a hard blocker: the native binary compiled successfully against Node 22, but the server OS's glibc is older than the binary needs at runtime, not fixable without a full OS upgrade on the host's side

Environment

  • emdash version: 0.27.0
  • Node.js version: 22.22.3
  • Runtime: Node (cPanel/Passenger, shared hosting)
  • OS: Linux (AlmaLinux/CloudLinux, exact version unknown, managed shared hosting via AltusHost)
  • Host: AltusHost, shared hosting plan, cPanel with CloudLinux Node.js Selector

Logs / error output

1. npm install succeeded cleanly on the server, including native compilation of better-sqlite3 with no errors.

2. Running the build directly on shared hosting failed with:

FATAL ERROR: MarkCompactCollector: young object promotion failed Allocation failed - JavaScript heap out of memory
Out of memory error may be caused by hitting LVE limits
or "Max data size", "Max address space" or "Max resident set" process limits

(Building locally and uploading the dist/ output worked around this.)

3. After deploying the locally-built dist/ output, the app failed at runtime with:

Setup probe failed (non-fatal): Error: /lib64/libm.so.6: version `GLIBC_2.29' not found (required by .../nodevenv/.../better-sqlite3/build/Release/better_sqlite3.node)
    at Module._extensions..node (node:internal/modules/cjs/loader:1939:18)
    ...
    at new Database (.../better-sqlite3/lib/database.js:48:64)
    at createDialect$1 (.../dist/server/chunks/dialect_C8942KHB.mjs:15:39)
    at getDb (.../dist/server/chunks/loader-4K37qA-y_CRg9ZZEp.mjs:536:13) {
  code: 'ERR_DLOPEN_FAILED'
}

This confirms the native binary compiled successfully against the server's toolchain, but the server's runtime glibc is older than what the compiled binary requires (2.29+).

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't working

    Type

    No type

    Fields

    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions