2fef91a548
Full parity with Astro site: content rows, post/tag routes, pagination, event badges + OSM map, comments, Live-Search via /api/search-index, CMS image proxy, RSS, sitemap. Deploy: Dockerfile + docker-compose.prod.yml + Gitea Actions workflow to build + push to git.pm86.de registry and ssh-deploy to Contabo.
39 lines
1.2 KiB
Docker
39 lines
1.2 KiB
Docker
# ─────────────────────────────────────────────
|
||
# Stage 1: Build
|
||
# ─────────────────────────────────────────────
|
||
FROM node:22-alpine AS builder
|
||
WORKDIR /app
|
||
|
||
# Erst nur package*.json – besseres Layer-Caching
|
||
COPY package*.json ./
|
||
# postinstall versucht CMS-Types zu generieren (|| true → unkritisch ohne CMS)
|
||
RUN npm ci
|
||
|
||
COPY . .
|
||
RUN npm run build
|
||
|
||
# ─────────────────────────────────────────────
|
||
# Stage 2: Schlankes Production-Image
|
||
# ─────────────────────────────────────────────
|
||
FROM node:22-alpine AS runner
|
||
WORKDIR /app
|
||
ENV NODE_ENV=production
|
||
|
||
# Nur Production-Deps, kein postinstall nötig
|
||
COPY package*.json ./
|
||
RUN npm ci --omit=dev --ignore-scripts
|
||
|
||
# Build-Artefakt aus Stage 1
|
||
COPY --from=builder /app/build ./build
|
||
|
||
# Non-root user
|
||
RUN addgroup -g 1001 -S nodejs \
|
||
&& adduser -S svelte -u 1001 -G nodejs \
|
||
&& chown -R svelte:nodejs /app
|
||
USER svelte
|
||
|
||
EXPOSE 3001
|
||
ENV PORT=3001
|
||
|
||
CMD ["node", "build"]
|