Dependency graph
Every certificate participates in a web of upstream and downstream relationships: ACME account → cert, zone → cert, cert → distributions → targets. The dependency graph visualizes that web and — more practically — powers the safety checks that refuse destructive operations when something downstream still relies on the target.
01Upstream (what the cert depends on)
- Issuer — one ACME account or one MSCA connection + template.
- DNS zones — every identifier on the cert resolves to a registered zone → DNS credential.
- Project variables referenced by attached distributions' path / action / target templates.
- Module credentials used by the attached distributions.
- Certificate policy (if enabled on the project) — not a reference, but an enforcement boundary that shapes what the cert can be.
02Downstream (what depends on the cert)
- Distributions — zero or more, each binding the cert to a module + target/group.
- Targets — the resolved set, via distributions.
- Bulk actions — if the cert is listed in an active bulk-action record, it's a downstream reference until that job completes.
- Approval requests — pending approval requests referencing this cert.
03The graph view
- Open the certificate detail page.
- Switch to the Dependencies tab.
- A directed graph renders: the cert in the centre, upstream nodes on the left (issuer, zones, credentials), downstream on the right (distributions, targets). Edges are labelled with the relationship type.
- Click any node to navigate to that resource.
04Safety checks
The same graph data drives soft-block safety checks throughout the UI:
- Deleting an ACME account is blocked while any certificate references it.
- Deleting a DNS credential is blocked while any zone references it, which is in turn blocked while any certificate depends on the zone.
- Deleting a target is blocked while any distribution references it.
- Deleting a module credential is blocked while any target references it.
- Deleting a certificate is blocked while any active distribution or bulk action references it.
The block is soft: the UI explains the blocking reference(s) and lets you jump to them. There is no force- delete. If you want to decommission an upstream resource, repoint the dependants first.
05Query via API
The graph is exposed as a single endpoint per resource:
GET /api/v1/projects/{projectId}/certificates/{id}/dependencies
GET /api/v1/projects/{projectId}/acme-accounts/{id}/dependencies
GET /api/v1/projects/{projectId}/targets/{id}/dependencies
Returns an adjacency list:
{
"upstream": [
{"type":"acme_account", "id":"...", "name":"letsencrypt-prod", "relation":"issuer"},
{"type":"zone", "id":"...", "name":"example.com", "relation":"identifier_zone"}
],
"downstream": [
{"type":"distribution", "id":"...", "name":"web-fleet-ssh", "relation":"binds"}
]
}
06Common graph shapes
- Orphan cert: issuer + zones upstream, no distributions downstream. Surfaces as an attention signal in risk scoring.
- Shared target: one target referenced by many distributions (many certs land on one host). Deleting the target refuses until all are repointed.
- Multi-module cert: one cert with SSH + Kubernetes + Vault distributions — three downstream edges, three separate rollback stories.
07Troubleshooting
"Cannot delete — N references"
Open the dependency panel, click each blocking reference, repoint or delete. Once every reference is cleared, the delete succeeds.
Graph shows a reference that should be gone
Dependencies are computed on-read from current DB state — stale references come from real data. Check the named resource directly; often a soft-deleted record still carries the reference. Contact support with the resource IDs if the graph shows something the source-of-truth doesn't.