MAATRIX / Блог / Сколько RAM нужно для OpenProject

Сколько RAM нужно для OpenProject

MAATRIX

Официальный минимум OpenProject — 4 ГБ RAM, и по нему легко ошибиться в обе стороны: кто-то ставит именно 4 ГБ под команду в 20 человек и упирается в OOM-killer на первом же отчёте по диаграмме Ганта, кто-то берёт 16 ГБ «на всякий случай» для трёх пользователей и переплачивает вдвое. Разница в том, что OpenProject — это не одно Rails-приложение, а связка из пяти-шести процессов, и один из них (Elasticsearch) съедает фиксированный кусок памяти независимо от того, работает у вас один человек или полсотни. Разберём, из чего складывается расход, и сколько закладывать под конкретную команду.

Обсудить статью, задать вопрос или начать новую тему

Есть вопрос по этой статье, идея для обсуждения или просто хотите поделиться опытом? Сообщество MAATRIX ждёт. Для общения, пожалуйста, зарегистрируйтесь в нашем личном кабинете.

Перейти в сообщество →

Короткий ответ: сколько закладывать

Цифры для установки через официальный openproject-deploy (ветка stable, актуальная линейка на конец лета 2026), стек Rails + Puma, PostgreSQL, Memcached, Elasticsearch, фоновый воркер на good_job.

RAMКому подходитЧестный комментарий
4 ГБФормальный минимум, 1–2 пользователя для оценкиElasticsearch и Postgres вместе уже забирают половину — под живую работу тесно
8 ГБ5–15 пользователей, несколько активных проектовРабочий стандарт для малой и средней команды
16 ГБ15–40 пользователей, диаграммы Ганта с сотнями задач, много вложенийКомфортный запас под пиковые отчёты и полнотекстовый поиск по файлам
32 ГБ40–100+ пользователей, несколько портфелей проектов одновременноАктуально, когда одновременно активны 15–25 человек, а не просто заведено 100 аккаунтов

Это ориентир, не гарантия. Реальный расход зависит от того, сколько кастомных полей и типов задач вы завели, сколько вложений проиндексировано и сколько человек одновременно смотрят один и тот же Ганта — у него не самые дешёвые запросы к базе.

Из чего состоит стек OpenProject и почему Elasticsearch — не опция для галочки

Официальный docker-compose (репозиторий opf/openproject-deploy) поднимает не два контейнера, а минимум шесть: web (само Rails-приложение поверх Puma), worker (фоновые задачи через good_job — начиная с 13-й линейки OpenProject перешёл на очередь на базе PostgreSQL и больше не тянет за собой отдельный Redis для джобов), cron (периодические rake-задачи — напоминания, LDAP-синхронизация), db (PostgreSQL), cache (Memcached, кеш Rails) и elasticsearch — полнотекстовый поиск по задачам, вики и содержимому вложений.

Ключевая деталь, которая ломает интуицию «раз джобы теперь в Postgres, значит стек полегчал»: Elasticsearch — это JVM-процесс со своей кучей, и она резервируется под конфигурацию, а не под объём данных. Пустой индекс на пустой инсталляции с одним пользователем занимает почти столько же памяти, сколько индекс на реальной базе с тысячей задач — разница в диске, не в RAM. Именно ES чаще всего оказывается тем самым «невидимым» потребителем, из-за которого 4 ГБ не хватает уже на старте.

Список контейнеров и их состояние — docker compose ps, а актуальное потребление каждого — docker stats --no-stream.

Нужен сервер под эту задачу?

Разверните VPS MAATRIX за пару минут: NVMe, AMD EPYC, root-доступ, локации UK, США, Франция и РФ. Оплата картой РФ и по СБП.

Арендовать сервер

Что реально ест память: разбор по процессам

Ориентировочные значения на установке с базовым набором проектов и без экзотических плагинов. Снимайте свои цифры — команда для этого ниже.

ПроцессВ покоеПод нагрузкойОт чего зависит
web (Puma-воркеры)400–600 МБ700 МБ–1,2 ГБЧисло воркеров (WEB_WORKERS), сложность отображаемых Ганта-представлений
worker (good_job)250–350 МБдо 500–600 МБЧисло фоновых задач в очереди — импорт, уведомления, экспорт в PDF/Excel
cron100–150 МБкратковременные всплескиПериодичность задач по расписанию, обычно не главный потребитель
Elasticsearch700 МБ–1 ГБзависит от ES_JAVA_OPTSЗаданный JVM heap (-Xms/-Xmx), почти не зависит от объёма данных на малых базах
PostgreSQL200–400 МБдо shared_buffersОбъём базы, число одновременных соединений
Memcached30–80 МБрастёт до лимита -mОбычно не главный потребитель
proxy/nginx + система150–250 МБ250–350 МББазовый оверхед ОС и обратного прокси

Главный вывод: на пустой инсталляции без единого пользователя уже занято 1,8–2,5 ГБ — Elasticsearch и Puma-воркеры на дежурстве, а не активная работа. Это архитектурная цена полнотекстового поиска и многопроцессной модели Rails, а не признак утечки или плохой конфигурации.

Что двигает расход при росте команды

Число заведённых аккаунтов почти не влияет на память напрямую — важно, сколько человек одновременно открыли интерфейс. На практике сильнее давят три фактора.

Число Puma-воркеров. Каждый воркер — это полноценный процесс Rails с загруженным приложением, а не лёгкий поток. По умолчанию deploy-конфиг считает их от числа vCPU; на 4-ядерной машине это обычно 2–4 воркера, то есть 800 МБ–1,6 ГБ только под веб-слой ещё до первого запроса.

Диаграммы Ганта и отчёты с большим числом задач. Представление с несколькими сотнями задач, зависимостями и фильтрами по нескольким проектам сразу — это тяжёлые SQL-запросы с джойнами по иерархии work packages. Разовый всплеск потребления памяти на стороне Puma-воркера, который его обрабатывает, может доходить до пары сотен мегабайт сверх обычного — и это нормально, если не происходит постоянно у всех воркеров одновременно.

Вложения и полнотекстовая индексация. Каждый загруженный файл, если включена индексация содержимого, проходит через Elasticsearch — сам файл не хранится в памяти постоянно, но пиковая нагрузка на индексацию больших PDF или Excel-файлов заметна именно на ES-контейнере в момент загрузки, а не на Rails-приложении.

Кастомные типы задач и поля. Каждый добавленный тип work package и custom field увеличивает метаданные, которые Rails кеширует при старте каждого воркера — для десятка-другого кастомных полей это не критично, но при активном использовании прикладных плагинов Enterprise-редакции стоит закладывать запас отдельно.

Как замерить память на своём сервере

Не берите цифры из таблиц выше как окончательные — снимите свои.

Сколько ест каждый контейнер прямо сейчас:

docker stats --no-stream --format "table {{.Name}}\t{{.MemUsage}}\t{{.CPUPerc}}"

Пиковое потребление контейнера за время работы, а не текущее — тарифицировать нужно по худшему моменту:

docker exec openproject-web-1 cat /sys/fs/cgroup/memory.peak

Реальный heap Elasticsearch — если он настроен на автоматическое масштабирование под контейнер, лучше проверить фактическое использование, а не доверять дефолту:

curl -s localhost:9200/_nodes/stats/jvm | python3 -m json.tool | grep -A3 heap_used

Размер базы PostgreSQL:

SELECT pg_size_pretty(pg_database_size('openproject'));

Доступная память, а не «свободная»: free -m, колонка available — Linux честно отдаёт незанятую память под дисковый кеш Postgres и файлов, это не признак нехватки RAM.

Тюнинг под ограниченную память

Если тариф уже куплен и есть 4–6 ГБ, вот что реально снижает расход без потери функциональности.

Урезать JVM heap Elasticsearch осознанно, а не оставлять автоопределение по размеру контейнера — для малых команд 512 МБ обычно достаточно, ниже уже рискованно для стабильности самого ES:

# в .env deploy-конфига
ES_JAVA_OPTS=-Xms512m -Xmx512m

Уменьшить число Puma-воркеров, если сервер на 2 vCPU и команда до 10 человек:

# .env
WEB_WORKERS=2

Ограничить лимит Memcached явно, а не оставлять значение по умолчанию, которое может быть избыточным для маленькой базы:

# docker-compose.yml, сервис cache
command: memcached -m 64

Задать shared_buffers PostgreSQL вручную — на сервере, где Postgres делит память с остальным стеком, безопаснее фиксированные 256–512 МБ, чем автонастройка на 25% RAM всей машины. Общий подход к тюнингу базы разобран в статье про настройку PostgreSQL на VPS.

Добавить swap как подушку, не как замену RAM — 2 ГБ swap спасают от OOM-killer в момент разового пика на тяжёлом отчёте, ценой замедления именно в этот момент:

fallocate -l 2G /swapfile && mkswap /swapfile && swapon /swapfile
echo 'vm.swappiness=10' >> /etc/sysctl.conf

Если для команды до 5 человек полнотекстовый поиск по содержимому вложений не критичен, можно временно не поднимать сервис elasticsearch вовсе — базовая работа с задачами, статусами и фильтрами через Postgres при этом сохраняется, теряется только поиск по тексту внутри файлов.

Какой сервер под OpenProject взять в MAATRIX

Знакомство и тест: 2 vCPU, 4 ГБ RAM, 40 ГБ NVMe. Хватит поставить стек, пройти мастер настройки и завести пару проектов. Для повседневной работы даже небольшой командой тесно — Elasticsearch и Puma-воркеры на дежурстве уже занимают половину памяти.

Малая и средняя команда, 5–15 человек: 4 vCPU, 8 ГБ RAM, 80 ГБ NVMe. Комфортный вариант для нескольких проектов с диаграммами Ганта, ролями и вложениями. Ядра важны не меньше памяти — Elasticsearch и SQL-запросы по иерархии задач процессорозависимы.

Крупная команда, 15–40 человек, несколько портфелей: 6–8 vCPU, 16 ГБ RAM, от 160 ГБ NVMe. Запас нужен под пиковые отчёты по нескольким проектам одновременно и индексацию большого объёма вложений.

Локация. Для команды, работающей преимущественно из России, разумнее российская площадка — меньше задержка на каждое действие в интерфейсе, который живёт постоянным обменом с сервером. Данные по 152-ФЗ — дополнительный аргумент в пользу РФ; для распределённых команд с частью сотрудников за рубежом рабочий компромисс — Лондон.

OpenProject из каталога apps.maatrix.io разворачивается на сервере автоматически при заказе — Docker, все шесть контейнеров стека и доступ администратора приходят готовыми в личный кабинет. Донастройка под свою нагрузку — число воркеров, heap Elasticsearch, буферы Postgres — по инструкциям выше, подробный пошаговый разбор установки есть в статье как установить и настроить OpenProject на VPS. Оплата принимается картами российских банков, по СБП, криптовалютой и токеном MAAT, включая зарубежные локации без иностранной карты.

Нужен сервер под эту задачу?

Разверните VPS MAATRIX за пару минут: NVMe, AMD EPYC, root-доступ, локации UK, США, Франция и РФ. Оплата картой РФ и по СБП.

Арендовать сервер

Нужны сами нейросети для контента?

Генерируйте изображения, видео и озвучку нейросетями на falapi.io — десятки моделей в одном окне. Оплата картой РФ и по СБП.

Частые вопросы

Хватит ли 4 ГБ RAM, если пользователь один?

Формально да, но с оговорками: урежьте ES_JAVA_OPTS до 512 МБ, WEB_WORKERS до 1–2 и добавьте 2 ГБ swap — иначе первый же импорт крупного проекта через API рискует упереться в OOM.

Почему OpenProject ест память даже когда никто не работает?

Шесть дежурных контейнеров (web, worker, cron, Postgres, Memcached, Elasticsearch) держат базовый оверхед 1,8–2,5 ГБ независимо от активности — это цена архитектуры с полнотекстовым поиском, а не утечка.

Можно ли обойтись без Elasticsearch, чтобы сэкономить память?

Да, для малых команд, которым не критичен поиск по содержимому вложений: базовая работа с задачами и фильтрами через Postgres сохраняется, но глобальный полнотекстовый поиск пропадёт.

Диаграмма Ганта с сотнями задач заметно увеличивает расход RAM?

Не постоянно, а точечно: сам рендер происходит в основном в браузере, но сложный отчёт с фильтрами по нескольким проектам и иерархии задач — это тяжёлый SQL-запрос, который на несколько секунд поднимает память конкретного Puma-воркера на пару сотен мегабайт.

Что упадёт первым при нехватке памяти — OpenProject или Elasticsearch?

OOM-killer выбирает процесс с наибольшим потреблением на момент пика, чаще это JVM-процесс Elasticsearch из-за фиксированного heap. Если контейнер поиска сам перезапускается без явной причины в логах приложения — смотрите dmesg -T | grep -i kill.

Обсудить статью, задать вопрос или начать новую тему

Есть вопрос по этой статье, идея для обсуждения или просто хотите поделиться опытом? Сообщество MAATRIX ждёт. Для общения, пожалуйста, зарегистрируйтесь в нашем личном кабинете.

Перейти в сообщество →