How to choose an OpenProject Docker or Kubernetes installation
For most teams putting OpenProject on their own infrastructure, the starting point is the Docker installation. The OpenProject system requirements list three methods: a Docker-based installation, which the project recommends, .deb and .rpm packages for 64-bit Linux, and Kubernetes with Helm charts for horizontal scaling. Docker suits a single host or virtual machine that your team can manage with standard container tooling. Packages suit teams that already run Linux servers through their usual configuration and patching tools and want the operating system to own those tasks. Helm suits organizations that already operate and support Kubernetes and need to scale OpenProject out. The install method, the sizing and the PostgreSQL setup should be decided together because each one constrains the others. Changing method later typically means moving data and configuration to a new host, so treat the first choice as a long-term decision.
PostgreSQL is where many first installs go wrong. OpenProject officially supports PostgreSQL 16 or later since OpenProject 16.0.0, and it requires the pg_trgm, btree_gist and unaccent extensions. Confirm that the database role OpenProject uses can create or load these extensions. A managed database service may restrict extension installation or require an administrator to enable them first, so check this before you build. Verify the extension list against the current system requirements page at the version you plan to deploy. Then decide where the database runs: in a container beside the application, on a database server your team already operates, or in a managed service inside your cloud account. Each option changes who owns backups, patching and network access, so record those owners before the first install.
Sizing is the second decision, and it drifts after launch. The sizing guide suggests 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. Use these figures as a starting point and measure your own workload. Attachment volume, integrations, working hours and the number of concurrent users all change the load. A host sized for a pilot group can become undersized once other departments join. Ask your installer or internal team which user count the first install is sized for, how CPU, memory and database load will be measured over the first months, and what the scaling path looks like when the user count grows. The planned user count is the number to size against, and it may differ from the number of licensed seats.
A working login is the easiest milestone to reach and the least informative about readiness. A first install is sound when the application starts cleanly against the PostgreSQL version and extensions you chose, when data sits on storage you can back up and restore, when the public address and TLS termination are configured, and when the host has the resources your pilot group needs. Sign-in alone confirms none of these. Plan a short acceptance check with named owners for each item, including who performs a test restore, who watches resource use in the first weeks and who decides when to add capacity. High availability, security hardening and upgrade procedures have their own sibling topics, so this page ends at a sound first install that those topics can build on.
What makes up an OpenProject installation
An OpenProject install in Docker or Kubernetes is a small set of components that depend on each other: the application, PostgreSQL, attachment storage, a TLS-terminating reverse proxy, and the Kubernetes objects a Helm release creates. Each one has an owner, and a misconfiguration in any of them shows up as an outage, a failed upgrade or lost files, so agree on ownership before the first deployment.
The OpenProject application
The application runs the web interface, background work and API for work packages, Gantt charts, boards and dashboards. The application team owns its version, environment variables and image tag, and it should track the release notes for each minor release. Check that the image tag matches the version you have tested, because a silent move to a newer image can change database migrations that are hard to reverse.
PostgreSQL 16 or later
OpenProject officially supports PostgreSQL 16 or later since OpenProject 16.0.0. The database team owns the server version, sizing, backups and access rules. Confirm that the pg_trgm, btree_gist and unaccent extensions are enabled in the OpenProject database before the first start, because missing extensions block migrations and search depends on them.
Required PostgreSQL extensions
pg_trgm, btree_gist and unaccent are required by OpenProject, not optional tuning. The database team installs them, and the application role must be able to use them during migrations. Verify them with a catalog query after provisioning, and recheck after any managed database upgrade or restore, since a restored instance may not carry the extensions into a new cluster.
Attachment storage
Uploaded files are stored on a host path or a volume that the application container or pod must write to. The platform team owns the volume, its size, permissions and backup schedule. If the path is not persistent or not shared across replicas, attachments can disappear on restart or fail to appear on another pod, and database backups alone will not recover them.
Reverse proxy and TLS
A reverse proxy in front of OpenProject terminates TLS, forwards requests and sets the headers the application uses to build links and enforce HTTPS. The platform team owns the certificate lifecycle, the proxy configuration and the allowed request size for uploads. A wrong forwarded host or protocol setting causes redirect loops, mixed-content errors and broken links in notification emails.
Kubernetes objects from the Helm release
A Helm deployment creates workloads, services, ingress rules, config maps and secrets, and persistent volume claims. The platform team owns the chart values, namespace layout and secret handling. Review the rendered manifests before applying them, and confirm that resource requests, storage classes and replica counts match your sizing decision, since defaults rarely fit a production load.
Docker, Linux packages or Helm: which install method fits your team
This table compares the three OpenProject install methods by when each fits, the operational work it leaves with your team, and how it affects upgrades and rollback. Read each row as a question about your operating model: who patches the host, who runs the cluster, and who restores data when a change fails. The main takeaway is that Docker is the method OpenProject recommends, while packages and Helm move the operational work to different teams.
| Method | When it fits | Work left with your team | Upgrades and rollback |
|---|---|---|---|
| Docker (recommended by OpenProject) | Teams that want the vendor's preferred path on one host or a small number of hosts with a container runtime already in use. | Image pulls and tag updates, host OS patching, container runtime upkeep, and volume and backup management. | Upgrades change the image tag after a backup. Rollback usually means redeploying the prior tag and restoring a database backup taken before the upgrade. |
| .deb or .rpm packages on 64-bit Linux | Teams that run standard virtual machines and manage services with their existing OS tooling and package repositories. | OS patching, package source access, service configuration, and PostgreSQL and web server integration on the host. | Upgrades run through the package manager. Take a backup first and confirm the rollback steps for the target package version. |
| Kubernetes with Helm charts | Teams that need horizontal scaling and already operate a cluster with platform engineering skills. | Cluster upgrades, chart values, ingress, persistent volumes, and monitoring of pods and database connections. | Chart version changes roll out as Helm releases. Rollback depends on database schema changes, so restore only from tested backups. |
| Confirm your OS before choosing packages | Packaged installs list Ubuntu 22.04, Debian 12, CentOS or RHEL 9.x and SUSE Linux Enterprise Server 15. | Confirm your exact OS version against the current system requirements before choosing packages. | Check the same requirements before each upgrade, because supported operating system versions change over time. |
| PostgreSQL placement | Any method can use an external PostgreSQL 16 or later with the pg_trgm, btree_gist and unaccent extensions. | Database backups, extension setup, access rules, and the decision on where the database runs. | Database version changes are separate from application upgrades, so plan and test them as their own change. |
How many cores and gigabytes OpenProject needs at 200, 500 and 1,500 users
The OpenProject sizing guide gives three starting points for a self-hosted instance: 4 cores and 4 GB of RAM for up to 200 users, 8 cores and 8 GB of RAM for about 500 users, and 16 cores and 16 GB of RAM for about 1,500 users. Treat these as the baseline for the first capacity request to your infrastructure team, not as a verified answer for your organization. They come from the vendor's guidance and describe a typical profile, not a load test run against your data, your network or your usage pattern. Before you order hardware or reserve cloud capacity, decide which tier is closest to your expected named users and write down the assumptions behind that choice. The guide's numbers assume a fairly ordinary workload, and several factors can move your real requirement up or down. The most important are the number of users active at the same time (rather than the number of accounts), how heavily teams use dashboards, Gantt views and reporting, the volume and size of attachments, and which integrations are enabled, such as the Nextcloud link or identity synchronization. The PostgreSQL host matters as much as the application container. If the database shares a machine with the application, or runs on storage with limited IOPS, the database can become the bottleneck long before the application's CPU and memory are exhausted. Ask your installer to state which host runs PostgreSQL and what resources it has. Sizing is not a one-time decision. When user count approaches a tier boundary, such as moving from roughly 200 to 500 users, revisit the allocation before adding people in bulk, because onboarding waves often produce the first slow pages. Plan the resize as a change with a rollback path, and confirm that your Docker or Kubernetes resource limits are updated along with the host. Container memory limits set too low can cause restarts under load, which looks like an application fault but is a configuration issue. In the first few months, measure before you decide whether the tier was right. Track application response times for the pages your teams open most, CPU and memory use of the application and worker containers at peak working hours, PostgreSQL connection counts, slow query logs and disk latency, and growth in attachment storage. Record these weekly for at least the first full project cycle your organization runs. If sustained CPU or memory use stays near the limit at normal peaks, or database latency rises with concurrent users, you have evidence to resize early. If usage stays well below the allocation, you can document a lower tier with confidence for the next budget review. Ask your implementation partner or internal team to confirm three things in writing: the exact sizing guide version they used, the peak concurrent usage they assumed, and the monitoring thresholds that will trigger a resize. A partner that can state these clearly is in a better position to defend the initial sizing and plan the review point.
Build sequence for a first OpenProject install
This sequence takes a team from an undecided install method to a running, TLS-protected OpenProject instance on PostgreSQL that is recorded well enough to rebuild or hand over. Each step closes with a check, so problems surface before the next layer is added.
Confirm edition, user count and sizing tier
Before any installation work, the platform owner records which edition is in use, how many named users will sign in, and which sizing tier applies. OpenProject's sizing guide suggests 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 the current figures in the system requirements page, and confirm with the vendor whether your Enterprise plan changes any requirement. The step is done when the edition, user count, chosen method and sizing tier are written in one decision record that the install team signs off.
Provision PostgreSQL 16 or later
The platform team provisions a PostgreSQL server in the same environment as the application host, or a managed equivalent that your organization approves. OpenProject officially supports PostgreSQL 16 or later from release 16.0.0 onward, so do not provision an older major version. Connect with a client and run the server version query to capture the exact version string, then store it with the configuration record. The step is done when the reported server version is 16 or higher and the network path from the application host to the database port is confirmed by a successful test connection.
Create the OpenProject database and role
A database administrator creates a dedicated login role and an empty database owned by that role, following the database setup described in the official installation documentation. The application should not connect as a superuser, and the role password should be generated and stored in your secrets manager rather than in a shared document. Confirm that the role can connect to its own database and cannot read other databases on the server. The step is done when a test login with the new role succeeds and a schema-level check shows the role owns the OpenProject database.
Enable pg_trgm, btree_gist and unaccent
OpenProject requires the pg_trgm, btree_gist and unaccent extensions in its database. A user with the privileges needed to create extensions enables each one inside the OpenProject database, using the exact statements given in the official system requirements and installation documentation. If your organization restricts extension creation, agree the approach with your database team before the install starts. Afterwards, query the extension catalog for all three names and confirm each is listed as installed. The step is done when all three extensions appear as present in the OpenProject database.
Deploy with the chosen method and sizing
Deploy OpenProject using the method chosen in the decision record: Docker (the method the vendor recommends), a .deb or .rpm package on a supported 64-bit Linux distribution, or Helm charts on Kubernetes. Use the sizing tier recorded in step one, and check the supported operating systems list for packages before starting. Follow the official commands for the exact version you intend to run, and do not copy commands from older articles. The step is done when the application services start cleanly, the logs show no database connection errors, and the application responds on its local port.
Place the application behind TLS on a stable hostname
Publish OpenProject under one stable hostname that users will keep for the life of the deployment, because changing it later affects links, integrations and identity provider redirects. Terminate TLS at a reverse proxy, load balancer or ingress controller with a certificate issued by your approved certificate authority, and configure the host and protocol settings that the official documentation lists for the public URL. The step is done when a browser reaches the login page over HTTPS with a valid certificate chain and the application generates links that use the public hostname.
Set the initial administrator and confirm first login
Create the initial administrator account using the method in the installation documentation, with a named individual rather than a shared account, and set a strong password stored in your secrets manager. Sign in once as that administrator, change any default credentials that the install process creates, and confirm the administration area opens. Record the administrator's account name in the decision record, not the password. The step is done when the administrator signs in over HTTPS, the administration pages load, and no default credentials remain active.
Record the configuration and secrets location
Write a short runbook entry that names the edition, version, install method, sizing tier, PostgreSQL version, extension check results, public hostname and certificate owner. Record where the environment configuration, database credentials, administrator recovery process and backups live, but store the secrets themselves only in your approved secrets manager. Ask the install team to confirm that a second engineer can locate every item from the runbook alone. The step is done when the runbook is reviewed and filed where operations staff can find it, which completes the first install.
Setting up PostgreSQL 16 with the required extensions for OpenProject
Before the OpenProject container or package starts, the database has to be PostgreSQL 16 or later. OpenProject has officially supported PostgreSQL 16 since version 16.0.0, and it requires three extensions: pg_trgm, btree_gist and unaccent. Those requirements shape where the database can run. You can use a self-managed server, a virtual machine your team operates, or a managed PostgreSQL service from a cloud provider. Each option moves responsibility differently. A self-managed server gives you full control over versions and extensions, but patching and backups stay with your team. A managed service reduces operational work, but it may restrict what a non-superuser role can install. Before you commit to a managed service, confirm in writing with the provider that the three extensions can be created for the application role you plan to use, and that the major version you need is offered.
Ownership and privileges come next. Create a dedicated database and a login role for OpenProject, and keep administrative accounts out of the application configuration. Decide early who runs the CREATE EXTENSION statements. If the application role owns the database and is allowed to create extensions, the installer can prepare the schema itself. If your policy keeps extension installation with a database administrator, the administrator installs pg_trgm, btree_gist and unaccent beforehand, and the application role only uses them. In either case, the application role should hold no superuser rights. Check the installation documentation for the release you deploy, since it states the privileges the migration step expects. Record the role names and their grants so that an auditor or a new administrator can trace them later.
Keep the database off public networks. Give it a private address, allow inbound connections on the PostgreSQL port only from the hosts or pods that run OpenProject, and deny everything else, including direct access from user workstations. In Kubernetes, express the same rule with network policies, and confirm that your cluster's network plugin enforces them. Require TLS for client connections where your PostgreSQL build and provider support it. Keep the database password in your secrets manager and out of any values file committed to version control. Database administrators should reach the server through a bastion host or a controlled session with logging enabled. Review these rules whenever the topology changes, such as when a managed service is added or a cluster is replaced.
Put extension checks in the verification step so that failures surface before users arrive. After the database is created, query the server version and the pg_extension catalog for the three extension names, and record the output with the change ticket. Run the same check against the exact database the OpenProject installer will use, because a database built for another environment can differ from the one you tested. A missing extension usually appears as a failed migration during installation, which is harder to diagnose than a one-line query run beforehand. Repeat the check after each PostgreSQL major version move or OpenProject upgrade. High availability, replication and backup design belong to the sibling high availability topic, so this section ends once the prerequisites are proven in place.
How the install changes by environment
A single container host is the simplest starting point and matches the method OpenProject lists first in its system requirements. The application runs as containers on one machine, and most teams run PostgreSQL as a separate service so that backups and upgrades stay under their control.
- Moving parts: the OpenProject containers and one PostgreSQL instance, both on one host.
- Attachments and database: attachments are written to storage on the host unless you mount external storage. The database normally sits outside the application container lifecycle. Confirm the volume paths in the current installation documentation.
- Image delivery: the host pulls images from a registry it can reach, or you load images from an internal mirror prepared in advance.
- Confirm: PostgreSQL 16 or later with the pg_trgm, btree_gist and unaccent extensions enabled, and host sizing against the user-count guidance in the system requirements.
Before scheduling a cutover, confirm the image tag you plan to pin, the container configuration you will maintain, and the upgrade path to the next release.
A packaged install puts OpenProject on a virtual machine using .deb or .rpm packages for 64-bit Linux. It suits teams that already manage VMs and want the application managed as operating system services instead of containers. The package sets up the application, and the team still owns PostgreSQL, the operating system and the attachment disk.
- Moving parts: the OpenProject services installed from the package, plus PostgreSQL, often on the same VM for small deployments.
- Attachments and database: attachments sit on the VM file system by default. Plan a disk with room to grow and confirm where the package stores files so backups capture them.
- Package delivery: the VM installs packages from a repository it can reach or from package files you stage in advance.
- Confirm: that your operating system release is on the supported list, which includes Ubuntu 22.04, Debian 12, CentOS or RHEL 9.x and SUSE Linux Enterprise Server 15, and that PostgreSQL 16 or later with the required extensions is available on that release.
Before you install, check the OS release against the supported list and confirm the package version and upgrade steps with OpenProject's documentation for your release.
OpenProject lists Kubernetes with Helm charts as a method for horizontal scaling. This is the most components to operate: the chart release, application pods, ingress, persistent volume claims and a PostgreSQL service the cluster must reach. The platform team carries cluster operations, and the application team carries OpenProject configuration.
- Moving parts: the chart release, its pods and services, ingress, persistent volumes and an external or operator-managed database.
- Attachments and database: shared attachment storage depends on a storage class that supports the access mode the chart requires. Confirm with OpenProject how the chart expects attachments and the database to be provided.
- Image delivery: nodes pull images through the cluster's registry or an internal mirror, so each node needs pull access.
- Confirm: the chart values for replicas, storage classes and ingress, plus the supported topology with OpenProject. Do not assume a multi-replica layout is supported until OpenProject confirms it for your version.
Sizing still follows the user-count guidance in the system requirements, so ask OpenProject to confirm how the chart values map to your expected user count before you set them.
An air-gapped deployment runs with no direct route to public registries or package mirrors. The application components match the method you choose, but every image, package and dependency must reach the network through an approved transfer path. Updates follow the same path, so the staging process becomes part of routine operations.
- Moving parts: the same application components as the chosen method, plus a staging process for images or packages and each update.
- Attachments and database: both stay inside the boundary on internal storage. Backups must also remain inside the boundary and be restorable without internet access.
- Image and package delivery: container images go into an internal registry, or package files and their dependencies move on approved media. Operating system repositories need an internal mirror.
- Confirm: the image mirroring process, package repository access from build hosts, availability of PostgreSQL extensions from internal repositories, and whether any feature needs outbound access, such as license activation, with OpenProject.
Before committing to a design, run a test transfer of one full release through your approved path and confirm each dependency resolves inside the network.
What drives the effort of an OpenProject installation
This table lists the factors that change how much work an OpenProject Docker or Kubernetes installation takes, with the practical step that keeps each one under control. Read it before scoping, because the early decisions on sizing, integrations and environments are the ones that are hardest to change later.
| Driver | Why it changes effort or cost | How to keep it down |
|---|---|---|
| User count and sizing tier | OpenProject's sizing guide sets different core and memory levels for up to 200, about 500 and about 1,500 users, so a tier change means new hosts and a re-test. | Fix the target tier early from the expected named user count and confirm it against the current system requirements. |
| Number of environments | Production, a test instance and a staging copy used to rehearse upgrades each need their own hosts, data and configuration checks. | Build one reusable deployment definition and deploy it to each environment with only the variables changing. |
| PostgreSQL hosting and ownership | OpenProject requires PostgreSQL 16 or later and the pg_trgm, btree_gist and unaccent extensions, so the team must confirm version, extensions and who patches and backs up the database. | Decide early whether the existing database platform or a managed service will host it, and write the extension and version checks into the build. |
| Identity integration | Single sign-on (SAML, OIDC, CAS, Kerberos, Okta) and LDAP group synchronization are Enterprise features, so the edition and the identity design must be settled before configuration starts. | Confirm the identity provider, group model and provisioning method before go-live, and confirm the edition needed for each feature. |
| Nextcloud or other integrations | The Nextcloud file link works in the Community edition, but OpenID Connect sign-on for Nextcloud is an Enterprise add-on, and each added integration needs its own testing and upkeep. | List every integration in the scope document before build and drop any that are not needed for the first release. |
| Attachment volume | Attachment storage size and growth affect backup duration, restore time and storage cost, and they are hard to shrink once data accumulates. | Ask for expected attachment volume per project, set storage and backup sizing from it, and test a full restore at that size. |
| Target network | A public cloud, a data center or an air-gapped network changes how images and packages reach the host, how updates are delivered and how the team verifies them. | Confirm early how container images or packages will be mirrored or transferred, and whether Helm charts can be pulled inside the network. |
| Compliance evidence | Assessors usually expect records of configuration, access reviews, backup tests and patching, and collecting this after go-live takes extra work. | Define the evidence list in the scope and generate it during build, such as configuration records, backup restore results and upgrade logs. |
| One-time versus recurring work | One-time work covers build, configuration, data load and first test. Recurring work covers patching within the release cycle, OpenProject upgrades, PostgreSQL moves and monitoring. | Ask for the one-time and recurring work to be listed separately in the quote, with the owner named for each recurring task. |
Securing the install from day one
These controls are set while OpenProject is first deployed, before any users or project data arrive. Each one closes a gap that is hard to fix cleanly later, such as secrets already copied into images or a database port left open to the network. The security hardening topic covers admin access, 2FA, password policy and patching cadence.
Keep secrets out of images and history
The PostgreSQL password, the OpenProject secret key base and any SMTP or storage credentials should come from a secrets store or an orchestrator secret object, not from Dockerfiles, compose environment blocks committed to Git or shell commands typed on the host. Check that the image contains no credentials by inspecting its layers and environment, and that shell history on the install host holds no passwords.
Restrict the database to the app network
Place PostgreSQL on an internal Docker network or a Kubernetes namespace where only the OpenProject application pods or containers can reach it. Confirm that the database accepts connections only from those sources in its host-based access rules, and that the application's database role holds the privileges it needs rather than superuser rights. The required extensions (pg_trgm, btree_gist and unaccent) are installed in that same database.
Do not publish the database port
A Compose file that maps 5432 to the host, or a Kubernetes Service of type NodePort or LoadBalancer for PostgreSQL, exposes the database beyond the application. Remove those mappings and verify from outside the cluster or host that the port does not respond. Administrators who need direct access should use a bastion or port-forward session that is logged.
Terminate TLS at the proxy
Put a reverse proxy or ingress controller in front of OpenProject and terminate HTTPS there with a certificate issued by a CA or internal PKI that your team controls and renews. Confirm the certificate chain is complete, that plain HTTP redirects to HTTPS, and that the proxy forwards the original host and protocol headers so OpenProject generates correct links. Record who holds the private key and where it is stored.
Limit who reads deployment definitions
Helm values files, Compose files and Kubernetes manifests often reference secret names, hostnames and storage paths, and some teams store values inline. Restrict read access to the repository and cluster namespace to the people who operate OpenProject, enable secret encryption at rest in the cluster where supported, and audit who can read Secret objects. Confirm which roles can run kubectl get secret or view CI variables in your pipeline.
How to verify the install works and fails safely
An OpenProject install is not finished when the containers or pods start. It is finished when a short, fixed set of acceptance checks passes and a failure test shows the platform recovers without losing data. Run these checks in the target environment, using the same reverse proxy, TLS certificate, database and attachment storage that users will reach. Record each result with the date, the version under test and the name of the person who ran it. Your security and operations teams may add checks to this list, but none of the checks below should be dropped before users are invited.
Start with the data path. Confirm that the application connects to the database using its own role, then query the PostgreSQL catalog for the three required extensions: pg_trgm, btree_gist and unaccent. Confirm the server runs PostgreSQL 16 or later, the minimum the system requirements set for current releases. A missing extension is the most common cause of a first-run failure, so treat it as a stop condition and fix it before going further. Next, test attachments. Upload a file to a work package, confirm it appears in the storage the install is configured to use, then download it and compare checksums. In Kubernetes, check the file on the shared volume or object bucket itself, because a file written to pod-local disk will look fine until that pod is replaced.
Next, check the front door. Sign in with a test account over HTTPS and confirm the certificate chain is complete and trusted by a client that has no private root installed. Confirm that plain HTTP redirects to HTTPS and that session cookies carry the secure attributes. Then call the health endpoints both through the reverse proxy and directly against the application service, and confirm both return success. Look up the exact health paths in the release documentation for your version, since they can change between releases. A proxy that returns success while the application is down usually means the health check points at the proxy itself, so compare both results before you accept either one.
The failure test shows whether the install fails safely. Before the test, create a project with several work packages, a comment and an attachment, and note their identifiers. Restart the application container or pod, then restart the database container or pod in a separate step. For each restart, measure how long the service takes to answer again and check the logs for migration errors or repeated crash loops. After recovery, confirm the test records, the attachment and login are intact. Also confirm the failure path: while the database is down, the application should return clear errors rather than accept writes it cannot store. Run this first on a production-like copy, because a database pod restart can expose storage class or reclaim policy problems that only appear under realistic volume handling.
The handover package turns the install into something your team can operate without the implementation partner. It should list the versions in use: the application image tag or package version, the PostgreSQL major and minor version, and the Helm chart version if you deploy that way. Record the sizing tier you chose and the reason for it, stated as the expected user count and the sizing guide tier it maps to, with a note on when to revisit it. Document where configuration and secrets live, such as values files, environment files and the secret store, by location and owner, never by value. Provide the database role inventory: the owner, the application role, any backup or reporting roles, and the privileges each one holds. Finally, include a runbook for the first upgrade rehearsal, following the steps in the sibling topic on OpenProject upgrades and support, and run it against a copy of production data before any live change.
Questions teams ask before installing OpenProject
Is the Community edition of OpenProject free for a self-hosted install?
Yes. The Community edition of OpenProject is free and includes work packages, Gantt charts, agile boards, time tracking and dashboards, with community support. A self-hosted Community install needs the infrastructure and database work described on this page. Single sign-on through SAML, OIDC, CAS, Kerberos or Okta, LDAP group synchronization and custom branding are listed among the Enterprise on-premises features, which are priced per named user per month. Before you commit, confirm current edition terms on the OpenProject pricing page, because the feature split decides whether you need a paid plan. The Nextcloud integration is available in the Community edition, but single sign-on for it is an Enterprise add-on.
How long does an OpenProject Docker or Kubernetes install take?
No single duration fits every environment, so treat any timeline as a function of scope. The main drivers are the sizing tier, which depends on your user count, how ready your PostgreSQL server is, and how many integrations and environments you need. A single production instance with a prepared database and DNS moves faster than a setup with separate staging, test and production environments, identity integration and backup testing. The tier and the environment count are the two biggest levers on the schedule. Ask for the timeline in the written scope, with each milestone tied to a dependency on your side, such as database approval, certificates or access. Confirm your change windows early, since they often set the pace more than the install itself.
What does our team need to provide for an OpenProject install?
Plan to provide cluster or virtual machine access in your own infrastructure, a PostgreSQL server or written approval to use a managed one, DNS records for the hostname, TLS certificates for it, and a named owner who can make decisions. The database must run PostgreSQL 16 or later, and OpenProject requires the pg_trgm, btree_gist and unaccent extensions, so confirm that your managed service allows them. OpenProject's sizing guide suggests 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. Ask who in your organization approves database changes and firewall rules, because those approvals often cause the longest waits.
Can an internal team install OpenProject without an outside partner?
Yes, if the team has working experience with Linux server administration, PostgreSQL administration and TLS certificate management, and it works from the official OpenProject documentation. The Docker method is the one OpenProject recommends, and packaged installs are available as .deb and .rpm for 64-bit Linux, including Ubuntu 22.04, Debian 12, CentOS or RHEL 9.x and SUSE Linux Enterprise Server 15. The areas that usually need the most care are database extensions, reverse proxy and TLS configuration, upgrade sequencing and backup restore testing, so write those into the runbook early. A partner adds the most value when you need several environments, identity integration, a scope agreed in writing or a tested handover on a fixed schedule. Assess your skills honestly against that work list before deciding.
How many CPU cores and how much RAM does OpenProject need?
OpenProject's sizing guide gives a starting point by user count: 4 cores and 4 GB RAM for up to 200 users, 8 cores and 8 GB RAM for about 500 users, and 16 cores and 16 GB RAM for about 1,500 users. Use these as planning starting points, and confirm them with a load test. Actual load depends on how active users are, how many work packages and attachments you store, how many integrations call the API and how much the database needs for its own workload. Size the database separately from the application nodes and plan room to scale out, which Kubernetes with Helm supports for horizontal scaling. Run the load test in a non-production environment before go-live, and record the final figures in the quote so you can compare them later.
What should an OpenProject installation quote include?
A quote should follow a written scope and list what is included, what is excluded and what you must provide. Look for the install method and the reason for choosing it, the number of environments, the sizing tier and the user count it was based on, PostgreSQL setup with the required extensions, DNS, TLS and reverse proxy work, identity and email configuration if in scope, backup and restore testing, documentation and handover. Ask which costs are one-time, such as the install, and which recur, such as your infrastructure, any Enterprise subscription priced per named user per month, and any support or retainer. Also ask how scope changes are priced, which dependencies on your side could move the timeline, and who owns each deliverable.
Does DeployOpen install OpenProject in our own infrastructure?
Yes. DeployOpen plans, implements, hardens, backs up, documents and supports self-hosted open-source platforms inside your own environment, which can be your cloud accounts, data centers or air-gapped networks. For OpenProject, that covers the install method you choose, sizing, PostgreSQL setup and the handover material your team needs to run the system. Most engagements are fixed-scope, so scope, deliverables and timelines are agreed in writing before work starts, and a quote follows from that written scope. DeployOpen does not publish a price list. Ongoing support, upgrades and continuous testing are available as retainers after handover. DeployOpen prepares systems and evidence for compliance assessments, but independent auditors and certification bodies issue any audit report or certification.
How DeployOpen works on this
DeployOpen plans, implements, hardens, documents and supports self-hosted open-source platforms inside the client's own infrastructure. For OpenProject Docker and Kubernetes installation, the work starts with a written scope that fixes the install method, sizing, PostgreSQL setup and deliverables before any build begins.
How we scope
- Confirm the install method (Docker, package or Helm) against your hosting platform and operations skills.
- Size the environment from your named user count, using the vendor sizing guide as the starting point.
- Agree in writing the PostgreSQL version, required extensions and backup approach before work starts.
How we build
- Deploy OpenProject in your own cloud account, data center or air-gapped network with pinned release versions.
- Configure PostgreSQL with the pg_trgm, btree_gist and unaccent extensions and verify them before go-live.
- Test install, login, attachment storage and restore on a non-production environment before cutover.
How we hand over
- Deliver runbooks covering install, configuration values, upgrade steps and rollback for your team.
- Document the architecture, sizing assumptions, secrets locations and access model in your environment.
- Walk your administrators through the handover and record which items remain with your team.
How we support
- Offer ongoing support, upgrades and testing as a retainer, agreed separately from the implementation scope.
- Plan upgrades around the vendor's frequent minor releases and confirm the target version in writing.
- Ask any support partner which items Enterprise support covers and which your team must still handle.

