Redpoint Interaction v7.x Documentation
Auto Light Dark
Auto Light Dark

Admin: RPI version rollback procedure

Overview

This topic provides guidance to system installers and operations teams about rolling back your RPI version on Kubernetes or Docker Compose, SQL Server or PostgreSQL operational databases. This is the generic baseline procedure; adapt the environment-specific details (backup tooling, Helm release names, change-control steps) per deployment.

These rollback operations are supported from v7.8.20261015.1302 forward.

What a rollback involves

An RPI upgrade changes four kinds of state; a rollback must deal with each:

State

What the upgrade does

On rollback

Container images / binaries

New versions of every service

Redeploy the previous version's images

Database schema (Pulse, Pulse_Logging, and each tenant's Interaction and InteractionAudit)

Additive changes (new tables/columns), altered stored procedures, occasionally dropped columns

Reconciled by the rollback operation; schema the newer version added is deliberately left in place (harmless to the older version)

Baseline rows (configuration values, alerts, permissions, health checks, housekeepers, system tasks)

New rows inserted; occasionally rows deleted or renamed

Deleted rows are restored at default values by the rollback operation

Plugin registry (op_Plugins / op_PlugInAssemblies in Pulse)

Wiped and reseeded with the new version's plugins

Cleared and force-reseeded from the rolled-back-to version's plugin manifest by the rollback operation

Two things decide the relative risk of a rollback:

  • The release's Rollback Risk score (0–5), published in the release summary for every release. It reflects the riskiest change in the release.

  • How much has happened since the upgrade. Work performed on the new version (workflow runs, saved changes, configuration edits) may not fully survive a rollback.

Choosing a strategy

Release rollback risk

Strategy

0–2 (Low/Medium)

In-place rollback keeps all data and work done since the upgrade.

3–4 (Medium/High)

In-place rollback plus the release-specific manual steps from that release's rollback notes. Those notes state, per item, whether its steps make an in-place rollback safe; an item's notes escalate to a restore only when no manual step can make it safe (for example, a column retyped in a way the older version cannot read).

5 (High)

Database-restore rollback: the release contains destructive or irreversible changes (data transformed or dropped, tables with live data removed); only a restore recovers.

The in-place strategy should be the default whenever possible, because a restore loses all workflow state and work done since the backups were taken.

Use the database-restore strategy only when the release's rollback notes require it, or when the environment cannot tolerate any behavioral residue from the newer version.

Before every upgrade (rollback preconditions)

A clean rollback is prepared before the upgrade runs. Make these part of the standard upgrade procedure:

  1. Enter maintenance mode: POST /api/maintenance/maintenancemode/enter on the Deployment Service. Wait for in-flight workflow executions to drain or reach a stable state. This is important: workflow state written mid-flight during an upgrade window can severely complicate an upgrade or a rollback.

  2. Back up all operational databases: Pulse, Pulse_Logging, and every tenant's Interaction and InteractionAudit databases. These backups are the only way to recover customer-set values on settings that the new version deletes or renames, and the only rollback path for releases scored 5.

  3. Record the installed version. Connect to the Pulse database and run the query for your database platform.

    SQL Server

    SQL
    SELECT Version FROM rpi_Cluster;
    

    PostgreSQL

    SQL
    SELECT "Version" FROM "rpi_Cluster";
    

    The query returns one row. Note the value returned, for example 7.8.20261015.1302.

Do not roll back what you cannot restore. If the pre-upgrade backups were skipped, the in-place strategy still works, but the losses listed in that section become permanent.

Rollback overview (both strategies)

  1. Enter maintenance mode (if not already in it).

  2. Announce the outage; stop any external integrations that write through the Integration or Realtime APIs if your change process requires it.

  3. Execute Strategy A (database restore) or Strategy B (in-place), below.

  4. Perform the post-rollback manual steps and any release-specific steps.

  5. Verify, then exit maintenance mode.

Strategy A: database-restore rollback

Database-restore rollback recovers everything, including customer-set values and permission assignments, at the cost of losing all work done since the backups were taken (workflow runs, audience changes, saved assets, configuration edits).

This potentially puts the Ops DB out of sync with the Campaign Warehouse; so once campaigns have executed, there is the risk of campaigns re-executing and targeting users multiple times if this strategy is employed.

  1. Stop all RPI services.

  2. Restore Pulse, Pulse_Logging, and every tenant's Interaction and InteractionAudit databases from the pre-upgrade backups. Restore them as a set; mixing pre-upgrade and post-upgrade databases is not a supported state.

  3. Redeploy the previous version's containers (Helm: set the image tags back to the previous release and upgrade the release; Compose: previous image tags).

  4. Start the services. Because the databases and binaries are both back at the previous version, no reconcile is needed.

  5. Continue at post-rollback manual steps, then verify.

Data warehouse note: RPI upgrades do not restructure the client data warehouse, so a data warehouse restore is not normally part of an RPI rollback. If the release notes for the specific release say otherwise, follow them.

Strategy B: in-place rollback

In-place rollback keeps all data and work done since the upgrade. The previous version's own Deployment Service reconciles the databases back to that version's baseline. Available when the version being rolled back to is v7.8.20261015.1302 or later; for older targets use Strategy A.

  1. Redeploy the previous version's containers (image tags back, all services including the Deployment Service).

  2. Call the rollback operation on the previous version's Deployment Service:

    POST /api/deployment/rollback?exitMaintenanceMode=false&waitTimeoutSeconds=300
    

    (Use exitMaintenanceMode=true only if no manual steps from post-rollback manual steps and release-specific steps apply.)
    The operation, per database (Pulse, Pulse_Logging, every tenant Interaction and InteractionAudit):

    • Re-creates missing tables and re-adds missing columns against this version's schema definitions.

    • Refreshes every stored procedure to this version's definition.

    • Restores deleted baseline configuration values, alerts, permissions, health checks, housekeepers, and cluster tasks at default values.

    • Clears the plugin registry and reseeds it from this version's plugin manifest.

    • Stamps rpi_Cluster.Version back to this version and restores the "what's new" content.

    Everything is guarded and idempotent: existing rows are never modified or duplicated, nothing is dropped, and re-running the operation is safe.

  3. Read the returned deployment log (also available at GET /api/deployment/status). It reports, per database, what was repaired (missing tables/columns re-added, procedures refreshed, baseline rows ensured present) and states explicitly what a rollback deliberately does not restore. Keep this log: it is the rollback audit record.

What an in-place rollback does NOT restore

Communicate these to stakeholders before choosing an in-place rollback:

Not restored

Why

Recovery

Customer-set values on settings/alerts the newer version deleted or renamed

The old baseline only knows defaults.

Database restore, or re-key the values manually.

Permission group assignments for restored permissions

Which groups held a permission is customer data.

Re-grant in Security → Groups.

User alert subscriptions removed with a deleted alert

Removed with the alert rows.

Users re-subscribe.

Data migrations / transformed data

Some upgrades rewrite existing data in place, one way (e.g., the 7.8 upgrade rewrote stored user identifiers to lowercase). Rolling back the binaries does not put the data back the way it was.

Usually, the data transformation will be fixing an issue so restore is unnecessary. If the original data is required, then only Database restore will recover it. This will be indicated by the Rollback Risk.

Schema the newer version added

New tables and columns introduced by the newer version stay in the database (e.g., rolling back from 7.8 to 7.7 leaves the InactiveMinutesBeforeLogout column that 7.8 added to op_Groups). The older version doesn’t read them, so they are harmless residue.

Optional manual cleanup, not required.

Work saved under the newer version using newer features

Objects created or edited on the new version keep only the attributes the old version understands; an object built on a feature that does not exist in the old version may fail to open.

Re-create or restore.

Additionally, in-flight workflow executions started under the newer version may not resume cleanly on the older binaries. Draining executions before the original upgrade (step 1 of Before every upgrade…) avoids this entirely.

Post-rollback manual steps (baseline)

  1. Desktop clients do not downgrade: the RPI client self-upgrades only. Users whose clients updated to the newer version must reinstall the previous client (the server's Files/Client download serves the version now deployed). A newer client against an older server is not a supported combination.

  2. Re-grant restored permissions: any permission the newer version had deleted is back at default (assigned to no group); re-grant.

  3. Re-key customer values: restore customer-set values for any settings listed in the release's rollback notes as deleted/renamed, from the pre-upgrade backup or records.

Release-specific rollback steps

Each release's summary carries a Rollback Risk score per work item, and items scored 3+ carry the specific manual steps needed to make their rollback safe, including, where no step can make it safe, an explicit escalation to the database-restore strategy. Review the release summary for the release being rolled back before starting, and fold its steps into the post-rollback manual steps.

For releases published before this practice, review each item scored 3+ individually; where a 4-scored item's rollback implications cannot be established, treat the release as requiring a database-restore rollback.

Verification checklist

  • The rollback deployment log shows Rollback Complete with per-database reconcile summaries and no errors (GET /api/deployment/status).
  • rpi_Cluster.Version equals the rolled-back-to version.
  • GET /api/deployment/validate reports all databases valid. (Validation checks that everything the version expects is present; it does not flag surplus schema the newer version left, which is expected residue.)
  • All services start; the cluster elects a master node and scheduled tasks resume.
  • The desktop client (correct version) logs in and lists plugins/channels correctly.
  • A representative workflow runs end to end; a test message sends through a representative channel.
  • Users spot-check configuration values they own (refer to What an in-place rollback does NOT restore).
  • Exit maintenance mode: POST /api/maintenance/maintenancemode/exit.

Appendix: API quick reference (Deployment Service)

Operation

Call

Enter / exit maintenance mode

POST /api/maintenance/maintenancemode/enter (body: message) / POST /api/maintenance/maintenancemode/exit

Roll back (reconcile to this version's baseline)

POST /api/deployment/rollback?exitMaintenanceMode=<bool>&waitTimeoutSeconds=<n>

Operation status / audit log

GET /api/deployment/status

Validate databases

GET /api/deployment/validate

Upgrade (refuses older payloads from v7.9)

GET /api/deployment/upgrade

Instance-scoped deployments use the same routes under /api/deployment/instances/{instanceId}/....

Last updated: