Production-ready Discourse forum in one command. All-in-one with PostgreSQL, Redis.
3.3K
readystack/discourse:v2026.9.1-CE-ubuntu24.04-r1
A cosign-signed build of github.com/discourse/discourse v2026.9.1 (GPL-2.0-or-later, community discussion platform), built clean-room from official upstream source by ReadyStack.
Signature, user and attestations below were measured on the published digest sha256:c262eaba8e6fa8d675da67e1a63cdb695ad9f3bce4f50fc94c9701aeaa974b1b on 2026-10-28.
04daa92344a52dbc) on this release's index digest sha256:c262eaba8e6fa8d675da67e1a63cdb695ad9f3bce4f50fc94c9701aeaa974b1b; verify with cosign verify --key https://readystack.dev/keys/cosign.pub readystack/discourse:v2026.9.1-CE-ubuntu24.04-r1.discourse).This image follows the ReadyStack release-tag convention:
The current release is v2026.9.1-CE-ubuntu24.04-r1 — the release on sale at readystack.dev. Release tags use the pattern <upstream-version>-CE-<base-os>-r<N>; the current one is signed, attested (SBOM + provenance), and is provided under the ReadyStack Agreement.
Earlier release tags (an older version or revision in the same pattern) are superseded. They stay pullable so existing deployments can pin them, but they are no longer re-graded, and fixes appear only in newer releases: move to the current release. For a superseded release's build kit, ask support.
Release tags never move, so pulling the same tag again never changes the image. To be offered each new release automatically (a new revision r<N+1>, or a new upstream version), use the ReadyStack Renovate preset: https://readystack.dev/updates.html
Any tag beginning with internal- is an engineering-pipeline artifact published for build observability. It is unsupported, may change or disappear without notice, and must not be used in production.
# ✓ current release
docker pull readystack/discourse:v2026.9.1-CE-ubuntu24.04-r1
# ✗ unsupported (do not pull)
docker pull readystack/discourse:internal-...
This release is signed; verify it with cosign verify --key https://readystack.dev/keys/cosign.pub readystack/discourse:v2026.9.1-CE-ubuntu24.04-r1 (the signature is recorded in the public Sigstore transparency log). Support: [email protected], as set out in the ReadyStack Agreement.
Requires PostgreSQL 13 or newer WITH the pgvector extension 0.8.0 or newer, and Redis 7: the core Discourse AI plugin's migrations create the vector extension, so a PostgreSQL without pgvector fails the first start. One container runs Discourse's own web server (Pitchfork) as a non-root user on port 3000; its master process also starts and supervises one Sidekiq background worker (UNICORN_SIDEKIQS=1). PostgreSQL and Redis are external and provided by you. No nginx: put your own TLS reverse proxy in front.
Secrets go in env files that only you can read, not on the command line, and passwords that only set up the first start come out of them after setup. Create each file with install -m 600 /dev/null <file>, then write its lines into it with an editor, with your own values (a value typed into a shell stays in its history). Docker reads each line as written: no quotes around a value, no spaces around =.
discourse-db.env:
# First start only: the postgres image reads POSTGRES_PASSWORD only when it initialises its empty volume. You can remove this line after the first start and recreate the db container; the database keeps the password.
POSTGRES_PASSWORD=YOUR_POSTGRES_PASSWORD
discourse.env:
# Needed at every start: the same database password as POSTGRES_PASSWORD.
DISCOURSE_DB_PASSWORD=YOUR_POSTGRES_PASSWORD
docker network create discourse-net
docker run -d --name db --network discourse-net -e POSTGRES_DB=discourse -e POSTGRES_USER=discourse --env-file ./discourse-db.env -v discourse-db:/var/lib/postgresql/data pgvector/pgvector:0.8.3-pg16
docker run -d --name redis --network discourse-net -v discourse-redis:/data redis:7-alpine
until docker exec db pg_isready -U discourse -d discourse; do sleep 2; done
docker run -d --name discourse --network discourse-net -p 3000:3000 -e DISCOURSE_HOSTNAME=localhost -e DISCOURSE_DB_HOST=db -e DISCOURSE_DB_NAME=discourse -e DISCOURSE_DB_USERNAME=discourse -e DISCOURSE_REDIS_HOST=redis -e [email protected] --env-file ./discourse.env -v discourse-uploads:/var/www/discourse/public/uploads -v discourse-backups:/var/www/discourse/public/backups readystack/discourse:v2026.9.1-CE-ubuntu24.04-r1
PostgreSQL must have pgvector 0.8.0 or newer (the pgvector/pgvector image above has it). The first start applies every database migration before the server listens on port 3000, which takes several minutes. Set DISCOURSE_HOSTNAME to your public host name and add DISCOURSE_SMTP_* settings so accounts can be activated, and create the first administrator with bin/rake admin:create. Use the same database password for POSTGRES_PASSWORD in discourse-db.env and DISCOURSE_DB_PASSWORD in discourse.env.
The complete --network=none build kit for this image — plus admin/DB/API handbooks, the build's validation records, and its build provenance records — is at readystack.dev/buy.html. A clean-room rebuild from this release's archive on an egress-blocked host reproduced its linux/amd64 digest sha256:ac5369835d0a1705eae615e4cf1bb2ae8c14974ca63e7fb8aacb244d2a4bec11 on 2026-10-27.
— ReadyStack · readystack.dev
Content type
Image
Digest
sha256:c262eaba8…
Size
505.3 MB
Last updated
1 day ago
docker pull readystack/discourse:v2026.9.1-CE-ubuntu24.04-r1