Backstage high availability depends on state, not only replicas
Backstage high availability depends on state more than on replica count. The Backstage backend can be scaled horizontally only after its database, cache, TechDocs output and scheduled tasks are shared and recoverable. Until those four parts are in place, extra backend pods mostly add more instances that disagree about the same data, and an outage in one dependency still stops catalog lookups, template runs and documentation reads for every developer who relies on the portal.
The platform team's situation usually looks like this: the developer portal has quietly become a daily dependency. Engineers look up owners in the software catalog, start software templates and open TechDocs before they write code or open a ticket. When the portal is down, that work stalls, and the team hears about it quickly. The hard part is not running more pods. It is deciding where each piece of state lives, how it is shared between replicas, how it is backed up, and how the platform comes back after a failure without corrupting catalog data or duplicating scheduled work.
The main state components to plan for are PostgreSQL, the cache, TechDocs storage and the task coordination that runs catalog refreshes and other scheduled jobs. Backstage uses PostgreSQL in production and gives each backend plugin its own logical database through Knex, so the database tier is a shared dependency for many plugins at once. The cache is configurable (Redis, Memcache, Infinispan or in-memory), and only shared options let replicas see the same state. Confirm with your own architecture which cache option your team will operate, and who owns its failover. Each of these choices affects recovery time and what must be restored together.
The work described here applies to self-hosted Backstage, which is licensed under the Apache License 2.0 and has no paid edition from the project itself. It runs in your own cloud account, data center or air-gapped network, so your team or a partner is responsible for the database service, object storage, network paths, backup jobs and failover runbooks. Ask your platform team which of these already exist and which must be built. A fixed-scope quote should list each dependency as an explicit deliverable, along with the recovery test that proves it works.
Which Backstage components hold state that high availability must cover
Backstage backend replicas can serve the same portal only when the state they depend on is shared or recoverable. Six backend areas hold that state, and each fails differently when it is not shared or not restored. The frontend is a separate concern because it serves the user interface and does not own portal data.
Backend replicas and scheduled tasks
The backend hosts the API and every plugin, and running several replicas behind a load balancer is the main availability lever. Replicas are interchangeable only if sessions, catalog data, cache entries and task state live outside any one process. Check how your release coordinates scheduled tasks, such as catalog refresh, across replicas, because duplicate or skipped runs are a likely failure mode. Confirm this behavior against the current Backstage documentation for your release before you set the replica count.
PostgreSQL logical databases
PostgreSQL is the production database, and Backstage gives each backend plugin its own logical database through Knex. Catalog entities, scaffolder task records and other plugin data share one database server but remain separated by plugin. Losing that server stops writes across the portal, so it needs replication, point-in-time backups and a tested restore procedure. Each plugin database, including those for the Kubernetes and search plugins, must be inside backup scope and restore tests.
Shared cache layer
The architecture overview lists Redis, Memcache, Infinispan and in-memory caching as options. An in-memory cache lives inside one process, so replicas cannot share it and each replica warms its own copy. A shared store such as Redis keeps cached data outside any single process, so one replica restarting does not clear it for the others. Confirm which cache backends your plugins support in your release, and decide whether the backend slows down or fails requests when the cache is unavailable.
Software Catalog state
The Software Catalog stores components, systems, APIs, resources and owners, and processors keep those entities current from their source locations. Catalog data is the ownership record and the input for templates and TechDocs, so corruption or loss affects every team's view of the portal. Ingestion can recreate most entities from sources, but manual ownership edits and custom processor output may not return on their own. Decide which catalog data must come from backup and which can be re-ingested, then test both paths.
Software Templates and scaffolder tasks
Software Templates run as scaffolder tasks that create repositories, pipelines and infrastructure from a form. Task records and their logs are stored in the backend database by default, so a replica that stops mid-run can leave a task incomplete or in an unclear state. Template source files stay in version control and are recoverable from there. Confirm how your release resumes or marks interrupted tasks, and make sure the owning team can reconcile external side effects, such as a repository that was already created.
TechDocs storage
TechDocs builds documentation from Markdown in source repositories and publishes the rendered site to a storage backend. Where those built sites live determines whether every replica serves the same documentation and whether a restore brings it back. Object storage is a common choice for shared access, but confirm the supported publisher and storage options in the current TechDocs documentation for your release. Local storage on a single replica is not shared, so treat it as a development setup.
Which deployment and cache decisions shape Backstage high availability
This table compares the main deployment and cache choices behind a highly available Backstage backend, with the operational cost each one carries. Read each row as a decision to settle before build, and use the right-hand columns to see when each option fits and what your team will have to run afterward.
| Decision | Option | When it fits | Operational cost to plan for |
|---|---|---|---|
| Backend replicas | Single backend instance | Internal pilot or non-critical portal where short restarts are acceptable | Simplest to run, but no redundancy during deploys or node failures; confirm your tolerance with stakeholders |
| Backend replicas | Several backend replicas behind a load balancer | Portal is used across teams and downtime blocks onboarding or incident response | Needs a shared database, shared cache, and consistent sign-in resolvers across all replicas; more to test on each upgrade |
| PostgreSQL | Managed PostgreSQL service | Team prefers the provider to handle patching, failover and point-in-time backup | Recurring service fees and provider-specific restore procedures; confirm backup retention and cross-zone options with the provider |
| PostgreSQL | Self-operated PostgreSQL | Platform team already runs database clusters and has tested backup and restore skills | On-call load for failover, minor upgrades and backup tooling; restore tests must be scheduled and recorded |
| Cache | Redis, Memcache, Infinispan or in-memory cache | Replicas need shared cache state and the team can operate the chosen cache service | Another stateful service to monitor; confirm how the Backstage cache behaves when the cache is unreachable before choosing |
| Cache | No shared cache | Single replica, or the team accepts per-replica cache behavior | Fewer components, but each replica warms its own cache; confirm performance and consistency expectations in your environment |
| TechDocs output | Object storage bucket | Several replicas need to read the same generated documentation | Storage and request charges recur; check cross-zone data transfer if buckets and clusters sit in different zones |
| TechDocs output | Shared volume | Single cluster with a storage class that supports shared access and a clear owner | Volume backup, access mode limits and failover behavior become platform team responsibilities |
| Cluster layout | Single cluster for production | Team wants one set of pipelines and one operational surface | Recovery depends on backups and restore tests within the same cluster; a cluster-level failure needs a documented rebuild path |
| Cluster layout | Separate environments for recovery | Recovery targets require a standby environment that can be brought up from backups | Doubles hosting, configuration and upgrade effort; confirm drift controls and how often the standby is tested |
Build Backstage high availability in sequence
This sequence moves a Backstage deployment from a single instance to a set of backend replicas that keep serving catalog, sessions and documentation when one instance restarts or fails. Each step closes with a check, so you know the layer is sound before the next one depends on it.
Confirm supported Node.js versions for your release
The platform engineering lead checks the Backstage versioning policy against the release line your app uses and records which Node.js versions are supported. For Backstage 1.46.0 the policy lists Node.js 22 and 24, so the runtime image, CI builds and local development should all target one of those. Confirm the same version in every replica image before you build the cluster. The step closes when the chosen Node.js version appears in the image definition, the CI configuration and the project's engine settings, and a test build passes on it.
Move the app from SQLite to PostgreSQL
The platform engineer switches the backend database configuration from SQLite, which is intended for development, to a PostgreSQL instance that all replicas can reach. Backstage gives each backend plugin its own logical database through Knex, so confirm that the catalog, scaffolder, auth, search and other enabled plugins each have a separate database rather than sharing tables. Check connection pool settings against the number of replicas you plan to run. The step closes when the backend starts against PostgreSQL, every enabled plugin reports its own database in the logs or database listing, and a catalog refresh writes rows there.
Configure a shared cache and test replica restarts
The platform engineer configures a cache backend that every replica uses, such as Redis, Memcache or Infinispan, instead of the in-memory default that each process keeps on its own. Confirm the cache host, credentials and network path from every replica subnet. Then restart one replica while users stay signed in and the catalog is open in a browser. The step closes when sessions survive the restart without a forced sign-in, catalog reads return the same entities from the remaining replicas, and the cache shows entries written by more than one replica.
Move TechDocs output to object storage
The platform engineer changes the TechDocs publisher from local storage on one host to an object storage bucket in your cloud account or data center. Set read and write permissions for the backend identity so builds can publish and every replica can read the generated site. Confirm the bucket name, region and access policy with your cloud or storage team, and avoid sharing the bucket with unrelated workloads. The step closes when a documentation build publishes to the bucket, and opening the same TechDocs page through each replica in turn serves the current content.
Set up PostgreSQL backup and restore
The database administrator enables backups for the PostgreSQL instance that holds the logical databases for all Backstage plugins, and writes the restore procedure as a runbook. The runbook names who can start a restore, where backups are stored, how the database is restored to a new instance, and how the backend is pointed at it. Confirm the backup schedule, retention and encryption with your database platform owner, since these depend on your hosting and policy. The step closes when a backup job completes and its location and metadata are recorded in the runbook.
Run backend replicas behind a load balancer
The platform engineer deploys the Backstage backend as two or more replicas from the same image and configuration, placed behind a load balancer. Configure the health check endpoint of the backend as the load balancer probe, and confirm that unhealthy replicas are removed from rotation. Check that sign-in callbacks and session cookies work through the load balancer address and that the same base URL is configured everywhere. The step closes when traffic reaches all replicas, stopping one replica causes no user-visible outage, and the load balancer marks it unhealthy and returns it to service after restart.
Confirm scheduled tasks run once across replicas
The platform engineer reviews every scheduled task in the backend, including catalog refresh, entity provider sync and any custom jobs, and confirms that Backstage's task scheduler coordinates them through the shared database. Watch the logs of all replicas over at least one full interval of each task and count the executions. Confirm the expected interval with the plugin documentation for each task, since defaults vary by plugin. The step closes when each scheduled task runs once per interval across the replica set and no duplicate writes appear in the catalog.
Rehearse a restore in a separate environment
The platform team restores the latest PostgreSQL backup into a separate environment with its own database, object storage bucket and cache, then starts a backend pointed at those resources. The rehearsal checks that catalog entities, user sessions configuration, scaffolder history and TechDocs pages all load as they did in production. Record the time the restore took and any manual steps, and update the runbook with the gaps you find. The step closes when the separate environment serves the restored data and the team has signed off on the updated runbook.
Why replicas need a shared cache and coordinated scheduled tasks
Running several Backstage backend replicas only improves availability if every replica sees the same state and no replica does work that another one already did. The main risks are local in-memory caches that drift apart, scheduled tasks that run twice or not at all, and rollouts that leave replicas on different plugin versions. Each of these is a decision you make in configuration and operations, not something the platform handles automatically, so the section below should be read as a checklist for your own deployment.
In-memory caches diverge. Backstage supports Redis, Memcache, Infinispan or in-memory caching, according to the architecture overview. In-memory caching is fine for a single process, but with two or more replicas each process holds its own copy of cached catalog responses, plugin data and session-related values. A user who refreshes an entity may see different results depending on which replica answers, and an invalidation on one replica does not reach the others. Choose a shared cache backend such as Redis for any multi-replica deployment, and confirm in your release's configuration reference which plugins read through the cache so you know what must be shared and what can safely stay local.
Scheduled tasks run in duplicate or not at all. Catalog ingestion, search indexing and many plugin tasks run on a schedule inside the backend. If every replica runs its own timer, a catalog refresh can execute once per replica, multiplying load on source systems such as GitHub or GitLab and risking rate limits. Coordination can also fail in the other direction: if a replica holding a lock crashes mid-run and the lock is never released, the task may be skipped until its lease expires. The safe pattern is a single shared PostgreSQL instance per environment that all replicas use, so task coordination is recorded in one place. Do not assume this behavior from memory. Read the scheduling and task documentation for your Backstage release, check which tasks use distributed locking, and confirm the lock timeout values in configuration.
Rollouts leave replicas on different versions. During a rolling update, old and new replicas serve traffic at the same time. If the database schema or a plugin's API changed between versions, a request routed to an old replica can fail or write data the new replica does not expect. Keep all @backstage packages on the same release line, as the upgrade guide describes, and confirm in the release notes whether a version requires a database migration that must finish before old replicas are drained. Make the migration step an explicit gate in your deployment pipeline rather than a side effect of the first pod to start.
Verify before you trust it. Before going live, check scheduling behavior in two places: the documentation for your exact release, and the backend logs during a test run with at least two replicas. Confirm that each scheduled task logs one start and one completion per interval, and that a deliberately stopped replica does not stop the task. Then run a rolling restore of the backend under representative load and watch for errors, duplicate ingestion events and cache inconsistency. Record what you observed so the result can be repeated after every upgrade.
What drives Backstage high availability effort and cost
This table lists the factors that change how much design, build and operating work a highly available Backstage deployment needs, and what keeps each one manageable. Read each row as a question to answer for your own environment before requesting a fixed-scope quote. The main takeaway is that stateful plugins, recovery objectives and compliance evidence usually weigh more on effort than raw traffic.
| Driver | Why it changes effort or cost | How to keep it down |
|---|---|---|
| Catalog entities and users | A larger catalog raises database size, processing load on the catalog backend, and the time needed to restore and re-ingest data after an incident. User and group counts affect ingestion from identity providers. | Model entities at the level owners actually use, avoid generating entities per resource unless needed, and confirm how long a full catalog rebuild takes in a test restore. |
| TechDocs sites and build frequency | Each documentation site produces generated files in storage, and frequent builds increase storage writes, build queue load and the volume that backups and replication must cover. | Store built docs in object storage rather than on backend disks, limit builds to changed sources, and set retention rules for old site versions. |
| Stateful or externally calling plugins | Every plugin that writes its own state or calls an external API adds a logical database, a credential to rotate, a failure mode to monitor and a recovery step to test. | Install only plugins the teams use, prefer plugins that keep no local state, and record each plugin's data location and API dependency in one inventory. |
| Number of environments | Development, staging, production and recovery each need their own databases, storage, secrets and configuration. Keeping them aligned is ongoing work, and drift between them is a common source of failed failovers. | Define one infrastructure as code module and vary only inputs per environment, and promote the same container image through every environment. |
| Identity and source control integrations | Sign-in resolvers, catalog providers and scaffolder tokens for each identity and source control system need configuration, scope reviews and rotation during failover tests. | Use a single identity resolver pattern, document the token scope for each integration, and include integration checks in the recovery runbook. |
| Client recovery time and recovery point objectives | Tighter targets require more replicas, continuous or frequent database backups, cross-zone or cross-region replication and more frequent restore tests. Targets set by the client drive the architecture more than any other input. | Ask the client to set written targets per component, separate the catalog database from less critical data, and confirm which targets the platform team can meet with the chosen hosting. |
| Compliance evidence for backups and access logs | Assessors may ask for proof that backups run, restores succeed, and access to backups and admin consoles is logged and reviewed. Producing this evidence takes configuration and recurring reporting effort. | Use one backup pattern for all databases, export logs to a central store with retention set by policy, and schedule restore tests that generate dated records. |
How Backstage high availability differs by environment
This model runs one Backstage backend instance with its database handled by a managed PostgreSQL service. It suits smaller portals or early pilots where a short outage is tolerable and the platform team wants fewer moving parts. Availability depends mostly on the database service and on how quickly the instance can be replaced.
- Cache: An in-memory cache is often enough because there is only one replica to share state with. Confirm that scheduled tasks do not depend on a second instance.
- TechDocs storage: Store generated documentation in an object storage bucket rather than on the instance disk, so a replaced instance can serve existing docs immediately.
- Backups: Rely on the managed service's point-in-time recovery, and keep a separate periodic export of the Backstage logical databases in a location outside the database provider's account.
- Mirroring for upgrades: Pull packages and container images through your normal artifact proxy, and keep the last working image tagged so a rollback needs no rebuild.
- Failover testing: Restore a backup into a scratch database, start a backend against it, and confirm the catalog loads.
Check with your database provider how long point-in-time recovery takes in your region and whether restores can be tested without affecting production.
This model runs several backend replicas behind a Kubernetes Service, all connected to one PostgreSQL instance. Replicas must share state, so the shared cache and the coordination of scheduled tasks become design decisions rather than defaults. Pod rescheduling and rolling upgrades are handled by the cluster.
- Cache: Use a shared cache such as Redis so replicas see the same cached data. Confirm the cache has its own redundancy, since a single cache node becomes the new point of failure.
- TechDocs storage: Use object storage for all replicas, because each pod needs to read the same published documentation.
- Backups: Back up the PostgreSQL instance on a schedule and store copies outside the cluster, so a cluster failure does not remove the backups.
- Mirroring for upgrades: Build images once in your pipeline, push them to your internal registry, and deploy the same digest to every environment.
- Failover testing: Delete a replica and a database connection during a load test, then check that scheduled tasks run once and that catalog refresh continues.
Confirm that your Kubernetes version and PostgreSQL version are both supported by the Backstage release line you plan to run, using the versioning policy.
This model spreads Kubernetes nodes, cache and database across availability zones in one cloud region. It protects against a zone outage but not a regional one. The main design work is making sure every stateful dependency has a standby in another zone, and that the team knows which failures stay inside the region.
- Cache: Choose a managed cache with replicas placed in separate zones and check its failover behavior during a zone event.
- TechDocs storage: Use a bucket with zone-redundant storage where the provider offers it, and confirm the storage class you select.
- Backups: Keep at least one copy of backups in a second region or account, since a zone outage alone will not test this path.
- Mirroring for upgrades: Replicate the internal image registry to each zone or use a regional registry, so nodes can pull images during a zone failure.
- Failover testing: Cordon and drain nodes in one zone, observe pod placement and database failover, and record the observed recovery time.
Ask your cloud provider to document the failover behavior of each managed service in your chosen region, and verify that claim in your own account.
This model runs Backstage in a network with no direct internet access. Every package, container image, base operating system layer and documentation asset must come from a local mirror, and every upgrade must be staged across that boundary. Availability is limited by what you can reproduce inside the network, so dependency inventory is the first task.
- Cache: Use a cache that runs entirely inside the enclave, and confirm that it does not call an external service at startup.
- TechDocs storage: Use an internal object store. Generate documentation inside the network, since build tools that fetch remote assets will fail.
- Backups: Store backups on media or storage inside the enclave, plus an offline copy if your policy requires it. Test restores on an isolated system.
- Mirroring for upgrades: Maintain local mirrors for the npm and Yarn registries, container images, base images and Node.js binaries. Each upgrade needs its full dependency set mirrored before the change window opens.
- Failover testing: Run recovery drills without internet access, so any hidden external call shows up as a failure.
Confirm the availability of every dependency inside your own network before planning, including Node.js releases, plugin packages and any external authentication provider used for sign-in.
Securing backups, storage and secrets in a Backstage HA setup
A highly available Backstage deployment spreads state across PostgreSQL, object storage, secrets and identity providers, and each of those is a place where access can be too broad. The cards below cover the controls we check first, and each one can be confirmed in your own environment with a configuration review or a restore test.
Encrypt and restrict PostgreSQL backups
Backstage keeps catalog, scaffolder and plugin state in PostgreSQL, so every backup carries that data. Confirm that backups are encrypted at rest with keys managed outside the database host, and that the key and the backup store are readable only by the backup service and a named restore group. Test a restore into a separate environment to prove the backup is both usable and protected.
Scope TechDocs storage credentials
TechDocs publishes built documentation to object storage, and the Backstage backend needs write access to one bucket and read access to the same bucket for serving. Check that the credential used by the publisher and the one used by the reader are separate, and that neither grants access to other buckets or account-wide administration. Review the policy document itself rather than trusting the naming of the role.
Keep tokens and credentials out of the image
Integration tokens, database passwords and OAuth client secrets should be injected at runtime from a secrets manager, not baked into the container image or committed to configuration files. Verify this by searching built images and the Git repository for known secret patterns, and by confirming that each replica reads secrets from the same managed source. Rotation should be possible without rebuilding the image.
Disable guest access in production
The Backstage authentication documentation advises against offering guest access in production. Confirm that the guest provider is absent from the production configuration, that no other environment variable re-enables it, and that every request to the backend is tied to a signed-in identity. Run this check against each replica, since a configuration drift on one instance can reopen access during a failover.
Resolve every provider to one identity
When more than one identity provider can sign users in, each one must map to the same user entity in the catalog, or failover and multi-provider sign-in will create duplicate accounts with different ownership. The authentication documentation recommends sign-in resolvers that produce one identity per person. Test by signing in with each provider for the same user and confirming that a single user entity and a single set of group memberships results.
Log backup and restore access
Restore operations are the highest-risk path, because they can expose the full catalog and plugin data. Confirm that every backup read, restore start, restore completion and failed attempt is logged with the operator identity and timestamp, and that those logs are stored outside the cluster being restored. Review the log trail after each restore test to confirm that the expected entries exist.
How to test Backstage high availability and recovery
A Backstage high availability design is only proven when a test shows it keeps serving users through a failure and recovers to known data. Run each test below against a staging copy of the production topology before go-live, repeat it after material changes such as a new replica count, a database engine change or a cache swap, and schedule the restore test on a fixed cadence. Each test should have a named owner, a written pass condition agreed before the run, and an evidence folder that an auditor or incident reviewer could read later without asking the platform team questions.
Start with the replica and node tests. While a user session is active and someone is browsing catalog pages, terminate one backend replica. The pass condition is that the session either continues or re-authenticates cleanly, catalog pages keep loading from the surviving replicas, and no request returns a server error for longer than your agreed threshold. Keep the load balancer access logs, the replica termination timestamp, and the error rate chart for that window. Then cordon and drain a node that hosts a replica and confirm the scheduler reschedules it, the readiness probe passes before traffic returns, and scheduled work does not stall. Record the drain command output, pod or container events with timestamps, and the time to return to full replica count. Confirm the exact Kubernetes or container platform commands with your platform team, since they depend on your deployment.
The cache test checks degradation, not just uptime. Take the shared cache offline (for example, stop the Redis instance or block its network path) and confirm the portal keeps serving catalog data, with slower responses rather than data loss. Verify that the catalog and TechDocs data in PostgreSQL are unchanged by running a row count and checksum comparison before and after. Keep the cache outage start and end times, application logs showing cache connection errors, and the comparison output. A failed test here should trigger a review of cache client timeouts and fallback behavior, because a cache outage that turns into a request storm against PostgreSQL is a capacity risk, not only a performance blip.
The restore test is the most important one for data. Restore the most recent PostgreSQL backup into a separate environment, point a non-production Backstage instance at it, and compare catalog entity counts, software template entries, owner references and location records against the source. Use comparison queries that run on both sides and save the restore tool logs, the backup identifier and timestamp, and the diff output. Time the restore and record it, since that figure is what you will quote to leadership as recovery time. Also confirm that TechDocs can be rebuilt from object storage on a fresh replica, and that scheduled tasks do not run twice by checking that each scheduled job writes one execution record per interval after the new replica joins. A failed test should block the change that caused it, open an incident record, and trigger a backup or restore fix before the next release cycle.
Agree in advance what a failed test triggers. Treat a failed failover or rescheduling test as a blocker for production rollout, a failed restore comparison as a data recovery incident with a root-cause review, and a duplicate scheduled task as a defect in coordination configuration to fix before any scaling change. Ask your implementation partner to deliver the test scripts, the evidence template and the pass criteria in writing as part of the fixed scope, and confirm with your security and compliance leads which evidence they need to retain and for how long.
What buyers ask about Backstage high availability before hiring help
What drives the cost of making Backstage highly available?
The cost depends mainly on how many environments, replicas and dependent services are in scope, and on how much of the platform already exists in your cloud account. The main components are design work, which covers the replica topology, database and cache choices, and the TechDocs storage model; build work, which covers configuration, health checks, shared cache wiring and scheduled task coordination; and recovery testing, which proves that a failed replica, a restored database and a rebuilt deployment behave as documented. Most of this is one-time. Recurring costs sit on your side: infrastructure runs continuously, backups need periodic restore tests, and Backstage releases need to be applied. Ask any provider for a quote that separates one-time work from any retainer and names who pays for cloud resources.
How long does a Backstage high availability engagement take?
Duration depends on scope and environment, so no fixed figure applies to every organization. The biggest variables are the number of Backstage instances and plugins, whether PostgreSQL and object storage already exist and are managed, how many environments need the same pattern, and how quickly access approvals arrive from your cloud, database and identity teams. A single production environment with existing managed database and storage usually moves faster than a multi-region setup built from scratch. Ask for a timeline tied to written deliverables and to the client dependencies listed in the scope, not to a generic number of weeks.
What does the work need from our team?
Expect to provide access and decisions before engineering starts. You will typically need a named owner who can approve design choices and sign off on each phase, along with access to the cloud account where Backstage runs, a PostgreSQL instance or admin path for creating per-plugin databases and backups, an object storage bucket for TechDocs, a cache service if you use one, and the identity provider configuration used for sign-in. Your security team should review network paths, secrets handling and backup retention. Ask the provider to list each dependency in the written scope so delays are visible early.
Can our internal platform team do this without outside help?
Yes, many platform teams can, provided they have engineers who know Node.js, Kubernetes or your container platform, PostgreSQL operations, and your cloud networking. The harder part is usually not the first deployment but the ongoing discipline: testing failover, restoring backups on a schedule, and keeping scheduled tasks from running twice across replicas. Consider a partner when the team lacks those skills, when the portal is business critical with no spare capacity, or when a fixed deadline matters. Otherwise, use the scope and checklist from a quote as a self-assessment of what your team would need to build.
What should a fixed-scope quote for this work list?
A useful quote states the environments covered, the number of Backstage backend replicas and the hosting pattern, the database and backup design, the cache and TechDocs storage approach, the coordination of scheduled tasks, and the recovery tests to be run and their acceptance criteria. It should also list the deliverables, such as configuration, runbooks and restore procedures, the client dependencies with owners, what is excluded, and a payment or milestone structure. Ask which items are one-time and which recur, and whether ongoing support is a separate agreement. DeployOpen agrees scope, deliverables and timelines in writing before work starts.
How does high availability work change when we upgrade Backstage?
Upgrades need to be planned as part of the high availability design, because each replica must run the same version during rollout and database migrations must not break older replicas still serving traffic. Backstage ships a main release line monthly and a next line weekly, and it moves @backstage packages together using yarn backstage-cli versions:bump, with the Upgrade Helper showing template changes. Ask how your rollout will handle migrations, how rollbacks restore the database from backup, and which Node.js versions your chosen release supports. Upgrade support is usually a separate scope, which is described on the Backstage upgrades and support page.
Does DeployOpen issue audit reports for a high availability setup?
No. DeployOpen plans, implements, backs up and documents the environment and prepares systems and evidence for compliance assessments, but it does not issue audit reports, attestations or certifications. Independent auditors and certification bodies perform those assessments. If your organization needs evidence for a specific framework, ask the auditor which records they expect, such as backup restore test results, access reviews and change records, and agree in the written scope which of those artifacts DeployOpen will produce.
What to monitor, back up, upgrade and document after go-live
After go-live, the operating routine should watch the four parts of the high availability design that can fail independently: the Backstage backend replicas, the PostgreSQL databases, the shared cache and the scheduled tasks that coordinate work across replicas. Alert on the backend health endpoints for each replica, not only on the load balancer address, because a load balancer can report healthy while one replica is failing. Track the number of ready replicas against the count you deployed, and alert when the gap lasts longer than your agreed tolerance. Watch database connections per replica so that a pool which grows after a deployment is caught before it exhausts the server's connection limit. Confirm the exact health endpoint paths and metric names for your Backstage version and plugin set, since these vary with what you install.
Backups need a schedule and retention period that your organization sets from its recovery point and recovery time requirements, and these should be written down before go-live. Cover every PostgreSQL logical database that Backstage creates for its backend plugins, because catalog, scaffolder and other plugin data live there. Confirm that the TechDocs storage in object storage has its own versioning or replication setting, since it is stored separately from the database. Treat a successful backup job as unproven until someone restores it. Run restore tests into a separate environment on a fixed cadence, record the time taken and the data checked, and keep those results as evidence. Treat the cache as rebuildable, and have the restore plan describe how the cache is warmed and what slower responses users should expect in the meantime.
Backstage publishes a main release line monthly, on the Tuesday before the third Wednesday of each month, and a next release line weekly on Tuesdays. Use the main line as the production baseline and run the next line in staging to catch breaking changes early. Place a recurring test cycle on the calendar after each monthly release: upgrade staging, run the replica failover and restore checks, then promote to production within a window your team defines. Assign one person to review the weekly next line release notes so that changes are understood before the monthly release arrives. Backstage supports two adjacent even-numbered Node.js releases, which were Node.js 22 and 24 as of Backstage 1.46.0, so confirm the supported pair for your version and schedule any Node.js change in the same cycle.
The Backstage versioning policy says high and critical severity vulnerabilities will always be backported to releases from the last 6 months if feasible, and other security fixes may be backported. Your patch window therefore depends on staying inside that six-month band. A deployment that falls behind the monthly line may find that a fix exists only in a newer release, which turns a routine bump into a larger upgrade. Write down who monitors the Backstage security advisories, who approves an emergency version bump, and the target time for applying a high or critical fix to staging and then production. Confirm those targets with your risk owner, because the project's policy describes backport intent and does not set your internal deadlines.
Keep runbooks for three procedures: failover of a backend replica or database, restore from backup into a clean environment, and cache rebuild after a flush or outage. Each runbook should name its owner, the commands or console steps, the checks that confirm success and the rollback step. At close-out, ask for a handover package that includes an architecture diagram showing replicas, database, cache, object storage and the load balancer; the configuration repository with environment overlays and references to secrets; the current runbooks; the evidence from the latest restore test; and an owner list naming on-call contacts for the platform, database, identity provider and each plugin. Ask for these items in writing so the operating team can run the platform without depending on the implementation team.
How DeployOpen scopes, builds and hands over Backstage high availability work
DeployOpen plans and implements Backstage high availability inside your own infrastructure, using the Apache-2.0 release of the project. Each engagement starts from a written, fixed scope that names the replicas, database, cache, storage and recovery tests covered.
How we scope
- We review your hosting model, current Backstage version and which backend plugins run in production before agreeing scope.
- The written scope names each HA component: backend replicas, PostgreSQL, cache, TechDocs object storage and scheduled task handling.
- We list the failure scenarios to test and the recovery targets you need, so the quote reflects the work you actually asked for.
How we build
- We run multiple backend replicas behind your load balancer and confirm sessions and auth flows behave the same on every instance.
- We configure PostgreSQL with per-plugin logical databases, automated backups and restore procedures agreed with your database team.
- We move TechDocs output to object storage and set up shared caching and scheduled task coordination, then test each failure path.
How we hand over
- You receive infrastructure configuration, deployment manifests and runbooks written for your platform engineers to operate.
- We deliver recorded recovery test results, including a restore from backup and a replica loss, so you can repeat them later.
- Knowledge transfer sessions cover upgrade steps for the @backstage packages, so your team keeps the HA setup working after release.
How we support
- Ongoing support, upgrades and periodic recovery testing are available as a retainer, sized to your written scope.
- Retainer scope should state which Backstage release lines, Node.js versions and security backports it covers, so confirm these in writing.
- Ask for a quote that separates one-time build work from recurring support and testing effort before work starts.

