Monal Paris - Fine Dining Platform
We built and run the live platform for Monal Restaurant Paris (cuisine indienne gastronomique) at www.monalparis.fr - public site, QR menu, online ordering paths, admin tools, and a zero-downtime EC2 deploy pipeline.
Visit www.monalparis.fr →Architecture & workflows
How this product is built, deployed, and operated in production.
Production architecture
How public traffic reaches Next.js, Express, RDS, and private menu assets.
CI/CD deploy workflow
Push to master triggers GitHub Actions SSH deploy with atomic .next swap and PM2 reload.
One-time EC2 bootstrap
First-time server setup before automated deploys.
Local development
Concurrent Next + Express against Supabase in development.
nginx request routing
API and uploads go to Express; everything else to Next.js.
Menu PDF + QR product flow
Guests open /carte from printed QR; PDF is served from a private API path, not public uploads.
Environments
APP_ENV switches between Supabase (dev) and AWS RDS (production).
How the pieces fit
| Flow | What happens |
|---|---|
| Deploy | Push master → Actions SSH to EC2 → git reset --hard → deploy/update.sh (install, build BE/FE into .next-new, swap, db:push, PM2 reload). |
| Runtime | nginx terminates public HTTP(S); Next serves the site; Express serves API, uploads, and private menu PDF. |
| Zero-downtime build | Live app keeps .next while the new build goes to .next-new, then directories are swapped before PM2 reload. |
| Menu | Guests use /carte (QR); PDF bytes come from /api/menu/pdf, not /uploads. |
Challenge
The restaurant needed a bilingual fine-dining web presence with a printable QR carte, private menu PDF delivery, image uploads, and admin/superadmin control - without downtime during deploys and without exposing private menu files on a public uploads path.
How we did it
Shipped a Next.js frontend and Express API behind nginx on AWS EC2 (PM2), with Postgres on AWS RDS in production and Supabase in development. GitHub Actions SSHs to the server, builds backend + frontend into an atomic .next-new swap, runs prisma db:push, then reloads PM2. Menu PDF bytes are served from /api/menu/pdf over a private backend path; /uploads is for images only.
Outcome
Monal Paris is live in production: guests discover the restaurant, open the QR carte, and order online; staff manage content through admin; deploys stay online while the new build swaps in.
Tech stack
Step-by-step
- 1
Visitor / QR
Phone or browser hits www.monalparis.fr via DNS
- 2
nginx
Terminates HTTP(S); routes pages to Next and /api|/uploads to Express
- 3
Next.js
SSR marketing, /carte, /menu, and admin UI on PM2 :3000
- 4
Express API
Orders, auth, uploads, and private menu PDF on PM2 :4000
- 5
RDS + deploy
Postgres on RDS; master push → Actions → atomic .next swap + PM2 reload
Want a similar build?
Tell us your use case and we will map a practical delivery plan.
Start a conversation