Локальный административный портал для управления FreeIPA, запуска и контроля процессов XYOps и эксплуатации самого портала.
Проект рассчитан на self-hosted запуск через Docker Compose. Портал имеет собственную локальную аутентификацию/RBAC, D1/SQLite-совместимое хранилище, audit, approvals, backup/restore, maintenance, health и storage diagnostics.
Каноническое product/display name — Admin Dashboard Softrust. Технические compatibility identifiers
freeipa-admin-dashboard*не являются пользовательским брендом и не переименовываются автоматически.
- FreeIPA users/groups CRUD, password reset и membership;
- каталог Events/Workflows XYOps и генерация форм по upstream metadata;
- запуск, cancel/rerun, результаты и notifications;
- approval gates для опасных процессов;
- локальные portal users, роли
viewer/operator/adminи sessions; - append-only audit с server-generated correlation IDs;
- encrypted settings lifecycle;
- sanitized и full encrypted logical backups;
- read-only restore preview и isolated test restore;
- selective production restore с recovery point;
- persistent maintenance mode;
- destructive offline full restore с atomic SQLite swap/rollback;
- liveness/readiness/dependency health, diagnostics и Prometheus baseline;
- storage status/integrity/migration preflight и controlled migration apply foundation.
- Docker Engine и Docker Compose;
- свободный host port
3001по умолчанию; - исходящий доступ из Docker bridge network до FreeIPA;
- исходящий доступ до XYOps, если используется automation module.
Для разработки без Docker требуется Node.js >=22.13.0.
Создайте локальную конфигурацию:
cp .env.example .envОбязательно задайте собственные production secrets. Не используйте example/fixture keys.
Минимально:
PORTAL_IDENTITY_MODE=local
PORTAL_BOOTSTRAP_ADMIN_USERNAME=admin
PORTAL_BOOTSTRAP_ADMIN_PASSWORD=replace-with-a-strong-password-at-least-12-characters
ADMIN_TOKEN=replace-with-a-long-random-service-admin-token
CONFIG_ENCRYPTION_KEY=<unique-32-byte-key>Стандартный Compose использует отдельную bridge network и публикует dashboard только на loopback хоста:
DASHBOARD_BIND_ADDRESS=127.0.0.1
DASHBOARD_PORT=3001Меняйте DASHBOARD_BIND_ADDRESS на LAN/non-loopback адрес только осознанно: это расширяет доступность порта с хоста. Внутренний FreeIPA Gateway при этом остаётся process-private и слушает только loopback внутри dashboard container; Compose его не публикует.
Правила генерации и ротационного/операционного обращения с encryption key: docs/security/CONFIG_ENCRYPTION_KEY.md.
Запуск:
docker compose up -d --build
docker compose psПри значениях по умолчанию портал доступен с хоста:
http://localhost:3001
Если портал стартует, но FreeIPA/XYOps недоступны, не переключайте deployment на host networking и не отключайте TLS как первый шаг. Проверьте GET /health/dependencies или /diagnostics/health: текущий health contract различает DNS, network, timeout, TLS и authentication failures. Точная network/topology policy и ограничения custom DNS/proxy options описаны в docs/architecture/DEPLOYMENT_MATRIX.md.
Остановка без удаления persistent volume:
docker compose downДанные хранятся в Compose volume dashboard-data.
Основной режим:
PORTAL_IDENTITY_MODE=local
PORTAL_BOOTSTRAP_ADMIN_USERNAME=admin
PORTAL_BOOTSTRAP_ADMIN_PASSWORD=replace-with-a-strong-password-at-least-12-characters
PORTAL_BOOTSTRAP_ADMIN_NAME=Локальный администратор
PORTAL_SESSION_TTL_HOURS=12
PORTAL_DEFAULT_ROLE=viewerBootstrap admin создаётся только при пустой таблице portal users. После создания bootstrap variables не перезаписывают пароль или роль существующего пользователя.
Portal user и FreeIPA user — разные сущности. FreeIPA groups не назначают portal roles автоматически.
Полный contract: docs/LOCAL_AUTH_RBAC.md.
- Frontend: React/Vinext,
app/; - Backend: Worker-oriented HTTP runtime,
worker/; - Storage: local D1/SQLite-compatible DB в Docker volume;
- FreeIPA: private Node.js Gateway
scripts/freeipa-gateway.mjs; - XYOps: server-side API client; API key не передаётся браузеру;
- Schema: canonical versioned migration lifecycle до ordinary API;
- Recovery: maintenance + selective restore + offline full restore.
Полный ARCHITECTURE.md и module-boundary map являются отдельным этапом Epic #82. До их появления authoritative owners перечислены в docs/reference/SOURCE_OF_TRUTH.md.
Контракты разделены:
GET /health/live
GET /health/ready
GET /health/dependencies
GET /metrics/health
GET /diagnostics/health
- liveness не зависит от FreeIPA/XYOps;
- readiness проверяет обязательный локальный runtime;
- external dependency degradation не является restart signal;
- metrics не выполняют external dependency probes.
Документация:
docs/operations/HEALTH_CONTRACTS.mddocs/operations/HEALTH_METRICS.mddocs/operations/STORAGE_STATUS.mddocs/operations/STORAGE_INTEGRITY.md
Startup применяет только migrations, разрешённые как automatic. Controlled suffix никогда не применяется скрыто при startup и требует отдельного maintenance/preflight/apply workflow.
Основные operator/admin surfaces:
GET /api/schema/status
POST /api/admin/storage/migrations/preflight
POST /api/admin/storage/migrations/apply
GET /api/admin/storage/migrations/apply/status
POST /api/admin/storage/migrations/apply/reconcile
Полный contract: docs/operations/DATABASE_MIGRATIONS.md.
Портал поддерживает:
- sanitized logical export;
- full encrypted logical backup;
- read-only preview;
- isolated in-memory test restore;
- staged selective production restore;
- persistent maintenance mode;
- destructive offline full restore.
Destructive full restore реализован и выполняется только offline: maintenance должен быть active, dashboard останавливается, создаётся mandatory encrypted raw-SQLite recovery point, candidate проверяется до live mutation, а swap/rollback связываются receipt-ом.
Не выполняйте file-level restore по краткому README. Используйте только active runbook:
XYOps остаётся источником истины для process execution, queues, rate limits и concurrency. Portal не создаёт вторую scheduler/business queue.
Документация:
docs/integrations/XYOPS_EXECUTION_OWNERSHIP.mddocs/integrations/XYOPS_INSPECTOR.mddocs/integrations/PROCESS_PRESENTATION_METADATA.md
Основные команды:
npm run lint
npm run build
npm test
npm run test:e2e:auth
npm run test:local
npm run test:p0:acceptance
npm run test:recovery
npm run test:recovery:composeЛокальная acceptance-процедура:
Главная точка входа:
Обязательные meta-docs:
docs/development/DOCUMENTATION_POLICY.mddocs/reference/SOURCE_OF_TRUTH.mddocs/DOCUMENTATION_INVENTORY.mddocs/GLOSSARY.mddocs/ai/README.md
Актуальный backlog хранится в GitHub Issues. docs/OPEN_TASKS.md является superseded historical snapshot и не должен использоваться как текущий task registry.
Если PR меняет API, permissions/auth, schema, config, integration contract, security boundary, deployment, health, backup/recovery или пользовательский workflow, связанная документация обновляется в том же PR.
Issue, implementation plan и старый PR не являются доказательством текущего runtime. При конфликте сначала проверяйте текущий main и canonical source of truth.