← Back to Projects
Software2025 - OngoingLive in production

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

FlowWhat happens
DeployPush master → Actions SSH to EC2 → git reset --hard → deploy/update.sh (install, build BE/FE into .next-new, swap, db:push, PM2 reload).
Runtimenginx terminates public HTTP(S); Next serves the site; Express serves API, uploads, and private menu PDF.
Zero-downtime buildLive app keeps .next while the new build goes to .next-new, then directories are swapped before PM2 reload.
MenuGuests 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

Next.jsExpressPostgreSQLPrismaAWS EC2AWS RDSnginxPM2GitHub ActionsSupabase (dev)

Step-by-step

  1. 1

    Visitor / QR

    Phone or browser hits www.monalparis.fr via DNS

  2. 2

    nginx

    Terminates HTTP(S); routes pages to Next and /api|/uploads to Express

  3. 3

    Next.js

    SSR marketing, /carte, /menu, and admin UI on PM2 :3000

  4. 4

    Express API

    Orders, auth, uploads, and private menu PDF on PM2 :4000

  5. 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