安装部署
一条命令,从零到一个运行中的节点
推荐使用 Docker Compose:一条命令启动控制面、内嵌 Agent 与 PostgreSQL。需要 systemd 托管二进制的场景,可继续使用脚本安装。
curl -fsSL https://raw.githubusercontent.com/shuaiZend/PingWAF/main/deploy/compose/install.sh | bash 命令生成器
拼装你的安装命令
默认推荐 Docker Compose——一条命令,自带数据库。字段已预填文档默认值,只需修改需要自定义的部分;脚本安装保留在第二个页签。
Docker Compose
使用 Docker Compose 部署
Docker Compose 是官方推荐方式:一条命令启动控制面、内嵌 Agent 与 PostgreSQL,数据与证书保存在命名卷里;升级只需更换镜像标签。
- Docker Engine 24+,并安装 Compose v2 插件(docker compose,而非旧的 docker-compose 命令)。
- 宿主机 80、443、9080、9090 端口空闲——或在下方字段中改用其他端口。
- 无需外部数据库:compose 文件自带 PostgreSQL 16 容器,并使用命名卷持久化。
- 控制台首次启动以自签名证书提供 HTTPS。可在「设置 → Control plane HTTPS」上传正式证书,或设置 TLS_ENABLED=false 改用纯 HTTP。
curl -fsSL https://raw.githubusercontent.com/shuaiZend/PingWAF/main/deploy/compose/install.sh | bash
在空目录执行即可:安装器会下载 docker-compose.yml、写入仅本人可读的 .env、拉取镜像并启动。已有 .env 不会被覆盖——升级时重跑同一条命令即可。
- 1
执行一键命令
在空目录运行上面的命令。安装器会创建 ./pingwaf、下载 compose 文件并写入仅本人可读的 .env。
- 2
等待服务就绪
Compose 拉取镜像后启动 PostgreSQL,健康检查通过再启动 PingWAF;首次启动约需 1–2 分钟。
- 3
登录控制台
打开 https://<主机>:9080,用 ADMIN_EMAIL / ADMIN_PASSWORD 登录(默认密码会在首次登录时强制修改),然后添加站点。
需要自定义?生成带参数的命令
只填写需要改动的项;命令只会追加与默认值不同的参数。管理员密码不会写入命令,首次登录时控制台会强制修改。
curl -fsSL https://raw.githubusercontent.com/shuaiZend/PingWAF/main/deploy/compose/install.sh | bash
首次登录:https://<你的主机>:9080,使用上方的 ADMIN_EMAIL / ADMIN_PASSWORD(上传正式证书前请先接受自签名证书警告)。Agent 通过 :9090 连接控制面。
升级
拉取 .env 中指定标签的镜像并按原有卷重建容器——配置、数据与证书在重启后全部保留。需要可控升级时请固定镜像标签。
docker compose pull && docker compose up -d
已预填安装器默认值——只有你修改过的值才会写进命令。
curl -fsSL https://raw.githubusercontent.com/shuaiZend/PingWAF/main/deploy/compose/install.sh | bash
API Key 会明文出现在命令中,可能进入 shell 历史。推荐改用 export PINGWAF_API_KEY=… 传入,或交互运行安装器、在提问时粘贴密钥。
只有与默认值不同的项才会以参数形式追加,因此不做任何修改时生成的就是最短的一行命令。参数通过 bash -s -- 传给管道中的脚本。
交互式安装
或者让安装器来提问
在终端不带参数运行脚本,它会依次询问模式、账号、数据库与证书名称,打印解析后的计划并等待确认。
-
选择部署模式
1 all-in-one、2 server 或 3 agent——直接回车接受方括号中的默认值。
-
填写参数
Agent 会询问控制面地址与注册密钥;server 模式会询问管理员账号、PostgreSQL 连接串与证书名称。密码输入时不会回显。
-
确认摘要
在写入任何内容之前,安装器会先打印解析后的计划——模式、版本、平台、路径、systemd 状态与脱敏后的数据库 URL。
-
完成并验证
server 模式会打印启动命令;agent 会被自动启用并启动。到控制台的「节点」页面确认节点已上线。
参数速查
安装器参数一览
install.sh 支持的全部参数,每个参数都有对应的 PINGWAF_* 环境变量。
--mode 运行模式:all-in-one、server 或 agent。默认 all-in-one。
--version 安装指定版本(自动去掉前导 v)。留空或填 latest 则解析最新的 GitHub 发布。
--db-url server/all-in-one 模式的 PostgreSQL 连接串。默认 postgres://pingwaf:pingwaf@localhost:5432/pingwaf。
--server-url agent 模式的控制面 gRPC 地址。请使用 https://——gRPC 默认以 TLS 提供服务。
--api-key Agent 注册令牌。也可通过 PINGWAF_API_KEY 传入,避免留在命令行上。
--admin-email 初始化的管理员邮箱(server/all-in-one)。默认 admin@pingwaf.local。
--admin-password 初始化的管理员密码(server/all-in-one)。留空保留 pingwaf123,控制台会在首次登录时强制修改。
--tls-sans 逗号分隔的主机名,生成的控制台证书会覆盖这些名称。
--no-systemd 跳过创建 systemd 服务——适用于容器、升级或自行管理进程的场景。
--interactive / --non-interactive 强制进入提问(即使已传参),或永不提问、直接使用给定值与默认值。管道方式且不带参数时保持非交互。
--dry-run 只打印解析后的计划——模式、版本、平台、路径——然后退出,不做任何安装。
故障排查
安装没有顺利收尾时
支持中最常见的五类失败,以及定位各自问题所需的命令。
安装器连不上 PostgreSQL
all-in-one 与 server 模式在首次启动前需要 PostgreSQL 14+。脚本在 psql 无法连接时会给出警告——请先安装数据库,创建 pingwaf 用户与数据库(createuser / createdb),然后重新运行安装器,或编辑 /etc/pingwaf/pingwaf.toml 后执行 systemctl restart pingwaf。
bind() failed on 0.0.0.0:80 或 :443
数据面以非特权用户 pingwaf 绑定 80/443,这依赖服务单元授予的 CAP_NET_BIND_SERVICE。如果绑定仍然失败,先执行 systemctl show pingwaf -p AmbientCapabilities 检查,再用 drop-in 补上:sudo systemctl edit pingwaf → [Service] AmbientCapabilities=CAP_NET_BIND_SERVICE。在授予该能力之前写入的旧单元,会一直失败直到补上 drop-in。
二进制报版本化 glibc 符号错误
发布产物在 Ubuntu 24.04 上构建,需要 glibc 2.39 或更新。在更老的发行版(Debian 11、Ubuntu 20.04、CentOS/RHEL、Alpine 等)上,安装器的冒烟测试会报错停止——请改为源码构建。
systemd 服务启动失败
用 journalctl -u pingwaf -e 查看单元日志,并检查 /etc/pingwaf/pingwaf.toml。没有 reload 机制:任何修改都通过 systemctl restart pingwaf 应用,之后用 systemctl status pingwaf 确认。
容器启动失败,报 "bind() failed on 0.0.0.0:443" / Permission denied
镜像已在构建时为二进制授予 CAP_NET_BIND_SERVICE,因此在默认桥接模式下,非特权用户 pingwaf 用普通 docker run 或 docker compose up -d 即可绑定 80/443。如果仍然失败,说明运行时剥离了文件能力——加上 --cap-add=NET_BIND_SERVICE(仓库自带的 compose 文件已设置 cap_add 兜底),或切换到 host 网络 network_mode: host(此时必须同时注释掉 ports: 与 networks:;9080/9090 将直接监听宿主机)。可用 docker exec pingwaf getcap /usr/local/bin/pingwaf(预期输出 cap_net_bind_service=ep)和 docker exec pingwaf id -u(非零)验证。完整说明:https://github.com/shuaiZend/PingWAF/blob/main/docs/deployment.md#binding-ports-80443-in-containers
装好了?接下来添加第一个站点。
文档会带你了解站点模型、分布式拓扑、配置优先级与完整的环境变量参考。