Skip to content

feat(neo4j): evaluate Neo4j Enterprise or dedicated instance for per-consumer isolation (Community edition blocks RBAC) #157

Description

@izzywdev

@claude — Neo4j consumer isolation: assess + implement declarative per-consumer provisioning

Context

The shared Neo4j is Community edition (5.26.27), which supports exactly one database (
eo4j)
and no \CREATE USER/RBAC (both Enterprise-only). As a result, FuzePlan was wired to the shared
eo4j\ database using the shared
eo4j\ admin credentials — functional but completely unisolated. Every consuming repo shares the same admin credentials and the same single database. This is a security and multi-tenancy gap.

Ask

Research, decide, and implement the right path for per-consumer Neo4j isolation:

Option A — Neo4j Enterprise license (preferred if cost is acceptable)

  • Enterprise adds multi-database (\CREATE DATABASE fuzeplan) + RBAC (\CREATE USER fuzeplan_user)
  • Update the Helm chart to run Enterprise image
  • Add a provisioning Job (same pattern as Mongo ask) that creates per-consumer DB + user from a
    eo4j.consumers\ values list
  • Check Neo4j Enterprise licensing (AuraDB Enterprise? Self-hosted Enterprise? Community is Apache 2 → Enterprise is commercial)

Option B — Dedicated Neo4j instance per tenant (if Enterprise cost is prohibitive)

  • Add a second Neo4j StatefulSet in the chart (e.g.
    eo4j-fuzeplan) alongside the shared one
  • Each consuming repo gets its own instance (full isolation, no license cost)
  • Assess resource overhead (Neo4j is heavy — ~1-2 GiB heap per instance)

Option C — Namespace-scoped credentials + prefix convention (stopgap only)

  • Keep Community, document that all consumers share the
    eo4j\ DB
  • Enforce a node/relationship label prefix per consumer (e.g. \FuzePlan_Task) to avoid collisions
  • Accept the security limitation; revisit when Enterprise is justified

Acceptance

  • A clear recommendation with cost/resource tradeoff for Options A/B/C
  • Whichever option is chosen: implemented as a Helm chart change + provisioning Job, declarative and Git-backed
  • FuzePlan wired to its isolated Neo4j DB+user (or documented prefix if Option C)
  • All FuzeInfra gate checks pass
  • \docs/CONSUMER_ONBOARDING_SHARED_CLUSTER.md\ updated with the Neo4j consumer pattern

Reference

  • Current Neo4j StatefulSet: \helm/fuzeinfra/templates/databases.yaml\ (search for neo4j section)
  • Current credentials: \ uzeinfra-secrets\ (\NEO4J_AUTH\ key, format
    eo4j/)
  • FuzePlan's current connection: \�olt://fuzeinfra-neo4j.fuzeinfra.svc.cluster.local:7687, user=
    eo4j, password from fuzeplan-secrets SealedSecret
  • Mongo provisioning issue (parallel): see companion issue in this repo (feat(mongo) declarative provisioning)

STATE

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions