# syntax=docker/dockerfile:1.7 # ============================================================================= # Rubis — image landing (Astro 6, React 19, Node SSR standalone) # Sert rubis.pro (landing + pages légales + blog SSR fetch via apps/api). # ============================================================================= # # Astro adapter: @astrojs/node en mode "standalone" → bundle un mini-server # Node dans dist/server/entry.mjs. Pas de nginx en frontal nécessaire au # niveau du pod : Traefik (cluster) gère le TLS et le routing par hostname. # ============================================================================= ARG NODE_VERSION=22.13.1 ARG PNPM_VERSION=10.0.0 # ----------------------------------------------------------------------------- # base — node + pnpm + tini # ----------------------------------------------------------------------------- FROM node:${NODE_VERSION}-alpine AS base ARG PNPM_VERSION RUN apk add --no-cache libc6-compat tini && \ corepack enable && \ corepack prepare pnpm@${PNPM_VERSION} --activate WORKDIR /repo # ----------------------------------------------------------------------------- # deps — install workspace (avec devDeps pour le build Astro) # ----------------------------------------------------------------------------- FROM base AS deps COPY package.json pnpm-lock.yaml pnpm-workspace.yaml turbo.json tsconfig.base.json ./ COPY apps/landing/package.json ./apps/landing/ COPY packages/shared/package.json ./packages/shared/ COPY packages/ui/package.json ./packages/ui/ RUN --mount=type=cache,id=pnpm,target=/root/.local/share/pnpm/store \ pnpm install --frozen-lockfile --filter @rubis/landing... # ----------------------------------------------------------------------------- # build — astro build (output: server, adapter Node standalone) # ----------------------------------------------------------------------------- FROM deps AS build COPY packages/shared ./packages/shared COPY packages/ui ./packages/ui COPY apps/landing ./apps/landing RUN cd apps/landing && pnpm exec astro build # ----------------------------------------------------------------------------- # runner — runtime minimal, user non-root # ----------------------------------------------------------------------------- FROM base AS runner RUN addgroup -g 1001 -S nodejs && adduser -S astro -u 1001 ENV NODE_ENV=production \ HOST=0.0.0.0 \ PORT=4321 \ LOG_LEVEL=info WORKDIR /app # Astro standalone bundle suffit (server + client static + node_modules # nécessaires à l'entry sont déjà inclus dans dist/). COPY --from=build --chown=astro:nodejs /repo/apps/landing/dist /app/dist USER astro EXPOSE 4321 # Healthcheck simple : / répond 200 (page d'accueil prerenderée). HEALTHCHECK --interval=30s --timeout=5s --start-period=15s --retries=3 \ CMD wget -qO- http://127.0.0.1:4321/ >/dev/null 2>&1 || exit 1 ENTRYPOINT ["/sbin/tini", "--"] CMD ["node", "/app/dist/server/entry.mjs"]