Установка и настройка своего облачного хранилища NextCloud на Ubuntu 22.04
Подготовка системы
Выполним предварительную настройку, прежде чем начать развертывание Nextcloud.
Актуализируем списки пакетов в репозиториях и обновим их, чтобы установка проходили без ошибок:
apt update && apt upgrade -y
Выставляем нужный часовой пояс:
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 завершена и можно перейти к ее настройке.
nano /etc/php/${PHP_VER}/fpm/pool.d/www.conf
* путь к данной папке зависит от установленной версии php. В данном примере это 8.3 (задана через переменную PHP_VER).
Снимаем комментарии со следующей строки:
env[PATH] = /usr/local/bin:/usr/bin:/bin
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
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