Skip to main content
You run the appliance. Everyone else depends on you for a working install, a valid licence, sign-in, and the right roles.
1

Install

Docker Compose, Helm, or Terraform, on your own infrastructure.
2

Load the licence

One signed file, checked once at start-up.
3

Sign in as the first admin

Bootstrap secret or bootstrap admin user.
4

Connect identity

Local users, Entra ID / OIDC, SAML, or SCIM.
5

Issue API tokens

sk_ tokens for developers and CI, in local auth mode.
6

Publish the evidence key

Give auditors the public key they verify against.
7

Set who approves intakes

How many approvers a new agent needs, and whether one person may approve their own.

1. Install

Every install needs PostgreSQL. It holds the signed records and all configuration. The API image also serves the Console at /console on port 8080.
For a single host. The compose file runs postgres and sengol-api.
The compose defaults are development secrets. Override every SENGOL_* secret and POSTGRES_PASSWORD in .env before the host is shared. The compose file sets SENGOL_ALLOW_OWNER_RUNTIME_ROLE=1, so the API runs as the role that owns the tables. That is for development only.

Settings every install needs

Changing SENGOL_TENANT_ID after records exist hides those records from list and report reads. Pick the value before the first record is written.
Today every shipped install path signs with the local backend: the HMAC key lives in the process environment. Treat SENGOL_SIGNING_KEY as you would a database master key.

2. Load the licence

The licence is a signed file, verified offline when the API process starts. There are no per-feature checks and no calls home.

Get a licence

You do not need a licence to try Sengol on a laptop: the quickstart runs on the built-in dev licence. A real install needs a licence file from Sengol.
  1. Request a pilot at sengol.io/signup with your name, work email and company, and choose Run it yourself. Personal webmail addresses are not accepted, and a pilot is one per company domain.
  2. Sengol follows up by email. A pilot is arranged with Sengol after the request; it is not self-serve. If the form cannot reach Sengol it opens an email draft to trial@sengol.io. Send it to complete the request.
  3. You receive a licence file. A pilot licence runs 14 days with the full capability set, nothing gated or metered, and trial licences get no grace period.
  4. Put the file in place as below, then start the appliance. A renewal takes effect on the next start, so restart after replacing the file.
Where the file goes depends on the install path: Check what a process will see:
The local stack uses the literal dev licence, which is fine to inspect:

3. Sign in as the first admin

Use one of two bootstrap paths:
  • Bootstrap admin user (local sign-in): set SENGOL_BOOTSTRAP_ADMIN_EMAIL and, optionally, SENGOL_BOOTSTRAP_ADMIN_PASSWORD. If you leave the password out, one is generated and printed once in the API log. The user must change it at first sign-in.
  • Bootstrap secret: set SENGOL_CONSOLE_ADMIN_SECRET and exchange it for a one-hour admin token. This works whatever the identity mode, so it is also your way in if the IdP is down.
Paste the token into the Console’s Sign in with an API token instead field. Open Settings → General to confirm the licence, the signing keys, and the active ControlBook.
Settings General tab showing licence, ControlBook and policy catalog

Settings → General: licence tier, active ControlBook, policy catalog.

4. Connect identity

The sign-in mode is chosen once, at start-up: OIDC if SENGOL_OIDC_PROVIDER_URL is set, else SAML if SENGOL_SAML_* is set, else local.

Local users

Create a user with a role:
You can do the same in Settings → Access → Identity → Users:
Settings Access tab with the create-user form and user list

Settings → Access: create users, assign roles, see break-glass status.

  • A password is optional. Without one, the user can still get an sk_ token.
  • TOTP is available but not enforced. Each user enrols from their own account.
  • You cannot grant a role with permissions you do not hold yourself.

Entra ID or another OIDC provider

Register an application in your IdP, define app roles such as sengol.admin and sengol.auditor, then set:
Map each IdP role or group to a Sengol role. The highest priority wins when a user matches several:
You can also manage mappings in Settings → Access → Providers → SSO. A user who matches no mapping signs in as viewer (change it with SENGOL_OIDC_DEFAULT_ROLE).
The Docker Compose file does not forward SENGOL_OIDC_* variables. Add them to the sengol-api service’s environment block.

SCIM provisioning

Mint a SCIM bearer token and paste the token value into your IdP’s provisioning settings. It is shown once and works only on /scim/v2/*:
Point the IdP at https://<your-host>/scim/v2.

Which role for whom

Every permission is listed in Access governance.

5. Issue API tokens

sk_ tokens exist only in local auth mode. Minting one on an install that signs people in through an IdP returns 503; see Credentials by journey. Developers and CI jobs use an sk_ token. Mint one for a user. It is shown once and expires after 30 days by default:
The token carries the user’s role. In GitHub Actions, prefer OIDC to a stored token; see Gate releases in CI.

6. Publish the evidence key

Auditors verify countersignatures against your appliance’s Ed25519 public key. They should get it from you, not from the evidence pack. The key list is public:
Publish it somewhere your auditors already trust, such as your internal policy repository, and record its key id.

7. Set who approves intakes

A new agent is registered when an approver approves its intake. Out of the box one person is enough, and that person may be the one who submitted it. Approving needs an interactive sign-in: a password, SSO, or sengol login --device approved in the Console. The bootstrap-secret token in step 3 cannot approve, so use one of those. Set the rule per risk tier. required_approvals counts the person who approves. same_actor_rule is allow (the default), reason or block. You need sod:override, which admin, approver and cro hold.
Now a HIGH intake needs two different approvers, and the submitter cannot be one. Read the settings back:
Remove the row to return a tier to the default:
The Console’s Settings → Access → SoD tab sets the approver count. The same-person rule is set through the API. To send intakes to specific teams, such as Privacy, set up a review workflow.

Day-two checks

  • GET /health returns {"status":"ok",...}.
  • The Console’s Settings → System Health tab shows component status.
  • Back up PostgreSQL. It holds every record and every setting.