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

Обновлено Обновлено: Опубликовано Опубликовано:

Используемые термины: NextcloudNGINXUbuntu.

Рассмотренные примеры подойдут для Linux Ubuntu версий 18, 20 и 22.

Подготовка системы

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

1. Обновляем списки пакетов.

Актуализируем списки пакетов в репозиториях, чтобы установки проходили без ошибок:

apt update

При желании, мы также можем обновить пакеты:

apt upgrade

2. Синхронизируем время.

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

apt install chrony

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

timedatectl set-timezone Europe/Moscow

* в данном примере московское время.

Разрешаем запуск демона chrony:

systemctl enable chrony

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

По умолчанию в системах на базе Deb нет запрещающих правил в брандмауэре и нам ничего не нужно делать дополнительно. Но если в вашем случае настроен и используется брандмауэр на сервере, необходимо открыть порты 80 и 443.

Выполняем команды:

iptables -I INPUT -p tcp --dport 80 -j ACCEPT

iptables -I INPUT -p tcp --dport 443 -j ACCEPT

Сохраним правила с помощью netfilter-persistent:

apt install iptables-persistent

netfilter-persistent save

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

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

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

apt install mariadb-server

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

systemctl enable mariadb

systemctl start mariadb

Задаем пароль для суперпользователя 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

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

PHP

Перед тем, как устанавливать php, стоит изучить системные требования Nextcloud. Для корректной работы нужно установить рекомендуемую версию PHP.

На момент последнего обновления инструкции, рекомендовалось установить PHP версии 8.1. Для дальнейшего удобства работы, мы сохраним ее в переменную:

export PHP_VER=8.1

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

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

б) Если рекомендованной PHP версии в репозитории нет, переходим к инструкции Установка разных версий PHP на Linux Ubuntu. А для установки расширений используем команду:

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 php${PHP_VER}-gmp php${PHP_VER}-bcmath libmagickcore-6.q16-6-extra

* где PHP_VER — ранее определенная нами переменная с рекомендованной версией PHP.

Установка php завершена и можно перейти к ее настройке.

Настраиваем php-fpm:

vi /etc/php/${PHP_VER}/fpm/pool.d/www.conf

* путь к данной папке зависит от установленной версии php. В данном примере это 8.1 (задана через переменную PHP_VER).

Снимаем комментарии со следующей строки:

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

Настраиваем php.ini:

vi /etc/php/${PHP_VER}/fpm/php.ini

opcache.enable_cli=1
opcache.interned_strings_buffer=32
opcache.revalidate_freq=1

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

systemctl enable php${PHP_VER}-fpm

systemctl restart php${PHP_VER}-fpm

NGINX

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

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

apt install nginx

Создаем виртуальный домен и настраиваем его для работы с облачным сервисом:

vi /etc/nginx/sites-enabled/nextcloud.conf

server {
        listen 80;
        listen 443 ssl;
        server_name nextcloud.dmosk.ru;

        if ($scheme = 'http') {
            return 301 https://$host$request_uri;
        }

        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 ^~ /.well-known {
                location = /.well-known/carddav { return 301 /remote.php/dav/; }
                location = /.well-known/caldav  { return 301 /remote.php/dav/; }
                location = /.well-known/webfinger  { return 301 /index.php/.well-known/webfinger; }
                location = /.well-known/nodeinfo  { return 301 /index.php/.well-known/nodeinfo; }
                location ^~ /.well-known{ return 301 /index.php/$uri; }
                try_files $uri $uri/ =404;
        }

        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 ^(/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/php8.1-fpm.sock;
        }

        location ~* ^.+\.(jpg|jpeg|gif|bmp|ico|png|css|js|swf)$ {
                expires modified +30d;
                access_log off;
        }
}

* где:

  • nextcloud.dmosk.ru — домен, на котором будет работать сервис; 
  • /etc/nginx/ssl — каталог, в котором будут храниться сертификаты; 
  • /var/www/nextcloud — каталог с порталом.
  • fastcgi_pass — обработчик скриптов. В нашем примере используется php-fpm. Обратите внимание, что путь до сокетного файла будет зависить от версии PHP.

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

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.dmosk.ru/CN=nextcloud"

* данная команда создаст сертификат на 4 года для URL nextcloud.dmosk.ru или nextcloud.

В нашем примере мы запустили nextcloud с использованием самоподписанного сертификата. Для продуктивной среды рекомендуется использовать купленный сертификат или бесплатный от Let's Encrypt.

После установки php мог установиться и запуститься apache. Отключаем его:

systemctl stop apache2

systemctl disable apache2

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

nginx -t

systemctl restart nginx

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

systemctl enable nginx

Установка Nextcloud

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

apt install unzip

На странице nextcloud можно ознакомиться с возможными вариантами загрузки портала. Мы же возьмем последнюю версию.

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

cd /tmp

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

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

unzip latest.zip

И переносим содержимое архива в каталог /var/www:

mv nextcloud /var/www

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

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

Открываем браузер и переходим по адресу https://nextcloud.dmosk.ru, где nextcloud.dmosk.ru — адрес облачного сервиса.

Задаем логин и пароль для администратора. В качестве базы данных выбираем MySQL/MariaDB (если предлагается выбор) и вводим в качестве логина, пароля и базы nextcloud.

Задаем параметры для подключения к базе данных

Завершаем установку.

Оптимизируем работу базы данных:

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

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

Тюнинг после установки

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

Переходим в настройку Nextcloud

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

Переходим к общим сведениям

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

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

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

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

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

vi /etc/php/${PHP_VER}/fpm/php.ini

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

memory_limit = 512M

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

systemctl restart php${PHP_VER}-fpm

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

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

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

Например:

apt install php-gmp php-bcmath

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

systemctl restart php${PHP_VER}-fpm

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

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

  • APCu
  • Redis
  • Memcached

Мы рассмотрим два последних варианта.

Redis

Устанавливаем сам Redis Server и модуль php:

apt install redis-server php-redis

* в случае установки сервера Redis на отдельный сервер, необходимо выполнить на сервере Nextcloud только установку php-redis.

Если версия PHP не нативная для системы, то команда будет такой:

apt install redis-server php${PHP_VER}-redis

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

systemctl restart php${PHP_VER}-fpm

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

vi /var/www/nextcloud/config/config.php

И добавим:

  'memcache.local' => '\\OC\\Memcache\\Redis',
  'memcache.distributed' => '\\OC\\Memcache\\Redis',
  'memcache.locking' => '\\OC\\Memcache\\Redis',
  'redis' => 
      array (
          'host' => 'localhost',
          'port' => 6379,
      ),

Готово.

Memcached

Выполняем установку модуля для php и сам сервис memcached:

apt install memcached php-memcached

Если версия PHP не нативная для системы, то команда будет такой:

apt install memcached php${PHP_VER}-memcached

После разрешаем его автозапуск:

systemctl enable memcached

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

systemctl restart php${PHP_VER}-fpm

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

vi /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,
    ),
  ),
  ...

Готово.

4. Не указан регион размещения этого сервера Nextcloud

Для решения проблемы открываем конфигурационный файл nextcloud:

vi /var/www/nextcloud/config/config.php

Добавляем:

...
'default_phone_region' => 'RU',

Работа с пользователями из 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 — учетная запись пользователя, чей пароль хотим сбросить.

Подключение папки nextcloud по webdav

Мы можем подключить пользовательские данные nextcloud в качестве сетевого диска или раздела. Рассмотрим процесс для Windows и Linux.

Windows

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

sc config webclient start= auto

net start webclient

* первая команда включит автозапуск службы; вторая — запустит ее.

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

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

Например, для нашей настройки:

net use N: https://nextcloud.dmosk.ru/remote.php/webdav /user:admin password

* где N — буква сетевого диска; nextcloud.dmosk.ru — адрес нашего сервера; admin — учетная запись, которая была создана при установке системы; password — пароль от пользователя admin.

Ограничение на копирование файла с webdav

В Windows при попытке скопировать большой файл с папки webdav, мы можем получить ошибку «Ошибка 0x800700DF: Размер файла превышает установленное ограничение, сохранение файла невозможно.»:

Ошибка при копировании большого файла с папки webdav

Для решения проблемы необходимо на клиенте разрешить больший объем для загрузки файлов. Это делается в реестре — ветка HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\WebClient\Parameters, параметр FileSizeLimitInBytes. Для примера, если задать значение 4294967295 (максимально возможное), то мы получим ограничение в 4 Гб.

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

reg add "HKLM\SYSTEM\CurrentControlSet\Services\WebClient\Parameters" /v FileSizeLimitInBytes /t REG_DWORD /d 4294967295 /f

* команду нужно запускать в консоли, запущенной от администратора. В данном примере мы задаем также ограничение в 4 Гб.

Linux

Установим клиент davfs2. Действия будут немного различаться в зависимости от дистрибутива Linux.

а) Ubuntu / Debian:

apt install davfs2

б) CentOS / Red Hat:

yum install davfs2

Теперь мы можем примонтировать 

mount -t davfs -o noexec https://nextcloud.dmosk.ru/remote.php/webdav /mnt

* в данном примере мы запустим команду на монтирование раздела по webdav в каталог /mnt. Обращение выполняется на наш сервер nextcloud.dmosk.ru.

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

  Username: user
  ...
  Password:  

После каталог будет примонтирован.

Для постоянного монтирования серез fstab, открываем файл:

vi /etc/fstab

Добавляем строчку:

https://nextcloud.dmosk.ru/remote.php/webdav/    /mnt    davfs    user,rw,_netdev 0 0

После открываем файл:

vi /etc/davfs2/secrets

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

/mnt user password

* где /mnt — предполагаемый каталог, куда мы будем монтировать данные; user и password — логин и пароль от учетной записи в Nextcloud.

Монтируем каталог командой:

mount -a

Дополнительные настройки

Рассмотрим некоторые дополнительные настройки в Nextcloud.

Защита от брут-форс атак

Данная возможность позволяет блокировать подключения от IP-адресов, с которых было совершено слишком много неудачных попыток войти в систему. Рассмотрим возможность изменения числа неудачных попыток или отключения возможности.

Число попыток

Текущее значени для числа попыток ввода пароля можно посмотреть командой:

sudo -u www-data php /var/www/nextcloud/occ config:system:get brute-force-attempts

Если она вернет пустое значение, значит используется значение по умолчанию — 10.

Чтобы его изменить, открываем конфигурационный файл:

vi /var/www/nextcloud/config/config.php

Добавляем:

  'brute-force-attempts' => 50,

* в данном примере мы разрешили ввести неправильно пароль 50 раз, после чего будет активирована защита.

Отключение

Если по какой-либо причине нам не нужна эта функция и мы хотим ее отключить, открываем конфигурационный файл:

vi /var/www/nextcloud/config/config.php

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

  'auth.bruteforce.protection.enabled' => false,

Готово.

Возможные проблемы

Превышено количество запросов

На странице аутентификации мы можем увидеть сообщение об ошибке Превышено количество запросов. При этом, мы не можев войти в систему.

Причина: в Nextcloud встроена система безопасноти, которая считает количество неудачных попыток входа в систему. Если для определенного адреса данное количество превысило допустимую норму, то облако будет блокировать вход в систему на некоторое время для защиты от взлома.

Решение: данные о неудачных попытках подключиться к Nextcloud хранятся в базе данных, таблице oc_bruteforce_attempts.

В нашем примере мы использовали базу MySQL. Подключимся к ней:

mysql -uroot -p

Выберем для работы базу nextcloud:

> use nextcloud

Вывести список всех неудачных попыток можно командой:

> SELECT * FROM oc_bruteforce_attempts;

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

Чтобы быстро решить проблему, мы можем почистить таблицу командой:

> truncate oc_bruteforce_attempts;

Или можно удалить конкретный адрес:

> DELETE FROM oc_bruteforce_attempts WHERE ip = '1.2.3.4';

Читайте также

Эти статьи также могут быть полезны:

1. Установка и настройка локального сервера Collabora и его связка с Nextcloud/Owncloud

2. Настройка интеграции Nextcloud с LDAP

3. Установка и настройка Nextcloud + Apache на Ubuntu

# NGINX # Ubuntu # Серверы
Дмитрий Моск — частный мастер
Была ли полезна вам эта инструкция?

Да            Нет