Marketplace inversée (Next.js 16 App Router + Supabase Cloud) : auth, schéma + RLS, publication de besoins avec upload d'images, feed avec filtres, offres, acceptation via RPC, messagerie temps réel, dashboards, et Dockerfile pour déploiement Coolify.
59 lines
1.4 KiB
Docker
59 lines
1.4 KiB
Docker
# ============================================
|
|
# Stage 1: Dependencies
|
|
# ============================================
|
|
ARG NODE_VERSION=24.13.0-slim
|
|
|
|
FROM node:${NODE_VERSION} AS dependencies
|
|
|
|
WORKDIR /app
|
|
|
|
COPY package.json package-lock.json* ./
|
|
|
|
RUN --mount=type=cache,target=/root/.npm \
|
|
npm ci --no-audit --no-fund
|
|
|
|
# ============================================
|
|
# Stage 2: Build (standalone output)
|
|
# ============================================
|
|
FROM node:${NODE_VERSION} AS builder
|
|
|
|
WORKDIR /app
|
|
|
|
COPY --from=dependencies /app/node_modules ./node_modules
|
|
COPY . .
|
|
|
|
ENV NODE_ENV=production
|
|
|
|
# Variables publiques inlinées dans le bundle JS au build — à fournir comme
|
|
# "Build Variables" dans Coolify (Application > Environment Variables).
|
|
ARG NEXT_PUBLIC_SUPABASE_URL
|
|
ARG NEXT_PUBLIC_SUPABASE_ANON_KEY
|
|
ENV NEXT_PUBLIC_SUPABASE_URL=${NEXT_PUBLIC_SUPABASE_URL}
|
|
ENV NEXT_PUBLIC_SUPABASE_ANON_KEY=${NEXT_PUBLIC_SUPABASE_ANON_KEY}
|
|
|
|
RUN npm run build
|
|
|
|
# ============================================
|
|
# Stage 3: Run
|
|
# ============================================
|
|
FROM node:${NODE_VERSION} AS runner
|
|
|
|
WORKDIR /app
|
|
|
|
ENV NODE_ENV=production
|
|
ENV PORT=3000
|
|
ENV HOSTNAME="0.0.0.0"
|
|
|
|
COPY --from=builder --chown=node:node /app/public ./public
|
|
|
|
RUN mkdir .next && chown node:node .next
|
|
|
|
COPY --from=builder --chown=node:node /app/.next/standalone ./
|
|
COPY --from=builder --chown=node:node /app/.next/static ./.next/static
|
|
|
|
USER node
|
|
|
|
EXPOSE 3000
|
|
|
|
CMD ["node", "server.js"]
|