Installation Guide
Deploy Align on your Kubernetes cluster.
Getting the Helm Chart
Option A: OCI Registry (Recommended)
Align publishes Helm charts to our ECR registry as OCI artifacts:
# Login to Align's ECR (credentials provided during onboarding)
aws ecr get-login-password --region eu-west-2 | \
helm registry login --username AWS --password-stdin \
869633161172.dkr.ecr.eu-west-2.amazonaws.com
# Pull the chart
helm pull oci://869633161172.dkr.ecr.eu-west-2.amazonaws.com/align/charts/align \
--version 0.8.0
# Or install directly
helm install align \
oci://869633161172.dkr.ecr.eu-west-2.amazonaws.com/align/charts/align \
--version 0.8.0 \
--namespace align \
--values values.yaml
Option B: Mirror to Your Registry (Recommended for Production)
For production deployments, we recommend mirroring all artifacts to your own registry. This provides:
- Reliability — No dependency on Align's infrastructure
- Security — Full control over what runs in your cluster
- Compliance — Artifacts scanned by your security tools
- Air-gap support — Works in isolated environments
Step 1: Mirror the Helm Chart
# Login to Align's ECR
aws ecr get-login-password --region eu-west-2 | \
helm registry login --username AWS --password-stdin \
869633161172.dkr.ecr.eu-west-2.amazonaws.com
# Pull the chart
helm pull oci://869633161172.dkr.ecr.eu-west-2.amazonaws.com/align/charts/align \
--version 1.0.0
# Push to your registry
helm push align-1.0.0.tgz oci://your-registry.example.com/align/charts
Step 2: Mirror Docker Images
All images for a release use the same version tag:
VERSION="v1.0.0"
SOURCE_REGISTRY="869633161172.dkr.ecr.eu-west-2.amazonaws.com/align"
TARGET_REGISTRY="your-registry.example.com/align"
IMAGES=(
"gateway"
"brain"
"ui"
"migrations"
"connector-slack"
"connector-github"
"connector-jira"
"connector-teams"
)
for image in "${IMAGES[@]}"; do
docker pull "${SOURCE_REGISTRY}/${image}:${VERSION}"
docker tag "${SOURCE_REGISTRY}/${image}:${VERSION}" "${TARGET_REGISTRY}/${image}:${VERSION}"
docker push "${TARGET_REGISTRY}/${image}:${VERSION}"
done
Step 3: Configure Helm to Use Your Registry
# values.yaml
global:
imageRegistry: your-registry.example.com/align
# Optional: if your registry requires auth
imagePullSecrets:
- name: your-registry-secret
Automating Mirror Updates
Create a CI job to mirror new releases:
# .github/workflows/mirror-align.yaml (example)
name: Mirror Align Release
on:
schedule:
- cron: '0 6 * * *' # Daily at 6 AM
workflow_dispatch:
inputs:
version:
description: 'Version to mirror (e.g., 1.0.0)'
required: true
jobs:
mirror:
runs-on: ubuntu-latest
steps:
- name: Mirror Align artifacts
run: |
# Your mirroring script here
Option C: Direct from GitHub (Development)
For testing or development:
git clone https://github.com/aligndottech/align-stack.git
helm install align ./align-stack/charts/align \
--namespace align \
--values values.yaml
Prerequisites
Before you begin, ensure you have:
- Kubernetes 1.25+ cluster
- Helm 3.10+
-
kubectlconfigured for your cluster - PostgreSQL 15+ database (RDS, Cloud SQL, or self-hosted)
- Ingress controller (Traefik, nginx, etc.)
- (Recommended) cert-manager for TLS
Step 1: Create Namespace
kubectl create namespace align
Step 2: Configure Database
Option A: Use Existing PostgreSQL (Recommended)
Create a secret with your database credentials:
kubectl create secret generic align-database \
--namespace align \
--from-literal=url="postgresql://user:password@host:5432/align" \
--from-literal=host="your-db-host.example.com" \
--from-literal=port="5432" \
--from-literal=username="align" \
--from-literal=password="your-secure-password"
Option B: Deploy PostgreSQL in Cluster
For development/testing, you can deploy PostgreSQL alongside Align:
# values.yaml
postgresql:
enabled: true
auth:
database: align
username: align
password: your-secure-password
In-cluster PostgreSQL is not recommended for production. Use a managed database service like RDS.
Step 3: Configure Secrets
Align requires several secrets for operation. See Secrets Management for detailed options.
Minimal Secrets
At minimum, create internal secrets:
kubectl create secret generic align-internal \
--namespace align \
--from-literal=jwt-secret="$(openssl rand -base64 32)" \
--from-literal=cookie-secret="$(openssl rand -base64 32)" \
--from-literal=encryption-key="$(openssl rand -base64 32)" \
--from-literal=service-auth-token="$(openssl rand -base64 32)"
LLM Secrets (Required for AI features)
kubectl create secret generic align-llm \
--namespace align \
--from-literal=openai-api-key="sk-..." \
# OR
--from-literal=anthropic-api-key="sk-ant-..."
Or see LLM Setup for self-hosted models.
Step 4: Create Values File
Create a values.yaml file for your deployment:
# values.yaml
global:
environment: production
# Database
database:
secretName: align-database
# Gateway
gateway:
replicaCount: 2
frontendUrl: "https://app.yourdomain.com"
ingress:
enabled: true
className: "nginx" # or "traefik"
hosts:
- host: api.yourdomain.com
paths:
- path: /
pathType: Prefix
tls:
- secretName: api-tls
hosts:
- api.yourdomain.com
# UI
ui:
replicaCount: 2
ingress:
enabled: true
className: "nginx"
hosts:
- host: app.yourdomain.com
paths:
- path: /
pathType: Prefix
tls:
- secretName: app-tls
hosts:
- app.yourdomain.com
# Brain (AI Service)
brain:
replicaCount: 2
# Connectors - disable unused ones
connectors:
slack:
enabled: true
teams:
enabled: true
jira:
enabled: true
github:
enabled: true
linear:
enabled: false # Enable if needed
# Secrets
secrets:
create: false # Use pre-created secrets
See Configuration Reference for all options.
Step 5: Install Align
From Your Mirrored Registry (Recommended)
helm install align \
oci://your-registry.example.com/align/charts/align \
--version 1.0.0 \
--namespace align \
--values values.yaml
From Align's Registry (Direct)
helm install align \
oci://869633161172.dkr.ecr.eu-west-2.amazonaws.com/align/charts/align \
--version 1.0.0 \
--namespace align \
--values values.yaml
Step 6: Verify Installation
# Check pods are running
kubectl get pods -n align
# Expected output:
# NAME READY STATUS RESTARTS AGE
# align-gateway-xxx 1/1 Running 0 2m
# align-brain-xxx 1/1 Running 0 2m
# align-ui-xxx 1/1 Running 0 2m
# align-connector-slack-xxx 1/1 Running 0 2m
# ...
# Check services
kubectl get svc -n align
# Check ingress
kubectl get ingress -n align
Step 7: Run Migrations
Migrations run automatically as a Helm pre-install hook. Verify they completed:
kubectl get jobs -n align
# Should show:
# NAME COMPLETIONS DURATION AGE
# align-migrations 1/1 30s 5m
Step 8: Access Align
- Ensure DNS is configured for your domains
- Navigate to
https://app.yourdomain.com - Sign in or create your first user
Troubleshooting
Pods not starting
# Check pod status
kubectl describe pod -n align <pod-name>
# Check logs
kubectl logs -n align <pod-name>
Database connection issues
# Verify secret exists
kubectl get secret align-database -n align
# Test connection from a pod
kubectl run -it --rm debug --image=postgres:15 \
--restart=Never -n align -- \
psql "postgresql://user:pass@host:5432/align"
Ingress not working
# Check ingress status
kubectl describe ingress -n align
# Verify TLS secret exists
kubectl get secret api-tls -n align
Next Steps
- Configure OAuth Apps for Slack, Teams, etc.
- Set up LLM for decision synthesis
- Configure secrets properly for production