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

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

MAATRIX

Команда выросла из трекера на коленке в Trello или гугл-таблицах, а платить за каждого участника в Linear или Jira Cloud — жалко и неудобно, особенно если карта не работает с зарубежными сервисами. Plane закрывает эту проблему: открытый трекер задач с досками, спринтами, циклами и модулями, который можно поставить на свой сервер и не зависеть от чужих лимитов и биллинга. Дальше — пошагово: что нужно от сервера, как поднять Plane через Docker Compose, подключить домен с SSL и не потерять данные при обновлении.

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

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

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

Что такое Plane и кому он подходит

Plane — open-source продукт-трекер (issue tracker / project management), который по интерфейсу и логике ближе всего к Linear: быстрые клавиатурные шорткаты, чистые доски, циклы (cycles) вместо привычных спринтов, модули для группировки задач по фичам. Из коробки есть Kanban-доска, список задач, таймлайн, спринты, права доступа по ролям, публичные ссылки на отдельные issue и «God Mode» — панель администратора инстанса.

Для кого это имеет смысл:

  • команды, которым нужна собственная инфраструктура (юридические требования к данным, корпоративная политика, санкционные ограничения на оплату зарубежных SaaS);
  • те, кто перерос Trello/Wekan, но не готов платить за Jira или Linear за каждого пользователя;
  • агентства и студии, которым нужно множество проектов с разделением по клиентам.

Если нужен более простой канбан без циклов и модулей — присмотритесь к Wekan, он легче и разворачивается быстрее. Plane тяжелее (полноценный бэкенд на Django, фронтенд на Next.js, своя очередь задач), зато ближе к продуктовым трекерам вроде Linear.

Требования к серверу

Plane self-host — это не один контейнер, а связка из нескольких сервисов: веб-фронтенд, публичный space-модуль, admin-панель, API на Django, воркер очередей, планировщик задач (beat), PostgreSQL, Redis, MinIO (S3-совместимое хранилище файлов) и внутренний nginx-прокси, который сшивает всё это на одном порту. Отсюда и требования к железу.

Размер командыvCPURAMДиск
До 10 человек, пробный запуск24 GB30 GB SSD
10–30 человек, рабочая эксплуатация48 GB50 GB SSD
30+ человек, много вложений/файлов4–816 GB80+ GB SSD

Это ориентир из практики похожих self-host стеков (Django + Next.js + Postgres + Redis в одном docker compose), а не официальный бенчмарк — у вас цифры могут отличаться в зависимости от активности команды и объёма вложений в задачах. Меньше 4 GB RAM брать не стоит: при сборке фронтенда и одновременной работе миграций Postgres контейнеры начинают падать по OOM. Из ОС нужен современный Ubuntu 24.04 или Debian 12 — на них и Docker ставится предсказуемо, и репозитории пакетов свежие.

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

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

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

Подготовка сервера: Docker, домен и порты

Перед установкой Plane на сервере должны быть готовы Docker и Docker Compose plugin, а также домен (или поддомен), направленный на IP сервера — это нужно для нормального HTTPS и для того, чтобы фронтенд и API обращались друг к другу по правильному адресу, а не по «голому» IP.

Если Docker ещё не стоит, ставим его официальным скриптом:

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

Заведите A-запись у себя в DNS-панели, например plane.example.com → 203.0.113.10, и подождите распространения (обычно от нескольких минут до пары часов). Как правило, к этому моменту домен уже привязан к серверу, но если делаете это с нуля — процесс тот же, что описан в статье про настройку домена и DNS с нуля.

Заранее откройте в файрволе только нужные порты — 22 (SSH), 80 и 443 (HTTP/HTTPS). Внутренний nginx-контейнер Plane слушает 80-й порт хоста по умолчанию, и именно на него позже будет смотреть внешний reverse proxy:

sudo ufw allow 22/tcp
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw enable

Установка Plane через официальный установщик

Официальный способ развернуть self-hosted Plane — установочный скрипт из репозитория проекта, который сам подтягивает docker-compose.yaml и файл переменных окружения, а дальше умеет запускать, останавливать и обновлять стек одной командой.

mkdir -p ~/plane-selfhost && cd ~/plane-selfhost
curl -fsSL https://raw.githubusercontent.com/makeplane/plane/master/deploy/selfhost/install.sh -o install.sh
chmod +x install.sh
./install.sh install

Скрипт задаст несколько вопросов в интерактивном режиме — домен или IP, на котором будет доступен Plane, порт (по умолчанию 80), и создаст рабочую папку plane-app со всеми конфигами. Обратите внимание: конкретные шаги установщика и структура репозитория у активно развивающихся open-source проектов время от времени меняются, поэтому перед запуском стоит свериться с актуальным README в репозитории makeplane/plane — команды выше передают саму суть процесса, но детали (имена флагов, расположение файлов) могут немного отличаться от версии к версии.

После установки в plane-app появится файл окружения (обычно plane.env или .env в зависимости от версии) — там задаются:

  • WEB_URL / APP_DOMAIN — публичный адрес, по которому команда будет заходить в трекер;
  • PGDATA, POSTGRES_PASSWORD — параметры встроенного PostgreSQL;
  • AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY — доступы к встроенному MinIO для хранения файлов;
  • NGINX_PORT — порт, на котором слушает внутренний прокси-контейнер.

Пароли и ключи, которые генерирует установщик по умолчанию, обязательно замените на свои — особенно POSTGRES_PASSWORD и SECRET_KEY — и только после этого поднимайте стек:

cd ~/plane-selfhost/plane-app
docker compose up -d
docker compose ps

Первый запуск занимает несколько минут — контейнер migrator должен успешно прогнать миграции Postgres, а web/space/admin — собраться и подняться. Смотрите логи, если что-то зависло:

docker compose logs -f migrator
docker compose logs -f api

Первичная настройка после установки

Когда все контейнеры в статусе running, откройте http://<ваш-IP-или-домен> в браузере. Plane предложит создать первого пользователя — он автоматически станет инстанс-администратором. Дальше стоит зайти в God Mode (обычно доступен по пути /god-mode от имени первого созданного аккаунта) и пройтись по базовым настройкам:

  • Workspace — название рабочего пространства, слаг для URL, часовой пояс по умолчанию;
  • SMTP — без почтового сервера не будут работать приглашения участников и уведомления. Пропишите SMTP-хост, порт, логин и пароль вашего почтового провайдера;
  • File storage — по умолчанию файлы летят во встроенный MinIO-контейнер; для продакшена стоит явно ограничить максимальный размер вложения и продумать резервное копирование этого тома;
  • Authentication — включите/выключите регистрацию по email, при необходимости настройте вход через Google или GitHub OAuth.

После этого пригласите участников по email — они получат письмо со ссылкой на регистрацию в вашем инстансе, а не в облаке Plane.

Reverse proxy, SSL и безопасность

Встроенный nginx-контейнер Plane отдаёт трафик по HTTP на порт хоста (по умолчанию 80), но пускать в продакшен трекер без HTTPS — плохая идея: логины и токены сессий должны идти по шифрованному каналу. Самый чистый вариант — поставить перед Plane внешний reverse proxy на хосте, который будет держать SSL-сертификат и проксировать запросы на внутренний порт контейнера.

Если у вас уже есть на сервере nginx для других сайтов, добавьте отдельный server-блок:

server {
    listen 443 ssl http2;
    server_name plane.example.com;

    ssl_certificate     /etc/letsencrypt/live/plane.example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/plane.example.com/privkey.pem;

    location / {
        proxy_pass http://127.0.0.1:80;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_read_timeout 300s;
    }
}

Подробно про настройку самого reverse proxy на чистом сервере — в статье про Nginx как reverse proxy на VPS, а получить сертификат Let's Encrypt и настроить автопродление — в статье про Let's Encrypt SSL на VPS. Таймаут proxy_read_timeout стоит увеличить: у Plane есть операции с realtime-обновлениями и загрузкой файлов, которые дольше стандартных 60 секунд.

Из базовой безопасности:

  • держите Docker и хостовую ОС обновлёнными, особенно если контейнер plane-db смотрит в интернет напрямую — по умолчанию установщик обычно биндит Postgres только на localhost, но это стоит проверить в docker-compose.yaml;
  • ограничьте SSH только по ключу, отключите вход по паролю;
  • заведите отдельного непривилегированного пользователя для управления Docker вместо работы под root.

Общие практики по безопасности контейнеров разобраны в статье про безопасность Docker — она пригодится не только для Plane, но и для остального стека на сервере.

Обновление и резервное копирование

Plane активно развивается, и релизы выходят регулярно — обновляться стоит хотя бы раз в месяц-два, но не «на автомате»: сначала читайте changelog проекта на предмет breaking changes в схеме БД или переменных окружения. Через установщик обновление обычно выглядит так:

cd ~/plane-selfhost
./install.sh upgrade

Если ставили руками через docker compose — обновление сводится к docker compose pull и docker compose up -d с проверкой логов миграций.

Перед любым обновлением сделайте бэкап — минимум базы данных и тома с файлами MinIO:

docker compose exec plane-db pg_dump -U plane plane > plane-backup-$(date +%F).sql
docker run --rm -v plane-app_uploads:/data -v $(pwd):/backup alpine \
  tar czf /backup/plane-uploads-$(date +%F).tar.gz -C /data .

(имена тома уточните через docker volume ls — они зависят от того, как называется папка с проектом). Если хотите поставить бэкапы на регулярную основу, а не делать их вручную перед каждым обновлением, — общий подход к автоматическому резервному копированию Docker-томов описан в статье про бэкап Docker volume на VPS. Храните бэкапы не на том же диске, где крутится Plane, — иначе при отказе диска потеряете и продакшен, и резервную копию разом.

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

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

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

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

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

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

Можно ли поставить Plane без Docker, напрямую на сервер?

Официально поддерживается только Docker-развёртывание — стек из семи с лишним сервисов (Postgres, Redis, MinIO, несколько Python- и Node-процессов) вручную собирать и поддерживать сильно дороже, чем через docker compose. Технически можно, но это без официальной поддержки и с высокими шансами разойтись с ожидаемыми версиями зависимостей.

Сколько человек выдержит минимальная конфигурация в 2 vCPU / 4 GB RAM?

Для команды до 10 человек с умеренной активностью этого обычно достаточно для комфортной работы, но это ориентир, а не гарантия — сильно зависит от того, сколько задач создаётся одновременно и насколько активно грузятся файлы.

Нужен ли внешний PostgreSQL или хватит встроенного в docker compose?

Для небольших и средних команд встроенного Postgres в контейнере достаточно, если у вас настроены регулярные бэкапы. Для более крупных инсталляций или если Postgres уже развёрнут отдельно под другие проекты, имеет смысл вынести базу наружу и указать внешний DSN в переменных окружения Plane — это снижает нагрузку на один сервер и упрощает бэкапы.

Как перенести Plane на другой сервер?

Последовательность та же, что при переносе любого docker-compose проекта: снять дамп Postgres, скопировать том с файлами MinIO и папку с конфигами, поднять тот же docker-compose.yaml на новом сервере, восстановить дамп и том, поправить DNS на новый IP.

Plane можно использовать бесплатно и без ограничений на self-host?

Community-редакция, которую вы разворачиваете через docker compose, распространяется как open source и не требует лицензии за пользователей — платные тарифы у Plane относятся к их облачному SaaS и к отдельным enterprise-функциям, которых нет в self-host сборке.

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

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

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