Repository navigation
Conversation
Adds extenddb/extenddb-cassandra to the container release pipeline for the 1.0 release, built and released the same way as extenddb-mongodb. - Dockerfile.cassandra: the MongoDB image's Dockerfile with the cassandra feature, its notices file and labels. - docker-compose.cassandra.yml: local reference stack and what the release smoke test runs. One Cassandra 4.1 node with PasswordAuthenticator and CassandraAuthorizer, not published on the host; cassandra-auth-init replaces the stock superuser password on first start through 0600 cqlsh credentials files and fails closed if password authentication is off. All three passwords are required variables. Later starts run the migrate preview and run migrate --yes only when migrations are pending. - ci/smoke-test-cassandra-container.sh: image identity and hardening, Cassandra authentication and exposure, the application role's credentials and grants, a DynamoDB round trip, persistence across restart, SIGTERM, and the migrate path after recreating the stack. - release-image, promote-image, ghcr-mirror, sign-image and dockerhub-description gain extenddb-cassandra. release-image's gate now refuses a tag that has no Dockerfile or smoke script for the chosen image, and the build cache is scoped per image and architecture. The licences push trigger watches SOFTWARE-LICENSE-NOTICES-CASSANDRA.html. - The two existing smoke scripts' "tool is absent" checks used `! command -v`, which never fails under `sh -e`; they now exit explicitly. - Docs: docker/README-cassandra.md, the Docker Hub overview, README.md, and docs/cassandra-setup.md (container image section; keyspace replication procedure including system_auth).
robinnsc
force-pushed
the
feat/cassandra-image
branch
from
November 1, 2026 09:44
95f2762 to
dfaa726
Compare
robinnsc
changed the base branch from
main
to
feat/catalog-migrations-cassandra-mongodb
November 1, 2026 09:45
This was referenced Nov 1, 2026
Merged
Base automatically changed from
feat/catalog-migrations-cassandra-mongodb
to
main
November 2, 2026 22:45
4 of 8 tasks
This branch has not been deployed
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Stacked on #681 (which is stacked on #666): its diff is against
feat/catalog-migrations-cassandra-mongodb. #681 fixes #726, which thisimage's upgrade path and smoke test depend on.
What
Adds
extenddb/extenddb-cassandrato the container release pipeline, built,smoke-tested, scanned, signed, mirrored and promoted the same way as
extenddb-mongodb.Dockerfile.cassandra:Dockerfile.mongodbwith--features cassandra,SOFTWARE-LICENSE-NOTICES-CASSANDRA.htmland its own labels. Same pinnedbases,
apt-get upgrade, UID 10001, setuid bits stripped.docker-compose.cassandra.yml: local reference stack, and what the releasesmoke test runs.
cassandra:4.1node (pinned digest, from the ECR Public mirror) withPasswordAuthenticatorandCassandraAuthorizerenabled incassandra.yaml, soinitgrants the application role only itspermissions (feat(migrations): catalog migrations with a ledger in every store, for Cassandra and MongoDB #681). No host port.
cassandra-auth-initreplaces the stockcassandra/cassandrapassword onfirst start. It hands passwords to cqlsh through 0600 credentials files on
a tmpfs, never on a command line; refuses
cassandraand any passwordcqlsh's configparser would not read back exactly; fails closed if a random
password is accepted (authenticator not active); and reports a password
that differs from the one the volume was first started with.
${VAR:?}variables. ExtendDB is published on127.0.0.1only.migratepreview and runsmigrate --yesonly when it exits 3, soupon a running stack whosecatalog is current succeeds instead of waiting for the running server.
ci/smoke-test-cassandra-container.sh: random passwords per run; imagelabels and
--version; hardening; no Cassandra, cqlsh or JVM in the image;the stock and a random password refused with
Bad credentials; theapplication role logs in with its configured password, can read the catalog
and is refused
ALTER ROLEon the superuser (Unauthorized);extenddb.tomlholds the application password and not the superuser's; a DynamoDB round
trip; persistence across restart; graceful SIGTERM; and the migrate branch
after recreating the stack. Every
compose upis bounded byCOMPOSE_UP_TIMEOUT(600 s).release-image,promote-image,ghcr-mirror,sign-imageanddockerhub-descriptiongainextenddb-cassandra.release-image's gate now refuses a tag that has no Dockerfile or smokescript for the chosen image, with a message naming the missing file,
before cargo-about is installed. This replaces the MongoDB-only
--backendcheck. For postgres and mongodb every tag gets the same gateresult as on main. The licence step also takes
--backendfromenv:instead of interpolating it into the script.
casethat failsclosed.
<image>-<arch>instead of<arch>, so thethree images no longer replace each other's cache index.
promote-imagevalidates the image fromenv:instead of interpolatingthe input into the script.
licenses.yml's push trigger also watchesSOFTWARE-LICENSE-NOTICES-CASSANDRA.html(the PR check already ran it).ci/smoke-test-container.shandci/smoke-test-mongodb-container.shused! command -v, which never failsunder
sh -e. They now exit explicitly.docker/README-cassandra.md(init, serve, certificate, replicationfactor, production, upgrade, reference stack),
docker/dockerhub-overview-cassandra.md,README.md(which now also saysSQLite has no production image and links
docs/dev-image.md), anddocs/cassandra-setup.md(a container image section, and a keyspacereplication procedure that covers the keyspaces
initcreates at RF 1 andsystem_auth). Both image pages carry the backend's experimental notice,recommend
CassandraAuthorizer, and say to use a cluster for ExtendDBalone under
AllowAllAuthorizer, where the application role can read, dropand alter everything in the cluster.
Why
1.0 is the first release with a published Cassandra-backed artifact. Until
now the backend could only be built from source, and
release-imagehad noCassandra option.
Testing done
On an x86_64 host, with the image built with
docker buildfrom thisbranch on #681's head b8584d5 (amd64 only):
ci/smoke-test-cassandra-container.shin prebuilt mode passes end to endat this commit, including the recreate step's
migratewith the rotatedsuperuser password, under
CassandraAuthorizer.docker compose upon a running, current stack exits 0 after 4 s(the preview reports up to date).
During review, on this branch before it was stacked on #681 (same image
content apart from #681's code, earlier compose file without the authorizer
and the preview step):
cassandra-auth-initagainst a scratch node: the stock password isrefused; the first start rotates the password; a restart with a different
password fails with the
down -vmessage; a trailing non-breaking space andan embedded carriage return are refused before rotation; a password with
' " \ % $ # ; = [ ]and non-ASCII characters rotates and logs in; nocredentials file is left on the container's writable layer;
downleavesno anonymous volume.
init,serveand certificate commands (only the image tag,the contact point and
--networksubstituted) against a scratchpassword-authenticated node: init succeeds on a named volume, serve
is healthy under
--read-only --cap-drop ALL.ALTER KEYSPACE system_auth ...from the replication procedure runs onCassandra 4.1.12. On a single node it then makes the default superuser's
logins fail with
Cannot achieve consistency level QUORUM, which is why theguide caps the factor at the node count.
high or critical findings.
ci/smoke-test-container.shandci/smoke-test-mongodb-container.shpassagainst
extenddb-postgres:0.1.14andextenddb-mongodb:0.1.14; their newabsence checks exit 1 when the tool is planted on
PATH, where the oldones passed.
script; actionlint 1.7.7 reports only the existing custom runner label.
Not tested: the arm64 build and smoke leg (the pinned Cassandra index includes
linux/arm64/v8), and any release workflow run, since no tag contains
Dockerfile.cassandra.Not closed here
extenddb migrate,verifyandsettingshang on a Cassandra cluster whose superuser is not on the stockpassword (storage-cassandra: migrate, verify and settings hang when the superuser password is not the stock one #726), so this image's smoke test would fail at its migrate step.
Retarget to main after feat(migrations): one list of catalog migrations with a ledger in every store, for SQLite and PostgreSQL #666 and feat(migrations): catalog migrations with a ledger in every store, for Cassandra and MongoDB #681 merge.
readable after propagation. Today a private GHCR package would pass the
pipeline.
about 18 hand-kept copies).
docker/dockerhub-overview-mongodb.mdanddocker/README-mongodb.mdhavethe same host-directory ownership problem the Cassandra pages had, and
docker/README-mongodb.mdpins a0.1.8tag that was never published (notag before v0.1.12 has
Dockerfile.mongodb).Maintainer setup
Before merge:
extenddb/extenddb-cassandra, andgive
DOCKERHUB_TOKENwrite access if it is scoped per repository. Themerge push runs the Docker Hub description workflow for the new overview,
and its validate job fails while the repository does not exist.
publish/sign/propagate: with the new cache scope a re-dispatch rebuilds
cold, gets a different image ID, and publish refuses to overwrite the
candidate (
sign-imageandghcr-mirrorcan still finish it).Before the first
release-imagedispatch forextenddb-cassandra:extenddb/extenddb-cassandra, and confirmthe
ExtendDBEcrPublicGitHubPublisherpolicy covers it.ghcr.io/extenddb/extenddb-cassandratothe repository and make it public before promoting.
guide and both image pages carry it.
Checklist
cargo test --workspace) — not run: no Rust source changedci/smoke-test-cassandra-container.shADR / RFC: n/a — packaging and release workflow only.
Breaking changes
None for users. For maintainers: the release build cache scope changes from
<arch>to<image>-<arch>(see setup step 3).By submitting this pull request, I confirm that my contribution is made under
the terms of the Apache License 2.0 and I agree to the Developer Certificate of
Origin (DCO). See CONTRIBUTING.md for details.