Skip to main content
This guide describes deploying KaireonAI into your own AWS account — an Enterprise self-managed deployment under a commercial license. Container images are provisioned as part of an Enterprise agreement. If you would rather we run it for you, use the fully hosted Cloud plan or a Dedicated single-tenant instance — see Deployment options.
This guide covers deploying KaireonAI using a managed cloud stack in your own account — no servers to maintain, automatic scaling, and managed databases.

Architecture

Production Stack

Step-by-Step Setup

1

Create a Supabase project

  1. Go to supabase.com and create a new project
  2. Choose a region close to your App Runner deployment
  3. Copy the Connection string (Settings → Database → URI)
  4. The format is: postgresql://postgres.[ref]:[password]@aws-0-[region].pooler.supabase.com:6543/postgres
Use the Session mode connection string (port 5432), not the pooler (port 6543), for Prisma migrations. App Runner can use either.
2

Create an Upstash Redis database

  1. Go to upstash.com and create a new Redis database
  2. Choose the same region as your Supabase project
  3. Copy the Redis URL (starts with rediss://)
  4. Upstash provides TLS by default — the rediss:// protocol handles encryption
3

Push Docker image to ECR

4

Create App Runner service

  1. Go to the AWS App Runner console
  2. Choose Container registry → Amazon ECR as the source
  3. Select the kaireon-api repository and latest tag
  4. Configure:
    • CPU: 1 vCPU (or 2 for production)
    • Memory: 2 GB (or 4 for production)
    • Port: 3000
  5. Add environment variables:
5

Initialize the database

Run migrations against your Supabase database from your local machine:
Run prisma db push only against a fresh, empty database. It drops any table not defined in schema.prisma — including the ds_* customer-schema tables and _flow_* pipeline staging tables created at runtime — which means data loss on a populated database. For an existing deployment, evolve the schema by applying the numbered files in prisma/manual-sql/ with psql instead. Supabase requires SSL, so append ?sslmode=require to the DATABASE_URL when running psql.
Then seed the admin user:
6

Configure custom domain (optional)

  1. In App Runner, go to Custom domains and add your domain
  2. Create a CNAME record in Route 53 pointing to the App Runner URL
  3. App Runner automatically provisions and renews TLS certificates

Updating

To deploy a new version:
App Runner automatically redeploys when you push a new image (if auto-deployment is enabled), or you can trigger a manual deployment from the console.

Monitoring

  • App Runner logs — Available in the App Runner console or CloudWatch
  • Supabase dashboard — Monitor database connections, query performance, and storage
  • Upstash dashboard — Monitor Redis commands, memory usage, and latency

Required Environment Variables (Production)

In addition to the core variables shown above, production deployments on App Runner should include these security-related variables. The platform validates them at startup and will refuse to start if they are missing:
See the full environment variable reference for all available configuration.

Troubleshooting

ECR login tokens expire after 12 hours. Re-authenticate before pushing:
If using CI/CD, ensure your pipeline refreshes the token on each run.
App Runner expects the application to respond on the configured port within 120 seconds. Common causes:
  • Missing environment variables — The platform validates DATABASE_URL and production secrets at startup. Check the App Runner logs in CloudWatch for [env-validation] Missing required environment variables.
  • Insufficient memory — The Next.js build requires at least 2 GB. For production, allocate 4 GB.
  • Database unreachable — Ensure the Supabase connection string uses the direct connection (port 5432), not the pooler, and that the App Runner VPC can reach the database.
Supabase databases may require SSL. Ensure your DATABASE_URL includes ?sslmode=require if connecting from App Runner:
Also verify the connection string uses the correct port (5432 for session mode, 6543 for transaction pooler).
App Runner deployments can take 5-10 minutes. If stuck beyond 15 minutes, check CloudWatch logs for the service. You may need to cancel the deployment and redeploy. Common causes include oversized Docker images (keep under 1 GB) and slow health checks.

Next Steps

Kubernetes Deployment

Self-host on any Kubernetes cluster with Helm.

Operations

Set up monitoring, metrics, and alerting.