Установка и настройка Nextcloud,
qBittorent и медиа-сервер Plex
на macOS 10.13.6 + nginx
После того, как я поднял облако на Apache (с использованием macOS Server 5.6.3) и столкнулся с отсутствием работы webdav через HTTPS, решил попробовать свои силы в Nginx.
Я пробовал ставить macOS 10.14 и 10.15 на сервер, но эти версии macOS больше нагружают процессор по сравнению с 10.13.6. А оно мне надо? К тому же использование macOS 10.13.6 позволяет использовать VPN (в macOS и iOS по-умолчанию есть клиент L2TP и это минимизирует количество стороннего софта на девайсах) в macOS Server (5.6.3), но есть один момент: Server.app обращается к встроенному в macOS Apache (слушает порты 80 и 443), в следствие чего при попытке включить nginx (если его выключить через терминал и там же попытаться включить), то он будет ругаться на занятые порты. Чтобы такого не было, надо в настройках Apache отключить прослушивание портов. Для этого в файле /Library/Server/Web/Config/Proxy/apache_serviceproxy.conf надо закомментировать listen 80 и listen 443 и перезапустить Server.app. И теперь все по красоте! Хоть в 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.3, теперь открываем Terminal.app и приступаем к установке прочего необходимого, копипастим команды в терминал:
1. Устанавливаем CommandLine:
xcode-select --install
2. Устанавливаем Homebrew:
/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
3. Устанавливаем Nginx:
brew install nginx
brew services start nginx
Для запуска nginx вместе с системой:
sudo cp /usr/local/opt/nginx/homebrew.mxcl.nginx.plist /Library/LaunchDaemons
Создать директории для хранения конфигов:
mkdir - p /Volumes/путь_до_папки/sites-available
mkdir - p /Volumes/путь_до_папки/sites-enabled
После создания файла конфига для какого-нибудь хоста надо его сохранить в папке sites-available и командой добавить псевдоним файла в папку sites-enabled:
ln -sfv /Volumes/путь_до_папки/sites-available/nextcloud.conf /Volumes/путь_до_папки/sites-enabled/nextcloud.conf
Также надо настроить конфиг для Nginx:
sudo nano /usr/local/etc/nginx/nginx.conf
user имя_юзера staff; #изменить на свои
worker_processes auto;
error_log /var/log/nginx.error.log;
pid /usr/local/var/run/nginx.pid;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /usr/local/var/log/nginx/access.log;
error_log /usr/local/var/log/nginx/error.log;
sendfile on;
tcp_nopush on;
keepalive_timeout 75;
gzip on;
gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript application/javascript;
server {
listen 80;
server_name localhost 127.0.0.1;
location / {
index index.html;
}
root /Volumes/путь_до_файла/default;
}
include /Volumes/путь_до_папки/sites-enabled/*.conf;
}
3. Устанавливаем PHP:
brew install php
brew services start php
4. Делаем запись в bash_profile, чтобы наш новый PHP использовался по-умолчанию:
echo 'export PATH="/usr/local/opt/php/bin:$PATH"' >> ~/.bash_profile
echo 'export PATH="/usr/local/opt/php/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
brew services restart php
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 = 4096M (минимум 512 для Nextcloud)
cgi.fix_pathinfo=0
opcache.enable=1
opcache.enable_cli=1
opcache.memory_consumption=128
opcache.interned_strings_buffer=8
opcache.max_accelerated_files=10000
opcache.revalidate_freq=1
opcache.save_comments=1
post_max_size = 200G
upload_max_filesize = 200G
Сохраняем конфиг (ctrl+O, Enter) и выходим (ctrl+X).
11. Теперь надо настроить www.conf:
sudo nano /usr/local/etc/php/7.3/php-fpm.d/www.conf
Ищем строки, раскомментируем и меняем значения на указанные ниже:
clear_env=no
pm = dynamic
pm.max_children = 120
pm.start_servers = 12
pm.min_spare_servers = 6
pm.max_spare_servers = 18
brew services restart php
12. Теперь надо настроить php-fpm.conf:
sudo nano /usr/local/etc/php/7.3/php-fpm.conf
Раскоментить строку error_log и добавить путь /usr/local/var/
error_log = /usr/local/var/log/php-fpm.log
14. Создаем и редактируем файл crontab, чтобы он с заданным периодом вызывал файл cron.php:
sudo touch ~/.crontab
sudo nano ~/.crontab
Теперь вносим настройки для вызова файла cron.php
*/5 * * * * php -f /директория_до_папки_облака/nextcloud/cron.php
Сохраняем и выходим. Задаем наш новый файл crontab, как основной:
crontab ~/.crontab
15. Идем на сайт Nextcloud, скачиваем архив с папкой Nextcloud актуальной версии.
16. Теперь надо настроить конфиг для хоста облака:
Если всё настроено верно, то откроется страница установки Nextcloud:

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

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

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

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

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

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

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

На этой странице будут отображены предупреждения о необходимости соответствующей настройки 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" и обновить страницу браузера).


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

Нужно настроить файл config.php, который находится в папке /nextcloud/config:
sudo nano /директория_до_папки_облака/nextcloud/config/config.php
Над строкой 'datadirectory' пишем:
'memcache.local' => '\OC\Memcache\APCu',

Сохраняем конфиг и выходим.
Теперь установим бота Let's encrypt. Перед всей этой работой я создал дополнительные домены для облака, Plex и qBittorent. Рядом с папкой nextcloud создадим папки plex и qbittorrent. Открываем терминал:
brew install letsencrypt
sudo certbot --nginx
Далее вбиваем мыло и выбираем нужный домен
Облако установлено. Теперь займемся qBittorrent. В настройках qBittorent включаем веб-интерфейс, включаем доступ оп HTTPS и добавляем сертификат+ключ. (на время настройки я сделал самоподписанный сертификат)