2.5 KiB
2.5 KiB
Plane User Migration Plan
Цель
Связать существующего пользователя Plane с Authentik identity без потери workspace, projects, tasks, comments, attachments и истории.
Current baseline
Текущий рабочий Plane workspace:
workspace slug: nodedc
workspace name: NODE DC
workspace owner: dcctouch@gmail.com
codex user: codex@nodedc.local
Перед реализацией OIDC нужно дополнительно снять точный snapshot:
- users;
- profiles;
- workspace memberships;
- project memberships;
- issue ownership;
- issue assignees;
- comments;
- attachments;
- uploaded files/storage.
Backup before changes
Перед любыми изменениями Plane auth:
plane_db dump
plane-app/plane.env
uploads / MinIO volumes
redis, если в нем есть важные очереди/сессии
rabbitmq, если есть невыполненные jobs
Mapping model
Минимальная модель:
external_identity_link
id
provider = authentik
authentik_sub
email
plane_user_id
created_at
last_login_at
status
Уникальность:
provider + authentik_sub;provider + plane_user_id;- желательно
provider + email, если email используется для migration auto-link.
Login flow
Authentik login
-> Plane OIDC callback
-> validate state/nonce/token
-> validate issuer/audience/exp/sub
-> check nodedc:taskmanager:access
-> find external_identity_link by authentik_sub
-> login existing plane_user_id
Migration auto-link допускается только контролируемо:
if no link and email matches existing Plane user and migration mode enabled:
create external_identity_link
else:
deny or provisioning flow
Forbidden during migration
- Не пересоздавать существующего Plane user.
- Не менять
created_by. - Не менять
owner_id. - Не менять
assignee_id. - Не менять
member_id. - Не делать bulk update связей задач без отдельной проверки.
Management command target
Целевая команда:
python manage.py link_authentik_user --email admin@example.ru --sub <authentik-sub>
Требования:
- idempotent;
- проверяет конфликтующий mapping;
- ничего не меняет в задачах/workspace;
- выводит summary;
- поддерживает dry-run.