Impreza Host
Tutorials/The agent, apps & control panels
⚙️ Tutorial 2

The agent, apps & control panels on your VPS

Tutorial 1 showed how to connect an AI to the platform. This one explains what actually lives inside the customer's server: the agent, how apps run, the catalog, custom deploys, and the automatically installed control panels.

Two server personalities #

When a customer buys a VPS or dedicated, the server takes one of two mutually exclusive roles, chosen at checkout:

┌──────────────────────────────────┐ OR ┌──────────────────────────────────┐ │ AGENT MODE (Docker) │ │ PANEL MODE (classic hosting) │ │ • Impreza agent runs as daemon │ │ • aaPanel / CyberPanel / │ │ • apps run in Docker containers│ │ CloudPanel / cPanel owns box │ │ • catalog + custom apps + Tor │ │ • NO Impreza agent │ │ • driven by AI / CLI / API / UI│ │ • NO Docker catalog │ │ │ │ • you manage via the panel UI │ └──────────────────────────────────┘ └──────────────────────────────────┘ ▲ most of this tutorial ▲ the "Control panels" section

The two modes are exclusive: a panel server does not run the Impreza agent and has the Docker catalog disabled. You choose at the cart.

What the agent is #

The agent is a small Go daemon we install on the VPS (ID format agt_xxxxxxxxxxxx). It is the piece that turns "some VPS" into "an Impreza server". In one sentence:

The agent keeps talking to the Impreza control plane, receives deploy orders, runs them locally via docker compose, and reports the result back.

What the installer (install.sh) leaves on the server:

From there the agent polls the control plane: when you (or the AI, or the CLI) create a deployment, the order arrives on the next poll and the agent runs it on the server itself. That is why deploys are private: the code runs on the customer's machine, who keeps root. Impreza never executes your app on our infrastructure.

What the agent handles automatically

ConcernWhat the agent does
HTTPSRuns Caddy, which issues a Let's Encrypt cert for each HTTP app
DomainsCreates/manages routes; allocates a *.imprezaapps.com subdomain when you bring none
Tor / .onionRuns a Tor sidecar, generates the ed25519 keypair, publishes the .onion
Buildsgit clone --depth=1 + docker build, or a build from an uploaded tarball
PortsAllocates a free host port per instance (HTTP apps sit behind Caddy)
LimitsApplies --cpus + --memory per container (default 1 CPU / 512 MB)
So "what is it for": the agent is Impreza's arm inside the customer's server. Without it, nothing can be installed by the platform — AI, CLI and API all answer "no server found on this account".

3 ways to run apps (agent mode) #

Catalog (1-click)

The fastest route: apps we packaged and verified. Browse the catalog in My Apps, click Install, pick server + domain, done (~30s). Apps today include WordPress, PrestaShop, n8n, OpenClaw, Vaultwarden, Nextcloud, Matrix, Gitea, SearXNG, Memos, Uptime Kuma, Activepieces, Jellyfin, PhotoPrism, MinIO, Mattermost, Ollama, Open WebUI, RustDesk, Evolution API plus managed databases (PostgreSQL, MySQL, MariaDB, MongoDB, Redis).

You can install the same app multiple times on one server — each instance gets its own host port. (Exceptions: fixed-protocol apps like RustDesk and the databases are one per server.)

curl -X POST https://api.imprezahost.com/v1/platform/deployments \
  -H "X-API-Key: imp_..." -H "X-API-Secret: ..." \
  -H "Content-Type: application/json" \
  -d '{
    "app_name": "vaultwarden",
    "agent_id": "agt_xxxxxxxxxxxx",
    "domain": "vault.example.com",
    "onion": true,
    "vars": {"signups_allowed": "true"}
  }'
Apps that come up ready: WordPress, Gitea and n8n land already installed, no wizard — the platform runs the install step for you. You open the URL and you are in.

Custom app (your own code)

For code that is not in the catalog. Four source modes — the platform auto-detects which from the fields you fill:

curl -X POST https://api.imprezahost.com/v1/platform/deployments/custom \
  -H "X-API-Key: imp_..." -H "X-API-Secret: ..." \
  -H "Content-Type: application/json" \
  -d '{
    "name": "my-app",
    "agent_id": "agt_xxxxxxxxxxxx",
    "git_url": "https://github.com/your-user/your-repo",
    "git_ref": "main",
    "dockerfile_path": "Dockerfile",
    "target_port": 8080,
    "cpus": 1.0,
    "memory_mb": 512
  }'

Or from the CLI, in a directory with a Dockerfile:

cd ~/my-app
impreza deploy --agent agt_xxxxxxxxxxxx --name my-app --follow
# → Packaging → Uploading → Deploying → ✓ Deployed at https://my-app-3f7c9a.imprezaapps.com

Auto-deploy on every git push

For git_url deploys, connect a push webhook so every commit on the watched branch re-deploys (re-clone at HEAD → rebuild → restart in place). Works with any provider:

Enable it from My Apps (Advanced → 🔗 Connect git for auto-deploy), the AI (impreza_git_webhook_connect), or the REST API.

How apps are reached (network modes) #

ModeHow it is reachedExample
http (default)URL with HTTPS via Caddy + Let's Encrypt + subdomainAlmost every app
host_portsRaw TCP/UDP on fixed ports, no Caddy/cert/domain; response carries connection_info: {ip, ports, public_key}RustDesk, managed DBs
hybridRaw ports and an HTTP admin UI behind CaddyAdGuard (DNS on :53/udp + HTTPS admin)

Managed databases

PostgreSQL, MySQL, MariaDB, MongoDB and Redis ship as catalog apps in host_ports mode — raw TCP on the VPS public IP, no domain/cert. Deploy returns connection_info: { ip, ports }; connect with the native client (psql, mysql, mongosh, redis-cli). Credentials surface as ADMIN_USER + ADMIN_PASSWORD on the My Apps card (click to reveal) — a strong 20-char password is auto-generated. They ship open to the internet, protected by the password (a per-IP allowlist is on the roadmap).

Domains, redeploy & .onion (what stays stable) #

Limits + trust model #

Automatic control-panel installation #

This is the alternative to the agent. Instead of the agent + Docker flow, the customer picks a classic hosting panel at checkout that owns the whole server — managing sites, databases, email, DNS and SSL from the panel's own UI.

Remember: it is exclusive mode. A panel server runs no Impreza agent and the Docker catalog is disabled. You cannot have both on one server.

Available panels

PanelCostAdmin portNotes
aaPanelfreerandomized (bt default prints it)Lightweight; optional 1-click stack (nginx + PHP 8.4 + MariaDB). Tolerant of a non-pristine OS.
CyberPanelfree8090OpenLiteSpeed base (LSCache, 1-click WordPress, PHP, MariaDB, DNS, email, SSL). Needs a fresh OS.
CloudPanelfree8443Modern nginx for PHP, Node.js and Python with free SSL. Needs a fresh OS.
cPanel/WHMlicense NOT included2087Installs unlicensed; log in to WHM as root and start the 15-day trial or apply your own IP-bound license.
DirectAdmin appears in the known-panels list but is not automatable today (trials were discontinued and the service will not even start unlicensed), so it stays out of automatic provisioning.

OS compatibility (important)

Each panel runs only on certain operating systems. The cart validates this up front and, if the server OS is not compatible, asks you to reinstall with a supported one first:

Two layers of checking: the cart does a best-effort validation by template name; the real one is a gate inside the server that reads /etc/os-release at boot and aborts the install on an incompatible OS instead of half-installing.

The flow, from checkout to "ready"

checkout provisioning credentials ──────── ──────────── ─────────── pick the panel VPS: auto-installs when ready, the My Apps tile in the → a few minutes after → card shows the login URL cart payment + user + password (reveal) dedicated: our team provisions after the hardware is racked
  1. At the cart, pick the panel tile. (For aaPanel there is also a bare profile = panel only, fast; or full = panel + nginx/PHP/MariaDB stack.)
  2. On a VPS, the install runs automatically a few minutes after payment. On a dedicated, our team provisions it once the hardware is racked.
  3. The OS gate runs on the server; if incompatible, the install aborts and the clientarea shows a "reinstall with a supported OS" card.
  4. When done, the panel appears in My Apps with the login URL, the username and the password (click to reveal — stored encrypted on our side).
  5. cPanel/WHM exception: no own password — log in to WHM (:2087) with the server's root account, accept the EULA, then start the trial or apply your license.

Reinstall / leave panel mode

There is no REST/CLI/MCP endpoint to provision a panel. Panels are only a checkout + clientarea feature. The AI does not install panels — it works in agent mode. A customer who wants both AI/Docker and a panel needs separate servers.

Which mode should you choose? #

You want to…Choose
Ship your own Docker / code / git appsAgent mode
Deploy by chatting with an AIAgent mode + MCP
Ready-made catalog apps (WordPress, n8n, Vaultwarden…)Agent mode (1-click catalog)
A classic hosting panel (sites/email/DNS via UI)Panel mode (aaPanel / CyberPanel / CloudPanel / cPanel)
Host many client sites with cPanelPanel mode (cPanel/WHM — bring your license)