# ── Falah Mobile — Production Dockerfile ────────────────────────────── # Requires npm run build to be run first on the host (Next.js standalone) # Build sequence: # cd /app && npm ci && npm run build # docker build -t falah-mobile:latest . FROM node:20-alpine RUN apk add --no-cache openssl ca-certificates curl WORKDIR /app RUN addgroup --system --gid 1001 nodejs && adduser --system --uid 1001 nextjs # Copy standalone build (pre-built outside Docker) COPY .next/standalone/ ./ COPY .next/static ./.next/static COPY public ./public # Copy all production node_modules from build context # (pre-installed via npm ci --omit=dev before docker build) COPY node_modules ./node_modules COPY prisma ./prisma # Fix Turbopack's hashed Prisma client path (if .next inside standalone) RUN if [ -d "/app/.next/node_modules/@prisma" ]; then \ for d in /app/.next/node_modules/@prisma/client-*; do \ name=$(basename "$d"); \ rm -f "/app/node_modules/@prisma/$name" 2>/dev/null; \ cp -r /app/node_modules/@prisma/client "/app/node_modules/@prisma/$name"; \ done; \ fi RUN mkdir -p /app/data && chown nextjs:nodejs /app/data # Fix permissions so nextjs user can run prisma CLI and read schema RUN chown -R nextjs:nodejs /app/node_modules/@prisma /app/node_modules/prisma /app/node_modules/.prisma /app/prisma 2>/dev/null || true # Startup script — migrate volumes DB then launch server RUN printf '#!/bin/sh\n\ cd /app\n\ node ./node_modules/prisma/build/index.js db push --skip-generate --accept-data-loss 2>&1\n\ exec node server.js\n' > /app/start.sh && chmod +x /app/start.sh USER nextjs EXPOSE 3000 ENV NODE_ENV=production ENV DATABASE_URL="file:/app/data/dev.db" CMD ["/app/start.sh"]