# Deploying to Coolify This project ships with a `Dockerfile` and a `docker-compose.yml` that work with **Coolify v4** out of the box. ## Quick start 1. **Create a new Application** in Coolify - Source: **Git Repository** - Repository URL: `http://forgejo-b82b4lpyyzyg40thdsjdd38i.163.245.214.68.sslip.io/David/MEGAINFRA-WEBAPP.git` - Branch: `main` - Build Pack: **`Dockerfile`** - Port: **`3000`** 2. **Set the environment variables** (Coolify → Application → Environment Variables): | Key | Value | Notes | | --- | --- | --- | | `NEXT_PUBLIC_APP_PIN` | `2468` | The PIN the login screen accepts. Change this in production. | | `NEXT_PUBLIC_APP_NAME` | `MEGA INFRASTRUCTURE` | Shown on the lock screen. | | `NEXT_PUBLIC_DEFAULT_THEME` | `light` | `light` or `dark`. | 3. **Expose the port** — Coolify's Traefik will route traffic to the container on port 3000. The server binds to `0.0.0.0` so it accepts connections from any host. 4. **Healthcheck** — `GET /api/health` returns a 200 JSON payload with the live counts and is wired as the Docker `HEALTHCHECK`. ## What the Dockerfile does - **Multi-stage build**: it caches `npm ci` separately from the source copy, so unchanged dependencies don't invalidate the build layer. - **Next.js standalone output**: with `output: "standalone"` in `next.config.js`, the build produces a self-contained `.next/standalone/` directory with a trimmed `node_modules` and a `server.js` entry point. - **Non-root runtime**: the server runs as a dedicated `nextjs` user. - **PWA service worker**: `next build` regenerates `public/sw.js`, `public/workbox-*.js` and `public/manifest.json` from the `@ducanh2912/next-pwa` plugin. The `.dockerignore` deliberately excludes the pre-built versions so the build always ships the right hashes for the new release. ## Build-time concern: the dev-only patch `scripts/patch-next-dev-blocker.cjs` patches Next 16's dev-only cross-site guard so `next dev` accepts requests from any host (LAN, tunneled domains, etc.). The patched module is **only loaded by `next dev`** — never by the production server — so the Dockerfile runs `npm ci --ignore-scripts` in the `deps` stage to skip the postinstall hook entirely. The patch script is also self-resilient: it detects when `node_modules/next` is absent and exits 0 cleanly. ## Environment variables Anything prefixed with `NEXT_PUBLIC_` is inlined into the client bundle at build time. If you change `NEXT_PUBLIC_APP_PIN`, you **must rebuild** the image — Coolify will not pick up the change otherwise. | Variable | Required | Default | Purpose | | --- | --- | --- | --- | | `NEXT_PUBLIC_APP_PIN` | Yes | `2468` | Login PIN. | | `NEXT_PUBLIC_APP_NAME` | No | `MEGA INFRASTRUCTURE` | Brand name on the lock screen. | | `NEXT_PUBLIC_DEFAULT_THEME` | No | `light` | Default theme before user preference is read from localStorage. | | `NEXT_PUBLIC_API_BASE_URL` | No | unset | When you wire PocketBase, point this at the backend. | | `POCKETBASE_URL` | No | unset | Backend URL for server-side requests. | | `POCKETBASE_TOKEN` | No | unset | Server-side auth token. | ## Useful Coolify probes | Probe | URL | Expects | | --- | --- | --- | | Liveness | `GET /api/health` | 200 with JSON body | | Auth gate | `GET /login` | 200 HTML | ## Local smoke test ```bash docker compose up --build # wait ~2 minutes for the first build open http://localhost:3000/login # default PIN: 2468 ```