Diese Anleitung beschreibt, wie du Redis in deiner Nextcloud-Docker-Umgebung integrierst, korrekt konfigurierst und Healthchecks einrichtest. Sie eignet sich sowohl zur Fehlerbehebung (Troubleshooting) als auch zur Neuinstallation.
backend-Netzwerk für die Diensteredis:
image: redis:alpine
container_name: ${COMPOSE_PROJECT_NAME}_redis
command: ["redis-server", "--maxmemory", "512mb", "--maxmemory-policy", "allkeys-lru"]
restart: always
networks:
- backend
Tipp: Bei viel RAM kann
1024mbals Limit sinnvoll sein.
config.php in Nextcloud anpassen'memcache.locking' => '\OC\Memcache\Redis',
'redis' => [
'host' => 'redis',
'port' => 6379,
],
Optional auch:
'memcache.local' => '\OC\Memcache\Redis',
healthcheck:
test: ["CMD-SHELL", "if php -r 'exit((new Redis())->connect(\"redis\", 6379) ? 0 : 1);'; then curl -fsS http://localhost/status.php | grep -q '\"maintenance\":false'; else exit 1; fi"]
interval: 30s
timeout: 5s
retries: 3
⚠️ Achtung: Multiline-Varianten führen in manchen Docker-GUIs wie Portainer zu Syntaxfehlern oder unerwartetem Verhalten. Verwende nach Möglichkeit die kompakte Variante.
Optional auch:
healthcheck:
test: ["CMD-SHELL", "php -r 'exit((new Redis())->connect(\"redis\", 6379) ? 0 : 1);'"]
interval: 30s
timeout: 5s
retries: 3
docker ps
docker inspect --format='{{json .State.Health}}' <containername> | jq
docker exec -u www-data <nextcloud-container> php -r 'var_dump((new Redis())->connect("redis", 6379));'
bool (true)
Oder:
docker exec -it <redis-container> redis-cli info memory | grep used_memory_human
used_memory_human:1.16M
Fehlermeldung: OCP\Lock\LockedException: "Ordner/Datei" is locked
docker exec -u www-data nextcloud php occ maintenance:mode --on
DELETE FROM oc_file_locks WHERE 1;
docker exec -u www-data nextcloud php occ maintenance:mode --off
Alternativ gezielt:
DELETE FROM oc_file_locks WHERE path LIKE '%Pfad/zur/Datei%';
maxmemory-Begrenzung schützt vor Speicherüberlaufallkeys-lru ist für Nextcloud optimalexit-Codes und nicht echo basieren!# m h dom mon dow command
# Nextcloud-Server
*/5 * * * * docker exec -u www-data nextcloud_server php -f /var/www/html/cron.php >> /var/log/cron-nextcloud.log 2>&1
*/5 * * * * docker exec -u www-data nextcloud_server php occ files:scan --all >> /var/log/cron-nextcloud-filescan.log 2>&1
# Nextcloud-DB (Daily Backup)
30 20 * * * /media/data1/nextcloud/mariadb-backup.sh >> /var/log/cron-nextcloud-db-backup.log 2>&1
services:
nextcloud:
image: nextcloud:<MAJOR>.<MINOR>-<apache|fpm>
container_name: <NC_CONTAINER>
depends_on:
- db
- redis
environment:
- NEXTCLOUD_TRUSTED_DOMAINS=<FQDN>
- OVERWRITEPROTOCOL=https
- REDIS_HOST=redis
- MYSQL_HOST=db # oder POSTGRES_HOST=db
- MYSQL_DATABASE=<DB_NAME>
- MYSQL_USER=<DB_USER>
- MYSQL_PASSWORD=<DB_PASS>
# Geheimnisse bevorzugt via Docker Secrets injizieren
volumes:
- <NC_HTML_VOLUME>:/var/www/html
- <NC_DATA_VOLUME>:/var/www/html/data
- <NC_CONFIG_VOLUME>:/var/www/html/config
labels:
- "com.centurylinklabs.watchtower.enable=true" # nur wenn Minor auto
networks:
- web
- internal
cron:
image: nextcloud:<MAJOR>.<MINOR>-<apache|fpm>
entrypoint: /cron.sh
depends_on:
- nextcloud
volumes:
- <NC_HTML_VOLUME>:/var/www/html
- <NC_DATA_VOLUME>:/var/www/html/data
- <NC_CONFIG_VOLUME>:/var/www/html/config
networks:
- internal
db:
image: mariadb:11 # oder postgres:16
environment:
- MYSQL_DATABASE=<DB_NAME>
- MYSQL_USER=<DB_USER>
- MYSQL_PASSWORD=<DB_PASS>
- MYSQL_ROOT_PASSWORD=<DB_ROOT>
volumes:
- <DB_VOLUME>:/var/lib/mysql # Postgres: /var/lib/postgresql/data
command: ["--transaction-isolation=READ-COMMITTED","--binlog-format=ROW"]
networks:
- internal
redis:
image: redis:7-alpine
networks:
- internal
watchtower:
image: containrrr/watchtower
command: "--label-enable --rolling-restart --cleanup --interval 86400"
volumes:
- /var/run/docker.sock:/var/run/docker.sock
environment:
- WATCHTOWER_NOTIFICATIONS=shoutrrr
- WATCHTOWER_NOTIFICATION_URL=<WEBHOOK>
networks:
- internal
networks:
web: {}
internal: {}
Stand: August 2025
Erstellt von: dioware (Kevin Bernhardt)