OpenProject PostgreSQL 17 upgrade

Moving an existing OpenProject installation to PostgreSQL 17 means a planned backup, a supported major-version method and a downtime window sized to your data. This page explains each step, what drives effort and what you need to confirm first.

On this page

How to plan an OpenProject PostgreSQL 17 upgrade

If your OpenProject instance runs on an older PostgreSQL major version, moving to PostgreSQL 17 is a database major-version change that needs a verified backup, a restore test and a planned downtime window. OpenProject officially supports PostgreSQL 16 or later since OpenProject 16.0.0, and it requires the pg_trgm, btree_gist and unaccent extensions, so confirm those are present on the target server before you schedule anything.

The timing matters. PostgreSQL 14 reaches end of support on November 12, 2026, after which it receives no further fixes, including security fixes. PostgreSQL 17 is supported until November 8, 2029. Teams still on 14 or 15 therefore face a deadline that they can plan around, but only if they start early enough to test the restore, the extensions and the application before the old version leaves support. Note that PostgreSQL 16 is supported until November 9, 2028 and 15 until November 11, 2027, so the choice of 17 gives a longer runway than a move to 16 would.

Before you commit to a date, read the OpenProject release notes and identify the exact release you will run after the upgrade. Confirm whether that release documents PostgreSQL 17 support, because the official support statement in the system requirements is the document your change board and your vendor support terms will rely on. If the release notes do not mention PostgreSQL 17, ask OpenProject to confirm in writing before you rely on it. Also check whether your OpenProject version and your target PostgreSQL version need to change in the same window, since combining the two changes makes rollback harder.

Decide which upgrade path fits your installation type. Packaged installs, Docker Compose deployments and all-in-one containers each store the database differently and expose different tools for dumping and restoring it. In every case, plan the database dump with the same PostgreSQL client tools that match the target major version, record the current OpenProject version, and keep a copy of the configuration and attachments. Ask your administrator to document who approves the cutover, who can execute a rollback, and how long users will be locked out.

What changes for an OpenProject install on PostgreSQL 17

This table sets out what changes when an OpenProject installation moves to PostgreSQL 17 and what each change asks of your team. Read each row as a check to complete before you choose a target OpenProject release and a maintenance window. The main takeaway is that the PostgreSQL 14 end date and your target OpenProject release set the timing, while PostgreSQL 18 is a separate decision.

ChangeImpactAction needed
Minimum PostgreSQL versionOpenProject supports PostgreSQL 16 or later from OpenProject 16.0.0, so PostgreSQL 17 falls within the supported range.Confirm your current OpenProject release is 16.0.0 or later before you schedule the move.
Required extensionspg_trgm, btree_gist and unaccent must be present in the OpenProject database after the move.Verify the extensions are available on the PostgreSQL 17 server and check which role must create them.
PostgreSQL 14 end of supportPostgreSQL 14 support ends on November 12, 2026, so an install still on 14 falls out of support during this window.Treat November 12, 2026 as the latest date to finish the move off PostgreSQL 14.
PostgreSQL 17 support windowPostgreSQL 17 is supported until November 8, 2029, which sets how long this version stays current after the move.Confirm the end date against the PostgreSQL versioning policy when you start the project.
PostgreSQL 18 availabilityPostgreSQL 18 was first released on September 25, 2025, with its final release scheduled for November 14, 2030.Make this a separate decision and confirm OpenProject's support for PostgreSQL 18 before choosing it.
OpenProject release datesCandidate releases are 17.7.0 on August 5, 2026, 17.8.0 on September 2, 2026, 17.9.0 on September 30, 2026 and 17.9.2 on October 15, 2026.Pick the target release and check its release notes for the PostgreSQL 17 requirements that apply to it.
First release documenting PostgreSQL 17The release that first documented PostgreSQL 17 support is not stated on this page.Confirm the first documenting release in the OpenProject release notes before you pin the target version.

How the PostgreSQL major upgrade works for OpenProject

A PostgreSQL major upgrade is a different kind of work from a minor update, and the difference determines how OpenProject is taken offline. Minor PostgreSQL releases never change the internal storage format, so they only replace executables and restart the server. A major release changes the data format, so the existing data must be rewritten or moved into a new cluster. PostgreSQL documents three methods for this: dump and restore with pg_dumpall, pg_upgrade, or logical replication. Each method trades setup effort against the length of the window in which OpenProject cannot accept writes. Logical replication works between major versions, and the PostgreSQL upgrading documentation describes it as allowing only several seconds of downtime, but it needs careful setup and verification before cutover.

Where the database lives depends on how OpenProject was installed, so the first task is to identify the install type. A packaged .deb or .rpm install runs PostgreSQL as a host service next to the application, and the cluster's data directory and service name are managed by the operating system packages. A Docker Compose install runs the database as a separate service whose data sits in a named or bind-mounted volume defined in the Compose file. An all-in-one container keeps the database inside the same container as the application, with its data in a volume mounted into that container. The exact data directory, service names and volume layout differ by install type and must be confirmed against the installed OpenProject version before any step is planned.

The OpenProject official install documentation is the reference for stopping and starting the application. Writes must stop before the database is dumped, replicated or switched, or the copy will not match the live data. Follow the documented order for the install type, and confirm that the application services have fully stopped before the database work begins. Check the target version as well. OpenProject documents support for PostgreSQL 16 or later and requires the pg_trgm, btree_gist and unaccent extensions, so confirm that PostgreSQL 17 is listed for your release and that the extensions are available in the new cluster before scheduling the window.

Before the window is booked, decide the method, the rollback path and who runs each step. Keep the original cluster or a verified backup until the upgraded installation has passed functional checks, because reverting a major upgrade is far harder than repeating a backup. PostgreSQL 17 is supported until November 8, 2029, while PostgreSQL 14 support ends on November 12, 2026, so the upgrade also serves as a supportability step. Ask your delivery team to document the chosen method, the stop and start sequence from the official documentation, the extension checks and the rollback steps, and confirm each item against your own installed version.

What to prepare before touching the database

Four items come before any change to the database. Together they establish a rollback path proven on a copy of your data and a test system that behaves like production, so the downtime window you plan rests on measured results.

Full backup with a tested restore

Take a logical dump with pg_dumpall and a physical base backup, then plan point-in-time recovery using the continuous archiving documentation for PostgreSQL. A backup only counts once a restore to a separate host has completed and OpenProject starts against it. Record how long the restore took and who owns each step. Store the dump and archive files outside the host being upgraded. Keep the backup until the upgraded system has run through a full business cycle and the rollback window has closed.

Version and extension inventory

List the PostgreSQL major and minor version, the OpenProject release, and every installed extension, including pg_trgm, btree_gist and unaccent, which OpenProject requires. Confirm that the current PostgreSQL version is 16 or later, because OpenProject has officially supported PostgreSQL 16 or later since 16.0.0. Note the installation method (packaged, Docker Compose or all-in-one) because the upgrade steps differ for each. Check that extensions exist in the target version and that the database owner can create them. Keep the results in the change record so the rollback team works from the same facts.

Customizations and integrations inventory

List every component that reads from the database or depends on its configuration: SSO (SAML, OIDC, CAS, Kerberos or Okta), LDAP group synchronization, the Nextcloud integration, custom plugins, reverse proxies and backup jobs. For each one, record the owner, the configuration file or environment setting it uses, and the test that proves it still works after the upgrade. Plugins need a check against the target OpenProject release, because a plugin built for one release may not run on another. Enterprise features such as SSO and LDAP group synchronization need a current license before testing.

Sized test environment

Build a test system that matches production in PostgreSQL version, extensions, OpenProject release, configuration and a recent copy of the data. Size it with the OpenProject sizing guide: 4 cores and 4 GB RAM for up to 200 users, 8 cores and 8 GB for about 500 users, and 16 cores and 16 GB for about 1,500 users. Confirm which user count applies to your deployment and check the figures against the current system requirements. Run the full upgrade rehearsal there and time each step, because the measured downtime sets your maintenance window.

Choosing dump and restore, pg_upgrade or logical replication

The choice among the three PostgreSQL methods depends on data size, install type and how much downtime the business will accept. Dump and restore is the simplest method to reason about. The source cluster is exported with pg_dumpall or pg_dump, the output is loaded into a PostgreSQL 17 server, and the result can be checked against the source before users return. The trade-off is time. Every row is written out and read back in, so downtime grows with the database size, and the window must cover the dump, the restore, index rebuilds and post-restore checks. For a small OpenProject instance, that window may be acceptable. For a large one, measure a test restore on a copy of production data before committing to it, and ask for the restore duration and the disk space the dump needs.

pg_upgrade converts the existing data directory in place. It avoids copying most of the data, which usually shortens the window compared with dump and restore, but it depends on two conditions. The old and new PostgreSQL binaries must be installed on the same host, and the data directory layout must match what the new binaries expect. Packaged installs on supported Linux distributions usually meet this because the old and new versions can be installed side by side. Docker Compose and all-in-one container installs complicate it, because the old binaries, the new binaries and the data volume must be available to the tool together. Confirm in your OpenProject install guide how your image stores its database files before you choose this path, and confirm that pg_trgm, btree_gist and unaccent are available on the new server.

Logical replication works between different major versions. The PostgreSQL documentation states that it can allow a major upgrade with only several seconds of downtime, but the method requires more setup than the other two. You create a publication on the source, a subscription on the PostgreSQL 17 server, let the initial copy complete, and then cut over the application. Two areas need specific planning. Logical replication does not carry sequence values in the same way it carries table rows, so the sequences must be set on the new server before cutover. Schema changes made during replication are not carried automatically, so freeze OpenProject migrations for the replication period. Plan a verification step that compares row counts and checksums for critical tables, and keep the source running as a rollback path until the new server is verified.

The right method is the one that fits your database size, install type and approved outage. A short window may favor logical replication if the team can run it reliably. A large database on a packaged install may favor pg_upgrade. A small instance with an overnight window may be well served by dump and restore. Before rehearsal, record the database size, the install type in production and the outage the business has approved in writing. Then confirm the steps against the OpenProject install guide for your release, since that guide defines the supported procedure for your install type and the settings it expects after the move.

PostgreSQL 18 pg_upgrade adds parallel jobs and a --swap option, and it retains planner statistics across major upgrades. These features matter only if the team later targets PostgreSQL 18. This project targets PostgreSQL 17, which is supported until November 8, 2029, so do not plan around the PostgreSQL 18 options now. If a move to PostgreSQL 18 is already on the roadmap, record the method and timings used for this upgrade. That record gives the team a baseline for comparing the newer pg_upgrade options when that later project is scoped.

The upgrade sequence with checks and rollback points

This sequence moves an existing OpenProject installation to PostgreSQL 17 in an order where each step has a check that must pass before the next one starts. Every step also names the action that returns the installation to its last known good state, so the old cluster stays usable until the business signs off.

  1. Confirm current versions and the target release

    The engineer records the installed OpenProject release, the current PostgreSQL major version and the install method: packaged, Docker Compose or all-in-one. OpenProject officially supports PostgreSQL 16 or later from version 16.0.0, and PostgreSQL 17 is supported until November 8, 2029, so PostgreSQL 17 is the target major version. Confirm the target OpenProject release in the release notes and check that pg_trgm, btree_gist and unaccent are available on the new server. The step is done when the version matrix is signed off by the application owner. Rollback: nothing has changed yet, so no action is needed.

  2. Take and verify a full backup

    The administrator takes a full database dump and copies attachments, configuration files and the environment file to storage outside the OpenProject host. The check is a test restore of the dump into a scratch database, followed by a comparison of table counts and a sample of work packages against the live system. Store checksums with the backup set. The step is done when the restore check passes and the backup owner signs the backup record. Rollback: this verified backup is the restore source for every later step, so keep it until sign-off.

  3. Rehearse the upgrade on a restored copy

    The platform team restores the verified backup into a test environment with the same installation method and runs the full sequence from start to finish. They record each command, every error and the time each stage takes, which becomes the basis for the maintenance window. The check is that OpenProject starts on PostgreSQL 17 in the test environment and passes the health and login checks in step seven. The step is done when the runbook has been corrected for every issue found. Rollback: discard the test copy and fix the runbook before any production change.

  4. Announce the window and stop OpenProject writes

    The project owner notifies users of the maintenance window and the expected return of service. At the start of the window, the administrator stops the OpenProject services and confirms that no application sessions remain. The check is a query of pg_stat_activity on the old cluster showing no client connections from OpenProject, followed by a final backup taken after writes stop. The step is done when the final backup passes the same restore check as the first one. Rollback: if the window is cancelled, restart the services and confirm that a test login succeeds before users return.

  5. Create PostgreSQL 17 and install extensions

    The database administrator installs PostgreSQL 17 on a new server or in a separate data directory so the old cluster is not modified. They create the OpenProject database and role with the same ownership and encoding as the old cluster, then run CREATE EXTENSION for pg_trgm, btree_gist and unaccent in the OpenProject database. The check is a query of pg_extension confirming all three extensions are installed at the expected versions. The step is done when the empty cluster passes that query. Rollback: the old cluster is untouched and can still run OpenProject, so the new instance can be dropped and rebuilt.

  6. Migrate data with the chosen method

    The database administrator migrates the data with the method selected during planning: dump and restore, pg_upgrade or logical replication. PostgreSQL documents logical replication as allowing a major upgrade with only several seconds of downtime, while dump and restore and pg_upgrade have different downtime profiles that depend on database size, so confirm the expected window with the DBA for the actual data. The checks are row counts per table, sequence values, schema comparison and the OpenProject database migrations completing without error. The step is done when all checks match the source. Rollback: use a method that leaves the old data directory intact, and keep the source cluster read-only until sign-off.

  7. Start OpenProject and verify functional behavior

    The administrator starts OpenProject against the PostgreSQL 17 cluster and checks the health endpoint and the server logs for database errors. A tester then signs in with an account from each role, opens sample work packages, downloads an attachment, triggers a test notification and checks each integration in use, such as the Nextcloud link or SSO if the installation has the Enterprise add-on. The step is done when the test checklist is complete with no open defects. Rollback: if a check fails, stop OpenProject, point the configuration back to the old cluster, restart and confirm a login succeeds.

  8. Set the rollback point and retire the old cluster

    The project owner records the sign-off criteria in writing before users return, including who can approve and how long the old cluster will be kept. The old cluster, the pre-window backup and the final backup stay in place until that sign-off is given. The check is a documented rollback test that confirms the configuration can be pointed back to the old cluster. The step is done when the business owner signs off and the old cluster is archived or removed under the retention policy. Rollback: follow the documented procedure, and review any records written to the new cluster before reverting to the old one.

How to test the upgrade and roll it back safely

The acceptance tests decide whether the upgrade is finished, so run them in the rehearsal against a restored copy of production data on the PostgreSQL 17 target. Compare row counts for projects, work packages and users between the source and target databases, then spot-check specific records: a project with a deep hierarchy, a work package with relations and attachments, and a user with several group memberships. Confirm that the pg_trgm, btree_gist and unaccent extensions that OpenProject requires are present in the target database. Record each result in a checklist that the project owner signs, so the go or no-go decision rests on recorded evidence from the rehearsal.

Authentication needs its own tests because a database move can break sign-in without changing any data. Log in through every identity path you have configured: a local account, an LDAP-backed account and, if you run it, an SSO account. For each one, confirm that roles and group memberships resolve as they did before the upgrade. If you use LDAP group synchronization or SSO, which are Enterprise features, test a user added to a group after the last sync. Upload, open and download a file attachment, confirm that background jobs such as notifications complete on the new database, and, if the Nextcloud link is in use, open a linked file from a work package to confirm it still resolves.

Rollback begins before cutover. Keep the original PostgreSQL data directory and the pre-upgrade backup intact until acceptance is signed off, and schedule their deletion as a separate later change. Define the conditions that trigger rollback in advance, such as a failed count comparison, a failed login path or a missing extension. If a check fails, stop the cutover, point OpenProject back at the original database, restart the service and rerun the same checks against the restored state. Confirm which backup method you used and restore it at least once during the rehearsal, because a backup that has never been restored is still an assumption.

Two infrastructure items are easy to miss. PostgreSQL does not provide software that detects a failed primary and promotes a standby, so any replica you run needs a documented promotion procedure, a plan for rejoining the old primary and a named owner who can carry out both steps. Practice promotion during the rehearsal so the team has done it before an incident forces the decision. Check PgBouncer or any other pooling layer after cutover as well: confirm it points at the new server, that its authentication settings and connection limits still match the environment, and that no connections to the old cluster remain before you declare the upgrade complete.

What makes an OpenProject PostgreSQL upgrade take longer

This table lists the factors that most often stretch an OpenProject PostgreSQL 17 upgrade, why each one matters, and what to request from a partner or confirm internally. Use it to see which rows apply to your installation before you ask for a quote, because the written scope sets the cost, not a published figure.

DriverWhy it mattersWhat to ask for
Database size and attachment volumeDump, restore or replication time grows with the database. Attachments stored in the database or on local disk add to backup and copy time.Current database size, attachment storage location and volume, and the backup window you can accept.
Install typePackaged, Docker Compose and all-in-one installs each need their own upgrade procedure, and the steps for locating data and extensions differ.Confirmed install type and version, plus the procedure your partner will use for that type.
User count and sizing tierHigher user counts raise the load on the test environment and the cutover. Sizing guidance scales by user band.Current active user count, the sizing tier you run, and a load test plan for the test environment.
Number of extensions and whether they are presentOpenProject requires pg_trgm, btree_gist and unaccent. Missing or differently configured extensions add checks and install steps before cutover.List of installed extensions, their versions, and confirmation that the three required extensions exist on PostgreSQL 17.
High availability with replicasSynchronous or asynchronous replication adds steps for promotion, rejoining old nodes and verifying replica consistency. PostgreSQL does not detect primary failure on its own.Replication mode, number of standbys, failover tooling in use, and the rejoin procedure for each node.
Customizations and pluginsCustom code, themes or plugins may depend on behavior that changes between releases and need separate testing after the database move.Inventory of customizations and plugins, their owners, and the test cases that cover them.
Identity integrationsSSO, LDAP group sync and Nextcloud links depend on the application and directory services. Each needs a post-upgrade login and sync check.List of identity providers, LDAP group sync settings, and Nextcloud integration status to retest.
Number of environmentsTest, staging and production each need a rehearsed copy of the upgrade. Each extra environment adds restore and verification work.Count of environments, their sizes, and whether a production-like copy is available for rehearsal.

Questions buyers ask before upgrading OpenProject to PostgreSQL 17

What does a PostgreSQL 17 upgrade for OpenProject cost?

The cost is set by the written scope, and DeployOpen does not publish a price list. The main drivers are the install type (packaged, Docker Compose or all-in-one), the number of environments that need upgrading, the size of the database, and whether the scope includes a rehearsal on a copy of production. Extension checks for pg_trgm, btree_gist and unaccent, rollback planning and handover documentation also add effort. Most of the cost is one-time work: assessment, rehearsal, cutover and verification. Recurring cost only appears if you add a support retainer. Ask for the quote as separate line items so you can see which parts you could do in-house. OpenProject Enterprise licenses are billed separately and are listed on the OpenProject pricing page, so confirm which edition you run before you compare totals.

How long will OpenProject be down during the upgrade?

The downtime window depends mainly on how the data moves to the new cluster. PostgreSQL documents that logical replication works between major versions and can allow a major upgrade with only several seconds of database downtime. The total OpenProject window is usually longer, because it also covers the final sync, stopping and starting the application, and verification. The dump size and method matter if you use a dump and restore path instead, and the database size and write activity during cutover matter for any path. Ask for a rehearsal on a copy of production and measure the cutover steps there. Use that measured result, not an estimate, to set the maintenance window you ask your change board to approve.

What does our team need to provide for the upgrade?

Your team needs to provide access, backups, a maintenance window and named people to sign off. Access means administrative access to the hosts or containers, database credentials, and access to any cloud, hypervisor or storage system holding the data. Before work starts, confirm that a recent, tested backup of the database and the application files exists, and that you can restore it. Approve a maintenance window that covers the rehearsed cutover plus a buffer. Name a technical sign-off owner and a business sign-off owner, and agree who decides to roll back. Provide test users who can check projects, work packages, attachments and logins after the upgrade. Confirm these items in the written scope so both sides know what is expected.

Can our own team upgrade OpenProject to PostgreSQL 17 without a partner?

Yes, a team with solid PostgreSQL administration skills can do the upgrade in-house if it follows a rehearsed runbook. The work is less about the PostgreSQL commands and more about getting the OpenProject install type right, checking the required extensions and confirming the application restarts cleanly against the new cluster. Packaged installs, Docker Compose installs and all-in-one installs each have different steps, so confirm the install-specific steps in the OpenProject documentation for your version before you plan. Rehearse the full sequence on a copy, time it, and record the rollback steps. If your team lacks that database experience or the time to rehearse, a partner can take on the rehearsal and cutover under a written scope.

Should we choose PostgreSQL 18 instead of PostgreSQL 17?

The choice between PostgreSQL 17 and PostgreSQL 18 is a separate decision, and it should be made after you confirm that OpenProject supports PostgreSQL 18. OpenProject's system requirements list PostgreSQL 16 or later as officially supported, but confirm the exact version in the OpenProject release notes and system requirements before you commit. PostgreSQL 18 was first released on September 25, 2025, and it adds features such as pg_upgrade retaining planner statistics across major upgrades and parallel jobs for pg_upgrade. PostgreSQL 17 remains supported until November 8, 2029. Weigh your support needs, your change schedule and the features you need, and document the decision in the written scope.

What happens if the PostgreSQL 17 upgrade fails during cutover?

The plan should keep the original PostgreSQL cluster preserved until your sign-off owners accept the upgrade, so a failed cutover can be rolled back by pointing OpenProject at the preserved cluster. The rollback steps should be rehearsed as part of the runbook, not written for the first time during the maintenance window. Decide in advance how you will handle any data written to the new cluster after cutover, because those changes may need to be reconciled before you return to the original cluster. Confirm the rollback window, the decision owner and the criteria for triggering rollback in the written scope. Ask for those details in writing before you approve the change.

How DeployOpen scopes and delivers the upgrade

DeployOpen plans and carries out the move of an existing OpenProject installation to PostgreSQL 17 inside infrastructure you control. The work starts with a written scope covering your packaged, Docker Compose or all-in-one install, then moves through backup, restore, extension checks and a planned downtime window. Engagements are fixed-scope, and ongoing support is available as a retainer.

How we scope

  • Written scope names your install type: packaged, Docker Compose or all-in-one
  • Scope confirms your current PostgreSQL version and the OpenProject release you will run after the move
  • Scope lists the downtime window, rollback point and who approves each step

How we build

  • Full database backup and configuration copy, verified by a test restore before cutover
  • Check that pg_trgm, btree_gist and unaccent extensions are present on the PostgreSQL 17 cluster
  • Upgrade by pg_upgrade, dump and restore, or logical replication, chosen against your data size and window

How we hand over

  • Runbook covering each upgrade step, rollback steps and post-upgrade checks
  • Verification record showing OpenProject starts, users sign in and work packages open
  • Notes on the PostgreSQL 17 support window, which runs to November 8, 2029

How we support

  • Optional retainer covers patching, minor PostgreSQL updates and OpenProject release upgrades
  • Post-upgrade review of backups, restore tests and monitoring after the cutover
  • Planning for PostgreSQL 18 or later once your OpenProject release supports it

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.