Полный Docker Compose для Nextcloud: MariaDB + Redis + cron + автоматическое обновление
В прошлой статье мы разворачивали Nextcloud вместе с онлайн-редакторами. Здесь — правильный производственный docker-compose: MariaDB, Redis для кешей, cron для фоновых задач, частота резервных копий и автообновления. Это шаблон, который стоит скопировать себе под доменное имя.
Что даёт этот стек
- MariaDB — БД (аналог MySQL)
- Redis — кеш файлов, lock, distributed caching (обязателен для сколь-нибудь большой установки)
- cron — фоновые задачи Nextcloud (не только по запросу)
- watchtower — автообновление контейнеров (опционально)
- backup-скрипт — бэкап data + DB
Файл docker-compose.yml
version: "3.8"
services:
db:
image: mariadb:11
restart: unless-stopped
command: --transaction-isolation=READ-COMMITTED --binlog-format=ROW
volumes:
- db-data:/var/lib/mysql
environment:
MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
MYSQL_DATABASE: ${MYSQL_DATABASE}
MYSQL_USER: ${MYSQL_USER}
MYSQL_PASSWORD: ${MYSQL_PASSWORD}
healthcheck:
test: ["CMD", "healthcheck.sh", "--connect", "--innodb_initialized"]
interval: 10s
timeout: 5s
retries: 5
redis:
image: redis:7-alpine
restart: unless-stopped
command: redis-server --requirepass ${REDIS_PASSWORD}
volumes:
- redis-data:/data
nextcloud:
image: nextcloud:28
restart: unless-stopped
ports:
- "8081:80"
volumes:
- nc-data:/var/www/html
- nc-config:/var/www/html/config
environment:
MYSQL_HOST: db
MYSQL_DATABASE: ${MYSQL_DATABASE}
MYSQL_USER: ${MYSQL_USER}
MYSQL_PASSWORD: ${MYSQL_PASSWORD}
REDIS_HOST: redis
REDIS_HOST_PASSWORD: ${REDIS_PASSWORD}
NEXTCLOUD_ADMIN_USER: admin
NEXTCLOUD_ADMIN_PASSWORD: ${NEXTCLOUD_ADMIN_PASSWORD}
NEXTCLOUD_TRUSTED_DOMAINS: cloud.example.ru
PHP_MEMORY_LIMIT: 512M
PHP_UPLOAD_LIMIT: 10G
depends_on:
db:
condition: service_healthy
redis:
condition: service_started
cron:
image: nextcloud:28
restart: unless-stopped
volumes:
- nc-data:/var/www/html
- nc-config:/var/www/html/config
entrypoint: /cron.sh
depends_on:
- nextcloud
watchtower:
image: containrrr/watchtower:latest
restart: unless-stopped
volumes:
- /var/run/docker.sock:/var/run/docker.sock
environment:
WATCHTOWER_CLEANUP: "true"
WATCHTOWER_SCHEDULE: "0 4 * * *"
volumes:
db-data:
redis-data:
nc-data:
nc-config:
networks:
default:
driver: bridge
Параметры через .env:
MYSQL_ROOT_PASSWORD=<длинный случайный>
MYSQL_DATABASE=nextcloud
MYSQL_USER=nextcloud
MYSQL_PASSWORD=<длинный случайный>
REDIS_PASSWORD=<длинный случайный>
NEXTCLOUD_ADMIN_PASSWORD=<сильный пароль>
chmod 600 .env
docker compose up -d
Шаг 1. Переключение на cron
По умолчанию Nextcloud запускает фоновые задачи по запросу («AJAX»). Переключаем на cron через occ:
sudo docker exec -u www-data nextcloud php occ config:app:set core backgroundjobs_mode --value="cron"
Проверка:
sudo docker exec -u www-data nextcloud php occ status
Контейнер cron держит /cron.sh активным — задача выполняется каждые 5 минут.
Шаг 2. Оптимизация через occ
После установки полезно:
sudo docker exec -u www-data nextcloud php occ maintenance:mode --off
sudo docker exec -u www-data nextcloud php occ db:convert-filecache-bigint
sudo docker exec -u www-data nextcloud php occ config:system:set memcache.local --value="OCMemcacheAPCu"
sudo docker exec -u www-data nextcloud php occ config:system:set memcache.distributed --value="OCMemcacheRedis"
sudo docker exec -u www-data nextcloud php occ config:system:set memcache.locking --value="OCMemcacheRedis"
Проверка ошибок в безопасности:
sudo docker exec -u www-data nextcloud php occ security:certificates:list
- В настройках админ-панели → Обзор — смотрим рекомендации.
Шаг 3. Автообновление (watchtower)
Watchtower обновляет контейнеры по расписанию (в 4:00). Окно сна для автообновления отключим:
sudo docker exec -u www-data nextcloud php occ maintenance:mode --off
Иногда после обновления контейнера нужно пересоздать индексы. Смотрите логи.
Отключить watchtower для конкретного контейнера можно лейблом:
nextcloud:
labels:
com.centurylinklabs.watchtower.enable: "true"
Шаг 4. Резервное копирование
Скрипт /root/backup-nc.sh:
#!/bin/bash
set -euo pipefail
BACKUP_DIR="/backups/nextcloud"
DATE=$(date +%Y%m%d-%H%M)
mkdir -p "$BACKUP_DIR"
docker exec -u www-data nextcloud php occ maintenance:mode --on
tar czf "$BACKUP_DIR/nc-data-$DATE.tar.gz" -C /var/lib/docker-volumes nc-data 2>/dev/null || true
docker exec db sh -c 'exec mysqldump --single-transaction -uroot -p"$MYSQL_ROOT_PASSWORD" nextcloud'
> "$BACKUP_DIR/nc-db-$DATE.sql"
docker exec -u www-data nextcloud php occ maintenance:mode --off
# храним последние 7 копий
ls -t "$BACKUP_DIR"/nc-* | tail -n +8 | xargs -r rm --
echo "OK: $BACKUP_DIR"
Хранение на внешний диск — ежедневно в cron:
0 3 * * * /root/backup-nc.sh >> /var/log/backup-nc.log 2>&1
Шаг 5. HTTPS-прокси (кратко)
Дополним nginx-конфиг из предыдущей статьи (cloud.example.ru → 8081). Additionally:
proxy_read_timeout 300;
и отключите компрессию для Collateral/office (иначе WS-пули ломаются при сжатии).
Проверка
docker compose ps— все контейнеры Up.curl -I http://localhost:8081— 302 на логин.- Полный
occ status— ОК. - Создайте файл, загрузите 50MB — работает (проверка upload limit).
- В админ-панели «Обзор» нет критических предупреждений.
Тонкости и подводные камни
- healthcheck на MariaDB — важно:
depends_on: condition: service_healthyне даст Nextcloud стартовать до готовности DB. - nc-config отдельно — конфиг монтируется отдельным volume, его не удаляйте при апгрейде.
- watchtower и кастомные image — если вы используете форк, помечайте
com.centurylinklabs.watchtower.enable=false. - occ в контейнере под www-data — почти все команды требуют этого юзера, иначе ошибки прав.
- Гектабайты логов — не забудьте про Promtail (см. статью про Loki), appdata/logs растут.
Шпаргалка
docker compose up -d
docker exec -u www-data nextcloud php occ config:app:set core backgroundjobs_mode --value="cron"
docker exec -u www-data nextcloud php occ db:convert-filecache-bigint
docker exec -u www-data nextcloud php occ maintenance:mode --off
# бэкап: /root/backup-nc.sh в cron 0 3 * * *
Проверено на: Nextcloud 28, MariaDB 11, Redis 7, Docker Compose v2.
Дата: Сентябрь 2026.