[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