Pull to refresh
87.41
Cloud4Y
#1 Корпоративный облачный провайдер

Развёртывание отказоустойчивого Nextcloud Enterprise: пошаговое руководство

Level of difficultyMedium
Reading time11 min
Views786

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.md5 < nextcloud-x.y.z.tar.bz2

Если контрольная сумма совпадает, то разархивируем файл командой

tar -xjvf nextcloud-x.y.z.tar.bz2

Копируем 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 — адресное пространство вашей локальной сети/

Пример файла /etc/exports
Пример файла /etc/exports

На второй ноде 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
Пример конфига /etc/drbd.d/r0.res

Такой же файл /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. Репозиторий из России недоступен, поэтому скачаем его командой:

wget https://artifacts.elastic.co/downloads/elasticsearch-plugins/ingest-attachment/ingest-attachment-7.17.9.zip

Надо устанавливать такую же версию плагина, как и версия 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.

Tags:
Hubs:
+6
Comments0

Articles

Information

Website
www.cloud4y.ru
Registered
Founded
2009
Employees
51–100 employees
Location
Россия