June 25

Установка и настройка своего облачного хранилища NextCloud на Ubuntu 22.04

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

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

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

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

apt update && apt upgrade -y

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

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

timedatectl set-timezone Asia/Vladivostok

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

проверим изменились ли настройки

timedatectl

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

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

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

apt install mariadb-server

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

systemctl enable mariadb
systemctl start mariadb

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

mysqladmin -u root password

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

mysql -uroot -p
> CREATE USER 'nextcloud'@'localhost' IDENTIFIED BY 'strong_password'; > CREATE DATABASE IF NOT EXISTS nextcloud CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; > GRANT ALL PRIVILEGES ON nextcloud.* TO 'nextcloud'@'localhost'; > \q

незабываем поменять "strong_password" на свой пароль


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

PHP

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

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

export PHP_VER=8.3

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

apt search --names-only '^php[.0-9]{3}#39;

а) Если она соответствует рекомендации 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:

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

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

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

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

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

nano /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

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

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

Сначала подготовим файл следующего содержания для получения сертификата Let's Encrypt

server {
listen 80;
server_name nc.хост.com;
}

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

systemctl stop apache2
systemctl disable apache2

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

nginx -t
systemctl restart nginx

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

systemctl enable nginx

Теперь необходимо получить сертификаты для ssl

Установка Certbot и его плагина Nginx:

sudo apt install certbot python3-certbot-nginx

#Получаем сертификаты для всего если нужно (я получал для всех поддоменов, которые прописал на в т.ч. для почты, заббикса, и т.п., у вас могут быть и должны быть свои)

#Сначала с ключом --dry-run проверяем все ли в порядке

sudo certbot certonly --agree-tos --email почта@администратора -d ваш.домен -d nextcloud.ваш.домен -d cloud.ваш.домен -d zabbix.ваш.домен -d www.ваш.домен -d mail.ваш.домен --nginx --dry-run

Если все хорошо то выполняем без --dry-run

sudo certbot certonly --agree-tos --email почта@администратора -d ваш.домен -d nextcloud.ваш.домен -d cloud.ваш.домен -d zabbix.ваш.домен -d www.ваш.домен -d mail.ваш.домен --nginx

Сертификаты появятся в папке /etc/letsencrypt/live/ваш.домен
cert.pem chain.pem fullchain.pem privkey.pem

Далее необходимо заменить конфигурацию nginx на рабочую

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

Со следующим содержимым

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

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

ssl_certificate /etc/letsencrypt/live/nextcloud.yourdomain.ru/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/nextcloud.yourdomain.ru/privkey.pem;

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.3-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.

Установка 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.вашдомен.ru, где nextcloud.вашдомен.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

P.S. для синхронизации файлов используем родное десктопное приложение доступное на https://nextcloud.com/install/#desktop-files

Тюнинг

Если вы столкнетесь с медленной загрузкой большого числа файлов или больших файлов то нужно поправить параметры в /etc/php/8.3/fpm/php.ini

nano /etc/php/8.3/fpm/php.ini
memory_limit = 4096Mb
post_max_size = 8G
upload_max_filesize= 8G

memory_limit это ограничение использования памяти по этому указываем относительно памяти вашего сервера

И в /var/www/nextcloud/config/config.php:

nano /var/www/nextcloud/config/config.php
'chunkSize' => '2048MB',

После перезапустить службу php-fpm:

systemctl restart php7.4-fpm