Databricks customer installation
Install, upgrade, and remove Fabric Experiments in a customer-owned Databricks workspace.
Fabric Experiments treats every customer workspace as an independent production cell. Application compute, operational state, analytical data, secrets, and service identities belong to that workspace. A direct workspace installation and a Marketplace installation use the same resource and migration contract; Marketplace adds Databricks packaging, consent, update notification, and security review.
Identity boundary
Use three distinct identities:
- The installer identity creates or binds resources, applies migrations,
grants runtime access, and records release evidence. Before creating the
delivery Job it must also hold Service Principal User (
Use) on the worker App principal; Service Principal Manager (Manage) does not implyUse. It is short-lived and is not used for application requests. - The control App service principal is minted for that installation and
receives only the resources needed to serve the product. Startup executes
pnpm migrate:verify, which readsfx._migrationsand fails closed if the installer did not apply the required release. - The worker App service principal is independently minted and receives only the model endpoint, warehouse, and worker secrets needed for durable evaluation dispatch and tenant telemetry delivery. The scheduled delivery Job runs as this same principal; no provider identity enters the workspace.
Do not grant the runtime principal ownership merely to make migrations work.
Many PostgreSQL ALTER operations require ownership and cannot be made safe by
adding broad runtime grants.
The worker is required for evaluation dispatch; disabling it is not a supported customer configuration.
Build the customer release
The checked-in app.yaml and root bundle describe Fabric's own production
cell. Never distribute them as a customer artifact. Start from the customer
contract, use an immutable commit, and generate the minimized release:
pnpm databricks:customer:preflight -- path/to/customer-install.json
pnpm databricks:customer:release -- \
path/to/customer-install.json \
dist/customer-releases/customer
pnpm databricks:customer:certify-artifact -- \
dist/customer-releases/customerThe builder refuses a dirty repository or a release.commitSha that differs
from HEAD. Its output contains minimized control/worker source archives with
customer-rendered app.yaml files, the setup notebook, all migrations and
checksums, required resource bindings, egress disclosures, availability policy,
and a release manifest with SHA-256 checksums. It excludes Fabric workspace
identifiers, environment files, node_modules, and provider deployment
configuration.
pnpm databricks:customer:certify-local builds and inspects a disposable
artifact using the example contract. This is deterministic offline coverage;
it does not replace a live workspace lifecycle rehearsal.
An internal rehearsal can pass --internal-certification to the preflight,
release, and certification commands when its Databricks URL or storage path
necessarily contains Fabric workspace identifiers. The generated manifest is
then marked certificationOnly: true and ordinary artifact certification
rejects it. Such an artifact is evidence for the rehearsal, never a customer or
Marketplace deliverable.
Direct workspace installation
- Create the empty control and worker Apps first. This mints their dedicated
service principals and gives the control App its workspace-specific URL;
do not deploy source yet. For CLI automation, combine
apps create --no-compute --no-wait:--no-computecan leave a successfully created App inSTOPPED, which must not be treated as a creation failure. - Create a customer configuration from
deploy/databricks/marketplace/customer-install.example.json, using those App names and the discovered control App URL. Do not put secret values in this file. Build and certify the release as described above. - Review
resources.json,egress.json,availability.json, andrelease-manifest.jsonwith the customer administrator. - Import and run
setup_notebook.pywith the two App principal IDs. The notebook creates only the declared Unity Catalog schemas, ingestion Volume, and versionedexposures,conversions,eval_scores, andspansDelta tables. It does not create secrets, deploy Apps, or apply Lakebase migrations. The Apps receiveUSE SCHEMA,SELECT, andMODIFY, not schema DDL. - Put the control secret values in the customer secret scope and bind the
control resources listed in
resources.jsonwith the declared permission. Transactional email is required for verified first-user onboarding in contract version 1, so the customer must supply the declared Resend keys and approvehttps://api.resend.comas required egress. - With the privileged installer database identity, apply the artifact's
ordered migrations and verify
migration-manifest.json. Do not use either App principal for DDL. For Lakebase, use the direct endpoint host and the installer's complete workspace user name. Do not use the pooled host: it can reject the migration runner's startupsearch_pathoption before SQL runs. SetFX_MIGRATION_RUNTIME_ROLEto the control App service-principal UUID. The installer then grants only schema usage, DML on thefxtables and the explicitpublic.fx_api_keyscompatibility table, plus sequence access; it does not grant schema creation, ownership, or DDL to the App. - Extract and deploy
control-plane-source.tar. Complete first-user verification and create the customer organization. Generate independent manifest HMAC and telemetry delivery secrets and complete provider tenant registration. The provider stores only the delivery-token digest and never exposes its global administrative credential to the workspace. - Create a write-scoped worker API key, and store the organization ID and API key as the
worker-organization-idsandharness-fx-api-keysecrets. Tenant identity is discovered after onboarding and is never baked into the release. - Bind every worker resource listed in
resources.json, including the worker'sCAN USEbinding on the control App, then extract and deployworker-source.tar. Submit each deployment exactly once and retain its immutable deployment ID if the CLI wait times out. Afterapps start, list server-side deployments before submitting: Databricks can automatically redeploy the last source snapshot as part of the start operation. - Explicitly grant the installer Service Principal User (
Use) on the worker App service principal while preserving any existing grants. Uploadcustomer_delivery_sync.py, replace the explicit placeholders indelivery-job.template.json, and create the scheduled serverless Job. It runs as the worker App principal and reads the delivery token from the customer secret scope. The delivery stream writes the installer-created Delta tables and does not require schema-creation permission. - Poll both Apps to terminal success. Verify authenticated
/api/healthz, sign-in, one governed write, a browser exposure delivered into the customer-owned Delta table, one warehouse-backed aggregate, and an evaluation completed by the worker.
Required public delivery boundary
The v1 customer contract supports delivery.mode=fabric-managed. Databricks
Apps ingress is workspace-authenticated, while browser manifest retrieval and
exposure beacons need public endpoints. The release therefore requires:
cdn.fabric.profor immutable web SDK assets,manifest.experiments.fabric.profor signed public manifests,ingest.experiments.fabric.profor browser exposure ingestion, and- the customer-selected Temporal endpoint for durable worker orchestration.
egress.json states the purpose and data categories for each origin.
Marketplace or direct-install consent must disclose that published experiment
configuration and exposure evidence cross the workspace boundary. A
workspace-only public delivery mode is not currently certified and fails
preflight instead of silently falling back to Fabric endpoints.
The public edge is a durable handoff, not the system of record. The customer delivery Job lists and downloads only the registered tenant prefix, validates every row's tenant identity, writes it to the governed ingestion Volume, and uses available-now Auto Loader checkpoints to materialize Delta. Only after both exposure and conversion streams succeed does it acknowledge the provider objects. A retry therefore remains at-least-once at the handoff and idempotent at the customer table. Certification must also prove that another tenant's token and object key are rejected.
Marketplace installation
The Marketplace package must express the same resources and scopes as the direct installation. Its setup workflow has separately auditable privileged phases: the supplied notebook creates the customer-owned Unity Catalog resources, and an installer-owned database phase applies Lakebase migrations. The App starts only after both phases succeed and migration verification passes.
Customers can choose whether optional billing egress is enabled. Transactional email is required in contract version 1 because first-user onboarding requires email verification; Databricks-native SSO is not yet an alternative identity bootstrap. Contract version 1 rejects provider telemetry because it does not yet define a destination and data-use contract. The public delivery origins above remain required for the advertised browser experimentation workflow. Required and optional network origins are disclosed separately so administrators with restricted egress can make an informed allowlist decision.
Third-party Marketplace Apps execute on customer compute in the customer's workspace. Databricks performs a security review before publication, and customers configure resources and scopes during installation. See the official Marketplace installation guide and Databricks App resource guidance. The exact provider upload and listing workflow remains gated by Databricks provider onboarding; do not invent a Marketplace package format that is not in the partner specification.
Upgrade
Use expand-and-contract migrations:
- Apply backward-compatible expansion migrations with the installer identity.
- Verify the ledger.
- Deploy exactly one new App version and complete health and behavior checks.
- Remove obsolete columns or constraints only in a later release after the supported rollback window closes.
The verifier accepts ledger entries newer than the current binary, which allows an N-1 binary to run during a rollback. It rejects any migration required by the current binary that is absent.
Failure and recovery
Use a bounded deployment timeout. If status and update time remain unchanged through that window:
- Record the App name, deployment ID, release commit, phase, timestamps, and sanitized status output.
- Confirm no other deployment is active.
- Stop and start App compute.
- Submit one replacement deployment and poll it to a terminal state.
Never solve a build or deployment stall by submitting concurrent deployments. The previous healthy artifact remains the rollback target, but it is not still serving after an in-place update has stopped App compute.
Update availability
The certified availability policy is maintenance-window, not zero downtime.
The 2026-07-30 internal deployment stopped the active App before source
download, build, migration verification, and startup completed. Until a
customer-workspace blue/green design is proven, notify users and schedule
updates inside a maintenance window. Marketplace update notification does not
remove this requirement.
Uninstall
Removing the App must not delete customer Lakebase data, Unity Catalog data, or storage by default. Produce an inventory and explicit retention/deletion choices. Databricks Lakebase resources persist across App redeploys and stops; database-role ownership may need explicit reassignment when a resource is removed.