Plane на Ubuntu 24.04: пошаговая установка
Если команда упёрлась в лимиты бесплатного тарифа Linear или устала платить за Jira Cloud по числу пользователей, логичный шаг — поставить трекер задач на свой сервер. Plane — open-source альтернатива с досками, спринтами, циклами и модулями, которая закрывает почти весь функционал коммерческих аналогов и при этом хранит все данные там, где скажете вы. Ниже — рабочая установка на чистом Ubuntu 24.04 через официальный Docker-based деплой, с нюансами, которые не всегда написаны в документации.
Содержание
Обсудить статью, задать вопрос или начать новую тему
Есть вопрос по этой статье, идея для обсуждения или просто хотите поделиться опытом? Сообщество MAATRIX ждёт. Для общения, пожалуйста, зарегистрируйтесь в нашем личном кабинете.
Перейти в сообщество →Что такое Plane и зачем ставить его самому
Plane — трекер задач с открытым кодом (лицензия AGPL-3.0 для self-hosted версии), который развивается достаточно активно: команда регулярно выпускает обновления, добавляет циклы (аналог спринтов), модули (группировка задач по фичам), Kanban- и списочные представления, а также базовую аналитику по проекту. Из коробки есть API, есть импорт из Jira и Linear, есть интеграция с GitHub.
Причины ставить self-hosted вариант обычно такие:
- Данные остаются у вас — код, задачи, вложения и переписка по багам не уходят на чужие серверы, что критично для команд с NDA или закрытыми продуктами.
- Нет лимита на пользователей — платите за сервер, а не за каждого разработчика в команде.
- Контроль над бэкапами и доступом — сами решаете, как часто бэкапить БД и кто получает SSH.
Обратная сторона: обновления и мониторинг — тоже ваша забота. Plane развивается быстро, и между мажорными версиями бывают breaking changes в схеме БД, так что процедуру апгрейда стоит проверять в тестовом окружении, а не сразу на проде.
Требования к серверу
Официальный self-hosted деплой Plane собран из полутора десятков контейнеров: веб-фронтенд, API-бэкенд, воркеры, PostgreSQL, Redis, RabbitMQ и MinIO для хранения файлов. Это не лёгкий сервис — закладывайте запас по памяти.
| Ресурс | Минимум (команда 5-10 чел.) | Рекомендуется (команда 20-50 чел.) |
|---|---|---|
| CPU | 2 vCPU | 4 vCPU |
| RAM | 4 ГБ | 8 ГБ |
| Диск | 40 ГБ SSD/NVMe | 80+ ГБ NVMe |
| ОС | Ubuntu 24.04 LTS | Ubuntu 24.04 LTS |
На 2 ГБ RAM контейнеры стартуют, но при первой же реиндексации или экспорте проекта сервис начинает падать по OOM — проверено на практике, лучше сразу брать 4 ГБ как жёсткий минимум. Если планируете держать на этом же сервере ещё что-то (например, CI-раннер или второй сервис), закладывайте RAM с запасом отдельно под них.
Нужен сервер под эту задачу?
Разверните VPS MAATRIX за пару минут: NVMe, AMD EPYC, root-доступ, локации UK, США, Франция и РФ. Оплата картой РФ и по СБП.
Арендовать серверПодготовка сервера и установка Docker
Начинаем с обновления системы и установки Docker Engine с плагином Compose — без него ничего дальше не будет работать.
apt update && apt upgrade -y
apt install -y ca-certificates curl gnupg git
Если Docker ещё не стоит, ставим его официальным способом — репозиторий Docker, а не пакет docker.io из Ubuntu (он часто устаревший). Подробный разбор с типичными граблями есть в статье про установку Docker на Ubuntu с нуля, здесь — короткая версия:
install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
chmod a+r /etc/apt/keyrings/docker.asc
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu \
$(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \
tee /etc/apt/sources.list.d/docker.list > /dev/null
apt update
apt install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
Проверяем, что всё встало:
docker --version
docker compose version
Заодно откройте порты в файрволе, если используете ufw: 22 (SSH), 80 и 443 (HTTP/HTTPS, если будете вешать домен и SSL через прокси).
ufw allow 22/tcp
ufw allow 80/tcp
ufw allow 443/tcp
ufw enable
Скачивание и настройка Plane
Официальный установщик Plane тянет весь стек через один Compose-файл и скрипт-обёртку. Клонируем репозиторий с деплой-конфигом:
mkdir -p /opt/plane
cd /opt/plane
curl -fsSL -o setup.sh https://raw.githubusercontent.com/makeplane/plane/master/deploy/selfhost/install.sh
chmod +x setup.sh
Скрипт установщика интерактивный — предложит выбрать действие (install/upgrade/start/stop) и создаст рабочую директорию plane-app с файлами docker-compose.yaml и plane.env. Запускаем установку:
./setup.sh
Выбираем пункт Install. Скрипт скачает нужные образы, сгенерирует plane.env со случайными секретами (ключи шифрования, пароли для Postgres/Redis/MinIO) и предложит указать домен или IP, по которому будет доступен интерфейс.
Если хотите проверить или поправить настройки вручную, файл окружения лежит в plane-app/plane.env. Основные параметры, на которые стоит взглянуть:
# plane-app/plane.env — ключевые переменные
WEB_URL=http://ваш-ip-или-домен
DEBUG=0
CORS_ALLOWED_ORIGINS=http://ваш-ip-или-домен
# Пароли к Postgres/Redis/MinIO сгенерированы автоматически —
# не переносите их в другой env-файл без пересоздания volume,
# иначе БД и хранилище "не узнают" новые пароли
Важный нюанс: если после первой установки вы вручную поменяете пароль к Postgres в plane.env, контейнер PostgreSQL всё равно продолжит работать со старым паролем, который был при инициализации volume. Менять секреты нужно либо до первого старта, либо через docker compose exec с ручным ALTER USER.
Запуск и первичная настройка
Если использовали setup.sh, стек уже поднят — проверяем состояние контейнеров:
cd /opt/plane/plane-app
docker compose ps
Ожидаем увидеть в списке примерно такие сервисы: web, api, worker, beat-worker, migrator, plane-db (PostgreSQL), plane-redis, plane-mq (RabbitMQ), plane-minio, proxy (nginx-прослойка перед всем стеком). Все — в статусе Up, кроме migrator, который отрабатывает миграции и завершается (Exited (0)).
Если что-то не поднялось, смотрим логи конкретного сервиса:
docker compose logs -f api
docker compose logs -f migrator
Первый запуск API занимает время — контейнер ждёт готовности Postgres и Redis, применяет миграции, только потом стартует. Дайте стеку 1-2 минуты после docker compose up -d, прежде чем паниковать из-за ошибок соединения в логах веб-сервиса.
Когда всё поднялось, открываем в браузере http://ваш-ip (или домен, если настроили). Первый вход создаёт workspace-администратора — email и пароль, которые дальше используются для входа всей команде через инвайты.
Настройка домена и HTTPS
Встроенный proxy-контейнер в Compose-стеке Plane — это nginx, который слушает 80-й порт и раздаёт статику плюс проксирует API. Он не умеет сам выпускать SSL-сертификаты, поэтому для HTTPS есть два практичных варианта:
Вариант 1 — Caddy перед Plane. Проще всего поставить Caddy на хост-систему (не в докере, либо отдельным контейнером на других портах) и прокинуть через него 443 на локальный 80-й порт Plane. Подробный разбор автоматического SSL описан в статье про Caddy с авто-SSL на Ubuntu 24.04. Конфиг для Plane выглядит примерно так:
# /etc/caddy/Caddyfile
tracker.вашдомен.ru {
reverse_proxy localhost:80
}
После правки конфига перезапускаем Caddy — сертификат Let's Encrypt выпустится и обновится автоматически:
systemctl reload caddy
Вариант 2 — Nginx + Certbot классической связкой, если Caddy не входит в ваш стек. Логика та же: отдельный веб-сервер на хосте слушает 443 и проксирует на 80-й порт, где висит Plane.
После настройки домена не забудьте обновить WEB_URL и CORS_ALLOWED_ORIGINS в plane.env на https://ваш-домен и перезапустить стек:
docker compose down
docker compose up -d
Иначе интерфейс будет пытаться ходить за API по старому http-адресу и ловить ошибки CORS в консоли браузера.
Бэкап данных
В Plane три места, где хранятся живые данные: PostgreSQL (задачи, проекты, пользователи), MinIO (вложения и файлы) и Redis (кеш и очереди — переживать за него не нужно, он восстанавливаемый). Бэкапить нужно первые два.
Дамп PostgreSQL из контейнера:
docker compose exec plane-db pg_dump -U plane plane > /opt/plane/backups/plane-db-$(date +%F).sql
Для MinIO проще всего бэкапить весь volume, где лежат объекты — путь можно посмотреть через docker volume inspect, либо использовать mc mirror, если ставили клиент MinIO. Общий подход к бэкапу Docker-томов и частые ошибки на этом пути разобраны в статье про бэкап Docker volume — рекомендации оттуда применимы и к volume Plane напрямую.
Простой вариант — обернуть оба шага в скрипт и повесить на cron:
#!/bin/bash
# /opt/plane/backup.sh
DATE=$(date +%F)
mkdir -p /opt/plane/backups
docker compose -f /opt/plane/plane-app/docker-compose.yaml exec -T plane-db \
pg_dump -U plane plane > /opt/plane/backups/plane-db-$DATE.sql
tar czf /opt/plane/backups/plane-minio-$DATE.tar.gz \
-C /var/lib/docker/volumes/plane-app_uploads/_data .
find /opt/plane/backups -mtime +14 -delete
Путь к volume MinIO может отличаться в зависимости от версии установщика — уточните его через docker volume ls | grep plane, прежде чем прописывать в скрипт.
Если решите, что PostgreSQL для Plane лучше держать вынесенным отдельным сервисом (например, для более гибких бэкапов через pg_basebackup или репликацию), общий процесс установки актуальной версии PostgreSQL на Ubuntu 24.04 описан в отдельной статье — но для старта штатной связки внутри Compose обычно достаточно.
Обновление Plane
Plane выпускает обновления регулярно, иногда с изменениями схемы БД. Перед апгрейдом на проде — сделайте свежий дамп PostgreSQL (см. выше), это единственный шаг, которым нельзя пренебрегать.
Стандартный путь обновления через тот же установщик:
cd /opt/plane
./setup.sh
# выбираем пункт Upgrade
Скрипт подтянет новые образы и применит миграции автоматически через контейнер migrator. После обновления стоит проверить логи api и migrator на ошибки, прежде чем сообщать команде, что можно возвращаться к работе.
Если апгрейд идёт не через скрипт, а вручную, порядок такой: docker compose pull, затем docker compose up -d — контейнер migrator отработает миграции при старте раньше, чем поднимется api.
Нужен сервер под эту задачу?
Разверните VPS MAATRIX за пару минут: NVMe, AMD EPYC, root-доступ, локации UK, США, Франция и РФ. Оплата картой РФ и по СБП.
Арендовать серверНужны сами нейросети для контента?
Генерируйте изображения, видео и озвучку нейросетями на falapi.io — десятки моделей в одном окне. Оплата картой РФ и по СБП.
Частые вопросы
Сколько человек потянет минимальная конфигурация в 4 ГБ RAM?
На практике комфортно работает команда до 10-15 человек при умеренной активности. Больше — лучше сразу закладывать 8 ГБ, особенно если активно используются вложения и импорт больших проектов.
Можно ли перенести данные из Jira или Linear?
Да, в интерфейсе Plane есть встроенные импортёры для Jira и Linear — они переносят задачи, статусы и часть метаданных, но не переносят историю комментариев и вложения полностью один в один. Перед миграцией всей команды стоит протестировать импорт на тестовом workspace.
Нужен ли отдельный сервер под Plane или можно на том же, где крутятся другие сервисы?
Если ресурсов достаточно (см. таблицу выше) и нет конфликтов по портам 80/443, Plane спокойно уживается рядом с другими Docker-стеками — просто следите за суммарной нагрузкой на диск и RAM.
Что делать, если после установки интерфейс открывается, но зависает на загрузке проектов?
В 9 случаях из 10 причина — неправильный WEB_URL/CORS_ALLOWED_ORIGINS в plane.env, не совпадающий с реальным адресом в браузере. Проверьте консоль браузера на CORS-ошибки и синхронизируйте переменные с фактическим доменом.
Есть ли лимит на количество проектов или задач в self-hosted версии?
Технических лимитов нет — упираетесь только в ресурсы сервера (в первую очередь в производительность PostgreSQL и MinIO при больших объёмах вложений).
Обсудить статью, задать вопрос или начать новую тему
Есть вопрос по этой статье, идея для обсуждения или просто хотите поделиться опытом? Сообщество MAATRIX ждёт. Для общения, пожалуйста, зарегистрируйтесь в нашем личном кабинете.
Перейти в сообщество →