Skip to content

Architecture

Edition: Community and Enterprise Offering: Self-managed

sealfix is three long-running services, three optional ones, and two short jobs at start. They are split along one line: who may read a sealed value.

flowchart TB
    U["People, in a browser"] -->|HTTPS| P["Your TLS proxy"] --> API
    API["api<br/>web application<br/>public key only"] --> META[("meta-pg<br/>metadata store")]
    EX["executor<br/>private key<br/>target connections"] --> META
    EX -->|"bind variables only"| T[("Target databases")]
    OPT["notifier, gitsync, siem<br/>optional"] --> META
    classDef secret fill:#F6E8EB,stroke:#7D1D2F,stroke-width:2px,color:#13202D
    classDef core fill:#DCE3EE,stroke:#13202D,stroke-width:2px,color:#13202D
    classDef opt fill:#E9EEF6,stroke:#23407A,color:#13202D
    class EX secret
    class API,META core
    class OPT opt

The web application reaches your directory (LDAP or OIDC). The optional services reach their own destinations: mail and chat for the notifier, your Git server for gitsync, your SIEM for siem. Nothing else leaves the host.

The services

Service Runs Holds Database role
api Always The executor's public key; the directory's service account sealfix_api: cannot update or delete audit events, cannot write executions
executor Always The private key; every target's connection string sealfix_exec: the only writer of dry runs, executions and before-images
meta-pg Always Requests (sealed), approvals, the audit chain, users, configuration Owner
notifier Optional The notification channels' secrets sealfix_notify: reads events, writes its own cursor
gitsync Optional The Git signing key Reads the chain, writes its own commits table
siem Optional The TLS client certificate for your SIEM Reads the chain, writes its own cursor
keygen, migrate At start Create the key once; run the migrations and grants

Why the API and the executor are apart

The web application faces your users and the network, so it is the most exposed part. It holds only the public key: it can seal values, never open them. The executor faces no user. It is the only process that can open a sealed value, and the only one that can reach a target database.

So a compromised web application cannot read a sealed value, cannot read a before-image and cannot reach a target. Every database role is granted the least its service needs, and the grants are re-applied at every start.

Sizing

Defaults suit a pilot: the metadata store 2 GB and 2 CPUs, the API and the executor 1 GB and 2 CPUs each, the optional services 512 MB and 1 CPU. Raise them in deploy/prod/.env, for example SEALFIX_EXECUTOR_MEM=2g for large dry runs.