| [5a2cb69] | 1 | # syntax=docker/dockerfile:1
|
|---|
| 2 | # ──────────────────────────────────────────────────────────────────────────
|
|---|
| 3 | # Klonkt — zelf-host image. Multi-stage: native deps compileren in een volle
|
|---|
| 4 | # image, dan een slanke runtime. ffmpeg wordt meegebundeld via ffmpeg-static
|
|---|
| 5 | # (npm), cwebp komt uit het Debian-pakket 'webp'.
|
|---|
| 6 | # ──────────────────────────────────────────────────────────────────────────
|
|---|
| 7 |
|
|---|
| 8 | # ---- builder: native modules (better-sqlite3) + ffmpeg-static ophalen ----
|
|---|
| 9 | FROM node:20-bookworm AS builder
|
|---|
| 10 | WORKDIR /app
|
|---|
| 11 | # Build-tools voor het geval better-sqlite3 from-source moet (anders prebuilt).
|
|---|
| 12 | RUN apt-get update && apt-get install -y --no-install-recommends python3 make g++ \
|
|---|
| 13 | && rm -rf /var/lib/apt/lists/*
|
|---|
| 14 | COPY package.json package-lock.json ./
|
|---|
| 15 | # Productie-deps; install-scripts draaien (better-sqlite3 build + ffmpeg download).
|
|---|
| 16 | RUN npm ci --omit=dev
|
|---|
| 17 |
|
|---|
| 18 | # ---- runtime: slank image + cwebp ----
|
|---|
| 19 | FROM node:20-bookworm-slim AS runtime
|
|---|
| 20 | ENV NODE_ENV=production \
|
|---|
| 21 | PORT=3000
|
|---|
| 22 | WORKDIR /app
|
|---|
| 23 | # cwebp = afbeelding→WebP (optioneel in de app, maar handig); ca-certificates
|
|---|
| 24 | # voor uitgaande HTTPS (license-server, SMTP, Google).
|
|---|
| 25 | RUN apt-get update && apt-get install -y --no-install-recommends webp ca-certificates \
|
|---|
| 26 | && rm -rf /var/lib/apt/lists/*
|
|---|
| 27 | # node_modules (incl. gecompileerde better-sqlite3 + gebundelde ffmpeg) uit builder.
|
|---|
| 28 | COPY --from=builder /app/node_modules ./node_modules
|
|---|
| 29 | # App-broncode.
|
|---|
| 30 | COPY . .
|
|---|
| 31 | # Persistente data leeft hier (DB, media, audio) — mount-punt voor een volume.
|
|---|
| 32 | RUN mkdir -p storage/media storage/audio && chown -R node:node /app
|
|---|
| 33 | USER node
|
|---|
| 34 | EXPOSE 3000
|
|---|
| 35 | # Simpele healthcheck via Node's ingebouwde fetch (Node 20).
|
|---|
| 36 | HEALTHCHECK --interval=30s --timeout=5s --start-period=20s --retries=3 \
|
|---|
| 37 | CMD node -e "fetch('http://127.0.0.1:'+(process.env.PORT||3000)+'/').then(r=>process.exit(r.ok?0:1)).catch(()=>process.exit(1))"
|
|---|
| 38 | CMD ["node", "src/server.js"]
|
|---|