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

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

 
 
Логотип GITA-DEV

Автор: Черноусов Антон aka Gita-Dev
Опубликовано: 09 Мар 2018 (последние правки 3 месяца)

active directory admin apt-get aptitude cloud crm cv database dev fpm install live mysql next cloud nextcloud nginx php release smtp ssl tar ubuntu прокси

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

Nextcloud - пакет клиент-серверного программного обеспечения для создания облачного хранилища.

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

Подготовка 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. Комментарии и уточнения принимаются только при использовании аналогичного окружения.

Начнем с установки 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, отдельно от каталога /var/www/html/:

# 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://<ip-адрес-сервера>/.

Web-интерфейс управления NextCloud

Данный адрес прописан в разделе 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(
   array('localhost', 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;

    #include /etc/nginx/block_list.dat;
    add_header Strict-Transport-Security "max-age=63072000;";
    client_max_body_size 10G;

    location / {

      proxy_pass http://10.253.3.201:80;
      proxy_read_timeout    6h;
      proxy_connect_timeout 600s;

      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-сервера) перейдите в раздел "Администрирование" -> "Дополнительные настройки" и выберите в способах отправки режим SMTP.

Использование яндекс-почты в NextCloud

Естественно, что вам потребуется указать логин/пароль учетной записи и адрес почтового сервера, а в остальном настройка отправки почты особо не отличается от настройки в популярных CMS-системах.

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

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

Сборка клиента облачного хранилища NextCloud из исходных кодов

Для облачного хранилища Next Cloud (форк проекта OwnCloud), на данный момент, не предоставляется собранный клиент для платформы Linux в виде ночных-билдов для тестирования, но его можно собрать из исходных кодов. Сборка не представляет особой сложности и единственный вопрос который может возникнуть- это разрешить ряд зависимостей необходимых для сборки. В дальнейшем мы планируем настроить сборку пакета для Ubuntu Linux, но сейчас нет времени этим заниматься, тем более, что в клиенте предусмотрена интеграция с KDE (предыдущей версии) и сейчас эта интеграция сломана причем похоже и в OwnCloud тоже.


Nextcloud-сервер на базе одноплатного ПК BananaPi

Nextcloud-сервер на базе одноплатного ПК BananaPi

Представляю вашему вниманию продолжение статьи - Установка облачного хранилища NextCloud в окружение Nginx+PHP-FPM и сегодня я настрою облачное хранилище на домашнем микро-пк на базе ARM-системы Banana PI. Фактически это доработка статьи про настройке Banana PI для платформы x86 под архитектуру ARM.


Настройка авторизации в Next Cloud с учетными данными Active Directory

Настройка авторизации в Next Cloud с учетными данными Active Directory

Если вы делаете небольшое облако на команду в 5-7 чел, то конечно никаких интеграций с Active Direcory можно и не городить, но когда речь заходит о крупной инсталляции человек так на 100-200, то как вы понимаете заводить их отдельно особого смысла не имеет, а пользователю придется помнить пароль к еще одной информационной системе вместо одного пароля ко всем сервисам. Сегодня будем рассматривать как раз второй вариант.


Отзывы и комментарии




Аватар пользователя
Анонимно

Странно что раньше не находил вашу статью. Честно говоря, есть не понятные моменты...делал параллельно два сервера, на АРМ все цветет и пахнет, на х64 упёрся в ряд ошибок связанных с опкэш и с мэмкэш тоже вопрос...Но в любом случаи даже используя части ваших статей, очень благодарен. Спасибо


Аватар пользователя
Антон Черноусов (Администратор)

Рад, что вам понравилось

Аватар пользователя
Анонимно

Пошагово выполняя инструкции натолкнулся на ошибку:
https://help.nextcloud.com/t/code-integrity-check-failed-htaccess-user-ini-file-s/1896
Спасибо за публикацию !


Аватар пользователя
Антон Черноусов (Администратор)

На каком этапе у вас эта ошибка?