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

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

Инструкция проверена для Linux Ubuntu версий 20, 22 и 24, а также Debian 12.

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

Выполним предварительную настройку, прежде чем начать развертывание 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.

Ознакомимся с системными требованиями Nextcloud и отметим рекомендуемую версию MariaDB:

MDB_VER=11.4

Устанавливаем СУБД:

apt install mariadb-server=${MDB_VER}*

Если во время установки нужной версии mariadb система вернет ошибку:

Для пакета «mariadb-server» не найден кандидат на установку

… необходимо подключить репозиторий. Для этого прочитайте раздел Подключение актуального репозитория инструкции Установка MariaDB-server на Rocky Linux или Ubuntu.

После установку выполняем командой:

apt install mariadb-server

Подключаемся к 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

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

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

export PHP_VER=8.4

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

apt search —names-only '^php[.0-9]{3}$'

а) Если она соответствует рекомендации Nextcloud, вводим команду для установки PHP, PHP-FPM и необходимых расширений:

apt install php-fpm

apt install php php-common php-zip php-xml php-intl php-gd php-mysql php-mbstring php-curl php-imagick —no-install-recommends

* пакеты лучше установить по отдельности, чтобы автоматически не проинсталлировался apache.

б) Если рекомендованной PHP версии в репозитории нет, переходим к инструкции:

1) Ubuntu: Установка разных версий PHP на Linux Ubuntu.

2) Debian: Установка разных версий PHP на Linux Debian.

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

apt install php${PHP_VER}-fpm

apt install php${PHP_VER} 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 —no-install-recommends

* где PHP_VER — ранее определенная нами переменная с рекомендованной версией PHP.
** пакеты лучше установить по отдельности, чтобы автоматически не проинсталлировался apache.

Установка 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

А также задаем новые значения следующим опциям:

pm.max_children = 30

pm.start_servers = 12

pm.min_spare_servers = 6

pm.max_spare_servers = 18

Настраиваем 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 restart php${PHP_VER}-fpm

NGINX

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

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

apt install nginx

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

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

upstream php-handler {
    server unix:/run/php/php8.4-fpm.sock;
}

map $arg_v $asset_immutable {
    "" "";
    default ", immutable";
}

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

    server_tokens off;

    return 301 https://$server_name$request_uri;
}

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

    root /var/www/nextcloud;

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

    server_tokens off;

    client_max_body_size 512M;
    client_body_timeout 300s;
    fastcgi_buffers 64 4K;

    gzip on;
    gzip_vary on;
    gzip_comp_level 4;
    gzip_min_length 256;
    gzip_proxied expired no-cache no-store private no_last_modified no_etag auth;
    gzip_types application/atom+xml text/javascript application/javascript application/json application/ld+json application/manifest+json application/rss+xml application/vnd.geo+json application/vnd.ms-fontobject application/wasm application/x-font-ttf application/x-web-app-manifest+json application/xhtml+xml application/xml font/opentype image/bmp image/svg+xml image/x-icon text/cache-manifest text/css text/plain text/vcard text/vnd.rim.location.xloc text/vtt text/x-component text/x-cross-domain-policy;

    client_body_buffer_size 512k;

    add_header X-XSS-Protection                   "1; mode=block" always;
    add_header Strict-Transport-Security          "max-age=31536000;  includeSubDomains; preload" always;
    add_header Referrer-Policy                   "no-referrer"       always;
    add_header X-Content-Type-Options            "nosniff"           always;
    add_header X-Frame-Options                   "SAMEORIGIN"        always;
    add_header X-Permitted-Cross-Domain-Policies "none"              always;
    add_header X-Robots-Tag                      "noindex, nofollow" always;

    fastcgi_hide_header X-Powered-By;

    include mime.types;
    types {
        text/javascript mjs;
    application/wasm wasm;
    }

    index index.php index.html /index.php$request_uri;

    location = / {
        if ( $http_user_agent ~ ^DavClnt ) {
            return 302 /remote.php/webdav/$is_args$args;
        }
    }

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

    location ^~ /.well-known {
        location = /.well-known/carddav { return 301 /remote.php/dav/; }
        location = /.well-known/caldav  { return 301 /remote.php/dav/; }

        location /.well-known/acme-challenge    { root /usr/share/nginx/html; }
        location /.well-known/pki-validation    { try_files $uri $uri/ =404; }

        return 301 /index.php$request_uri;
    }

    location ~ ^/(?:build|tests|config|lib|3rdparty|templates|data)(?:$|/)  { return 404; }
    location ~ ^/(?:.|autotest|occ|issue|indie|db_|console)                { return 404; }

    location ~ .php(?:$|/) {
        rewrite ^/(?!index|remote|public|cron|core/ajax/update|status|ocs/v[12]|updater/.+|ocs-provider/.+|.+/richdocumentscode(_arm64)?/proxy) /index.php$request_uri;

        fastcgi_split_path_info ^(.+?.php)(/.*)$;
        set $path_info $fastcgi_path_info;

        try_files $fastcgi_script_name =404;

        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_param PATH_INFO $path_info;
        fastcgi_param HTTPS on;

        fastcgi_param modHeadersAvailable true;
        fastcgi_param front_controller_active true;
        fastcgi_pass php-handler;

        fastcgi_intercept_errors on;
        fastcgi_request_buffering off;

        fastcgi_max_temp_file_size 0;
    }

    location ~ .(?:css|js|mjs|svg|gif|ico|jpg|png|webp|wasm|tflite|map|ogg|flac)$ {
        try_files $uri /index.php$request_uri;
        # HTTP response headers borrowed from Nextcloud `.htaccess`
        add_header Cache-Control                     "public, max-age=15778463$asset_immutable";
        add_header Referrer-Policy                   "no-referrer"       always;
        add_header X-Content-Type-Options            "nosniff"           always;
        add_header X-Frame-Options                   "SAMEORIGIN"        always;
        add_header X-Permitted-Cross-Domain-Policies "none"              always;
        add_header X-Robots-Tag                      "noindex, nofollow" always;
        access_log off;
    }

    location ~ .(otf|woff2?)$ {
        try_files $uri /index.php$request_uri;
        expires 7d;
        access_log off;
    }

    location /remote {
        return 301 /remote.php$request_uri;
    }

    location / {
        try_files $uri $uri/ /index.php$request_uri;
    }
}

* где:

  • 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

Установка 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.

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

Оптимизируем работу базы данных и 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

sudo -u www-data php /var/www/nextcloud/occ maintenance:repair —include-expensive

Выполнение фоновых заданий в cron

После установки Nextcloud фоновые задания выполняются с помощью AJAX при посещении страниц пользователем. Это не позволит выполнять задачи планировщика при отсутствии активности.

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

Кликаем по Основные параметры:

В разделе «Фоновые задания» выбираем Cron:

Идем в консполь,устанавливаем cron:

apt install cron

Cоздаем задание от пользователя www-data:

crontab -e -uwww-data

*/5 * * * * /usr/bin/php /var/www/nextcloud/cron.php

* в нашем примере каждые 5 минут будет запускаться скрипт cron.php из каталога nextcloud.

Для ресурсоемких ежедневных фоновых задач нужно выставить окно обслуживания. Это делается командами:

sudo -u www-data php /var/www/nextcloud/occ config:app:set core backgroundjobs_mode —value="cron"

sudo -u www-data php /var/www/nextcloud/occ config:system:set maintenance_window_start —type=integer —value=2

* в данном примере разрешено выполнить обслуживание, начиная с 02:00.

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

Для корректной работы системы выполним дополнительную настройку. После входа в 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',
  'memcache.locking' => '\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: Размер файла превышает установленное ограничение, сохранение файла невозможно.»:

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

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

reg add "HKLMSYSTEMCurrentControlSetServicesWebClientParameters" /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.

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

Данная возможность позволяет блокировать подключения от 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,

Готово.

2. Опция skeletondirectory

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

Skeletondirectory удобен для корпоративных развертываний, где нужно единообразие структуры данных. Файлы из этой папки копируются при первом входе пользователя. Опция экономит время на ручное создание общих папок и помогает поддерживать порядок в файловом хранилище.

Однако, если нам не нужна данная возможность, лучше в конфигурации задать опцию:

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

  'skeletondirectory' => '',

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

3. Автоматическая чистка корзины

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

Пример настройки:

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

  'trashbin_retention_obligation' => '90,auto',

* в данном примере Nextcloud не сможет удалить файлы из корзины, пока не пройдет 90 дней с момент их удаления.

Все варианты настроек автоочистки корзины подробно описаны на официальном сайте.

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

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

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

Причина: в 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

4. Установка и настройка OnlyOffice Server на Ubuntu, а также интеграция его с ownCloud или Nextcloud.

Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *