> ## Documentation Index
> Fetch the complete documentation index at: https://docs.tesslate.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Deployment

> Overview of the three production paths for OpenSail: Docker Compose, Kubernetes on Minikube, and AWS EKS with Terraform

<img src="https://mintcdn.com/tesslate/VT6tbZolrCfpx26M/images/opensail-banner.png?fit=max&auto=format&n=VT6tbZolrCfpx26M&q=85&s=66579c47537b3464fb65b229cc9ab0fd" alt="Tesslate OpenSail" width="4712" height="1612" data-path="images/opensail-banner.png" />

## Overview

OpenSail has three supported deployment paths. This page summarizes what each path is good for and links to the detailed walkthroughs. For the install-path decision matrix, see the [self-hosting quickstart](/self-hosting/quickstart).

<Info>
  Prefer a managed service? [tesslate.com](https://tesslate.com) runs OpenSail for you with zero setup.
</Info>

## Pick your path

<CardGroup cols={3}>
  <Card title="Docker Compose" icon="docker" href="/guides/docker-setup">
    Single-server install with Postgres, Redis, Traefik, the orchestrator, and the app in Compose. Best for dev laptops and single-VM deployments.
  </Card>

  <Card title="Kubernetes (Minikube)" icon="cube" href="/guides/kubernetes-local">
    Full Kubernetes pipeline on your own machine: per-project namespaces, btrfs CSI, Volume Hub, snapshots. The staging ground before production.
  </Card>

  <Card title="AWS EKS" icon="cloud" href="/guides/aws-production">
    Production deployment via Terraform. EKS, ECR, managed Postgres, S3-backed CAS, wildcard TLS, and Cloudflare DNS.
  </Card>
</CardGroup>

## What each path gives you

| Capability                        |       Docker      |  Minikube  |          AWS EKS          |
| --------------------------------- | :---------------: | :--------: | :-----------------------: |
| Orchestrator + agent + app        |        Yes        |     Yes    |            Yes            |
| Postgres                          |     In-cluster    | In-cluster |            RDS            |
| Redis                             |     In-cluster    | In-cluster |        ElastiCache        |
| LiteLLM gateway                   | External or local |  External  |          External         |
| Per-project namespaces            |         No        |     Yes    |            Yes            |
| NetworkPolicy isolation           |         No        |     Yes    |            Yes            |
| btrfs CSI + Volume Hub            |         No        |     Yes    |            Yes            |
| CAS bundles on S3                 |         No        |    MinIO   |             S3            |
| Snapshot timeline (5 per project) |         No        |     Yes    |            Yes            |
| Hibernation with restore          |         No        |     Yes    |            Yes            |
| Wildcard TLS                      |    Traefik + LE   |  HTTP only | cert-manager + Cloudflare |
| Horizontal scaling                |         No        |  Demo only |            Yes            |

## Overview of each path

<Tabs>
  <Tab title="Docker Compose">
    The Compose stack brings up every service on a single host:

    | Service          | Purpose                                             |
    | ---------------- | --------------------------------------------------- |
    | `orchestrator`   | FastAPI backend                                     |
    | `frontend` (dev) | Vite + React                                        |
    | `postgres`       | Database                                            |
    | `redis`          | Task queue + pub/sub                                |
    | `traefik`        | `*.localhost` routing (dev) or Let's Encrypt (prod) |
    | `worker`         | ARQ agent worker                                    |

    `DEPLOYMENT_MODE=docker` selects `DockerComposeOrchestrator`, which provisions per-project containers from `.tesslate/config.json` and wires them into the Traefik network.

    Start here: [Docker setup guide](/guides/docker-setup).
  </Tab>

  <Tab title="Kubernetes (Minikube)">
    Minikube mirrors the production stack end to end so you can validate the K8s path without cloud cost.

    | Component              | Source                           |
    | ---------------------- | -------------------------------- |
    | Base manifests         | `k8s/base/`                      |
    | Minikube overlay       | `k8s/overlays/minikube/`         |
    | btrfs CSI + Volume Hub | `services/btrfs-csi/`            |
    | Namespaces             | one per project (`proj-{uuid}`)  |
    | Storage                | `tesslate-btrfs` StorageClass    |
    | Snapshots              | `tesslate-btrfs-snapshots` class |

    Apply with `kubectl apply -k k8s/overlays/minikube` then pair env with `k8s/.env.minikube`. Everything runs HTTP.

    Start here: [Kubernetes on Minikube](/guides/kubernetes-local).
  </Tab>

  <Tab title="AWS EKS (production)">
    Terraform provisions the platform and environment stacks under `k8s/terraform/aws/` and `k8s/terraform/shared/`. Kustomize applies to the resulting EKS cluster.

    | Layer        | Resource                                                                              |
    | ------------ | ------------------------------------------------------------------------------------- |
    | Networking   | VPC, private subnets, NAT, VPN                                                        |
    | Cluster      | EKS 1.29 with managed nodegroups (btrfs-capable)                                      |
    | Registry     | ECR for `tesslate-orchestrator`, `tesslate-frontend`, `tesslate-devserver`            |
    | Database     | RDS Postgres                                                                          |
    | Cache        | ElastiCache Redis                                                                     |
    | Object store | S3 bucket for CAS + snapshots                                                         |
    | Ingress      | NGINX Ingress + cert-manager + Cloudflare DNS                                         |
    | Secrets      | AWS-managed; auto-mounted via `envFrom` in `k8s/overlays/aws-base/backend-patch.yaml` |

    Start here: [AWS production deployment](/guides/aws-production).
  </Tab>
</Tabs>

## Shared operational surface

Regardless of path:

* The orchestrator reads config from environment variables. See [Configuration](/self-hosting/configuration) for the full reference.
* Agents run via the `tesslate-agent` package (`packages/tesslate-agent/`), either inline (desktop, Docker) or under an ARQ worker (K8s).
* Project volumes are provisioned through `orchestrator/app/services/volume_manager.py`, which talks to the Volume Hub on Kubernetes or the local filesystem on Docker and desktop.
* Authentication and RBAC are consistent across paths. See [Authentication](/authentication).

## Next steps

<CardGroup cols={2}>
  <Card title="Docker setup" icon="docker" href="/guides/docker-setup">
    Fastest path to a running OpenSail.
  </Card>

  <Card title="Kubernetes on Minikube" icon="cube" href="/guides/kubernetes-local">
    Full K8s locally to validate the production path.
  </Card>

  <Card title="AWS production" icon="cloud" href="/guides/aws-production">
    Terraform, EKS, RDS, S3, wildcard TLS.
  </Card>

  <Card title="Configuration" icon="gear" href="/self-hosting/configuration">
    Env variable reference.
  </Card>
</CardGroup>
