Your question
Version: Stalwart 0.16.19 (Docker image stalwartlabs/stalwart:v0.16)
Deployment: Docker Compose, official image, no custom build. Data store: PostgreSQL 16 (external container). In-memory/lookup store: Redis 7 (external container). Port 8080 published to 127.0.0.1:8080 for JMAP/admin; ports 443/993/995/465/587/25/4190 are container-internal only (not published to host — a separate native Postfix/Dovecot stack handles real mail on this host).
What I did: Called x:Account/set with a create action to add a new mailbox account under an existing domain:
{
“using”: [“urn:ietf:params:jmap:core”, “urn:stalwart:jmap”],
“methodCalls”: [
[“x:Account/set”, {
“create”: {
“a1”: {
“@type”: “User”,
“name”: “noreply”,
“domainId”: “b”,
“credentials”: {“0”: {“@type”: “Password”, “secret”: “”}},
“roles”: {“@type”: “User”}
}
}
}, “0”],
[“x:Account/get”, {“ids”: [“#a1”]}, “1”]
]
}
The target domain (domainId: “b”, name tailoromni.com) has Automatic DKIM management (dkimManagement: {“@type”: “Automatic”, “selectorTemplate”: “v{version}-{algorithm}-{date-%Y%m%d}”, “rotateAfter”: 7776000000, “retireAfter”: 604800000, “deleteAfter”: 2592000000}) — this domain was created directly via the admin API some time before, not through Manual DKIM (which is what I’d normally use for a tenant domain).
What happened: The first request attempt didn’t reach the server (blocked by a local safety mechanism on my end before it went out). The retry got “empty reply from server” (curl exit 52) instead of a normal JMAP response. Port 8080 has been completely unresponsive ever since — no HTTP response of any kind, on any path.
What I’ve ruled out:
Not a process crash: docker exec … cat /proc/1/status shows the stalwart process alive, state S (sleeping, not spinning/deadlocked)
Not the backing stores: Postgres (pg_isready) and Redis both healthy throughout
Not a listener issue: docker exec … cat /proc/net/tcp6 confirms port 8080 (and 443, 993, 995, 465, 25, 4190) all show LISTEN state inside the container
Not docker-proxy/host networking: connecting directly to the container’s internal IP (bypassing the host port-forward entirely) gets the same failure (curl exit 56, receive error)
Not container/network-namespace state: docker compose up -d --force-recreate (full container recreation, fresh network namespace) reproduces the exact same failure immediately on the new container
The Docker image’s own embedded healthcheck (https://127.0.0.1:443/healthz/live, checked from inside the container) keeps passing continuously (200 OK) throughout — so something on 443 responds, just not on 8080
Since the failure survives full container recreation, it points to something in the persisted Postgres-backed data/config store rather than anything in the container or network layer — but I don’t have documentation for the internal schema (found tables named single letters: a through y, s_cal, s_card, s_email, s_trace) and don’t want to guess at direct SQL changes there.
Question: Is this a known interaction between x:Account/set create and a domain using Automatic DKIM management? And is there a safe, sanctioned way to inspect or repair whatever got left in a bad state — ideally without a full re-bootstrap, since this Stalwart instance also hosts a second, unrelated domain’s mail configuration that I’d rather not disturb?
Happy to provide docker logs, more /proc details, or anything else useful — logging on this container hasn’t produced any new lines since well before the incident despite the process being active, which might itself be a separate clue.