Nextcloud — это мощное решение для организации личного облачного хранилища, которое предоставляет доступ к данным, синхронизацию файлов и совместную работу в любом месте. В данной статье мы рассмотрим процесс установки Nextcloud на операционную систему Rocky Linux, которая зарекомендовала себя как надежная платформа для серверных решений. Следуя этому руководству, вы сможете настроить собственный облачный сервис с высокой степенью безопасности и контроля над данными, что делает Nextcloud отличным выбором для индивидуальных пользователей и организаций.

Аналогично Rocky Linux можно установить Nextcloud на Red Hat, CentOS, AlmaLinux OS, так как они все из одного семейства. В нашем случае используется Rocky Linux 9.

Установка и настройка репозиториев и модулей

Для установки нам понадобится два репозитория: EPEL (Extra Packages for Enterprise Linux), Remi. Будем использовать одну из свежих версий PHP 8.3 из репозитория Remi. На данный момент в стандартном репозитории Rocky Linux версия PHP 8.0.

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

dnf install epel-release

Устанавливаем репозиторий Remi (ссылка для Rocky Linux 9):

dnf install https://rpms.remirepo.net/enterprise/remi-release-9.rpm

Нам нужна последняя версия MariaDB, которую поддерживает Nextcloud. На данный момент 11.4, поэтому подключаем репозиторий. Создаём в /etc/yum.repos.d/ файл MariaDB.repo со следующим содержимым:

[mariadb]
name = MariaDB
baseurl = http://yum.mariadb.org/11.4/rockylinux9-amd64
gpgkey=https://yum.mariadb.org/RPM-GPG-KEY-MariaDB
gpgcheck=1

Отключаем установку версии MariaDB по умолчанию из стандартного репозитория:

dnf module disable mariadb -y
dnf module reset mariadb -y

Обновляем кэш для всех подключённых репозиториев:

dnf makecache

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

dnf upgrade

Выводим список модулей PHP, которые могут быть включены:

dnf module list php
Модуль PHP 8.3

Включаем модуль PHP 8.3:

dnf module enable php:remi-8.3 -y

Выводим снова список:

dnf module list php

Видим, что требуемая нам версия включена:

Модуль PHP 8.3

В более новой версии на момент написания статьи не было всех требуемых для установки пакетов.

Устанавливаем требуемые нам пакеты:

dnf install httpd mariadb-server nano wget zip unzip libxml2 openssl php83-php php83-php-ctype php83-php-curl php83-php-gd php83-php-iconv php83-php-json php83-php-libxml php83-php-mbstring php83-php-openssl php83-php-posix php83-php-session php83-php-xml php83-php-zip php83-php-zlib php83-php-pdo php83-php-mysqlnd php83-php-intl php83-php-bcmath php83-php-gmp php83-php-imagick php83-php-pecl-apcu php83-php-redis mod_ssl openssh

В дальнейшем в статье во всех файлах, конфигурациях и командах буду указывать nextcloud.victorz.ru. Вам надо будет везде где увидите nextcloud.victorz.ru заменять на ваш домен. Запомните это.

Создаём каталоги

mkdir -p /var/www/sub-domains/nextcloud.victorz.ru/html
mkdir -p /var/www/sub-domains/nextcloud.victorz.ru/data
  • html — в каталоге будет размещаться nextcloud;
  • data — в каталоге будут размещаться данные, которые пользователь помещает в облако. По умолчанию nextcloud размещает эти данные в своём каталоге, который доступен из сети интернет, но мы их вынесем из него для безопасности.

Настройка Apache

Включаем автозапуск и запускаем:

systemctl enable httpd
systemctl start httpd

Создаём каталоги, в которых будут находиться данные наших сайтов:

mkdir -p /etc/httpd/sites-available /etc/httpd/sites-enabled

В файле /etc/httpd/conf/httpd.conf в самом конце дописываем строку:

Include /etc/httpd/sites-enabled

Добавляем или изменяем строку раскомментировав:

ServerName nextcloud.victorz.ru

Создаём файл /etc/httpd/sites-available/nextcloud.victorz.ru со следующим содержимым:

<VirtualHost *:80>
  ServerName  nextcloud.victorz.ru
  DocumentRoot /var/www/sub-domains/nextcloud.victorz.ru/html/
  DirectoryIndex index.php index.htm index.html

  CustomLog "/var/log/httpd/nextcloud.victorz.ru-access_log" combined
  ErrorLog  "/var/log/httpd/nextcloud.victorz.ru-error_log"

  <Directory /var/www/sub-domains/nextcloud.victorz.ru/html/>
    Require all granted
    AllowOverride All
    Options FollowSymLinks MultiViews
    <IfModule mod_dav.c>
      Dav off
    </IfModule>
  </Directory>
</VirtualHost>

Если во время настройки вы хотите отлаживать процесс и обращаться к серверу по IP, то добавляем ServerAlias. Пример:

...
ServerName  nextcloud.victorz.ru
ServerAlias 192.168.7.62
...

Создаём символическую ссылку на данный файл:

ln -s /etc/httpd/sites-available/nextcloud.victorz.ru /etc/httpd/sites-enabled/

Перезапускаем Apache:

systemctl restart httpd

Настройка PHP

В файле /etc/opt/remi/php83/php.ini раскомментировать и изменить или добавить строки:

memory_limit = 1G
max_execution_time = 3600
max_input_time = 3600
upload_max_filesize = 10G
post_max_size = 10G
file_uploads = On
upload_tmp_dir = "/tmp"
max_file_uploads = 200
date.timezone = "Asia/Novosibirsk"

Ряд настроек позволит без проблем загружать файлы большого размера.

date.timezone = «Europe/Moscow» — для города Москва в РФ. Указывайте вашу временную зону, которую можете найти в интернете.

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

ls -al /etc/localtime

В этом случае у вас будет показана информация следующего вида:

/etc/localtime -> ../usr/share/zoneinfo/Asia/Novosibirsk

В файле /etc/opt/remi/php83/php.d/40-apcu.ini раскомментировать и изменить или добавить строки:

extension = apcu.so

apc.enable_cli=1

В файле /etc/opt/remi/php83/php.d/10-opcache.ini раскомментировать и изменить или добавить строку:

opcache.interned_strings_buffer=16

Перезапускаем Apache:

systemctl restart httpd

Настройка MariaDB

Включаем автозапуск и запускаем:

systemctl enable mariadb
systemctl restart mariadb

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

sudo mariadb-secure-installation
  1. На вопрос «Enter current password for root (enter for none):» нажимаем Enter.
  2. На вопрос «Switch to unix_socket authentication [Y/n]» вводим n и нажимаем Enter. Можете подробнее изучить эту тему и выбирать другий вариант.
  3. На вопрос «Change the root password? [Y/n]» нажимаем Enter, т.е. принимаем по умолчанию ответ Y (да).
  4. Далее дважды вводим новый пароль, чтобы установить пароль пользователя root базы данных (не операционной системы). При вводе пароль не отображается, поэтому будьте аккуратны.
  5. Далее на вопрос «Remove anonymous users? [Y/n]» нажимаем Enter.
  6. На вопрос «Disallow root login remotely? [Y/n]» нажимаем Enter.
  7. На вопрос «Remove test database and access to it? [Y/n]» нажимаем Enter.
  8. На вопрос «Reload privilege tables now? [Y/n]» нажимаем Enter.

Перезапускаем MariaDB:

systemctl restart mariadb

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

Устанавливаем и запускаем:

dnf install redis -y
systemctl enable redis
systemctl start redis

Nextcloud и Redis будут работать на одном сервере. В этом случае с Redis не будут работать системы развёрнутые на других серверах и его работу лучше настроить через Unix-сокет. Откройте конфигурационный файл Redis, который обычно находится по пути /etc/redis/redis.conf, раскомментировать и изменить или добавить строки:

unixsocket /run/redis/redis.sock

unixsocketperm 770

# bind 127.0.0.1 -::1 # закомментируйте эту строку

port 0

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

mkdir -p /run/redis
chmod 770 /run/redis/
usermod -aG redis apache

Перезапускаем Redis и проверяем работу через unix-сокет:

systemctl restart redis
redis-cli -s /var/run/redis/redis.sock

Redis выведет командную строку для работы с ним следующего вида:

redis /var/run/redis/redis.sock>

Вводим exit и нажимаем Enter для выхода.

Установка Nextcloud

Переходим на официальный сайт Nextcloud и получаем ссылку на дистрибутив для «Community projects» — «Archive». Далее скачиваем дистрибутив и распаковываем его:

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

Ссылка на архив может иметь в ваше время другой вид, на момент написания статьи она имела вид указанный в команде. По итогу появится каталог /tmp/nextcloud. Копируем содержимое каталога в каталог, где будет находиться Nextcloud:

cd /tmp/nextcloud
cp -Rf . /var/www/sub-domains/nextcloud.victorz.ru/html/

Изменяем права доступа к каталогам для пользователя apache:

chown -Rf apache.apache /var/www/sub-domains/nextcloud.victorz.ru/html
chown -Rf apache.apache /var/www/sub-domains/nextcloud.victorz.ru/data
chmod 770 /var/www/sub-domains/nextcloud.victorz.ru/data/

Настройка Firewall

Открываем порты на которых будет работать Nextcloud:

firewall-cmd --zone=public --add-port=80/tcp --permanent
firewall-cmd --zone=public --add-port=443/tcp --permanent
firewall-cmd --reload

Запуск и настройка Nextcloud

Настраиваем cron. Создаём файл для cron для пользователя apache:

sudo crontab -u apache -e

Откроется консольный редактор. Вписываем следующее:

*/5  *  *  *  * /opt/remi/php83/root/usr/bin/php -f /var/www/sub-domains/nextcloud.victorz.ru/html/cron.php

Далее нажимаем клавишу Escape (ESC), чтобы выйти из режима редактирования и вводим команду:

:wq

Нажимаем клавишу Enter. Редактор сохранит данные в файле /var/spool/cron/apache и закроется.

Переходим на сайт по адресу http://nextcloud.victorz.ru и видим первичное окно настройки, в котором можно задавать настройки. Кто-то может увидеть ошибку:

Перевод: Невозможно записать в каталог конфигурации! Обычно это можно исправить, предоставив веб-серверу доступ на запись в каталог конфигурации.

Скорее всего у вас в системе SELinux запрещает Apache записывать данные в каталоги. Для проверки выполним команду (отключим временно SELinux):

sudo setenforce 0

Снова открываем страницу. Если всё заработало, то надо настраивать SELinux. Если не заработало, то у вас другая проблема, с которой я не сталкивался. Если проблема у вас связана с SELinux, то выполним ряд команд, у кого нет проблем продолжайте настройку в интерфейсе Nextcloud.

Команды для тех, у кого проблемы:

sudo semanage fcontext -a -t httpd_sys_rw_content_t "/var/www/sub-domains/nextcloud.victorz.ru/html(/.*)?"

sudo semanage fcontext -a -t httpd_sys_rw_content_t "/var/www/sub-domains/nextcloud.victorz.ru/data(/.*)?"

sudo restorecon -R /var/www/sub-domains/nextcloud.victorz.ru/html/

sudo restorecon -R /var/www/sub-domains/nextcloud.victorz.ru/data/

sudo setsebool -P httpd_unified 1

sudo setsebool -P httpd_can_network_connect 1

sudo setenforce 1

sudo systemctl restart httpd

Если не помогло, то надо искать решение или (под вашу ответственность) отключить SELinux полностью изменив в файле /etc/selinux/config строку:

SELINUX=enforcing
# или
SELINUX=permissive
# на
SELINUX=disabled

Перезагрузить операционную систему:

sudo reboot

Продолжаем настройку:

Установка Nextcloud на RockyLinux, CentOS, AlmaLinux, Red Hat
  • Указываем логин и пароль учётной записи администратора, которую создаст Nextcloud.
  • Указываем путь к каталогу с данными. В нашем случае мы создали каталог /var/www/sub-domains/nextcloud.victorz.ru/data. В вашем случае он может быть в любом другом месте. Не размещать его в каталоге html, в котором находятся служебные файлы Nextcloud.
  • Указываем базу данных MariaDB: указываем учётную запись администратора к базе данных, имя базы данных для Nextcloud, хост базы данных оставляем по умолчанию.

Нажимаем кнопку Установить. Если вы всё правильно сделали, так как написано в данной статье, то вы увидите страницу, на которой предлагают установить рекомендованные приложения.

Создаём индексы в базе данных и проводим миграцию (команда выполняется от имени пользователя apache):

sudo -u apache /opt/remi/php83/root/usr/bin/php /var/www/sub-domains/nextcloud.victorz.ru/html/occ db:add-missing-indices

sudo -u apache /opt/remi/php83/root/usr/bin/php /var/www/sub-domains/nextcloud.victorz.ru/html/occ maintenance:repair --include-expensive

В файл /var/www/sub-domains/nextcloud.victorz.ru/html/config/config.php добавляем строки:

  'default_phone_region' => 'RU',
  'maintenance_window_start' => 1,
  'memcache.local' => '\\OC\\Memcache\\APCu',
  'memcache.distributed' => '\\OC\\Memcache\\Redis',
  'memcache.locking' => '\\OC\\Memcache\\Redis',
  'redis' => 
  array (
    'host' => '/var/run/redis/redis.sock',
    'port' => 0,
    'timeout' => 0.0,
  ),

На данном этапе система настроена и работает. Однако рекомендую настроить работу по протоколу HTTPS в целях повышения безопасности.

Удаление ненужного

Удаляем ненужные данные:

rm -f /tmp/latest.zip
rm -fR /tmp/nextcloud

Ниже идут полезные рекомендации не обязательные к применению и без них система уже настроена.


Настройка работы по HTTPS

При настройке будем использовать ключи и сертификаты, которые получили (купили) где-либо, т.е. не будет использоваться Let’s Encrypt. Я его не использую, так как облако у меня работает на нестандартных портах и развёрнуто за роутером на домашнем сервере, куда доступ для всех, включая Let’s Encrypt, закрыт.

Для использования Let’s Encrypt воспользуйтесь рекомендациями из официальной документации https://docs.rockylinux.org/guides/security/generating_ssl_keys_lets_encrypt

Создаём каталог для хранения ключей:

mkdir -p /var/www/sub-domains/nextcloud.victorz.ru/ssl

Помещаем ключи и сертификаты в данный каталог.

Настраиваем SELinux так как описано выше, но для каталога ssl.

Назначаем права для пользователя apache:

chown -Rf apache.apache /var/www/sub-domains/nextcloud.victorz.ru/ssl

В файле /etc/httpd/conf/httpd.conf добавим или изменим строку раскомментировав:

LoadModule ssl_module modules/mod_ssl.so

Вносим изменения в файл /etc/httpd/sites-available/nextcloud.victorz.ru добавив следующие строки в конце файла:

<VirtualHost *:443>
    ServerName nextcloud.victorz.ru
    DocumentRoot /var/www/sub-domains/nextcloud.victorz.ru/html/
    DirectoryIndex index.php index.htm index.html

    CustomLog "/var/log/httpd/nextcloud.victorz.ru-access_log" combined
    ErrorLog  "/var/log/httpd/nextcloud.victorz.ru-error_log"

    SSLEngine on
    SSLCertificateFile /var/www/sub-domains/nextcloud.victorz.ru/ssl/nextcloud.crt
    SSLCertificateKeyFile /var/www/sub-domains/nextcloud.victorz.ru/ssl/nextcloud.key
    # SSLCertificateChainFile не нужен в современных версиях Apache. Все промежуточные сертификаты помещаются в SSLCertificateFile с основным сертификатом. Данный вопрос вам придётся изучить самостоятельно.

    <Directory /var/www/sub-domains/nextcloud.victorz.ru/html>
        Require all granted
        AllowOverride All
        Options FollowSymLinks
    </Directory>
    
    <IfModule mod_headers.c>
      Header always set Strict-Transport-Security "max-age=15552000; includeSubDomains"
    </IfModule>
</VirtualHost>

Если во время настройки вы хотите отлаживать процесс и обращаться к серверу по IP, то добавляем ServerAlias. Пример:

...
ServerName nextcloud.victorz.ru
ServerAlias 192.168.7.62
...

Перезапускаем Apache:

systemctl restart httpd

Изменение HTTP порта 80 на другой

По умолчанию система работает на 80 порту. Если нужно поменять порт, например, на 8080, то изменяем настройки. В файле /etc/httpd/conf/httpd.conf измените строку:

Listen 80
# изменить на
Listen 8080

В файле /etc/httpd/sites-available/nextcloud.victorz.ru изменяем строку:

<VirtualHost *:80>
# изменить на
<VirtualHost *:8080>

Открываем порт в Firewall:

firewall-cmd --zone=public --add-port=8080/tcp --permanent
firewall-cmd --reload

Если SELinux не отключен, то выполняем команду:

semanage port -a -t http_port_t -p tcp 8080

Перезагружаем Apache:

systemctl restart httpd

Изменение HTTPS порта 443 на другой

Если обращаться к системе по HTTPS, то по умолчанию система работает на 443 порту. Если нужно изменить порт, например, на 8443, то изменяем настройки. В файле /etc/httpd/conf.d/ssl.conf:

Listen 443 https
# изменить на
Listen 8443 https

В файле /etc/httpd/sites-available/nextcloud.victorz.ru:

<VirtualHost *:443>
# изменить на
<VirtualHost *:8443>

Открываем порт в Firewall:

firewall-cmd --zone=public --add-port=8443/tcp --permanent
firewall-cmd --reload

Если SELinux не отключен, то выполняем команду:

semanage port -a -t http_port_t -p tcp 8443

Перезагружаем Apache:

systemctl restart httpd

Переадресация с HTTP на HTTPS

Для переадресации необходимо добавить строку переадресации в файл /etc/httpd/sites-available/nextcloud.victorz.ru:

<VirtualHost *:80>
  ServerName  nextcloud.victorz.ru
  DocumentRoot /var/www/sub-domains/nextcloud.victorz.ru/html/
  DirectoryIndex index.php index.htm index.html
  Redirect / https://nextcloud.victorz.ru/
...

Перезагружаем Apache:

systemctl restart httpd