二进制与 systemd
不用容器时,evstats 是一个静态编译的二进制,用 systemd 管理。ClickHouse 与 Redis 按各自的官方文档安装,要求和容器部署相同。
下载与校验
二进制在 GitHub Release 发布,平台有 linux/amd64、linux/arm64、darwin/arm64、darwin/amd64、windows/amd64,附 checksums.txt;二进制和镜像都用 cosign 做了无密钥签名。生产环境用 Linux。
bash
# 以 linux/amd64 为例:下载对应版本的 evstats_X.Y.Z_linux_amd64.tar.gz 与 checksums.txt 之后
sha256sum -c checksums.txt --ignore-missing
tar -xzf evstats_*_linux_amd64.tar.gz
install -m 0755 evstats /usr/local/bin/evstats
evstats version用户与目录
bash
useradd --system --home-dir /var/lib/evstats --shell /usr/sbin/nologin evstats
install -d -o evstats -g evstats /var/lib/evstats数据目录固定是工作目录下的 data/(IP 库下载后放在这里),所以 systemd 的 WorkingDirectory 要设成 /var/lib/evstats。
systemd 单元
保存为 /etc/systemd/system/evstats.service(源码仓库的 deploy/systemd/evstats.service),改掉 Environment 里 EVS_CLICKHOUSE 和 EVS_REDIS 的示例口令:
ini
# 二进制部署的 systemd 单元示例。
# 1. 把 evstats 放到 /usr/local/bin/evstats
# 2. useradd --system --home-dir /var/lib/evstats --shell /usr/sbin/nologin evstats
# install -d -o evstats -g evstats /var/lib/evstats
# 3. 改掉下面 Environment 里的示例口令,然后
# systemctl daemon-reload && systemctl enable --now evstats
#
# 数据目录固定是工作目录下的 data/(IP 库写在这里),所以 WorkingDirectory 要设成 /var/lib/evstats。
# 推荐用环境变量。启动参数 -clickhouse、-redis、-port 写了就覆盖同名环境变量。
# 单元文件里有口令时,不要让其他用户读取。
[Unit]
Description=evstats event analytics
Documentation=https://evstats.mosong.cc/zh/guide/deploy
After=network-online.target
Wants=network-online.target
[Service]
Type=simple
User=evstats
Group=evstats
WorkingDirectory=/var/lib/evstats
# 默认对所有网卡听 51321。要换端口时再加上 Environment=EVS_PORT=端口,并让同机 Nginx 转到新端口。
Environment=EVS_CLICKHOUSE=http://evstats:change-me@127.0.0.1:8123/evstats
Environment=EVS_REDIS=redis://:change-me@127.0.0.1:6379/0
ExecStart=/usr/local/bin/evstats
Restart=always
RestartSec=3
# 收到 SIGTERM 后停收、刷批、ACK,最多 15 秒
KillSignal=SIGTERM
TimeoutStopSec=30
# 默认端口 51321 不需要绑定特权端口的能力。若 EVS_PORT 低于 1024,再加回 CAP_NET_BIND_SERVICE。
NoNewPrivileges=true
LimitNOFILE=65536
ProtectSystem=strict
ReadWritePaths=/var/lib/evstats
ProtectHome=true
PrivateTmp=true
ProtectKernelTunables=true
ProtectKernelModules=true
ProtectControlGroups=true
[Install]
WantedBy=multi-user.targetbash
systemctl daemon-reload
systemctl enable --now evstats
journalctl -u evstats -f
curl -sS http://127.0.0.1:51321/health- 默认对所有网卡听
51321。要换端口时加上Environment=EVS_PORT=端口。 - 同一台机器上有 Nginx 终止 HTTPS 时,Nginx 按 反向代理与 HTTPS 转发到
127.0.0.1:51321。用防火墙挡住从外面直接访问这个端口。 - 口令写在
EVS_CLICKHOUSE和EVS_REDIS里。单元文件里有口令时,不要让其他用户读取。 - 收到 SIGTERM 后进程停止接收上报,把内存里的批次写进 ClickHouse,最多 15 秒,所以
TimeoutStopSec要大于 15 秒。
ClickHouse 与 Redis
- ClickHouse 24.8 及以上,建一个库和账号给
EVS_CLICKHOUSE用,账号要能建表、插入、查询、加列、建物化视图。只开 HTTP 接口 8123 给 evstats 服务器。 - Redis 7,打开 AOF(
appendonly yes),设口令,maxmemory-policy noeviction。可以直接参考 生产环境部署 里的redis.conf。
升级
换掉 /usr/local/bin/evstats,再 systemctl restart evstats。启动时会自己补表补列,见 升级。