Домашнее облако Nextcloud на роутере Keenetic/Netcraze

Домашнее облако можно собрать без отдельного сервера, используя роутер с поддержкой Entware и внешний USB-диск. Такой вариант подходит для хранения фотографий и файлов, которые не требуют высокой отказоустойчивости. В рассматриваемой конфигурации используется роутер Netcraze Hopper, внешний диск Adata HD710 Pro на 4 ТБ и Nextcloud 35.0.2.
Основные требования к системе — небольшой бюджет, мобильное приложение, автоматическая синхронизация фотографий, возможность делиться файлами между пользователями и хранение данных непосредственно на файловой системе. Доступ из интернета остаётся опциональным: для домашней сети достаточно локального адреса, а для внешнего подключения потребуется домен и HTTPS.
Разметка внешнего диска
Диск предлагается разделить на три части: 2 ГБ под swap, 25 ГБ в ext4 под Entware и оставшееся пространство в NTFS под данные Nextcloud и SMB-ресурс. Такое решение сохраняет возможность в любой момент отключить накопитель от роутера и подключить его к компьютеру с Windows. Entware устанавливается по официальной документации для используемой модели устройства.
- swap: 2 ГБ;
- ext4: 25 ГБ для Entware и программ;
- NTFS: остальной объём для файлов и сетевой папки.
Установка окружения
Для работы Nextcloud понадобятся Nginx, PHP-FPM, модули PHP, SQLite, APCu, ImageMagick и набор вспомогательных утилит. Если нужны миниатюры видео, дополнительно устанавливаются ffmpeg и libffmpegthumbnailer. В Entware на момент подготовки конфигурации используется PHP 8.4, совместимый с Nextcloud 35.
Базовый набор устанавливается командами opkg update, а затем opkg install ffmpeg libffmpegthumbnailer и пакетом зависимостей, включающим nginx, nginx-ssl, php8, php8-fpm, модули php8-mod-pdo, php8-mod-sqlite3, php8-mod-gd, php8-mod-curl, php8-mod-xml, php8-mod-zip, php8-pecl-apcu, php8-pecl-imagick, а также curl, wget-ssl, imagemagick и библиотеки OpenSSL.
Настройка PHP и Nginx
В конфигурации PHP увеличиваются ограничения для работы с крупными файлами: post_max_size и upload_max_filesize устанавливаются на 10000M, а время выполнения и обработки запроса — на 3600 секунд. Для Nextcloud также включаются OPcache и APCu. Временный каталог загрузок указывается внутри Entware, например /opt/tmp.
PHP-FPM запускается от имени root. Это связано с тем, что рабочая директория Nextcloud и база SQLite находятся на NTFS, а запуск от менее привилегированного пользователя в описанной конфигурации приводит к проблемам с чтением файлов. Nginx также работает от root и передаёт запросы PHP через Unix-сокет /opt/var/run/php8-fpm.sock. Параметры пула PHP-FPM ограничиваются двумя дочерними процессами, что соответствует ресурсам роутера.
В конфигурации Nginx задаются большие значения client_max_body_size, тайм-ауты до 300 секунд и правила Nextcloud для PHP, статических файлов, WebDAV и служебных каталогов. Сам сервер доступен локально через адрес 127.0.0.1:81, а HTTPS-терминация выполняется средствами роутера или внешнего прокси.
Особенность Keenetic и авторизация
Встроенный Nginx роутера для пользовательских приложений очищает заголовки Referer и Origin, а в Host подставляет значение 127.0.0.1. Nextcloud проверяет Origin при входе, поэтому без дополнительной настройки авторизация заканчивается ответом 303 See Other и перенаправлением на страницу входа.
Для обхода этой особенности в секции PHP Nginx принудительно передаются заголовки с доменом Nextcloud: fastcgi_param HTTP_ORIGIN "https://<домен>" и fastcgi_param HTTP_REFERER "https://<домен>/". Это рабочий, но компромиссный вариант: автор отмечает, что такое восстановление заголовков может ослабить защиту от запросов с других вкладок. При публикации сервиса в интернете этот момент следует дополнительно проверить и по возможности заменить более строгой схемой проксирования.
Установка и первичная настройка Nextcloud
Архив Nextcloud распаковывается в /opt/share/www. После запуска сервисов S79php8-fpm и S80nginx выполняется установка через консольную утилиту occ: php8-cli occ maintenance:install --database=sqlite --admin-user=<админ_юзер> --admin-pass='<админ_пароль>' --data-dir='/tmp/mnt/<ид_диска>/nextcloud'. Рабочий каталог данных размещается на NTFS-разделе внешнего диска.
Затем в конфигурации задаются внешний URL, домен и протокол HTTPS, а в список доверенных доменов добавляются localhost, адрес роутера, локальный IP и используемый домен. Для локального кэша включается APCu. Фоновые задания переводятся на cron командой php8-cli occ background:cron, после чего в планировщик добавляется запуск /opt/bin/php8-cli -f /opt/share/www/cron.php каждые пять минут.
Превью фотографий и видео
Генерацию миниатюр можно включить параметром enable_previews. В примере ограничивается потребление памяти до 128 МБ, максимальный размер превью задаётся как 1080 на 1920 пикселей, а число параллельных задач — одна для новых файлов и две для массовой генерации.
В список поддерживаемых типов добавляются JPEG, PNG, GIF, BMP, XBitmap, HEIC, PDF, MP4, AVI и MOV. Для видео требуются установленные ffmpeg и libffmpegthumbnailer. Такая конфигурация позволяет получить функциональное домашнее облако с веб-интерфейсом, мобильным клиентом, синхронизацией фотографий и совместным доступом, однако единственную копию важных данных лучше не хранить на одном диске.


