Files
pay/deploy/pangolin1/pay-v2.service
T

58 lines
2.3 KiB
Desktop File

[Unit]
Description=pay v2 收款服务(pangolin1 专用实例;crypto USDT + 哪吒(nezha) CNY 双渠道,MOCK 关)
Documentation=https://github.com/wangjia/pay
After=network-online.target
Wants=network-online.target
# 崩溃后不放弃自愈,但避免瞬时死循环耗尽资源(呼应 pangolin-agent.service 的自愈风格,
# 这里用有限重启而非 Restart=always,因 payd 不是"必须永不停"的网络自愈进程)。
# 注:StartLimitIntervalSec=/StartLimitBurst= 是 [Unit] 段指令(现代 systemd,
# 与 pangolin-agent.service 的用法一致),不是 [Service] 段——放错段会被忽略。
StartLimitIntervalSec=60
StartLimitBurst=5
[Service]
Type=simple
User=payv2
Group=payv2
WorkingDirectory=/var/lib/pay-v2
EnvironmentFile=/etc/pay-v2/pay.env
ExecStart=/opt/pay-v2/payd
Restart=on-failure
RestartSec=3
# ── 加固 ─────────────────────────────────────────────────────────────────
# ProtectSystem=strict 把整个文件系统挂只读,仅 ReadWritePaths 列出的目录可写
# (sqlite 库文件 + 未来任何本地状态都落 /var/lib/pay-v2)。/etc/pay-v2 下的
# config.yaml / pay.env 只读挂载即可,不需要写权限。
# 仍需正常出网:连 TronGrid(crypto 查链)、哪吒网关(nezha 下单/查单/回调验签)、
# 回调 pangolin-server 的 /v1/webhook/pay——因此不设 PrivateNetwork=true,
# 也不把 RestrictAddressFamilies 收窄到只剩 AF_UNIX(仍留 AF_INET/AF_INET6)。
NoNewPrivileges=true
ProtectSystem=strict
ProtectHome=true
ReadWritePaths=/var/lib/pay-v2
PrivateTmp=true
ProtectKernelTunables=true
ProtectKernelModules=true
ProtectKernelLogs=true
ProtectControlGroups=true
ProtectClock=true
ProtectHostname=true
ProtectProc=invisible
RestrictSUIDSGID=true
RestrictRealtime=true
RestrictNamespaces=true
RestrictAddressFamilies=AF_INET AF_INET6 AF_UNIX
LockPersonality=true
RemoveIPC=true
# payd 是纯 Go 静态二进制(CGO_ENABLED=0 交叉编译,sqlite 走 modernc 纯 Go 实现,
# 无 cgo/JIT),历史上 MemoryDenyWriteExecute=true 对这类构建安全;若启动后
# journalctl 看到 SIGSYS/mmap 相关崩溃,先注释这一行排查。
MemoryDenyWriteExecute=true
CapabilityBoundingSet=
AmbientCapabilities=
UMask=0027
[Install]
WantedBy=multi-user.target