{
  "slug": "install/kubernetes",
  "title": "Install on Kubernetes",
  "description": "Deploy Cuitty to a Kubernetes cluster using the Helm chart, suitable for production workloads.",
  "url": "https://cuitty.com/docs/install/kubernetes",
  "markdown_url": "https://cuitty.com/docs/install/kubernetes.md",
  "json_url": "https://cuitty.com/docs/install/kubernetes.json",
  "frontmatter": {
    "title": "Install on Kubernetes",
    "description": "Deploy Cuitty to a Kubernetes cluster using the Helm chart, suitable for production workloads.",
    "order": 2,
    "section": "Install",
    "updatedAt": "2026-04-27"
  },
  "headings": [
    {
      "depth": 1,
      "slug": "install-on-kubernetes",
      "text": "Install on Kubernetes"
    },
    {
      "depth": 2,
      "slug": "prerequisites",
      "text": "Prerequisites"
    },
    {
      "depth": 2,
      "slug": "install-the-chart",
      "text": "Install the chart"
    },
    {
      "depth": 2,
      "slug": "values",
      "text": "Values"
    },
    {
      "depth": 2,
      "slug": "upgrades",
      "text": "Upgrades"
    }
  ],
  "body_markdown": "# Install on Kubernetes\n\nThe official Helm chart deploys Cuitty as a stateful application backed by an external Postgres and an in-cluster SpiceDB.\n\n## Prerequisites\n\n- Kubernetes 1.27 or newer\n- Helm 3.13 or newer\n- An external Postgres 15+ (RDS, Cloud SQL, or self-managed)\n- A persistent volume class for libSQL data\n\n## Install the chart\n\n```bash\nhelm repo add cuitty https://charts.cuitty.com\nhelm repo update\n\nhelm install cuitty cuitty/cuitty \\\n  --namespace cuitty --create-namespace \\\n  --set postgres.url=postgres://cuitty@db.example.com/cuitty \\\n  --set auth.secretRef=cuitty-secrets\n```\n\nThe chart provisions:\n\n- `Deployment` for the portal (3 replicas by default)\n- `StatefulSet` for SpiceDB\n- `PersistentVolumeClaim` for libSQL data\n- `Service` and optional `Ingress`\n- `NetworkPolicy` restricting egress to allowlisted destinations\n\n## Values\n\n| Key                         | Default       | Notes                                                         |\n| --------------------------- | ------------- | ------------------------------------------------------------- |\n| `replicaCount`              | `3`           | Portal HTTP replicas.                                         |\n| `postgres.url`              | required      | Postgres DSN. Use a `Secret` and `valueFrom` in production.   |\n| `spicedb.replicaCount`      | `2`           | SpiceDB replicas. Increase for higher RBAC throughput.        |\n| `libsql.storage.size`       | `20Gi`        | Per-module event storage.                                     |\n| `ingress.enabled`           | `false`       | Enable to expose `/` via your ingress controller.             |\n| `image.tag`                 | chart version | Pin to a specific portal tag in production.                   |\n\n## Upgrades\n\nHelm runs database migrations as a `Job` before swapping the new pod template. A failed migration aborts the upgrade with the previous version still serving.\n\n```bash\nhelm upgrade cuitty cuitty/cuitty --version 0.4.0\n```",
  "body_html": "<h1 id=\"install-on-kubernetes\">Install on Kubernetes</h1>\n<p>The official Helm chart deploys Cuitty as a stateful application backed by an external Postgres and an in-cluster SpiceDB.</p>\n<h2 id=\"prerequisites\">Prerequisites</h2>\n<ul>\n<li>Kubernetes 1.27 or newer</li>\n<li>Helm 3.13 or newer</li>\n<li>An external Postgres 15+ (RDS, Cloud SQL, or self-managed)</li>\n<li>A persistent volume class for libSQL data</li>\n</ul>\n<h2 id=\"install-the-chart\">Install the chart</h2>\n<pre class=\"astro-code github-dark\" style=\"background-color:#24292e;color:#e1e4e8; overflow-x: auto;\" tabindex=\"0\" data-language=\"bash\"><code><span class=\"line\"><span style=\"color:#B392F0\">helm</span><span style=\"color:#9ECBFF\"> repo</span><span style=\"color:#9ECBFF\"> add</span><span style=\"color:#9ECBFF\"> cuitty</span><span style=\"color:#9ECBFF\"> https://charts.cuitty.com</span></span>\n<span class=\"line\"><span style=\"color:#B392F0\">helm</span><span style=\"color:#9ECBFF\"> repo</span><span style=\"color:#9ECBFF\"> update</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#B392F0\">helm</span><span style=\"color:#9ECBFF\"> install</span><span style=\"color:#9ECBFF\"> cuitty</span><span style=\"color:#9ECBFF\"> cuitty/cuitty</span><span style=\"color:#79B8FF\"> \\</span></span>\n<span class=\"line\"><span style=\"color:#79B8FF\">  --namespace</span><span style=\"color:#9ECBFF\"> cuitty</span><span style=\"color:#79B8FF\"> --create-namespace</span><span style=\"color:#79B8FF\"> \\</span></span>\n<span class=\"line\"><span style=\"color:#79B8FF\">  --set</span><span style=\"color:#9ECBFF\"> postgres.url=postgres://cuitty@db.example.com/cuitty</span><span style=\"color:#79B8FF\"> \\</span></span>\n<span class=\"line\"><span style=\"color:#79B8FF\">  --set</span><span style=\"color:#9ECBFF\"> auth.secretRef=cuitty-secrets</span></span></code></pre>\n<p>The chart provisions:</p>\n<ul>\n<li><code>Deployment</code> for the portal (3 replicas by default)</li>\n<li><code>StatefulSet</code> for SpiceDB</li>\n<li><code>PersistentVolumeClaim</code> for libSQL data</li>\n<li><code>Service</code> and optional <code>Ingress</code></li>\n<li><code>NetworkPolicy</code> restricting egress to allowlisted destinations</li>\n</ul>\n<h2 id=\"values\">Values</h2>\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n<table><thead><tr><th>Key</th><th>Default</th><th>Notes</th></tr></thead><tbody><tr><td><code>replicaCount</code></td><td><code>3</code></td><td>Portal HTTP replicas.</td></tr><tr><td><code>postgres.url</code></td><td>required</td><td>Postgres DSN. Use a <code>Secret</code> and <code>valueFrom</code> in production.</td></tr><tr><td><code>spicedb.replicaCount</code></td><td><code>2</code></td><td>SpiceDB replicas. Increase for higher RBAC throughput.</td></tr><tr><td><code>libsql.storage.size</code></td><td><code>20Gi</code></td><td>Per-module event storage.</td></tr><tr><td><code>ingress.enabled</code></td><td><code>false</code></td><td>Enable to expose <code>/</code> via your ingress controller.</td></tr><tr><td><code>image.tag</code></td><td>chart version</td><td>Pin to a specific portal tag in production.</td></tr></tbody></table>\n<h2 id=\"upgrades\">Upgrades</h2>\n<p>Helm runs database migrations as a <code>Job</code> before swapping the new pod template. A failed migration aborts the upgrade with the previous version still serving.</p>\n<pre class=\"astro-code github-dark\" style=\"background-color:#24292e;color:#e1e4e8; overflow-x: auto;\" tabindex=\"0\" data-language=\"bash\"><code><span class=\"line\"><span style=\"color:#B392F0\">helm</span><span style=\"color:#9ECBFF\"> upgrade</span><span style=\"color:#9ECBFF\"> cuitty</span><span style=\"color:#9ECBFF\"> cuitty/cuitty</span><span style=\"color:#79B8FF\"> --version</span><span style=\"color:#79B8FF\"> 0.4.0</span></span></code></pre>",
  "links_out": []
}