-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathDockerfile
More file actions
98 lines (75 loc) · 4.41 KB
/
Dockerfile
File metadata and controls
98 lines (75 loc) · 4.41 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
# ===========================================
# LogviewR - Node 22 Alpine (OPTIMIZED MULTI-STAGE)
# ===========================================
# ---------- Stage 1 : Build (avec outils de build) ----------
FROM --platform=$BUILDPLATFORM node:22-alpine AS builder
WORKDIR /app
# 🔴 Outils de build OBLIGATOIRES pour compiler better-sqlite3 et autres modules natifs
# Ces outils seront supprimés dans l'image finale
RUN apk add --no-cache python3 make g++
# Install all dependencies (including devDependencies) to compile native modules
# devDependencies are removed in the final image (see npm prune --production below)
COPY package*.json ./
RUN NO_UPDATE_NOTIFIER=1 npm ci --loglevel=error --no-fund
# Copier le code source et builder
COPY . .
# Analytics opt-in — VITE_* vars must be available at build time (Vite inlines them
# into the bundle). Passed via docker build --build-arg or compose build.args.
# Empty defaults = analytics disabled (main.tsx bails out if either is falsy).
ARG VITE_ANALYTICS_HOST=""
ARG VITE_ANALYTICS_SITE_ID=""
ENV VITE_ANALYTICS_HOST=$VITE_ANALYTICS_HOST
ENV VITE_ANALYTICS_SITE_ID=$VITE_ANALYTICS_SITE_ID
RUN npm run build
# Préparer node_modules de production (sans devDependencies mais avec binaires compilés)
# On garde les binaires compilés de better-sqlite3 et on supprime seulement les devDependencies
# npm prune --production supprime les devDependencies mais garde les binaires compilés
RUN npm prune --production && npm cache clean --force
# ---------- Stage 2 : Runtime (image finale légère) ----------
FROM node:22-alpine
WORKDIR /app
# 🎯 Outils RUNTIME uniquement (pas d'outils de build)
# su-exec : nécessaire pour l'entrypoint script (switch root → node)
# fail2ban : fournit fail2ban-client pour communiquer avec le daemon via socket
# iptables : lecture des règles pare-feu (onglet IPTables — nécessite cap_add: NET_ADMIN)
# ipset : lecture des sets d'IPs (onglet IPSet — nécessite cap_add: NET_ADMIN)
# nftables : lecture des règles nftables (onglet NFTables — nécessite cap_add: NET_ADMIN)
# tzdata : nécessaire pour que TZ=Europe/Paris (etc.) soit honoré ; sans ça Alpine ne connaît qu'UTC
# et les timestamps des logs (écrits en heure locale par Apache/Nginx) sont décalés
RUN apk add --no-cache su-exec iptables ipset nftables sudo fail2ban tzdata
# Allow the node user to run network tools as root (needed when app runs as non-root
# but the host kernel's nf_tables backend requires UID 0 even with NET_ADMIN cap).
RUN echo "node ALL=(root) NOPASSWD: /usr/sbin/iptables, /usr/sbin/iptables-save, /usr/sbin/iptables-restore, /usr/sbin/ipset, /usr/sbin/nft" \
> /etc/sudoers.d/logviewr-nettools \
&& chmod 0440 /etc/sudoers.d/logviewr-nettools
# Créer le répertoire data avec les bonnes permissions
RUN mkdir -p /app/data && chown -R node:node /app
# Créer les répertoires de montage pour les volumes host (évite les erreurs de montage)
# Ces répertoires seront montés par docker-compose avec les volumes du host
RUN mkdir -p /host/logs /host/proc /host/sys /host/etc /host/usr/bin
# Copier l'entrypoint script (nécessite su-exec)
COPY docker-entrypoint.sh /app/docker-entrypoint.sh
RUN chmod +x /app/docker-entrypoint.sh
# Entrypoint pour corriger les permissions au démarrage
ENTRYPOINT ["/app/docker-entrypoint.sh"]
# 🎯 Copier node_modules compilés depuis le stage build (binaires natifs déjà compilés)
# Cela évite de recompiler better-sqlite3 dans l'image finale
# Les binaires sont compilés pour l'architecture cible dans le stage build
COPY --chown=node:node --from=builder /app/node_modules ./node_modules
# Copier package.json pour référence (nécessaire pour certaines dépendances)
COPY --chown=node:node package*.json ./
# Frontend buildé
COPY --chown=node:node --from=builder /app/dist ./dist
# Backend TypeScript (exécuté par tsx)
COPY --chown=node:node --from=builder /app/server ./server
COPY --chown=node:node --from=builder /app/tsconfig.json ./
# CHANGELOG.md for Administration > Info tab (GET /api/info/changelog)
COPY --chown=node:node --from=builder /app/CHANGELOG.md ./
ENV NODE_ENV=production
ENV PORT=3000
# Healthcheck avec wget (déjà présent dans Alpine de base)
HEALTHCHECK --interval=30s --timeout=10s --retries=3 \
CMD wget -q --spider http://127.0.0.1:${PORT}/api/health || exit 1
EXPOSE 3000
# TS runtime (tsx exécute les fichiers TypeScript directement)
CMD ["node_modules/.bin/tsx", "server/index.ts"]