NordBastion 的北极熊吉祥物站在一个雕刻精美的北欧石制商柜台后面,上方悬浮着一块青色全息结账面板,面板上显示着一个二维码,配有一个琥珀色的 Bitcoin 符号和一个闪电形图标;一道不曾中断的发光硬币弧线,从面板径直连到它身旁一扇刻着符文的金库门,背景是一台服务器机架和一扇被极光照亮的拱形窗。
操作指南 · 加密货币支付·阅读 21 分钟 · 动手实践 60 分钟

亲自收下这笔款项。
已经没有谁能冻结它了。

每一家信用卡收单机构、每一个托管的加密货币网关,都横在您和客户之间,抽走一个百分比,保留一份谁付了您多少钱的名单,并保留随时终止服务的权利。BTCPay Server 就是把它们统统去掉的那款软件:一个开源、自托管、非托管式的支付处理器,币直接进入一个服务器本身无法动用的钱包。六个步骤,在一台您匿名租用的服务器上搭建一套可用的 Bitcoin 与 Lightning 结账系统——决定预算的节点形态、只读密钥、接收流动性问题,以及被 Lightning 打破的备份规则。这台服务器每月 $7.90。已在 Debian 12 上测试。

六个步骤
  1. 01

    选择

    全节点、裁剪节点或外部节点

  2. 02

    配置

    先域名,再四个端口

  3. 03

    部署

    一个生成器,一条命令

  4. 04

    连接

    只读密钥,绝不是种子

  5. 05

    Lightning

    通道与接收容量

  6. 06

    上线

    结账、备份、升级

开始之前 · 支付处理器是什么

Bitcoin 拿掉了银行。而大多数店铺,又把它请了回来。

区块链上的一笔付款,不需要中间有一家公司。客户签署一笔交易,网络对其进行确认,钱就是您的了——这中间没有收单机构,没有结算周期,也没有谁的批准是这笔付款所依赖的。这正是这项技术的全部意义所在,也是它存在的理由。

然后,一个店铺需要真正能收到款,而一堆现实的要求也随之一拥而上。每张发票都需要自己专属的地址,这样才能把不同的付款区分开。得有人监视链上动态,判断一张发票何时算作已付。金额得用客户习惯的货币报出来,而且汇率得保持足够长的时间,好让对方按下发送。订单状态得回流到店铺里。而且这一切还得在凌晨两点、没人盯着的时候照常运作。把这些都搭起来是一个项目;不去搭建它,正是几乎所有人转而注册一个托管网关的原因——而这样做,也就在一张表单的篇幅之内,把一个本来设计成不需要中间人的系统,重新塞进了一个中间人。

这个中间方到底握着什么,值得说清楚,因为远不止手续费这一项。它握着您的币,至少在提现完成之前是这样,这意味着它可以拖延一次提现。它握着那份名单:每一位客户、每一笔金额、每一个时间戳、每一件商品,全都存在一个您既读不到也删不掉的数据库里。它握着您的身份文件,因为一家经手他人资金的公司被要求收集这些信息。它还握着那个开关,因为服务条款保留了随时认定您的生意不再受欢迎的权利——这个决定会通过邮件通知您,既影响账户也影响余额,而且实际上根本无法申诉。

BTCPay Server 正是针对这一个问题、而且仅仅针对这一个问题的答案。它是一款免费、开源的支付处理器,运行在您自己的机器上:为每张发票派生一个地址,监视链上动态,报出法币价格,对外提供一个结账页面和一个 API,并且支持 Lightning。它从不持有您的币,因为它监视的钱包本来就是您自己的。接受加密货币付款有四种方式,各自的实际代价如下:

属性 一个托管的加密货币网关 页脚里的一个裸地址 在别人的实例上使用 BTCPay 在您自己的 VPS 上使用 BTCPay
币握在谁手里网关,直到提现为止您您自己——它负责监视,无法花钱您自己——它负责监视,无法花钱
谁能阻止您做生意网关,通过邮件没有人实例运营方没有人
谁能看到每一位客户和每一笔金额网关,永久地所有人——一个地址,一个公开的总额实例运营方您
需要身份证件是的,在第一次提现之前无运营方要什么,就得给什么无
每笔交易的成本永远抽成的百分比没有没有没有——每月 $7.90,固定不变
把一张发票和另一张区分开来是不能——您得手动核对是是
适合选择它的情形您想要零运维,并且接受对方的条款捐款,一年寥寥几笔您想要这套软件,但不想要那台服务器进账是您的,那份名单也是您的

第二列也不是在开玩笑——作为一个捐款链接,页脚里放一个地址真的完全没问题,假装并非如此只会把没人需要的软件卖给别人。但一旦有两个人在同一天付了同样的金额,或者一旦您不希望自己的年收入变成任何人都能加总出来的公开数字,这种做法就不再没问题了。

步骤 01 · 选择

一个决定,定下整张账单。您要保留多少链上数据?

一个支付处理器必须能够如实回答一个问题:这张发票是否已经付款?要回答这个问题,就得监视 Bitcoin 网络;而要做到真正意义上的监视,就得运行一个自行验证区块的节点,而不是相信别人告诉您的结果。这个节点,就是这个项目硬件预算的全部——BTCPay 本身、索引器和数据库加在一起,在它面前只是一个可以忽略不计的零头。

说得通的安排有三种,说不通的有一种。归档节点保留曾经挖出的每一个区块:2026 年时轻松超过 700 GB,而且每年还要再增长大约 50 GB。如果您还打算运行一个区块浏览器或者做历史分析,这就是您想要的;但对一个店铺来说,这属于杀鸡用牛刀。裁剪节点以完全相同的方式下载并完整验证每一个区块,然后丢弃旧的,只保留一个滚动窗口。两者的安全模型是完全一样的——这正是人们经常搞错的地方,因为「裁剪」听起来像是「不完整」,但事实并非如此——部署生成器也自带现成的片段来实现它。

外部节点是第三种:把这套系统指向一个您已经在运行的 Bitcoin 节点,通过专用链路连接。如果您已经照着Lightning 节点指南操作过,就没有理由再保留第二份链数据,而在两台机器之间架设一条 Mesh VPN是连接它们最干净的办法。唯一说不通的安排,是把店铺指向陌生人的公共节点:它能看到您正在关注的每一个地址,而这些地址就是您的营收所在,它也完全有能力在发票是否已支付这件事上对您撒谎。

部署 磁盘上的链 所需的总容量 您放弃的是什么
裁剪,最小窗口~5–25 GB~40 GB重新扫描,以及一切容错空间。不建议使用最小的那个设置。
裁剪,约 50 GB 窗口~50 GB~80 GB店铺完全感觉不到的程度。合理的下限。
裁剪,约 100 GB 窗口~100 GB~140 GB没有。舒适的默认选择,并且留有添加 Lightning 的空间。
归档,完整历史700 GB +~960 GB没有——但您得每个月付费,一直付下去。
您已经在运行的外部节点这台服务器上什么都没有~40 GB独立性——另一台服务器一旦宕机,结账页面也会跟着宕机。
裁剪真正会让您付出的唯一代价

裁剪节点无法重新扫描它已经丢弃的区块。这在实际中意味着,它无法重建一个交易历史早于本次部署的钱包的全部记录——索引器只会从您连接密钥那天开始向前扫描,所以那个账户更早的付款根本不会出现在店铺里。如果您按照步骤 04 的建议,给店铺一个全新创建的账户,这就完全不是问题;但如果您连接的是一个已经用了三年的钱包,却发现一半的历史都不见了,那会是相当令人困惑的一个下午。请在安装之前就决定好您要用哪一种,而不是事后才想。

还有一个决定该放在这里,而不是往后拖,因为它会改变安装程序构建出来的东西:您是否从第一天起就要 Lightning。纯链上方案本身就是一套完整的配置,也是完全说得过去的起点。以后再加 Lightning 是支持的,也不算麻烦,但它毕竟是另一个有自己资金、自己备份规则的守护进程——先证明真金白银能通过简单的路径到账,再引入复杂的那一条,是很值得的。

步骤 02 · 配置

域名必须先存在。安装程序会去申请证书。

下单购买服务器。在控制面板中:Order → VPS → Garrison,镜像选 Debian 12,机房选您希望店铺数据所在的那一个——赫尔辛基、斯德哥尔摩、奥斯陆或雷克雅未克。Garrison 是正确的默认选择,因为它能装下一个 100 GB 的裁剪链、一个 Lightning 节点和数据库,让您未来多年都不用再操心磁盘。Sentinel 配合更紧的裁剪也能用;Bulwark 则是归档节点该选的套餐。开户不需要邮箱地址,账单可以用 Monero、Bitcoin、Lightning 或其他支持的资产结算——这正是这个项目讨人喜欢的地方:您在搭建一台用来收加密货币的机器,而付款用的也正是加密货币。

然后,在做任何其他事情之前,先跑一遍首小时加固清单——把 SSH 换到一个新端口并且只用密钥登录、开启无人值守升级、配置默认拒绝的防火墙。这台服务器早晚会保存您每一位客户的记录,以及一个持有真实资金的 Lightning 节点的密钥材料。这不是一台可以留着密码登录、放上一周不管的服务器。

接下来是 DNS 记录,请务必在运行安装程序之前完成,而不是之后。选一个结账页面要用的主机名——shop.example.com、pay.example.com,怎么合适怎么来——然后把一条 A 记录指向这台 VPS 的地址;如果希望通过 IPv6 访问,再加一条 AAAA 记录。让它完成传播。安装程序配置的反向代理,会在第一次启动时尝试为这个确切的名字获取证书,使用的是一种要求该名字已经解析到这台机器的 HTTP 验证方式。一条尚未生效的记录,是首次安装以一个令人困惑的错误收场的最常见原因,没有之一。

这个主机名并非完全不能更改,但请把它当作不能更改来对待

这套部署自带一个以后更换域名用的脚本,所以这件事是可以补救的,而不是致命的。真正无法靠一条命令解决的,是下游的一切:证书要重新签发,您已经发出去的每一个支付按钮和 webhook URL 都还指向旧名字,Lightning 地址本质上是域名下的一个名字,会跟着域名一起变,而任何店铺插件也都需要重新配置。请选一个您愿意在信头上用上很多年的名字,并且优先选用您已经在用的域名下的一个子域名,而不是一个专门用来描述这台机器用途的新域名。

然后,趁现在还没有任何服务在监听,先把防火墙规则写好。四个端口,只有四个。结账页面出于必要必须是一个公开的 HTTPS 端点——客户的浏览器得能访问到它——而 80 端口也得保持开放,因为证书续期要用到它。Lightning 的点对点端口,只有在您希望其他节点能向您开通道时才需要,而步骤 05 会论证您确实需要这样做。Bitcoin 的点对点端口则完全不需要开放:您的节点自己发起出站连接就运作得很好,把它对内开放,只会让别人更容易找到它。

ufw default deny incoming
ufw allow 47222/tcp                  # administrative SSH, moved off 22
ufw allow 80/tcp                     # ACME HTTP-01 challenge and the redirect
ufw allow 443/tcp                    # the checkout
ufw allow 9735/tcp                   # Lightning peer-to-peer, only if you want inbound channels
ufw enable
ufw status numbered

在继续之前,还有两条关于资源的提醒。如果服务器没有交换空间,先给它加一个——初始区块下载是这个项目里最吃内存的一段时间,4 GB 内存搭配 2 GB 交换空间,表现会比单独 4 GB 内存好得多。另外,请把步骤 01 里算出来的磁盘需求,和您实际购买的套餐对一遍,因为一个在同步过程中写满卷的节点不会体面地失败;它会直接把自己的索引弄坏,然后从头再来。

fallocate -l 2G /swapfile && chmod 600 /swapfile
mkswap /swapfile && swapon /swapfile
echo '/swapfile none swap sw 0 0' >> /etc/fstab
df -h /                              # confirm the volume matches step 01
步骤 03 · 部署

一个生成器,而不是一份 compose 文件。您描述它;它组装它。

官方部署方式,并不是一份供您编辑的 docker-compose.yml。它是一个生成器:您用环境变量描述想要的部署方案,脚本再从一个片段库里组装出 compose 文件——一份给 Bitcoin Core,一份给索引器,一份给 PostgreSQL,一份给 BTCPay 应用本身,每种 Lightning 实现各一份,一份给反向代理,外加一长串可选的附加项。这个设计比乍看之下要高明,因为升级时是重新生成整份文件,而不是要您把别人的改动合并进自己的版本里。这也意味着下面这段环境变量,才是您这次部署的真正配置,值得和您其他基础设施笔记放在同一个地方保存。

克隆仓库并导出环境变量。下面的每一行都直接对应步骤 01 中的一项决定:主机名是您在步骤 02 中指向的域名,存储片段是您选定的裁剪窗口,而 Lightning 变量要么填一个具体实现,要么在只做链上支付时整行省略。

mkdir BTCPayServer && cd BTCPayServer
git clone https://github.com/btcpayserver/btcpayserver-docker
cd btcpayserver-docker

export BTCPAY_HOST="pay.example.com"          # exactly the name you pointed in step 02
export NBITCOIN_NETWORK="mainnet"
export BTCPAYGEN_CRYPTO1="btc"
export BTCPAYGEN_REVERSEPROXY="nginx"
export BTCPAYGEN_LIGHTNING="clightning"       # or "lnd", or omit for on-chain only
export BTCPAYGEN_ADDITIONAL_FRAGMENTS="opt-save-storage-s"   # ~50 GB pruned window
export BTCPAY_ENABLE_SSH=true
export LETSENCRYPT_EMAIL="you@example.com"

. ./btcpay-setup.sh -i

这段代码里有两个细节,各自值得说一句。. ./btcpay-setup.sh -i 开头那个点不是打错了——这个脚本是被 source、而不是被执行的,所以它设置的环境变量会留在您的 shell 里,之后那些辅助命令才能正常使用。另外,存储片段的名字对版本很敏感:生成器先后发布过裁剪到大约 100、50、25 和 5 GB 的变体,名字在不同版本之间也有过调整。请以您刚刚克隆下来的仓库里的片段列表为准,而不要相信从某篇博客文章——包括这一篇——里抄来的值。

安装程序会运行几分钟,拉取大量镜像,获取证书,并启动全部服务。接下来就是等待:节点必须先下载并验证整条链,店铺才能确认付款,就算是裁剪节点,这也要花上数小时而不是几分钟,因为裁剪只是在验证之后丢弃区块,而不是跳过验证工作。网页界面会立即可用,并显示一条同步中的提示横幅。在它消失之前,请不要开出任何真实发票。

./bitcoin-cli.sh getblockchaininfo | grep -E 'blocks|headers|verificationprogress|pruned'
docker ps --format '{{.Names}}\t{{.Status}}'
在接下来的五分钟内认领管理员账户

全新实例没有任何用户,第一个注册的账户会成为管理员。在您认领这个位置之前,任何能访问到该 URL 的人都可以抢先注册——而这个 URL 并不是秘密:证书一经签发,主机名就会被公开记录在证书透明度日志里,而这些日志会被专门寻找这类目标的人持续索引和扫描。打开站点,先完成注册,然后到服务器设置里确认注册功能没有向陌生人开放。这本该是一个五分钟的窗口期,但人们常常因为「店铺还没正式上线」而让它敞开好几天。

趁您还在配置阶段,有两个可选片段值得了解。一个用来添加 Tor 隐藏服务,让结账页面除了明网地址之外,还能通过一个 v3 onion 地址访问——这对那些宁愿不解析您域名的客户很有用,思路和洋葱服务指南里的一样。另一个用来添加第二种加密货币。两者的设置方式相同,都是往 additional-fragments 变量里追加内容,再重新运行安装脚本;生成器会重新构建 compose 文件,并且只重启发生变化的部分。

步骤 04 · 连接

给它一把公钥。永远不要给它种子。

创建一个店铺,然后在这个页面上做出唯一真正重要的决定。BTCPay 会提供两种接入 Bitcoin 钱包的方式:连接一个已有的钱包,或者让它生成一个新钱包并把种子留在服务器上。前者是只读的,也正是您想要的。后者会把一台公开暴露在互联网上的机器,变成一个持有您全部营收的热钱包——不管做多少加固,对一台唯一任务就是要能被陌生人访问到的服务器来说,这都不是一笔划算的交易。

这项建议背后的机制足够精妙,值得弄懂。现代钱包是分层结构的:一个种子派生出一整棵密钥树,其中有一个扩展公钥——一个 xpub,或者面向原生 segwit 的 zpub 变体——账户里的每一个收款地址都可以由它计算得出,却完全没有签名能力。把它交给店铺,店铺就能为每张发票生成一个全新地址,监视每个地址上的付款,并显示余额给您看。它无法转移哪怕一枚聪。私钥那一半,始终留在您的钱包或硬件设备里,从不外传。

所以:打开 Sparrow、Electrum,或者您硬件钱包的桌面应用,创建一个专门用于这家店铺的新账户,并导出它的扩展公钥。在店铺的钱包设置里选择连接一个已有钱包,粘贴这把密钥,然后把 BTCPay 派生出的头几个地址和您钱包里显示的地址对一遍。如果能对上,说明派生路径正确,连接就完成了。如果对不上,说明您选错了脚本类型——xpub 和 zpub 之间的差别,就是两组完全不同地址之间的差别。

扩展公钥不是一串无害的字符

它无法花钱,这正是重点所在——但它可以枚举。任何拿到它的人,都能推导出这个账户将会用到的每一个地址,从而在您使用这个账户期间,读出它已经收到、以及将会收到的每一笔付款。这是对店铺进账的一次永久、且无法撤销的披露,也正因如此,您连接的账户应该是店铺专属的,而不是持有您全部积蓄的那一个。请把这把密钥当作机密对待,不要让它出现在截图或工单里;万一真的泄露了,就把店铺换到一个新账户,而不是心存侥幸。

接下来是发票设置,这才是真正调校一家店铺的地方。有效期默认大约十五分钟,锁定的是汇率而不是什么技术上限:它代表您愿意为一项以法币计价的价格、对抗一种波动资产,锁定多长时间。市场波动大就调短,客户手脚慢就调长。确认数决定一张发票何时算作已结算——零确认是即时的,适合一杯咖啡这种场景;一个确认是通常的默认值;六个确认则用于那些金额较大、多等一个小时比冒险划算的场景。少付容差让您可以接受一张金额差一点点的发票,这种情况其实很常见,因为有些客户的钱包会从金额里扣手续费,而不是额外加上去;在这里设一个小百分比,就能省掉一整类支持邮件。

然后用真钱测试它,而不是测试网。开一张金额微不足道的付款请求,用手机钱包付款,看着这张发票从「新建」变成「处理中」再变成「已结算」。这一笔交易就能同时证明:节点已经同步完毕,派生路径正确,汇率来源正常工作,证书在手机浏览器上有效,而且钱确实落进了您掌控的钱包。没有别的办法能一次性证明这五件事。

步骤 05 · Lightning

开通道是容易的部分。能被别人付上款,才是难的部分。

链上 Bitcoin 处理一张 $400 的发票效果很好,处理一张 $4 的却很糟:客户要等一个确认,还要付一笔占购买金额相当比例的手续费。Lightning 把两者都反了过来——大约两秒钟完成结算,手续费只有几分之一美分——这也是为什么卖小额商品的店铺需要它,而卖大件商品的店铺未必需要。如果您在步骤 03 里配置了 Lightning 实现,守护进程早已在运行,BTCPay 也早已连接上它;店铺设置里要做的,只是把 Lightning 启用为一种支付方式。

您选择哪一种实现,会带来一些值得说明的后果。Core Lightning 是保守、轻量的选项,插件架构很干净。LND 部署最广泛,周边的管理工具生态也最庞大。现在还有第三类选项——一种把通道管理外包给服务商、同时把密钥留在您机器上的轻量守护进程——它用一部分独立性,换来接下来三段里提到的那些麻烦事统统消失。对于想要 Lightning、但不想变成节点运营者的店铺来说,这是一个正当的选择;只是一种不同的取舍,而不是白拿的好处。

全新节点无法被支付,而且没有任何提示告诉您这一点

一条 Lightning 通道持有固定数额的资金,由两端共同分配。当您开启一条通道并为其注资时,这笔钱全部在您这一侧——也就是说,您有发送的容量,接收的容量则恰好为零。而店铺需要的正好相反。因此,一个刚刚完成注资、拥有三条健康通道的节点,仍可能让每一笔入账发票都失败,而这种失败看起来像是路由错误,而不是配置出了问题。这是自托管的 Lightning 结账系统在第一天就显得出了故障的最常见原因。

获得接收容量,有三种正当的办法,而且它们并不互相排斥。您可以先开通出向通道,然后通过它们花钱——买点东西、付一张发票、把钱转到交易所——这会把您的余额推向对面,把发送容量转换成接收容量。您也可以请一个连接良好的节点向您开通道,这在 Lightning 社区里是很平常的请求,除了对方要付的链上手续费之外不需要任何花费。或者,您也可以向出售接收流动性的几家服务商之一购买,这只需要一小笔百分比费用,耗时几分钟而不是几周。本页没有任何联盟推荐,以后也不会有;请根据口碑和当前价格自行挑选。

一旦您能够收款,还有两个功能能把这个节点变成真正的店面。Lightning 地址——形式和电子邮件地址一样,挂在您自己的域名下——能让任何人用任意一款现代钱包直接给您转钱,而不需要事先存在一张发票,这是目前最友好的捐款和打赏方式,没有之一。而结账页面上的二维码可以同时提供两条通道,让有 Lightning 钱包的客户几秒钟完成付款,没有的客户则走链上支付,两者用的是同一块屏幕,也完全不需要您做任何选择。

在第一笔 Lightning 付款到账之前,先完成那个必须现在做、而不是以后再做的备份步骤。每一种实现都会保存一个描述通道当前状态的小文件——LND 称之为静态通道备份——一旦机器丢失,正是靠它才能找回资金。它在每次通道开启或关闭时都会变化,所以应该自动、而不是手动地把它复制到服务器之外。在您认定每夜归档已经涵盖这一点之前,请先读一读步骤 06 里的警告,因为就 Lightning 而言,事实并非如此。

步骤 06 · 上线

现在,把它交到客户面前。然后让它平淡无奇地运行下去。

挑一个和您现有条件相匹配、尽可能简单的收款界面。付款请求是一个可以发给别人的链接——不需要网站,是给客户开发票最快的方式。收银台应用能把同一个实例变成一台带商品列表的收银机,在集市摊位上用手机就能操作。支付按钮是给静态网站用的一段 HTML 代码。店铺插件能把 Bitcoin 添加为真正店面结账时的一种支付方式,并自动回写订单状态。而 REST API 可以开具发票、报告其状态,并在结算时调用 webhook——这是最经得起时间考验的集成方式,因为它只依赖 HTTP 和一个共享密钥,别无其他。

不管选哪一种,都要把 webhook 接好,并测试它确实会触发。一张已经结算、却从未通知您应用程序的发票,是那种没人会发现的故障模式,因为从两边分别看,一切都显得正常:钱到账了,客户也看到了确认页面,而订单就那么悬在那里没人处理。请故意给自己发一个「发票已结算」的 webhook,确认您的端点收到了它,并且验证签名,而不是直接相信收到的内容——毕竟这个端点是公开的,任何人都能向它发送数据。

每夜备份不是 Lightning 的恢复路径

这是本页唯一一条可能让您损失金钱、而不只是损失时间的警告,项目自己的文档也用同样的措辞说明了这一点:旧的 Lightning 通道状态是有毒的。恢复昨晚的通道数据库副本并让节点继续运行,就等于广播一个对手方早已废弃的状态——协议会把这当作一次作弊企图,惩罚方式是把整条通道的余额判给对方。所以归档适合用于店铺数据库、配置和发票历史,但它不是通道的恢复方案。请持续把静态通道备份复制到机器之外,只保留最新的一份;如果您真的需要从归档整机恢复,请务必清楚,Lightning 这部分需要按文档记载的恢复流程操作,而不能直接整体还原。

理解了这一点之后,日常流程其实很简短。这套部署自带一个备份脚本,会归档各个卷、导出数据库,同时跳过区块链数据本身,并且接受一个密码短语,让归档在离开服务器之前就完成加密。请定时运行它,然后按照备份指南里说的方法,把结果推送到位于另一个司法辖区的机器上——这里多花十分钟配置一个仅追加式的仓库是值得的,因为一台被攻破的支付服务器,不应该有能力抹去它处理过的记录。

cd ~/BTCPayServer/btcpayserver-docker
export BTCPAY_BACKUP_PASSPHRASE="a long passphrase you keep elsewhere"
./btcpay-backup.sh                   # archives volumes + database, skips the chain
# then ship the archive offsite, and keep the channel backup separately

接下来是升级,而支付服务器正是那种「以后再更新,但要刻意为之」才是正确策略的机器。这套部署自带更新脚本,能重新生成 compose 文件并拉取新镜像;请在读完发布说明之后再运行它,而不是等某个定时任务觉得该更新了就跑。先做归档。一次只升一个版本。并且把上一个版本号记下来,因为一分钟就能完成的回滚,才是让整件事风险可控的关键。

./btcpay-update.sh                   # deliberate, after reading the release notes
df -h /                              # the check that should be an alert, not a habit

最后,设置一个警报和一个提醒。警报针对磁盘用量——区块链节点是机器上唯一会自行不断膨胀的进程,一旦卷写满,结账系统就会瘫痪,而且因为其他任何东西都没变,这种故障往往很难诊断。请把阈值设在 80%,而不是 95%。提醒则是按月的,用来打开店铺检查两件事:发票是否仍在正常结算,以及您开设的 Lightning 通道是否仍然存活。支付处理器出故障时是悄无声息的,您发现的方式,往往是某个客户告诉您他付不了款。

诚实的部分 · 它做不到什么

您去掉了中间人。但您并没有因此变得无迹可寻。

自托管支付处理器是一项真实而具体的改善,但它不是一场让问题凭空消失的魔术。就算把上面说的一切都做到了,有五件事依然成立,而弄清楚它们,正是「真正的防御」和「一个安慰自己的故事」之间的区别。

Bitcoin 账本是公开且永久的。 去掉网关,去掉的是一家公司的私有数据库;它并没有给链加密。您店铺收到的每一笔付款,只要有人知道地址,就能永远看到它,而且地址会聚类:一个把两笔付款合并成一次花费的钱包,等于是向全世界宣布这两位客户付款给了同一家店铺。这是这项资产本身的属性,与软件无关,也正是为什么真正有隐私需求的生意,还会去考虑 Monero。

结账页面的主机名,从存在的那一刻起就已经公开。 证书透明度日志是公开的,并且被持续索引,所以您在步骤 02 里选定的名字,就算您从未链接到它,也一样能被人发现。这就是为什么管理员账户必须在最初几分钟内认领,而不是等到第一周;也是为什么登录页面从第一天起就该配一个强密码和第二因素认证。

通向法币的出口,正是身份重新出现的地方。 这套系统里,没有任何一个环节要求您表明身份才能收款。但把收益换成银行里的钱,几乎总是需要,因为这个兑换过程发生在受监管的交易所或经纪商那里。自托管把身份要求从收款环节推到了出金环节——这是暴露程度上真实的改善,但和完全没有暴露并不是一回事。

您的申报义务,并不会跟着服务器一起搬走。 一家企业在哪里注册、老板住在哪里,才决定了要缴什么税、要申报什么,而开具发票的那台机器所在的司法辖区跟这些毫无关系。在大多数地方,因商品或服务收到加密货币,都按收到当天的价值计为普通收入,之后处置它又是另一个独立的应税事件。一个自托管的实例,是比一个您可能会弄丢的处理商账户更好的记录——但它不是让您不用留记录的办法。

没有拒付,而这一点是双刃剑。 一笔确认后的付款就是最终结果,正是这个特性让针对商家的欺诈几乎不可能发生,也正因如此手续费才是零。但这同样意味着,不满意的客户除了指望您的善意之外,没有任何别的申诉机制。请发布一份退款政策,用提现功能兑现它,并且明白:您已经接下了那份原本靠抽成来支付的争议处理工作。

您实际买到的东西,精确地说是:钱进入一个只有您能动用的钱包,没有人能阻止这笔交易,没有人从中抽成,而谁付了您多少钱的名单,只存在于一台您以无关名义租用的机器上。这是一个范围很窄、但真实存在的主张。它是否物有所值,取决于步骤 06 有没有做到——一个没有经过恢复测试的自托管支付处理器,算不上业务上的改善,而是一个握着您全部营收的单点故障。

选型 · 该订购什么

应用程序本身很小。链才是这份账单的全部。

套餐 按月 资源 能轻松承载的内容
Sentinel$3.902 vCPU · 4 GB · 120 GB · 1 Gbps25–50 GB 的裁剪节点,带 Lightning。加上交换空间;留意磁盘。
Garrison$7.904 vCPU · 8 GB · 240 GB · 1 Gbps100 GB 的裁剪节点、Lightning,以及多年的余量。默认选项。
Ravelin$16.908 vCPU · 16 GB · 480 GB · 2.5 Gbps一样的配置,再加一条第二链,或者一个装了不少插件的繁忙店铺。
Bulwark$32.9016 vCPU · 32 GB · 960 GB · 5 Gbps一个还留有增长空间的归档节点。仅在您确实需要完整历史时选用。

节点一旦完成同步,BTCPay、索引器和 PostgreSQL 加在一起也就占几个 GB,CPU 几乎用不上;一家每天处理上百笔付款的店铺,不会给最小的套餐带来任何算力上的压力。各套餐真正的区别在磁盘,而磁盘完全由步骤 01 决定。同步是这个项目里唯一真正吃紧的一段时间——它是 IO 密集型而非 CPU 密集型,这也是 NVMe 在这里很重要、而核心数量无关紧要的原因。每个套餐的带宽都不限量,所以运行一个可公开访问的 Lightning 节点不会产生任何额外成本。

实战笔记 · 六个陷阱

六种出问题的方式。其中两种会让你花钱。

陷阱 01 · 致命

没人认领的管理员账户

在全新实例上第一个注册的人会成为管理员,而证书一经签发,主机名就已经被记录进证书透明度日志。请在安装完成后的几分钟内完成注册,然后到服务器设置里确认注册功能没有向陌生人开放。

陷阱 02 · 致命

公网服务器上的热钱包

让服务器生成钱包只需要点一下,但也会把种子留在一台专门负责应答陌生人的机器上。请改为连接一个扩展公钥:店铺只负责监视、派生和核对,无法花钱。私钥那一半,留在钱包或硬件设备里。

陷阱 03 · 有毒

恢复昨晚的 Lightning 状态

昨天的通道数据库,描述的是一个已经被对手方取代的旧状态。把它重新上线运行,可能会把整条通道的余额作为处罚判给对方。每夜归档覆盖的是店铺本身;通道需要的是文档记载的恢复流程,以及一份持续复制的通道备份。

陷阱 04 · 悄无声息

没人能付款的 Lightning 发票

给通道注资,得到的是发送容量,而不是接收容量。一个已经有钱的新节点,仍然会让每一笔入账付款失败,而且这种错误看起来像是路由问题。请在对外宣传 Lightning 选项之前就准备好接收流动性,而不是等第一个投诉出现之后。

陷阱 05 · 令人困惑

裁剪节点,与一个有历史的钱包

把一个用了三年的账户连接到裁剪节点,它的旧交易就永远不会出现,因为包含这些交易的区块早已被丢弃。没有任何东西是坏的,也没有任何提示告诉您这一点。请给店铺一个全新创建的账户,或者改跑归档节点。

陷阱 06 · 本可避免

同步过程中写满的那个卷

节点是唯一会自行不断膨胀的进程,磁盘一旦写满,它不会礼貌地暂停,而是直接把索引弄坏——也就是说,您得从头重新下载。请把步骤 01 里的计算结果和您购买的套餐对照一遍,并把警报阈值设在 80%,而不是 95%。

常见问题 · 自托管 Bitcoin 支付

问题,已解答。

搭建过程中会遇到的十一个问题——从决定你到底要不要搭建它的那两个问题开始。

BTCPay Server 真的是免费的吗,还是说其实有什么隐藏代价?

它是真正免费的,而「免费」这件事的性质,比价格本身更重要。BTCPay Server 是根据宽松许可证发布的开源软件,由一个基金会而不是一家背负营收指标的公司维护;没有按笔收费,没有抽成,没有最低交易量要求,不需要开户,也不用签合同,因为这里根本就不存在交易对手方——您只是像运行一台网页服务器那样,在自己的服务器上运行一个程序。您真正要付出的代价是真实存在的,只是形式不同:每月几美元的服务器费用、一个晚上的搭建时间,以及持续为一个处理支付的服务打补丁的长期责任。人们真正应该做的比较,从来不是「免费,还是抽成百分之一」,而是「一项由您自己承担的运维工作,还是一份您不用操心的依赖」。老实说,一家一年只收二十笔款的店铺,用托管方案大概率更合适;而一家一周就能收到二十笔的店铺,在这里会更便宜,也更自由。

它是托管式的吗?币到底握在谁手里?

是您自己,而这个机制值得弄懂,而不是单凭信任。推荐的做法,是把一个您已经掌控的钱包的扩展公钥交给 BTCPay。凭这把密钥,服务器就能为每一张发票派生一个全新的收款地址,并监视链上对它的付款——而且它无法构造出一笔有效的花费,因为私钥那一半从不离开您的钱包。钱直接从客户手里进入一个只有您能清空的地址;服务器上从来不会持有任何资金,所以也就没有什么可以被扣留、冻结,或者在入侵中丢失的东西。BTCPay 也会主动提出为您生成一个钱包并把种子留在服务器上,这样做很方便,但也正是本指南针对任何持有真实营收的场景所反对的那种配置:它会把一台公开暴露在互联网上的服务器变成一个热钱包。Lightning 是真正的例外——通道里的资金必须是活的才能路由——这也是为什么 Lightning 里的余额应该被当作收银机里的现金,而不是金库里的存款。

我到底需要多少磁盘?

这完全取决于一个决定,而两种选择之间相差了两个数量级。一个归档的 Bitcoin Core 节点会保留曾经挖出的每一个区块:2026 年时轻松超过 700 GB,并且每年还要再增加大约 50 GB,所以它需要一个与之匹配的套餐,而且以后还会需要更大的。裁剪节点以完全相同的方式验证每一个区块,然后丢弃旧的,只保留一个滚动窗口——部署生成器自带的片段可以裁剪到大约 100、50、25 或 5 GB,而对一个商家来说,50 GB 以上的任何选择都是相当靠谱的生产环境配置。再为索引器、数据库、Lightning 节点和操作系统预留大约 10 到 20 GB,账就算得出来了:120 GB 的套餐可以跑一个 25–50 GB 的裁剪部署,240 GB 的套餐可以跑一个 100 GB 的裁剪部署并留有多年余量,而归档节点则需要 960 GB。除非有特别的理由,否则请选裁剪;两者的安全模型是完全一样的。

我可以在没有自己 Bitcoin 节点的情况下运行 BTCPay 吗?

只对了一部分,而且值得弄清楚界线到底在哪里。这套系统可以指向一个您已经在别处运行的 Bitcoin 节点——同一个 tailnet 里的一台机器,或者藏在隧道后面的一台——这是完全受支持的安排,如果您已经照着Lightning 节点指南做过,这样还能省下第二份链数据。真正不该做的,是让支付处理器依赖别人的公共节点,原因不在于许可协议,而在于隐私与信任:不管是谁在回答您的查询,对方都会得知您店铺正在关注的每一个地址,这等同于得知您的营收,而且对方还完全可以在发票是否已付款这件事上骗您。还有第三种人们会想到的选项——使用第三方运营的托管 BTCPay 实例——作为起步方式,这也完全合理。只是要清楚,这样做是把店铺的数据交给了一个能看到它的运营方,而这恰恰是自托管本来要避免的大部分东西。

我一定要做 Lightning 那部分吗?

不需要,第一天就跳过它完全合理。纯链上方案本身就是一套完整、可用的配置:发票能被支付,客户等待一个确认,店铺完成结算。Lightning 带来的,是「大约十分钟,外加一笔在小额交易上很扎眼的手续费」和「两秒钟,外加几乎可以忽略不计的一点手续费」之间的差别,也就是一个只能应付 $400 发票、和一个连 $4 发票也能应付的结账系统之间的差别。代价是,Lightning 是另一个守护进程,有自己的资金、自己的故障模式、自己的备份纪律——包括步骤 05 里的接收流动性问题,以及步骤 06 里关于有毒状态的警告。合理的顺序是:先上线纯链上方案,用真实的钱确认整条链路可用,然后把 Lightning 当作一个刻意为之的第二项目来添加,而不是在同一个晚上就把它一并塞进去。

我应该把哪个钱包连接到店铺?

任何能够为单个账户导出扩展公钥的钱包都可以——Sparrow、Electrum、BlueWallet,或者通过其中之一连接的硬件钱包——重要的不是品牌,而是它得是一个专用账户,而不是持有您全部积蓄的那个。理由有两个。第一个关乎隐私,而且是永久性的:扩展公钥是它将会派生出的每一个地址的主索引,所以任何拿到它的人,都能够枚举出这个账户已经收到过、以及未来将会收到的每一笔付款。给店铺一个专属账户,意味着即便泄露,暴露的也只是店铺的进账,仅此而已。第二个理由关乎运营:一个专用账户能让店铺的收入一目了然,而不必在一堆混杂的历史记录里做取证;把资金扫入冷存储时,也就成了一个简单、乏味的决定。理想的安排,是硬件钱包持有私钥,店铺只负责监视公钥。

我可以在同一个实例上同时接受 Monero 或其他币种吗?

可以,但要附加一个提醒:每多一条链,就多一个完整的节点,有自己的磁盘、自己的同步时间和自己的维护成本。生成器直接支持第二种和第三种加密货币,也有一个作为附加片段提供的 Monero 集成——同一套部署就能在结账时给客户提供多种支付通道的选择。人们经常低估的是资源账单:每启用一条链,就是在同一个卷上多跑一个索引另一份账本的守护进程,而在一个只按单条链规划的套餐上塞两条链,正是支付服务器在某个周日突然写满磁盘的原因。如果 Monero 对您的店铺很重要,请先读一读Monero 节点指南,并考虑为它单独准备一台服务器;一个因为一个不相关的守护进程写满磁盘而宕机的支付处理器,比一个只收 Bitcoin 的处理器还要糟糕。

这套系统要怎么接入一个真正的店铺?

四种方式,按您手头已有软件的多少递增排列。如果您什么都没有,BTCPay 自带一个托管的收银台和一个可以当作链接发送的付款请求页面——这已经足够用来给客户开发票,或者在一个完全没有网站的集市摊位上收款。如果您有一个静态网站,支付按钮就是一段 HTML 代码。如果您有一个真正的店面,市面上主流电商平台都有维护中的插件,能把 Bitcoin 变成结账时的另一种支付方式,并自动把订单状态回写回去。而如果您有自己的应用,REST API 可以开具发票、报告其状态,并在发票结算时调用您指定的 webhook——这是经得起时间考验的集成方式,因为它只依赖 HTTP,别无其他。先从付款请求开始,证明款项确实能到账,然后再做集成。

如果这台 VPS 挂了会怎样——我会损失钱吗?

对链上支付来说,答案是不会,这正是只读设计不动声色带来的好处:币从来就没有出现在服务器上过。地址是由公钥派生出来的,所以只要用同一个扩展公钥重新安装,就能重新发现每一笔付款;彻底故障时您会丢失的,只是店铺的配置和发票历史,而这正是备份脚本要解决的问题。Lightning 则是一个真正不同的答案,值得单独说一句:通道里的资金是活的,通道状态随每一笔付款而变化,恢复一份旧状态的副本,可能会让您直接丢掉整条通道的余额,因为发布一个已经被取代的状态,正是协议要惩罚的行为。所以正确的姿态是不对称的:按计划备份数据库和配置,加密它,把它发送到这台机器以外的地方——并且把 Lightning 的静态通道备份当作一个独立的、需要持续复制的产物来对待,而不是每夜归档里的一行。

自托管支付处理器,是不是就意味着我没有任何申报义务了?

不是,这一点值得说得直白一些,因为人们常常不声不响地默认了相反的答案。去掉支付处理器,去掉的是一个中间方、一笔手续费,以及一个有能力冻结您资金的角色。它并不会改变您欠谁多少钱,也不会改变一笔销售是否要纳税——这些取决于您和您的生意所在的地方,而不是服务器在哪里,或者是哪款软件开出了这张发票。在大多数司法辖区,因商品或服务收到加密货币,都算作以收到当天的价值计算的普通营业收入,之后处置它又是另一个独立的应税事件;记录如今存在于您自己的数据库里、而不是某个处理商的数据库里,并不会让这些义务变成可选项,而且一个自托管的实例,实际上比一张来自您已经无法访问的账户的截图,是更好的审计凭证。真正诚实、也真正存在的隐私收益范围要窄得多:没有第三方握着一份持续更新的客户与金额清单。至于其余的问题,请咨询您所在司法辖区的会计师。

NordBastion 允许在 VPS 上运行支付处理器吗?

允许——一个 BTCPay 实例只是一个普通的网页应用,配一个普通的数据库和一个普通的区块链守护进程,可接受使用政策里也没有任何条款把它和一个商店或博客区别对待。真正需要注意的是资源,而不是政策:一个正在同步的节点,头一天会很吃磁盘和 IO,之后几乎就闲置了;每个套餐的带宽都不限量,所以一个公开的 Lightning 节点不会被计量收费;用于对等连接的入站端口,也完全由您自己决定要不要开放。和本站其他内容一致的地方在于这种对称性:账户不需要您的法定姓名,发票可以用 Monero、Bitcoin 或 Lightning 结算,而如今掌握着您每一位客户信息的这台机器,租自一家根本不知道您是谁的公司。在一个身份已知的账户上自托管一个处理器,搬动的是账本,而不是暴露程度。

获取这台机器

一个真正属于您自己的结账页面,挂在一个不是您本名的账户下。无 KYC,加密货币付款。

Garrison——4 vCPU、8 GB 和 240 GB NVMe,每月 $7.90,机房位于赫尔辛基、斯德哥尔摩、奥斯陆或雷克雅未克。足以运行一个裁剪的 Bitcoin 节点、一个 Lightning 守护进程、索引器和店铺本身,并留有多年余量。注册时不需要邮箱,不需要身份证件,也没有任何公司握着一份曾经付过您钱的所有人的名单。

最后审核 · 2026-10-12 · 来源 · BTCPay Server 文档(Docker 部署、存储片段、备份与恢复、店铺设置)、Bitcoin Core 关于裁剪的文档、Lightning 实现关于静态通道备份的文档 · 周期 · 每年

私密托管,源自北欧。