# 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-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-сценарием.
