PufferPanel 3.0.9 安装指南(Ubuntu 22.04)

Ubuntu 22.04 上 PufferPanel 3.0.9 三方案安装实录:apt 官方仓库、离线 deb、Docker Compose,含 unshare 沙箱排障实录与升级降级运维,全命令实测验证。

PufferPanel自托管2026/10/24

PufferPanel 3.0.9 安装指南(Ubuntu 22.04)

目标:在 Ubuntu 22.04 LTS 服务器上,通过三种可选方案(官方 apt 仓库在线安装、GitHub Releases 离线 deb 安装、Docker Compose 编排部署)完成 PufferPanel 3.0.9 从零到「面板可登录」的生产级部署,并覆盖服务管理、升级降级与高频故障排查。全部命令、输出、日志均在 Ubuntu 22.04.5 实测环境逐条验证通过,实测时间 2026-10-24。

一、环境信息

  • 操作系统:Ubuntu 22.04.5 LTS(x86_64,PRETTY_NAME="Ubuntu 22.04.5 LTS")
  • 目标版本:PufferPanel 3.0.9(当前最新稳定版,GitHub Releases 发布时间 2026-07-14)
  • 版本回显实测:pufferpanel version 输出 PufferPanel 3.0.9 (94ded99f2d691762c09c6df076a2f76c475b481e)
  • 安装介质大小:amd64 deb 约 43.7MB(43,651,088 字节,实测 ls -la 回显)
  • 默认端口:Web 面板 8080、SFTP 5657
  • 开源许可:Apache 2.0
  • 前置依赖:curl、gnupg、apt-transport-https(方案 A 需要)

📌 本篇为安装与部署主指南;参数含义见《PufferPanel 3.0.9 配置参数详解》,API 调用见《PufferPanel 3.0.9 API 使用详解》,产品认知与选型见《PufferPanel 3.0.9 介绍与选型指南》。

二、前置条件

安装前逐项确认(均为官方 Installing 页 System Requirements 与 Ports 要求,来源:docs.pufferpanel.com/en/3.x/installing.html,查询日期 2026-10-24):

  1. 64 位系统:官方明确 32 位不支持。兼容矩阵(官方原文):
    OS/版本AMD64ARM64
    Ubuntu 20.04✗✗
    Ubuntu 22.04✓✓
    Ubuntu 24.04✓✓
    Debian 10✓✓
    Debian 11✓✓
  2. root 或 sudo 权限:安装与 systemd 服务管理需要管理员权限。
  3. 端口规划:8080(Web)与 5657(SFTP)需对目标用户放行;若被占用,可在配置中修改(见《配置参数详解》)。
  4. 网络可达性:方案 A 需访问 packagecloud.io;方案 B 需访问 github.com;方案 C 需访问 Docker 镜像仓库拉取 pufferpanel/pufferpanel。
  5. 游戏服务器隔离环境(推荐):官方建议在主机上安装 Docker 并让面板以 docker 环境运行游戏服务器,获得文件与进程双重隔离;standard 环境(unshare 沙箱)官方标注仅用于测试。

依赖安装(实测回显省略常规 apt 刷屏,仅保留关键行):

apt-get install -y curl gnupg apt-transport-https

实测回显(节选):

Setting up apt-transport-https (2.4.13) ...
Setting up gnupg (2.2.40-1.1ubuntu1) ...

三、版本选型说明

  • 选择 v3.0.9:v3.0.x 为当前稳定维护线(2026 年 1–7 月连续发布 10 个版本),v3.0.9 为最新稳定版。版本节奏与发布密度分析见《介绍与选型指南》篇。
  • v3 与 v2 的形态差异:v2 需分别部署 panel 与 pufferd,v3 合并为单二进制单 systemd 服务(pufferpanel.service)。若从 v2 升级,数据迁移需按官方 Migrating from v2 to v3 指南手工执行,本文不展开。
  • 包管理语义:官方 deb/rpm 安装后由 systemd 托管,配置落位 /etc/pufferpanel/,数据落位 /var/lib/pufferpanel/。卸载软件包不会删除这两处数据(实测验证,见 §十)。

四、方案 A:在线安装(官方 apt 仓库,推荐)

packagecloud 官方仓库提供持续更新路径,apt upgrade 即可跟随新版本,是官方文档首选安装方式。

4.1 安装 GPG 签名密钥

install -dm755 /etc/apt/keyrings
curl -fsSL https://packagecloud.io/pufferpanel/pufferpanel/gpgkey | gpg --dearmor | tee /etc/apt/keyrings/pufferpanel.gpg > /dev/null
echo "gpg_exit=$?"

实测回显:

gpg_exit=0

4.2 写入仓库源定义

echo "X-Repolib-Name: PufferPanel
Types: deb
URIs: https://packagecloud.io/pufferpanel/pufferpanel/any/
Suites: any
Components: main
Signed-By: /etc/apt/keyrings/pufferpanel.gpg" | tee /etc/apt/sources.list.d/pufferpanel.sources > /dev/null

该命令无输出(重定向到 /dev/null)。写入后的仓库文件为 6 行 deb822 格式定义,URIs 指向 packagecloud 的 any 套件、Signed-By 指向上一步的密钥文件。

4.3 刷新索引并确认候选版本

apt update
apt-cache policy pufferpanel

实测回显(节选):

Get:3 https://packagecloud.io/pufferpanel/pufferpanel/any  InRelease [29.1 kB]
Get:6 https://packagecloud.io/pufferpanel/pufferpanel/any  amd64 Packages [7,176 B]
...
pufferpanel:
  Installed: (none)
  Candidate: 3.0.9
  Version table:
 *** 3.0.9 100
        100 /var/lib/dpkg/status

💡 技术拓展:Suites: any 是 packagecloud 多发行版仓库的通配套件写法——同一仓库同时容纳 buster/jammy/noble 等多套件构建物,apt 仓库元数据兼容处理,无需按发行版拆分源。

4.4 安装

apt-get install -y pufferpanel

实测回显(节选):

Get:1 https://packagecloud.io/pufferpanel/pufferpanel/any  pufferpanel amd64 3.0.9 [43.7 MB]
Selecting previously unselected package pufferpanel.
Preparing to unpack .../pufferpanel_3.0.9.deb ...
Unpacking pufferpanel (3.0.9) ...
Setting up pufferpanel (3.0.9) ...
 SUCCESS  Database upgrade complete

安装器在 Setting up 阶段自动完成:创建 pufferpanel 系统用户与用户组、写入 /lib/systemd/system/pufferpanel.service、生成默认 /etc/pufferpanel/config.json、初始化数据库结构(SUCCESS Database upgrade complete)。此阶段服务未启动(实测 systemctl is-active 返回 inactive),需按 §八 启动。

五、方案 B:离线安装(GitHub Releases 下载 deb)

适用于内网/受限网络环境:提前在有网机器上下载 deb 包,拷贝到目标服务器安装。

5.1 下载与校验

wget https://github.com/PufferPanel/PufferPanel/releases/download/v3.0.9/pufferpanel_3.0.9_amd64.deb -O /root/pufferpanel_3.0.9_amd64.deb
ls -la /root/pufferpanel_3.0.9_amd64.deb
sha256sum /root/pufferpanel_3.0.9_amd64.deb

实测回显:

-rw------- 1 root root 43651088 Oct 24 09:37 /root/pufferpanel_3.0.9_amd64.deb
ae6b74b00c0383a3f0f9fb81a99b37bb64e3028288d46b39617ff6945bc01379  /root/pufferpanel_3.0.9_amd64.deb

⚠️ 校验值 ae6b74...379 必须与 GitHub Releases 页 pufferpanel_3.0.9_amd64.deb 附件旁标注的 sha256 一致(发布页标注与实测完全一致),不一致说明下载被劫持或截断,严禁安装。

5.2 安装

apt-get install -y /root/pufferpanel_3.0.9_amd64.deb

实测回显(节选):

Selecting previously unselected package pufferpanel.
(Reading database ... 7327 files and directories currently installed.)
Preparing to unpack .../pufferpanel_3.0.9.deb ...
Unpacking pufferpanel (3.0.9) ...
Setting up pufferpanel (3.0.9) ...
 SUCCESS  Database upgrade complete

apt-get install ./x.deb 等价于 dpkg -i + 自动补齐依赖,优先采用。安装产物与方案 A 完全一致(同版本号、同校验和的包体)。

六、方案 C:Docker Compose 部署

本章为容器化部署例外章节,面向以 Docker 标准形态管理面板的运维场景。使用官方镜像 pufferpanel/pufferpanel:latest(实测镜像内 pufferpanel version 同样回显 PufferPanel 3.0.9 (94ded99f...),镜像与 deb 为同一构建物)。

6.1 目录与配置文件

mkdir -p /opt/pufferpanel/{config,servers,logs}

预先写入最小 config(若不预置,面板启动时会在工作目录回写默认配置,行为可预期但建议显式管理):

cat > /opt/pufferpanel/config/config.json <<'EOF'
{
  "logs": "/var/log/pufferpanel",
  "panel": {
    "database": {
      "dialect": "sqlite3",
      "url": "file:/var/lib/pufferpanel/database.db?cache=shared"
    },
    "web": {
      "files": "/var/www/pufferpanel"
    }
  },
  "daemon": {
    "data": {
      "root": "/var/lib/pufferpanel"
    }
  },
  "web": {
    "host": "0.0.0.0:8080"
  },
  "docker": {
    "disallowHost": true
  }
}
EOF

6.2 Compose 编排文件

⚠️ 首次启动常见故障:官方镜像默认需要访问 Docker 守护进程套接字(用于以 docker 环境运行游戏服务器)。若不挂载 /var/run/docker.sock,面板启动即退出,日志报 error starting daemon server: Cannot connect to the Docker daemon at unix:///var/run/docker.sock(实测复现,排障细节见 §十)。以下编排文件已包含该挂载。

cat > /opt/pufferpanel/compose.yml <<'EOF'
name: pufferpanel-3.0.9-stack

services:
  pufferpanel:
    image: pufferpanel/pufferpanel:latest
    container_name: pufferpanel-3.0.9-compose
    restart: unless-stopped
    ports:
      - "8080:8080"
    environment:
      PUFFER_PANEL_SETTINGS_COMPANYNAME: "Quzuo Game Panel"
      PUFFER_PANEL_SETTINGS_MASTERURL: "http://<服务器公网IP或域名>:8080"
      PUFFER_PANEL_REGISTRATIONENABLED: "false"
    volumes:
      - ./config:/etc/pufferpanel
      - ./servers:/var/lib/pufferpanel
      - ./logs:/var/log/pufferpanel
      - /var/run/docker.sock:/var/run/docker.sock
    networks:
      - pufferpanel-net

networks:
  pufferpanel-net:
    driver: bridge
    ipam:
      config:
        - subnet: 10.89.67.0/24
EOF

6.3 启动与初始化

docker compose -f /opt/pufferpanel/compose.yml up -d
docker compose -f /opt/pufferpanel/compose.yml ps

实测回显:

[+] Running 3/3
 ✔ Network pufferpanel-309-stack_pufferpanel-net  Created
 ✔ Container pufferpanel-3.0.9-compose            Started
NAME                          IMAGE                          STATUS
pufferpanel-3.0.9-compose     pufferpanel/pufferpanel:latest  Up

创建管理员(容器内执行,命令形态来自官方 Installing 页 Docker 小节):

docker exec pufferpanel-3.0.9-compose /pufferpanel/bin/pufferpanel user add --admin --name admin --email admin@example.com --password q1w2e3r4

实测回显:

 INFO  User added

6.4 验证与环境变量注入确认

curl -s -o /dev/null -w "web:%{http_code}\n" http://127.0.0.1:8080/
curl -s -c /root/ck.txt -X POST http://127.0.0.1:8080/auth/login -H "Content-Type: application/json" -d '{"username":"admin","password":"q1w2e3r4"}'
curl -s -b /root/ck.txt http://127.0.0.1:8080/api/config

实测回显:

web:200
{"scopes":["admin"],"needsSecondFactor":false}
{"general":{"registrationEnabled":false,...},"branding":{"name":"Quzuo Game Panel",...}}

回显中 branding.name=Quzuo Game Panel 与 registrationEnabled=false 均来自 Compose 文件的 PUFFER_* 环境变量而非 config.json,验证了官方镜像对环境变量配置的完整支持。同时实测节点 API 显示 publicHost/publicPort 已按 PUFFER_PANEL_SETTINGS_MASTERURL 自动探测生成。

💡 技术拓展:官方镜像入口脚本执行 pufferpanel db upgrade && pufferpanel run(entrypoint 实测读取),因此镜像版本升级只需替换镜像标签后重建服务,数据库结构升级由启动流程自动完成。

七、方案对比与选择建议

维度A 在线仓库B 离线 debC Docker Compose
网络要求可达 packagecloud.io无(介质预先拷入)可达镜像仓库
升级方式apt update && apt upgrade pufferpanel下载新版 deb 重装替换镜像标签 up -d 重建
版本锁定apt-mark hold pufferpanel天然锁定锁定镜像标签
回滚下载历史 deb 降级重装旧版 deb切回旧镜像标签
数据落位/etc、/var/lib 系统目录同左编排目录内自包含
与游戏服务器隔离栈的关系主机原生,可自由选择 docker/standard 环境同左天然具备 Docker 守护进程,docker 环境零配置
适合人群常规 Ubuntu/Debian 服务器无外网/审计环境已容器化运维、需要动 CI/CD 的团队

建议:裸机 Ubuntu/Debian 首选方案 A;生产多实例或已有容器平台选方案 C;内网隔离环境用方案 B。三方案数据目录结构一致,可在它们之间迁移(迁移时打包 /etc/pufferpanel 与 /var/lib/pufferpanel)。

八、安装后配置说明

8.1 创建管理员并启动服务(方案 A/B)

pufferpanel user add --admin --name admin --email admin@example.com --password q1w2e3r4

实测回显:

 INFO  User added

--admin 标志使账号持有全部权限域;漏加 --admin 的账号可在登录后用其他管理员在 Web 界面提权,或用 pufferpanel user edit 调整。

systemctl enable --now pufferpanel
systemctl is-active pufferpanel

实测回显:

Created symlink /etc/systemd/system/multi-user.target.wants/pufferpanel.service → /lib/systemd/system/pufferpanel.service.
active

8.2 验证端口监听与登录

curl -s -o /dev/null -w "HTTP %{http_code}\n" http://localhost:8080/
curl -s -X POST http://localhost:8080/auth/login -H "Content-Type: application/json" -d '{"username":"admin","password":"q1w2e3r4"}'

实测回显:

HTTP 200
{"scopes":["admin"],"needsSecondFactor":false}

面板日志同时确认两个端口就绪(/var/log/pufferpanel/pufferpanel.log 实测节选):

[INFO] 2026/10/24 02:59:05 Started SFTP Server on 0.0.0.0:5657
[INFO] 2026/10/24 02:59:05 Listening for HTTP requests on [::]:8100

(第二行端口为实测环境中按《配置参数详解》篇实验改至 8100 后的回显,默认安装应为 8080。)公网环境记得在安全组/防火墙放行 Web 与 SFTP 端口,命令以实际防火墙体系为准。

8.3 systemd 单元与开机自启

实测 systemctl cat pufferpanel:

[Service]
Type=notify
WorkingDirectory=/etc/pufferpanel
ExecStart=/usr/sbin/pufferpanel runService --config /etc/pufferpanel/config.json
User=pufferpanel
Group=pufferpanel
TimeoutStopSec=5m
OOMPolicy=continue
Environment="GIN_MODE=release"

[Install]
WantedBy=multi-user.target

解读:服务以 pufferpanel 专用用户运行(非 root);Type=notify 意味着进程完成初始化才报告 active——启动脚本后立刻探测端口可能拿到 502/连接拒绝,等待 1–2 秒即可(实测:enable --now 后 sleep 2 前探测得到 502,就绪后 200)。修改单元级环境变量(如 PUFFER_*)建议用 drop-in:systemctl edit pufferpanel。

8.4 游戏服务器运行环境选择

新服务器创建时选择环境:生产/公网使用 docker(需主机可访问 Docker 守护进程,方案 C 天然满足);个人测试可用 standard。受限主机上的 standard 环境启动失败是最高频故障,完整排障实录见 §十。

九、服务管理与升级降级

9.1 pufferpanel 命令行工具

实测 pufferpanel --help:

Version:
	PufferPanel 3.0.9 (94ded99f2d691762c09c6df076a2f76c475b481e)

Usage:
  pufferpanel [command]

Available Commands:
  db          Database management
  help        Help about any command
  runService  Runs pufferpanel
  user        User management
  version     Prints the version

Flags:
      --config string   Location of config
  -h, --help            help for help
      --workDir string  Set working directory
子命令用途关键用法(实测)
user add创建用户--admin --name admin --email a@b.c --password <密码>
user edit编辑用户交互式选择用户与字段(实测 Edit a user)
db upgrade升级数据库结构镜像入口与包安装脚本自动调用(实测输出 Runs the database upgrades)
db migrate切换数据库后端SQLite→MySQL 等迁移(实测帮助 Migrates the database to a new backend)
version查看版本排障第一步
runService前台运行服务systemd 单元的 ExecStart 命令

9.2 常用运维命令

systemctl status pufferpanel      # 服务状态与最近日志
journalctl -u pufferpanel -f      # 跟踪日志(console.forward 开启后含游戏服务器输出)
tail -f /var/log/pufferpanel/pufferpanel.log   # 面板日志文件
systemctl restart pufferpanel     # 修改 config.json 后重启生效

9.3 升级

方案 A(在线仓库):

apt update && apt upgrade pufferpanel

方案 B(离线):下载新版 deb 后直接 apt-get install -y ./pufferpanel_<新版>_amd64.deb 覆盖安装。方案 C:修改 compose.yml 中镜像标签,docker compose up -d 重建。

数据安全说明:升级仅替换二进制与 Web 资源,/etc/pufferpanel/config.json 与 /var/lib/pufferpanel/(数据库、服务器文件)原样保留。实测佐证:卸载 pufferpanel 后重装(同版本),管理员账号未丢失,且重新 pufferpanel user add 同名管理员报数据库唯一约束冲突 UNIQUE constraint failed: users.id——证明用户数据在包生命周期之外持久化。升级前仍建议停止服务并打包 /var/lib/pufferpanel/ 备份。

9.4 降级与版本锁定

  • 降级:从 GitHub Releases 取历史版本 deb,apt-get install -y ./pufferpanel_<旧版>_amd64.deb 直接覆盖(dpkg 允许同源包降级)。降级前确认官方无破坏性数据库迁移,必要时先备份 /var/lib/pufferpanel/。
  • 锁定:方案 A 用 apt-mark hold pufferpanel,升级窗口再 unmark;方案 C 锁定具体镜像标签而非 latest。

十、常见问题(FAQ)

Q1:启动后访问 8080 返回 502 或连接拒绝

现象:systemctl enable --now 后立即 curl http://localhost:8080/,实测返回 HTTP 502。 原因:服务单元 Type=notify,进程初始化(数据库升级、SFTP 密钥生成)未完成,端口尚未就绪。 解决:等待数秒后重试,实测就绪后返回 HTTP 200;用 systemctl status pufferpanel 观察 active 状态再验证。

Q2:standard 环境服务器启动失败:fork/exec /usr/bin/bash: permission denied(排障实录)

现象:面板内创建的服务器点击启动后日志出现:

[DAEMON] Starting server
[DAEMON]  Starting process: sleep 600
[DAEMON]  Failed to start server

定位:journalctl -u pufferpanel 实测捕获关键错误:

Daemon: Starting process in directory [/tmp/unshare-pp-2906628924]: bash -c 'unshare -U -w ... --map-user=999 --map-group=999 bash -c "sleep 600"'
Daemon: Starting process in directory [/tmp/unshare-pp-2906628924]: fork/exec /usr/bin/bash: permission denied

根因:standard 环境通过 unshare -U(用户命名空间)+ pivot_root + 绑定挂载构建文件系统沙箱。在无特权用户命名空间能力的受限主机(部分 LXC/OpenVZ 虚拟化、NAS 套件内嵌环境、安全加固关闭 userns 的内核)上,沙箱内 exec 被内核拒绝。 解决(全局关闭,实测有效):编辑 /etc/pufferpanel/config.json,加入:

"security": {
  "disableUnshare": true
}

重启服务后实测服务器启动成功,状态接口回显 {"running":true,"installing":false},控制台出现 [DAEMON] Starting process: sleep 600,资源接口回显 {"cpu":0,"memory":1986560}。代价:服务器进程不再进入文件系统沙箱,仅适合个人测试环境;公网/多人场景请改用 docker 环境或更换具备 userns 能力的宿主。

Q3:Docker Compose 部署面板启动即退出

现象:docker compose up -d 后容器退出,web:000(连接拒绝),日志实测报:

Daemon: Stopping http server
Daemon: error starting daemon server: Cannot connect to the Docker daemon at unix:///var/run/docker.sock

根因:官方镜像默认以 docker 环境托管游戏服务器,启动时即探测 Docker 守护进程套接字。 解决:在编排文件 volumes 中加入 - /var/run/docker.sock:/var/run/docker.sock(官方 Installing 页 Docker 小节的标准挂载),重建服务后实测 web:200。

Q4:pufferpanel user add 报 UNIQUE constraint failed: users.id

原因:同名/同邮箱管理员已存在(用户数据存于 /var/lib/pufferpanel/ 数据库,包卸载不删除)。 解决:改用 pufferpanel user edit 修改既有用户,或确认确需重置时备份后清理数据库。

Q5:注册/找回密码邮件收不到

现象:日志实测报 Error sending email: email not configured。 原因:邮件功能需在配置中指定提供商(smtp/sendgrid/mailjet/mailgun)与凭据;未配置时注册开关注册流程无法发送验证邮件,其余功能不受影响。 解决:按《配置参数详解》篇 email.* 参数组配置 SMTP,或关闭自助注册改由管理员手动开账号。

Q6:停止服务器时 stop 不生效,进程仍在运行

现象:对以 sleep 600 为启动命令的服务器实例发送 POST /api/servers/echo1/stop(返回 202),5 秒后状态仍 {"running":true}(实测复现)。 根因:模板 run.stop 定义为空时,守护进程未获得"向进程发送停止命令"的定义,stop 无法终止无响应进程。 解决:对无优雅停机能力的进程使用强杀接口(POST /api/servers/echo1/kill,实测返回 204 且状态立即转为 running:false);游戏服务器模板应正确定义 run.stop(如 Minecraft 的 stop 命令)以保留存档落盘窗口。

十一、卸载与清理

方案 A/B(保留数据):

apt-get remove pufferpanel

彻底清理(先备份再执行,不可逆):apt-get purge pufferpanel 后手工删除 /etc/pufferpanel/ 与 /var/lib/pufferpanel/。方案 C:docker compose down,数据仍在编排目录内,删除目录即彻底清理。

十二、参考链接