MAATRIX / Блог / Как установить и настроить OpenProject на VPS

Как установить и настроить OpenProject на VPS

MAATRIX

Когда команда вырастает из Trello и общих таблиц, а Jira кажется избыточно дорогой и облачной, встаёт вопрос: где вести проекты с диаграммами Ганта, бюджетами и ролями, не отдавая данные в чужое облако. OpenProject закрывает эту нишу — open-source система с полноценным управлением портфелем проектов, которую можно развернуть на своём VPS за час и полностью контролировать. Ниже — рабочая пошаговая установка через Docker Compose, настройка HTTPS, ролей и бэкапов.

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

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

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

Что такое OpenProject и зачем разворачивать его на своём сервере

OpenProject — это self-hosted платформа управления проектами уровня enterprise: диаграммы Ганта с зависимостями задач, канбан-доски, бэклог и спринты в духе Scrum, учёт трудозатрат, бюджеты, кастомные поля и матрица ролей с гибкими правами доступа. В отличие от лёгких канбан-досок вроде Wekan, OpenProject рассчитан именно на крупные команды и сложные проекты с несколькими модулями одновременно — это его сильная сторона и одновременно причина, по которой он требовательнее к ресурсам.

Смысл self-host здесь простой: данные о клиентах, сроках и бюджетах остаются на вашем сервере, а не в облаке стороннего SaaS с подпиской «за голову». Для команды от 15-20 человек экономия на лицензиях за год обычно перекрывает стоимость аренды сервера в разы.

Есть и обратная сторона — если вам нужна просто доска задач для команды из 3-5 человек, OpenProject будет избыточен по ресурсам и сложности интерфейса. В этом случае разумнее посмотреть на более лёгкие инструменты — например, Taiga с похожей логикой Scrum-досок, но заметно скромнее по требованиям к железу.

Требования к серверу и подготовка VPS

Официально разработчики OpenProject указывают минимум 2 vCPU и 4 ГБ RAM для тестового запуска, но на практике под живую нагрузку с несколькими проектами и активными пользователями комфортнее себя чувствует конфигурация от 4 vCPU и 8 ГБ RAM — Rails-приложение, PostgreSQL, Elasticsearch (полнотекстовый поиск) и Memcached в связке потребляют заметно больше, чем кажется на бумаге. Под диск закладывайте минимум 40-50 ГБ SSD с запасом на вложения к задачам и бэкапы БД — они растут быстрее, чем ожидаешь.

Для установки понадобится чистый VPS с Ubuntu 24.04 или Debian 12, доступ по SSH с правами sudo и доменное имя, указывающее A-записью на IP сервера — без домена не получится выпустить нормальный SSL-сертификат.

Проверьте базовые вещи перед стартом:

# Обновляем систему
sudo apt update && sudo apt upgrade -y

# Проверяем, что домен резолвится на нужный IP
dig +short your-domain.example

Если брандмауэр ещё не настроен, сделайте это сразу — открытые 80/443 порты и закрытое всё остальное снаружи снимут половину рисков ещё до того, как вы установите первый сервис. Логику настройки правил подробно разбирали в статье про firewall UFW на VPS.

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

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

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

Установка Docker и запуск OpenProject через Docker Compose

Официальный и самый предсказуемый способ развернуть OpenProject — готовый docker-compose из репозитория openproject-deploy. Он поднимает разом веб-приложение, PostgreSQL, Memcached, Elasticsearch и фоновые воркеры одной командой.

Сначала ставим Docker, если его ещё нет:

curl -fsSL https://get.docker.com | sudo sh
sudo usermod -aG docker $USER
newgrp docker
docker --version
docker compose version

Дальше забираем конфиг deploy-репозитория. Используйте ветку stable, актуальную на момент установки — номер мажорной версии на GitHub меняется, проверьте список веток в репозитории opf/openproject-deploy перед тем, как копировать команду:

mkdir -p ~/openproject && cd ~/openproject
curl -O https://raw.githubusercontent.com/opf/openproject-deploy/stable/17/compose/docker-compose.yml
curl -O https://raw.githubusercontent.com/opf/openproject-deploy/stable/17/compose/.env.example
mv .env.example .env

Откройте .env и заполните ключевые параметры:

OPENPROJECT_HOST__NAME=pm.your-domain.example
OPENPROJECT_HTTPS=true
OPENPROJECT_SECRET_KEY_BASE=замените_на_сгенерированный_ключ
OPENPROJECT_DEFAULT__LANGUAGE=ru
OPENPROJECT_RAILS__CACHE__STORE=memcache

Секретный ключ сгенерируйте отдельно и вставьте вместо плейсхолдера:

openssl rand -hex 64

Запускаем стек:

docker compose up -d
docker compose logs -f web

Первый старт занимает несколько минут — контейнер накатывает миграции базы данных и прогревает Elasticsearch-индекс. Дождитесь в логах строки о готовности Puma-сервера, прежде чем идти в браузер.

HTTPS, домен и реверс-прокси

В docker-compose-конфиге OpenProject уже есть встроенный сервис-прокси (Traefik) с автоматическим выпуском Let's Encrypt-сертификата — в большинстве случаев достаточно указать домен в OPENPROJECT_HOST__NAME и почту для Let's Encrypt в переменной OPENPROJECT_LETS__ENCRYPT__EMAIL, и сертификат выпустится сам при первом обращении по HTTPS.

Если у вас на сервере уже крутятся другие сайты и вы предпочитаете единую точку входа, логичнее вынести встроенный прокси и повесить OpenProject за собственным Nginx — так проще управлять несколькими доменами и сертификатами централизованно. В docker-compose.yml меняем публикацию портов прокси-сервиса на локальный интерфейс:

services:
  proxy:
    ports:
      - "127.0.0.1:8090:80"
      - "127.0.0.1:8443:443"

А со стороны Nginx настраиваем проксирование на 127.0.0.1:8090 с заголовками, которые OpenProject ожидает для корректной работы за прокси (X-Forwarded-Proto, X-Forwarded-Host). Подробный разбор конфига реверс-прокси с примерами для похожих Rails/Docker-приложений есть в статье Nginx как реверс-прокси на VPS, а сам выпуск и продление сертификатов Let's Encrypt отдельно разобран в материале про настройку SSL на VPS.

Первый вход, администратор и базовая настройка

После запуска стека открываем https://pm.your-domain.example — интерфейс встретит формой входа. Дефолтные учётные данные администратора при первой установке: логин admin, пароль admin — система сразу потребует сменить пароль при первом входе, не откладывайте это.

Первое, что стоит сделать после входа:

  • Настроить исходящую почту — в разделе Administration → Emails указываем SMTP-сервер (например, ваш почтовый сервис или внешний SMTP-релей), иначе уведомления о задачах не будут доходить до участников.
  • Создать организационную структуру — глобальные роли, группы пользователей по отделам, шаблоны проектов под типовые сценарии (разработка, маркетинг, внедрение).
  • Включить нужные модули — по умолчанию активны не все возможности; в настройках проекта включите Backlogs (Scrum-доски) или Gantt chart, если планируете ими пользоваться.
  • Настроить SSO, если в компании уже есть LDAP или OAuth-провайдер — Community-редакция поддерживает базовую LDAP-аутентификацию из коробки.

Импорт данных из другой системы (Jira, Trello, Asana) в OpenProject напрямую не такой гладкий, как хотелось бы — готового универсального импортёра под все форматы нет, чаще всего приходится либо переносить задачи вручную через CSV-импорт work packages, либо писать небольшой скрипт под REST API. Закладывайте на миграцию отдельное время, если переезжаете с боевого проекта.

Диаграммы Ганта, роли и рабочие процессы для крупной команды

Ключевая причина выбирать именно OpenProject, а не более простые канбан-доски, — это связка модулей, которая работает вместе, а не по отдельности.

Диаграмма Ганта в OpenProject не статичная картинка, а рабочий инструмент: задачи можно перетаскивать прямо на шкале, зависимости («после», «до», «блокирует») пересчитывают даты связанных задач автоматически, а изменение сроков родительской задачи каскадно сдвигает подзадачи. Для проектов с десятками параллельных потоков это ощутимо экономит время координатора по сравнению с ручным пересчётом в таблице.

Роли настраиваются гранулярно на уровне проекта, а не только глобально:

УровеньЧто настраивается
Глобальная рольДоступ к администрированию, создание проектов, управление пользователями
Роль в проектеПросмотр/редактирование задач, управление бюджетом, работа с диаграммой Ганта
Права на work packageКто может менять статус, назначать исполнителя, видеть трудозатраты
Рабочий процесс (workflow)Допустимые переходы между статусами задачи для каждой роли отдельно

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

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

Обновление, бэкапы и обслуживание

Docker Compose делает обновление предсказуемым: обновляете версию образа в docker-compose.yml (или подтягиваете новую стабильную ветку deploy-репозитория) и пересоздаёте контейнеры:

cd ~/openproject
docker compose pull
docker compose up -d

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

Бэкап в контейнерной установке — это по сути дамп PostgreSQL плюс каталог с вложениями:

# Дамп базы данных
docker compose exec db pg_dump -U openproject -Fc openproject_production > openproject_$(date +%F).dump

# Архив с загруженными файлами (вложения к задачам)
docker run --rm -v openproject_opdata:/data -v $(pwd):/backup alpine \
  tar czf /backup/opdata_$(date +%F).tar.gz -C /data .

Оба файла стоит копировать за пределы сервера — на объектное хранилище или на отдельный бэкап-сервер, а не оставлять единственную копию рядом с работающим контейнером. Схему регулярного автоматического бэкапа с ретенцией и шифрованием разбирали в статье про настройку BorgBackup на VPS — тот же подход прямо подходит и для дампов OpenProject.

Отдельно проверяйте место на диске раз в пару недель — Elasticsearch-индекс и логи PostgreSQL со временем накапливаются, и без ротации логов диск может забиться незаметно, особенно на серверах с 40 ГБ SSD.

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

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

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

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

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

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

Сколько человек может одновременно работать в OpenProject на VPS с 4 ГБ RAM?

Формально система запустится, но на 4 ГБ комфортно работает небольшая команда до 10-15 человек с умеренной активностью. При росте числа проектов и одновременных пользователей Elasticsearch и Rails начинают конкурировать за память — переходите на 8 ГБ раньше, чем почувствуете тормоза в интерфейсе.

Можно ли использовать OpenProject без Elasticsearch, чтобы сэкономить ресурсы?

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

Чем OpenProject принципиально отличается от Redmine, на котором он исторически основан?

OpenProject — форк Redmine, но давно разошёлся архитектурно: современный веб-интерфейс на Angular, встроенные диаграммы Ганта с drag-and-drop вместо read-only картинки, модуль бюджетирования и более гибкие роли. Community-редакция бесплатна и покрывает большинство сценариев, платная Enterprise-версия добавляет 2FA, кастомные поля отчётов и приоритетную поддержку.

Нужен ли отдельный сервер под Elasticsearch при росте команды?

Пока речь о десятках-сотнях проектов и обычной текстовой нагрузке — нет, штатной конфигурации в одном docker-compose стеке хватает. Разносить компоненты по отдельным серверам имеет смысл, только если у вас счёт на тысячи активных проектов и заметная деградация отклика поиска.

Как перенести уже настроенный OpenProject на другой VPS?

Останавливаете контейнеры, копируете дамп PostgreSQL и volume с вложениями (docker cp или tar по примеру из раздела про бэкапы) на новый сервер, поднимаете тот же docker-compose стек и восстанавливаете оба файла перед первым стартом контейнеров.

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

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

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