This release adds 2 notable features for engineering teams evaluating rollout.
✓ No known CVEs patched in this version
Topics
+2 more
Affected surfaces
Summary
AI summaryAdds snap commands for forced MongoDB→FerretDB migration and maintenance mode, plus bug fixes preventing silent database readiness failures.
Changes in this release
| Type | Severity | Summary | CVE |
|---|---|---|---|
| Feature | Medium |
Adds `snap run wekan.migrate` command to force fresh MongoDB → FerretDB migration. Adds `snap run wekan.migrate` command to force fresh MongoDB → FerretDB migration. Source: llm_adapter@2026-07-15 Confidence: high |
— |
| Feature | Medium |
Adds `snap run wekan.maintenance on|off` maintenance mode for manual DB access. Adds `snap run wekan.maintenance on|off` maintenance mode for manual DB access. Source: llm_adapter@2026-07-15 Confidence: high |
— |
| Bugfix | High |
Fixes `db-eval` MongoDB driver loading failure causing all readiness checks to silently fail. Fixes `db-eval` MongoDB driver loading failure causing all readiness checks to silently fail. Source: llm_adapter@2026-07-15 Confidence: high |
— |
| Bugfix | High |
Prevents failed migration from disabling MongoDB and leaving WeKan without a database. Prevents failed migration from disabling MongoDB and leaving WeKan without a database. Source: llm_adapter@2026-07-15 Confidence: high |
— |
| Bugfix | Medium |
Makes mongod-7 readiness probe fast‑fail when temporary mongod has exited. Makes mongod-7 readiness probe fast‑fail when temporary mongod has exited. Source: llm_adapter@2026-07-15 Confidence: high |
— |
Full changelog
v9.93 2026-07-15 WeKan ® release
This release adds the following new features:
-
Snap: new
snap run wekan.migratecommand to force a fresh MongoDB → FerretDB migration
(snap-src/bin/wekan-force-migrate, registered insnapcraft.yaml). Ignores thedatabase
setting and the migration marker, removes any partial FerretDB SQLite + resume checkpoint,
then re-runs the migration so it re-reads the existing MongoDB (3 or 7) data and migrates
text + attachments + avatars to FerretDB again. The source MongoDB data is never modified or
deleted. Watch it withsnap logs -f wekan.mongodbor the migration dashboard. Thanks to xet7. -
Snap: new maintenance mode (
snap run wekan.maintenance on|off) so you can run MongoDB OR
FerretDB by hand for data access (snap-src/bin/wekan-maintenance,
snap-src/bin/wekan-maintenance-page.mjs, and the DB control scripts). While the
$SNAP_COMMON/.wekan-maintenancemarker is present, the control scripts do not auto-migrate
or auto-disable, sosnap start wekan.mongodb(old MongoDB data) orsnap start wekan.ferretdb
(migrated FerretDB SQLite data) stays up instead of shutting itself down — letting you reach the
data over the MongoDB wire protocol on port 27019 (one at a time; they share the port). WeKan
itself serves an "under maintenance" page (HTTP 503) on the web port for all URLs while
maintenance is on, so end users see a clear message. The page shows the Admin Panel product
name if one is set (not "WeKan"): it is cached to$SNAP_COMMON/.productname.txtwhile a
database is running (bywekan-controlon startup and by the migration importers), so it is
still available in maintenance mode when both databases are stopped. Thanks to xet7.
and fixes the following bugs:
-
Snap:
db-evalcould not load the MongoDB driver, so EVERY database readiness check
silently failed (snap-src/bin/db-eval.mjs; alsomigrate-schema-v843.mjs,
migrate-gridfs-to-fs.mjs).db-evalis the small Node helper the snap uses (instead of
mongosh) to check whether MongoDB/FerretDB is up, elect the replica-set primary, and run
the migration's mongod-7 readiness probe. It didimport { MongoClient } from 'mongodb'and
the wrapper setNODE_PATH=$SNAP/programs/server/node_modulesto point at the bundled
driver — but Node's ESM loader ignoresNODE_PATH(that env var is honored only by the
CommonJS loader). So the import resolved nothing,db-evalexited before ever opening a
connection, and everyping/primary/rs-*check "failed." This was the single root
cause behind a whole family of symptoms: WeKan looping "MongoDB not ready yet, retrying…"
or "FerretDB not ready yet…" forever even though the database was running and listening;
replica-set initialisation failing; and — most damaging — the MongoDB → FerretDB migration
falling back to MongoDB 3.2 because the mongod-7 readiness probe never connected (mongod
7 opened the data fine, butdb-evalcouldn't reach it, so migration-control wrongly
concluded "mongod 7 can't open this" and tried the 3.2 reader, which cannot read WiredTiger-7
files — producing no FerretDB SQLite). Proven by the migration source mongod log: mongod 7
reachedWaiting for connectionswith zeroConnection acceptedbefore being killed by
the readiness timeout. Fixed by resolving the driver withcreateRequire(CommonJS, which
does honorNODE_PATHand the bundle layout), anchored inside the modern bundle. Thanks
to xet7. -
Snap: the presence of a FerretDB SQLite database — not the migration marker — now decides
whether to use FerretDB, so a FAILED migration no longer leaves the snap with no database
(snap-src/bin/ferretdb-control,snap-src/bin/mongodb-control,snap-src/bin/wekan-control).
An earlier attempt keyed the "use FerretDB / disable MongoDB" decision off the
$SNAP_COMMON/.migration-to-ferretdb-donemarker. Butmigration-controlalso writes that
marker when the migration falls back (data unreadable, tools missing) or when there is
nothing to migrate — with no FerretDB data produced. So on a server whose MongoDB → FerretDB
migration failed,mongodb-controlsaw the marker, logged "migration already finished;
disabling mongodb service" and disabled MongoDB, while FerretDB's SQLite was empty — leaving
WeKan with no database at all, looping "MongoDB not ready yet, retrying…" forever and refusing
to keepwekan.mongodbrunning. Now all three scripts decide from actual data on disk:
MongoDB is disabled / FerretDB is forced only when a*.sqlitedatabase exists in
files/db; an emptyfiles/dbmeans the migration did not succeed, so MongoDB starts
normally and WeKan keeps working while the migration can be retried. The check is a single
shared helper (snap-src/bin/ferretdb-has-data) that requires a*.sqlitefile bigger than
0 bytes, not merely present, so a 0-byte stub never counts as "migrated". And
migration-control'sfinish_successnow verifies that non-empty SQLite (with its WAL)
exists before switching to FerretDB — if the importer returns success but wrote no data, the
snap keeps MongoDB and retries next start instead of switching to an empty database. Thanks to
xet7. -
Snap: the migration's mongod-7 readiness probe fast-fails when the temporary mongod has
exited (snap-src/bin/migration-control).ready_via_nodewaits up to 45 s for the
temporary source mongod to accept connections (a large MongoDB 6/7 database can need that long
to replay its journal, #6454), but it now also checks the process is still alive: if the temp
mongod has exited — e.g. mongod 7 cannot open old MongoDB 3.x data — it stops waiting
immediately and drops to the MongoDB 3.2 reader instead of pinging a dead process for the full
timeout. Matters across many unattended 6.09 → 9.x upgrades. Thanks to xet7.
Thanks to above GitHub users for their contributions and translators for their translations.
Weekly OSS security release digest.
The CVE patches and breaking changes that affected production tools this week. One email, every Sunday.
No spam, unsubscribe anytime.
Share this release
About wekan
The Open Source kanban, built with Meteor. GitHub issues/PRs are only for FLOSS Developers, not for support, support is at https://wekan.fi/commercial-support/ . New English strings for new features at imports/i18n/data/en.i18n.json . Non-English translations at https://app.transifex.com/wekan/wekan only.
Related context
Related tools
Beta — feedback welcome: [email protected]