Open edX on PostgreSQL

Running Open edX on PostgreSQL is possible for new installations through a community Tutor plugin, but it has a fresh-install-only limit and stability caveats. This page explains who it suits and what to confirm before production.

On this page

Should a new Open edX install run on PostgreSQL?

Open edX on PostgreSQL is a community-plugin path for fresh installs. It is not the default. If your team is starting a new Open edX platform and already runs PostgreSQL for other systems, the appeal is clear: one database engine to back up, monitor, patch and staff. That appeal should be weighed against a newer path with documented stability caveats, so treat PostgreSQL as a decision to validate in your own environment before you commit to it.

Open edX is licensed under the GNU Affero General Public License version 3 and built on Python, JavaScript and Django. Its two core services are Studio, where course teams author content, and the LMS, where learners take courses, and both share the platform's data layer. PostgreSQL is released under the PostgreSQL License, a permissive license similar to the BSD and MIT licenses. The PostgreSQL project publishes a versioning policy with a new major version about once a year, minor releases at least every three months, and five years of support per major version. Check that policy before choosing a version, and make sure the support window covers the planned life of the platform.

The edx-platform development requirements list MySQL 8.0 alongside Python 3.12, MongoDB 7.x and Memcached. PostgreSQL does not appear in that list, so it is a separate path that you must confirm rather than assume. Ask the plugin maintainers which Open edX releases it supports and whether it covers the migrations for your target release. Verawood is the current named release, published on 30 July 2026, and the project states that only the latest named release is supported. Plan for the next upgrade now, because the plugin may need to keep pace with each release.

The edx-platform maintainers recommend running Open edX in production through a service provider or with Tutor, and they note that bare-metal installation is complex and receives limited community support. Before you pick PostgreSQL, confirm that the plugin is available in the Tutor version you will deploy, who fixes defects in it, and how you would move to a supported database if the plugin stops meeting your needs. Those answers will tell you whether PostgreSQL reduces operating work for your team or simply moves the risk into a less-tested component.

Which database option fits your installation

This table compares the three database paths open to an organization running Open edX: the MySQL default in the development requirements, a fresh PostgreSQL install through the community Tutor plugin, and a PostgreSQL service shared with other systems. Read each row against your current installation state, because the PostgreSQL plugin path applies only to new deployments. For an existing MySQL installation, treat any move to PostgreSQL as a planned migration that must be confirmed before work starts.

PathWho it suitsWhat it requiresUpgrade implications and main risk
MySQL 8.0 (default)Teams that want the documented default path or already run Open edX on MySQLMySQL 8.0 as listed in the edx-platform development requirements, plus MongoDB 7.x and MemcachedFollows the upgrade path of your chosen release. Main risk: PostgreSQL stays a future planned migration rather than a current option.
Fresh Open edX install on PostgreSQLNew installations that want PostgreSQL and accept a community pluginTutor with the community PostgreSQL plugin introduced in Verawood, applied to a new install onlyMajor PostgreSQL upgrades need dump and restore, pg_upgrade or logical replication. Main risk: plugin stability before production use.
PostgreSQL for other systemsOrganizations already running PostgreSQL elsewhere that want one managed or self-run serviceBackups, high availability, connection pooling and access control planned for the shared service. Does not by itself move Open edX off MySQL.Minor updates replace executables and restart. Main risk: shared load and unclear ownership of database upgrades.
Fresh-install-only limitAnyone who wants PostgreSQL on an existing Open edX platformA planned migration with data export, validation and cutover, confirmed with the plugin maintainers firstExisting MySQL installations cannot be converted without that planned migration. Confirm the path before scheduling work.
Production readinessTeams that need a supported production database for learner and course dataWritten confirmation of the plugin's support status, tested backups and a rollback planStability caveats apply to the community plugin. Confirm them with the maintainers before production use.

Setting up a fresh Open edX install on PostgreSQL

This sequence takes a new Open edX installation from version selection to a verified, restorable PostgreSQL-backed platform on a non-production instance. The plugin supports fresh installs only, so each step is written to confirm that boundary before any data is loaded.

  1. Confirm the Open edX release and Tutor version

    The platform team confirms that the Open edX release being deployed is the current named release, Verawood, because Open edX supports only the latest named release at a time. They then identify the Tutor version the community PostgreSQL plugin was built for, using the plugin's own documentation, and pin both versions in the change record. Check: the decision record lists the Open edX release, the Tutor version and the plugin version, and each one is confirmed against the plugin's stated compatibility.

  2. Confirm the plugin's PostgreSQL support

    The database owner checks which PostgreSQL major versions the plugin's documentation lists as tested. They then match that list against the PostgreSQL versioning policy, which currently lists versions 14 through 18 as supported, with each version's end-of-support date. Choose a major version that remains supported for the planned life of the platform, and confirm this choice with the plugin maintainers if the documentation is unclear. Check: a written compatibility note names the chosen PostgreSQL major version, its end-of-support date and the plugin version it was verified against.

  3. Provision the database with least-privilege roles

    A database administrator creates a dedicated owner role for the Open edX databases, separate from the default postgres superuser, and a separate application role that connects to the platform. The application role receives only the privileges it needs on the objects it uses, with no superuser, role creation or database creation rights. Check: a connection made as the application role can read and write the platform schema but fails when it attempts to create a role, create a database or drop an object owned by the owner role.

  4. Configure SCRAM password authentication

    The database administrator sets password encryption to SCRAM-SHA-256 and updates the host-based authentication rules so that connections from the Tutor host use SCRAM instead of MD5. Passwords for the owner and application roles are reset after the change so they are stored as SCRAM verifiers. MD5 password authentication is deprecated in PostgreSQL 18 in favor of SCRAM, so no MD5 rule should remain in the file. Check: the password hashes for the Open edX roles begin with the SCRAM-SHA-256 prefix, no host rule uses md5, and the configuration reloads without errors.

  5. Install Tutor and the plugin on a test instance

    The platform engineer installs the pinned Tutor version and the pinned plugin on a non-production host, then sets the external PostgreSQL host, port, database names and role credentials in the Tutor configuration. Secrets are kept out of plain-text files in the repository, and the bundled database service is disabled so the platform uses the external server. Because the plugin supports only fresh installations, this instance must not be loaded with data from an existing platform. Check: the configuration renders with the external database settings, no bundled database container starts, and the plugin appears in the list of installed plugins.

  6. Run the initial database and migration steps

    The platform engineer runs the Tutor initialization job, which creates the platform schema and applies the migrations for each service in the release. The engineer reviews the job output and the database logs for errors, and confirms that the migration jobs finish before any application service is started. Check: every initialization and migration job exits successfully, the logs contain no unresolved migration errors, and the platform services start and report healthy status against the PostgreSQL server.

  7. Verify login, course creation and restore

    The QA lead signs in to the LMS as a learner and to Studio as a course author, then creates and publishes a small test course. The database administrator takes a logical backup of the database and restores it to a separate PostgreSQL instance, then starts the platform against the restored copy. Continuous archiving and point-in-time recovery are a separate decision that should be documented before production use. Check: both logins work, the test course is visible and publishable on the original instance, and the restored instance shows the same course and user accounts.

Choosing a PostgreSQL version and planning upgrades

Choose the PostgreSQL major version only after confirming which versions the Tutor PostgreSQL plugin supports, because the plugin sets the boundary of your options. Then check the support window against the life you expect for this installation. PostgreSQL supports each major version for five years after its initial release, and the currently supported majors are 14 through 18. Your team should record the chosen version, its end-of-support date and the planned review date in the same change record as the Open edX release you are deploying.

The end-of-support dates are November 12, 2026 for PostgreSQL 14, November 11, 2027 for 15, November 9, 2028 for 16, November 8, 2029 for 17 and November 14, 2030 for 18. PostgreSQL 14 reaches end of support only a few months after Verawood was published on July 30, 2026, so a fresh installation on 14 would need an upgrade soon after launch. Ask the plugin maintainers whether they test against the newest PostgreSQL majors, and ask Edly or your implementation partner how long the plugin has supported each version. A version that is supported by PostgreSQL but not yet tested with the plugin is a risk you should accept only in writing.

Minor releases and major upgrades are different operations. A minor update replaces the server executables and restarts the service, and it does not change the internal storage format, so data files stay in place. Plan minor updates as routine maintenance in a window you can roll back. A major upgrade changes the storage format and needs one of three methods: a dump and restore with pg_dumpall, pg_upgrade, or logical replication from the old major to the new one. Logical replication can keep downtime to a short cutover, and the PostgreSQL documentation describes downtime of several seconds for this method, but your actual cutover time depends on write volume, extensions and how Open edX sessions are drained. Measure it in a rehearsal on a copy of production data.

PostgreSQL 18 changes the arithmetic for in-place upgrades. Its pg_upgrade retains planner statistics across the upgrade, so the database does not start with cold statistics, and it adds parallel jobs and a --swap option to shorten the process on large clusters. Those features do not remove the need for a tested rollback plan, a backup you have restored successfully and a verified list of extensions the new major supports. Because the plugin path covers fresh installations, treat any upgrade of an existing Open edX database as a separate project. Confirm with the plugin maintainers which upgrade procedures they support before you commit to a date.

Securing PostgreSQL authentication, backups and recovery

These controls decide who can connect to the Open edX database, where its credentials live and whether the data can be restored after a failure. Each card names one control and the check that shows it works before go-live.

Choose one client authentication method

PostgreSQL offers password, certificate, LDAP, GSSAPI, OAuth and other documented methods, and each Open edX service role needs one assigned method in pg_hba.conf. For password logins, SCRAM is the method to set. Record the choice per role in the deployment plan, then test that the LMS and Studio roles connect with their assigned method and that an attempt with any other method fails.

Retire MD5 password authentication

PostgreSQL 18 deprecated MD5 password authentication in favor of SCRAM, so any pg_hba.conf line or role still using MD5 is a finding to fix before go-live and before any later major upgrade. Roles restored from older backups can carry MD5 hashes. Check by reviewing pg_hba.conf for md5 entries and querying the role catalog for password hashes that are not SCRAM, then reset the affected passwords.

Limit database network exposure

The database should accept connections only from the LMS and Studio hosts, any connection pooler such as PgBouncer, and the administration hosts that need access. Bind the listener to an internal interface, limit pg_hba.conf host entries to those source addresses, and keep the port off public load balancers and open security groups. Check from a host outside the allowed set that the port is unreachable and that an unlisted source is rejected.

Keep secrets out of Tutor files

Tutor generates and stores configuration values, including database credentials, in its project files, so those files become a secret store. Confirm which database values Tutor writes to disk for your plugin version, restrict read access to the configuration directory, and keep it out of version control. Where your deployment process allows, supply credentials from your secrets manager at deploy time. Check by searching the repository, build context and container images for the generated passwords.

Encrypt database backups

Database backups hold learner records, enrollments and account data, so they need encryption at rest and during transfer to the backup store. Keep decryption keys in a system separate from the backup storage, and document who can release them. Check by restoring an encrypted backup into an isolated environment that only approved key holders can reach, then comparing row counts and a test learner login against the source.

Test point-in-time recovery

Continuous archiving, made of a base backup plus archived write-ahead log files, is what allows restore to a chosen moment. Treat it as a requirement to test before go-live. Confirm that archive_mode and archive_command are active, that the archive lives off the database host, and that gaps in the archive raise alerts. Check by restoring to a timestamp between two known course edits, confirming the restored state, and recording the restore time.

What high availability means for a PostgreSQL-backed Open edX

High availability for an Open edX installation on PostgreSQL is a set of separate decisions, one per layer, and the database layer is the one most often assumed to be solved. PostgreSQL supports hot standby servers that serve read-only queries, along with synchronous replication, where a commit waits until standbys confirm it, and asynchronous replication, where it does not. These features reduce the risk of data loss and can offload reads. They do not, by themselves, provide automatic failover. The PostgreSQL documentation states that the server does not include software to detect a failed primary and notify a standby, so that job falls to external tools. Treat the database as one layer of the design, not as the whole answer.

If you need automatic promotion, the external tool becomes part of your production system, and it needs a named owner. Someone must decide how failure is detected, how the old primary is fenced so that two servers never accept writes, how the Open edX services learn the new primary's address, and who is alerted when promotion happens. Connection handling matters too. Applications holding connections to a failed primary need a way to reconnect, and a connection pooler such as PgBouncer changes where that reconnection happens. Write these steps down as a runbook before you test them, because a failover that has never been exercised is an unverified control.

The choice between synchronous and asynchronous replication is a trade-off to settle with the business before the build starts. Synchronous replication protects committed transactions such as enrollments, grades and certificate records, but every commit waits for standby confirmation, and if the standby is unreachable, writes can stall unless you have planned how the system should behave in that case. Asynchronous replication keeps the primary fast, but transactions committed just before a failure may not exist on the standby. Ask which Open edX data would be unacceptable to lose and how long learners can tolerate an outage, then match the replication mode and the failover design to those answers.

The Open edX side needs its own check. A multi-node deployment needs a shared Django cache backend, such as Redis or Memcached, so that every LMS and Studio node sees the same cached data. That cache is a second stateful dependency that can fail independently of PostgreSQL, so it needs its own availability plan. Confirm how Tutor handles the application tier in the setup you intend to run, including how multiple application replicas are deployed, where the cache and media storage run, and what changes in the application configuration when the database address moves during a failover. A database standby alone does not protect the whole platform.

Before you plan any standby or failover topology, confirm with the plugin maintainers whether that configuration is supported for a fresh install. The PostgreSQL plugin is a community Tutor plugin, and the setups it supports may be narrower than what PostgreSQL itself allows. Ask for the supported topology in writing, the Open edX and Tutor versions it was validated against, and any known limits on failover. If standby or failover is not supported, plan recovery instead, built on tested backups and point-in-time recovery, with recovery time and recovery point targets set by your organization in its own requirements.

Limits and stability caveats to confirm before production

Open edX on PostgreSQL has boundaries that affect when and how you can adopt it. The cards cover the install scope, plugin maintenance, release support and dates, upgrade risk and feature coverage. Each item lists what to ask the plugin maintainers or the Tutor community before you commit.

Fresh installs only

The community plugin supports new Open edX installations on PostgreSQL only. A site already running on MySQL cannot be moved to PostgreSQL by enabling the plugin, so the database choice must be made before the first deployment. Ask the plugin maintainers whether any conversion or export path exists, what they recommend for existing sites, and whether that guidance covers your data volume and custom code. Record the answer in the project plan before procurement.

Plugin maintenance and release compatibility

Confirm who maintains the PostgreSQL plugin, how recently it was updated, and which Open edX and Tutor versions it targets. The plugin must match the Tutor version you pin, and a change to the platform's database layer can break it at the next release. Ask the Tutor community where the plugin is listed, whether the maintainers plan updates for Willow and Xylon, and how security fixes reach you. Check the open issue list for database-specific defects.

Only the latest named release is supported

Open edX supports only its latest named release and states that it cannot support more than one release at a time. Verawood is the current named release, so a production site on an earlier release falls outside community support. Plan the installation to target Verawood from the start. Ask your service provider what support it gives between named releases, how it tracks security advisories, and who applies patches on your infrastructure.

Verawood, Willow and Xylon release dates

Verawood was published on 30 July 2026. Willow is listed for December 2026 and Xylon for June 2027, so a site launched on Verawood will face its next upgrade soon after go-live. Confirm these dates against the current Open edX release notes, since listed dates can change. Ask your provider how upgrade effort will be scheduled, budgeted and covered in the support agreement.

Untested upgrade path across releases

Do not assume that an upgrade from Verawood to Willow or Xylon will work on PostgreSQL. Treat each upgrade as untested until the plugin maintainers or a rehearsal in a comparable environment confirms the sequence. Ask whether the standard Open edX upgrade steps apply unchanged to this database, which migrations need manual review, and whether the maintainers support a rehearsal on a copy of production data. Keep a restorable backup before each step.

Feature coverage on PostgreSQL

Confirm that the features your institution uses work with the PostgreSQL backend before you commit. Test Studio authoring and publishing, LMS enrollment, grading and certificates, analytics through the Aspects stack, and search. Aspects stores events in ClickHouse and presents them in Superset, and search runs on its own backend, so compatibility must be checked for each component. Ask the maintainers for a list of tested features and known gaps.

What do buyers ask before hiring help for Open edX on PostgreSQL?

Is a fresh Open edX install on PostgreSQL supported?

Only for a new installation. The community Tutor plugin that adds PostgreSQL support was introduced in Verawood, the current named release published on 30 July 2026, and it is limited to fresh installs, so an existing MySQL-backed platform cannot be moved onto it through this route. Open edX supports only the latest named release, so the plugin, the Tutor version and Verawood must be matched and tested together. The platform's development requirements list MySQL 8.0, which means PostgreSQL is a deviation from the reference path and needs its own validation. Before committing, confirm the plugin's current maintenance status, its tested Tutor versions and the PostgreSQL major version it targets, and record those answers in your written scope.

What drives the cost of an Open edX PostgreSQL project?

Scope, hosting, backup design, validation, testing with actual courses and maintenance drive cost the most. Scope covers the number of sites, courses, identity providers and integrations. Hosting depends on whether the platform runs in your cloud accounts, your data centers or an air-gapped network. Backup and recovery design sets how much work goes into archiving and restore testing, because PostgreSQL point-in-time recovery depends on continuous archiving. Validation takes time because the PostgreSQL path is less common than the reference stack.

Some costs are one-time, such as discovery, build, integration and the first validation cycle. Others recur, such as patching, PostgreSQL minor updates, Open edX upgrades and monitoring. DeployOpen works from a fixed-scope written agreement and does not publish a price list. Ask every quote to separate one-time build from recurring support and to name the testing and restore drills included.

How long does an Open edX PostgreSQL implementation take?

The duration depends on the same scope drivers as cost, plus how much course content, identity configuration and data must be prepared before the build starts. A single-site pilot with one identity provider and a small set of test courses takes far less effort than several branded sites with migrated content, so no general figure applies. Ask for a timeline that shows discovery, build, testing with actual courses, go-live and handover as separate phases. Choose the PostgreSQL major version early. Support for PostgreSQL 14 ends on November 12, 2026, so the platform should run on a version that stays supported for its planned life. Name your decision owners at the start, because waiting for sign-off can stretch any schedule.

What must our institution provide for an Open edX PostgreSQL project?

Your institution provides access, information and decisions. Access means cloud accounts, data center access or network access with the rights to create the required infrastructure. Identity provider details are needed for sign-in. Open edX supports OAuth2 providers such as Google, Facebook, LinkedIn and Azure Active Directory by default, along with SAML 2.0, Shibboleth and LTI, and it has older provisional support for CAS and SSL client certificates. Course content must be available in a form the team can load and test, including a representative set of actual courses for validation. Finally, name decision owners for scope changes, go-live approval, data retention and security sign-off, and confirm who can answer questions quickly so the work does not wait on individual calls.

Can our own team install Open edX on PostgreSQL without a partner?

A skilled platform team can attempt it, but the decision depends more on skills and risk tolerance than on the installation itself. The Open edX maintainers recommend running production through a service provider or with Tutor, and they note that bare-metal installation is complex and receives limited community support. On the PostgreSQL path, your team also owns database operations: backups, point-in-time recovery, replication, connection pooling and failover. PostgreSQL does not detect a failed primary or manage failover on its own, so external tools are needed. Check whether your team already runs PostgreSQL in production, has Tutor experience, can carry the upgrade calendar and can staff testing with actual courses. A time-boxed pilot with a written list of gaps is a practical way to decide.

What happens if the community PostgreSQL plugin stops being maintained?

Plan for it in the design, because no one can promise that a community plugin will be maintained indefinitely. The Tutor plugin and hooks system is licensed under Apache 2.0, so your team or a partner can keep, fork and patch the code. Confirm the license of the PostgreSQL plugin itself before relying on that. Practical safeguards include pinning the Tutor, Open edX and plugin versions, storing build artifacts in your own registry, keeping a tested rebuild procedure and documenting an export route to a supported database path. Ask who maintains a fork, who handles security fixes and how a database migration to the reference MySQL stack would be carried out if the plugin falls behind a named release.

How should we test PostgreSQL backups and failover for Open edX?

Test restores on a schedule and measure how long recovery takes against targets your organization sets. PostgreSQL supports continuous archiving and point-in-time recovery, so the design needs base backups, archived write-ahead logs and a documented restore runbook. For availability, PostgreSQL offers hot standby servers that serve read-only queries, along with synchronous and asynchronous replication. It does not detect a failed primary or notify the standby by itself, so automatic failover requires external tooling that your team must select, configure and test. Connection pooling with PgBouncer is worth evaluating as learner connection counts grow. Verify each recovery step with a drill that restores into a separate environment, then runs a course, a quiz and a certificate check.

How DeployOpen scopes and delivers an Open edX PostgreSQL install

DeployOpen treats an Open edX on PostgreSQL install as a fixed-scope piece of work that starts with a fresh-install check and ends with documented handover. The work runs inside your cloud accounts, data centers or air-gapped networks, on the Tutor deployment path. Ongoing support and upgrades are available as a retainer once the platform is live.

How we scope

  • Confirm the install is new, since the PostgreSQL backend in this topic is for fresh installations only.
  • Record the Open edX release, Tutor version and PostgreSQL major version in the written scope before build starts.
  • Agree which authentication methods, backups and replication settings sit in scope, and which are left to your team.

How we build

  • Provision a supported PostgreSQL major version in your environment, then install Open edX through Tutor with the PostgreSQL plugin.
  • Configure connection pooling, backups and point-in-time recovery, then test a restore before the platform takes learners.
  • Run acceptance tests on course publishing, learner enrollment and grading against the PostgreSQL data path.

How we hand over

  • Deliver a runbook covering the Tutor configuration, database credentials handling and the restore procedure.
  • Document the plugin's stability caveats and the monitoring your team needs before production use.
  • Walk your operations staff through upgrade planning, since PostgreSQL major upgrades need their own tested procedure.

How we support

  • Offer ongoing support and upgrades as a retainer after handover, scoped separately from the original build.
  • Plan release moves from Verawood, the current named release, since Open edX supports only the latest one.
  • Review the PostgreSQL minor release cadence and version support dates with your team at each maintenance window.

Sources and further reading

Talk to our team.

Tell us what you're working on, whether it's a deployment, an audit, a security test or a cyber range. You'll speak with an engineer who can help you scope it.

  • 30-minute call: free, with no obligation.
  • NDA on request: we can sign before you share details.
  • Clear next steps: a scope and plan after the call.