# Plane Community Edition для локального стенда NodeDC ## Что развернуто Локально поднят self-hosted стенд Plane Community Edition для macOS. Состав: - self-host runtime: `/Users/dcconstructions/Downloads/mnt/data/dc_taskmanager/NODEDC_TASKMANAGER/plane-app` - локальный форк исходников для кастомизации: `/Users/dcconstructions/Downloads/mnt/data/dc_taskmanager/NODEDC_TASKMANAGER/plane-src` - ветка форка: `nodedc-ru-local` - локальные image tags для UI: `nodedc/plane-frontend:ru`, `nodedc/plane-admin:ru`, `nodedc/plane-space:ru` - demo bootstrap-скрипт: `/Users/dcconstructions/Downloads/mnt/data/dc_taskmanager/NODEDC_TASKMANAGER/scripts/bootstrap_nodedc_demo.py` - demo asset для вложения: `/Users/dcconstructions/Downloads/mnt/data/dc_taskmanager/NODEDC_TASKMANAGER/demo-assets/nodedc-document-request-template.txt` - рабочий env-файл хранится в репозитории: `/Users/dcconstructions/Downloads/mnt/data/dc_taskmanager/NODEDC_TASKMANAGER/plane-app/plane.env` - snapshot текущих volume-данных хранится в репозитории: `/Users/dcconstructions/Downloads/mnt/data/dc_taskmanager/NODEDC_TASKMANAGER/plane-app/backup/20260418-1904` Используется именно open-source/community self-host путь через официальный `setup.sh`, без enterprise/commercial-фич. ## Окружение - ОС: macOS - Архитектура: `arm64` (Apple Silicon) - Shell: `zsh` - Bash: `/bin/bash` - Docker: `Docker version 29.1.3` - Docker Compose: `Docker Compose version v5.0.0-desktop.1` ## Локальный URL - основной URL: `http://localhost:8090` - без домена и без SSL, как локальный PoC-стенд ## Где что лежит - корень стенда: `/Users/dcconstructions/Downloads/mnt/data/dc_taskmanager/NODEDC_TASKMANAGER` - setup script: `/Users/dcconstructions/Downloads/mnt/data/dc_taskmanager/NODEDC_TASKMANAGER/setup.sh` - compose: `/Users/dcconstructions/Downloads/mnt/data/dc_taskmanager/NODEDC_TASKMANAGER/plane-app/docker-compose.yaml` - env: `/Users/dcconstructions/Downloads/mnt/data/dc_taskmanager/NODEDC_TASKMANAGER/plane-app/plane.env` - backup данных: `/Users/dcconstructions/Downloads/mnt/data/dc_taskmanager/NODEDC_TASKMANAGER/plane-app/backup/20260418-1904` - форк репозитория: `/Users/dcconstructions/Downloads/mnt/data/dc_taskmanager/NODEDC_TASKMANAGER/plane-src` ## Используемые env-файлы Основной env-файл: - `/Users/dcconstructions/Downloads/mnt/data/dc_taskmanager/NODEDC_TASKMANAGER/plane-app/plane.env` Текущий snapshot volume-данных: - `/Users/dcconstructions/Downloads/mnt/data/dc_taskmanager/NODEDC_TASKMANAGER/plane-app/backup/20260418-1904/pgdata.tar.gz` - `/Users/dcconstructions/Downloads/mnt/data/dc_taskmanager/NODEDC_TASKMANAGER/plane-app/backup/20260418-1904/uploads.tar.gz` - `/Users/dcconstructions/Downloads/mnt/data/dc_taskmanager/NODEDC_TASKMANAGER/plane-app/backup/20260418-1904/rabbitmq_data.tar.gz` - `/Users/dcconstructions/Downloads/mnt/data/dc_taskmanager/NODEDC_TASKMANAGER/plane-app/backup/20260418-1904/redisdata.tar.gz` Ключевые параметры для локалки: - `WEB_URL=http://localhost:8090` - `LISTEN_HTTP_PORT=8090` - `LISTEN_HTTPS_PORT=8443` - `CORS_ALLOWED_ORIGINS=http://localhost:8090` ## Команды, которые реально применялись ### Получение и запуск self-host runtime ```bash mkdir -p /Users/dcconstructions/Downloads/mnt/data/dc_taskmanager/NODEDC_TASKMANAGER cd /Users/dcconstructions/Downloads/mnt/data/dc_taskmanager/NODEDC_TASKMANAGER curl -fsSL -o setup.sh https://github.com/makeplane/plane/releases/latest/download/setup.sh chmod +x setup.sh ./setup.sh install ./setup.sh start ``` ### Остановка и повторный запуск ```bash cd /Users/dcconstructions/Downloads/mnt/data/dc_taskmanager/NODEDC_TASKMANAGER ./setup.sh stop ./setup.sh start ``` ### Логи ```bash cd /Users/dcconstructions/Downloads/mnt/data/dc_taskmanager/NODEDC_TASKMANAGER ./setup.sh logs api ./setup.sh logs worker ./setup.sh logs web ./setup.sh logs admin ./setup.sh logs space ./setup.sh logs proxy ``` ### Клонирование исходников под форк ```bash git clone --depth 1 --branch v1.3.0 https://github.com/makeplane/plane.git /Users/dcconstructions/Downloads/mnt/data/dc_taskmanager/NODEDC_TASKMANAGER/plane-src cd /Users/dcconstructions/Downloads/mnt/data/dc_taskmanager/NODEDC_TASKMANAGER/plane-src git checkout -b nodedc-ru-local pnpm install --frozen-lockfile ``` ### Проверка фронтовых пакетов после русификации ```bash cd /Users/dcconstructions/Downloads/mnt/data/dc_taskmanager/NODEDC_TASKMANAGER/plane-src pnpm turbo run check:types --filter=web --filter=admin --filter=space --filter='@plane/i18n' --filter='@plane/ui' pnpm turbo run check:types --filter=web --filter='@plane/i18n' --filter='@plane/utils' ``` ### Пересборка локального фронта после изменений русификации ```bash cd /Users/dcconstructions/Downloads/mnt/data/dc_taskmanager/NODEDC_TASKMANAGER/plane-src docker build -t nodedc/plane-frontend:ru -f apps/web/Dockerfile.web . cd /Users/dcconstructions/Downloads/mnt/data/dc_taskmanager/NODEDC_TASKMANAGER ./setup.sh stop ./setup.sh start ``` ### Пересборка всех UI-образов после ребрендинга NODE.DC ```bash cd /Users/dcconstructions/Downloads/mnt/data/dc_taskmanager/NODEDC_TASKMANAGER/plane-src docker build -t nodedc/plane-live:local -f apps/live/Dockerfile.live . docker build -t nodedc/plane-frontend:ru -f apps/web/Dockerfile.web . docker build -t nodedc/plane-admin:ru -f apps/admin/Dockerfile.admin . docker build -t nodedc/plane-space:ru -f apps/space/Dockerfile.space . cd /Users/dcconstructions/Downloads/mnt/data/dc_taskmanager/NODEDC_TASKMANAGER ./setup.sh stop ./setup.sh start ``` ### Наполнение demo-данными ```bash docker cp /Users/dcconstructions/Downloads/mnt/data/dc_taskmanager/NODEDC_TASKMANAGER/demo-assets/nodedc-document-request-template.txt plane-app-api-1:/tmp/nodedc-document-request-template.txt docker exec -i plane-app-api-1 python manage.py shell < /Users/dcconstructions/Downloads/mnt/data/dc_taskmanager/NODEDC_TASKMANAGER/scripts/bootstrap_nodedc_demo.py ``` ## Команды эксплуатации ### Старт ```bash cd /Users/dcconstructions/Downloads/mnt/data/dc_taskmanager/NODEDC_TASKMANAGER ./setup.sh start ``` ### Стоп ```bash cd /Users/dcconstructions/Downloads/mnt/data/dc_taskmanager/NODEDC_TASKMANAGER ./setup.sh stop ``` ### Рестарт ```bash cd /Users/dcconstructions/Downloads/mnt/data/dc_taskmanager/NODEDC_TASKMANAGER ./setup.sh stop ./setup.sh start ``` ### Проверка контейнеров ```bash cd /Users/dcconstructions/Downloads/mnt/data/dc_taskmanager/NODEDC_TASKMANAGER ./setup.sh status ``` Если нужно смотреть контейнеры напрямую: ```bash cd /Users/dcconstructions/Downloads/mnt/data/dc_taskmanager/NODEDC_TASKMANAGER/plane-app docker compose --env-file plane.env ps ``` Важно: - для локального стенда безопаснее пользоваться именно `./setup.sh`, а не голым `docker compose` - причина: host env может переопределить значения из `plane.env`; на практике это уже ломало `DEBUG` - если все-таки запускать compose напрямую, лучше делать это с `--env-file plane.env` и без конфликтующих env-переменных в shell ## Тестовые учетные записи Пароль для всех demo-пользователей: ```text NodeDC123! ``` Пользователи: - `admin@nodedc.local` - `accountant@nodedc.local` - `manager@nodedc.local` - `docs@nodedc.local` ## Что создано в demo-данных Workspace: - `NodeDC` (`nodedc`) Проекты: - `Бухгалтерия` (`BUH`) - `Менеджеры` (`MGR`) - `Запросы документов` (`DOC`) Demo work items: - адресная задача бухгалтеру - задача в общий контур менеджеров - задача на запрос документов - задача с дедлайном на согласование лимитов - задача с вложением в проекте запросов документов Дополнительно: - создан сохраненный view `Срочные документы` - пользователям выставлен язык `ru` ## Что пришлось чинить вручную ### 1. Официальный `setup.sh` в актуальном состоянии неустойчиво определял latest release Проблема: - функция `checkLatestRelease()` ожидала формат JSON с пробелом после `tag_name` - GitHub API отдавал минифицированный JSON - в результате latest release мог не определяться корректно Что сделано: - локально поправлен парсинг `tag_name` в `/Users/dcconstructions/Downloads/mnt/data/dc_taskmanager/NODEDC_TASKMANAGER/setup.sh` ### 2. Хостовый env ломал запуск backend-контейнеров Проблема: - в shell был `DEBUG=release` - compose-интерполяция подхватывала host env раньше, чем `plane.env` - `api/worker/migrator` падали с ошибкой преобразования DEBUG в integer Что сделано: - в локальный `setup.sh` добавлена загрузка `plane.env` перед compose-командами - обертка запускает compose в предсказуемом env-контексте ### 3. `/api/instances/` может показывать несвежие данные Проблема: - endpoint отдает состояние не всегда синхронно после bootstrap Что делалось на практике: - финальная проверка велась через БД и прикладные API workspace/project/issues ### 4. Баг на создании attachment в текущем релизе `v1.3.0` Проблема: - legacy flow вложений упирался в `S3Storage.file_overwrite` - создание attachment через стандартный путь падало Что сделано: - для demo bootstrap файл был загружен напрямую в MinIO через storage API - после этого вручную создан `FileAsset` для `ISSUE_ATTACHMENT` ### 5. Onboarding после signup не подходил под локальный контур NodeDC Проблема: - штатный flow после регистрации вел пользователя через `role`, `use case` и `create workspace` - новые профили создавались backend-ом с `language = en`, поэтому первый onboarding-экран переключался на английский Что сделано: - onboarding в `apps/web` упрощен до одного шага: `Создайте профиль` - после нажатия `Начать` автоматически создается персональное пустое workspace и пользователь сразу редиректится в него - backend-дефолт языка для новых профилей изменен на `ru` - добавлена migration `db.0122_alter_profile_language` ### 6. Product Tour на главной временно отключен Проблема: - после входа в workspace Plane показывал отдельный welcome/product tour поверх главной страницы - для локального NodeDC PoC этот оверлей мешает первичному осмотру интерфейса Что сделано: - сам код tour сохранен - показ временно отключен флагом в `apps/web/core/components/home/root.tsx` - для возврата достаточно снова включить локальный флаг `IS_PRODUCT_TOUR_ENABLED` - добавлена migration `db.0123_force_profile_language_ru`, которая переводит все существующие профили на `ru` ## Русификация Русификация делается в локальном форке `/Users/dcconstructions/Downloads/mnt/data/dc_taskmanager/NODEDC_TASKMANAGER/plane-src`. Базовый подход: - использована существующая структура `@plane/i18n` - `ru` сделан языком по умолчанию - fallback оставлен `en` - вынесены и переведены дополнительные строки, которые были захардкожены в web UI - отдельно локализованы даты и relative-time в `packages/utils/src/datetime.ts` - локализован дефолтный label группы `All work items` - живой smoke-test пройден для login, home, project issues, views, project settings и profile settings ## Ребрендинг NODE.DC Что дополнительно изменено поверх русификации: - пользовательский брендинг `Plane` заменен на `NODE.DC` в основных web/admin/space UI - логотипы `PlaneLockup` и `PlaneLogo` заменены на asset `/Users/dcconstructions/Downloads/mnt/data/dc_taskmanager/NODEDC_TASKMANAGER/demo-assets/logo.svg` - с auth-экрана убраны `Условия использования`, `Политика конфиденциальности` и нижний маркетинговый блок - из основного web UI убраны GitHub CTA, help/question menu в top bar и badge `Сообщество` внизу sidebar - после регистрации оставлен только один onboarding-экран `Создайте профиль`; экраны `role`, `use case` и `create workspace` удалены из потока - product tour на главной странице временно отключен без удаления кода - для изменений были пересобраны локальные images `nodedc/plane-frontend:ru`, `nodedc/plane-admin:ru`, `nodedc/plane-space:ru` Отдельный архитектурный обзор по точкам кастомизации: - `/Users/dcconstructions/Downloads/mnt/data/dc_taskmanager/NODEDC_TASKMANAGER/ARCH_REVIEW_NODEDC_RU.md` ## Повторная инициализация demo-данных Если нужно повторно прогнать bootstrap после чистого разворачивания: ```bash docker cp /Users/dcconstructions/Downloads/mnt/data/dc_taskmanager/NODEDC_TASKMANAGER/demo-assets/nodedc-document-request-template.txt plane-app-api-1:/tmp/nodedc-document-request-template.txt docker exec -i plane-app-api-1 python manage.py shell < /Users/dcconstructions/Downloads/mnt/data/dc_taskmanager/NODEDC_TASKMANAGER/scripts/bootstrap_nodedc_demo.py ``` Скрипт сделан как bootstrap для PoC-стенда, а не как production-migration. ## Практические замечания - Это локальный технический стенд, не production. - Основа подходит для форка фронта и бэка: monorepo прозрачен, модели и API читаемы. - При следующем этапе кастомизации имеет смысл держать отдельно: - self-host runtime - форк `plane-src` - свои скрипты bootstrap/migrations рядом - На момент финальной проверки основная пользовательская зона UI уже русифицирована. - Остаточные англоязычные хвосты, которые еще видны на живом стенде: - `Moscow Time` в выборе часового пояса проекта - отдельные loader/accessibility строки вне основных экранов - часть admin/space интерфейсов не проходила такой же глубокий ручной аудит, как `apps/web` - Attachment flow релиза `v1.3.0` нестабилен, поэтому demo-вложение создавалось обходным bootstrap-сценарием.