Issue Description
Pulling the v0.16.6 Docker image on top of an existing v0.15.5 data + config layout silently puts the server into bootstrap mode (server.bootstrap-mode warning, No configuration file was found), which prompts a fresh setup wizard and would effectively orphan all existing principals, mailboxes, and configuration. Looking for the official 0.15 → 0.16 migration path, or for the container to detect the legacy layout and either auto-migrate or refuse to start.
Cross-posted from GitHub Discussion #3184 per the discussions-bot redirect.
I noticed there’s an existing topic on this forum (“All email lost after upgrading to stalwart 0.16”) describing what looks like the worst-case outcome of proceeding through the wizard — which is the scenario this report is asking how to avoid.
Expected Behavior
If 0.16 detects a populated 0.15 data directory but no 0.16-compatible config, it should either:
- Auto-migrate the legacy layout, OR
- Refuse to start with a clear error such as
legacy 0.15 layout detected at /opt/stalwart; see migration guide at …
An official 0.15 → 0.16 migration guide for Docker users would also resolve this — covering path changes (/opt/stalwart/etc/config.toml → wherever 0.16 expects it), data directory remap, and RocksDB format compatibility.
Actual Behavior
Container starts cleanly (status: healthy) but immediately enters bootstrap mode, displaying a temporary administrator account and offering port 8080 for initial setup — as if no existing data or config existed. All my data at /opt/stalwart/... (RocksDB blobs, principals, sieve scripts) is silently ignored. Proceeding through the wizard would, presumably, wipe or overwrite existing state (consistent with the “All email lost after upgrading” topic already on this forum).
Reproduction Steps
- Working 0.15.5 setup with these volume mounts in
docker-compose.yml:services: stalwart: image: stalwartlabs/stalwart:v0.15 volumes: - /var/stalwart/stalwart-data:/opt/stalwart - /var/stalwart/stalwart-config/config.toml:/opt/stalwart/etc/config.toml:ro - Bump the image tag to
stalwartlabs/stalwart:v0.16.6. No other changes. - Run
docker compose up -d stalwart. - Observe bootstrap mode warning + temporary admin credentials in container logs.
Relevant Log Output
🔑 Stalwart bootstrap mode - temporary administrator account
username: admin
password: <redacted>
WARN Server started in bootstrap mode (server.bootstrap-mode)
details = "No configuration file was found. Port 8080 is open for initial setup."
version = "0.16.6"
INFO Application resource updated (resource.application-updated)
details = "Stalwart Web Interface"
INFO Network listener started (network.listen-start)
listenerId = "http-recovery", localPort = 8080
I rolled back to v0.15 immediately and restored from snapshot before clicking through any bootstrap step. The 0.16 container is destroyed and that bootstrap password is no longer valid; it’s omitted as a matter of basic hygiene.
Stalwart Version
v0.16.x
Installation Method
Docker
Database Backend
RocksDB
Blob Storage
S3-compatible
Search Engine
Internal
Directory Backend
Internal
Additional Context
Single-node Docker Compose on Debian 12. ~60 MB of data. R2 (S3-compatible) blob backend. All inbound MX + outbound (via MXRoute relay) live in production. Happy to help test a documented migration path on a snapshot copy if useful.
I have reviewed the documentation and FAQ and confirm that my issue is NOT addressed there.
on
I have searched this support forum (open and closed topics) and confirm this is not a duplicate.
on
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