Это старая версия документа!


Внимание!
Статья не закончена!

Дата написания: июнь 2018 г.
Автор: Graf

Сервер облачного хранилища на базе Nextcloud


Установка

Локальный IP-адрес сервера куда всё устанавливаем и где настраиваем - 192.168.10.217
Внешний IP-адрес - 77.77.77.77 (Вымышленный. Придуманный, только лишь, в качестве примера.)
Доменное имя - my-cloud.ru (Вымышленное. Придуманное, только лишь, в качестве примера.)
Nextcloud версии 13.0.2

Согласно системным требованиям рекомендуется:

  1. 512 MB ОЗУ
  2. Red Hat Enterprise Linux 7 или Ubuntu 16.04 LTS
  3. MySQL/MariaDB
  4. Apache 2.4 с mod_php
  5. PHP 7+

По поводу п.1 - на виртуалке с 8 GB ОЗУ и CPU c 2 ядрами, одновременно 8 активных пользователей, с различных устройств, утверждали, что никаких тормозов не заметили, адекватно оценивая свою скорость выхода в Интернет. Правда, приличия ради, надо сказать, что тормоза всё же были выявлены при копировании(перемещении, удалении и т.д.) большого количества файлов мелких размеров, если облако подключено как сетевой ресурс (об этом ниже по статье). Но, думаю, это проблема не сервера, а реализации WebDAV в конкретной ОС.

По поводу п.2 - У нас система будет круче! :) А именно - Slackware Linux 14.2 64-bit без DE и всем, что с ними связанно. После обновления всех доступных пакетов, посредством slackpkg, с ядром 4.4.132.

п.3 и п.4 - в системе уже установлены, просто настроим их.

По поводу п.5 - В Slackware Linux 14.2 установлен PHP версии 5.6, с которой текущая версия Nextcloud, будет работать. Но при запуске выдаст предупреждение о том, что текущая версия Nextcloud является последней, которая поддерживает PHP 5.6 и рекомендует обновить версию PHP до версии 7.0+, для возможности перехода на Nextcloud 14.
Поэтому, первым делом, обновим версию PHP до 7+.

PHP 7

Последнюю версию PHP можно посмотреть на http://php.net/downloads.php и скачать её с ближайшего зеркала.
Для автоматизации сборки пакета, я написал скрипт который скачает всё необходимое и запустить сборку пакета в каталоге со скриптом.
Назовём скрипт ./build.php7

#!/bin/bash
 
# Версия alpine
AV="2.21"
 
# Версия php
PHPV="7.2.6"
 
# Скачиваем php.SlackBuild и причитающееся
wget -r -nd -np -R index*,php-5* \
-e robots=off https://mirror.slackbuilds.org/slackware/slackware64-14.2/source/n/php/
 
# Скачиваем последнюю версию php
wget -O php-$PHPV.tar.xz http://pl1.php.net/get/php-$PHPV.tar.xz/from/this/mirror
 
# Для сборки php нужен пакет alpine
# Скачиваем alpine.Slackbuild и причитающееся
wget -r -nd -np -R index*,alpine-2* \
-e robots=off https://mirror.slackbuilds.org/slackware/slackware64-14.2/source/n/alpine/ -P ./alpine
 
# Скачиваем последнюю версию alpine
wget http://alpine.x10host.com/alpine/release/src/alpine-$AV.tar.xz -P ./alpine
 
# В php.Slackbuild меняем версию alpine c 2.20 на последнюю и правим путь к исходникам.
sed -i \
-e "s/ALPINE=2.20/ALPINE=$AV/" \
-e 's:CWD/../alpine:CWD/alpine:' ./php.SlackBuild
 
# В alpine.Slackbuild меняем версию  c 2.20 на последнюю
sed -i "s/VERSION:-2.20/VERSION:-$AV/" ./alpine/alpine.SlackBuild
 
# Распаковываем diff по man-страницам
gzip -d ./alpine/alpine.manpage.diff.gz
 
# В новых версия путь к man-страницам поменялся, исправляем.
sed -i 's:doc/alpine.1:doc/man1/alpine.1:' ./alpine/alpine.manpage.diff
 
# Запаковываем обратно
gzip ./alpine/alpine.manpage.diff
 
# Вытаскиваем из архива файлы php.ini-development и php-fpm.conf.in в текущий.
tar -xpvf ./php-$PHPV.tar.xz php-$PHPV/php.ini-development php-$PHPV/sapi/fpm/php-fpm.conf.in
 
# Переходим в каталог php-версия.
cd ./php-$PHPV
 
#############  работаем с php.ini-development ############
 
# Предварительно скопировав файл ./php.ini-developmentс расширением orig,
# убираем знак комментария с параметра session.save_path с указанием пути, 
sed -i'.orig' \
's:;session.save_path = \"/tmp\":session.save_path = \"/var/lib/php\":' \
./php.ini-development
 
# Добавляем необходимые extension в файл ./php.ini-development начиная с 908 строки.
sed -i '908a\extension=pspell \
extension=bcmath \
extension=bz2 \
extension=calendar \
extension=ctype \
extension=curl \
extension=dba \
extension=dom \
extension=enchant \
extension=exif \
extension=ftp \
extension=gd \
extension=gettext \
extension=gmp \
extension=iconv \
extension=intl \
extension=ldap \
extension=mbstring \
extension=mysqli \
extension=odbc \
extension=openssl \
zend_extension=opcache \
extension=pdo \
extension=pdo_mysql \
extension=pdo_sqlite \
extension=pdo_odbc \
extension=shmop \
extension=snmp \
extension=soap \
extension=sqlite3 \
extension=tokenizer \
extension=wddx \
extension=xmlreader \
extension=xsl \
extension=zip \
extension=zlib' ./php.ini-development
 
# Разницу между двумя файлами ./php.ini-development и ./php.ini-development.orig
# записываем в ./php.ini-development.diff
diff -u ./php.ini-development{.orig,} > ./php.ini-development.diff
 
# сжимаем ./php.ini-development.diff в ./php.ini-development.diff.gz
gzip ./php.ini-development.diff
 
#
#
############ закончили с php.ini-development ################
 
########## работаем с php-fpm.conf.in ###################
#
#
# Правим файл php-fpm.conf.in 
sed -i'.orig' \
-e s'/;pid =/pid =/' \
-e s'/;error_log =/error_log =/' \
-e s'/include=@/;include=@/' \
-e '$a;include=etc/php-fpm.d/*.conf' ./sapi/fpm/php-fpm.conf.in
 
# Разницу между двумя файлами php-fpm.conf.in и php-fpm.conf.in.orig
# записываем в php-fpm.conf.diff
diff -u ./sapi/fpm/php-fpm.conf.in{.orig,} > ./sapi/fpm/php-fpm.conf.diff
 
# сжимаем php-fpm.conf.diff
gzip ./sapi/fpm/php-fpm.conf.diff
 
#
#
############ закончили с php-fpm.conf.in ################
 
# Переходим в каталог с php.SlackBuild
cd ..
 
############ Подменяем diff'ы #####################
#
#
# Переименовываем старый ./php.ini-development.diff.gz в ./php56.ini-development.diff.gz
mv ./php.ini-development.diff.gz ./php56.ini-development.diff.gz
 
# Переименовываем старый ./php-fpm.conf.diff.gz в ./php56-fpm.conf.diff.gz
mv ./php-fpm.conf.diff.gz ./php56-fpm.conf.diff.gz
 
# Копируем недавно созданный php.ini-development.diff.gz в каталог с php.SlackBuild
cp ./php-$PHPV/php.ini-development.diff.gz ./
 
# Копируем недавно созданный php-fpm.conf.diff.gz в каталог с php.SlackBuild
cp ./php-$PHPV/sapi/fpm/php-fpm.conf.diff.gz ./
 
# Удаляем более не нужный каталог ./php-версия
rm -rf ./php-$PHPV
 
#
#
############ закончили подмену diff'ов ##############
 
# Меняем версии php в файле ./mod_php.conf.example предварительно переименовав с расширением orig
sed -i'.orig' s'/php5/php7/g' ./mod_php.conf.example
 
# Меняем версии php в файле ./fetch-php.sh
sed -i'.orig' "s/php-5.6.23/php-$PHPV/" ./fetch-php.sh
 
# Присваиваем бит запуска alpine.SlackBuild и php.SlackBuild
chmod +x ./alpine/alpine.SlackBuild.
chmod +x ./php.SlackBuild.
 
# запускаем сборку пакета
./php.SlackBuild

Добавим скрипту бит запуска и запустим его с выводом сообщений в файл ./build.php7.log для дальнейшего просмотра и выявления ошибок. В принципе, существенных ошибок я не нашёл, поэтому можно запустить и без использования tee. После завершения скрипта, установим получившийся пакет. Поменяем на актуальный phph.ini и mod_php.conf. И проверим версию.

# chmod +x ./build.php7
# ./build.php7 | tee -a ./build.php7.log
...
Slackware package /tmp/php-7.2.6-x86_64-1.txz created.

# upgradepkg /tmp/php-7.2.6-x86_64-1.txz 
...
Package php-5.6.23-x86_64-1 upgraded with new package /tmp/php-7.2.6-x86_64-1.txz.

# mv /etc/php.ini /etc/php56.ini
# mv /etc/php.ini.new /etc/php.ini
# mv /etc/httpd/mod_php.conf /etc/httpd/mod_php56.conf
# mv /etc/httpd/mod_php.conf.example /etc/httpd/mod_php.conf
# php -v
PHP 7.2.6 (cli) (built: Jun  8 2018 16:16:08) ( ZTS )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.2.0, Copyright (c) 1998-2018 Zend Technologies
    with Zend OPcache v7.2.6, Copyright (c) 1999-2018, by Zend Technologies

Всё, PHP 7 установлен. Теперь установим сам Nextcloud и, для устранения ошибок кэширования, redis.

Nextcloud и Redis

Устанавливаем sbopkg, синхронизируемся с его репозиторием попутно соглашаясь с созданием отсутствующих каталогов.

# wget https://github.com/sbopkg/sbopkg/releases/download/0.38.1/sbopkg-0.38.1-noarch-1_wsr.tgz
# upgradepkg --install-new ./sbopkg-0.38.1-noarch-1_wsr.tgz
# sbopkg -r

Устанавливаем Nextcloud и Redis.

# sbopkg -Bi "redis nextcloud-server"
# pecl install redis  (на последующие вопросы - "no")
# echo "extension=redis.so" > /etc/php.d/redis.ini
# chmod +x /etc/rc.d/rc.redis
# /etc/rc.d/rc.redis start
# ps aux | grep redis
root      6843  0.0  0.1  43116  8448 ?        Ssl  19:24   0:00 /usr/bin/redis-server 127.0.0.1:6379

Apache и MySQL

Внесём кое-какие правки в /etc/httpd/httpd.conf, а именно:

  • удалим знак комментария с модулей cgi, cgid, rewrite
  • удалим знак комментария со строки подключения mod_php.conf
  • В DirectoryIndex добавим index.php

и запустим апач.

# sed -i'.orig' \
-e '/mod_php/s/#/ /' \
-e '/mod_cgi.so/s/#/ /' \
-e '/mod_cgid.so/s/#/ /' \
-e '/mod_rewrite/s/#/ /' \
-e '/DirectoryIndex index.html/ s/$/ index.php/' \
/etc/httpd/httpd.conf

# chmod +x /etc/rc.d/rc.httpd
# /etc/rc.d/rc.httpd start

Инициализируем каталог данных MySQL и создадим системные таблицы. Запустим MySQL и дадим пользователю root пароль.

# mkdir /var/lib/mysql/mysql
# mysql_install_db
# chown -R mysql.mysql /var/lib/mysql
# chmod +x /etc/rc.d/rc.mysqld
# /etc/rc.d/rc.mysqld start
# mysql -u root
   MariaDB [(none)]> set password for 'root'@'localhost' = password('mypassword');
   Query OK, 0 rows affected (0.00 sec)
 
   MariaDB [(none)]> FLUSH PRIVILEGES;
   Query OK, 0 rows affected (0.00 sec)

   MariaDB [(none)]> \q
   Bye

Настройка

Первый запуск

Продолжим настройку в веб-интерфейсе. Запустим наше облако локально, по адресу http://192.168.10.217/nextcloud/ и введём необходимые данные.

Первые два поля это:
пользователь с правами админа - например, admin :) ;
пароль пользователя с правами админа.

Если вдруг забыли пароль или его нужно сменить какому-либо пользователю:

# chmod +x /var/www/htdocs/nextcloud/occ
# sudo -u apache /var/www/htdocs/nextcloud/occ user:resetpassword admin
Enter a new password: 
Confirm the new password: 
Successfully reset password for admin

Далее. Раскрываем «Хранилище и база данных» и заполняем:
Каталог с данными - Здесь создастся каталог data, место, где будут храниться ВСЕ данные ВСЕХ пользователей, а так же логи Nextcloud. Лучше для этого выделить отдельный винчестер и в этом поле указать путь к его точке монтирования. Не забыв сделать её владельцем apache:apache.
Выбираем базу данных - MySQL/MariaDB и в поля ниже вводим соответствующие значения:
пользователь с правами администратора MySQL, у нас это - root;
пароль пользователя с правами администратора MySQL;
название создаваемой базы данных, у нас это - nextcloud;
путь к компьютеру, где установлена MySQL.

Нажимаем на «Завершить установку» и, если всё прошло гладко, увидим веб-интерфейс Nextclod.

Перейдём в основные настройки и посмотрим на ошибки.


Исправление ошибок

В /etc/php.ini добавим рекомендуемые параметры opcache, а для приемлемой работы с файлами большого объёма, кое-какие параметры изменим:

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
 
post_max_size = 16G
upload_max_filesize = 0
memory_limit = 2G
sys_temp_dir = "/var/tmp"
date.timezone = Europe/Moscow

Или при помощи sed, добавляя знак комментария к уже существующим параметрам (чувствую, что можно оптимизировать, но, пока, не знаю как :).

sed -i \
-e '/opcache.enable=/s/^/;/' \
-e '/opcache.enable=/a opcache.enable=1' \
-e '/opcache.enable_cli=/s/^/;/' \
-e '/opcache.enable_cli=/a opcache.enable_cli=1' \
-e '/opcache.interned_strings_buffer=/s/^/;/' \
-e '/opcache.interned_strings_buffer=/a opcache.interned_strings_buffer=8' \
-e '/opcache.max_accelerated_files=/s/^/;/' \
-e '/opcache.max_accelerated_files=/a opcache.max_accelerated_files=10000' \
-e '/opcache.memory_consumption=/s/^/;/' \
-e '/opcache.memory_consumption=/a opcache.memory_consumption=128' \
-e '/opcache.save_comments=/s/^/;/' \
-e '/opcache.save_comments=/a opcache.save_comments=1' \
-e '/opcache.revalidate_freq=/s/^/;/' \
-e '/opcache.revalidate_freq=/a opcache.revalidate_freq=1' \
-e '/post_max_size =/s/^/;/' \
-e '/post_max_size =/a post_max_size = 16G' \
-e '/upload_max_filesize =/s/^/;/' \
-e '/upload_max_filesize =/a upload_max_filesize = 0' \
-e '/memory_limit =/s/^/;/' \
-e '/memory_limit =/a memory_limit = 2G' \
-e '/sys_temp_dir =/s/^/;/' \
-e '/sys_temp_dir =/a sys_temp_dir = \"/var/tmp\"' \
-e '/date.timezone =/a date.timezone = Europe\/Moscow' \
/etc/php.ini
Навигация
Печать/экспорт
QR Code
QR Code wiki:articles:nc (generated for current page)