Реальные ограничения Nextcloud на VPS
Узнайте, почему Nextcloud плохо работает с мелкими файлами и большими деревьями каталогов. Разбираем проблемы с PHP-FPM, настройкой cron и нехваткой RAM для офисных пакетов.
С чем Nextcloud справляется плохо: порядок возникновения проблем
Большинство ограничений Nextcloud на VPS связаны с количеством файлов и запросов, а не с объемом дискового пространства. Библиотека видеофайлов объемом 200 GB нормально работает на небольшом сервере. Те же 200 GB, распределенные по 400,000 мелких файлов, замедляют открытие любой папки и превращают базу данных в самый нагруженный процесс на сервере. Ниже приведен порядок, в котором администратор сталкивается с этими ограничениями: модель запросов PHP, клиент синхронизации, настройки базы данных по умолчанию, фоновые задачи, а затем нехватка оперативной памяти.
Часть того, что пользователи называют «Nextcloud работает медленно», является стандартной настройкой, которую никто не изменил. Остальное — это особенности архитектуры, и настройка их не устранит. В каждом разделе указано, к какой категории относится проблема.
Почему PHP определяет ваш предел параллельных запросов
Nextcloud написан на PHP, а PHP-приложение не является постоянно работающим сервером. Каждый запрос обрабатывается одним рабочим процессом из пула PHP-FPM (FastCGI process manager), и этот процесс полностью отвечает за запрос от начала до конца. Таким образом, количество запросов, которые сервер может обработать одновременно, равно pm.max_children, и каждый из этих рабочих процессов использует собственную память.
Из этого следуют два вывода. Медленный запрос занимает рабочий процесс на всё время своей работы, поэтому один пользователь, загружающий файл размером 4 GB, занимает слот, который никто другой использовать не может. А когда все рабочие процессы заняты, новые запросы ожидают в очереди сокета. Пул сообщает об этом в своем логе:
WARNING: [pool www] server reached pm.max_children setting (5), consider raising itПользователь обычно сталкивается сначала с симптомом в виде ошибки 504 от веб-сервера, стоящего перед приложением:
upstream timed out (110: Connection timed out) while reading response header from upstreamСтандартный пул в дистрибутивах часто поставляется с pm.max_children = 5. Это разумное значение для общего сервера, но слишком низкое для экземпляра Nextcloud с десятком подключенных клиентов синхронизации. Рассчитывайте это значение исходя из имеющейся у вас оперативной памяти: измерьте резидентный объем памяти занятого рабочего процесса, оставьте место для базы данных и кэша, а затем выполните деление.
pm = dynamic
pm.max_children = 12
pm.max_requests = 500
php_value[memory_limit] = 512Mmemory_limit — это верхний предел для одного запроса, а не зарезервированный объем. Большинство запросов используют лишь малую его часть. Генерация превью и сборка больших загружаемых файлов — это те задачи, которые требуют больше ресурсов, поэтому лимит и количество дочерних процессов должны подбираться в связке.
Также между запросами отсутствует общая память приложения. Каждый запрос заново загружает фреймворк: конфигурацию, включенные приложения, маршруты, обработчики событий. OPcache сохраняет скомпилированный байт-код, поэтому происходит выполнение, а не парсинг, а APCu (alternative PHP cache) хранит небольшое локальное хранилище «ключ-значение» в разделяемой памяти. Именно поэтому важна строка в обзоре администратора «No memory cache has been configured». Без него поиск данных, которые могли бы быть получены из памяти, при каждом запросе обращается к базе данных. Эта часть — конфигурация. Модель «один процесс на запрос», лежащая в основе, — это архитектура.
Почему большое количество мелких файлов замедляет работу системы раньше, чем заканчивается место на диске
Nextcloud хранит метаданные для каждого файла и папки в одной таблице базы данных, oc_filecache: путь, хеш пути, размер, время изменения, etag и идентификатор хранилища. Список файлов в папке — это запрос к этой таблице, а не readdir на диске. Операция записи обновляет строку файла, а затем передает новый размер и etag вверх по дереву до самого корня через все родительские папки. Одна загрузка файла — это один HTTP-запрос, несколько SQL-инструкций и по одному дополнительному обновлению для каждого уровня вложенности.
Передача данных также происходит пофайлово. Протокол синхронизации — WebDAV (web distributed authoring and versioning), и WebDAV перемещает один файл за один запрос. 400,000 файлов означают 400,000 запросов, каждый из которых включает аутентификацию, инициализацию фреймворка, проверку прав доступа и запись в базу данных. При затратах серверного времени в 25 мс на каждый запрос, только накладные расходы составят почти три часа, прежде чем будет учтен хотя бы один байт полезной нагрузки. Рассматривайте это как арифметический пример, а не как бенчмарк. Важен сам принцип: стоимость операции зависит от количества файлов, а не от их размера.
Более быстрое хранилище помогает лишь частично. Случайное чтение и запись мелких файлов — это именно то, в чем различаются NVMe и SATA SSD на VPS, поэтому для крупного экземпляра системы использование NVMe оправдано. Однако это не влияет на стоимость каждого отдельного запроса, так как эти затраты связаны с PHP и SQL, а не с диском.
Одно следствие этого факта часто становится неожиданностью для всех. Файлы, скопированные на сервер в обход Nextcloud, не существуют для системы, так как запись в базу данных не была выполнена. Они появятся только после того, как occ files:scan просканирует дерево каталогов и создаст недостающие строки, а для большого дерева такое сканирование занимает много времени. Если вы не уверены, где именно находятся эти файлы при установке в контейнере, структура каталога данных для Nextcloud в Docker описана в отдельном руководстве. Данный же материал носит архитектурный характер: база данных и есть список файлов.
Почему десктопный клиент замедляется на больших деревьях каталогов
Клиент синхронизации работает эффективнее, чем принято считать. Поскольку любая запись обновляет etag вплоть до корневой папки, клиент может выполнить один недорогой запрос, чтобы узнать, изменилось ли хоть что-то, и затем спускаться только в те папки, etag которых отличается. Поэтому фоновый опрос сам по себе не является ресурсоемким.
Однако реальные издержки существуют. Первая синхронизация обходит каждую папку, выполняя по одному запросу PROPFIND на каждую, и скачивает все файлы. Переименование папки в верхней части дерева меняет etag для всего содержимого внутри, поэтому клиент вынужден заново проверять всё поддерево. Клиент также ведет собственную локальную базу данных и выполняет stat для локальных файлов, поэтому медленный диск ноутбука или агрессивный антивирус добавляют задержки, не связанные с сервером.
Без приложения Client Push, notify_push, каждый подключенный клиент опрашивает сервер по таймеру. Тридцать клиентов создают постоянный фоновый поток запросов к тому же пулу воркеров, который обслуживает веб-интерфейс. notify_push — это небольшой отдельный сервис, который поддерживает websocket для каждого клиента и уведомляет их об изменениях, что устраняет большую часть паразитного трафика. Для нагруженного экземпляра это одно из самых полезных дополнений.
Механизма слияния не существует. Если два пользователя редактируют один и тот же файл в офлайне, создается конфликтная копия с именем вида budget (conflicted copy 2026-08-22 141530).ods, которую человек разрешает вручную. Редактирование через офисный сервис позволяет избежать этого, так как в этом случае единственной верной копией всегда остается версия на сервере. Виртуальные файлы, которые отображаются как заглушки до момента открытия, стабильно работают в Windows и macOS, но их внедрение в Linux проходит медленнее, поэтому проверяйте версию клиента, прежде чем планировать рабочий процесс на их основе. Опрос — это настройка. Один запрос на каждый файл — это архитектурная особенность.
Что остается невыполненным при стандартной установке
Свежая установка Nextcloud работает. В типичной ручной установке отсутствуют четыре компонента, и все они видны в разделе Settings, Administration, Overview.
- Отсутствует кэш памяти. В обзоре указано: "No memory cache has been configured". APCu практически не требует ресурсов и исключает большое количество повторяющихся запросов к базе данных.
- Блокировка файлов в базе данных. Nextcloud блокирует файл на время записи. Без Redis эта блокировка сохраняется в таблице базы данных, что увеличивает нагрузку на запись и оставляет «зависшие» блокировки после завершения запроса. Пользователи видят ошибки о том, что файл заблокирован, и исправить это можно только ручной очисткой.
- Отсутствующие индексы базы данных. В обзоре указано: "The database is missing some indexes", и перечисляются
occ db:add-missing-indices. Для кэша файлов с миллионами строк наличие этих индексов определяет разницу между быстрым и медленным отображением списка. - SQLite. Ручная установка может привести к использованию SQLite, которую документация поддерживает только для одного пользователя и для тестирования. Операции записи выполняются последовательно, поэтому даже второй активный пользователь — это уже слишком много.
'memcache.local' => '\\OC\\Memcache\\APCu',
'memcache.locking' => '\\OC\\Memcache\\Redis',
'redis' => [
'host' => 'localhost',
'port' => 6379,
],Ничего из этого не является чем-то экзотическим, всё это — вопросы конфигурации. Если вы предпочитаете начать с установки, где эти решения уже приняты, установка Docker с TLS и резервным копированием разворачивает кэш и контейнер cron как часть стека.
Почему фоновые задачи зависают при отсутствии настройки cron
Nextcloud переносит выполнение реальной работы в фоновые задачи: создание миниатюр, удаление устаревших версий файлов, очистку корзины по расписанию, отправку уведомлений и очистку общих ресурсов. Существует три поддерживаемых способа их запуска, и вариант по умолчанию является наименее эффективным.
Режим AJAX запускает одну задачу при загрузке страницы в браузере. Если на личный экземпляр никто не заходит в течение недели, то в течение недели ничего не выполняется. Версии файлов и корзина не очищаются, поэтому диск продолжает заполняться данными, которые пользователь считает удаленными. Миниатюры не создаются заранее, поэтому первый человек, открывший папку с фотографиями, вынужден ждать, пока его собственный запрос их сгенерирует. В конечном итоге в обзоре системы появляется сообщение о том, что последняя фоновая задача выполнялась несколько часов назад, и предупреждение «Something seems wrong» — это единственное уведомление, которое вы получите.
Webcron и системный cron решают эту проблему. Системный cron запускает cron.php каждые пять минут от имени пользователя веб-сервера, а при установке в контейнерах то же самое делает выделенный cron-контейнер. Пять минут — это интервал, указанный в документации, и интервалы выполнения задач настроены именно под него.
Остается лишь проблема последовательного выполнения задач. Длительная задача, например, пакетная генерация миниатюр или сканирование файлов, задерживает все задачи, стоящие в очереди после нее. На VPS с одним ядром этот процесс конкурирует с активными запросами пользователей. На загруженном хосте CPU steal time от шумных соседей увеличивает время выполнения сверх того, что показывают ваши расчеты. Конфигурация — это самое важное и эффективное исправление для большинства заброшенных экземпляров.
Минимальный объем памяти при добавлении Office, Talk или превью
Базовый Nextcloud потребляет немного ресурсов: PHP-пул, база данных, Redis и веб-сервер. Небольшой инстанс стабильно работает на 2 GB оперативной памяти. Каждая востребованная пользователями функция — это отдельный сервис со своими требованиями к ресурсам.
Превью. По умолчанию превью генерируется в момент первого запроса, поэтому пользователь вынужден ждать завершения обработки. Приложение Preview Generator переносит эту задачу в cron, что заменяет ожидание пользователя нагрузкой на CPU во время выполнения cron-задач. В любом случае каждое исходное изображение создает несколько файлов превью разных размеров, поэтому фотобиблиотека увеличивает количество файлов и напрямую влияет на проблему с мелкими файлами, описанную выше. Большие исходные изображения также приводят к достижению лимита памяти, что отражается как Allowed memory size of 536870912 bytes exhausted в логе ошибок PHP. Ограничьте это с помощью preview_max_x и preview_max_y, вместо того чтобы постоянно увеличивать лимит.
Office. Collabora Online и OnlyOffice Docs запускаются как отдельные сервисы, обычно в виде отдельных контейнеров, со своей средой выполнения и своей памятью. Сессии редактирования документов потребляют CPU и RAM там, а не в PHP. Заложите один или два гигабайта памяти для обеспечения отзывчивости и ознакомьтесь с актуальными требованиями вендора на август 2026 года перед выбором размера сервера. Эти решения различаются не только потреблением ресурсов, и сравнение OnlyOffice и Collabora для self-hosting подробно описывает эти различия.
Talk. Звонки между несколькими участниками проходят по схеме peer-to-peer через WebRTC, а сервер лишь передает сигнальные сообщения. При количестве участников более четырех руководство Nextcloud рекомендует использовать High Performance Backend — отдельный сигнальный сервер. Многим сетям также требуется TURN-сервер (traversal using relays around NAT), например coturn, при этом медиапоток проходит через ваш VPS, поэтому пропускная способность канала становится важным фактором.
Полнотекстовый поиск. Инстанс Elasticsearch требует гигабайт или более оперативной памяти под свою кучу (heap) еще до начала индексации данных.
Сколько ресурсов VPS требуется для Nextcloud?
Оценка по количеству пользователей вводит в заблуждение, так как решающее значение имеет характер нагрузки. Пять разработчиков, синхронизирующих дерево исходного кода из 300,000 файлов, создают большую нагрузку, чем тридцать человек, открывающих документы в браузере. Используйте эти рекомендации как отправные точки для тестирования с учетом вашего объема файлов, а не как готовые метрики.
- 1 vCPU и 1–2 GB RAM: один или два пользователя, только файлы и календарь, жесткие ограничения на генерацию превью, без офисного пакета. Обновления и полное сканирование файлов будут выполняться крайне медленно.
- 2 vCPU и 4 GB RAM: примерно 5–15 активных пользователей, с использованием APCu, блокировок Redis, системного cron и генерацией превью через cron.
- 4 vCPU и 8 GB RAM: тот же диапазон пользователей плюс офисный пакет, либо 15–40 пользователей с низкой активностью без него. Основной расход оперативной памяти здесь приходится на офисные сессии.
- 4 или более vCPU и 16 GB RAM: использование Talk с High Performance Backend, полнотекстовый поиск или массовая генерация превью для большой фотобиблиотеки.
Дисковое пространство рассчитывается отдельно. Превью, версии файлов и корзина занимают место сверх объема основных данных, и их размер уменьшается только при корректной работе фоновых задач. Зависит ли экономическая выгода от стоимости подписки на облачные сервисы — зависит от этих цифр, и сравнение стоимости self-hosted хранилища с ценами Dropbox позволяет произвести этот расчет.
Какие ограничения Nextcloud являются конфигурационными, а какие — архитектурными
Их можно устранить за полдня: кэш памяти и блокировки Redis, отсутствующие индексы базы данных, режим фоновых задач, размер пула FPM и лимит памяти PHP, настройка OPcache, notify_push и границы генерации превью. Экземпляр с выполненными настройками работает совершенно иначе, чем стандартная установка на том же оборудовании.
Постоянные ограничения, которые не зависят от тюнинга:
- Один процесс на один запрос. Параллелизм ограничен объемом оперативной памяти, а один медленный запрос занимает воркер на всё время выполнения.
- Одна строка в базе данных на каждый файл, при этом размер и etag передаются вверх по дереву всех родительских каталогов. Стоимость обслуживания зависит от количества файлов.
- Один запрос на каждый файл при передаче по сети. Синхронизация множества мелких файлов ограничена накладными расходами на запросы, а не пропускной способностью канала.
- Платформа для совместной работы, внутри которой находится файловое приложение. Базовая конфигурация включает механизмы, которые никогда не загружаются в узкоспециализированных инструментах синхронизации.
- Последовательные обновления. Мажорные версии устанавливаются по очереди, в режиме обслуживания, с необходимостью проверки совместимости приложений на каждом этапе.
Ничто из этого не является ошибкой. Это цена наличия публичных ссылок, внешних соавторов, мобильных клиентов и единой системы учетных записей для всего функционала. Покупка корпоративной версии (Enterprise) дает поддержку и дополнительные приложения, но не меняет описанную выше модель обработки запросов, что подробно разъясняется в том, что на самом деле включает бесплатная версия Nextcloud.
Кому не стоит запускать Nextcloud на VPS
- Вам нужна только быстрая синхронизация большого дерева файлов между несколькими машинами. Инструменты peer-to-peer не хранят записи о каждом файле в базе данных веб-приложения, поэтому накладные расходы на обработку множества мелких файлов там выглядят иначе: сравнение Syncthing и Nextcloud для простой синхронизации.
- Вам нужны функции общего доступа и веб-интерфейс, но ваши данные — это миллионы мелких файлов. Seafile хранит содержимое в блочном хранилище, а не как отдельные файлы, что меняет математику производительности. Обратная сторона в том, что ваши данные перестают быть обычными файлами на диске: сравнение Seafile и Nextcloud.
- Вам нужен только просмотр файлов, уже находящихся на сервере, через браузер, без клиента синхронизации и без записей о каждом файле в базе данных. Для этого существуют более легкие файловые менеджеры для self-hosted.
- Ваша реальная задача — общий диск для четырех человек. Начните с более легких решений и расширяйте их по мере необходимости: self-hosted альтернативы Nextcloud.
- У вас 1 vCPU и 1 GB оперативной памяти, и вы хотите редактировать документы в браузере. Эта комбинация не подходит, и никакая настройка не поможет это исправить.
Запускайте Nextcloud, если вам нужен полноценный groupware: обмен файлами с людьми вне вашей организации, календарь и контакты на каждом телефоне, редактирование в браузере и единая учетная запись для всего этого. Проблемы с производительностью здесь обычно проявляются как постепенное замедление, а не как внезапный отказ. Количество файлов растет, в установке по-прежнему нет кэша и настроенного cron, и в один день открытие папки начинает занимать восемь секунд. Каждую часть этого процесса можно измерить, и большинство проблем можно устранить до того, как они станут критичными.
FAQ
Сколько пользователей может обслуживать один VPS с Nextcloud?
Это зависит скорее от характера нагрузки, чем от количества пользователей. Оптимизированный сервер с 2 vCPU и 4 GB RAM комфортно работает с 5–15 активными пользователями, использующими файлы, календарь и контакты. Добавление офисного пакета обычно требует 8 GB RAM. Первое ограничение, с которым вы столкнетесь, — это количество PHP-воркеров относительно доступной оперативной памяти или производительность базы данных при большом значении oc_filecache. Поэтому перед выбором тарифа протестируйте систему с вашим реальным количеством файлов.
Почему Nextcloud работает медленно при большом количестве мелких файлов?
Потому что каждый файл — это запись в базе данных и отдельный запрос WebDAV. Список файлов в папке — это SQL-запрос, запись файла обновляет его строку в БД, а также размер и etag всех родительских папок. Передача данных выполняется по одному файлу на HTTP-запрос, что требует каждый раз проходить аутентификацию и инициализацию фреймворка. Таким образом, нагрузка зависит от количества файлов, а не от их общего объема. Более быстрый накопитель ускоряет дисковые операции, но накладные расходы на каждый запрос сохраняются.
Нужен ли Redis для Nextcloud?
Для одного пользователя — нет. Для любого многопользовательского сценария — да. Без него транзакционная блокировка файлов выполняется через таблицу базы данных, что увеличивает нагрузку на запись и оставляет «зависшие» блокировки после завершения запроса, из-за чего пользователи видят ошибки о том, что файл заблокирован. Стандартная конфигурация — использование APCu для локального кэша и Redis для блокировок, параметры которых задаются в config.php.
Что будет, если не настроить фоновые задачи (background jobs) в Nextcloud?
В режиме по умолчанию (AJAX) одна задача выполняется при каждой загрузке страницы, поэтому, когда никто не авторизован, задачи не выполняются. Превью не генерируются заранее, версии файлов и корзина не очищаются, из-за чего диск постоянно заполняется, а уведомления по почте перестают отправляться. В панели администратора появится предупреждение о том, что последняя фоновая задача выполнялась несколько часов назад. Решение — переключиться на использование system cron с интервалом в пять минут; при установке в контейнерах для этого используется отдельный cron-контейнер.