2026-09-16
Docker

Полный 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-пули ломаются при сжатии).


Проверка

  1. docker compose ps — все контейнеры Up.
  2. curl -I http://localhost:8081 — 302 на логин.
  3. Полный occ status — ОК.
  4. Создайте файл, загрузите 50MB — работает (проверка upload limit).
  5. В админ-панели «Обзор» нет критических предупреждений.

Тонкости и подводные камни

  • 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.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *