Compare commits

..

16 Commits

Author SHA1 Message Date
BeauTroll
fc1cac8e5a fix: properly configure Apache MPM Prefork with dedicated config file
- Create dedicated apache/mpm_prefork.conf to override default MPM settings
- Mount mpm_prefork.conf to /etc/apache2/mods-available/ to properly apply limits
- Remove MPM config from nextcloud.conf (was being ignored)
- Set ServerLimit and MaxRequestWorkers to 400 (up from 150 default)
- Configure optimized worker settings for better concurrency

This fixes the "server reached MaxRequestWorkers" error that was causing
sync failures and 404 errors by properly overriding Apache's default
configuration file instead of trying to set it in conf-enabled.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-01-03 04:14:41 +01:00
BeauTroll
5d610b9177 increase server limit 2026-01-03 04:07:31 +01:00
BeauTroll
8096d8985b Merge remote-tracking branch 'origin/main' 2026-01-03 04:03:16 +01:00
BeauTroll
8462b10e3b fix: increase Apache MaxRequestWorkers and optimize performance settings
- Increase MaxRequestWorkers from 150 to 400 to prevent "server reached MaxRequestWorkers" errors
- Configure MPM Prefork module with optimized worker settings
- Add AllowEncodedSlashes NoDecode for special characters in filenames
- Increase Redis maxmemory from 512MB to 2GB for better caching
- Extend PHP execution times from 1800s to 7200s for large operations
- Increase MariaDB max_allowed_packet to 1GB for large file uploads

These changes resolve sync failures caused by Apache worker exhaustion.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-01-03 04:00:12 +01:00
root
6bdd8e918c add traefik transport 2025-12-23 01:28:12 +01:00
root
44ec0a004a remove uncessary labels 2025-12-23 01:04:16 +01:00
root
c403419ea1 adapt for traefik labels 2025-12-23 00:23:18 +01:00
BeauTroll
a1b51599c6 feat: expose Apache logs to host for fail2ban integration
- Mount Apache logs directory to ./logs/apache
- Configure JSON file logging driver with rotation
- Set max log size to 10MB with 3 files retention
- Enable fail2ban to monitor access logs directly
- Prevents need for systemd service to export logs

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2025-12-20 21:03:48 +01:00
BeauTroll
123f7b6a9c feat: add custom Docker image with ffmpeg for video previews
- Create Dockerfile extending nextcloud:latest with ffmpeg
- Add .dockerignore to optimize build context
- Update docker-compose.yml to use custom image build
- Modify update.sh to rebuild custom image on updates
- Document custom image setup in README
- Enable video preview generation for .mov, .mp4 files

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2025-12-20 13:51:19 +01:00
BeauTroll
f02c9b36b2 chore: remove unused enable-modules.sh script
- Script not mounted in Docker container
- Cannot be executed from container
- Commands already documented in README
- Reduces maintenance overhead

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2025-12-20 13:12:56 +01:00
BeauTroll
43517b36cc fix: increase Apache timeouts for large file uploads (>40MB)
- Add Timeout 3600 (1h) for long-running uploads
- Enable KeepAlive with 300s timeout to maintain connections
- Set MaxKeepAliveRequests to 200 for chunked uploads
- Fixes sync client errors on files larger than 40MB

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2025-12-20 13:03:19 +01:00
BeauTroll
57db8b6111 docs: add Apache/Traefik configuration and troubleshooting guides
Add comprehensive documentation for Apache configuration behind Traefik reverse proxy, including module activation, debug mode troubleshooting, and client sync error resolution.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2025-12-20 12:59:48 +01:00
BeauTroll
53cc23e153 chore: restore MultiViews and add all required Apache modules
- Restore MultiViews option in Directory configuration
- Add headers, rewrite, dir, and mime modules to enable script
- Keep remoteip and env modules for Traefik integration

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2025-12-20 12:51:36 +01:00
BeauTroll
a83426d198 feat: enhance Apache config for Traefik reverse proxy
- Add RemoteIP configuration to capture real client IPs
- Enable HTTPS detection via X-Forwarded-Proto header
- Add security headers (X-Frame-Options, CSP, etc.)
- Disable Apache WebDAV to prevent conflicts with Nextcloud
- Add module activation script for remoteip and env
- Optimize Directory options (FollowSymLinks without MultiViews)
- Add commented alternative PHP limits for reference

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2025-12-20 12:37:23 +01:00
BeauTroll
6fa7704c13 feat: add custom Apache configuration for Nextcloud
Add custom Apache configuration file to optimize Nextcloud performance and security.
Mount nextcloud.conf into Apache's conf-enabled directory for automatic loading.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2025-12-19 18:41:19 +01:00
BeauTroll
b802c8a5cd docs: add debug mode documentation to README
Added comprehensive documentation about debug mode:

In "Résolution de problèmes" section:
- How to check debug mode status
- How to disable debug mode (production)
- How to enable temporarily (development only)
- Security warnings and risks explained

In "Sécurité" section:
- Added to best practices checklist
- Reminder to verify debug mode is disabled

Key warnings included:
- Security: exposes sensitive information
- Performance: excessive logging slows down app
- Disk space: fills up disk quickly
- Compliance: may log personal data (GDPR)

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2025-12-18 04:08:37 +01:00
8 changed files with 373 additions and 16 deletions

17
.dockerignore Normal file
View File

@@ -0,0 +1,17 @@
# Données Nextcloud
data/
db/
backups/
logs/
# Docker
docker-compose*.yml
.env*
# Git
.git/
.gitignore
# Documentation
README.md
*.md

7
Dockerfile Normal file
View File

@@ -0,0 +1,7 @@
FROM nextcloud:latest
# Installer ffmpeg pour les previews vidéo
RUN apt-get update && \
apt-get install -y --no-install-recommends \
ffmpeg \
&& rm -rf /var/lib/apt/lists/*

236
README.md
View File

@@ -16,12 +16,13 @@ Déploiement Nextcloud avec Docker Compose comprenant MariaDB 10.11, Redis (cach
## Architecture
Le déploiement comprend 4 services:
Le déploiement comprend 5 services:
- **nextcloud**: Application Nextcloud (port 127.0.0.1:8888:80)
- **nextcloud**: Application Nextcloud avec image personnalisée (inclut ffmpeg) - port 127.0.0.1:8888:80
- **db**: MariaDB 10.11 avec healthcheck
- **redis**: Cache Redis avec politique LRU (512MB max)
- **cron**: Tâches planifiées Nextcloud (préviews, nettoyage, etc.)
- **backup-cron**: Système de backup automatisé (quotidien)
**Réseaux**:
@@ -113,11 +114,126 @@ Les paramètres PHP sont préconfigurés dans docker-compose.yml:
Ces valeurs permettent l'upload de fichiers jusqu'à 2GB.
### Image Docker personnalisée
Le projet utilise une image Docker personnalisée basée sur `nextcloud:latest` qui inclut **ffmpeg** pour la génération de previews vidéo (.mov, .mp4, etc.).
**Dockerfile:**
```dockerfile
FROM nextcloud:latest
# Installer ffmpeg pour les previews vidéo
RUN apt-get update && \
apt-get install -y --no-install-recommends \
ffmpeg \
&& rm -rf /var/lib/apt/lists/*
```
**Builder l'image:**
```bash
# Builder l'image custom
docker compose build nextcloud
# Ou forcer le rebuild
docker compose build --no-cache nextcloud
```
**Vérifier ffmpeg:**
```bash
docker compose exec nextcloud ffmpeg -version
```
**Activer les previews vidéo:**
Après le premier démarrage, activez les providers de preview pour les vidéos:
```bash
docker compose exec -u www-data nextcloud php occ config:system:set enabledPreviewProviders 0 --value="OC\\Preview\\Movie"
docker compose exec -u www-data nextcloud php occ config:system:set enabledPreviewProviders 1 --value="OC\\Preview\\PNG"
docker compose exec -u www-data nextcloud php occ config:system:set enabledPreviewProviders 2 --value="OC\\Preview\\JPEG"
docker compose exec -u www-data nextcloud php occ config:system:set enabledPreviewProviders 3 --value="OC\\Preview\\GIF"
docker compose exec -u www-data nextcloud php occ config:system:set enabledPreviewProviders 4 --value="OC\\Preview\\BMP"
# Générer les previews pour un utilisateur
docker compose exec -u www-data nextcloud php occ preview:generate-all nom_utilisateur
```
**Note:** L'image est buildée localement et taguée `nextcloud-custom:latest`. Lors des mises à jour Nextcloud, pensez à rebuild l'image.
# Server Transport Traefik
Ajouter à traefik.yml :
```yml
serversTransport:
nextcloud-transport:
forwardingTimeouts:
dialTimeout: 30s
responseHeaderTimeout: 0s
idleConnTimeout: 3600s
```
OU au docker-compose.yml
```yml
command:
- "--serverstransport.forwardingtimeouts.dialtimeout=30s"
- "--serverstransport.forwardingtimeouts.responseheadertimeout=0"
- "--serverstransport.forwardingtimeouts.idleconntimeout=3600s"
```
### Configuration Apache pour Traefik
Le fichier `apache/nextcloud.conf` configure Apache pour fonctionner correctement derrière le reverse proxy Traefik.
**Configuration incluse:**
- **RemoteIP**: Récupération de l'IP réelle du client (pas celle de Traefik)
- **X-Forwarded-Proto**: Détection automatique HTTPS depuis Traefik
- **Headers de sécurité**: X-Frame-Options, X-Content-Type-Options, etc.
- **WebDAV désactivé**: Évite les conflits (Nextcloud gère son propre WebDAV)
**Activation des modules Apache:**
Lors du premier déploiement, activez les modules nécessaires:
```bash
# Activer tous les modules en une commande
docker compose exec nextcloud bash -c "a2enmod headers rewrite dir mime remoteip env && apache2ctl graceful"
# Redémarrer Nextcloud pour appliquer les changements
docker compose restart nextcloud
```
**Modules activés:**
| Module | Utilité |
| ---------- | ---------------------------------------------------- |
| `headers` | Gestion des headers HTTP (sécurité) |
| `rewrite` | URL rewriting (requis pour .htaccess) |
| `dir` | DirectoryIndex (index.php, etc.) |
| `mime` | Types MIME (CSS, JS, etc.) |
| `remoteip` | Récupération IP client via X-Forwarded-For |
| `env` | Variables d'environnement (détection HTTPS) |
**Note**: Les modules `headers`, `rewrite`, `dir`, et `mime` sont normalement activés par défaut dans l'image `nextcloud:latest`. Seuls `remoteip` et `env` doivent être activés manuellement.
**Vérification:**
```bash
# Vérifier qu'Apache utilise bien la configuration
docker compose exec nextcloud apache2ctl -M | grep -E "(headers|rewrite|remoteip|env)"
# Vérifier les logs avec IP réelle
docker compose logs nextcloud --tail=20
```
## Démarrage
### Première installation
```bash
# Builder l'image personnalisée (inclut ffmpeg)
docker compose build nextcloud
# Démarrer tous les services
make up
@@ -223,7 +339,7 @@ make update
1. 💾 **Backup automatique de sécurité**
- Exécute `scripts/backup.sh` complet
- Archive créée dans `./backups/`
2. 📥 Télécharge la nouvelle image Docker Nextcloud
2. 🔨 Rebuild l'image personnalisée avec la nouvelle version Nextcloud
3. ⏸️ Active le mode maintenance
4. 🔄 Redémarre les containers avec `--force-recreate`
5. ⏳ Attend que Nextcloud soit prêt (health check jusqu'à 60s)
@@ -339,6 +455,119 @@ du -sh ./data # Données Nextcloud
du -sh ./db # Base de données MariaDB
```
### Mode débogage
⚠️ **IMPORTANT**: Le mode débogage ne doit **JAMAIS** être activé en production!
**Vérifier l'état du mode débogage:**
```bash
make occ config:system:get debug
```
**Désactiver le mode débogage (PRODUCTION):**
```bash
# Via OCC (recommandé)
make occ config:system:set debug --value=false --type=boolean
# OU éditer manuellement config.php
docker-compose exec nextcloud nano /var/www/html/config/config.php
# Chercher 'debug' => true, et changer en false ou supprimer la ligne
```
**Activer temporairement pour diagnostiquer un problème (DÉVELOPPEMENT UNIQUEMENT):**
```bash
# Activer
make occ config:system:set debug --value=true --type=boolean
# IMPORTANT: Désactiver immédiatement après le diagnostic!
make occ config:system:set debug --value=false --type=boolean
```
**Pourquoi c'est dangereux en production:**
- 🚨 **Sécurité**: Expose des informations sensibles (chemins, configuration, requêtes SQL)
- 🐌 **Performance**: Génère énormément de logs et ralentit l'application
- 💾 **Espace disque**: Remplit rapidement le disque avec des logs détaillés
- 📊 **Conformité**: Peut logger des données personnelles (RGPD)
### Messages de debug dans la console navigateur
Si vous voyez des messages `[DEBUG]` dans la console JavaScript du navigateur (F12), même avec `debug => false`:
**1. Vider tous les caches:**
```bash
# Cache Nextcloud
make occ maintenance:repair --include-expensive
# Cache Redis
docker compose exec redis redis-cli -a VOTRE_PASSWORD_REDIS FLUSHALL
```
**2. Vérifier le niveau de log:**
```bash
# Niveau recommandé pour production: 2 (Warning)
make occ config:system:set loglevel --value=2 --type=integer
```
**Niveaux de log disponibles:**
- 0 = Debug (tous les messages)
- 1 = Info
- 2 = Warning (recommandé production)
- 3 = Error
- 4 = Fatal
**3. Hard refresh dans le navigateur:**
```bash
# Firefox/Chrome: Ctrl + Shift + R
# Ou vider le cache du navigateur pour le domaine Nextcloud
```
**4. Redémarrer les services:**
```bash
docker compose restart nextcloud redis
```
### Problèmes de synchronisation client
Si le client de synchronisation Nextcloud affiche "error transfering, server replied not found":
**1. Scanner les fichiers pour mettre à jour l'index:**
```bash
# Scanner tous les fichiers d'un utilisateur
make occ files:scan nom_utilisateur
# Scanner uniquement un dossier spécifique
make occ files:scan --path="/nom_utilisateur/files/Dossier"
```
**2. Nettoyer les verrous de fichiers:**
```bash
make occ files:cleanup
```
**3. Vérifier les logs pour identifier le fichier problématique:**
```bash
# Logs en temps réel
docker compose logs -f nextcloud --tail=50
# Rechercher les erreurs 404
docker compose logs nextcloud | grep "404"
```
**4. En dernier recours, réinitialiser la synchronisation:**
- Dans le client Nextcloud: supprimer le compte et le re-configurer
- Cela forcera une synchronisation complète
## 📊 Monitoring
### Vérifications de santé
@@ -381,6 +610,7 @@ docker compose exec redis redis-cli -a ${REDIS_HOST_PASSWORD} INFO stats
3. **Mises à jour régulières**: Exécutez `make backup` puis `make update` mensuellement
4. **Sauvegardes**: Utilisez `make backup` avant toute mise à jour (backup serveur quotidien géré au niveau système)
5. **Monitoring**: Vérifiez les logs régulièrement pour détecter les activités suspectes
6. **Mode débogage désactivé**: Vérifiez avec `make occ config:system:get debug` (doit être `false` ou absent)
### Sécuriser l'accès

16
apache/mpm_prefork.conf Normal file
View File

@@ -0,0 +1,16 @@
# prefork MPM
# StartServers: number of server processes to start
# MinSpareServers: minimum number of server processes which are kept spare
# MaxSpareServers: maximum number of server processes which are kept spare
# ServerLimit: maximum value for MaxRequestWorkers (must be set before MaxRequestWorkers)
# MaxRequestWorkers: maximum number of server processes allowed to start
# MaxConnectionsPerChild: maximum number of requests a server process serves
<IfModule mpm_prefork_module>
ServerLimit 400
StartServers 10
MinSpareServers 10
MaxSpareServers 20
MaxRequestWorkers 400
MaxConnectionsPerChild 1000
</IfModule>

48
apache/nextcloud.conf Normal file
View File

@@ -0,0 +1,48 @@
# Configuration pour reverse proxy Traefik
# Récupération de l'IP réelle du client via X-Forwarded-For
ServerName cloud.agence66.fr
# Autoriser les caractères spéciaux encodés dans les noms de fichiers
AllowEncodedSlashes NoDecode
RemoteIPHeader X-Forwarded-For
RemoteIPTrustedProxy 172.16.0.0/12
RemoteIPTrustedProxy 10.0.0.0/8
RemoteIPTrustedProxy 192.168.0.0/16
# Activer la confiance des en-têtes X-Forwarded-Proto
SetEnvIf X-Forwarded-Proto "https" HTTPS=on
# Timeouts pour gros fichiers (>40MB)
Timeout 3600
KeepAlive On
KeepAliveTimeout 300
MaxKeepAliveRequests 200
<Directory /var/www/html/>
Options FollowSymLinks MultiViews
AllowOverride All
Require all granted
<IfModule mod_dav.c>
Dav off
</IfModule>
</Directory>
# Headers de sécurité (si non gérés par Traefik)
<IfModule mod_headers.c>
# HSTS sera géré par Traefik
# Header always set Strict-Transport-Security "max-age=15552000; includeSubDomains"
# Autres headers de sécurité
Header always set Referrer-Policy "no-referrer-when-downgrade"
Header always set X-Content-Type-Options "nosniff"
Header always set X-Frame-Options "SAMEORIGIN"
Header always set X-XSS-Protection "1; mode=block"
Header always set X-Robots-Tag "noindex, nofollow"
</IfModule>
# Logs avec IP réelle (pas l'IP de Traefik)
<IfModule mod_remoteip.c>
LogFormat "%a %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
</IfModule>

View File

@@ -13,3 +13,6 @@ binlog_format = ROW
# Connections
max_connections = 200
# Gros fichiers - augmenter la taille max des paquets
max_allowed_packet = 1G

View File

@@ -1,11 +1,21 @@
services:
nextcloud:
image: nextcloud:latest
build: .
image: nextcloud-custom:latest
restart: unless-stopped
ports:
- "127.0.0.1:8888:80"
volumes:
- ./data:/var/www/html
- ./apache/nextcloud.conf:/etc/apache2/conf-enabled/nextcloud.conf:ro
- ./apache/mpm_prefork.conf:/etc/apache2/mods-available/mpm_prefork.conf:ro
- ./logs/apache:/var/log/apache2
logging:
driver: "json-file"
options:
max-size: "10m"
max-file: "3"
tag: "nextcloud"
environment:
# Database
- MYSQL_HOST=db
@@ -23,12 +33,16 @@ services:
- REDIS_HOST_PASSWORD=${REDIS_HOST_PASSWORD}
# PHP
- PHP_MEMORY_LIMIT=4096M
- PHP_UPLOAD_MAX_FILESIZE=2G
- PHP_POST_MAX_SIZE=2G
- PHP_MAX_EXECUTION_TIME=1800
- PHP_MAX_INPUT_TIME=1800
- PHP_UPLOAD_MAX_FILESIZE=10G
- PHP_POST_MAX_SIZE=10G
- PHP_MAX_EXECUTION_TIME=7200
- PHP_MAX_INPUT_TIME=7200
# - PHP_UPLOAD_MAX_FILESIZE=1024G
# - PHP_POST_MAX_SIZE=1024G
# - PHP_MAX_EXECUTION_TIME=86400
# - PHP_MAX_INPUT_TIME=86400
# Apache
- APACHE_BODY_LIMIT=2147483648
- APACHE_BODY_LIMIT=0
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost/status.php"]
interval: 30s
@@ -42,16 +56,32 @@ services:
networks:
- nextcloud-net
- traefik-net
labels:
- "traefik.enable=true"
# Router configuration
- "traefik.http.routers.cloud.rule=Host(`${NEXTCLOUD_DOMAIN}`)"
- "traefik.http.routers.cloud.entrypoints=websecure"
- "traefik.http.routers.cloud.tls.certresolver=letsencrypt"
- "traefik.http.routers.cloud.middlewares=nextcloud-headers,nextcloud-redirect"
# Service configuration
- "traefik.http.services.cloud.loadbalancer.server.port=80"
- "traefik.http.services.cloud.loadbalancer.serverstransport=nextcloud-transport"
# Middleware: Headers
- "traefik.http.middlewares.nextcloud-headers.headers.customrequestheaders.X-Forwarded-Proto=https"
- "traefik.http.middlewares.nextcloud-headers.headers.customresponseheaders.Strict-Transport-Security=max-age=15552000"
# Middleware: Redirect pour CalDAV/CardDAV
- "traefik.http.middlewares.nextcloud-redirect.redirectregex.regex=https://(.*)/.well-known/(card|cal)dav"
- "traefik.http.middlewares.nextcloud-redirect.redirectregex.replacement=https://$$1/remote.php/dav/"
- "traefik.http.middlewares.nextcloud-redirect.redirectregex.permanent=true"
redis:
image: redis:alpine
restart: unless-stopped
command: redis-server --requirepass ${REDIS_HOST_PASSWORD} --maxmemory 512mb --maxmemory-policy allkeys-lru
command: redis-server --requirepass ${REDIS_HOST_PASSWORD} --maxmemory 2gb --maxmemory-policy allkeys-lru
networks:
- nextcloud-net
cron:
image: nextcloud:latest
image: nextcloud-custom:latest
restart: always
volumes_from:
- nextcloud

View File

@@ -80,10 +80,16 @@ cp docker-compose.yml "$COMPOSE_BACKUP" || {
}
log "INFO" "docker-compose.yml sauvegardé: $COMPOSE_BACKUP"
# Pull nouvelle image
log "INFO" "Téléchargement de la nouvelle version..."
if ! docker-compose pull nextcloud 2>&1 | tee -a "$LOG_FILE"; then
log "ERROR" "Erreur lors du téléchargement de l'image"
# Pull nouvelle image de base et rebuild image custom
log "INFO" "Téléchargement de la nouvelle version de base..."
if ! docker pull nextcloud:latest 2>&1 | tee -a "$LOG_FILE"; then
log "ERROR" "Erreur lors du téléchargement de l'image de base"
exit 1
fi
log "INFO" "Rebuild de l'image personnalisée (avec ffmpeg)..."
if ! docker-compose build --no-cache nextcloud 2>&1 | tee -a "$LOG_FILE"; then
log "ERROR" "Erreur lors du rebuild de l'image personnalisée"
exit 1
fi