Установка облачного хранилища NextCloud

Справочник системного администратора

Данная статья расскажет, как при наличии собственного сервера на базе Debian или Ubuntu развернуть собственное облачное хранилище.

Подготовка к установке

Установку будем производить на Ubuntu 23. Для начала установим необходимые пакеты: веб-сервер Apache, базу данных MariaDB и различные модули для PHP:

sudo apt install apache2 mariadb-server libapache2-mod-php php-gd php-mysql php-curl php-mbstring php-intl php-gmp php-bcmath php-xml php-imagick php-zip unzip php-ldap php-imagick imagemagick

Сейчас мы установили пакеты для базовой инсталляции Nextcloud. Если вы будете устанавливать дополнительные приложения (аддоны), то для них могут потребоваться дополнительные пакеты. Перед установкой приложений читайте их требования и устанавливайте пакеты при необходимости.

Nextcloud хранит большинство своих настроек в базе данных. Поэтому создадим БД и пользователя, а Nextcloud после первого запуска уже сам создаст нужные ему таблицы, индексы и представления. Чтобы подключиться к нашему локальному серверу, воспользуемся простой консольной утилитой mysql.

sudo mysql

Теперь создадим пользователя и БД. Введите следующие команды, но обязательно поменяйте пароль на более сложный. Также можно указать другое имя пользователя и БД при необходимости.

CREATE USER 'nextcloud_user'@'localhost' IDENTIFIED BY 'password';

CREATE DATABASE IF NOT EXISTS nextcloud CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;

GRANT ALL PRIVILEGES ON nextcloud.* TO 'nextcloud_user'@'localhost';

FLUSH PRIVILEGES;

MariaDB настроена, выходим из командной строки SQL:

quit;

Установка и настройка Nextcloud

Теперь мы готовы к установке Nextcloud. Скачиваем самую последнюю версию и распаковываем ее:

wget https://download.nextcloud.com/server/releases/latest.zip

unzip latest.zip

Затем переместим распакованное приложение директорию /var/www:

sudo cp -r nextcloud /var/www

И сменим владельца каталога, чтобы Apache мог корректно обрабатывать все вложенные файлы:

sudo chown -R www-data:www-data /var/www/nextcloud

Настройка веб-сервера Apache

Теперь необходимо настроить Apache. Для начала создадим файл /etc/apache2/sites-available/nextcloud.conf с настройками виртуального хоста.

В качестве доменного имени мы будем использовать cloud.my-domain.com, а вам необходимо указать свой домен:

<VirtualHost *:80>
DocumentRoot /var/www/nextcloud/
ServerName cloud.my-domain.com
<Directory /var/www/nextcloud/>
Require all granted
AllowOverride All
Options FollowSymLinks MultiViews
<IfModule mod_dav.c>
Dav off
</IfModule>
</Directory>
</VirtualHost>

Чтобы Apache начал использовать этот файл конфигурации, выполните в консоли команду:

a2ensite nextcloud.conf

Далее активируем несколько модулей Apache, которые необходимы Nextcloud для корректной работы:

a2enmod rewrite

a2enmod headers

a2enmod env

a2enmod dir

a2enmod mime

Настроим PHP

Открываем файл конфигурации PHP /etc/php/version/apache2/php.ini, ищем параметр memory_limit и меняем его значение на 512M. Тут же найдите параметр upload_max_filesize и задайте максимальный размер загружаемого в облако файла.

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

service apache2 restart

Получение TLS-сертификата

Nextcloud уже готов к работе, но сейчас сейчас он работает по протоколу HTTP и не шифрует трафик. Чтобы повысить защиту сервера, выпустим и установим бесплатный TLS-сертификат от сервиса Let’s Encrypt. Для начала установим утилиту certbot, которая автоматически выпускает и обновляет TLS-сертификаты.

sudo apt-get install certbot python-certbot-apache

Запросим сертификат с помощью команды (не забудьте в параметре указать свое доменное имя):

sudo certbot --apache -d cloud.my-domain.com

Далее Certbot попросит ввести адрес электронной почты и согласиться с условиями использования. На этот адрес будут приходить письма с информацией об окончании срока сертификата. Сертификаты Let’s Encrypt действуют 90 дней. Чтобы обновить сертификат автоматически, добавьте cron-задание или systemd-таймер, который будет запускать следующую команду:

sudo certbot renew --quiet

Если вы пускаете ваше облако через реверсивный прокси по 80 порту, то пропишите в файл конфигурации /var/www/nextcloud/conf/conf.php новый параметр сразу после предыдущего:

'overwriteprotocol' => 'https',

В противном случае облако будет генерировать ссылки на http, даже если вы обращаетесь по https. Так же при использовании реверсивного прокси рекомендую установить из каталога приложений Brute-force settings и добавить в исключения IP-адрес вашего реверс-прокси, чтобы облако не ругалось на подозрительно большие запросы с этого адреса.

Инициализация облака Nextcloud и начальный интерфейс

Откроем в браузере страницу https://cloud.my-domain.com и увидим окно первоначальной настройки Nextcloud. Создадим учетную запись администратора, а также укажите название БД, пользователя и пароль, которые мы заводили на этапе настройки MariaDB. При необходимости также можете поменять каталог, где будут размещаться пользовательские данные.

Далее появится окно входа, в котором нужно ввести логин и пароль только что созданного пользователя. После первоначальной настройки мы попадем в основной интерфейс Nextcloud. Тут для примера уже загружено несколько ознакомительных файлов и активированы базовые приложения, вроде синхронизации файлов, просмотра фотографий, ведение заметок и другие.

Nextcloud установлен и готов к работе. Осталось скорректировать его настройки.

Настраиваем Cron

Переходим в веб-интерфейс администрирования и в разделе “Основные параметры” включаем фоновые задания в режим Cron.

Далее в консоли на сервере открываем crontab от имени пользователя www-data:

sudo crontab -u www-data -e

И добавляем строку в конце:

*/5 *  * * * php -f /var/www/nextcloud/cron.php

Не забываем оставить пустую строку ниже, иначе crontab не сохранит изменения, сославшишь на ошибку.

Устраним предупреждение “Server has no maintenance window start time configured”.

Откроем файл конфигурации /var/www/nextcloud/conf/conf.php и пропишем новый параметр сразу после предыдущего:

'maintenance_window_start' => 1,

Чтобы устранить предупреждtние “Заголовок HTTP «Strict-Transport-Security» должен быть настроен как минимум на «15552000» секунд” добавим следующее в файл .htaccess в корне Nextcloud:

<IfModule mod_headers.c>
Header always set Strict-Transport-Security "max-age=15552000; includeSubDomains"
</IfModule>

Настроим авторизацию через LDAP

Включаем из каталога приложений модуль LDAP user and group backend, установим библиотеку php-LDAP:

Далее переходим в веб-интерфейсе администрирования в настройки сервера и выбираем слева “LDAP/AD интеграция”.

В открывшемся окне, на вкладке Сервер добавляем имя сервера (можно задать просто имя домена). После нажимаем кнопку “Определить порт” — мы должны увидеть порт для подключения к каталогу (как правило, 389 или 636). Ниже вводим данные для учетной записи, которая была нами подготовлена ранее – после кликаем по “Сохранить учетные данные” и “Продолжить”:

Для базы поиска пользователей и групп можно просто кликнуть по Определить базу поиска DN — тогда будет определен корень домена. Или можно ввести самому конкретное подразделение. Нажимаем Проверить базу поиска DN, eсли наши настройки верны, мы должны увидеть фразу «Конфигурация в порядке»:

Нажимаем “Продолжить” — мы должны перейти на вкладку Пользователи. На данной вкладке можно ничего не трогать, или настроить дополнительные фильтры. После кликаем по кнопке Проверить настройки и пересчитать пользователей. В нижней части мы должны увидеть Конфигурация в порядке. Кликаем по “Продолжить”. Мы окажемся на странице Учетные данные, здесь можем задать поле, которое будем использовать в качестве логина. Ниже мы можем проверить учетную запись, введя ее в специальное поле и нажав “Проверить настройки”. На последней вкладке можно задать фильтры для групп или оставить по умолчанию.

Интеграция настроена. Пользователи будут загружаться из каталога LDAP, но их идентификаторы будут отображаться в виде UID — это произвольные набор цифр и букв и его использовать не удобно. Чтобы изменить атрибут для имени nextcloud, кликаем по ссылке “Эксперт”:

Задает атрибут из LDAP, который мы будем использовать для внутреннего имени системы, в нашем случаем укажем sAMAccountName, так как он характерен для логина в Active Directory.
Чтобы посмотреть список пользователей, кликаем по изображению аккаунта и выбираем “Пользователи”, система должна подгрузить пользователей из LDAP.

Настраиваем автоматическую очистку корзин пользователей

В файл конфигурации /var/www/nextcloud/conf/conf.php прописываем еще один новый параметр:

'trashbin_retention_obligation' => 'auto',

Доступные значения:

  1. auto — значение по умолчанию. В этом случае данные хранятся в корзине в течение 30 дней и автоматически удаляются в любое время если требуется пространство. Но если свободного места достаточно, данные не удаляются
  2. D, auto — Данные хранятся в корзине в течении D+ дней и удаляются в случае отсутствия свободного места
  3. auto, D — автоматически удаляются данные при отсутствии сводобного места и гарантированно если они старше D дней
  4. D1, D2 — данные хранятся не менее D1 дней и удаляются, когда хранятся более D2 дней.
  5. disabled — автоматическая очистка отключена, файлы будут хранится до тех пор пока пользователь сам их не удалит из корзины или полностью её не очистит.

Важно понимать , что свободное место определяется не местом на физическом или виртуальном диске, а квотой выделенной пользователю а уж потом свободным местом на диске.