Appearance
Production Deployment, SEO/AEO Engine & Operations Runbook
1. Multi-Stage Production Docker Deployment
dockerfile
FROM node:22-alpine AS builder
WORKDIR /app
COPY package*.json ./
COPY prisma ./prisma/
RUN npm ci
COPY . .
RUN npx prisma generate
RUN npm run build
FROM node:22-alpine AS runner
WORKDIR /app
ENV NODE_ENV=production
COPY --from=builder /app/dist ./dist
COPY --from=builder /app/node_modules ./node_modules
COPY --from=builder /app/package*.json ./
COPY --from=builder /app/prisma ./prisma
EXPOSE 3000
CMD ["node", "dist/index.js"]2. Apache VirtualHost & SSL Configuration
On server [SERVER_HOST], Apache routes HTTPS requests directly to compiled static VitePress documentation assets:
apache
<VirtualHost *:443>
ServerName [DOMAIN_DOKUMENTASI]
DocumentRoot /www/wwwroot/partitionb/project-docs/docs/.vitepress/dist
SSLEngine on
SSLCertificateFile /www/server/panel/vhost/cert/[DOMAIN_DOKUMENTASI]/fullchain.pem
SSLCertificateKeyFile /www/server/panel/vhost/cert/[DOMAIN_DOKUMENTASI]/privkey.pem
<Directory "/www/wwwroot/partitionb/project-docs/docs/.vitepress/dist">
Options FollowSymLinks
AllowOverride All
Require all granted
FallbackResource /index.html
</Directory>
</VirtualHost>3. SEO, GEO & AI Answer Engine Optimization (AEO)
The backend (src/backend/routes/seo.ts) generates real-time search engine assets:
/sitemap.xml: XML sitemap listing core routes, active products, and dynamic help articles./robots.txt: Rules allowing Googlebot, Bingbot, GPTBot, ClaudeBot, and PerplexityBot./llms.txt: Markdown summary file for AI search crawlers./llms-full.txt: Deep knowledge base containing full menu item descriptions, operational hours, and refund policies.generateSeoMetaHtml(): Generates structured Schema.org JSON-LD data (Restaurant&FAQPage).
4. Troubleshooting & Maintenance Runbook
| Symptom / Issue | Root Cause | Remediation Procedure |
|---|---|---|
Prisma query fails with P2021 | Table missing or unmigrated | Run npx prisma migrate deploy to synchronize schema. |
| Wadeno WhatsApp auth timeout | Session un-paired or network socket closed | Verify /v1/sessions/default/status. If closed, request QR scan via /v1/sessions/default/start. |
QBiz Webhook signature mismatch (401) | Incorrect QBIZ_WEBHOOK_SECRET | Re-align secret key between .env and QBiz merchant portal. |
| Cloudflare R2 Upload CORS Error | Missing bucket CORS rules | Add AllowedOrigins: ["*"] and AllowedHeaders: ["*"] to Cloudflare R2 bucket CORS settings. |