Decentralization? We're still early!

BTCPay Server:免费、开源且自托管的比特币支付处理器

  • BTCPay Server:免费、开源且自托管的比特币支付处理器

    發布人 Brave 2024-11-09 04:11

    BTCPay Server是一个免费、开源且自托管的比特币支付处理器,赋予商家和个人直接接收比特币支付的能力,无需支付任何费用或依赖中介机构。它以去中心化、安全和隐私为核心,为数字货币支付领域带来了一场革新。

    一、BTCPay Server的特点

    BTCPay Server的核心优势在于其去中心化的特性。与传统的支付网关不同,它不依赖任何第三方服务商,用户可以直接与对方进行交易,从而完全掌控自己的资金流动,同时享受更低的交易成本和更高的隐私保护。你的私钥永远不会上传到服务器,确保只有你才能访问你的资金。

    安全性是BTCPay Server的另一大亮点。每个发票都会生成一个从你的扩展公钥派生的新地址,避免地址重复使用,增强了交易的隐私性。此外,它还集成了多重签名和冷钱包存储等高级安全功能,即使在网络遭受攻击的情况下,也能有效保护用户的资产安全。

    BTCPay Server具有高度的灵活性和扩展性。它支持比特币闪电网络,实现快速、低成本的微支付,非常适合处理小额交易和内容打赏。此外,它还支持多种山寨币,并提供丰富的API接口,方便开发者根据自身需求进行定制化开发或集成现有系统。对于曾经使用BitPay插件的用户来说,迁移到BTCPay Server也非常便捷,因为它与BitPay API完全兼容。

    BTCPay Server提供了多种部署方式,你可以选择在自己的服务器上自托管,也可以使用第三方主机。自托管不仅可以连接无限数量的商店,还能成为其他商店的支付处理器,并充分利用闪电网络的优势。此外,BTCPay Server还提供销售点应用、众筹和捐赠按钮等功能,满足不同场景下的支付需求。

    对于WordPress用户而言,BTCPay Server的集成也十分简便。例如,BTCPay for WooCommerce插件可以让WooCommerce网站轻松接受比特币支付。此外,一些其他的WordPress插件也开始支持BTCPay Server,为创作者提供了更多选择。

    二、基于Docker Compose的部署方法

    下面是一个可以直接运行 BTCPay Server 及其依赖(PostgreSQL、Bitcoin Core、NBXplorer、LND)的 docker-compose.yml 文件。

    这个配置是为了本地测试、开发或内部网络使用而设计的,它将 BTCPay Server 直接暴露在主机的 8080 端口(HTTP)。请勿在没有反向代理(如 Nginx 或 Caddy)和 HTTPS 的情况下将其直接暴露在公共互联网上!

    运行前准备:

    创建目录: 在你的服务器或本地机器上创建一个目录来存放配置文件,例如 btcpayserver-direct
    bash mkdir btcpayserver-direct cd btcpayserver-direct

    创建 .env 文件:btcpayserver-direct 目录下创建一个名为 .env 的文件,用于存放敏感信息和配置。填入你自己的强密码。

    # .env 文件内容
    
    # 网络设置 (mainnet, testnet, regtest)
    BTCPAY_NETWORK=mainnet
    # 或者 BTCPAY_NETWORK=testnet
    
    # Bitcoin Core RPC 设置
    BITCOIN_RPC_USER=rpcuser
    BITCOIN_RPC_PASSWORD=rpcpass # 请使用强密码!
    
    # PostgreSQL 设置
    POSTGRES_USER=postgres
    POSTGRES_PASSWORD=postgrespass # 请使用强密码!
    POSTGRES_DB=btcpayserver
    
    # BTCPay Server 端口 (主机端口)
    BTCPAY_HOST_PORT=8080
    
    # LND 别名 (可选)
    LND_ALIAS=MyBTCPayLNDNode

    创建 docker-compose.yml 文件:btcpayserver-direct 目录下创建 docker-compose.yml 文件,并将以下内容粘贴进去。

    # docker-compose.yml 文件内容
    version: "3.7"
    
    services:
      # PostgreSQL 数据库
      postgres:
        image: postgres:13
        container_name: btcpayserver_postgres
        restart: unless-stopped
        environment:
          POSTGRES_DB: ${POSTGRES_DB}
          POSTGRES_USER: ${POSTGRES_USER}
          POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
        volumes:
          - "postgres_data:/var/lib/postgresql/data"
    
      # Bitcoin Core 节点
      bitcoind:
        image: kristapsk/bitcoin-core:25.0 # 你可以选择其他版本或官方镜像 (如果可用)
        container_name: btcpayserver_bitcoind
        restart: unless-stopped
        environment:
          BITCOIN_NETWORK: ${BTCPAY_NETWORK}
          BITCOIN_RPCUSER: ${BITCOIN_RPC_USER}
          BITCOIN_RPCPASSWORD: ${BITCOIN_RPC_PASSWORD}
          # 必要的额外参数
          BITCOIN_EXTRA_ARGS: |
            server=1
            rpcbind=0.0.0.0
            rpcallowip=0.0.0.0/0
            zmqpubrawblock=tcp://0.0.0.0:28332
            zmqpubrawtx=tcp://0.0.0.0:28333
            txindex=1
            prune=2000 # 修剪模式,保留约 2GB 的历史数据,节省大量空间。如果需要完整历史,请移除此行。
            rpcworkqueue=128
            rpcthreads=4
        volumes:
          - "bitcoin_data:/data/.bitcoin" # 存储区块链数据
    
      # NBXplorer 区块链浏览器/索引器
      nbxplorer:
        image: btcpayserver/nbxplorer:2.3.59 # 检查最新版本
        container_name: btcpayserver_nbxplorer
        restart: unless-stopped
        environment:
          NBXPLORER_NETWORK: ${BTCPAY_NETWORK}
          NBXPLORER_CHAINS: "btc" # 只启用比特币
          NBXPLORER_BTCRPCUSER: ${BITCOIN_RPC_USER}
          NBXPLORER_BTCRPCPASSWORD: ${BITCOIN_RPC_PASSWORD}
          NBXPLORER_BTCRPCHOST: bitcoind # 使用 service name 连接 bitcoind
          NBXPLORER_BTCEXTRAPARAMS: "rpcport=8332" # 默认 RPC 端口
          NBXPLORER_BTCZMQBLOCK: "tcp://bitcoind:28332"
          NBXPLORER_BTCZMQTRANS: "tcp://bitcoind:28333"
          NBXPLORER_PORT: "32838" # NBXplorer 内部端口
        volumes:
          - "nbxplorer_data:/root/.nbxplorer"
        depends_on:
          - bitcoind
    
      # LND 闪电网络节点
      lnd:
        image: lightninglabs/lnd:v0.17.4-beta # 检查最新版本
        container_name: btcpayserver_lnd
        restart: unless-stopped
        environment:
          LND_NETWORK: ${BTCPAY_NETWORK}
          LND_CHAIN: bitcoin
          LND_BACKEND: bitcoind
          LND_BITCOIND_RPCUSER: ${BITCOIN_RPC_USER}
          LND_BITCOIND_RPCPASS: ${BITCOIN_RPC_PASSWORD}
          LND_BITCOIND_RPCHOST: bitcoind:8332 # 连接 bitcoind RPC
          LND_BITCOIND_ZMQPATH: tcp://bitcoind:28333 # 连接 bitcoind ZMQ
          LND_ALIAS: ${LND_ALIAS:-MyBTCPayLNDNode} # 节点别名
          LND_COLOR: "#3399FF" # 节点颜色 (可选)
          LND_RPCLISTEN: 0.0.0.0:10009 # LND gRPC 端口
          LND_RESTLISTEN: 0.0.0.0:8080 # LND REST API 端口 (BTCPay 需要)
          LND_PEERPORT: 9735 # LND P2P 端口
          LND_DEBUGLEVEL: info # 日志级别
        volumes:
          - "lnd_data:/root/.lnd" # 存储 LND 数据和 macaroons
          # - "bitcoin_data:/root/.bitcoin:ro" # LND 可能需要访问 bitcoin.conf, 但通过 env vars 更佳
        depends_on:
          - bitcoind
    
      # BTCPay Server 主程序
      btcpayserver:
        image: btcpayserver/btcpayserver:1.12.4 # 检查最新版本
        container_name: btcpayserver_server
        restart: unless-stopped
        environment:
          BTCPAY_NETWORK: ${BTCPAY_NETWORK}
          BTCPAY_POSTGRES: "User ID=${POSTGRES_USER};Password=${POSTGRES_PASSWORD};Host=postgres;Port=5432;Database=${POSTGRES_DB}"
          BTCPAY_BIND: "0.0.0.0:49392" # BTCPay 内部监听端口 (避免和 LND 的 8080 冲突)
          BTCPAY_ROOTPATH: "/"
          # 连接 NBXplorer
          BTCPAY_BTCEXPLORERURL: "http://nbxplorer:32838/"
          # 连接 LND (通过 REST API)
          # 注意: allowinsecure=true 是因为在内部网络我们没有为 LND REST API 设置 HTTPS 证书
          # LND 需要先启动并生成 macaroon 文件, BTCPay 才能成功连接
          BTCPAY_BTCLIGHTNING: "type=lnd-rest;server=https://lnd:8080/;macaroonfilepath=/root/.lnd/data/chain/bitcoin/${BTCPAY_NETWORK}/admin.macaroon;allowinsecure=true"
          # 其他可选配置...
          # BTCPAY_ENABLE_SSH=false # 如果不需要 SSH 功能可以禁用
        volumes:
          - "btcpay_data:/datadir" # 存储 BTCPay 配置和数据
          - "lnd_data:/root/.lnd:ro" # 只读访问 LND 数据卷以获取 macaroon 文件
        ports:
          # 将主机的端口 (来自 .env 文件, 默认 8080) 映射到 BTCPay 的内部端口 (49392)
          - "${BTCPAY_HOST_PORT}:49392"
        depends_on:
          - postgres
          - nbxplorer
          - lnd # 确保 LND 先启动
    
    volumes:
      postgres_data:
      bitcoin_data:
      nbxplorer_data:
      lnd_data:
      btcpay_data:

    解释:

    1. services: 定义了运行 BTCPay Server 所需的所有容器。
      • postgres: PostgreSQL 数据库,用于存储 BTCPay 的数据。
      • bitcoind: Bitcoin Core 全节点,用于处理链上交易和监控。
        • prune=2000: 启用了修剪模式,将区块链数据大小限制在约 2GB,大大节省磁盘空间。如果你需要完整的历史记录(通常不需要),请删除此行,但准备好数百 GB 的存储空间。
        • zmqpubrawblock, zmqpubrawtx: ZMQ 接口,用于将新区块和交易实时推送给 NBXplorer 和 LND。
        • txindex=1: 交易索引,NBXplorer 需要。
      • nbxplorer: BTCPay 开发的轻量级区块链索引器,用于快速查询地址和交易信息,减轻 bitcoind 的负担。
      • lnd: LND 闪电网络节点,用于处理闪电支付。
        • 它通过 RPC 和 ZMQ 连接到 bitcoind
        • 它暴露了 REST API 端口 (8080),BTCPay Server 将通过此端口与其通信。
      • btcpayserver: BTCPay Server 主应用程序。
        • 通过环境变量连接到 postgres, nbxplorer, 和 lnd
        • BTCPAY_BTCLIGHTNING: 定义了如何连接到 LND。allowinsecure=true 是因为我们在 Docker 内部网络通常不为 LND 的 REST API 配置 HTTPS,这在内部是可接受的。
        • ports: 将主机的 ${BTCPAY_HOST_PORT}(默认为 8080)映射到容器内部的 49392 端口。BTCPay 内部监听 49392 是为了避免与 LND 的 REST API 端口 8080 冲突。
    2. volumes: 定义了命名卷,用于持久化存储数据(数据库、区块链、配置、LND 数据等)。这样即使容器被删除和重新创建,数据也不会丢失。
    3. .env 文件: 用于管理配置和敏感信息,使 docker-compose.yml 文件更干净,并且更容易修改配置。
    4. depends_on: 定义了容器的启动依赖关系,确保数据库和节点在 BTCPay Server 启动之前启动。但这只保证容器启动顺序,不保证服务完全就绪(例如 LND 的 macaroon 文件生成)。

    如何运行:

    1. 确保你已经安装了 Docker 和 Docker Compose。
    2. 将上述两个文件 (.envdocker-compose.yml) 放在同一个目录 (btcpayserver-direct) 中。
    3. 打开终端,进入该目录。
    4. 运行以下命令启动所有服务:
    bash docker-compose up -d
    

    -d 参数表示在后台运行。

    等待过程:

    • Bitcoin Core 同步: bitcoind 需要下载和验证整个(或修剪后的)区块链。这可能需要很长时间(几小时到几天),具体取决于你的网络速度和硬件性能。你可以使用 docker logs -f btcpayserver_bitcoind 查看同步进度。
    • NBXplorer 索引: NBXplorer 需要在 bitcoind 同步后进行索引。
    • LND 启动: LND 需要等待 bitcoind 同步到一定程度后才能完全启动并生成必要的 macaroon 文件。
    • BTCPay Server 启动: BTCPay Server 可能在 LND 的 macaroon 文件准备好之前无法完全连接 LND。
    1. 访问: 一旦服务启动并且 bitcoind 有所进展,你可以通过浏览器访问 http://<你的服务器IP或localhost>:${BTCPAY_HOST_PORT} (默认是 http://<你的服务器IP或localhost>:8080)来访问 BTCPay Server。
    2. 首次设置: 第一次访问时,BTCPay Server 会引导你创建管理员用户。
    3. 配置节点: 登录后,进入 “Server Settings” -> “Services”,检查 Bitcoin Core (通过 NBXplorer) 和 Lightning Network (LND) 的连接状态。可能需要稍等 LND 完全就绪。

    停止服务:

    docker-compose down

    查看日志:

    docker-compose logs -f # 查看所有服务的日志
    docker-compose logs -f btcpayserver # 只看 BTCPay Server 的日志
    docker-compose logs -f bitcoind   # 只看 Bitcoin Core 的日志
    docker-compose logs -f lnd        # 只看 LND 的日志

    重要提醒:

    • 资源消耗: 运行全节点(即使是修剪模式)和相关服务需要相当多的 CPU、RAM 和磁盘 I/O。确保你的机器有足够的资源。
    • 安全性: 这个配置不适用于生产环境或公共访问。它没有配置 HTTPS,并将 BTCPay 直接暴露在 HTTP 端口。对于生产环境,请使用官方推荐的 btcpay-docker 仓库,它包含了 Nginx 反向代理和 Let’s Encrypt 的自动 HTTPS 配置。
    • LND Macaroons: 如果 BTCPay Server 启动时 LND 的 admin.macaroon 文件还没生成,连接会失败。你可能需要等待 LND 完全启动后,在 BTCPay Server 的服务设置里重新测试或保存 LND 连接信息,或者重启 BTCPay Server 容器 (docker-compose restart btcpayserver)。

    三、小结

    总之,BTCPay Server为商家和个人提供了一个安全、私密、低成本的比特币支付解决方案,它的出现不仅降低了交易门槛,也促进了数字货币的普及和应用。随着技术的不断发展和社区的不断壮大,BTCPay Server有望在未来的数字经济中扮演更重要的角色。

    Brave 回复 3 months, 4 weeks ago 1 成員 · 0 回复
  • 0 回复

歡迎留言回复交流。

Log in to reply.

讨论開始
00 回复 2018 年 6 月
現在