---
url: https://panomc.com/docs/platform/server-management/managed-servers.md
---
# Managed Servers

A managed server is installed and run by Pano on a **node** — a machine running the
[`pano-node`](../pano-node/) daemon. The node connects **outwards** to Pano, so no port has to be
opened on it. Nodes are managed from the **node icon** next to the server switcher and need the
**Manage Nodes** permission.

## Adding a node {#adding-a-node}

**Add node** has four tabs:

| Tab | |
| --- | --- |
| **Local** | Pano's own machine, in one click. Runs on the Java Pano runs on. Files go to `<pano-dir>/node-data/`, the log to `<pano-dir>/logs/pano-node.log`. |
| **Manual** | Any machine: run the one-line command it shows, then approve the node. |
| **SSH** | Pano runs the install for you over SSH, after you confirm the host key. The login is never stored. |
| **Coolify** | Deploys the `ghcr.io/panomc/pano-node` container with a `/data` volume and the game ports. |

The Manual command looks like this (the code rotates every 30 seconds):

```bash
curl -fsSL https://panel.example.com/api/v1/node/install.sh | sh -s -- --pano 'https://panel.example.com' --code '123456'
```

Accept only nodes you set up yourself. When a node cannot reach your website URL (NAT, an SSH
tunnel), set **Pano address reachable from the node** under **Advanced**.

A node with an older daemon shows **Update available**; updating takes a few seconds and its servers
keep running. **Removing a node deletes every server and backup on it.**

## Creating a server {#creating-a-server}

**Add server → Create a new server** (needs **Create Servers**) walks through **Source → Node →
Software → Settings → Review**.

* **Software:** Paper (recommended), Purpur, Folia, Spigot, Fabric, Forge, NeoForge, Vanilla, and the
  proxies Velocity, Waterfall (deprecated) and BungeeCord. **Spigot** is compiled on the node with
  BuildTools — the first build of a version takes about ten minutes, later ones reuse it. The build
  needs a JDK; the node downloads one when the host has none. **Forge** and **NeoForge** are set up
  by their own installer on the node and get no Pano plugin.
* **Settings:** name, memory, port (empty = a free one from `25565-25600`), Java version, JVM
  arguments, **Start with Pano**, **Restart after a crash**, **Whitelist** (off by default; not for
  imports or proxies) and the Minecraft EULA.
* The node downloads the server, installs the Pano plugin already paired, and leaves the server
  **Stopped**, ready to start.
* On **Fabric** and **Quilt**, the Pano mod needs Fabric API, so the node installs it too (the build
  for that Minecraft version, from Modrinth) unless the server already has it. The Pano mod needs
  Minecraft 26.1+; on older versions, or with no Fabric API build, it is left out and the task says
  so.

**Importing:** as the source you can also pick an **existing folder on the node** (copied, never
moved), a **`.zip` upload** (up to 1 GB) or a **Modrinth modpack**. Pano detects the software and
version itself. Never import a folder whose server is still running.

> A backend behind a proxy usually runs with `online-mode=false` — keep it unreachable from the
> internet, or anyone can join as anyone.

## Server settings {#server-settings}

Changes apply on the next start.

* **Startup:** Java version, memory, port, JVM arguments, **Start with Pano**, **Restart after a
  crash**.
* **Memory** is the server's whole memory, not just the Java heap: the JVM keeps 512 MB plus 15 % of
  it (at most 2 GB) and the heap gets the rest, never less than half — for example 2048 MB gives a
  1229 MB heap and 4096 MB a 2970 MB heap. The panel shows the resulting heap under the field. Under
  the Docker runtime it is the container's limit. The heap starts at a quarter of its maximum and
  grows as needed; on Java 12+ an idle server hands memory back. Your own JVM arguments still win.
* **Server properties:** a form for `server.properties`. Only the keys you change are written; the
  rest of the file stays as it is.
* **Java:** on **Automatic**, the lowest version the Minecraft version supports — 25 for 26.1+, 21
  for 1.20.5–1.21, 17 for 1.17–1.20.4, 16 for 1.16.5, 8 for older. A missing Java is downloaded by
  the node.
* **Danger zone → Change software / Reinstall:** switch to another software or version, keeping
  worlds, plugins and configuration where they fit. A backup is taken first, and a failed change is
  rolled back. Worlds kept on the way to an **older** Minecraft version stop the server at startup —
  the dialog warns about it; restore the pre-change backup to go back. Needs **Create Servers** and
  your password.
* **Remove server:** on a managed server this deletes its folder **and its backups**. A linked server
  is only removed from Pano.

## When something goes wrong {#troubleshooting}

* **The node stays offline** — the local node runs on Pano's own Java (11+); on `LOCAL_NODE_JAVA_MISSING`
  fix `local-node.java-path` or leave it empty. Otherwise read `pano-node.log`.
* **The install fails** — the node needs internet access to the download sites, and free disk space.
  The server header keeps showing **The install failed** with the reason and **Reinstall** /
  **Change software** buttons; the server cannot be started until an install succeeds. A failed
  reinstall of a working server puts the old server back instead.
* **The server shows CRASHED** — its console has the error. Exit code `137` means it was killed from
  outside, usually for running out of memory.
* **The port is in use** — change it in **Startup**, or leave it empty for a free one.
