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

0
431

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

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

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

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

apt-get install chrony

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

timedatectl set-timezone Europe/Moscow

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

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

systemctl enable chrony

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

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

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

apt-get 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 [email protected] IDENTIFIED BY ‘nextcloud’;

> \q

к содержанию ↑

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

PHP

Устанавливаем PHP, PHP-FPM и необходимые для работы nextcloud модули:

apt-get install php php-fpm php-common php-zip php-xml php-intl php-gd php-mysql php-mbstring php-curl php-imagick

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

vi /etc/php/7.4/fpm/pool.d/www.conf

* путь к данной папке зависит от установленной версии php. В данном примере это 7.4.

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

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

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

vi /etc/php/7.4/fpm/php.ini

opcache.enable=1
opcache.enable_cli=1
opcache.interned_strings_buffer=8
opcache.max_accelerated_files=10000
opcache.memory_consumption=128
opcache.save_comments=1
opcache.revalidate_freq=1

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

systemctl enable php7.4-fpm

systemctl restart php7.4-fpm

* php7.4-fpm зависит от версии установленного php.

к содержанию ↑

NGINX

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

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

apt-get install nginx

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

vi /etc/nginx/conf.d/nextcloud.conf

server {
        listen 80;
        server_name nextcloud.dmosk.ru;
        return 301 https://$server_name$request_uri;
}

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

        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{ 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/php7.4-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 — каталог с порталом.

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

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.

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

systemctl stop apache2

systemctl disable apache2

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

nginx -t

systemctl enable nginx

systemctl restart nginx

к содержанию ↑

Установка Nextcloud

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

apt-get install unzip

Заходим на страницу nextcloud и копируем ссылку на скачивание последней версии программы:

Ссылка для скачивания nextcloud

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

cd /tmp

wget https://download.nextcloud.com/server/releases/nextcloud-22.0.0.zip

* на момент обновления инструкции последняя версия была 22.

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

unzip nextcloud-*.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

к содержанию ↑

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

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

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

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

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

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

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

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

к содержанию ↑

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

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

vi /etc/php/7.4/fpm/php.ini

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

memory_limit = 512M

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

systemctl restart php7.4-fpm

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

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

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

Например:

apt-get install php-gmp php-bcmath

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

systemctl restart php7.4-fpm

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

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

  • APCu
  • Redis
  • Memcached

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

Redis

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

apt-get install redis-server php-redis

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

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

systemctl restart php7.4-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-get install memcached php-memcached

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

systemctl enable memcached

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

systemctl restart php7.4-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-get 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

к содержанию ↑

Быстрая настройка

# Устанавливаем зависимости
sudo su
apt-get install php zip libapache2-mod-php php-gd php-json php-mysql php-curl php-mbstring php-intl php-imagick php-xml php-zip php-mysql php-bcmath php-gmp nginx php-fpm smbclient samba php-apcu php-opcache mariadb-server mariadb-client -y

# звдаем пароль для рута
mysql_secure_installation
# Создаем БД и Юзера и даем ему права
mysql -u root -p
CREATE DATABASE nextcloud CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE USER 'nextcloud'@'localhost' IDENTIFIED BY 'VsevolodOblako2121';
GRANT ALL PRIVILEGES ON nextcloud.* TO 'nextcloud'@'localhost';
FLUSH PRIVILEGES;
exit
# качем nextcloud - задав в переменной нужную версию
export NEXTCLOUD_VERSION=19.0.1
# !!!!!!!!!!!!!!!!!!!!!!!!!!!!! Задаем доменное имя
export NEXTCLOUD_DOMAIN_NAME=oblako.boblako.ru
cd /var/www/
wget https://download.nextcloud.com/server/releases/nextcloud-$NEXTCLOUD_VERSION.zip
unzip nextcloud-$NEXTCLOUD_VERSION.zip
sudo chown -R www-data:www-data nextcloud

# увеличиваем лимит памяти для пхп
sudo sed -i '/^memory_limit =/s/=.*/= 512M/' /etc/php/7.4/fpm/php-fpm.conf
# добавляем апстрим
cat < /etc/nginx/conf.d/php-fpm.conf
upstream php-fpm {
server unix:/run/php/php7.4-fpm.sock;
}
EOT

# включаем и добавляем в автозагрузку php-fpm и nginx и mariadb
systemctl disable --now apache2
systemctl enable --now php-fpm nginx mariadb

# Создаем папку для сертификата и ключей
mkdir -p /etc/nginx/ssl
# генерируем деффи хелфмана
openssl dhparam -dsaparam -out /etc/nginx/ssl/dh4096.pem 4096
# кладем ключ и сертификат сюда
#/etc/nginx/ssl/crt.crt
#/etc/nginx/ssl/key.key
# создаем конфигурацию
cat > /etc/nginx/conf.d/$NEXTCLOUD_DOMAIN_NAME.conf <<- EOM
server {
listen 80;
server_name $NEXTCLOUD_DOMAIN_NAME;
location /.well-known/acme-challenge/ {
alias /var/www/challenges/;
try_files \$uri =404;
}
location / {
rewrite ^ https://$NEXTCLOUD_DOMAIN_NAME\$request_uri? permanent;
}
}
server {
listen 443 http2 ssl;
root /var/www/nextcloud;
server_name $NEXTCLOUD_DOMAIN_NAME;
client_body_timeout 1460s;
client_header_timeout 1460s;
send_timeout 1460s;
keepalive_timeout 1300s;
ssl_protocols TLSv1.1 TLSv1.2 TLSv1.3;
ssl_prefer_server_ciphers on;
ssl_ciphers 'ECDHE-RSA-AES256-CBC-SHA:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256';
ssl_dhparam /etc/nginx/ssl/dh4096.pem;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 5m;
ssl_certificate /etc/nginx/ssl/crt.crt;
ssl_certificate_key /etc/nginx/ssl/key.key;

index index.php index.html index.htm;
sendfile on;
tcp_nopush on;
tcp_nodelay on;
proxy_buffering off;
client_max_body_size 5G;
fastcgi_buffers 64 4K;

gzip off;

rewrite ^/caldav(.*)\$ /remote.php/caldav\$1 redirect;
rewrite ^/carddav(.*)\$ /remote.php/carddav\$1 redirect;
rewrite ^/webdav(.*)\$ /remote.php/webdav\$1 redirect;

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 / {
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 ^/.well-known/carddav /remote.php/carddav/ redirect;
rewrite ^/.well-known/caldav /remote.php/caldav/ redirect;
rewrite ^(/core/doc/[^\/]+/)\$ \$1/index.html;
try_files \$uri \$uri/ index.php;
}

location ~ \.php(?:\$|/) {
fastcgi_split_path_info ^(.+\.php)(/.+)\$;
include fastcgi_params;
fastcgi_send_timeout 120m;
fastcgi_read_timeout 120m;
fastcgi_connect_timeout 120m;
fastcgi_param SCRIPT_FILENAME \$document_root\$fastcgi_script_name;
fastcgi_param PATH_INFO \$fastcgi_path_info;
fastcgi_pass php-fpm;
try_files \$fastcgi_script_name =404;
}

location ~ ^/(?:\.htaccess|data|config|db_structure\.xml|README){
deny all;
}

location ~* \.(?:css|js)\$ {
add_header Cache-Control "public, max-age=7200";
add_header Strict-Transport-Security "max-age=15768000; includeSubDomains; preload;";
add_header X-Content-Type-Options nosniff;
add_header X-Frame-Options "SAMEORIGIN";
add_header X-XSS-Protection "1; mode=block";
add_header X-Robots-Tag none;
access_log off;
}

location ~* \.(?:jpg|jpeg|gif|bmp|ico|png|swf)\$ {
access_log off;
}
}

EOM
# решаем проблему c samba
sed -i "/; interfaces = 127.0.0.0\/8 eth0/cclient min protocol = SMB2\n client max protocol = SMB3" /etc/samba/smb.conf
# перезапускам nginx и php-fpm и самбу
systemctl restart nginx php-fpm smbd
# входим через браузер на доменное имя вашего nextcloud и завершаем настройку

Оставьте свой ответ