feat(connect): Phase 7 — Docker & nginx for connect_frontend

connect_frontend/Dockerfile
  Multi-stage build: node:20-alpine builds both menu-app and
  manager-app in parallel stages, then nginx:alpine serves both
  dist folders under /menu and /manage respectively.
  VITE_CLOUD_URL passed as build arg so the API URL is baked
  in at build time (standard Vite pattern).

connect_frontend/nginx-connect.conf
  Single nginx server block:
    /menu/   → /usr/share/nginx/html/menu  (SPA fallback)
    /manage/ → /usr/share/nginx/html/manage (SPA fallback)
    /health  → 200 ok

nginx-connect.conf
  Kept at cloud-service root for reference / standalone use.

docker-compose.yml
  connect_frontend service added:
    - build context: ./connect_frontend
    - VITE_CLOUD_URL passed from root .env
    - port 3100:80
    - depends_on cloud_backend

Individual Dockerfiles also added to menu-app/ and manager-app/
for standalone builds if needed.

To deploy:
  docker compose build connect_frontend
  docker compose up -d connect_frontend

  Public menu:    http://<host>:3100/menu/<site_slug>
  Manager app:    http://<host>:3100/manage/

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-06-01 01:00:56 +03:00
parent 7d75ef44f7
commit b45a93a559
6 changed files with 100 additions and 0 deletions

View File

@@ -0,0 +1,25 @@
# Build menu-app
FROM node:20-alpine AS menu-builder
WORKDIR /app/menu-app
COPY menu-app/package.json .
RUN npm install
COPY menu-app/ .
ARG VITE_CLOUD_URL=
ENV VITE_CLOUD_URL=$VITE_CLOUD_URL
RUN npm run build
# Build manager-app
FROM node:20-alpine AS manager-builder
WORKDIR /app/manager-app
COPY manager-app/package.json .
RUN npm install
COPY manager-app/ .
ARG VITE_CLOUD_URL=
ENV VITE_CLOUD_URL=$VITE_CLOUD_URL
RUN npm run build
# Serve both with nginx
FROM nginx:alpine
COPY --from=menu-builder /app/menu-app/dist /usr/share/nginx/html/menu
COPY --from=manager-builder /app/manager-app/dist /usr/share/nginx/html/manage
COPY nginx-connect.conf /etc/nginx/conf.d/default.conf

View File

@@ -0,0 +1,11 @@
FROM node:20-alpine AS builder
WORKDIR /app
COPY package.json .
RUN npm install
COPY . .
ARG VITE_CLOUD_URL=
ENV VITE_CLOUD_URL=$VITE_CLOUD_URL
RUN npm run build
FROM nginx:alpine
COPY --from=builder /app/dist /usr/share/nginx/html/manage

View File

@@ -0,0 +1,11 @@
FROM node:20-alpine AS builder
WORKDIR /app
COPY package.json .
RUN npm install
COPY . .
ARG VITE_CLOUD_URL=
ENV VITE_CLOUD_URL=$VITE_CLOUD_URL
RUN npm run build
FROM nginx:alpine
COPY --from=builder /app/dist /usr/share/nginx/html/menu

View File

@@ -0,0 +1,21 @@
server {
listen 80;
# Public menu SPA
location /menu/ {
alias /usr/share/nginx/html/menu/;
try_files $uri $uri/ /menu/index.html;
}
# Remote manager SPA
location /manage/ {
alias /usr/share/nginx/html/manage/;
try_files $uri $uri/ /manage/index.html;
}
# Health check
location /health {
return 200 'ok';
add_header Content-Type text/plain;
}
}

View File

@@ -17,5 +17,16 @@ services:
ports:
- "5175:80"
restart: unless-stopped
depends_on:
- cloud_backend
connect_frontend:
build:
context: ./connect_frontend
args:
VITE_CLOUD_URL: ${VITE_CLOUD_URL}
ports:
- "3100:80"
restart: unless-stopped
depends_on:
- cloud_backend

21
nginx-connect.conf Normal file
View File

@@ -0,0 +1,21 @@
server {
listen 80;
# Public menu SPA
location /menu/ {
alias /usr/share/nginx/html/menu/;
try_files $uri $uri/ /menu/index.html;
}
# Remote manager SPA
location /manage/ {
alias /usr/share/nginx/html/manage/;
try_files $uri $uri/ /manage/index.html;
}
# Health check
location /health {
return 200 'ok';
add_header Content-Type text/plain;
}
}