Construire une plateforme de gestion de fichiers complète — upload, authentification, analytics, sécurité fail2ban et déploiement Docker.
OpenFiler se déploie en une commande avec Docker Compose. Le Dockerfile est multi-stage pour produire une image légère.
# Étape 1 — build
FROM node:20-alpine AS builder
WORKDIR /app
COPY package*.json ./
RUN npm ci
COPY . .
RUN npm run build
# Étape 2 — production
FROM node:20-alpine AS runner
WORKDIR /app
ENV NODE_ENV=production
COPY --from=builder /app/.next/standalone ./
COPY --from=builder /app/.next/static ./.next/static
COPY --from=builder /app/public ./public
EXPOSE 3000
CMD ["node", "server.js"]Le mode standalone de Next.js produit un dossier autonome — pas besoin de node_modules en production.
Pour l'activer :
module.exports = {
output: 'standalone',
}services:
openfiler:
build: .
ports:
- "3000:3000"
environment:
- BETTER_AUTH_SECRET=${BETTER_AUTH_SECRET}
- BETTER_AUTH_URL=${BETTER_AUTH_URL}
- BETTER_AUTH_TRUSTED_ORIGINS=${BETTER_AUTH_TRUSTED_ORIGINS}
- DATABASE_URL=/data/openfiler.db
- NEXT_PUBLIC_APP_URL=${NEXT_PUBLIC_APP_URL}
volumes:
- openfiler_data:/data
- openfiler_uploads:/app/upload
volumes:
openfiler_data:
openfiler_uploads:Deux volumes persistants :
openfiler_data — la base SQLite survit aux redémarragesopenfiler_uploads — les fichiers uploadés aussi# Copier et remplir les variables
cp .env.example .env
nano .env
# Build et démarrage en arrière-plan
docker-compose up -d --build
# Vérifier les logs
docker-compose logs -f
# Arrêter
docker-compose downEn production, BETTER_AUTH_URL et NEXT_PUBLIC_APP_URL doivent pointer vers votre domaine :
BETTER_AUTH_SECRET=clé-longue-aléatoire-64-chars-minimum
BETTER_AUTH_URL=https://files.mondomaine.fr
BETTER_AUTH_TRUSTED_ORIGINS=https://files.mondomaine.fr
DATABASE_URL=/data/openfiler.db
NEXT_PUBLIC_APP_URL=https://files.mondomaine.frSi vous servez OpenFiler derrière Nginx :
server {
listen 80;
server_name files.mondomaine.fr;
client_max_body_size 70M; # légèrement supérieur à la limite d'upload (64MB)
location / {
proxy_pass http://localhost:3000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}client_max_body_size 70M est essentiel — sans ça, Nginx bloque les uploads avant même qu'ils n'arrivent à Next.js.