Strapi high availability and scaling

Running more than one Strapi instance means moving the database, media and shared state out of each node and deploying schema changes in a controlled order. This page covers the decisions, build sequence, effort drivers and checks for doing that.

On this page

What Strapi high availability requires beyond adding a second server

Adding a second Strapi server behind a load balancer only adds redundancy if every instance reads and writes the same state. Strapi high availability depends on shared state, meaning the database, uploaded media, cache and configuration, plus schema changes that are applied in a controlled order. The number of application servers matters least. A second node that keeps its own database file, its own uploads folder or its own session store will serve different content to different visitors, and a single node failure can still break the admin panel or the public API.

Three conditions make this harder than it looks. First, uploads written to the local disk of one node are invisible to the others, so media links break after a failover unless an external upload provider is configured before go-live. Second, admin sessions and any in-memory or local cache behave the same way: a user signed in to node A may be rejected by node B, and cached responses can differ between nodes. Third, each of these needs a named owner and a decision on where the state lives before the second server receives traffic.

Content-type changes are the third trap. In Strapi, editing a content type changes database tables and the API that depends on them, so the schema is part of the deployed code. If a rollout reaches two nodes at different times, one node can run the old schema against a database that has already been migrated. Plan a single migration step that runs before traffic is shifted, take and test a database backup first, and decide which node is allowed to run schema updates. Confirm the Node.js version your Strapi release supports before patching nodes one at a time.

The database choice follows from these constraints. For Strapi 5, the supported options are PostgreSQL 14 or later, MySQL 8.0 or later and MariaDB 10.3 or later, and the database must be an external server that every node reaches over the network. A file-based SQLite database sits on one node's disk and cannot be shared across nodes, and MongoDB and other NoSQL databases are not supported. Ask your team to confirm the exact version against the installation requirements for the release you plan to run, and to check connection limits, failover behavior and restore tests for the database service.

Which Strapi parts must be shared across instances

A load balancer only works when every Strapi node reads and writes the same state. Five components decide whether instances behave as one application: the database, media storage, the cache layer, secrets and configuration, and the build each node runs. Node-local copies of any of them produce errors that appear only when traffic lands on a different instance.

External relational database

Every node must connect to one shared PostgreSQL or MySQL database. SQLite stores data in a file on a single node's disk, so it cannot serve a second instance. If each node holds its own database, an editor who saves content through one node will not see it on another, and content IDs can conflict. Confirm in your Strapi version's database documentation which PostgreSQL, MySQL and MariaDB versions are supported, and size the connection pool per instance before adding nodes.

Upload provider for media

Files written to a local uploads folder exist only on the node that received them. A request routed to another instance returns a broken media link, and the file is missing after a node is replaced. Move media to an upload provider, such as an S3-compatible bucket, before adding a second node. Confirm in the upload provider documentation for your Strapi version which provider package, settings and public URL format it expects, and plan how existing files get migrated.

Shared cache layer

Caches held in process memory differ from node to node. One instance can keep serving a published page or API response that another instance has already replaced, so editors see inconsistent content. Decide which cache sits in front of Strapi, such as a CDN or reverse proxy, and which one lives inside the application. Confirm in your version's documentation and in each plugin's documentation whether any cache, rate limit or session store is kept in memory only.

Environment variables and secrets

Every node must load the same secrets that Strapi uses to sign admin and API tokens and to protect stored data, along with the same database credentials. If one node has a different secret, tokens issued by another node fail validation, and users are logged out at random. Keep these values in a secret manager that all nodes read from, not in per-node environment files that drift. Confirm the exact variable names and their rotation rules in your version's configuration documentation.

Single build artifact for all nodes

Each node should run the same compiled server and admin panel, built once in a pipeline and deployed to every instance. If each node runs its own install and build, dependency versions can diverge, and the admin panel and API may report different content schemas. Pin the Node.js version to an Active or Maintenance LTS release that your Strapi version supports. Confirm the build, schema sync and deployment steps in the installation and deployment documentation for your version.

Which database, media and cache choices fit a multi-instance Strapi

This table compares the database, media, cache and admin session options that a multi-instance Strapi usually needs, against the single-node default. Read each row for when the option fits and what it adds to backups, failover testing, patching and vendor lock-in. The main takeaway is that the database and media decisions are the ones that most often block running more than one instance.

ChoiceWhen it fitsOperational costLock-in and watch-outs
Database: single-node default (SQLite)Local development, evaluation or a single instance where data loss from one disk is acceptableSimple file backups, but no shared state for several instances, so it cannot serve a scaled-out setupConfirm current Strapi database support before relying on it in production; it does not suit multiple instances
Database: managed PostgreSQLSeveral instances behind a load balancer, with the provider's version meeting Strapi's supported PostgreSQL 14 or later requirementProvider handles patching and backups; you still test restores and failover behavior and watch the connection limit across instancesModerate; provider-specific extensions and failover mechanics vary, so confirm them before relying on them
Database: self-managed PostgreSQLTeams that need full control over versions, replication and placement, or must run in a restricted networkYour team owns backups, replication, failover testing, minor patching and monitoring, which recur for the life of the systemLow vendor lock-in; the effort shifts to your operations team
Database: MySQL or MariaDBAn existing MySQL 8.0 or later or MariaDB 10.3 or later estate with trained operatorsSame operational duties as PostgreSQL; confirm the version against Strapi's supported list before choosingLow to moderate; check migration and tooling fit with your existing platform
Media: shared network volumeSmall deployments in one environment where all instances can mount the same volumeOne more storage system to back up, scale and monitor; permissions and mount failures affect every instance at onceLower vendor lock-in, but the volume becomes a single shared dependency
Media: external upload providerMultiple instances that must serve uploads consistently, with delivery through object storage or a CDNProvider storage and egress costs recur; you maintain provider configuration, credentials and migration of existing filesModerate; URLs and provider APIs are tied to the chosen service, so confirm plugin support before committing
Cache: in-process cacheSingle instance or content that can tolerate each instance holding its own copyNo shared invalidation; instances can serve different content until their caches expireLow lock-in, but invalidation logic must be designed by your team
Cache: external shared cacheSeveral instances that must agree on cached responses or rate limits, with invalidation after content publishesOne more service to patch, monitor and fail over; invalidation rules need testingModerate; depends on the cache product and the application code that uses it
Admin login and sessions: local admin accountsSmall teams with few administrators and no central identity providerPasswords and access reviews are managed inside Strapi and must be removed when staff leaveLow lock-in; weaker central control over admin access
Admin login and sessions: SSO through an identity providerOrganizations that need central sign-in and removal of access, on a Growth add-on or Enterprise planIdentity provider and plan costs recur; you must test the admin lock-out and role mappingTied to the identity provider and the plan; confirm current plan terms with Strapi

Why the default single-node setup breaks under load balancing

Putting two Strapi instances behind a load balancer exposes state that a single node hides. Three failure modes appear first: uploads written to one node's local disk that other nodes cannot read, content served from a cache that only one node has warmed, and instances running different builds during a rolling deploy. Each one passes a quick test on a single server and then fails intermittently once traffic is split, which is why teams often find them after go-live rather than before.

Uploads on local disk. By default, Strapi's upload provider stores media on the local filesystem of the instance that handled the request. A file uploaded through node A is recorded in the database, but node B has no copy, so the editor sees a broken image on some page loads and a working one on others, depending on which node answers. API consumers see the same thing as a missing or 404 asset URL. The fix belongs in the architecture: an external upload provider that every node writes to and reads from. Confirm with your Strapi 5 minor version which upload provider options are supported and how the default provider is configured.

Caches warmed on one node. Any in-process cache, such as response caching in a custom controller, a memoized service or a CDN rule that varies by host header, lives on one node. A content update may invalidate the cache on the node that handled the edit and leave the others serving the old entry. Editors then report that a published change is visible in the admin preview but not on the site for some visitors. To reproduce this in staging, publish a change, then send repeated requests through the load balancer and compare responses, checking whether the stale version appears on some requests only.

Mixed builds during rolling deploys. A rolling deploy briefly runs the old and new build side by side. If the new build changed a content type, a component or a API response shape, consumers may receive two formats within minutes. Schema changes also need care because Strapi applies schema updates on startup, so the first node to boot can alter the database that the other node still expects. In staging, run a deploy while a scripted client polls the API and record every distinct response shape and build identifier returned.

How to build a multi-instance Strapi deployment step by step

This sequence moves a single Strapi instance onto shared infrastructure so that several identical instances can serve the same content behind one load balancer. Each step closes with a check that confirms it works before the next step starts, and the sequence ends with a rolling deploy that replaces instances one at a time.

  1. Provision the external database on a supported version

    Create a PostgreSQL, MySQL or MariaDB instance that meets the minimum versions Strapi 5 supports: PostgreSQL 14 or later, MySQL 8.0 or later, or MariaDB 10.3 or later. Confirm the engine with your Strapi version and backup tooling, and confirm that the Node.js release your instances will run is an Active or Maintenance LTS line. The step is done when a host in the application network connects with a dedicated database user that lacks superuser rights, and a backup restores cleanly to a scratch instance.

  2. Move configuration into environment variables

    Remove database credentials, the public URL, and admin and API secrets from configuration files, and load them from environment variables or a secrets manager. Every instance should read the same settings from its runtime. Confirm with your team which keys must match across instances, since sessions and tokens depend on them. The step is done when an instance started only from environment variables connects to the database, and no secret appears in the repository or the built image.

  3. Point every instance at one database

    Start the first instance against the external database and let it complete its schema setup once. Then start the remaining instances against the same database, with schema setup running on only one node. Confirm how your deployment tooling sequences that first start. The check: create an entry through the admin API on one node, then read it back from a second node immediately and again after a short pause. Both reads should return the new entry before this step closes.

  4. Move uploads to shared or external storage

    Configure an upload provider so media goes to S3-compatible object storage or another shared service, not to the local uploads folder on one server. Copy existing files to the new location and update stored file references if your provider requires it. Ask your provider which access controls and URL settings apply to your media. The check: upload a file through one instance, confirm it renders from every instance, and confirm the local uploads directory on each server receives no new files.

  5. Put a load balancer in front with health checks

    Place a load balancer in front of the instances and point its health check at a dedicated endpoint. Strapi does not ship this endpoint as a default, so your team or partner adds a custom route that reports success only when the instance can reach the database. Keep this route separate from public content routes and restrict who can call it. The check: in staging, cut one node's database access, confirm the balancer removes that node from rotation, then restore access and confirm it returns.

  6. Add an external cache if the design needs one

    Decide whether reads need a shared cache based on measured load, and check whether a CDN or the front end already caches responses. If you add a cache, host it outside the instances, define which entries are invalidated when content is published, and avoid private per-instance caches that can disagree with each other. The check: publish a content change, confirm every instance serves the new version within the freshness your design allows, and confirm stale responses stop after invalidation.

  7. Run a rolling deploy from one built artifact

    Build the application once into a versioned artifact or image, and deploy that same artifact to each instance. Replace instances one at a time, and wait for the health check to pass before moving to the next. Take a tested database backup before any release that changes the schema, because Strapi does not support downgrading. The step is done when a full rolling deploy completes with no failed health checks and a rollback to the previous artifact has been rehearsed in staging.

How to deploy schema changes without taking instances out of step

The safe order for a schema change across several Strapi nodes is to version the change first, migrate the database once, and only then let new instances take traffic. Content type definitions live in the project code as schema files, so every node that serves requests should be built from the same commit. Keep those files in version control and treat any change to a content type as a code change that goes through the same review and release path as the rest of the application. If a node is running a build with a different schema than its peers, editors and API consumers can see inconsistent fields, and the problem is hard to trace later.

Run database migrations once, from a single controlled job, before any new instance receives traffic. When every node attempts to migrate on boot, they compete for the same tables and locks, and one failure can leave the database half changed while some nodes already run the new code. A dedicated deployment step that runs the migration, checks that it succeeded, and only then starts or releases the new application instances gives you one place to watch, one log to read and one clear go or no-go decision. Your team should confirm with Strapi's documentation for your exact version how migrations are triggered and whether any of them run automatically on first start.

During the rollout window, old and new builds will run side by side, so both must read and write the same database safely. Plan for this before writing the change. Prefer additive changes first, such as adding an optional field, and defer removals or renames to a later release once no node depends on the old shape. Test your front ends against both response shapes, since a schema change can also alter what the API returns. If your project is moving between major Strapi versions, the compatibility options described in the v4 to v5 migration guidance, including the response format header, are relevant here, and you should confirm their current behavior in the version you run.

Decide early how editors are prevented from changing the schema on production nodes. In Strapi, the Content-Type Builder is part of the admin panel, so a production admin who can edit content types can alter the schema outside your release process. Options include disabling schema editing in production configuration, restricting the admin role that can reach the builder, or routing all schema work through a staging environment and version control. Confirm with your team which control your Strapi version supports and test that an editor cannot change a content type on a production node.

A failed migration cannot be rolled back by reversing the code. Strapi's documentation says downgrading is not supported, so the recovery path is a restore from a backup that has been tested. Before every schema release, confirm that a current database backup exists, that someone has restored it into a non-production environment, and that the restore time fits your tolerance for downtime. Document who approves a restore, which steps the runbook contains and how the application is returned to the previous build. Ask your implementation partner or your Strapi version's documentation for the exact restore procedure before the first production change, because the steps depend on the version and database you run.

What drives effort and cost in a scaled Strapi build

This table lists the factors that change the work in a multi-instance Strapi deployment, how each one raises effort, and how to keep it contained. Read each row as a question to answer during scoping, because the same feature can be cheap in one environment and expensive in another. The main takeaway is that the number of people, data volume, and existing infrastructure decide more of the cost than the Strapi code itself.

DriverWhy it raises effortHow to keep it down
Editors and admin usersMore editors mean more roles, more permission combinations to test, and more concurrent admin sessions that the load balancer and database must handle.Define a small set of roles early, test permissions against each role, and confirm the expected number of concurrent editors before sizing instances.
API consumersEach front end, mobile app or partner integration adds traffic patterns, token scopes and caching behavior that must be tested under several instances.Group consumers by traffic profile, issue scoped API tokens per consumer, and put read-heavy endpoints behind caching where content allows it.
Content and media volumeLarge entry counts and media libraries increase database size, query times, backup duration and the time needed for content migration or reindexing.Model content to avoid unbounded relations, move media to an external upload provider, and measure database growth before choosing instance and storage sizes.
Number of environmentsEach environment (development, staging, production, disaster recovery) needs its own database, secrets, upload configuration and deployment pipeline, multiplying setup and verification work.Keep environments configured from the same infrastructure code, promote builds rather than rebuilding them, and limit the number of long-lived environments.
Database and cache dependenciesIntegrations that read or write the database directly, or that depend on a shared cache, must be checked for locking, connection limits and stale data across instances.Inventory every consumer of the database and cache, route all content access through the Strapi API where possible, and confirm connection pool limits with each integration owner.
Custom plugins and lifecycle hooksCustom code that runs on content events or at startup must be checked on every deploy, because it can run once per instance and produce duplicate side effects.Keep lifecycle hooks idempotent, move scheduled or one-time jobs out of per-instance startup, and maintain a regression checklist for each custom plugin.
Compliance evidenceAssessors may ask for access records, change history, backup restore tests and documented deployment approvals, each of which must be produced and retained.Agree the evidence list before build starts, enable audit and review features where the plan includes them, and automate log export and restore tests.
Existing load balancers and managed databasesIf the client already runs a load balancer, managed PostgreSQL or MySQL, and secret management, the work shifts toward integration. If not, those components must be provisioned, sized and operated as part of the build.Confirm what exists, its ownership and its service terms, then scope only the missing parts. Ask for the supported database versions and the connection and failover settings the platform team already uses.

How the setup differs on VMs, Kubernetes and air-gapped networks

On virtual machines, several Strapi instances sit behind a load balancer and share one managed database and one external upload provider. The build sequence starts with the data and storage layers, then the same application build is installed on every instance, and the load balancer health check is configured last.

  • Build order: provision the managed PostgreSQL, MySQL or MariaDB service first, then point every node at it through environment configuration.
  • Confirm with the platform team: the database version against Strapi's supported list, the Active or Maintenance LTS Node.js version pinned on each image, and the load balancer health check path.
  • Session behavior: confirm whether any part of your setup depends on sticky sessions before choosing the load balancer algorithm.
  • Shared secrets: confirm that every instance receives identical application keys and encryption secrets, or sessions and encrypted data will fail intermittently.
  • Where risk shifts: the main exposure becomes configuration drift between nodes when rollouts are manual, plus connection limits and failover behavior of the managed database.

Before go-live, confirm that one instance can be removed from the pool and redeployed without users noticing.

How to test that a Strapi cluster fails over safely

A Strapi cluster is only safe to run once someone has watched it survive the failures it was built for. Write the test plan before anyone touches production, and agree the pass criteria with the people who own the content and the uptime commitments. Start with the basic behaviors. Create an entry through one instance and read it through another, which shows that both nodes share one database and hold no local state. Upload a media file through one node and confirm it loads from every node, which only holds when media is stored in an external upload provider rather than on local disk. Run a rolling deploy while a steady stream of read requests continues, and confirm that traffic keeps receiving answers throughout. Finally, stop one instance, confirm the load balancer removes it from rotation through its health checks, then confirm it returns to rotation after restart.

The database failover rehearsal needs the most care, because the result depends on your database platform and on how Strapi's connection handling behaves under that platform. Strapi 5 supports PostgreSQL 14 or later, MySQL 8.0 or later and MariaDB 10.3 or later, but the failover mechanism differs between a managed service, a self-managed replica pair and a cluster proxy. Confirm with your database vendor or operations team how failover is triggered, how long clients should expect to be disconnected, and whether the endpoint name changes. During the rehearsal, record which requests fail, whether the application's connection pool recovers without a restart, and whether requests succeed again on their own. The load balancer shapes the result too. Its health check path, check interval, unhealthy threshold and sticky session settings all determine what users see during the window, so document them before the test.

Schema changes need their own test on staging, because the database is shared by every node and a faulty change can break all of them at once. Copy a recent production backup into a staging environment that matches production's database engine and Strapi version, then apply the planned content type change through the same deploy path you will use in production. Strapi 5 runs data migration scripts on first start, so check which instance performs the migration when several start together, and confirm the result on each node. Then run a restore drill: take a backup, restore it into a clean environment, boot Strapi against it and compare record counts and sampled entries with the source. Strapi does not support downgrading once data has moved to Strapi 5, so the backup taken before the change is your only rollback path. Keep that backup and the restore steps in the runbook.

What to monitor, back up and document after go-live

Go-live starts the operating work. The items below keep several Strapi instances healthy, recoverable and understandable, and each needs an owner, a schedule and a tested procedure before production traffic reaches the cluster. They depend on each other, so a backup plan that ignores the upload provider or a release check that skips the load balancer leaves gaps.

Instance and load balancer monitoring

Watch each Strapi process separately as well as the pool. Track response times and error rates per instance, memory and CPU on each node, and health check results at the load balancer, so a node that fails its checks is removed before users notice. Check that the total database connection count across all instances stays within the limit you set, since each node opens its own connections. Confirm the health endpoint checks database reachability, and that alerts reach a named on-call person.

Database backups and restore tests

The external PostgreSQL or MySQL database holds the content that every instance reads, so it needs its own backup schedule, retention rule and point-in-time recovery if your provider offers it. A backup that has never been restored is an assumption. Run restore tests into a separate environment on a fixed cadence, time each restore, and confirm that a freshly restored database starts a Strapi instance cleanly. Record the observed recovery time so the next engineer knows what to expect.

Upload storage backups

Media files usually sit in an external upload provider, such as S3-compatible object storage, so database backups do not capture them. Pair the two: each database row for an uploaded file points to an object that must also exist. Ask your provider which versioning, replication and retention options the bucket supports, and test that a file restored from storage opens through the URL stored in the database. Decide who may delete objects and how those deletions are logged.

Strapi 5 and Node.js release tracking

Strapi 5 minor releases have shipped roughly weekly, and Strapi runs only on Node.js versions in the Active or Maintenance LTS lines. Assign one person to follow the Strapi release feed and the Node.js LTS schedule, and test each candidate version in staging against your plugins and custom code before the cluster moves to it. Roll changes through one node at a time once staging passes. Ongoing upgrade planning and support are covered in the separate Strapi upgrades and support topic.

Node replacement and schema rollback runbooks

Two procedures need written steps before an incident forces them. The first covers replacing a failed or unhealthy node: drain it from the load balancer, build a replacement from the same image and environment configuration, confirm it passes health checks, then return it to the pool. The second covers rolling back a schema change. Strapi's migration documentation notes that downgrading is not supported, so the rollback path is restoring the database backup taken before the change and redeploying the matching application version. Rehearse both.

Architecture record for new engineers

Keep one current document that a new engineer can read to understand the cluster without asking the original builders. Include the topology diagram, the database and upload provider with their versions, the Node.js and Strapi versions in use, which environment variables and secrets differ per node, the caching approach, the deployment pipeline, and the owner of each component. Update it with every schema or infrastructure change, and store it beside the runbooks so access and change history stay in one place.

What buyers ask before hiring help with Strapi high availability

What drives the cost of a multi-instance Strapi build?

The main cost drivers are how much infrastructure already exists, how many environments you need, and how much work the database migration and media move involve. One-time work covers architecture, the build, data migration, the deployment pipeline for schema changes, and cutover testing. Recurring costs sit in your own cloud account: compute for each instance, the managed database, load balancer, object storage, bandwidth and monitoring. Any ongoing support or upgrade retainer is a separate recurring line. Ask for a written quote that separates one-time and recurring items, names who pays for each cloud resource, and states which assumptions about existing infrastructure it depends on. Strapi plan fees are separate license costs and apply only if you need features such as SSO or audit logs.

Can our in-house team build a highly available Strapi setup themselves?

Yes, if the team already runs Node.js services, administers PostgreSQL or MySQL, and operates a load balancer and deployment pipeline. Strapi 5 runs on PostgreSQL 14 or later, MySQL 8.0 or later, MariaDB 10.3 or later, and SQLite 3, but does not support MongoDB or other NoSQL databases. It also runs only on Active or Maintenance LTS Node.js versions. The harder parts are usually not the initial install. They are safe rolling deployments when content types change, moving uploads to external storage, avoiding duplicate scheduled jobs, and testing failover. A useful check is whether your team can run a staging rolling deploy that includes a schema change and then roll it back without data loss.

What does our team need to provide for a Strapi high availability project?

Expect to provide access and decisions, not only approvals. You will typically need cloud account access with permissions for compute, networking, the database, object storage and secrets, plus a named technical owner who can approve architecture choices. The work also depends on DNS control for the API hostname, administrative access or a provisioned account on the load balancer, and a database administrator who can grant the connections and backup settings. Plan for change windows for the cutover and for any schema migration, and confirm who can accept a rollback decision during those windows. Each of these items should appear as a client dependency in the written scope, with an owner and a date agreed before work starts.

How long does a Strapi high availability engagement take?

The duration is set in the written scope for each engagement, and no single timeline applies to every project. The main factors are the number of environments, the state of the existing infrastructure, the size and complexity of the data to migrate, the amount of custom code and plugins that must run on several instances, and whether SSO, a CDN or a separate media provider is part of the build. Client review cycles and the number of change windows also affect the schedule. Ask for milestones, the client dependencies behind each milestone, and the assumptions that would change the timeline. If a proposal gives a duration without listing these inputs, ask how it was derived before you compare it with other quotes.

Does our Strapi plan choice change the high availability architecture?

The plan mostly changes features and licensing, not the basic multi-instance pattern. Community, Growth and Enterprise self-hosted plans all include REST and GraphQL APIs and unlimited entries and API calls. Growth is listed at 45 US dollars per month including 3 users, plus 15 dollars per extra user. SSO is an add-on on Growth and included in Enterprise, while audit logs and review workflows are Enterprise features. If you choose SSO, the identity provider redirect URLs must match the load-balanced hostname, which is a design decision to settle early. Strapi Cloud is a hosted alternative with its own plans, listed at 35, 90 and 450 US dollars per month per project. Confirm in writing whether Cloud hosting meets your data residency, network and control requirements before comparing it with self-hosting.

What breaks when several Strapi instances run at the same time?

The most common problems come from state that lives on one server. Uploads written to local disk will be missing on other instances, so media must move to an external upload provider before you add a second instance. Scheduled jobs and lifecycle tasks can run once per instance, which duplicates work or data changes unless they are restricted to one runner. Database connection pools multiply with the instance count, so the pool size and the database connection limit must be set together. Schema changes need a deliberate deployment order, because instances running different code against one database can behave unpredictably. Caching layers need an invalidation plan so editors see published content on every instance. Ask the team to test each of these in staging and to confirm the behavior against the documentation for your Strapi version.

Which database should we choose for a multi-instance Strapi deployment?

Choose an external server database that Strapi 5 supports and that your team can operate: PostgreSQL 14 or later, MySQL 8.0 or later, or MariaDB 10.3 or later. SQLite is a single-file database and is not a practical shared store for several servers, so it is usually limited to development. MongoDB and other NoSQL databases are not supported. For production, check whether your chosen database offers managed high availability, automated backups and point-in-time recovery, and confirm the exact options and recovery times with your provider in writing. Also confirm the Node.js runtime your Strapi version requires, since Strapi runs only on Active or Maintenance LTS releases. Database choice affects migration effort later, so decide it before the first production data load.

How DeployOpen works on this

DeployOpen plans, implements, hardens, documents and supports self-hosted open-source platforms inside the client's own infrastructure. For Strapi high availability and scaling, we work through a written scope first, then build and test the multi-instance setup in your environment before handing it over with documentation and a support option.

How we scope

  • Review current Strapi version, Node.js runtime and traffic pattern before agreeing deliverables in writing.
  • Confirm the external PostgreSQL or MySQL target, supported versions and backup arrangements with your database team.
  • Agree the upload provider, caching layer, load balancer and deployment pipeline that the written scope will cover.

How we build

  • Deploy several Strapi instances behind a load balancer with shared external database and media storage.
  • Test session handling, admin access, media uploads and failover of a single instance under controlled conditions.
  • Build a schema change process that runs migrations and content model updates in a staged, rollback-tested sequence.

How we hand over

  • Document the architecture, environment variables, secrets handling and the deployment runbook for your team.
  • Walk through restart, scaling, backup and restore steps with the engineers who will operate the platform.
  • Deliver test results and configuration records so your auditors and security reviewers can trace each control.

How we support

  • Offer ongoing support, upgrades and continuous testing as a retainer after handover, agreed in writing.
  • Plan Strapi minor release updates and Node.js LTS changes through the same tested deployment process.
  • Confirm with your team which support tasks, response expectations and review cycles the retainer will include.

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.