Супер Спарпёр!
SSPDev Wolves Brotherhood My Nextcloud AppleLife MAC-RU.NET Nextcloud+Apache Setup Nextcloud+Nginx Setup

Установка и настройка Nextcloud,
qBittorent и медиа-сервер Plex
на macOS 10.13.6 + apache

Я поднял облако на macOS 10.13.6, потому что я буду использовать macOS Server 5.6.3 (максимальная версия для 10.13.6). В версии 5.6.3 пока еще есть GUI для Web-server и VPN (в macOS и iOS по-умолчанию есть клиент L2TP и это минимизирует количество стороннего софта на девайсах). Хоть в macOS и есть встроенный PHP, но в High Sierra его версия 7.1.36, если мне не изменяет память, что для меня не приемлемо. К тому же для работы Nextcloud необходимы некоторые модули, которых нет во встроенном PHP. Я решил воспользоваться Homebrew для установки всех необходимых мне компонентов.

По-мимо Nextcloud, я установил и настроил qBittorrent и медиа-сервер Plex. Я выбрал qBittorrent потому, что он поддерживает последовательную загрузку файлов, что очень удобно, если качаешь сериалы. Ну а Plex я выбрал потому, что просто понравился. От "сервера" я жду (в идеале) отсутствия необходимости физического контакта и низкого энергопотребления, так как он будет работать 24/7. Для этого я решил использовать имеющийся у меня системник Small Form Factor с блоком питания на 180W. Конфигурация следующая:
- Chipset Q270;
- i5-7500, 3.4GHz, 6MB L3;
- DDR4-2666 8GB RAM (есть возможность расширить до 64GB, но надо ли будет?);
- NVMe 128GB для установки ОС;
- 2хHDD 2.5" по 2TB (для RAID1);
- BCM94360CD (по желанию, но я хотел бы, чтобы в системе работали все фишки).

Так как для этого системника предусмотрена установка только одного HDD 3.5", а мне нужно сделать "зеркало" и подключать внешний HDD каким-либо способом я не хочу, было принято решение ловко модифицировать отсек для HDD адаптером 3.5"-to-2.5". В магазине я нашел дешевый пластиковый адаптер, в который можно установить 2 штуки 2.5", а так же я прикупил разветвитель питания SATA, так как в системнике не предусмотрена установка второго SATA-накопителя. Собрав всю конструкцию, можно приступать к установке macOS Server 10.13.6 High Sierra.

На время установки 10.13.6 необходимо отключить системник от интернета, так как он будет проверять текущую дату. Так как время 10.13.6 "уже прошло", нужно на верхней панели выбрать Утилиты -> Терминал и ввести команду для изменения текущей даты и времени "date 0717201018" (формат - mmddHHMMyy, 17.08.2018 20:10). Закрываем терминал. Идем в "Дисковая утилита", форматируем накопитель для установки ОС. Теперь надо сделать массив с зеркалирование, на случай поломки HDD. Нажимаем "Файл" -> "Ассистент RAID". В появившемся окне выбираем нужный пункт (я выбрал "С зеркалированием RAID1") и нажимаем "Далее". Ставим галки напротив нужных дисков (не логических, а физических) и нажимаем "Далее". Выбираем формат файловой системы (для HDD лучше выбрать Mac OS Extended, а для SSD - APFS), вводим название будущего RAID-массива и выбираем размер блока (я выбрал 256КБ). Галку "Перестраивать автоматически" я оставил. "Далее". После форматирования HDD, выходим из дисковой утилиты и жмем на "Установить macOS High Sierra". Если не поменять время ОС, то на этом этом этапе вылетит ошибка о невозможности установки macOS. Надо обязательно отключить системник от интернета, чтобы время не восстанавливалось. После полной установки macOS (у меня это после второй перезагрузки) подключаем кабель интернета к системнику и заходим в установку macOS. Нажимаем "Установить macOS High Sierra", тут должно вылететь окно ошибки о невозможности установить macOS. Это означает, что время ОС восстановилось на текущее. Эта манипуляция нужна для того, чтобы во время стартовой настройки системы не вылетала ошибка при попытке авторизации в iCloud из-за измененного времени. В общем, настроиваем ОС, выходим на рабочий стол, идем в "Системные настройки" -> "Общий доступ", редактируем имя компа на нужное, делаем прочие настройки системы на свой вкус. Далее идем в Mac App Store, скачиваем и устанавливаем обновления (по-желанию, но я обновил, чтобы не висели и не делали мозг). Нам понадобится macOS Server 5.6+ (из MAS можно скачать 5.6.3; в macOS 10.14 будет уже без GUI Web-server и VPN).

Итак, настроили и обновили ОС, установили macOS Server 5.6+, теперь открываем Terminal.app и приступаем к установке прочего необходимого, копипастим команды в терминал:

1. Устанавливаем CommandLine:

xcode-select --install

2. Устанавливаем Homebrew:

/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

3. Устанавливаем PHP7.3 (Nextcloud 17.0.2 на данный момент поддерживает 7.3):

brew install php@7.3

brew services start php@7.3

4. Делаем запись в bash_profile, чтобы наш новый PHP использовался по-умолчанию:

echo 'export PATH="/usr/local/opt/php@7.3/bin:$PATH"' >> ~/.bash_profile

echo 'export PATH="/usr/local/opt/php@7.3/sbin:$PATH"' >> ~/.bash_profile

source ~/.bash_profile

5. Проверяем, принят ли наш PHP по-умолчанию:

php --version

Вывод:

PHP 7.3.13 (cli) (built: Dec 18 2019 16:09:46) ( NTS )

.....

6. Смотрим директории важных php-шных файлов:

php --ini

Вывод:

Configuration File (php.ini) Path: /usr/local/etc/php/7.3

Loaded Configuration File: /usr/local/etc/php/7.3/php.ini

Scan for additional .ini files in: /usr/local/etc/php/7.3/conf.d

Additional .ini files parsed: /usr/local/etc/php/7.3/conf.d/ext-opcache.ini

Нам важна вторая строка (про файл php.ini, туда надо изменения вносить).

7. Устанавливаем необходимые extensions (продолжаем копипастить):

pecl install xdebug

brew install pkgconfig

brew install imagemagick

pecl install imagick

pecl install apcu

brew install memcached

pecl install memcache

brew install ffmpeg

8. Устанавливаем медиа-сервер Plex (я ставлю через brew, но можно и с оф.сайта скачать):

brew cask install plex-media-server

9. Устанавливаем и стартуем postgresql (можно и mariadb поставить, кому как нравится):

brew install postgresql

pg_ctl -D /usr/local/var/postgres -l /usr/local/var/postgres/server.log start

Теперь надо зайти в psql, создать БД, пользователя и дать ему права на эту БД (вносим свои данные):

sudo psql -U имя_лок_юзера -d postgres

CREATE USER имя_юзераБД WITH SUPERUSER PASSWORD 'пароль_юзераБД';

ALTER DATABASE postgres OWNER TO имя_юзераБД;

CREATE DATABASE имя_новойБД;

GRANT ALL ON DATABASE имя_новойБД TO имя_юзераБД;

\q

10. Теперь надо настроить php.ini, чтобы в Nextcloud не было предупреждений:

sudo nano /usr/local/etc/php/7.3/php.ini

Ищем строки, раскоментируем и меняем значения на указанные ниже:

memory_limit = 2048M (минимум 512 для Nextcloud)

opcache.enable=1

opcache.memory_consumption=128

opcache.interned_strings_buffer=8

opcache.max_accelerated_files=10000

opcache.revalidate_freq=1

opcache.save_comments=1

Сохраняем конфиг (ctrl+O, Enter) и выходим (ctrl+X).

11. Теперь надо настроить www.conf:

sudo nano /usr/local/etc/php/7.3/php-fpm.d/www.conf

Ищем строки, раскоментируем и меняем значения на указанные ниже:

pm = dynamic

pm.max_children = 120

pm.start_servers = 12

pm.min_spare_servers = 6

pm.max_spare_servers = 18

12. Изначально, Apache работает от имени юзера _www, состоящего в группе _www. Но для того, чтобы qBittorrent спокойно качал файлы и папки в директорию Nextcloud и при этом была возможность удалять файлы через интерфейс Nextcloud, нужно сменить имя пользователя с _www на имя_лок_юзера. Для этого открываем macOS Server и делаем начальную настройку (вводим пароли и т.д.), чтобы программа установила все свои модули. После этого редактируем два конфига этой программы и попутно вносим необходимые для работы Nextcloud изменения:

sudo nano /Library/Server/Web/Config/apache2/httpd_server_app.conf

Для того, чтобы macOS Server использовала наш новый PHP7.3, нужно отредактировать директорию модуля PHP:

LoadModule php7_module /usr/local/opt/php@7.3/lib/httpd/modules/libphp7.so

Ниже ищем User и меняем _www на имя_лок_юзера:

User имя_лок_юзера

Group _www

Находим в этом документе блок "IfModule mod_headers.c" и добавляем внутрь этого блока строку:

Header always set Strict-Transport-Security "max-age=15768000; preload"

Сохраняем конфиг, выходим и редактируем другой конфиг:

sudo nano /Library/Server/Web/Config/Proxy/apache_serviceproxy.conf

User имя_лок_юзера

Group _www

Сохраняем конфиг и выходим.

13. Теперь надо добавить имя_лок_юзера в группу _www:

sudo dscl . append /Groups/_www GroupMembership имя_лок_юзера

14. Создаем и редактируем файл crontab, чтобы он с заданным периодом вызывал файл cron.php (для проверки правильности создания и настройки файла crontab я использую программу Cronnix):

sudo touch ~/.crontab

Открыть программу Cronnix и закрыть.

sudo nano ~/.crontab

Теперь вносим настройки для вызова файла cron.php

*/5 * * * * php -f /директория_до_папки_облака/nextcloud/cron.php

Сохраняем и выходим. Задаем наш новый файл crontab, как основной:

crontab ~/.crontab

Открыть программу Cronnix. В ней должна отобразиться настройка вызова файла cron.php. Также, по-желанию, можно добавить команду для периодического сканирования файлов с записью в log, либо запускать эту команду вручную при необходимости (например через ssh или при подключении через VPN):

*/15 * * * * php -f /директория_до_папки_облака/nextcloud/occ files:scan --all -v > /директория_до_файла/last_nc_files_scan

15. Идем на сайт Nextcloud, скачиваем файл setup-nextcloud.php и сохраняем его в директории, в которой будет находиться папка nextcloud. Конечно же, можно скачать архив с папкой Nextcloud актуальной версии, как я и делал при первой попытке поднять Nextcloud, но я столкнулся с рядом проблем, и после этого я решил пойти другим путём. В общем-то проблема была в том, что я запускал веб-сервер от имени _www, тогда как папка nextcloud была "записана" на имя лок_юзера. Если запустить веб-сервер от имени лок_юзера, как я и указываю в настоящем мануале, то никаких проблем уже не будет, поэтому решайте сами, как будете ставить облако, но через закачку архива будет быстрее и свежее.

16. Открываем macOS Server, View -> Websites, редактируем Server Website (устанавливаем в качестве Directory папку, в которой находится файл setup-nextcloud.php и убираем Redirect на Server Website (SSL). Сохраняем. Жмем переключатель в верхнем правом углу, чтобы запустить наш Web-server. Перед установкой Nextcloud надо открыть доступ к RAID-массиву для внесения в него изменений. Для этого жмем ПКМ на массиве -> Свойства -> Общий доступ и права доступа, нажимаем на замок и вводим пароль для разблокировки. В поле everyone устанавливаем "Чтение и запись". Открываем браузер и в адресную строку пишем:

localhost/setup-nextcloud.php

Если всё настроено верно, то откроется страница установки Nextcloud:

start page

Жмем "Next", выбираем место установки (я ничего не менял и оставил папку nextcloud):

change directory

Жмем "Next", даем браузеру время подумать, скачать и установить файлы облака. После этого появится страница, в верхней части которой будет сообщение с предупреждением о том, что "работа Nexcloud на macOS не стабильна, поэтому используйте на свой страх и риск":

MACOS, MF!!!

Ниже мы увидем форму создания логина и пароля администратора облака,

admins login and pass

установки директории самого хранилища наших файлов (если его не изменить, то Nextcloud позже выдаст предупреждение, что для безопасности надо бы использовать отдельную директорию для файлов, поэтому я директорию nextcloud/data меняю на nextcloud-data и каталог с моими данными будет в папке рядом с основной папкой облака)

directory of data

По-умолчанию, Nextcloud предлагает нам использовать SQLite, но предупреждает о нежелательности его использования:

sqlite

Выбираем Postgresql (или MariaDB/MySQL, если вы создали эту базу) и вносим имя_юзераБД, пароль_юзераБД, имя_новойБД, директорию оставляем localhost и жмем "Завершить установку".

psql

Браузер подумаем и перекинет нас на главную страницу облака. В верхнем правом углу жмем на иконку пользователя и нажимаем "Настройки", слева жмем "Общие сведения".

Настройки

На этой странице будут отображены предупреждения о необходимости соответствующей настройки Nextcloud.

Предупреждения

Исправление предупреждений сделайте после того, как закончите с созданием виртуальных хостов и редактированием его конфига. Первые два предупреждения исчезнут, когда откроете веб-интерфейс облака через домен, который будет ссылаться непосредственно на папку /nextcloud. Третье предупреждение исчезнет, когда настроите 'trusted_proxies' в файле config.php (см.ниже). Предупреждения об использовании SQLite не будет, если использовать MariaDB или Postgresql. Пятое и шестое предупреждение исчезнет, когда внесете в конфиг виртуального хоста редирект на указанные в предупреждении директории (решение см.ниже). Предупреждение про кеширование исчезнет (при условии, что в файл php.ini внесены вышеуказанные правки), когда впишите в config.php сроку 'memcache.local'... (см.ниже). Чтобы исправить последнее предупреждение, нужно открыть терминал и вбить команду "сd /путь_до_папки_облака/nextcloud", а затем ввести команду:

php -f occ db:convert-filecache-bigint


Предупреждение

Ниже находится настройка канала обновления (чтобы проверить наличие обновлений, надо нажать на кнопку "Stable" и нажать на поле "Stable" и обновить страницу браузера).

updates

updates

Переходим в "Основные параметры" и выбираем Cron. Браузер не закрываем.

cron

Нужно настроить файл config.php, который находится в папке /nextcloud/config:

sudo nano /директория_до_папки_облака/nextcloud/config/config.php

В trusted_domains добавляем наш домен или внешний IP:

1 => 'домен или внешний IP',

Над строкой 'datadirectory' пишем:

'memcache.local' => '\OC\Memcache\APCu',


memcache

В конце добавить IP своего "сервера" в локальной сети:

'trusted_proxies' => ['192.168.1.96'],


proxy

Сохраняем конфиг и выходим.

Теперь установим acme для получения сертификатов от Let's encrypt. Перед всей этой работой я создал дополнительные домены для облака, Plex и qBittorent. Доступ к Plex и qBittorrent осуществляется через указание порта: для Plex - 32400, а для qBittorrent я указал в настройках порт 8080. Отдельные домены - это всё для красоты, но для Plex я еще сделаю так, чтобы в адресной строке не отображался порт. Рядом с папкой nextcloud создадим папки plex и qbittorrent. Открываем терминал:

curl https://get.acme.sh | sh

cd .acme.sh

./acme.sh --issue -d домен_облака --webroot /директория_до_папки_облака/nextcloud/

./acme.sh --issue -d домен_plex --webroot /директория_до_папки_plex/plex/

./acme.sh --issue -d домен_qbittorrent --webroot /директория_до_папки_qbittorrent/qbittorrent/

Если эти команды будут ругаться на отсутствие папок /.well-known/acme-challenge, то их можно создать вручную. В случае необходимости сертификаты можно обновить принудительно:

./acme.sh --renew -d домен_облака --force

./acme.sh --renew -d домен_plex --force

./acme.sh --renew -d домен_qbittorrent --force

Все сертификаты сохраняться в папке локального пользователя внутри скрытой папки acme (чтобы ее увидеть, нажми Shift+Cmd+.). Теперь импортируем сертификаты. Открываем macOS Server, переходим в меню Certificates, внизу нажимаем "+" и выбираем "Import a Certificate Identity", в появившееся окошко перетаскиваем файлы fullchain.cer и домен.key и нажимаем ОК. Так делаем со всеми сертификатами для облака, Plex. Также, на всякий пожарный, я сохранил копию сертификатов в отдельной папке.

Теперь надо создать VirtualHost:80 и :443 для облака и Plex; для qBittorrent делаем только :80. Открываем macOS Server, переходим в Websites, выключаем Web-server (переключатель в верхнем правом углу) и нажимаем "+", чтобы добавить VirtualHost. Появилось окно, вводим домен, указываем Directory (папку nextcloud), выбираем соответствующий сертификат (порт 443 установится автоматически, менять его не надо). Так делаем для облака, Plex и qBittorrent. Потом создаем для них VirtualHost:80. Нажимаем "+", пишем домен, выбираем директорию, НЕ выбираем сертификат, а оставляем порт 80 и нажимаем Redirect, в появившемся окне выбираем Website, в строке ниже выбираем соответствующий домен с (SSL). После создания всех VirtualHost:80 и :443 трогать их настройки лучше не стоит, так как если внести вручную изменения в конфиги виртуальных хостов, а потом начать их редактировать через macOS Server, эти изменения исчезнут, если они не соответствуют "пониманию" macOS Server. Такое "непонятное" изменение будет одно и оно нужно для работы облака через webdav по HTTPS. Чтобы облако не ругалось на неправильную настройку CardDAV и CalDAV, в конфиг хоста облака внесем изменения:

sudo nano /Library/Server/Web/Config/apache2/sites/0000_127.0.0.1_34543_домен_облака.conf

Перед последней строкой добавляем две строки редиректа:

Redirect 301 /.well-known/carddav http://домен_облака/remote.php/dav

Redirect 301 /.well-known/caldav http://домен_облака/remote.php/dav

Эти две строки macOS Server нормально "понимает", а вот следующие - нет. Для работы WebDAV по HTTPS добавим выше ранее добавленных строк "Redirect 301...":

ВНИМАНИЕ!!!
Хочу отметить тот факт, что при указании в конфиге виртуального хоста следующих строк "ломает" адекватную работу облака (в том числе и через веб-интерфейс); да, подключиться через WebDAV по HTTPS будет можно, но тогда будут проблемы с созданием новых объектов и изменением ранее загруженных, поэтому я рекомендую не прописывать эти строки. Возможно, что для нормальной работы нужно прописать что-то еще, по-мимо нижеуказанных строк, но на данный момент мне это не известно. В данной ситуации можно использовать WebDAV по HTTP, если вас не будет смущать отсутствие шифрования траффика. Для этого не добавляйте к виртуальному хосту облака :80 редирект на :443 и тогда в приложениях и для подключения можно будет использовать HTTP-ссылки, а в браузерах - HTTPS-ссылки (лично я использую вариант без редиректа).

<Location />

DAV Off

</Location>


config

Сохраняем конфиг и выходим.

Включаем Web-server и идем на ранее открытую страницу с настройками Nextcloud. При наличии обновлений (у меня сначала устанавливалась версия 16.0.2, а после вышеуказанных манипуляций с каналом обновлений стала доступна для установки версия 17.0.2) обновляем облако. macOS может накидать какие-то свои файлы в папку nextcloud (например, .DS_Store или создаст папку Netboot) и обновление облака будет пугаться на них, поэтому папку Netboot можно удалить руками, а для удаления .DS_Store переходим в терминал и вводим две команды, а после их выполнения приступаем к обновлению облака:

cd /директория_до_папки_облака/nextcloud/

rm .DS_Store

После обновления идем в "Настройки" -> "Общие сведения" и проверяем версию. В настройках есть раздел "Система". В этом разделе можно проверить объем используемой памяти и версию PHP.

Облако установлено. Теперь займемся медиа-сервером и qBittorrent. В настройках qBittorent включаем веб-интерфейс, включаем доступ оп HTTPS и добавляем сертификат+ключ.

Для Plex сделаем так, чтобы не было необходимости писать порты в адресе для доступа к веб-интерфейсу. Для этого надо отредактировать конфиг VirtualHost:443:

sudo nano /Library/Server/Web/Config/apache2/sites/0000_127.0.0.1_34543_домен_плекса.conf

В конце блока <IfModule mod_ssl.c> добавляем 3 строки:

ProxyPreserveHost On

ProxyPass / http://лок_IP_сервера:32400/

ProxyPassReverse / http://лок_IP_сервера:32400/

Перезапускаем веб-сервер и пользуемся :-)