> For the complete documentation index, see [llms.txt](https://docs.testvibe.com/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.testvibe.com/self-hosting.md).

# Self-Hosting

Self-hosting runs the **whole TestVibe application** on infrastructure you control: the app, its database, object storage, and the test/generation engines all live inside your network. Nothing about your projects, tests, or results leaves your environment.

It is delivered as a **Docker bundle** — a versioned release containing a `docker-compose` stack and an `.env` template — so a single `docker compose up` brings up a complete, private TestVibe.

## Cloud, Private Runner, or Self-Hosted?

These three are easy to confuse. They sit on a spectrum of *how much you host*:

|                                                       | What you host         | Where your data lives                                         | Use it when                                                                                  |
| ----------------------------------------------------- | --------------------- | ------------------------------------------------------------- | -------------------------------------------------------------------------------------------- |
| **Cloud (SaaS)**                                      | Nothing               | TestVibe's cloud                                              | The default. Your site is reachable from the internet and you don't need to host anything.   |
| [**Private runner**](/runners/self-hosted-runners.md) | Just the runner image | TestVibe's cloud (the app), your network (the test execution) | You use the hosted app but the *app under test* must never leave your network.               |
| **Self-hosted** (this section)                        | The entire stack      | Entirely your infrastructure                                  | The whole product must run on-prem — air-gapped, data-residency, or compliance requirements. |

{% hint style="info" %}
A **private runner** is a feature of the cloud SaaS — you still sign in to TestVibe's hosted app. **Self-hosting** is the opposite: you run the app itself. If you only need test execution to stay inside your network, a private runner or a [tunnel](/account-settings/tunnel-devices.md) is far less to operate.
{% endhint %}

## The Stack At A Glance

The bundle runs a handful of containers that together make a complete TestVibe:

| Service        | Role                                                                                                            |
| -------------- | --------------------------------------------------------------------------------------------------------------- |
| **web**        | The TestVibe app (Wisej/.NET) — what users open in the browser.                                                 |
| **postgres**   | The application database.                                                                                       |
| **migrate**    | A one-shot job that applies the database schema, then exits. See [How It Works](/self-hosting/how-it-works.md). |
| **blobserver** | Object storage for artifacts and run bundles (the on-prem replacement for cloud blob storage).                  |
| **runner**     | Executes your Playwright **test runs**.                                                                         |
| **browser**    | A browser host the app drives for **AI feature generation** and the assistant.                                  |

Data persists in named volumes, so it survives restarts and upgrades. The full picture is in [How It Works](/self-hosting/how-it-works.md).

## What You Can Do

<table data-view="cards"><thead><tr><th></th><th></th><th data-hidden data-card-target data-type="content-ref"></th></tr></thead><tbody><tr><td><strong>Understand the stack</strong></td><td>See the containers, how they fit together, and the startup order.</td><td><a href="/pages/PZKaHEzX9W4eFhp7we5f">/pages/PZKaHEzX9W4eFhp7we5f</a></td></tr><tr><td><strong>Install TestVibe</strong></td><td>Prerequisites, quick start, data persistence, and upgrades.</td><td><a href="/pages/NisH8iE6FMxHXZBkRsYg">/pages/NisH8iE6FMxHXZBkRsYg</a></td></tr><tr><td><strong>Configure the instance</strong></td><td>The environment-only config model, required values, and optional integrations.</td><td><a href="/pages/p3xbi8bX9MqHcBJC0SNa">/pages/p3xbi8bX9MqHcBJC0SNa</a></td></tr><tr><td><strong>Set up AI</strong></td><td>Use hosted Claude/OpenAI keys or bring your own local model.</td><td><a href="/pages/Wc2yLkFHN91wnPApAXsV">/pages/Wc2yLkFHN91wnPApAXsV</a></td></tr><tr><td><strong>Activate a license</strong></td><td>The offline license model, the grace window, and how to activate.</td><td><a href="/pages/v4NMcrGG8ibLwlo00gBa">/pages/v4NMcrGG8ibLwlo00gBa</a></td></tr></tbody></table>

## Related Help

* [Private runners](/runners/self-hosted-runners.md) — host only the runner, keep the cloud app
* [Where runs execute](/runners.md)
* [REST API](/rest-api.md)


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter, and the optional `goal` query parameter:

```
GET https://docs.testvibe.com/self-hosting.md?ask=<question>&goal=<endgoal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is optional and describes the broader end goal you are ultimately trying to accomplish on behalf of the user. GitBook uses it to tailor the answer towards what is most useful for that goal.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
