Dockerfile: deps -> builder -> runner. NEXT_PUBLIC_* vars are passed as
build args (inlined into the client bundle at build time, per Next.js);
everything else is read at container runtime instead (docker-compose.yml's
env_file / docker run --env-file) and never baked into an image layer.
Runner stage is non-root, ships only server.js + .next/static + public/
via output: "standalone".
Verified by actually running the build twice locally (Docker itself isn't
available in this environment) -- once with the real .env.local, once with
only placeholder values and no .env.local at all, matching the real Docker
build condition. The second run caught a real, pre-existing bug that had
nothing to do with Docker specifically: /login and three other
client-component trees (location/error, location/permission,
CategoryChips and NeighborhoodSearch nested in Server Component pages) all
call useSearchParams() without a Suspense boundary. next dev tolerates
this; next build hard-fails on it ("missing-suspense-with-csr-bailout").
This would have broken any production build -- Vercel, bare metal,
whatever -- not just Docker; fixed all four by wrapping in <Suspense>.
Also added .env.example (committed, no real values -- .env.local itself
stays gitignored) and a docker-compose.yml, with the --env-file .env.local
requirement called out explicitly in README.md since Compose only
auto-reads a file literally named .env, not .env.local.
61 lines
2.7 KiB
Markdown
61 lines
2.7 KiB
Markdown
This is a [Next.js](https://nextjs.org) project bootstrapped with [`create-next-app`](https://nextjs.org/docs/app/api-reference/cli/create-next-app).
|
|
|
|
## Getting Started
|
|
|
|
First, run the development server:
|
|
|
|
```bash
|
|
npm run dev
|
|
# or
|
|
yarn dev
|
|
# or
|
|
pnpm dev
|
|
# or
|
|
bun dev
|
|
```
|
|
|
|
Open [http://localhost:3000](http://localhost:3000) with your browser to see the result.
|
|
|
|
You can start editing the page by modifying `app/page.tsx`. The page auto-updates as you edit the file.
|
|
|
|
This project uses [`next/font`](https://nextjs.org/docs/app/building-your-application/optimizing/fonts) to automatically optimize and load [Geist](https://vercel.com/font), a new font family for Vercel.
|
|
|
|
## Learn More
|
|
|
|
To learn more about Next.js, take a look at the following resources:
|
|
|
|
- [Next.js Documentation](https://nextjs.org/docs) - learn about Next.js features and API.
|
|
- [Learn Next.js](https://nextjs.org/learn) - an interactive Next.js tutorial.
|
|
|
|
You can check out [the Next.js GitHub repository](https://github.com/vercel/next.js) - your feedback and contributions are welcome!
|
|
|
|
## Docker
|
|
|
|
`NEXT_PUBLIC_*` vars are inlined into the client bundle at *build* time, so they must be passed as build args, not just runtime env — everything else (Gooyal client secret, session secret, API base URL) is read at runtime instead, and should never be baked into an image layer.
|
|
|
|
**Compose (recommended):**
|
|
```bash
|
|
cp .env.example .env.local # fill in real values
|
|
docker compose --env-file .env.local up --build
|
|
```
|
|
The `--env-file .env.local` flag matters — without it, Compose falls back to a `.env` file (which this repo doesn't use) for the `NEXT_PUBLIC_*` build-arg substitution in `docker-compose.yml`, and you'll get a client bundle built with empty values.
|
|
|
|
**Plain `docker build`/`run`:**
|
|
```bash
|
|
docker build \
|
|
--build-arg NEXT_PUBLIC_GOOYAL_ACCOUNTS_BASE_URL=https://accounts-staging.gooyal.ir \
|
|
--build-arg NEXT_PUBLIC_GOOYAL_CLIENT_ID=<...> \
|
|
--build-arg NEXT_PUBLIC_GOOYAL_CLIENT_SECRET=<...> \
|
|
--build-arg NEXT_PUBLIC_GOOYAL_OAUTH_SCOPE="<...>" \
|
|
-t winofy .
|
|
|
|
docker run --env-file .env.local -p 3000:3000 winofy
|
|
```
|
|
|
|
The image is a multi-stage build using Next's [`output: "standalone"`](https://nextjs.org/docs/app/api-reference/config/next-config-js/output) — the final runtime image ships only `server.js`, `.next/static`, and `public/`, runs as a non-root user, and listens on `$PORT` (default `3000`).
|
|
|
|
## Deploy on Vercel
|
|
|
|
The easiest way to deploy your Next.js app is to use the [Vercel Platform](https://vercel.com/new?utm_medium=default-template&filter=next.js&utm_source=create-next-app&utm_campaign=create-next-app-readme) from the creators of Next.js.
|
|
|
|
Check out our [Next.js deployment documentation](https://nextjs.org/docs/app/building-your-application/deploying) for more details.
|