Servers
A server is a Linux host running the TurboPanel daemon, enrolled into one organization. Everything you deploy runs on one. This chapter is the app side of your servers: Servers (/<org>/servers), a server's control panel, pending registration Keys, and the organization-wide Settings. Installing the daemon by hand, updating it from the shell, and what lives where on the host are the operator's pages: Daemon setup and Daemon update.
The model
| Term | Meaning |
|---|---|
| Registration key | A one-shot credential the app mints when you add a server. It is embedded in the install command; the daemon consumes it at enrollment and it is bound to that server from then on. An unconsumed key is a pending key. |
| Daemon | turbopaneld on the host: enrolls with the key, holds a signed key pair, streams facts and metrics, and executes the commands the control plane queues (deploys, reboots, updates). It connects out to the control plane; nothing connects in. |
| Co-located server | On self-hosted, the control plane's own host is also a server — enrolled at install and badged Platform Server. It cannot be deleted, its key cannot be revoked, and it updates with the control plane rather than through the app. |
| Capacity | An owner-set ceiling on how many servers the organization may hold (Servers → Settings → Server capacity); enrolled servers and pending keys both count. On High Availability the purchased licenses bound it as well. |
| Machine class | Physical or virtual. Decides whether hardware-sensor slots are used; inferred from discovered sensors unless pinned. |
Two rules:
- TurboPanel observes host interfaces; it does not configure them. Addresses and routes are the host's. The app reads what the daemon reports and pins meaning onto it (datacenter membership, addresses for hosting). The host firewall is TurboPanel's. The installer removes
ufw,firewalldandiptables-persistentfrom every host it installs on (they do not compose with Docker, and a host that shipped withufwactive kept the control plane's 8443 closed), so nothing on the host blocks the control plane or a published service port after install. The rules TurboPanel applies in their place — derived from what the control plane deploys, with organization defaults and per-server rules on top — are shown as a preview on each server's Firewall tab today and are not applied yet; until enforcement is switched on, restrict access from outside the host (cloud security groups, a provider firewall) if you need to. See Firewall. - A rebuilt host is a new server. A key is consumed once; a host that is reinstalled from scratch enrolls with a fresh key and appears as a new server row.
Before you begin
- A Debian 12+ or 64-bit Raspberry Pi OS host (
x86_64oraarch64) with root and outbound HTTPS to the control plane (supported platforms). - Organization owner to mint a key; manager for everything else on this page except capacity.
- On self-hosted, the control plane's public URL configured (Admin → Access → Hostnames) so the install command names an address the host can reach.
Add a server
Servers → + Server (the Add server wizard: Name → Install → Connect).
Server name (optional) — how the row will be labelled; the daemon's hostname is used otherwise. Continue mints the key. Refused when capacity is exhausted (server_capacity_exceeded) or, on High Availability, when every license is held (no_license_available — Open billing).
Install command: curl -fsSL turbopanel.sh | TURBOPANEL_LICENSE=… sh, with TURBOPANEL_HOST set to your control plane's public URL. Copy install command and run it as root on the host. It installs the daemon, enrolls with the key, and starts the service.
Connect waits for the daemon's first heartbeat, then opens the server. The key disappears from Keys the moment it is consumed.
The install command carries a secret
The key inside the command enrolls one host; treat the command as a password until it has been used. A key you will not use is deleted under Servers → Pending keys.
Servers → Pending keys lists the unconsumed keys (owner-only). Delete is two-press. A key bound to a live server cannot be deleted from here (license_has_attached_server) — delete the server instead.
All servers
Servers shows every server the organization holds, in Detail or Summary layout: online / offline / initializing, hostname, class, cores and RAM, the daemon build, and whether an update is available. The Overview tiles (Servers · Cores · RAM) total all servers.
Batch update: on TurboPanel High Availability servers roll out from Admin → Updates, and per-server Update stays hidden (updates_managed). On self-hosted, Update (n) is refused with control_plane_upgrade_required until Admin → Updates has this host's daemon and the control plane on the target build. After that gate opens, selected servers with an update available can move together; the co-located server is not in that list.
The control panel
Open a server for six tabs: Overview · Control · Time · Network · Firewall · Metrics. The Firewall tab is described in Firewall.
Overview
- Details — hostname, machine id, OS, daemon build, last seen, addresses.
- Labels — key/value labels on the server (Add label, Save). A service can pin itself to servers by label with plain Compose:
deploy.placement.constraints: ["node.labels.tier == db"](==/!=). - License (High Availability) — the tier the server sits on, the tier its hardware requires, and what is unwatched if they differ; Daily notice shows the last tier notice. See License tiers.
- Machine class — Auto (default), Physical or Virtual. The pin sets entitlement, not what the daemon collects: Physical unlocks the sensor slots the tier includes; Virtual suppresses them; Auto infers Physical once sensors are discovered and never infers Virtual.
- Hardware profile — which sensors feed CPU, drive and GPU temperature, which physical NICs are monitored, the hosting storage path (the mount that should hold application storage; empty auto-detects), and manual CPU TDP / Tjmax overrides. Drive temperature reporting (
drivetemp) is opt-in. What each choice changes on the Metrics tab is in Server metrics.
Control
- Server proxy — the per-server ingress container the platform manages for hosting rows; shows whether it is provisioned and running, with Restart. Not provisioned means no hosting has been deployed to this server yet.
- Commands — Change hostname (pushed to the host by command) and Reboot server. Commands are queued and run when the daemon leases them — an offline server picks them up on reconnect; the app shows each command's outcome and log.
- Daemon update — when a newer build is published and the platform gate is open, Update runs the daemon's own updater over the connection; Clear stuck update resets an update the daemon never reported back. While the gate is shut the badge reads Waiting for the control plane upgrade. On TurboPanel High Availability the button is hidden. Co-located hosts are updated from Admin → Updates.
- SSH — the SSH port the platform uses for this server: Use inherited (organization → datacenter default) or This server with a port; Save SSH port.
- Revoke daemon key — the compromised-host cutoff. Revoking closes the live session and refuses the key from then on; the host cannot enroll again until this server is deleted and a rebuilt host is enrolled fresh. Not offered for the co-located server.
- Delete server — two-step confirm. Refused while dependent resources remain (
server_has_blockers: networks, containers or addresses on the server — the response counts each); tear down or move the environments placed here first. The co-located server cannot be deleted.
Time
- Time sync status — facts from the last heartbeat: whether the NTP client is enabled and Synced, and the servers it uses.
- Timezone — the effective timezone (server → datacenter → organization default); Apply timezone pushes a change to the host.
- NTP configuration — NTP client enabled, NTP servers, Fallback servers; Apply NTP pushes it. Empty values inherit from the datacenter or the organization's host defaults.
Network
Read-only view of what the daemon reports and how the organization has pinned it: Interfaces (with the datacenter each address is pinned into; a pin whose address the daemon stopped reporting shows Stale), Datacenters (membership pins for this host), Managed addresses (organization address-pool rows assigned to this host), and Mesh (its TurboFabric state). Changing any of it is done from Datacenters and networking.
Metrics
Live and historical charts for the host; see Server metrics for what each one means and Live metrics sessions for the session limit.
Organization settings
Servers → Settings.
| Panel | What it sets |
|---|---|
| Default server timezone | The organization's timezone default, and Enforce org default on every server. |
| Temperature display | °C or °F on every Metrics tab. |
| Host defaults | The organization-level SSH port, NTP client enabled, NTP servers, Fallback NTP servers — the top of the organization → datacenter → server cascade (most specific wins). |
| Server capacity | Max servers or Unlimited servers (owner-only). Enrolled servers and pending keys count. |
Reference
| Item | Value |
|---|---|
| Install command | curl -fsSL turbopanel.sh | TURBOPANEL_LICENSE=… sh, TURBOPANEL_HOST=<public URL>; TURBOPANEL_INSECURE_TLS=1 only when the control plane serves the platform CA |
| Key | one-shot; bound at enrollment; revocable; a rebuilt host needs a new one |
| Reserved name | this server (the co-located server) |
| Control-panel tabs | Overview · Control · Time · Network · Firewall · Metrics |
| Machine class | auto (default) · physical · virtual |
| Cascades | timezone, SSH port, NTP: organization → datacenter → server |
| Daemon session | 15-minute signed tokens; revocation takes effect at the next one at the latest |
Errors
| Code | Status | Meaning |
|---|---|---|
server_capacity_exceeded | 409 | Enrolled servers plus pending keys reach Max servers. |
no_license_available | 409 | High Availability: every purchased license is held or releasing. |
license_has_attached_server | 409 | The key is bound to a live server; delete the server, not the key. |
server_has_blockers | 409 | Networks, containers or addresses still reference the server (counts in the response). |
The co-located control plane server cannot be deleted / …daemon key cannot be revoked | 403 | The control plane's own host is not removable from its own app. |
The co-located development daemon cannot be updated from the control plane | 403 | Update the control plane instead. |
control_plane_upgrade_required | 409 | Self-hosted: the server-update gate is shut. The badge reads Waiting for the control plane upgrade. |
updates_managed | 409 | TurboPanel High Availability: per-server Update is hidden. Use Admin → Updates. |
Daemon not connected, Up to date, Target unavailable | 404 (update) | The daemon must be online to update; there is no newer build; or the release manifest could not be read. Other commands queue and wait. |
Server is not enrolled | 409 | The row has no daemon key yet — the install command has not run. |
Invalid hostname, Invalid sshPort, Invalid ntp, Invalid timezone, Invalid machineClass | 400 | The value did not validate. |
Not found | 404 | No such server in this organization. |
Related
- Daemon setup — the installer, the FHS layout, the service.
- Daemon update — updating from the shell and changing channel.
- Datacenters and networking — subnets, pins, addresses, Docker pools, the mesh.
- Firewall — modes, rules, the preview and the safety net.
- Billing and licenses — why a key can be refused on High Availability.
- Server metrics — the Metrics tab.
Last updated on
Git sources and repositories
Connecting GitHub and GitLab, how applications, installations and repositories relate, binding a repository to a service, push-to-deploy and its two modes, deploy keys for plain git, and every refusal code
Datacenters and networking
The organization's network registry — datacenters (subnets, member pins, priority and trust, per-datacenter defaults), the address pool, Docker networks and host address pools, reserved ranges, and the TurboFabric mesh — with every collision and refusal code