Install app via SDR orchestrator Private Preview
Some capabilities shown here may require additional enablement or licensing. Contact your Atlan representative for details.
This guide walks you through the one-time setup of the SDR Orchestrator on a Linux VM. You download the SDR package, fill in your credentials and infrastructure config, start the orchestrator with Docker Compose (or Podman Compose), and verify the connection in the Atlan UI. For more information about the SDR Orchestrator, see SDR Orchestrator.
System requirements
- CPU
- SDR Orchestrator: 0.5 vCPU
- Per app: 0.5–1 vCPU (varies by app)
- Memory
- SDR Orchestrator: 256 MB
- Per app: 512 MB–1 GB (varies by app)
- Disk
- SDR Orchestrator: ~500 MB (SDR image)
- Per app: ~1–2 GB (image + artifacts)
- VM sizing guidance
- Size the VM based on the number of apps you plan to run by adding the SDR Orchestrator requirements and the per-app requirements. For example, a VM running the SDR Orchestrator + 3 apps requires at least 2 vCPUs, 4 GB RAM, and 20 GB disk.
Prerequisites
Setup takes 15–30 minutes. Gather credentials and storage details from your infrastructure team beforehand.
Before you begin, verify you have:
- Linux host (x86_64 or arm64)—Amazon EC2, on-premises VM, or bare metal. Windows and macOS aren't supported because the SDR requires a native Docker or Podman socket.
- Docker Engine 20.10+ with Docker Compose plugin, or Podman 4.0+ (rootless) with
podman-compose. See Docker Engine install or Podman installation guide. - A Docker Hub Personal Access Token (PAT) from your Atlan representative. Required to pull private app images (
atlanhq/*).- The PAT is regenerated periodically—contact Atlan representative for the latest token.
- An OAuth client ID and client secret from Atlan representative.
- The SDR Orchestrator uses these to authenticate with Atlan's Temporal service.
- Object storage: AWS S3, Google Cloud Storage, Azure Blob Storage, or local file path. See Dapr object store docs.
- Secret store: AWS Secrets Manager, Azure Key Vault, GCP Secret Manager, HashiCorp Vault, local file, or environment variables. See Dapr secret store docs.
- Outbound network connectivity (HTTPS + gRPC) to Atlan's Temporal endpoint, Docker Hub (or your private registry), and S3 for configurator artifacts and source-systems.
- Private image registry (optional)—If you replicate Atlan images to your own registry, it must maintain the same image tags and versioning as the Atlan Docker Hub repository. If the registry requires authentication, only basic auth (username/password) is supported.
Download SDR package
Download the SDR package from Atlan. This archive contains everything you need: docker-compose.yaml, .env, and config.yaml.
- Docker
- Podman
curl -fSL -o sdr-orchestrator-docker.tar.gz \
https://atlan-public.s3.eu-west-1.amazonaws.com/sdr-orchestrator-app/sdr-orchestrator-docker.tar.gz
tar -xzf sdr-orchestrator-docker.tar.gz
cd sdr-orchestrator-docker
curl -fSL -o sdr-orchestrator-podman.tar.gz \
https://atlan-public.s3.eu-west-1.amazonaws.com/sdr-orchestrator-app/sdr-orchestrator-podman.tar.gz
tar -xzf sdr-orchestrator-podman.tar.gz
cd sdr-orchestrator-podman
The extracted directory contains the following files:
sdr-orchestrator-docker/ # (or sdr-orchestrator-podman/)
├── docker-compose.yaml # Container definition (image tag pre-filled)
├── .env # Atlan credentials and runtime settings
├── config.yaml # Infrastructure config (domain, components)
└── deployments/ # Auto-populated per-app directories
Prepare host environment
Authenticate with Docker Hub so the SDR can pull private app images.
- Docker
- Podman
docker login -u atlanhq
# When prompted for password, enter the PAT provided by Atlan
A "Login Succeeded" message confirms successful authentication.
podman login -u atlanhq docker.io
# When prompted for password, enter the PAT provided by Atlan
A "Login Succeeded" message confirms successful authentication.
Configure .env file
Open .env and fill in the required values:
- Docker
- Podman
-
Find your Docker group ID:
getent group docker | cut -d: -f3Common values: 988 (Amazon Linux/RHEL), 999 (Ubuntu/Debian).
-
Set
DOCKER_GIDandSDR_DEPLOYMENTS_HOST_DIRin.envusing the values from the previous step and the output ofecho "$(pwd)/deployments":.env# OAuth credentials provisioned by Atlan for this SDR deployment.
ATLAN_AUTH_CLIENT_ID=oauth-client-xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
ATLAN_AUTH_CLIENT_SECRET=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
# Must match atlan.deployment_name in config.yaml.
SDR_DEPLOYMENT_NAME=my-env
# Docker group ID from step 1.
DOCKER_GID=988
# Absolute host path to the deployments directory (e.g. /home/ubuntu/sdr-orchestrator-docker/deployments).
SDR_DEPLOYMENTS_HOST_DIR=/home/ubuntu/sdr-orchestrator-docker/deployments
LOG_LEVEL=INFO
-
Enable lingering so containers keep running after SSH disconnect:
sudo loginctl enable-linger $(whoami) -
Enable the Podman socket:
systemctl --user enable --now podman.socket -
Verify the socket exists:
ls -la /run/user/$(id -u)/podman/podman.sock -
Set
SDR_DEPLOYMENTS_HOST_DIRin.envusing the output ofecho "$(pwd)/deployments", and adjustCONTAINER_RUNTIME_SOCKETif your uid isn't 1000:.env# OAuth credentials provisioned by Atlan for this SDR deployment.
ATLAN_AUTH_CLIENT_ID=oauth-client-xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
ATLAN_AUTH_CLIENT_SECRET=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
# Must match atlan.deployment_name in config.yaml.
SDR_DEPLOYMENT_NAME=my-env
# Path to the rootless Podman socket. Adjust uid if your user is not 1000.
CONTAINER_RUNTIME_SOCKET=unix:///run/user/1000/podman/podman.sock
# Absolute host path to the deployments directory (e.g. /home/ubuntu/sdr-orchestrator-podman/deployments).
SDR_DEPLOYMENTS_HOST_DIR=/home/ubuntu/sdr-orchestrator-podman/deployments
LOG_LEVEL=INFO
Prepare config.yaml file
Open config.yaml and fill in your infrastructure settings. The file has four sections: Atlan (your tenant domain and deployment name), object storage (where apps transfer data), secret store (where apps retrieve secrets at runtime), and container registry (how to pull private app images).
Atlan identity
- deployment_name: A unique identifier for this SDR installation (for example,
mycompany-ec2). Letters, numbers, hyphens, and underscores only. Must start and end with a letter or number. Must matchSDR_DEPLOYMENT_NAMEin.env. - domain: Your Atlan tenant domain (for example,
mycompany.atlan.com). Don't includehttps://.
atlan:
deployment_name: "mycompany-ec2"
domain: "mycompany.atlan.com"
Object storage
Self-Deployed Runtime needs a store for reading or writing files. Configure the object storage under the components: section that matches your environment.
Dapr supports additional object stores which aren't mentioned below. For more information, see Dapr object store documentation for other configurations.
- AWS S3
- Google Cloud Storage
- Azure Blob Storage
- Local file path
Add AWS S3 configuration. For more information, see AWS S3 Binding Spec.
components:
objectstore:
type: bindings.aws.s3
version: v1
metadata:
- name: accessKey #optional, leave this empty for IAM authentication
value: ""
- name: secretKey #optional, leave this empty for IAM authentication
value: ""
- name: bucket #required, name of the bucket where application can write
value: "<bucket-name>"
- name: region #required, region of the bucket where application can write
value: "<bucket-region>"
- name: forcePathStyle
value: "true"
Add Google Cloud Storage configuration. For more information, see GCP Storage Bucket binding spec.
components:
objectstore:
type: bindings.gcp.bucket
version: v1
metadata:
- name: bucket
value: "<your-gcs-bucket-name>"
- name: type
value: "service_account"
- name: project_id
value: "<your-gcp-project-id>"
Add Azure Blob Storage configuration. For more information, see Azure Blob Storage binding spec.
components:
objectstore:
type: bindings.azure.blobstorage
version: v1
metadata:
- name: accountName
value: "<your-storage-account-name>"
- name: accountKey
value: "<your-storage-account-key>"
- name: containerName
value: "<your-container-name>"
Add local file path configuration for volume mounts.
components:
objectstore:
type: bindings.localstorage
version: v1
metadata:
- name: rootPath
value: "/data/storage"
Secret store
Self-Deployed Runtime fetches secrets from a secret store to connect to the source systems. Configure the secret store under the same components: section that aligns with your security infrastructure.
Dapr supports additional secret stores which aren't mentioned below. For more information, see Dapr secret store documentation for other configurations.
- AWS Secrets Manager
- Azure Key Vault
- GCP Secret Manager
- HashiCorp Vault
- Local file
- Environment variables
Add AWS Secrets Manager configuration. For more information, see AWS Secrets Manager.
components:
secretstore:
type: secretstores.aws.secretmanager
version: v1
metadata:
- name: region #required, region in which secret is hosted
value: "<secret-region>"
# Needed if IAM authentication is not used
- name: accessKey
value: ""
- name: secretKey
value: ""
Add Azure Key Vault configuration. For more information, see Azure Key Vault secret store.
components:
secretstore:
type: secretstores.azure.keyvault
version: v1
metadata:
- name: vaultName
value: "<your-keyvault-name>"
- name: azureTenantId
value: "<your-tenant-id>"
- name: azureClientId
value: "<your-client-id>"
- name: azureClientSecret
value: "<your-client-secret>"
- name: azureEnvironment
value: "AZUREPUBLICCLOUD" # Optional: AZUREPUBLICCLOUD, AZURECHINACLOUD, AZUREUSGOVERNMENTCLOUD, AZUREGERMANCLOUD
Azure Key Vault supports multiple authentication methods:
- Client Secret: Use
azureClientSecretwith tenant ID and client ID - Certificate: Use
azureCertificateFileinstead of client secret - Managed Identity: Omit authentication fields and use Azure managed identity
For detailed authentication setup, see the Authenticating to Azure documentation.
Add Google Cloud Secret Manager configuration. For more information, see GCP Secret Manager.
components:
secretstore:
type: secretstores.gcp.secretmanager
version: v1
metadata:
- name: type
value: "service_account"
- name: project_id
value: "<project-id>"
- name: private_key_id
value: "<private-key-id>"
- name: private_key
value: "<private-key>"
- name: client_email
value: "<client-email>"
- name: client_id
value: "<client-id>"
- name: auth_uri
value: "https://accounts.google.com/o/oauth2/auth"
- name: token_uri
value: "https://oauth2.googleapis.com/token"
- name: auth_provider_x509_cert_url
value: "https://www.googleapis.com/oauth2/v1/certs"
- name: client_x509_cert_url
value: "https://www.googleapis.com/robot/v1/metadata/x509/<client-email>"
Add HashiCorp Vault configuration. For more information, see HashiCorp Vault.
components:
secretstore:
type: secretstores.hashicorp.vault
version: v1
metadata:
- name: vaultAddr
value: "[vault_address]" # Optional. Default: "https://127.0.0.1:8200"
- name: caCert # Optional. This or caPath or caPem
value: "[ca_cert]"
- name: caPath # Optional. This or CaCert or caPem
value: "[path_to_ca_cert_file]"
- name: caPem # Optional. This or CaCert or CaPath
value: "[encoded_ca_cert_pem]"
- name: skipVerify # Optional. Default: false
value: "[skip_tls_verification]"
- name: tlsServerName # Optional.
value: "[tls_config_server_name]"
- name: vaultTokenMountPath # Required if vaultToken not provided. Path to token file.
value: "[path_to_file_containing_token]"
- name: vaultToken # Required if vaultTokenMountPath not provided. Token value.
value: "[vault_token]"
- name: vaultKVPrefix # Optional. Default: "dapr"
value: "[vault_prefix]"
- name: vaultKVUsePrefix # Optional. default: "true"
value: "[true/false]"
- name: enginePath # Optional. default: "secret"
value: "secret"
- name: vaultValueType # Optional. default: "map"
value: "map"
Add local file secret store configuration. For more information, see Local file secret store.
components:
secretstore:
type: secretstores.local.file
version: v1
metadata:
- name: secretsFile
value: "<path-to-secrets-file>"
- name: nestedSeparator
value: ":"
- name: multiValued
value: "false"
Create a JSON file at the specified path containing your secrets in key-value format. Set appropriate file permissions and secure the file.
Add local environment variables as the secret store. For more information, see Local Environment Variables.
components:
secretstore:
type: secretstores.local.env
version: v1
Container registry
App images on Docker Hub (atlanhq/*) are private. The SDR needs credentials to pull them when deploying apps.
For security reasons, the Docker Hub PAT is regenerated on a periodic basis. If the token is embedded in automation scripts or CI/CD pipelines, those jobs may fail. Contact your Atlan representative for the latest token.
- Docker Hub (default)
- Private registry (replicated)
- base: The Docker Hub image prefix. Use
docker.io/atlanhqfor Docker Hub (default). - username: Your Docker Hub username.
- password: The Docker Hub PAT provided by Atlan representative.
container_registry:
base: "docker.io/atlanhq"
username: "<your-dockerhub-username>"
password: "<your-dockerhub-pat>"
If you replicate Atlan images to your own registry, set base to rewrite image references. For example, atlanhq/monte-carlo:1.2.3 becomes <your-registry-host>/atlan/monte-carlo:1.2.3.
- base: Your private registry prefix (for example,
registry.mycompany.com/atlan). - username: Your private registry username.
- password: Your private registry token.
container_registry:
base: "<your-registry-host>/atlan"
username: "<your-registry-username>"
password: "<your-registry-token>"
To replicate images to your private registry:
# Pull the required app image (requires Docker Hub PAT from Atlan)
docker pull atlanhq/atlan-saperp-app:latest
# Tag and push to your enterprise registry
docker tag atlanhq/atlan-saperp-app:latest registry.mycompany.com/atlan/atlan-saperp-app:latest
docker push registry.mycompany.com/atlan/atlan-saperp-app:latest
Sample config.yaml files
Below are complete, copy-paste-ready config.yaml files for common infrastructure combinations. Replace placeholder values with your actual credentials.
- AWS
- GCP
- Azure
- AWS + private registry
- On-premises
atlan:
deployment_name: "mycompany-ec2"
domain: "mycompany.atlan.com"
components:
objectstore:
type: bindings.aws.s3
version: v1
metadata:
- name: accessKey #optional, leave this empty for IAM authentication
value: ""
- name: secretKey #optional, leave this empty for IAM authentication
value: ""
- name: bucket
value: "<your-bucket-name>"
- name: region
value: "us-east-1"
- name: forcePathStyle
value: "true"
secretstore:
type: secretstores.aws.secretmanager
version: v1
metadata:
- name: region
value: "<secret-region>"
- name: accessKey
value: ""
- name: secretKey
value: ""
container_registry:
base: "docker.io/atlanhq"
username: "<your-dockerhub-username>"
password: "<your-dockerhub-pat>"
atlan:
deployment_name: "mycompany-gce"
domain: "mycompany.atlan.com"
components:
objectstore:
type: bindings.gcp.bucket
version: v1
metadata:
- name: bucket
value: "<your-gcs-bucket-name>"
- name: type
value: "service_account"
- name: project_id
value: "<your-gcp-project-id>"
secretstore:
type: secretstores.gcp.secretmanager
version: v1
metadata:
- name: type
value: "service_account"
- name: project_id
value: "<your-gcp-project-id>"
- name: private_key_id
value: "<private-key-id>"
- name: private_key
value: "<private-key>"
- name: client_email
value: "<client-email>"
- name: client_id
value: "<client-id>"
- name: auth_uri
value: "https://accounts.google.com/o/oauth2/auth"
- name: token_uri
value: "https://oauth2.googleapis.com/token"
- name: auth_provider_x509_cert_url
value: "https://www.googleapis.com/oauth2/v1/certs"
- name: client_x509_cert_url
value: "https://www.googleapis.com/robot/v1/metadata/x509/<client-email>"
container_registry:
base: "docker.io/atlanhq"
username: "<your-dockerhub-username>"
password: "<your-dockerhub-pat>"
atlan:
deployment_name: "mycompany-azure"
domain: "mycompany.atlan.com"
components:
objectstore:
type: bindings.azure.blobstorage
version: v1
metadata:
- name: accountName
value: "<your-storage-account-name>"
- name: accountKey
value: "<your-storage-account-key>"
- name: containerName
value: "<your-container-name>"
secretstore:
type: secretstores.azure.keyvault
version: v1
metadata:
- name: vaultName
value: "<your-keyvault-name>"
- name: azureTenantId
value: "<your-tenant-id>"
- name: azureClientId
value: "<your-client-id>"
- name: azureClientSecret
value: "<your-client-secret>"
container_registry:
base: "docker.io/atlanhq"
username: "<your-dockerhub-username>"
password: "<your-dockerhub-pat>"
atlan:
deployment_name: "mycompany-ec2"
domain: "mycompany.atlan.com"
components:
objectstore:
type: bindings.aws.s3
version: v1
metadata:
- name: bucket
value: "<your-bucket-name>"
- name: region
value: "us-east-1"
- name: forcePathStyle
value: "true"
secretstore:
type: secretstores.aws.secretmanager
version: v1
metadata:
- name: region
value: "us-east-1"
container_registry:
base: "<your-registry-host>/atlan"
username: "<your-registry-username>"
password: "<your-registry-token>"
atlan:
deployment_name: "mycompany-onprem"
domain: "mycompany.atlan.com"
components:
objectstore:
type: bindings.localstorage
version: v1
metadata:
- name: rootPath
value: "/data/storage"
secretstore:
type: secretstores.local.env
version: v1
container_registry:
base: "docker.io/atlanhq"
username: "<your-dockerhub-username>"
password: "<your-dockerhub-pat>"
Start SDR orchestrator
- Docker
- Podman
docker compose up -d
podman compose up -d
Verify installation
After starting the SDR:
- Docker
- Podman
-
Check container is running:
docker ps | grep atlan-sdr -
Check logs: Look for "SDR worker listening on task_queue" which confirms Temporal connectivity:
docker logs atlan-sdr-<deployment-name> -
Verify in Atlan UI: Go to Settings > Self-Deployed Runtimes. Your deployment appears as "Connected."
-
Install apps: From the Atlan UI, select apps to deploy to this SDR. The SDR automatically provisions OAuth credentials, runs the configurator, starts the app container, and notifies Atlan on success.
-
Check container is running:
podman ps | grep atlan-sdr -
Check logs: Look for "SDR worker listening on task_queue" which confirms Temporal connectivity:
podman logs atlan-sdr-<deployment-name> -
Verify in Atlan UI: Go to Settings > Self-Deployed Runtimes. Your deployment appears as "Connected."
-
Install apps: From the Atlan UI, select apps to deploy to this SDR. The SDR automatically provisions OAuth credentials, runs the configurator, starts the app container, and notifies Atlan on success.
Need help
If you see "permission denied," "Disconnected" in the Atlan UI, or image pull failures, see the SDR Orchestrator FAQ for troubleshooting steps.
Next steps
Once the SDR shows as Connected in Atlan UI:
- Navigate to the Marketplace and pick an app (for example, SAP ERP connector).
- Click Install and select your SDR as the deployment target.
- The SDR handles everything from there—provisioning credentials, running the configurator, starting the app container, and reporting success back to Atlan. No terminal commands needed.
See also
- SDR Orchestrator: Components, communication model, and how container management works.
- SDR Orchestrator FAQ: Troubleshooting, monitoring, VM state, and backup guidance.
- Configure network security: Firewall rules for outbound-only communication.
- Configure workflow execution: Set up workflow execution with secret retrieval.