Your question
Hello,
We are evaluating the unmodified official macOS arm64 binary of Stalwart v0.16.23
for a single-user, single-domain local installation. During initial provisioning,
we require listeners to remain on loopback from the first bind, including IPv6.
We will use supported management interfaces and opaque official backups only.
The documentation updated September 18 describes starting recovery mode, applying
configuration via the CLI, then restarting without recovery variables. In the
v0.16.23 source, the recovery listener binds [::]:port; the documented environment
variable changes the port but not the address. STALWART_PUBLIC_URL changes
discovery URLs, not listener bindings. A DataStore config with an empty registry
also does not establish loopback listeners: normal startup inserts default
listeners before binding. We have not started this unconfigured server on a
network-connected host.
We also compared the registry initialization, local configuration loader, boot,
defaults and recovery listener source files in v0.16.24 (September 27). All five
are byte-identical to v0.16.23. We subsequently ran bounded local tests of the
official v0.16.24 binary (JMAP/DAV, Sieve, idle memory, STARTTLS and supervision)
on prepared synthetic stores. Those tests do not establish a safe virgin bootstrap.
Could you provide an officially supported procedure and applicable released
binary version for either loopback-only bootstrap/recovery or initial offline
configuration through an object-level interface? In particular:
-
Is there a supported bind-address option beyond the documented port variable?
-
Is there a way to apply initial management objects before opening any listener,
without writing raw database records or modifying the server? -
If neither is available, is there an official planned version or recommended
supported isolation method for this requirement? -
Which supported backup/restore interfaces cover accounts, mail, contacts,
calendars, server configuration and pending transport queues?
On the pinned v0.16.23 binary with CLI v1.0.12, an empty QueuedMessage create
is explicitly rejected with “Queued messages cannot be created”; the source
rejects all creates in that handler. Which supported recovery procedure
preserves pending recipient states, retry schedules and their message blobs
without resubmitting messages? Is there a supported routine backup interface
for the embedded backend, distinct from the migration-only export/import? -
How can we start a restored server with message delivery already suspended,
before any queue worker processes due entries? In an offline synthetic test,
PauseMtaQueue prevented a due local delivery in the source process, but after
a cold export/import the target delivered that message without ResumeMtaQueue.
The pinned queue manager initializes is_paused to false. Is there a supported
persistent/startup hold that covers local and remote delivery, not an action
issued after startup when delivery may already have begun? -
Our service launches with a minimal explicit environment. A responding JMAP
session can still advertise endpoints rejected by our same-origin local client.
Supplying STALWART_PUBLIC_URL (HTTP loopback, port 18080) in the isolated lab makes
the client work. What supported persistent configuration allows a local
administration client while retaining correct public discovery URLs for
external mail/DAV clients? We will not silently follow foreign endpoints.
We checked the September 26 environment-variable documentation and the
v0.16.23 network loader and HTTP session handler: they use a single
http.url_https base, including for authenticated sessions. We therefore
cannot ship the lab loopback override as the global public URL. Is there a
supported local administration transport or per-listener discovery mechanism,
or should clients preserve the public origin while explicitly routing the
connection to a trusted local listener?Subsequent bounded tests on prepared v0.16.23 stores succeeded with a public
discovery base and explicitly loopback-routed HTTPS requests: public Host,
certificate validation for the public hostname, no redirects and no network
certificate fetching. The Swift client, health monitor and management readers
passed these local tests using a synthetic certificate and the default server
certificate. This is a candidate solution for our single-domain transport,
not a safe virgin bootstrap procedure or a claim of multi-domain SNI support.
We would appreciate confirmation of any supported constraints on that approach.
We distinguish CLI apply --dry-run (validation only) from actual provisioning,
and server --import of an opaque export from applying a declarative JSON plan.
An offline VM was used for our synthetic lab setup; it is not currently part of
our proposed customer product. No shared lab credentials or data will be shipped.
References (condensed to respect the forum’s new-user link limit):
- Declarative deployments | Stalwart
- GitHub - stalwartlabs/stalwart at v0.16.23 · GitHub
- Also consulted: the official Environment Variables documentation; source files crates/common/src/config/server/listener.rs, crates/common/src/manager/boot.rs, crates/jmap/src/registry/mapping/queued_message.rs and crates/smtp/src/queue/manager.rs in that tag.
Thank you,
Kevin — LorisLabs
I understand that topics in this category are triaged by a bot first but a human reply will follow up. If I’d prefer a human-only reply, I’ll add the no-ai tag to my topic.
on