Прежде чем начать

Сразу расскажу, что у меня так и не получилось подружить HEIF (формат фото на iOS) с Nextcloud, самый рабочий способ - конвертация в JPEG. Кроме того, Nextcloud при всех своих фичах очень плохо подходит как замена iCloud, просто потому, что там больше вычислительных мощностей и синхронизация между устройствами Apple нормально работает только с облаком Apple. В общем-то, после месяца тестов и осознание того, что при моих паттернах использования, на устройствах с iOS, получаешь больше проблем чем профита, забил и вернулся в iCloud. А для шеринга фоточек (а-ля Instagram) выбрал Piwigo.

Мое мнение, что Nextcloud имеет смысл ставить если есть желание перетянуть свои данные с более медленного облака (например, OneDrive). А так же, тем у кого основная мобильная платформа - Android или кроме фоток нужно хранить и шерить разные документы, а может даже музыку :)

Установка

Сам дистрибутив взял с официального сайта и распаковал в /volume1/web/. В качестве сервера выбрал Apache 2.4 + PHP 7.4.

Зависимости

Железо

Nextcloud более-менее нормально ворочается на 2Гб, но как только начинается индексация или генерация превью, то могут появляться тормоза как раз из-за того, что сервер упирается в память. Потому, лучше всего докинуть памяти до 6Гб для более стабильной и плавной работы.

Хранилище данных

Для хранения всяких пользовательских данных я использовал готовые образы MySql - MariaDB. И для кеша - Redis.

PHP пакеты

Для работы Nextcloud нужны следующие модули

  • bcmath
  • bz2
  • curl
  • exif
  • ftp
  • gd
  • gettext
  • iconv
  • intl
  • gmp
  • imagick
  • mailparse
  • mysqli
  • openssl
  • pdo_mysql
  • posix
  • soap
  • sodium
  • sockets
  • zip
  • zlib

Подключение Redis-кеша

По какой-то причине php-модуль redis не доступен для выбора, но его можно включить окольными путями. Проверяем доступность модуля для нашей версии рhp

ls /volume1/@appstore/PHP7.4/usr/local/lib/php74/modules/redis.so

Затем добавляем строчку (сразу после posix.so)

extension = redis.so

в файл /usr/local/etc/php74/cli/conf.d/extension.ini. И наконец добавляем элемент в список для отображения модуля в UI

"redis": {
    "enable_default": true,
    "desc": "The phpredis extension provides an API for communicating with the Redis key-value store."
},

тут так же лучше сохранить последовательность и добавить запись после модуля posix. Так же, надо добавить соответствующие настройки в config.php

'memcache.local' => '\\OC\\Memcache\\Redis',
'memcache.distributed' => '\\OC\\Memcache\\Redis',
'memcache.locking' => '\\OC\\Memcache\\Redis',
'redis' =>
  array (
    'host' => '127.0.0.1',
    'port' => 6379,
    'timeout' => 1.5,
  ),

Обновляем страницу и все работает!

Генерация превью

Подключить типы картинок/видео в config.php

<?php
$CONFIG = array (
  'enable_previews' => true,
  'ffmpeg' => '/bin/ffmpeg',
  'preview_max_x' => '2048',
  'preview_max_y' => '2048',
  'enabledPreviewProviders' =>
  array (
    0 => 'OC\\Preview\\Image',
    1 => 'OC\\Preview\\Movie',
    2 => 'OC\\Preview\\GIF',
    3 => 'OC\\Preview\\BMP',
    4 => 'OC\\Preview\\XBitmap',
    5 => 'OC\\Preview\\MP3',
    6 => 'OC\\Preview\\TXT',
    7 => 'OC\\Preview\\MarkDown',
    8 => 'OC\\Preview\\OpenDocument',
    9 => 'OC\\Preview\\PDF',
    10 => 'OC\\Preview\\MP4',
    11 => 'OC\\Preview\\MOV',
    12 => 'OC\\Preview\\MKV',
    13 => 'OC\\Preview\\HEIC',
    14 => 'OC\\Preview\\JPEG',
    15 => 'OC\\Preview\\PNG',
    16 => 'OC\\Preview\\AVI',
  ),
  ...

Еще надо установить модуль Preview Generator и запустить с конфигом приложения

sudo -u http php74 -c /usr/syno/etc/packages/WebStation/php_profile/<Profile-ID>/conf.d/user_settings.ini -d memory_limit=1024M /volume1/web/nextcloud/occ preview:generate-all -vvv -p /<user>/files/Photos/ <user>

посмотреть свой ProfileID можно в файле /usr/syno/etc/packages/WebStation/PHPSettings.json там он будет ключем вида “f28a94be-d803-4769-b359-b5146e657d6f”, а в значение, в объекте, будет profile_name по которому можно идентифицировать.

После этого, надо так же добавить команду в cron

sudo -u http php74 -c /usr/syno/etc/packages/WebStation/php_profile/<Profile-ID>/conf.d/user_settings.ini -d memory_limit=1024M /volume1/web/nextcloud/occ preview:pre-generate

Reverse-proxy

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

server {
	server_name <SERVER>;

	listen 80;
	listen [::]:80;

	return 301 https://<SERVER>$request_uri;
}


server {
	server_name <SERVER>;

	listen [::]:443 ssl http2;
	listen 443 ssl http2;

	ssl_certificate /etc/letsencrypt/live/<SERVER>/fullchain.pem; # managed by Certbot
	ssl_certificate_key /etc/letsencrypt/live/<SERVER>/privkey.pem; # managed by Certbot
	ssl_trusted_certificate /etc/letsencrypt/live/<SERVER>/chain.pem;

	location / {
		proxy_pass http://<HOST>:<PORT>/;
		proxy_set_header Host $host;
		proxy_set_header X-Real-IP $remote_addr;
		proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
		proxy_set_header X-Forwarded-Proto $scheme;

		proxy_headers_hash_max_size 512;
		proxy_headers_hash_bucket_size 64;

		proxy_redirect off;
		proxy_max_temp_file_size 0;
		client_max_body_size 0;

		add_header Front-End-Https on;
		add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload";
		add_header Referrer-Policy "same-origin";

		access_log /var/log/nginx/nextcloud-access.log custom;
		error_log /var/log/nginx/nextcloud-error.log warn;
	}

	location ^~ /.well-known {
        location = /.well-known/carddav { return 301 /remote.php/dav/; }
        location = /.well-known/caldav  { return 301 /remote.php/dav/; }

        location /.well-known/acme-challenge    { try_files $uri $uri/ =404; }
        location /.well-known/pki-validation    { try_files $uri $uri/ =404; }
        return 301 /index.php$request_uri;
    }
}