Установка и настройка Nextcloud + Apache на Ubuntu
Nextcloud — облачный сервис для организации доступа к данным. Это веб-приложение и для своей работы требует настроенного веб-сервера. В данной инструкции мы рассмотрим процесс настройки сервиса в связке в Apache. Если нам понадобится NGINX, переходим к инструкции Установка и настройка Nextcloud + NGINX на Ubuntu.
Подготовка к работе
Настройка сервера баз данных
Установка и настройка веб-сервера
Apache
PHP
Установка Nextcloud
Настройка memcache
Настройки после установки
Загрузка больших файлов
Пример полезных приложений для Nextcloud
Office Online
Антивирус
Работа с пользователями из командной строки
Настройка логирования
Решение возможных проблем
Подготовка к установке
Прежде чем перейти к установке и настройке компонентов nextcloud, выполним предварительные действия.
Системные требования
С актуальными системными требованиями можно ознакомиться на странице System requirements. Необходимо убедиться, что наш сервер соответствует данным требованиям.
Особое внимание нужно уделить программным требованиям, а именно:
- Дистрибутиву и версии операционной системы.
- СУБД.
- Вариантам веб-сервера.
- Версии PHP.
Мы можем выбрать из вариантов версий и компонентов, но разработчики рекомендуют остановить свой выбор на конкретных пунктах, которые они выделили полужирным и сделали отметку (recommended). На момент обновления данной инструкции актуальная версия Nextcloud была 30 (Hub 8) с рекомендованными требованиями:
- Ubuntu 22.04 LTS.
- MariaDB 10.11.
- Apache 2.4.
- PHP 8.3.
Именно эти компоненты и будут использоваться в данной инструкции.
Настройка времени
Чтобы мы могли видеть правильную метку времени создания и изменения файлов, необходимо, чтобы время было корректным на сервере.
Устанавливаем утилиту chrony:
apt install chrony
... и запускаем ее:
systemctl enable chrony
Выставляем нужный часовой пояс:
timedatectl set-timezone Europe/Moscow
* в данном примере московское время.
Брандмауэр
По умолчанию в Ubuntu не требуется открывать порты, так как брандмауэр разрешает все. Но если в вашем случае действует запрещающая политика, открываем веб-порты 80 и 443:
iptables -I INPUT -p tcp --dport 80 -j ACCEPT
iptables -I INPUT -p tcp --dport 443 -j ACCEPT
Для сохранения правил используем iptables-persistent:
apt install iptables-persistent
netfilter-persistent save
Сервер баз данных
В качестве СУБД будем использовать MariaDB.
Устанавливаем:
apt install mariadb-server-10.11
* обратите внимание, что мы устанавливаем конкретную версию (10.11). Дело в том, что в репозитории MariaDB может быть версия свежее той, что требуется для Nextcloud. В результате мы получим ошибку, когда перейдем к установке портала. Поэтому мы берем саму последнюю версию из системных требований и подставляем ее при установке.
Если во время установки нужной версии mariadb система вернет ошибку:
Для пакета «mariadb-server» не найден кандидат на установку
... необходимо подключить репозиторий. Для этого прочитайте раздел Подключение актуального репозитория инструкции Установка MariaDB-server на Rocky Linux или Ubuntu.
Подключаемся к MariaDB и создаем базу данных:
mysql
> CREATE DATABASE nextcloud DEFAULT CHARACTER SET utf8 DEFAULT COLLATE utf8_general_ci;
Создаем пользователя и даем ему привилелении на созданную базу:
> CREATE USER 'nextcloud'@'localhost' IDENTIFIED BY 'nextcloud';
> GRANT ALL PRIVILEGES ON nextcloud.* TO nextcloud@localhost;
Выходим из оболочки SQL:
> quit
Веб-сервер + PHP
Как было сказано выше, для Nextcloud необходим веб-сервер. Само приложение написано на языке PHP и также требуется одноименный интерпретатор.
Apache
Nextcloud можно развернуть на NGINX или Apache. В данной инструкции будем использовать последний.
Устанавливаем веб-сервер:
apt install apache2
Создаем виртуальный домен и настраиваем его для работы с облачным сервисом:
vi /etc/apache2/sites-enabled/nextcloud.conf
<VirtualHost *:80>
Define root_domain nextcloud.dmosk.ru
ServerName ${root_domain}
Redirect / https://${root_domain}
</VirtualHost>
<VirtualHost *:443>
Define root_domain nextcloud.dmosk.ru
Define root_path /var/www/nextcloud
ServerName ${root_domain}
DocumentRoot ${root_path}
SSLEngine on
SSLCertificateFile ssl/cert.pem
SSLCertificateKeyFile ssl/cert.key
<IfModule mod_headers.c>
Header always set Strict-Transport-Security "max-age=15552000; includeSubDomains; preload"
</IfModule>
<Directory ${root_path}>
AllowOverride All
Require all granted
</Directory>
</VirtualHost>
* где:
- nextcloud.dmosk.ru — домен, на котором будет работать сервис.
- ssl/cert.pem — открытый сертификат. Его мы создадим ниже по инструкции.
- ssl/cert.key — путь до ключа закрытого сертификата. Его мы создадим ниже по инструкции.
- /var/www/nextcloud — каталог с порталом. В него мы распакуем исходники.
Разрешаем модули:
a2enmod ssl rewrite headers env dir mime
* где:
- ssl — поддержка шифрования.
- rewrite — модуль, позволяющий выполнять перенаправления на уровне apache.
- headers — позволяет менять заголовки при http-ответах.
- env — управление системными переменными, которые используются другими модулями Apache.
- dir — для поиска скрипта по умолчанию и отображения файлов в каталоге.
- mime — назначает метаданные при ответах.
Создаем каталог для хранения сертификатов и переходим в него:
mkdir /etc/apache2/ssl
cd /etc/apache2/ssl
Генерируем сертификат:
openssl req -new -x509 -days 1461 -nodes -out cert.pem -keyout cert.key -subj "/C=RU/ST=SPb/L=SPb/O=Global Security/OU=IT Department/CN=nextcloud.dmosk.ru/CN=nextcloud"
* данная команда создаст сертификат на 4 года для URL nextcloud.dmosk.ru или nextcloud.
Для первичного запуска Nextcloud достаточно самоподписанного сертификата. Однако, для продуктивной среду лучше его купить или запросить бесплатный у Let's Encrypt.
Проверяем конфигурацию apache:
apachectl configtest
... если видим:
...
Syntax OK
* мы увидим предупреждение Warning: DocumentRoot [/var/www/nextcloud] does not exist. Оно означает, что каталога /var/www/nextcloud не существует. Игнорируем — мы созданим его позже.
Перезапускаем сервис апача:
systemctl restart apache2
PHP
На момент последнего обновления инструкции, рекомендовалось установить PHP версии 8.3. Для дальнейшего удобства работы, мы сохраним ее в переменную:
export PHP_VER=8.3
Посмотреть, какая версия будет установлена из репозитория системы можно командой:
apt search --names-only '^php[.0-9]{3}$'
а) Если она соответствует рекомендации Nextcloud, вводим команду для установки PHP, PHP-FPM и необходимых расширений:
apt install php php-fpm php-common php-zip php-xml php-intl php-gd php-mysql php-mbstring php-curl php-imagick libapache2-mod-fcgid php-gmp php-bcmath libmagickcore-6.q16-6-extra
б) Если рекомендованной PHP версии в репозитории нет, переходим к инструкции Установка разных версий PHP на Linux Ubuntu. Устанавливаем PHP нужной версии, а после расширения:
apt install php${PHP_VER}-fpm php${PHP_VER}-common php${PHP_VER}-zip php${PHP_VER}-xml php${PHP_VER}-intl php${PHP_VER}-gd php${PHP_VER}-mysql php${PHP_VER}-mbstring php${PHP_VER}-curl php${PHP_VER}-imagick libapache2-mod-fcgid php${PHP_VER}-gmp php${PHP_VER}-bcmath libmagickcore-6.q16-6-extra
После установки PHP и расширений, выполним несколько настроек.
Разрешаем в Apache модули для fcgi и php-fpm:
a2enmod proxy_fcgi setenvif
a2enconf php${PHP_VER}-fpm
Настраиваем php.ini:
vi /etc/php/${PHP_VER}/fpm/php.ini
opcache.enable_cli=1
...
opcache.interned_strings_buffer=32
...
opcache.revalidate_freq=1
...
memory_limit = 512M
* где ${PHP_VER} в пути в файлу — версия установленного PHP.
Посмотреть версию PHP можно командой:
php -v
Перезапускаем Apache и php-fpm:
systemctl restart apache2 php${PHP_VER}-fpm
Установка Nextcloud
Устанавливаем дополнительные пакеты:
apt install wget unzip
где:
- wget — для загрузки файлов.
- unzip — для распаковки архива.
Переходим во временную папку:
cd /tmp
и скачиваем исходник для установки с последней версией портала:
wget https://download.nextcloud.com/server/releases/latest.zip
* при необходимости скачать другую версию Nextcloud, переходим по ссылке download.nextcloud.com/server/releases.
Распаковываем скачанный архив:
unzip latest.zip
* если мы загрузили не последнюю версию nextcloud, то имя файла будет другим.
И переносим содержимое архива в каталог /var/www:
mv nextcloud /var/www
Задаем права доступа:
chown -R www-data:www-data /var/www/nextcloud
Открываем браузер и переходим по адресу https://nextcloud.dmosk.ru, где nextcloud.dmosk.ru — адрес облачного сервиса, который мы прописали в настройках apache.
Задаем логин и пароль для администратора. В качестве базы данных выбираем MySQL/MariaDB (если предлагается выбор) и вводим в качестве логина, пароля и базы nextcloud.
Завершаем установку.
Оптимизируем работу базы данных:
sudo -u www-data php /var/www/nextcloud/occ db:convert-filecache-bigint
Открываем конфигурационный файл nextcloud:
vi /var/www/nextcloud/config/config.php
Добавляем:
...
'default_phone_region' => 'RU',
Настройка кэширования
В общих сведениях настроек nextcloud мы получим предупреждение, если не настроим кэширование.
Сначала устанавливаем memcached и php-apcu:
apt install memcached php-memcached php-apcu
Если мы устанавливали не нативную версию PHP, то наша команда будет:
apt install memcached php${PHP_VER}-memcached php${PHP_VER}-apcu
После разрешаем автозапуск и запускаем сервис кэширования:
systemctl enable memcached
systemctl start memcached
Перезапускаем apache:
systemctl restart apache2
Отредактируем конфигурационный файл nextcloud:
vi /var/www/nextcloud/config/config.php
Добавляем:
...
'filelocking.enabled' => true,
'memcache.locking' => '\\OC\\Memcache\\Memcached',
'memcache.local' => '\OC\Memcache\Memcached',
'memcache.distributed' => '\OC\Memcache\Memcached',
'memcached_servers' => [
[ '127.0.0.1', 11211 ],
],
...
Выполнение фоновых заданий в cron
После установки Nextcloud фоновые задания выполняются с помощью AJAX при посещении страниц пользователем. Это не позволит выполнять задачи планировщика при отсутствии активности.
Для решения проблемы переходим в настройки:
Кликаем по Основные параметры:
В разделе «Фоновые задания» выбираем Cron:
Идем в консполь,устанавливаем cron:
apt install cron
Cоздаем задание от пользователя www-data:
crontab -e -uwww-data
* * * * * /usr/bin/php /var/www/nextcloud/cron.php
Тюнинг после установки
Для корректной работы системы выполним дополнительную настройку. После входа в nextcloud под администратором, переходим в настройки для пользователя:
В разделе «Параметры сервера» переходим в Основные сведения:
В разделе «Проверка безопасности и параметров» мы можем увидеть список проблем:
Рассмотрим процесс решения некоторых из них.
1. Не указан регион размещения этого сервера Nextcloud
Для решения проблемы открываем конфигурационный файл nextcloud:
vi /var/www/nextcloud/config/config.php
Добавляем:
...
'default_phone_region' => 'RU',
Загрузка больших объемов
Открываем конфигурационный файл PHP:
vi /etc/php/${PHP_VER}/fpm/php.ini
Приводим следующие опции к виду:
upload_max_filesize = 512G
...
post_max_size = 512G
...
max_execution_time = 3600
...
max_input_time = 3600
...
output_buffering = 0
* где:
- upload_max_filesize — максимально допустимый размер одного загружаемого файла;
- post_max_size — максимальный объем отправляемых на сервер данных;
- max_execution_time — максимальное время работы скрипта. В данном примере, если он не успеет отработать за 3600 секунд, PHP принудительно завершит его работу
- max_input_time — время в секундах, за которое PHP должен разобрать входные данные GET и POST.
- output_buffering — ограничение буферизации вывода для всех файлов. В нашем примере отключаем.
Перезапускаем апач:
systemctl restart apache2
Задаем новое значение фрагментации загружаемых файлов:
sudo -u www-data php /var/www/nextcloud/occ config:app:set files max_chunk_size --value 536870912
* задано значение в 50 Мб.
Некоторые полезные приложения
В данном разделе рассмотрим некоторые приложения, которые могут оказаться полезными и расширят возможности Nextcloud.
1. Офисные пакеты
У нас есть возможность редактировать офисные документы (на подобие doc и xls) онлайн, не мешая нескольким сотрудникам работать с одними и теми же файлами одновременно. Для расширения функциональной возможности используются специальные приложения. Наиболее распространенные:
1. Collabora Office.
2. OnlyOffice.
Работа данных приложений требует настройки специализированного сервера. Инструкции по настройке представленны по ссылками выше.
2. Антивирус
Для защиты данных от вирусов можно использовать приложение «Antivirus for files». Его работа основана на антивирусе ClamAV. Сначала в систему нужно установить его:
apt install clamav clamav-daemon
Так как обновления clamav заблокированы для российских IP-адресов, открываем файл:
vi /etc/clamav/freshclam.conf
Комментируем строки, которые начинаются на ##DatabaseMirror
##DatabaseMirror ...
##DatabaseMirror ...
Добавляем строку:
PrivateMirror https://packages.microsoft.com/clamav/
Останавливаем службу clamav-freshclam:
systemctl stop clamav-freshclam
Удаляем старую информацию об обновлениях:
rm -f /var/lib/clamav/freshclam.dat
Запускаем обновление:
freshclam
Ждем обновления, после перезапускаем службы clamav-freshclam и clamav-daemon:
systemctl restart clamav-freshclam clamav-daemon
Само приложение Antivirus for files можно установить из командной строки:
sudo -u www-data php /var/www/nextcloud/occ app:install files_antivirus
Теперь переходим в веб-интерфейс Nextcloud и в параметрах сервера кликаем по Безопасность:
В разделе «Антивирус для Файлов» выставляем необходимые настройки:
* в моем примере проверка выполняется при обращении к службе clamav. Также мы предпочли сразу удалять зараженный файл (на выбор также предлагается просто записывать событие в журнал).
Работа с пользователями из UNIX-Shell
В состав nextcloud входит php-скрипт occ, с помощью которого можно управлять сервисом из командной строки Linux.
Добавление пользователя
Создать нового пользователя можно командой:
sudo -u www-data php /var/www/nextcloud/occ user:add admin
* где admin — имя учетной записи.
Сброс пароля
При необходимости сбросить пароль пользователя, можно воспользоваться командой:
sudo -u www-data php /var/www/nextcloud/occ user:resetpassword admin
* где admin — учетная запись пользователя, чей пароль хотим сбросить.
Настройка логирования
Нам может понадобиться включить лог для диагностики и решения проблем. Для этого открываем конфигурационный файл:
vi /var/www/nextcloud/config/config.php
Добавим:
...
'log_type' => 'file',
'logfile' => 'nextcloud.log',
'loglevel' => 3,
'logdateformat' => 'F d, Y H:i:s',
Готово, увидеть лог можно командой:
tail -f /var/www/nextcloud/nextcloud.log
Возможные проблемы
Превышено количество запросов
На странице аутентификации мы можем увидеть сообщение об ошибке Превышено количество запросов. При этом, мы не можев войти в систему.
Причина: в Nextcloud встроена система безопасноти, которая считает количество неудачных попыток входа в систему. Если для определенного адреса данное количество превысило допустимую норму, то облако будет блокировать вход в систему на некоторое время для защиты от взлома.
Решение: данные о неудачных попытках подключиться к Nextcloud хранятся в базе данных, таблице oc_bruteforce_attempts.
В нашем примере мы использовали базу MySQL. Подключимся к ней:
mysql -uroot -p
Выберем для работы базу nextcloud:
> use nextcloud
Вывести список всех неудачных попыток можно командой:
> select * from oc_bruteforce_attempts;
На его основе можно попробовать сделать выводы, откуда приходят попытки выторизоваться и под каким пользователем идут попытки входа в систему. Это могут быть целенаправленные попытки взломать систему, или у пользователя может быть изменен пароль, а приложение, установленное на компьютер делает попытки подключения со старыми аутентификационными данными.
Чтобы быстро решить проблему, мы можем почистить таблицу командой:
> truncate oc_bruteforce_attempts;