Установка облачного хранилища NextCloud в окружение Nginx+PHP-FPM

Представляем вашему вниманию подробную инструкцию по настройке NextCloud (с установкой плагинов и ssl-сертификатов для реализации защищенного https-протокола)

HELP-ME-24.COM (Freelance Team), Черноусов Антон
Логотип облачного хранилища NextCloud

Персональное облачное хранилище NextCloud

Nextcloud - пакет клиент-серверного программного обеспечения для создания облачного хранилища. Функционально программное обеспечение аналогично DropBox, Яндекс.Диск и GoogleDrive, но при этом является отрытым ПО и может быть установлено на вашем сервере и интегрироваться с сервисами компании, такими как Active Directory.

Функционал облачного хранилища может быть расширен при помощи плагинов и при некотором желании из облачного хранилища можно построить небольшую CRM.

Nextcloud, является форком ownCloud и на данный момент развивается гораздо активнее исходного проекта.

Мы оказываем полную техническую поддержку решений на базе NextCloud и конечно же можем внедрить NextCloud на вашей площадке.

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

Подготовка LEMP-окружения для установки NextCloud

Использование PHP-FPM и Nginx по сравнению со связкой Apahe и ModPHP на тестах дало повышение производительности облачного хранилища на 25%. Установка Next Cloud с использованием Web-сервера Apache и типового модуля mod_php уже рассматривалась нами в статье "NextCloud 11 - Установка и настройка (Часть первая, подготовка сервера и установка приложения)", а базовая подготовка разного рода базовых окружений PHP-FPM рассматривалась в статье "Типовые примеры настройки PHP-FPM + Nginx в Ubuntu Linux" и хотя на первый взгляд установить NextCloud в окружение PHP-FPM+Nginx особых трудностей не представляет мы обнаружили несколько специфичных подводных камней.

Стоит отметить, что примеров подобных решений в интернете довольно мало и все они требуют основательной доработки. Мы в свою очередь подготовили наиболее подробную пошаговую инструкцию и будем рады любым комментариям и дополнениям.

Обратите внимание, что установка проводится в окружение LTS-версии Ubuntu server 16.04.3, а комментарии и уточнения принимаются только при использовании аналогичного окружения.

Установка пакетов необходимых для создания LEMP-окружения в Ubuntu server

Начнем с установки Mysql-сервера:

# aptitude install mysql-server mysql-client

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

# mysql_secure_installation

Следующим этапом создайте пользователя и базу данных с которой будет работать облачное хранилище. Типовые Mysq-команды для создания пользователя и назначения прав доступа к базе мы уже рассматривали в статье "Типовые операции при работе с СУБД Mysql (MariaDB)".

# mysql -p
mysql> CREATE DATABASE `nextcloud_storage`;
mysql> CREATE USER 'cloud'@'localhost' IDENTIFIED BY 'SeretMysqlPassword';
mysql> GRANT ALL PRIVILEGES ON nextcloud_storage.* TO 'cloud'@'localhost';
mysql> FLUSH PRIVILEGES;
mysql> quit

Переходим к настройке окружения PHP-FPM + Nginx и как обычно устанавливаем необходимые пакеты:

# apt-get install php-gd php-json php-mysql php-curl php-mbstring 
# apt-get install php-intl php-mcrypt php-imagick php-xml php-zip
# aptitude install php-fpm nginx

В случае установки на Ubuntu Server, после установки пакетов будет автоматически настроена минимальная среда настроенная на выполнение PHP-скриптов и отдачу статических страниц из каталога /var/www/html/. Технически, мы можем оставить такое поведение "по умолчанию" и настроить виртуальный-хост который будет обслуживать выполнение web-приложения NextCloud и для этого, прежде всего создаем каталог для хранения php-файлов NextCloud:

# mkdir -p /var/www/vhosts/next-cloud/

И файл конфигурации /etc/nginx/sites-available/next-cloud.conf который будет выполнять обработку скриптов в этом каталоге:

upstream php-handler {
server unix:/var/run/php/php7.0-fpm.sock;
}

server {
listen 80;
server_name 10.253.0.78 cloud.help-me-24.com;
root /var/www/vhosts/next-cloud/;

access_log /var/log/nginx/cloud.help-me-24.com.log;
error_log /var/log/nginx/cloud.help-me-24.com-error.log;

add_header X-Content-Type-Options nosniff;
add_header X-XSS-Protection "1; mode=block";
add_header X-Robots-Tag none;
add_header X-Download-Options noopen;
add_header X-Permitted-Cross-Domain-Policies none;

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

rewrite ^/.well-known/host-meta /public.php?service=host-meta last;
rewrite ^/.well-known/host-meta.json /public.php?service=host-meta-json;

location = /.well-known/carddav {
return 301 $scheme://$host/remote.php/dav;
}
location = /.well-known/caldav {
return 301 $scheme://$host/remote.php/dav;
}

client_max_body_size 512M;
fastcgi_buffers 64 4K;

gzip off;

location / {
rewrite ^ /index.php$uri;
}

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

location ~ ^/(?:index|remote|public|cron|core/ajax/update|status|ocs/v[12]|updater/.+|ocs-provider/.+|core/templates/40[34])\.php(?:$|/) {
fastcgi_split_path_info ^(.+\.php)(/.*)$;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param PATH_INFO $fastcgi_path_info;
fastcgi_param modHeadersAvailable true;
fastcgi_param front_controller_active true;
fastcgi_param PHP_VALUE "
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";
fastcgi_pass php-handler;
fastcgi_intercept_errors on;
}

location ~ ^/(?:updater|ocs-provider)(?:$|/) {
try_files $uri/ =404;
index index.php;
}

location ~* \.(?:css|js|woff|svg|gif)$ {
try_files $uri /index.php$uri$is_args$args;
access_log off;
}

location ~* \.(?:png|html|ttf|ico|jpg|jpeg)$ {
try_files $uri /index.php$uri$is_args$args;
access_log off;
}

}

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

Для активации созданного конфигурационного файла необходимо создать символическую ссылку из каталога sites-available в каталог sites-enabled и перезапустить web-сервер Nginx:

# ln -s /etc/nginx/sites-available/next-cloud.conf /etc/nginx/sites-enabled/next-cloud.conf
# /etc/init.d/nginx restart

Установка и настройка web-приложения NextCloud

Скачайте архив содержащий стабильную версию сервера NextCloud с официального сайта https://nextcloud.com/install/#instructions-server и распакуйте в каталог созданный в предыдущем разделе:
# wget https://download.nextcloud.com/server/releases/nextcloud-12.0.3.zip
# unzip ./nextcloud-12.0.3.zip
# cp -R ./nextcloud/* /var/www/vhosts/next-cloud/
# chown -R www-data:www-data /var/www/vhosts/next-cloud/
Дальнейшая настройка производится с использованием web-интерфейса и вам необходимо перйти в браузере по адресу http://10.253.0.78/.
Данный адрес прописан в разделе server_name конфигурационного файла nginx и вам надо будет заменить его на ip-адрес вашего сервера на котором вы производите настройку.
Использование мастера для настройки подключения к базе данных NextCloudНастройка сложности не представляет и вам необходимо лишь указать параметры подключения базы данных которые мы создали в начале статьи и задать имя/пароль пользователя который дудет выполнять функции первого администратора системы.  После непродолжительной установки автоматически откроется интерфейс авторизации в системе.Окно авторизации NextCloudИспользуя созданный логин/пароль администратора авторизуйтесь в системе и перейдите в интерфейс администрирования системы.Остновы администрирования NextCloudПервое, что вы увидите перейдя в интерфейс администратора, это предупреждения системы безопасности о отсутствующей системе кэширования, отсутствии поддержки HTTPS и планировщик настроенный на использование AJAX и прочие мелочи которые сильно раздражают.
Настройка планировщика CRON

Так как я в некотором роде перфекционист, то я не могу смотреть на эти предупреждения и сейчас мы будем их исправлять, а начнем мы с планировщика CRON который необходимо переключить в режим Cron и добавить в файл /etc/crontab запись:
*/15    * * * * www-data php /var/www/vhosts/next-cloud/cron.php
Если все настроено корректно, то в графе "Фоновые задания" последнее выполнение не должно превышать 15 минут.

Устранение ошибки: PHP был установлен неверно. Запрос getenv("PATH") возвращает пустые результаты.

Эта ошибка устраняется довольно просто и вам потребуется только в файле /etc/php/7.0/fpm/pool.d/www.conf раскомментировать строку:
env[PATH] = /usr/local/bin:/usr/bin:/bin
Так же вам необходимо перезапустить демона php-fpm командой:
# /etc/init.d/php7.0-fpm restart
Устранение ошибки: Не настроена система кеширования. Для увеличения производительности сервера, по возможности, настройте memcache.

На выбор предлагается два вида кэширования, на базе memcached и на базе Redis, причем решение с использованием Redis позволяет избавиться от эффекта "File Locking" который очень активно проявляется в крупных многопользовательских установках с организованными общими каталогами отделов.

Устанавливаем memcached-сервер и PHP-модуль для подключения к memcached:

# aptitude install memcached 
# aptitude install php-memcached
# aptitude install php-apcu

Активируем PHP-модуль apcu:

# phpenmod apcu
# phpenmod memcached

Проверяем, что memcached работает и принимает подключения:

# ps ax | grep memcached
# telnet 127.0.0.1 11211

Добавляем параметры в конфигурацию config/config.php:

'memcache.local' => '\OC\Memcache\APCu',
'memcache.distributed' => '\OC\Memcache\Memcached',
'memcached_servers' => array(
array('localhost', 11211),
),

Таким образом мы настроили работу с системой кэширования memcached, но нам требуется система кеширования на базе redis и настраивается она не намного сложнее и позволяет решить проблему с Lock-файлами.

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

# aptitude install redis-server php-redis
# phpenmod redis

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

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

Таким образом мы заменили Memcache на Redis, но обратите внимание, что в распределенных кластерах NextCloud бы можете использовать одновременно Redis и memcached и для работы в таком режиме изменения в конфигурации будут выглядеть следующим образом:

  'memcache.local' => '\\OC\\Memcache\\Redis',
'redis' =>
array (
'host' => 'localhost',
'port' => 6379,
),
'memcache.distributed' => '\\OC\\Memcache\\Memcached',
'memcached_servers' =>
array (
0 =>
array (
0 => 'localhost',
1 => 11211,
),
),
Как вы видите в такой конфигурации качестве локального кэша теперь используется Redis, а для распределенной системы облачных хранилищ используется Memcached. 
Обратите внимание, что существует некоторая вероятность того, что после подключения модулей кеширования ваш сайт не откроется, а в логах Nginx будет пусто, на самом деле NextCloud переопределеяет лог для хранения ошибок в каталог /next-cloud/data/nextcloud.log и причину ошибки надо искать там.
Например, при ряде внедрений при установленном и включенном модуле Redis мы получали ошибку:
Memcache \\OC\\Memcache\\Redis not available for local cache
Эта проблема решается сборкой модуля при помощи pecl:
# aptitude purge php-redis
# aptitude install php-pear php-dev
# pecl install redis
# echo 'extension=redis.so' > /etc/php/7.0/mods-available/redis.ini
# phpenmod redis
# /etc/init.d/php7.0-fpm restart
Конечно с механихмами кэширования есть еще несколько особенностей, но этой теме тогда модно уделить отдельную статью.

И в завершение последняя ошибка: Вы зашли на этот сайт через HTTP. Мы настоятельно рекомендуем настроить ваш сервер на использование HTTPS

По этому поводу в первой публикации по NextCloud в комментариях был небольшой холивар на тему почему я не рассказал про настройку сервера для работы в режиме HTTPS. Просто у меня NextCloud иполняется в отдельном LXC-контейнере для безопасности, а за проксирование запросов из интернет к контейнеру и шифрование трафика отвечает отдельный Nginx и его конфигурация максимально простая:
server {
listen 80;
server_name cloud.help-me-24.com;
return 301 https://cloud.help-me-24.com$request_uri;
}

server {
listen 443 ssl;
ssl_certificate /etc/letsencrypt/live/cloud.help-me-24.com/fullchain.pem; # managed by Certbot
ssl_certificate_key /etc/letsencrypt/live/cloud.help-me-24.com/privkey.pem; # managed by Certbot
include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot

server_name cloud.help-me-24.com;

access_log /var/log/nginx/cloud.help-me-24.com.log;
error_log /var/log/nginx/cloud.help-me-24.com-error.log;

    add_header Strict-Transport-Security "max-age=63072000; includeSubdomains;";

include /etc/nginx/block_list.dat;

client_max_body_size 10G;

location / {

proxy_pass http://10.253.0.78:80;
proxy_read_timeout 6h;
proxy_connect_timeout 50s;

proxy_set_header X-Real-IP $remote_addr;

proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Forwarded-Server $host;

proxy_set_header X-Forwarded-for $proxy_add_x_forwarded_for;
proxy_set_header Host $host:$server_port;
proxy_set_header X-Forwarded-Proto $scheme;

}

}
Как вы видите, Nginx на фронт-сервере принимает подключения на портах 80 и 443, после чего перенаправляет все не шифрованные подключения на порт 443 (HTTPS), а все подключения на HTTPS-порт он защищает сертификатом от Let's encrypt и направляет на Lxc-контейнер в котором мы собственно и производим настройку.
При первом обращении по доменному имени вам будет предложено добавить домен в доверенные:Добавление доверенного домена в NextCloud

 

Основные нюансы предварительного конфигурирования

Наш NextCloud-сервер практически настроен и готов к работе, но есть еще несколько нюансов на которые необходимо обратить внимание. Настроив эти казалось бы "мелочи", вы в дальнейшем сохраните свое время и нервы.

Настройка персонального оформления

Измените название вашего хранилища и фоновое изображение на странице авторизации придав ему "корпоративный стиль", для этого перейдите в раздел "Администрирование" ->  "Темы оформления".Изменение темы оформления NextCloud

Данные настройки прежде всего изменяют вид окна авторизации в системе и например в нашем случае у нас получилось "унифицированное оформление" с центральным сайтом.Модифицированная тема в NextCloud

Настройка подключения к почтовому серверу

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

Я не рекомендую устанавливать облачное хранилище напрямую на почтовый сервер и в наших внедрениях мы всегда используем отдельную учетную запись электронной почты для облачного хранилища и спользование протокола SMTP с авторизацией и шифрованием при работе с этой учетной запись.

Для настройки такого режима работы перейдите в раздел "Администрирование" -> "Дополнительные настройки" и выберите в способах отправки режим SMTP. Естественно, что вам потребуется указать логин/пароль учетной записи и адрес почтового сервера.NextCloud - настройка сервера исходящей почты

Настройка максимального размера выгружаемого файла

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

Для увеличения максимального размера выгружаемого файла измените следующие параметры в конфигурации Nginx и PHP-FPM:

        fastcgi_param PHP_VALUE "
upload_max_filesize = 16G
post_max_size = 16G
max_input_time 3600
max_execution_time 3600
               ....

Ограничения для новых пользователей облачного хранилища

По умолчанию, для новых пользователей не задана квота по используемому месту, что может вызвать быстрый расход доступного дискового пространства. Обязательно перейдите в раздел "Администрирование" -> "Пользователи" и нажмите значок шестерни в левом нижнем углу подписанный "Настройки".  В открывшемся списке вы сможете установить квоту по умолчанию для нового пользователя.Создание пользователя NextCloud

Рекомендуемые плагины

В отличие от Google-диск, Yandex.Диск у облачного хранилища NextCloud в запасе имеется огромное количество плагинов. Плагины облачного хранилища NextCloud доступны в разделе "Настройка" -> "Приложения".Рекомендуемы плагины NextCloud

Выбор плагинов просто огромный, а дополнительные плагины не входящие в официальную поставку можно установить из дополнительного "магазина приложений". В своих предыдущих статьях я уже подробно рассматривал один из плагинов авторизации отвечающий за интеграцию с Active Directory и более подробно о интеграции NextCloud с AD вы можете прочитать в статье "NextCloud 11 - Интеграция облачного хранилища с ActiveDirectory", а сегодня в завершении этой статьи я продемострирую набор плагинов которыми я активно пользуюсь.

Начнем, мы с плагина из раздела "Отключенные приложения" (это означает, что плагин установлен по умолчанию но отключен) под названием "External user support". Это приложение позволяет использовать для авторизации пользователей почтовый сервер или Samba, проще говоря аутентификация пользователей проводится средствами этих сервисов дополнительно к внутренней авторизации.

External user support

Приложение не предполагает административного интерфейса и поле его активации необходимо внести правки в конфигурационный файл NextCloud, что потребует FTP или SSH доступ к файлам облачного хранилища. Так же обратите внимание, что для использования Samba или IMAP серверов для авторизации пользователей потребует установить и активировать дополнительные PHP-модули:

# aptitude install php-smb php-smbclient
# phpenmod smbclient
# aptitude install php-imap php-net-imap
# phpenmod imap
# /etc/init.d/php7.0-fpm restart

В конфигурацию добавьте массив источников данных авторизации и например для IMAP-сервера запись выглядит следующим образом:

  'user_backends' => 
array (
0 =>
array (
'class' => 'OC_User_IMAP',
'arguments' =>
array (
0 => '{127.0.0.1:993/imap/ssl/novalidate-cert}',
),
    ),

Обратите внимание на используемую опцию ssl/novalidate-cert, она отключает проверку валидности сертификатов при доступе к почтовому серверу в рамках интранета по ip-адресу. В случае если взаимодействие с локальным почтовым сервером проиходит без использования SSL-сертификатов (например при VPN-тунелировании SSL-шифрование трафика выглядит излишним) используйте параметры подключения без блока /ssl/novalidate-cert.

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

Интеграция Next Cloud с почтовым сервером 

Плагин "Contacts"

Описание плагина можно найти по адресу: https://apps.nextcloud.com/apps/contacts. После включения приложения доступ к контактам возможен сразу в панели быстрого доступа рядом с файлами. Плагин контакты для NextCloud

Помимо управления контактами, позволяет реализовать удаленный доступ к личным контактам по протоколу CardDAV. Настроив взаимодействие по протоколу CardDAV вы можете легко синхронизировать контакты NextCloud с мобильным телефоном под управлением любой популярной ОС.

Для получения доступа к url контактов нажмите на значок шестеренки в модуле контакты. Интеграция модуля контакты с Android

Например, мой контакт лист имеет URL: https://cloud.help-me-24.com/remote.php/dav/addressbooks/users/chernousov@help-me-24.com/contacts/, но доступ к нему естественно ограничен по логин-пароль.

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

Android-приложение доступно в PlayMarket бесплатно: https://play.google.com/store/apps/details?id=org.dmfs.carddav.sync&hl=ru&rdid=org.dmfs.carddav.sync

Плагин "Calendar"

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


Хотя с синхронизацией CalDav для андройд не все так однозначно. Есть платное приложение CalDav-Sync за 89 рублей и приратка на 4pda, причем приратка похоже с вирусами. Вобщем не рискуйте и просто купите за 89 рублей, не такие большие деньги.

Путь для синхронизации будет всегда один https://cloud.help-me-24.com/remote.php/dav/ и отличаться только по логин/пароль. Естественно, что вы можете строить общие календари и создавать разного рода общие календари для отделов.

Плагин для организации общего хранилища паролей "Passman"

Подробное описание плагина можно найти по адресу: https://apps.nextcloud.com/apps/passman.

Очень удобное приложение напоминающее KeepassX но с web-интерфейсом. Для обеспечения повышенной безопасности дополнительно шифрует хранилище, но мне видится несколько методов как можно сломать этот уровень защиты если сервер вам не пренадлежит, поэтому используйте это приложение только если сервер вам полностью подконтролен.

И в конце заметки, хотел бы обратить ваше внимание на удобное приложение для платформы Android которое позволяет удобно работать с файлами из облака на мобильном устройстве. Ссылка на страницу в маркете: https://play.google.com/store/apps/details?id=com.nextcloud.client&rdid=com.nextcloud.client


 

Оставьте комментарий

Вы должны быть вошедший в чтобы отправить комментарий