Сколько RAM нужно для OpenProject
Официальный минимум OpenProject — 4 ГБ RAM, и по нему легко ошибиться в обе стороны: кто-то ставит именно 4 ГБ под команду в 20 человек и упирается в OOM-killer на первом же отчёте по диаграмме Ганта, кто-то берёт 16 ГБ «на всякий случай» для трёх пользователей и переплачивает вдвое. Разница в том, что OpenProject — это не одно Rails-приложение, а связка из пяти-шести процессов, и один из них (Elasticsearch) съедает фиксированный кусок памяти независимо от того, работает у вас один человек или полсотни. Разберём, из чего складывается расход, и сколько закладывать под конкретную команду.
Содержание
- Короткий ответ: сколько закладывать
- Из чего состоит стек OpenProject и почему Elasticsearch — не опция для галочки
- Что реально ест память: разбор по процессам
- Что двигает расход при росте команды
- Как замерить память на своём сервере
- Тюнинг под ограниченную память
- Какой сервер под OpenProject взять в MAATRIX
Обсудить статью, задать вопрос или начать новую тему
Есть вопрос по этой статье, идея для обсуждения или просто хотите поделиться опытом? Сообщество 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 |
| cron | 100–150 МБ | кратковременные всплески | Периодичность задач по расписанию, обычно не главный потребитель |
| Elasticsearch | 700 МБ–1 ГБ | зависит от ES_JAVA_OPTS | Заданный JVM heap (-Xms/-Xmx), почти не зависит от объёма данных на малых базах |
| PostgreSQL | 200–400 МБ | до shared_buffers | Объём базы, число одновременных соединений |
| Memcached | 30–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 ждёт. Для общения, пожалуйста, зарегистрируйтесь в нашем личном кабинете.
Перейти в сообщество →