Node Agent Installation
ppanel-node is the lightweight agent each edge server runs to sync routes, heartbeats, and transport keys with the PPanel control plane. This guide covers the fastest install path plus alternative deployments.
Quick start
wget -N https://raw.githubusercontent.com/perfect-panel/ppanel-node/master/scripts/install.sh
sudo bash install.sh --api-host https://panel.example.com --server-id 1 --secret-key <SECRET>The script auto-detects your distro/architecture, downloads the latest release, installs geo databases, and sets up the ppnode CLI + system service.
Requirements
- 64-bit Linux (Debian/Ubuntu ≥16, CentOS ≥7, Alpine, Arch, etc.)
- Root access and outbound HTTPS connectivity to
github.com - Firewall ports open for the protocols you expose as well as panel callbacks
- Matching Server ID + Secret Key generated in the PPanel admin console
Optional flags
- Positional
vX.Y.Zargument installs a specific tag instead of the latest release. --api-host https://panel.example.com--server-id <ID>(matches the record you created under Maintenance → Servers)--secret-key <KEY>
If the flags are omitted the installer will prompt for the values interactively.
Service operations
Once installed you can manage the agent with the bundled CLI:
ppnode status # current state
ppnode start # start daemon
ppnode restart # restart + reload config
ppnode log # follow logs
ppnode update # upgrade to latest release
ppnode update v1.2.3
ppnode uninstall
ppnode generate # regenerate /etc/PPanel-node/config.ymlInstallation methods
Method 1 — One-click installer (recommended)
Use the Quick Start command above or run sudo bash install.sh and answer the prompts. Behind the scenes the script:
- Installs prerequisites (
wget,curl,tar,socat, cron, etc.). - Downloads
ppanel-node-linux-<arch>.zipfor amd64, arm64, or s390x. - Extracts to
/usr/local/PPanel-node, installsgeoip.dat/geosite.dat, and wires the service with systemd/OpenRC. - Drops the helper CLI to
/usr/bin/ppnodeand enables auto-start.
Method 2 — Build from source
Install Go 1.21 or newer and enable the JSON v2 experiment:
bashexport GOEXPERIMENT=jsonv2Clone the repository and build:
bashgit clone https://github.com/perfect-panel/ppanel-node.git cd ppanel-node GOEXPERIMENT=jsonv2 go build -v -o ./ppnode -trimpath -ldflags "-s -w -buildid="Copy the binary plus geo assets to their runtime locations:
bashsudo install -Dm755 ./ppnode /usr/local/PPanel-node/ppnode sudo install -Dm644 ./geoip.dat /etc/PPanel-node/geoip.dat sudo install -Dm644 ./geosite.dat /etc/PPanel-node/geosite.datCreate the systemd unit (adapt paths as needed):
bashsudo tee /etc/systemd/system/PPanel-node.service <<'EOF' [Unit] Description=PPanel Node After=network.target [Service] Type=simple ExecStart=/usr/local/PPanel-node/ppnode server Restart=always RestartSec=10 [Install] WantedBy=multi-user.target EOF sudo systemctl daemon-reload sudo systemctl enable --now PPanel-nodeCopy
config.ymlfrom the repo or create it manually (see the configuration section) and restart the service.
Method 3 — Docker / container images
The repository ships a Dockerfile. You can build and run it on hosts where installing directly is undesirable:
git clone https://github.com/perfect-panel/ppanel-node.git
cd ppanel-node
docker build -t ppanel-node:latest .
docker run -d --name ppanel-node \
--net host \
-v /etc/PPanel-node:/etc/PPanel-node \
ppanel-node:latest serverRecommended bind mounts:
/etc/PPanel-node/config.yml– credentials and API settings./etc/PPanel-node/geoip.dat&/etc/PPanel-node/geosite.dat– keep them on the host so updates persist./var/log/ppanel-node(optional) – collect structured logs outside the container.
Configure the node
The runtime configuration lives in /etc/PPanel-node/config.yml. The installer generates the file with the following structure:
Log:
Level: warn # debug | info | warn | error
Output: "" # empty = stdout, or set a file path
Access: none # path for access logs, or "none"
Api:
ApiHost: https://panel.example.com
ServerID: 3
SecretKey: b23d8ee1cfe44d7f
Timeout: 30After editing the file, restart the service:
sudo systemctl restart PPanel-node
# or
ppnode restartMapping to the panel
- Create a server entry in the Maintenance → Servers page inside the PPanel admin UI.
- Copy the generated Server ID and Secret Key into
config.yml. - Ensure the node host can reach the panel’s HTTPS endpoint defined as
ApiHost. - Approve the node once it appears under the panel’s node list (heartbeat should update within ~30 seconds).
Maintenance
ppnode updatekeeps configuration/geo files intact while replacing the binary.ppnode update vX.Y.Zpins a specific release for rollbacks.- For manual builds, rebuild the target tag, replace
/usr/local/PPanel-node/ppnode, thensystemctl restart PPanel-node.
Troubleshooting
ppnode logorjournalctl -u PPanel-node -fsurfaces runtime logs.- Validate
/etc/PPanel-node/config.yml—typos inApiHostorSecretKeycause auth failures. - Ensure the host can reach GitHub (updates) and your panel domain on port 443.
- If the panel lists the node as offline, verify firewall rules allow heartbeats and that NTP is synchronized (
chronyc tracking).
Need more detail? Review the source at github.com/perfect-panel/ppanel-node.