教程
如何用 BTCPay Server 自己收取 Bitcoin 付款
每一个托管型支付处理商,都是一家能随时冻结你账户的公司。对任何收 Bitcoin 的人来说,这都不是什么假设情形:几年前开始,大型处理商就相继加上了身份核验、提现门槛和结算规则,而一旦商户没能通过某一项审核,往往是在钱已经在路上的时候才发现出了问题。BTCPay Server 存在的意义,正是为了解决这一点。它是免费的开源软件,能把一台你自己掌控的服务器,变成属于你自己的收款系统——发票、收银台界面、店铺插件、Lightning——中间没有公司插一脚,不抽成,也没有账户会被封停。安装它确实只需要一个下午。真正决定成品好不好用的,是这台机器本身的底子,以及默认安装会不声不响地留下、把线索指回你本人的那几个细节。
BTCPay Server 到底替代了什么
一个托管型处理商,横在你的客户和你的钱包之间:它生成地址、盯着链上动向、换算金额、把资金攥在自己手里一段时间,最后才打给你。这每一步,都是它借机多摸清你一分底细的机会,也是它随时可以拒绝你的一个环节。BTCPay 在你自己租来的硬件上,做的是同一件事——但它对你的了解程度,天差地别。
- 付款会直接进到你自己的钱包里。你给 BTCPay 一个扩展公钥,它就能为每一张发票派生出一个全新地址并进行监视——它从不掌握链上付款的私钥,一聪都动不了。
- 没有手续费,也没有账户。软件是开源的,由你自己运行,没有什么需要申请,也没有什么账户会被封停。
- 它把那些做起来很繁琐的部分都处理好了:发票过期、实时汇率换算、多付与少付、部分付款、退款,以及一张客户可以自行独立核验的收据。
- 它自带大多数人都用得上的前端——收银台界面、支付按钮、众筹页面,以及各类主流电商平台的插件——如果你要接入自己的软件,它也提供完整的 API。
- 如果你需要,Lightning 可以在同一套部署里直接开出来,这也是几美元以下的小额付款能够行得通的唯一原因。
这里的边界值得说清楚。BTCPay 不会把 Bitcoin 变成你的本地货币,如果钱最终必须流向交易所或银行,它也去不掉这一环。它去掉的是处理商——那个抽成、把你的资金攥在手里过一道,还要求你出示身份才肯办事的中间人。你换来的东西,和无需 KYC 托管的网站是同一种形状:更多的控制权,以及随之而来的那份工作量。
你自己成了支付处理商
这份工作量,是自托管要付出的真实代价,最好在安装之前就想清楚,而不是装完之后才明白。没有人替你盯着在线率,没有人替你恢复备份,当客户坚持说自己已经付款、而你这边却看不到的时候,电话线另一头也不会有客服替你接住。
- 在线率是你自己的事。服务器一旦宕机,发票就开不出来,所以一个必须始终可用的收款系统,需要一台真的有人在盯着的机器。
- 备份是你自己的事。丢掉服务器还能挺过去;丢掉钱包描述符或者 Lightning 通道状态,就挺不过去了。
- 密钥托管一分为二。链上资金放在一个 BTCPay 只负责监视的钱包里,这是安全的安排。Lightning 资金则放在服务器自身的热钱包里,这就不安全了——把这部分余额当成周转资金,绝不要当成存款。
- 纠纷没有仲裁者。没有拒付,这在很大程度上正是重点所在,但这也意味着每一笔退款,都是你自己做的决定,也是你自己发出的一笔交易。
- 更新是你自己的事。友好界面之下,是一整套容器,里面还跑着一个 Bitcoin 节点,它需要的维护纪律,和任何暴露在公网 IP 上运行的东西完全一样。
这些都算不上沉重。一旦它跑起来,往后每个月也就几分钟的事,外加一开始那个用心投入的下午。它就是不等于零而已,而处理商收的手续费,买的在很大程度上正是这份省心。
机器怎么选:底层节点决定一切
BTCPay 本身是个很轻量的应用。它背后依赖的 Bitcoin 节点却完全不是这样,而这里几乎每一个选型上的失误,都是因为按 Web 应用的标准来预算,而不是按底层这条链的标准。标准部署会拉起 Bitcoin Core、一个负责追踪你钱包的索引器、一个数据库、一个反向代理,以及应用本身——而真正需要磁盘、内存和耐心的,是 Core。
- 存储空间是决定你选哪档套餐的关键。未裁剪的完整链如今已经超过 750 GB,并以每月大约 7 GB 的速度继续增长。这套部署自带省空间的预设,可以把区块数据分别压到大约 100、50 或 25 GB,而不管选哪一档,它依然是一个会自己核验每一条规则的真正全节点。
- 裁剪并不会缩短首次同步的时间。不管裁不裁剪,Core 都要从创世区块开始下载并核验每一个区块;裁剪只决定事后保留哪些数据。
- 同步速度主要靠内存。4 GB 就能跑起来,8 GB 能明显同步得更快,还能给 Lightning 和数据库留出空间,不用和节点抢缓存。
- NVMe 不是可选项。首次同步的瓶颈主要在于对 UTXO 数据库的随机读写,同样的工作换成慢速硬盘,就要以天计算,而不是以小时计算。
- 一旦同步完成,带宽需求就很普通了,但首次同步要拉取整条链。按流量计费的套餐,天生就不适合干这件事。
实际选型上,这大多会落在 VPS-8——$13.99/mo,4 vCPU EPYC、8 GB DDR5 ECC 和 120 GB Gen4 NVMe——这一档,对于带 Lightning 的裁剪节点来说是稳妥的默认选择;如果你想以后彻底不用再操心磁盘,可以上 $26.99/mo 的 VPS-16。离岸 VPS系列的每个套餐都标配 RAID-10 的 Gen4 NVMe 和不限流量的传输,所以真正需要权衡的只有容量。如果你想要未裁剪的完整链——比如要重新扫描一个旧钱包,或者想在店铺旁边再跑一个 Electrum 服务器——不如直接跳过 VPS 系列:独立服务器起价 $64/mo,配备 2 × 1 TB NVMe,比容量最大的 VPS 还便宜,空间也宽裕得多,而且这笔账只会随时间推移越算越划不来。这里的取舍,和运行 Bitcoin 全节点一文中讲的完全一样,因为你在这里做的,本质上正是同一件事,只是上面挂了一个收款系统。
分步指南:从一台全新 VPS 到收款系统正式上线
- 01先部署 VPS,并先把它加固好一台 Debian 或 Ubuntu 机器,只用密钥登录的 SSH,默认拒绝的防火墙——都要赶在这台机器上放上任何有价值的东西之前做好。这份按顺序执行的清单,本身就是另一篇独立的指南。
- 02把域名指向服务器,并放行 80 和 443 端口BTCPay 首次启动时会自己签发证书,但前提是这个主机名已经能解析到这台机器,而且两个端口都能被访问到。把顺序搞反,是目前为止最常见的安装失败原因。
- 03克隆官方的 Docker 部署仓库项目官方提供了一套有明确主张的容器化配置。用它,而不要自己手工拼凑各个组件——升级路径就是针对它测试的。
- 04在第一次运行之前,先把各项选项定下来网络、主机名、Lightning 实现和存储预设,都是在安装时读取一次的环境变量。事后再改裁剪等级并不是没有代价的,所以现在就要选好。
- 05运行安装脚本,让它去同步一切都会在容器里启动起来,Bitcoin Core 也会开始它的首次区块下载。这是耗时最长的一步——在 NVMe 上也要跑上好几个小时——而且这一步没法催。
- 06第一时间注册管理员账户第一个注册的账号,会成为管理员。界面一旦能打开就立刻去注册,不要等到第二天早上。
- 07给店铺关联一个钱包先创建一个店铺,再通过导入硬件钱包、或者你自己软件里一个专用账户的扩展公钥,来连接一个钱包。BTCPay 只负责监视地址,从不签署任何东西。
- 08用一笔真实付款测试,再接入前端给自己转一小笔钱,确认发票能正常结清。只有到这时候,才去接入收银台界面、店铺插件,或者你的网站真正会调用的那个 API。
Lightning:值得用,以及它真正的代价是什么
链上付款到处都能用,成本则取决于当天 mempool 的行情,这让几美元以下的付款变得很别扭,有时候甚至荒谬。Lightning 解决了这个问题,BTCPay 也会在同一套部署里替你拉起一个节点。对于小额或高频的付款,它就是正确答案。但它也是一种和 Bitcoin 节点不一样的运维承诺,这些差异值得在打开它之前先弄清楚。
- 在能收到钱之前,你需要先有入站流动性。自己开的通道,给你的是花钱的额度,而不是收钱的额度。在有人向你开通道、或者你获得入站额度之前,你的节点什么都收不到。
- 这笔余额天生就是热的。通道里的资金放在服务器上的钱包里,必须联网在线才能工作。把日常周转的部分留在那里,其余的就转去链上。
- 通道状态不能靠复制文件来备份。恢复一份 Lightning 节点的旧快照,可能会让你直接丢掉快照里记录的那些通道。要用对应实现自带的备份机制,并且搞清楚它实际恢复的到底是什么。
- 这里的停机代价比链上更高。离线的节点既不能转发路由,也收不了钱,而一个过期状态重新上线,还可能被处罚。
- 通道在两端都有链上成本。开通道和关通道都是一笔交易,所以习惯性地开很多小通道,花费会在不知不觉中堆积。
- 只要你愿意,你的节点是能被看见的。一个公开宣告的节点,会把自己的别名和网络地址广播给所有人,这等于把你的服务器标在了一张任何人都能查看的地图上。
一条稳妥的中间路线,是用非公开通道来跑 Lightning——这样你能收到钱,又不用把自己的基础设施公之于众——大额的部分则默认走链上。如果你想让节点能被连接到、又不想暴露自己的身份,就把它跑在 Tor 上,这和让 Bitcoin 节点藏在 onion service 后面、而不是暴露公网 IP,是同一个道理。
默认安装会留下的那些身份线索
如果你选择 BTCPay,就是为了摆脱一个对你了如指掌的处理商,这一节就是关键所在。这套软件把那个处理商去得干干净净。但它自己并不会去掉其他所有把这套收款系统和某个具体的人绑在一起的东西——而这些东西,大多来自那些感觉上和收款毫不相关的步骤。
- 域名。就算公开的 WHOIS 已经打码,注册商手里依然握着你的身份信息,而且它需要一个能收到信的地址来维系这个域名不过期。主机名,是一套自托管收款系统被追查到所有者身上最常见的一条路径。
- 证书透明度(Certificate Transparency)。证书一旦签发,确切的主机名就会被发布进任何人都能查询的公开日志里。一个你以为很私密的子域名——比如 pay.something、btcpay.something——就这样带着时间戳被公告给了全世界。
- 主机商。如果这台服务器是用你本人名下的信用卡买的,那不管上面跑着什么,这台机器都是你本人名下的。这一点在注册的那一刻就已经定了,远早于第一张发票开出来之前。
- 扩展公钥。把一个 xpub 交给 BTCPay,就等于让它能看到这把密钥派生出的每一个地址,包括你从没打算暴露给一个 Web 应用的余额和历史记录。给店铺单独用一个专用账户,绝不要用你主钱包的 xpub。
- Lightning 节点。一个公开宣告的节点,会发布自己的别名和地址。一个带着你品牌名字的别名,挂在同一个也在支撑你收款系统的 IP 上,会在一张公开的图谱里,把这两者永久地绑在一起。
- 对外请求。汇率数据源、插件和通知集成,都会从这台机器主动向外连接,邮件通知则会经由你配置的那个 SMTP 账户发出去。每一个,都是一个能看到你服务器的第三方。
- 变现路径。从店铺转出、进入一个已完成实名验证的交易所账户的币,会带着自己完整的历史记录一起抵达。这个泄露点在 BTCPay 的下游,也是最常把上游所有谨慎努力一次性毁掉的那一个。
把这些补上,都是些寻常的功课,算不上什么特别的技巧。挑一家接受加密货币付款、只收集最低限度信息的注册商,登记时留一个和你身份无关的地址。把机器放在一家无需 KYC 的主机商那里,并用加密货币余额付款——比特币是化名制,不是匿名的,所以如果这一点对你重要,用门罗币充值才能真正切断链上的追踪线索。管理界面则要通过一条WireGuard 隧道访问,而不是把一个掌管着资金的登录页面直接暴露在公网上。每一项都是只需做一次的小决定;合在一起,才是"没有支付处理商"和真正私密之间的差别。
上线之后:怎么让它继续活下去
一个已经稳定运行了一年的收款系统,也是一个整整一年都没人去看过的收款系统。一个简短的维护流程,能防止这一点在你生意最忙的那天变成一次事故。
- 按项目自己的节奏更新,而不是按你自己的节奏。这套部署有一条会把各个容器版本匹配着一起升级的升级路径;手动单独升级某一个组件,正是一套正常的技术栈变成一套故障技术栈的方式。
- 备份那些无法重新生成的东西:店铺数据库和配置、钱包描述符,以及 Lightning 备份(如果你在跑 Lightning 的话)。区块链本身不是备份——它只是会被重新下载而已。
- 要在什么问题都没有的时候,主动、刻意地做一次恢复演练。一个支付系统里没测试过的备份,只是关于你收入的一个假设。
- 盯着磁盘用量。裁剪节点的体积是稳定的,但日志和数据库不是,而磁盘一旦占满,节点就会停,发票也就跟着停。
- 让机器保持打好补丁、端口关闭的状态。头十分钟加固清单上的每一条,在这里都适用,只是这一次的风险要大得多。
顺手也给店铺加一个外部监控。一个像是从外部探测发票接口这么简单的监控,就能让你在客户发现之前,先一步知道收款系统已经宕机了,而这基本上就是"自托管"和"联系不上"之间,最实际的那点差别。至于机器本身,就按新 VPS 的头十分钟里说的那样去对待它,因为在一台握着钱的机器上,风险要更高。
会让你损失真金白银的那些错误
- 导入了一个助记词而不是扩展公钥,把一个直接面向公网的 Web 应用,变成了一个握着你收到过的每一笔付款的热钱包。
- 在运行安装程序之后才去配置 DNS,然后纳闷为什么证书一直签发不出来、网站也打不开。
- 选了最激进的裁剪预设,然后又想关联一个有多年历史记录的钱包,而节点早已无法追溯扫描到那么早。
- 把 Lightning 余额当成存款,而不是恰好挂在网上的周转资金。
- 靠直接复制数据目录来备份 Lightning 节点,还以为这样就有了一条恢复路径。
- 按 Web 应用的标准买了一档套餐,结果首次同步跑到一半就把磁盘用光了。
- 让管理界面就这样对着整个互联网开着,背后只挡着一个从别处重复使用的密码。
- 前面所有事都做对了,最后却用自己的真实姓名注册域名、租用服务器。
BTCPay 是少数几个能把中间人彻底去掉、而不是换成一个更友善的中间人的软件之一。安装花一个下午,同步花一整夜。剩下的,就是一个能收 Bitcoin 和 Lightning、不收手续费、不托管任何资金、也不用向任何人交代的收款系统——而且跑在一台机器上,这台机器的费用,你甚至可以直接从它自己收进来的那个余额里出。把磁盘按节点的需求来选,把助记词留在服务器之外,再把这台机器放在一个从来不会问你叫什么名字的地方。