Skip to content

ECS/Fargate deployment: privileged ports, no way to disable optional services, NGINX_PORT undocumented #315

@mdwt

Description

@mdwt

When deploying Plunk to AWS ECS Fargate, several issues arise because the container runs as non-root user plunk (uid 1001):

  1. Wiki (port 1000) and SMTP (ports 465/587) crash-loop on privileged ports

Fargate containers run as non-root by default. Ports below 1024 require root or CAP_NET_BIND_SERVICE. The wiki hardcodes port 1000 and SMTP hardcodes 465/587 in the PM2 ecosystem config (docker-entrypoint-nginx.sh), causing immediate EACCES: permission denied
crash-loops.

These ports are not configurable via environment variables.

  1. No way to disable optional services

The SERVICE env var only supports api, worker, web, and all. When running SERVICE=all (required for the nginx reverse proxy setup), all 7 services start unconditionally — including wiki and SMTP which may not be needed.

There's no DISABLE_SMTP or DISABLE_WIKI env var to skip them. The crash-loops are cosmetic (PM2 keeps restarting them without killing healthy services), but they waste resources and pollute logs.

  1. Nginx port 80 also fails as non-root

NGINX_PORT env var exists in setup-nginx.sh and works, but it's not documented anywhere. Users deploying to non-root environments have no way to discover it. Also, NGINX_PORT can't be set to 8080 because the API upstream already uses that port — this conflict
isn't obvious.

  1. NEXT_PUBLIC_* env vars not inlined by Turbopack

The Dockerfile passes NEXT_PUBLIC_API_URI etc. at build time, but Turbopack (Next.js 15) doesn't inline them into client-side JS bundles. The built output contains:

let uf = process.env.NEXT_PUBLIC_API_URI || "http://localhost:8080"

Instead of the expected inlined value. The process.env reference works server-side but falls back to localhost:8080 in the browser. The sed replacement in replace-urls-optimized.sh expects the placeholder URL to be baked in, so it finds nothing to replace in
client chunks.

Suggested fixes

  1. Make wiki and SMTP ports configurable via WIKI_PORT and SMTP_PORT env vars (default to current values for backwards compat)
  2. Add DISABLE_SMTP and DISABLE_WIKI env vars to conditionally exclude them from the PM2 ecosystem
  3. Document NGINX_PORT in self-hosting docs and note the port 8080 conflict with the API upstream
  4. Add env block to next.config.js for all Next.js apps to force Turbopack to inline NEXT_PUBLIC_* vars at build time:
    env: {
    NEXT_PUBLIC_API_URI: process.env.NEXT_PUBLIC_API_URI,
    NEXT_PUBLIC_DASHBOARD_URI: process.env.NEXT_PUBLIC_DASHBOARD_URI,
    NEXT_PUBLIC_LANDING_URI: process.env.NEXT_PUBLIC_LANDING_URI,
    NEXT_PUBLIC_WIKI_URI: process.env.NEXT_PUBLIC_WIKI_URI,
    }

Environment

  • AWS ECS Fargate (linux/amd64)
  • Plunk Docker image built from next branch
  • Container runs as non-root user plunk (uid 1001)

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type
    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