Skip to main content
Version: 8.9 (unreleased)

Camunda back up and restore

Use the backup feature to back up and restore your Camunda 8 Self-Managed components and cluster.

About this guide

This guide covers how to back up and restore your Camunda 8 Self-Managed components and cluster. Automate backup and restore procedures with tools that meet your organization's requirements.

info

With Camunda 8.8, the architecture was updated. For clarity, the Orchestration Cluster now consists of:

  • Zeebe
  • Web Applications (Operate and Tasklist)
  • Identity

Depending on context, we may refer to a specific subcomponent of the Orchestration Cluster where appropriate.

This guide includes procedures to:

  • Regularly back up the state of the Orchestration Cluster and Optimize without any downtime. You can also back up and restore Web Modeler data.

  • Restore a cluster from a backup if any failures occur that cause data loss.

Choose the guide that matches your secondary storage:

Elasticsearch / OpenSearch

Relational databases (RDBMS)

note
  • The examples in this guide are based on using the following tools: curl, jq, and kubectl.

Considerations

The backup of each component and the backup of a Camunda 8 cluster is identified by an ID. The backup ID must be an integer and greater than the previous backups.

note

We recommend using the unix timestamp as the backup ID.

The steps outlined on this page are generally applicable for any kind of deployment but might differ slightly depending on your setup.

Management API

The management API is an extension of the Spring Boot Actuator, typically used for monitoring and other operational purposes. This is not a public API and not exposed. You will need direct access to your Camunda cluster to be able to interact with these management APIs. This is why you'll often see the reference to localhost.

Direct access will depend on your deployment environment. For example, direct Kubernetes cluster access with port-forwarding or exec to execute commands directly on Kubernetes pods. In a manual deployment you will need to be able to reach the machines that host Camunda. Typically, the management port is on port 9600 but might differ on your setup and on the components. You can find the default for each component in their configuration page.

ComponentPort
Optimize8092
Orchestration Cluster9600

Examples for Kubernetes approaches

Port-forwarding allows you to temporarily bind a remote Kubernetes cluster port of a service or pod directly to your local machine, allowing you to interact with it via localhost:PORT.

Since the services are bound to your local machine, you cannot reuse the same port for all port-forwards unless you start and stop each one based on usage. To avoid this limitation, the examples use different local ports for each service, allowing them to run simultaneously without conflict.

export CAMUNDA_RELEASE_NAME="camunda"
# kubectl port-forward services/$SERVICE_NAME $LOCAL_PORT:$REMOTE_PORT
kubectl port-forward services/$CAMUNDA_RELEASE_NAME-zeebe-gateway 9600:9600 & \
kubectl port-forward services/$CAMUNDA_RELEASE_NAME-optimize 8092:8092 & \
kubectl port-forward services/$CAMUNDA_RELEASE_NAME-elasticsearch 9200:9200 &

Using the bash instruction & at the end of each line would run the command in a subshell allowing the use of a single terminal.

ContextPath

If you are defining the contextPath in the Camunda Helm chart or the management.server.servlet.context-path in a standalone setup, your API requests must prepend the value specific to the contextPath for the individual component. If the management.server.port is defined this also applies to management.endpoints.web.base-path. You can learn more about this behavior in the Spring Boot documentation.

Optimize Helm chart Exception

Setting the contextPath in the Helm chart for Optimize will not overwrite the contextPath of the management API, it will remain as /.

Example

If you are defining the contextPath for the Orchestration Cluster in the Camunda Helm chart:

orchestration:
contextPath: /example

A call to the management API of the Orchestration Cluster would look like the following example:

ORCHESTRATION_CLUSTER_MANAGEMENT_API=http://localhost:9600

curl $ORCHESTRATION_CLUSTER_MANAGEMENT_API/example/actuator/health

Without the contextPath it would just be:

ORCHESTRATION_CLUSTER_MANAGEMENT_API=http://localhost:9600

curl $ORCHESTRATION_CLUSTER_MANAGEMENT_API/actuator/health