Skip to content

Everything the console does, scriptable

The console is one client of the control plane. Anything you can do there you can do from a script, which is what makes provisioning a customer a job rather than an afternoon.

The admin console’s API tokens, Applications tab: two tokens, each with what it may do and the address it may send as.

The API

REST, documented by an OpenAPI schema generated from the same definitions the server validates with — so the documentation cannot describe a shape the API does not accept. Swagger UI ships with it. Tokens are scoped and revocable.

  • OpenAPI derived from the server’s own schemas
  • Swagger UI included
  • Scoped, revocable tokens
  • Owner, admin and domain-admin roles

The CLI

mailctl installs the stack, diagnoses it, backs it up, restores it and upgrades it — with a rollback that is conditional on whether the database has migrated, because an upgrade that has already changed the schema cannot be undone by swapping images back.

  • install · doctor · backup · restore · upgrade
  • Licence status, activate and transfer
  • Conditional rollback on a failed upgrade
  • Exit codes that mean something

Headless from the start

The installer takes an answers file, so a server can be provisioned without anybody opening a browser. From 0.3.0, the release it installs is verified against a signed manifest before anything is pulled or written.

  • Answers file for unattended install
  • Signed release manifest, checked before the pull (from 0.3.0)

More

Where these claims come from

Each line on this page is backed by a document in the product’s own repository. They are private, so the paths are given rather than linked; ask us if you want to see one.

  • mailserver · docs/feature-docs/rest-api.md
  • mailserver · docs/feature-docs/headless-install.md
  • mailserver · docs/adrs/0005-install-operate-configure-separation.md
  • mailserver · docs/adrs/0020-upgrade-rollback-is-conditional-on-the-schema.md
  • mailserver · docs/adrs/0026-a-release-is-signed-and-an-unverified-one-is-refused.md