winofy-front/README.md
Afra ‌ bf1dc0b346 feat: dockerize (multi-stage build, standalone output)
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.
2026-08-19 11:00:09 +03:30

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.