Nextcloud — это мощное корпоративное решение для хранения, совместной работы и обмена файлами. Однако в продакшн‑среде критически важна отказоустойчивость. В этой статье разберём, как развернуть Nextcloud в высокодоступной конфигурации с балансировщиком нагрузки, реплицируемой базой данных, отказоустойчивым хранилищем и полнотекстовым поиском. Также напомним, что есть готовые решения Nextcloud Enterprise от Cloud4Y.
Архитектура решения

Наша система включает следующие компоненты:
Балансировщик нагрузки — HAProxy
Веб-приложения — 2 ноды Nextcloud
База данных — MariaDB в режиме Master-Slave
Сервер Redis
Хранилище — 2 NFS-сервера с DRBD для синхронизации
Elasticsearch
Контроллер Active Directory и MS Office Online Server
Все серверы работают на Ubuntu 22.04 LTS.
Развёртывание веб-приложения Nextcloud
Для развёртывания Nextcloud нужно установить веб-сервер apache2 командой:
apt-get install apache2 –y
Затем установить php и все необходимые модули командами:
apt update && apt upgrade –y
add-apt-repository ppa:ondrej/php
apt install php8.2 php8.2-curl php8.2-zip php8.2-gd php8.2-fpm php8.2-ctype php8.2-dom php8.2-libxml php8.2-mbstring php8.2-posix php8.2-session php8.2-SimpleXML php8.2-XMLReader php8.2-XMLWriter php8.2-zlib memcached php8.2-imagick
php8.2-intl php8.2-gmp php8.2-bcmath php8.2-xml
sudo phpenmod pdo_mysql
Конфигурационный файл apache2 nextcloud.conf выглядит следующим образом:
<VirtualHost *:80>
<FilesMatch "\.php$">
SetHandler "proxy:unix:/run/php/php8.1-fpm.sock|fcgi://localhost"
</FilesMatch>
DocumentRoot /var/www/nextcloud/
ServerName domainname.ru
<Directory /var/www/nextcloud/>
Require all granted
AllowOverride All
Options FollowSymLinks MultiViews
<IfModule mod_dav.c>
Dav off
</IfModule>
</Directory>
RewriteEngine on
RewriteCond %{SERVER_NAME} =domainname.ru
RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,NE,R=permanent]
</VirtualHost>

Включаем конфигурацию apache2 командойa2ensite nextcloud.conf
Нужно скачать сам Nextcloud по ссылке https://nextcloud.com/install. Скачиваем самую последнюю версию. После скачивания проверяем контрольную сумму:
md5sum -c
nextcloud-x.y.z.tar.bz2.md
5 <
nextcloud-x.y.z.tar.bz
2
Если контрольная сумма совпадает, то разархивируем файл командой
tar -xjvf
nextcloud-x.y.z.tar.bz
2
Копируем Nextcloud в директорию /var/www командой:
sudo cp -r nextcloud /var/www
Изменяем права на директорию командой:
sudo chown -R www-data:www-data /var/www/nextcloud
Включаем необходимые модули apache2:
a2enmod rewrite
a2enmod headers
a2enmod env
a2enmod dir
a2enmod mime
Перезагружаем web сервер apache2 systemctl restart apache2
. Второе веб-приложение разворачивается точно так же.
Переходим к развёртыванию Mariadb в конфигурации Master-Slave
Схема:

В данной конфигурации Mariadb идёт репликация только с Master на Slave ноду. Устанавливаем Mariadb Server и Mariadb Client на обоих серверах командой:
apt-get install mariadb-server mariadb-client –y
Выполните команду для настроек безопасности на обеих нодах:
mysql_secure_installation
Настройки безопасности такие:
Пароль root
Разрешить вход анонимному пользователю или нет
Разрешить удалённый вход для root или нет
Удалить тестовую базу данных и доступ к ней или нет
Применить настройки сейчас или нет
Далее надо включить бинарное логирование и репликацию. Для этого откроем конфигурационный файл /etc/mysql/mariadb.conf.d/50-server.cnf
nano /etc/mysql/mariadb.conf.d/50-server.cnf
Изменим прослушивание на всех ip адресах:
bind-address = 0.0.0.0
Также добавим следующие линии в конец файла:
server-id = 1
log_bin = /var/log/mysql/mysql-bin.log
log_bin_index =/var/log/mysql/mysql-bin.log.index
relay_log = /var/log/mysql/mysql-relay-bin
relay_log_index = /var/log/mysql/mysql-relay-bin.index
Сохраним конфигурационный файл и перезагрузим mariadb сервер командой
systemctl restart mariadb
Следующим шагом создадим пользователя репликации. Slave нода будет логиниться на Master под этим юзером и читать бинарные логи. Зайдём в оболочку Maridb командой:
mysql -u root –p
Введите пароль пользователя root и создайте нового пользователя командой:
CREATE USER 'replication'@'%' identified by 'your-password';
Дадим права этому пользователю командой:
GRANT REPLICATION SLAVE ON . TO 'replication'@'%';
FLUSH PRIVILEGES;
Проверим статус mariadb master ноды командой show master status;
Должен быть примерно такой вывод:
+------------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000001 | 313 | | |
+------------------+----------+--------------+------------------+
Выходим из Mariadb shell командой EXIT;
. Надо запомнить число в поле позиция. Оно нам понадобится для настройки Slave ноды.
Откройте конфигурационный файл /etc/mysql/mariadb.conf.d/50-server.cnf на Slave ноде
nano /etc/mysql/mariadb.conf.d/50-server.cnf
Сделаем прослушивание на любом ip адресе:
bind-address = 0.0.0.0
Добавим строчки в конец файла:
server-id = 2
log_bin = /var/log/mysql/mysql-bin.log
log_bin_index =/var/log/mysql/mysql-bin.log.index
relay_log = /var/log/mysql/mysql-relay-bin
relay_log_index = /var/log/mysql/mysql-relay-bin.index
Сохраним и закроем конфигурационный файл. Перезагрузим mariadb сервер для применения изменений: systemctl restart mariadb
Залогинимся в shell на mariadb сервер: mysql -u root -p
Предоставим root пароль. И остановим slave процесс командой stop slave;
Следующей командой запустим репликацию с master на slave командой:
CHANGE MASTER TO MASTER_HOST = 'your-master-host-ip', MASTER_USER = 'replication', MASTER_PASSWORD = 'your-password', MASTER_LOG_FILE = 'mysql-bin.000001', MASTER_LOG_POS = 313;
В этой команде используется ip адрес master ноды и пользователь репликации, который был создан раньше. Также введена позиция, запомненная на master ноде. Следующей командой запустим slave процесс: start slave;
И выйдем из shell командой exit;
Далее создадим базу данных Nextcloud на master ноде Mariadb:
CREATE USER 'username'@'ip_address_app1' IDENTIFIED BY 'password';
CREATE DATABASE IF NOT EXISTS nextcloud CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
GRANT ALL PRIVILEGES ON nextcloud.* TO 'username'@'ip_address_app1';
FLUSH PRIVILEGES;
Создадим пользователя для веб-приложения app2:
CREATE USER 'username'@'ip_address_app2' IDENTIFIED BY 'password';
Дадим ему права на базу:
GRANT ALL PRIVILEGES ON nextcloud.* TO 'username'@'ip_address_app2';
FLUSH PRIVILEGES;
Выйдем из shell командой quit;
Развернём NFS хранилище для хранения данных Nextcloud. ОС Ubuntu 22.04. Создадим папку ncdata в директории /mnt. Установим NFS Kernel Server:
sudo apt install nfs-kernel-server
Откроем файл /etc/exports и приведём его к виду:
/mnt/ncdata/ local_network_area (rw,sync,no_subtree_check)
Где local_network_area — адресное пространство вашей локальной сети/

На второй ноде NFS сервера сделать так же.
Далее запускаем nfs-kernel-server на обоих серверах командой
systemctl start nfs-kernel-server.service
Настроим drbd на двух NFS серверах
На обоих серверах устанавливаем drbd-utils командой sudo apt install drbd-utils
В файле /etc/hosts на обоих хостах нужно настроить резолв нод в ip адреса, либо использовать DNS. Например, как здесь:
ip_address_UbuntuNfs UbuntuNfs
ip_address_UbuntuNfs2 UbuntuNfs2
На первой ноде нужно создать конфиг /etc/drbd.d/r0.res и вписать туда строки:
resource r0 {
protocol C;
startup {
wfc-timeout 15;
degr-wfc-timeout 60;
}
net {
cram-hmac-alg sha1;
shared-secret "secret";
}
on UbuntuNfs {
device /dev/drbd0;
disk /dev/sda1;
address ip_address:7788;
meta-disk internal;
}
on UbuntuNfs2 {
device /dev/drbd0;
disk /dev/sda1;
address ip_address:7788;
meta-disk internal;
}
}

Такой же файл /etc/drbd.d/r0.res сохраняем на второй ноде. На обоих серверах запускаем:
sudo drbdadm create-md r0
На обоих хостах запускаем drbd демон командой sudo systemctl start drbd.service
drbd01 делаем primary нодой командой:
sudo drbdadm -- --overwrite-data-of-peer primary all
Отформатируем диск командой: sudo mkfs.ext4 /dev/drbd0
Монтируем sudo mount /dev/drbd0 /mnt/ncdata
Монтируем основное NFS хранилище (где служба drbd запущена в качестве первичной ноды) на обоих приложениях Nextcloud. Для этого устанавливаем nfs client на обоих серверах приложений Nextcloud.
apt install nfs-common
Создаём папку для данных Nextcloud на обоих серверах приложений Nextcloud командой:
mkdir /mnt/ncdata
Монтируем в папку /mnt/ncdata нашу nfs шару на обоих приложениях Nextcloud командой:
mount
example.hostname.com
:/mnt/ncdata /mnt/ncdata
Устанавливаем Nextcloud на обоих серверах приложений командой:
sudo -u www-data php occ maintenance:install --database='mysql' --database-host 'ip_ddress_mariadb_master_node' --database-name='nextcloud' --database-user='nextcloud' --database-pass='pasword' --admin-user='admin2' --admin-pass='password' --data-dir='/mnt/ncdata'
\
--database-user='root' --database-pass='password' \
--admin-user='admin' --admin-pass='password'
Здесь:
ip_ddress_mariadb_master_node это ip адрес мастер ноды Mariadb
/mnt/ncdata это папка с данными для Nextcloud
database-name – имя базы данных Nextcloud
database-user – имя пользователя базы данных
database-pass – пароль пользователя к базе данных
admin-user – пользователь админ веб-интерфейса Nextcloud
admin-pass – пароль пользователя админа на веб-интерфейсе Nextcloud
Разворачиваем HA proxy
На сервере выполняем команду:apt install haproxy -y
Включаем HA proxy в автоматическое поднятие при старте системы:
systemctl enable haproxy
systemctl status haproxy
Открываем конфигурационный файл командой: Nano /etc/haproxy/haproxy.cfg
Пишем настройки для frontend
frontend nginx_443
bind *:443 ssl crt /etc/ssl/cert.pem
mode http
option http-keep-alive
default_backend webservers
option forwardfor
timeout client 300s
Строчкой bind *:443 ssl crt /etc/ssl/cert.pem делаем прослушивание на 443 порту и прикрепляем сертификат cert.pem для Nextcloud.
option http-keep-alive
— делаем сохранение сессий
timeout client 300s
— указываем таймаут ожидания запроса клиента
Пишем настройки для backend
backend webservers
balance roundrobin
cookie SERVER insert indirect nocache
server web1 192.168.4.3:443 check cookie web1 ssl verify none
server web2 192.168.4.2:443 check cookie web2 ssl verify none
balance roundrobin
— указываем режим балансировки по кругу ( каждый сервер будет опрашиваться по очереди )
cookie SERVER insert indirect nocache
— указываем сохранение куки
опция check cookie
нужна для того чтобы сессия сохранялась за определённым сервером на бекэнде.
Разворачиваем Redis-Server
Redis Server — это кэш для хранения запросов к базе данных, что увеличивает скорость обращения к базе данных. Устанавливаем Redis Server командой:
apt install redis-server
Включаем его в автозагрузку. Для этого открываем конфигурационный файл для редактирования:
nano /etc/redis/redis.conf
Устанавливаем директиву supervised systemd
Перезагружаем службу Redis командой systemctl restart redis.service
Включаем в автозагрузку: systemctl enable redis.service
В конфигурационном файле Nextcloud на обеих нодах прописываем строчки
'filelocking.enabled' => true,
'memcache.distributed' => '\\OC\\Memcache\\Redis',
'memcache.locking' => '\\OC\\Memcache\\Redis',
'redis' =>
array (
'host' => 'ip_address_redis_server',
'port' => 6379,
'timeout' => 0.0,
'password' => '',
),

На этом заканчивается развёртывание основных компонентов Enterprise Nextcloud.
Проверяем доступность Nextcloud через браузер:

Развернём Elasticsearch
Elasticsearch разворачивается через зеркала Яндекса. Для своей работы Elasticsearch использует java. Поэтому для начала надо установить java: apt install openjdk-11-jre
Установим Elasticsearch через зеркала Яндекса. Изменим файл репозитория командой:
nano /etc/apt/sources.list.d/elastic.list
deb [trusted=yes] https://mirror.yandex.ru/mirrors/elastic/7/ stable main
Установим Elasticsearch командой apt install elasticsearch
Перезагрузим daemon командой systemctl daemon-reload
Включим в автозагрузку systemctl enable elasticsearch
Ограничим по ресурсам:
nano /etc/elasticsearch/jvm.options
-Xms2g
-Xmx2g
Включим Elasticsearch командой systemctl start elasticsearch
Для того чтобы полнотекстовый поиск обработал pdf-файлы, нужно установить плагин ingest-attachment. Репозиторий из России недоступен, поэтому скачаем его командой:
Надо устанавливать такую же версию плагина, как и версия Elasticsearch. Установим плагин командой:
/usr/share/elasticsearch/bin/elasticsearch-plugin install file:////root/ingest-attachment-7.17.9.zip
Отредактируем конфиг:
# nano /etc/elasticsearch/elasticsearch.yml
xpack.security.enabled: true
discovery.type: single-node
Перезагрузим Elasticsearch: # systemctl restart elasticsearch
Запустим генерацию паролей для Elasticsearch: # /usr/share/elasticsearch/bin/elasticsearch-setup-passwords auto
Нам нужен пароль от пользователя elastic. Проверим работу Elasticsearch командой:
# curl -X GET "
http://localhost:9200
" -u elastic:PASSWORD
Будет примерно такой вывод:

Далее нужно установить приложения для полнотекстового поиска в Nextcloud. Переходим в веб-интерфейс Nextcloud и устанавливаем приложения из apps store:

После установки настраиваем полнотекстовый поиск:


Проверим работу полнотекстового поиска:
sudo -u www-data php /var/www/nextcloud/occ fulltextsearch:check
Проиндексируем один раз
sudo -u www-data php /var/www/nextcloud/occ fulltextsearch:index
Для автоматического индексирования нужно создать сервис
nano /etc/systemd/system/nextcloud-fulltext-elasticsearch-worker.service
Вписываем туда следующие строки
[Unit] Description=Elasticsearch Worker for Nextcloud Fulltext Search After=
network.target
[Service] User=www-data Group=www-data WorkingDirectory=/var/www/nextcloud ExecStart=/usr/bin/php /var/www/nextcloud/occ fulltextsearch:live -q ExecStop=/usr/bin/php /var/www/nextcloud/occ fulltextsearch:stop Nice=19 Restart=always [Install] WantedBy=
multi-user.target
Включаем сервис в автозагрузку:
systemctl enable nextcloud-fulltext-elasticsearch-worker.service
И запускаем его:
systemctl start nextcloud-fulltext-elasticsearch-worker.service
Проверяем работу полнотекстового поиска. Для этого создадим текстовый файл

Попробуем его найти через полнотекстовый поиск

Подключение контроллера AD к Enterprise Nextcloud
Предполагается, что контроллер AD находится в той же локальной сети, что и Enterprise Nextcloud. Для подключения контроллера AD нужны эти приложения Nextcloud:

Загружаем и включаем данные приложения. Переходим в пункт LDAP/AD интеграция

Вводим полное имя базы пользователей, имя пользователя для поиска, пароль пользователя для поиска, ip адрес и порт ldap сервера

Проверяем базу поиска пользователей

Далее нажимаем только «Продолжить»



После этого пользователи из AD появятся в Nextcloud.
Заключение
Мы развернули отказоустойчивый Nextcloud с балансировкой нагрузки, репликацией БД, синхронизированным хранилищем и полнотекстовым поиском. Такая конфигурация обеспечивает высокую доступность и отказоустойчивость в корпоративной среде. Готовы попробовать? Nextcloud Enterprise от Cloud4Y.