linux:сервер:nextcloud

Установка и настройка NextCloud на CentOS

Подготовка сервера

1. Системные требования

С актуальными системными требованиями можно ознакомиться на сайте разработчика в разделе Administration Manual- Installation and server configuration- System requirements . Необходимо убедиться, что наш сервер соответствует данным требованиям.

2. Правильное время.

Устанавливаем утилиту chrony:

dnf install chrony

Запускаем ее службу:

systemctl enable chronyd --now

Выставляем нужный часовой пояс:

timedatectl set-timezone Asia/Yekaterinburg
в данном примере московское время. Другие зоны также можно найти по пути /usr/share/zoneinfo

3. Настройка брандмауэра.

Выполняется следующими командами:

firewall-cmd --permanent --add-service={http,https}
firewall-cmd --reload

4. Отключение SELinux.

Для отключения SELinux вводим две команды:

setenforce 0
sed -i "s/SELINUX=enforcing/SELINUX=disabled/" /etc/selinux/config
первая команда отключает SELinux до перезагрузки, вторая — навсегда.

Настройка сервера баз данных

В качестве СУБД используем MariaDB.

Устанавливаем:

dnf install mariadb-server

Разрешаем автозапуск и стартуем сервис:

systemctl enable mariadb --now

Задаем пароль для суперпользователя mysql:

mysqladmin -u root password

Подключаемся к MariaDB, создаем базу данных и пользователя:

mysql -uroot -p
> CREATE DATABASE nextcloud DEFAULT CHARACTER SET utf8 DEFAULT COLLATE utf8_general_ci;
> GRANT ALL PRIVILEGES ON nextcloud.* TO nextcloud@localhost IDENTIFIED BY 'nextcloud';
> \q
данными командами мы создали базу данных nextcloud , затем с таким же названием мы создали пользователя и задали ему пароль nextcloud

Установка и настройка веб-сервера

PHP

В репозитории CentOS 8 есть требуемая версия пакета php. Для ее установки просто вводим команду:

dnf install php php-fpm php-pdo php-zip php-dom php-intl php-gd php-mysqli php-mbstring php-json php-process php-bcmath php-gmp php-imagick php-opcache

Сам пакет php-fpm мы установили на предыдущем шаге. Поэтому на данном этапе необходимо его настроить.

Открываем конфигурационный файл:

nano /etc/php-fpm.d/www.conf

Находим опцию listen. Проверяем ее значение:

listen = /run/php-fpm/www.sock

Разрешаем автозапуск php-fpm и запускаем его:

systemctl enable php-fpm --now

Nextcloud можно развернуть на NGINX или Apache. В данной инструкции будем использовать первый.

Устанавливаем веб-сервер:

dnf install nginx

Для правильной работы nextcloud запросы должны идти по https. Для этого создаем виртуальный домен и настраиваем его для работы с облачным сервисом в NGINX:

nano /etc/nginx/conf.d/nextcloud.mysite.ru.conf
server {
        listen 80;
        server_name nextcloud.mysite.ru;
        return 301 https://$server_name$request_uri;
}

server {
        listen 443 ssl;
        server_name nextcloud.mysite.ru;

        ssl_certificate /etc/nginx/ssl/cert.pem;
        ssl_certificate_key /etc/nginx/ssl/cert.key;

        root /var/www/nextcloud;

        add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
        client_max_body_size 10G;
        fastcgi_buffers 64 4K;

        rewrite ^/caldav(.*)$ /remote.php/caldav$1 redirect;
        rewrite ^/carddav(.*)$ /remote.php/carddav$1 redirect;
        rewrite ^/webdav(.*)$ /remote.php/webdav$1 redirect;

        index index.php;
        error_page 403 = /core/templates/403.php;
        error_page 404 = /core/templates/404.php;

        location = /robots.txt {
            allow all;
            log_not_found off;
            access_log off;
        }

        location ~ ^/(data|config|\.ht|db_structure\.xml|README) {
                deny all;
        }

        location / {
                rewrite ^/.well-known/host-meta /public.php?service=host-meta last;
                rewrite ^/.well-known/host-meta.json /public.php?service=host-meta-json last;
                rewrite ^/.well-known/carddav /remote.php/carddav/ redirect;
                rewrite ^/.well-known/caldav /remote.php/caldav/ redirect;
                rewrite ^(/core/doc/[^\/]+/)$ $1/index.html;
                try_files $uri $uri/ index.php;
        }

        location ~ ^(.+?\.php)(/.*)?$ {
                try_files $1 = 404;
                include fastcgi_params;
                fastcgi_param SCRIPT_FILENAME $document_root$1;
                fastcgi_param PATH_INFO $2;
                fastcgi_param HTTPS on;
                fastcgi_pass unix:/run/php-fpm/www.sock;
        }

        location ~* ^.+\.(jpg|jpeg|gif|bmp|ico|png|css|js|swf)$ {
                expires modified +30d;
                access_log off;
        }
}
где mysite.ru— домен, на котором будет работать сервис;
nextcloud.mysite.ru— имя сервера, на котором будет работать nextcloud;
/etc/nginx/ssl— каталог, в котором будут храниться сертификаты;
/var/www/nextcloud— каталог с порталом.

Создаем каталог для хранения сертификатов и переходим в него:

mkdir /etc/nginx/ssl
cd /etc/nginx/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.mysite.ru/CN=nextcloud"
данная команда создаст сертификат на 4 года для URL nextcloud.mysite.ruили nextcloud .
в данном примере мы, всего лишь, создали самоподписанный сертификат, который не будет приниматься браузером и нужно будет пропускать предупреждение. Данный метод подходит для тестирования, а для продуктивной среды стоит купить сертификат или получить его бесплатно от Let's Encrypt

Проверяем конфигурацию nginx, разрешаем его автозапуск и перезапускаем сервис:

nginx -t
systemctl enable nginx --now

Для загрузки и распаковки архива нужны следующие пакеты:

dnf install wget unzip

Переходим во временную папку:

cd /tmp

сайт nextcloud и копируем ссылку на скачивание последней версии программы:

Скачиваем исходник для установки:

wget https://download.nextcloud.com/server/releases/nextcloud-20.0.1.zip

Распаковываем скачанный архив:

unzip nextcloud-*.zip -d /var/www

Задаем права доступа:

chown -R apache:apache /var/www/nextcloud

Открываем браузер и переходим по адресу <u>https://nextcloud.mysite.ru</u>, где nextcloud.mysite.ru— наш адрес облачного сервиса, который мы создали в NGINX. Если мы используем самоподписанный сертификат, браузер выдаст предупреждение безопасности — игнорируем его и переходим на страницу.

так как мы настроили виртуальный домен, важно обратиться к серверу, именно, по имени. Таким образом, настроенный узел (в моем случае, nextcloud.mysite.ru) должен разрешаться в DNS или быть внесен в локальный файл hosts.

Прописываем логин и пароль администратора, которые хотим использовать для входа, кликаем по Хранилище и база данных :

Переключаемся на MySQL/MariaDB, вводим в качестве логина, пароля и базы nextcloud :

Завершаем установку, при желании, оставим галочку для установки рекомендованных приложений:

После установки мы окажемся в системе.

Для корректной работы системы выполним дополнительную настройку системы. После входа в nextcloud под администратором, переходим в настройки для пользователя:

В разделе «Параметры сервера» переходим в Основные сведения :

В разделе «Проверка безопасности и параметров» мы можем увидеть список проблем:

Рассмотрим процесс решения некоторых из них.

1. PHP не настроен правильно для получения переменных системного окружения

Открываем файл php.ini. При нашей установке, это:

nano /etc/php-fpm.d/www.conf

Снимаем комментарий с параметра PATH:

env[PATH] = /usr/local/bin:/usr/bin:/bin

Перезапускаем php-fpm:

systemctl restart php-fpm

2. Разрешённое максимальное значение использования памяти PHP ниже рекомендуемого значения в 512 МБ

Открываем на редактирование файл:

nano /etc/php.ini

Меняем настройку для memory_limit:

memory_limit = 512M

Перезапускаем php-fpm:

systemctl restart php-fpm

3. В базе данных отсутствуют некоторые индексы

Выполним команду для индексирования баз:

sudo -u apache php /var/www/nextcloud/occ db:add-missing-indices

4. Некоторые индексы базы данных не были преобразованы в тип big int

Выполним команду для преобразования в тип big int:

sudo -u apache php /var/www/nextcloud/occ db:convert-filecache-bigint

На запрос Continue with the conversion отвечаем утвердительно:

Continue with the conversion (y/n)? [n] y

5. В системе не установлены рекомендуемые модули PHP

Данная ошибка устраняется в зависимости от списка модулей, которых не хватает системе. Чаще всего, подходит команда:

dnf install php-<название модуля>

Установка некоторых модулей может вызвать затрудение. Например, imagick в CentOS 8 устанавливается по инструкции ниже.

Установим ImageMagick:

dnf --enablerepo=PowerTools install ImageMagick ImageMagick-devel

После устанавливаем пакеты, необходимые для сборки imagick:

dnf install php-devel php-pear make

Собираем imagick:

pecl install imagick

Создаем файл с расширением php:

nano /etc/php.d/20-imagick.ini
extension=imagick.so

Перезапускаем php-fpm:

systemctl restart php-fpm

6. Не загружен модуль OPcache

Устанавливаем модуль opcache командой:

dnf install php-opcache

Открываем конфигурационный файл:

nano /etc/php.d/10-opcache.ini

Редактируем следующее:

...
opcache.max_accelerated_files=10000
...
opcache.save_comments=1
...
opcache.revalidate_freq=1
...

Перезапускаем php-fpm:

systemctl restart php-fpm

7. Не настроена система кеширования

Для решения проблемы мы должны установить и настроить одно из средств кэширования:

  • APCu
  • Redis
  • Memcached

Мы рассмотрим последний вариант. Для этого выполняем установку модуля по инструкции Установка и настройка memcached на CentOS.

После этого открываем конфигурационный файл для nextcloud:

nano /var/www/nextcloud/config/config.php

И добавим:

...
  'memcache.local' => '\\OC\\Memcache\\Memcached',
  'memcache.distributed' => '\\OC\\Memcache\\Memcached',
  'memcached_servers' =>
  array (
    0 =>
    array (
      0 => 'localhost',
      1 => 11211,
    ),
  ),
  ...

8. MySQL используется в качестве базы данных, но не поддерживает 4-байтовые символы

Выполняем конфигурирование в несколько этапов.

Настройка СУБД

Заходим в оболочку mysql:

mysql -uroot -p

Смотрим значение для переменной innodb_file_format:

> show variables like 'innodb_file_format';

Если видим значение «Antelope», меняем его на Barracuda:

> SET GLOBAL innodb_file_format=Barracuda;

Выходим из оболочки:

> quit

Переводим Nextcloud в режим обслуживания:

sudo -u apache php /var/www/nextcloud/occ maintenance:mode --on

Перезагружаем mariadb (если на первом шаге нам пришлось менять значение для переменной innodb_file_format):

systemctl restart mariadb

Редактирование базы данных

Снова подключаемся к консоли управления СУБД:

mysql -uroot -p

Меняем кодировку для базы данных:

> ALTER DATABASE nextcloud CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
где nextcloud— имя созданной нами базы данных

Выходим из mariadb:

> quit

Также задаем новую кодировку для nextcloud

sudo -u apache php /var/www/nextcloud/occ config:system:set mysql.utf8mb4 --type boolean --value="true"

Преобразуем все таблицы в базе:

sudo -u apache php /var/www/nextcloud/occ maintenance:repair

Завершаем режим обслужавания:

sudo -u apache php /var/www/nextcloud/occ maintenance:mode --off

Для синхронизации файлов установим и настроим клиента. Nextcloud поддерживает установку на Windows, Linux, Mac, iOS и Android.

Переходим на страницу загрузки Nextcloud и скачиваем нужный клиент. После устанавливаем его, отвечая на все вопросы мастера по умолчанию. Для установки клиента на телефон, пользуемся Google Play или Apple App Store.

Запускаем клиентское приложение и переходим к настройке, кликнув по Войти :

На следующей странице вводим адрес нашего сервера и кликаем по Далее :

Нас перекинет на веб страницу для авторизации — вводим логин и пароль для пользователя. После успешной авторизации можно использовать клиент для синхронизации с файлов с нашим облаком.

В состав nextcloud входит php-скрипт occ, с помощью которого можно управлять сервисом из командной строки Linux.

Создать нового пользователя можно командой:

sudo -u apache php /var/www/nextcloud/occ user:add admin
где admin— имя учетной записи

Сброс пароля

При необходимости сбросить пароль пользователя, можно воспользоваться командой:

sudo -u apache php /var/www/nextcloud/occ user:resetpassword admin
где admin— учетная запись пользователя, чей пароль хотим сбросить

Подключение nextcloud как сетевой диск

Мы можем подключить пользовательские данные nextcloud в качестве сетевого диска.

Рассмотрим процесс для Windows.

Для начала необходимо включить службу «Веб-клиент».

Для этого открываем от администратора командную строку и вводим команды:

sc config webclient start= auto
net start webclient
первая команда включит автозапуск службы; вторая — запустит ее.

После открываем командную строку от пользователя и создаем сетевой диск командой:

net use <Буква диска>: https://<путь до nextcloud>/remote.php/webdav /user:user password

Отключение сброса пароля

Нужно добавить в файл nextcloud/config/config.php

'lost_password_link' => 'disabled',

Отключение Создайте свою бесплатную учётную запись

Отключение ссылки на https://nextcloud.com/signup/

Нужно добавить в файл nextcloud/config/config.php

'simpleSignUpLink.shown' => false,

Увеличение размера загружаемых файлов

В ответ на предупреждение: Разрешённое PHP максимальное значение использования памяти ниже рекомендуемого значения в 512 МБ, необходимо внести исправления в php.ini

upload_max_filesize = 512M
memory_limit = 512M

Strict-Transport-Security

В ответ на предупреждение: Заголовок HTTP «Strict-Transport-Security» должен быть настроен как минимум на «15552000» секунд необходимо внести исправления в .htaccess:

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

Регион размещения сервера

Не указан регион размещения этого сервера Nextcloud, что требуется для возможности проверки номеров телефонов без указания кода страны.

Чтобы разрешить пользователям сервера указывать номера телефонов без указания кода страны, добавьте параметр «default_phone_region» с соответствующим кодом страны в соответствии с ISO 3166-1.

Опять же после обновления до 21 версии Nextcloud появляется такое предупреждение.

Открывает файл config.php, расположенный в директории Nextcloud по пути config/config.php и вставляем строку:

'default_phone_region' => 'RU',