Tất cả hệ thống hoạt động bình thường Amsterdam · Paris · Reykjavík +5 Thanh toán bằng Tiền mã hoá
Thanh toán & quyền riêng tưTrung cấpĐọc 30 phútCập nhật 2026-09-01

Tự lưu trữ BTCPay Server trên VPS

Một bộ xử lý thanh toán là một công ty giữ tiền của bạn trong lúc nó đi qua, và hỏi bạn là ai trước tiên. BTCPay Server làm đúng công việc đó, chỉ khác là dưới dạng phần mềm do chính bạn tự vận hành. Đây là cái giá thực sự phải trả để vận hành nó, và nơi các khóa buộc phải nằm sau đó.

Tự lưu trữ BTCPay Server trên VPS
Trong trang này
  1. Một bộ xử lý thanh toán tự lưu trữ thực sự thay đổi điều gì
  2. Những gì thực sự được triển khai, và phần nào tốn kém
  3. Chọn cấu hình trung thực, và gói nào phù hợp
  4. Những gì bạn cần trước khi bắt đầu
  5. Từng bước một
  6. Các khóa nằm ở đâu, và sai lầm duy nhất thực sự quan trọng
  7. Sao lưu, và những phần thực sự không thể thay thế
  8. Những kiểu lỗi mà các hướng dẫn nhanh thường bỏ qua
  9. Khu vực pháp lý, domain, và những gì việc tự lưu trữ không che giấu được
  10. Câu hỏi thường gặp

Mọi bộ xử lý thanh toán crypto có sẵn (hosted) đều đòi hỏi đúng hai điều giống nhau trước khi chịu chuyển dù chỉ một satoshi cho bạn: bạn là ai, và có được phép giữ tiền trong lúc nó đang chuyển hay không. Cả hai đều là những quyết định mà ai đó khác đưa ra thay cho việc kinh doanh của bạn. BTCPay Server làm đúng công việc đó — hóa đơn, tỷ giá, trang thanh toán, webhook, điểm bán hàng — nhưng dưới dạng phần mềm do bạn tự chạy, không cần tài khoản, không mất phần trăm nào, và không có ai đứng giữa ví của khách hàng và ví của bạn.

Cái giá phải trả là bạn trở thành người vận hành. Hướng dẫn này nói về việc đó thực sự tốn kém ra sao: phần nào của stack ngốn tài nguyên (không phải BTCPay), gói nào thực sự cần thiết, cách triển khai nó trong khoảng một giờ chú tâm và một ngày chờ đợi, và — phần quyết định xem tất cả chuyện này có phải một ý hay hay không — các khóa nằm ở đâu một khi nó đã chạy. Bitcoin và Lightning là mặc định; Monero là một tích hợp tùy chọn và, tình cờ thay, lại là đồng có câu chuyện khóa gọn gàng nhất trong ba đồng. Cỗ máy bên dưới có thể được thuê chỉ bằng một địa chỉ email và trả tiền bằng chính những đồng coin mà bạn sắp bắt đầu nhận.

Một bộ xử lý thanh toán tự lưu trữ thực sự thay đổi điều gì

Lời chào mời thường là “miễn phí giao dịch”, đây lại là phần ít thú vị nhất. Có bốn điều thực sự thay đổi, và chỉ một trong số đó liên quan đến tiền:

  • Không ai giữ tiền của bạn trong lúc nó đang chuyển. Một bộ xử lý thanh toán có sẵn nhận khoản thanh toán của khách hàng vào ví riêng của nó rồi mới ghi có cho bạn sau đó. Chính khoảng trống đó là nơi xảy ra việc giữ tiền, xét duyệt và đóng băng. BTCPay không bao giờ nhận bất cứ thứ gì: khách hàng trả tiền vào một địa chỉ được dẫn xuất từ khóa của bạn, và số coin đó là của bạn ngay từ xác nhận đầu tiên.
  • Không ai hỏi bạn là ai. Việc đăng ký với một bộ xử lý thanh toán là một quy trình xác minh danh tính có ngân hàng đứng ở cuối. Cài đặt phần mềm thì không. Đó là toàn bộ sự khác biệt, và đó là lý do câu trả lời cho “làm sao để nhận crypto mà không cần KYC” luôn luôn là “tự chạy lấy bộ xử lý thanh toán”.
  • Chi phí không còn tăng theo bạn nữa. Một tỷ lệ phần trăm bị thu mãi mãi và lớn dần theo thành công của bạn. Một VPS và một domain thì tốn như nhau dù trong một tháng tốt hay một tháng tệ.
  • Bạn thừa hưởng luôn phần việc vận hành. Uptime, cập nhật, sao lưu, và trở thành người nhận tin nhắn khi một khách hàng nói rằng hóa đơn không bao giờ được xác nhận. Đây mới là cái giá thực sự, và nó được trả bằng sự chú tâm chứ không phải bằng tiền.

Thứ bạn không có được chính là điều duy nhất mà các bộ xử lý thanh toán thực sự làm tốt: biến coin thành tiền trong tài khoản ngân hàng thay bạn. BTCPay chỉ giữ đúng thứ nó được trả, bằng đúng đồng coin nó được trả. Quy đổi, xuất hóa đơn bằng tiền pháp định, xuất báo cáo kế toán mà cơ quan thuế công nhận — tất cả đều là những bài toán riêng biệt, và phần lớn cách giải quyết chúng lại đưa trở lại chính xác cái bên thứ ba đã được định danh mà bạn vừa mới loại bỏ. Hãy xác định rõ bạn thực sự muốn nửa nào trong sự đánh đổi đó trước khi xây dựng bất cứ thứ gì.

Những gì thực sự được triển khai, và phần nào tốn kém

Cái tên này gây hiểu lầm theo một cách hữu ích. “BTCPay Server” không phải một chương trình duy nhất; bản triển khai chuẩn là một cụm nhỏ các container khởi động cùng nhau, và biết rõ cái nào là cái nào chính là khác biệt giữa việc chọn đúng cấu hình và việc đoán mò:

  • Bitcoin Core. Một full node thực thụ, xác thực từ genesis. Đây là thành phần ngốn ổ đĩa, chiếm gần trọn ngày đầu tiên, và ngốn gần hết bộ nhớ. Mọi thứ khác so ra gần như miễn phí.
  • NBXplorer. Bộ lập chỉ mục nằm giữa Core và BTCPay. Bạn đưa cho nó các khóa công khai mở rộng; nó theo dõi các địa chỉ dẫn xuất và báo cho BTCPay biết khi tiền về. Đây cũng là thành phần quan tâm đến pruning, vì những lý do phần các kiểu lỗi thường gặp sẽ nhắc lại.
  • Bản thân BTCPay Server. Ứng dụng chính: cửa hàng, hóa đơn, trang thanh toán, điểm bán hàng, webhook, Greenfield API. Nhẹ nhàng hơn hẳn so với phần còn lại — chỉ vài trăm megabyte bộ nhớ.
  • PostgreSQL. Hóa đơn, cửa hàng, cài đặt, người dùng, API key. Nhỏ gọn, và đây mới thực sự là thứ các bản sao lưu của bạn tồn tại vì nó.
  • nginx kèm chứng chỉ tự động. Một reverse proxy cộng với một tiến trình đi kèm chuyên cấp và gia hạn chứng chỉ cho hostname của bạn. Đây là lý do cổng 80 và 443 phải thực sự tiếp cận được từ internet.
  • Tùy chọn thêm một node Lightning (Core Lightning hoặc LND) và một daemon Monero cùng một wallet RPC đi kèm — mỗi thứ lại mang theo chuỗi riêng và sự thèm khát ổ đĩa của riêng nó.

Vậy nên câu hỏi về cấu hình không bao giờ là “BTCPay cần lớn cỡ nào”. Mà là “mình đang giữ bao nhiêu chuỗi, và bao nhiêu chuỗi tất cả”. Trả lời được câu đó thì gói phù hợp sẽ tự lộ ra.

Chọn cấu hình trung thực, và gói nào phù hợp

Dự án ghi trong tài liệu mức 2 GB RAM cộng swap là tối thiểu và 4 GB là khuyến nghị, và khoảng cách giữa hai con số đó chính là khoảng cách giữa một bản cài đặt về mặt kỹ thuật thì chạy xong và một bản bạn thực sự sẵn lòng trỏ khách hàng vào. Một runtime ứng dụng, PostgreSQL và một bitcoind đang đồng bộ chia nhau 2 GB vẫn sẽ chạy xong — chỉ là chậm, với file swap phải gánh phần việc lẽ ra nó không nên gánh.

Dung lượng ổ đĩa được quyết định bởi việc bạn prune mạnh tay đến mức nào, và bản triển khai này thể hiện điều đó dưới dạng một fragment mà bạn truyền cho trình cài đặt. Nhóm fragment đó chạy quanh mức opt-save-storage ở khoảng 100 GB tệp block, -s ở khoảng 50 GB, -xs ở khoảng 25 GB và -xxs ở khoảng 5 GB. Lựa chọn cuối cùng đó là một cái bẫy cho bất cứ thứ gì cần tồn tại lâu dài: nó giữ lại quá ít lịch sử đến mức việc bảo trì thông thường bắt đầu thất bại. Với một cửa hàng, -s hoặc -xs là dải hợp lý.

Số liệu cụ thể từ bảng giá, vì “còn tùy” không phải là một câu trả lời:

  • Chỉ Bitcoin, pruned, một cửa hàngScout, 2 vCPU / 4 GB / 70 GB NVMe, $9.00/mo. Mức sàn trung thực, và câu trả lời đúng cho phần lớn độc giả.
  • Bitcoin và LightningRunner, 3 vCPU / 6 GB / 100 GB, $14.00/mo. Một daemon Lightning nhẹ ổ đĩa nhưng khăng khăng đòi luôn trực tuyến; phần dư ra là dành cho node bên dưới nó.
  • Bitcoin, Lightning và MoneroAlpha, 6 vCPU / 12 GB / 200 GB, $28.00/mo. Một chuỗi Monero pruned chỉ riêng nó đã tốn khoảng 85 GB, nên hai chuỗi cộng hai bộ lập chỉ mục là lúc 8 GB bắt đầu hụt hơi. Hunter (4 vCPU / 8 GB / 140 GB, $19.00/mo) chỉ vừa nếu Bitcoin luôn được prune mạnh tay và giữ nguyên như vậy.
  • Một node unpruned đứng sau cửa hàng — đó là một dự án khác với một hóa đơn khác. Hướng dẫn full-node có đủ những con số đó, và chúng bắt đầu từ Fenrir.

CPU chỉ quan trọng đúng một lần. Việc xác minh chữ ký trong quá trình tải khối ban đầu (initial block download) chạy song song được, nên 2 đến 4 vCPU biến lần đồng bộ đầu tiên từ vài ngày xuống còn khoảng một ngày, rồi sau đó quay về trạng thái nhàn rỗi. Băng thông là một chi phí một lần cho toàn bộ chuỗi, trên một cổng 1 Gbps với lưu lượng không giới hạn và không có hóa đơn phụ trội vào cuối tháng. Độ trễ không quan trọng với một bộ xử lý thanh toán, nên hãy chọn vị trí theo khu vực pháp lý chứ không phải theo mili-giây — Amsterdam, Paris, Bucharest và Sofia đều có giá cơ bản.

Những gì bạn cần trước khi bắt đầu

Một danh sách ngắn, và một mục trong đó không hề mang tính kỹ thuật.

  • Một domain, với bản ghi A đã trỏ sẵn vào máy chủ. Chứng chỉ được cấp qua HTTP dựa trên đúng hostname đó, nên DNS phải phân giải được trước khi trình cài đặt chạy, không phải trong lúc chạy. Một subdomain kiểu pay.example.com là hình thức thông thường.
  • Cổng 80 và 443 mở ra với cả thế giới. Cổng 80 không phải tùy chọn dù sau này chẳng có gì hữu ích phục vụ trên đó; thử thách cấp chứng chỉ cần đến nó.
  • Debian 13 từ thư viện template, trên một máy đã trải qua lượt tăng cường bảo mật mười phút. Hãy làm việc đó trước — một khi stack đã chạy thì khó lòng làm cho gọn gàng hơn nhiều.
  • Một ví bạn đã kiểm soát sẵn, cùng khóa công khai mở rộng của nó. Sparrow, Electrum hoặc một ví cứng. Có sẵn nó trong tay trước khi cài đặt, để bạn không bao giờ bị cám dỗ để mặc máy chủ tự tạo một cái cho bạn.
  • Một địa chỉ email cho certificate authority. Nó chỉ nhận cảnh báo hết hạn và không gì khác.
  • Một quyết định về pruning, chốt ngay bây giờ. Đổi ý sau này nghĩa là phải đồng bộ lại chuỗi từ đầu, một ngày mà bạn sẽ không muốn trải qua đến lần thứ hai.

Từng bước một

  1. Triển khai máy chủ, trỏ domain vào đó, và tăng cường bảo mật trước tiên

    Hãy đặt mua gói mà phần cấu hình ở trên đã chỉ ra, chọn Debian 13, và chọn vị trí theo khu vực pháp lý chứ không phải độ trễ. Tạo bản ghi DNS ngay lập tức, vì nó phải lan truyền xong vào lúc trình cài đặt yêu cầu một certificate authority xác minh bạn sở hữu domain đó:

    pay.example.com.   300   IN   A   198.51.100.10

    Sau đó là lượt tăng cường bảo mật theo hướng dẫn tăng cường bảo mật Debian: một user không phải root có key riêng, tắt xác thực bằng mật khẩu, bật cập nhật bảo mật tự động, và một firewall mặc định chặn tất cả. Mọi thứ bên dưới đều giả định điều đó đã được thực hiện và chỉ có cổng 22, 80 và 443 đang mở.

    apt update && apt full-upgrade -y
    apt install -y git curl

    Đừng tự tay cài Docker. Script cài đặt sẽ tự cài và cấu hình đúng phiên bản nó cần, và một bản cài tự chế bằng tay là lý do phổ biến nhất khiến lần chạy đầu tiên thất bại.

  2. Clone repository triển khai và chọn các fragment của bạn

    Toàn bộ bản triển khai chỉ là một repository gồm các shell script và các compose fragment. Clone nó dưới quyền root, ở một nơi bạn sẽ nhớ:

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

    Cấu hình ở đây là các biến môi trường, được trình cài đặt đọc một lần rồi lưu lại, nên các dòng export dưới đây chính là toàn bộ tệp cấu hình mà bạn sẽ từng phải viết:

    export BTCPAY_HOST="pay.example.com"
    export NBITCOIN_NETWORK="mainnet"
    export BTCPAYGEN_CRYPTO1="btc"
    export BTCPAYGEN_REVERSEPROXY="nginx"
    export BTCPAYGEN_LIGHTNING="clightning"
    export BTCPAYGEN_ADDITIONAL_FRAGMENTS="opt-save-storage-s"
    export LETSENCRYPT_EMAIL="you@example.com"

    BTCPAYGEN_LIGHTNING nhận clightning, lnd, phoenixd hoặc để trống hoàn toàn — hãy để trống nếu bạn chưa sẵn sàng giữ tiền hot, vì thêm nó sau này chỉ là chạy lại đúng script đó một lần nữa. Tên các fragment là phần hay thay đổi giữa các bản phát hành, nên hãy đọc trang triển khai hiện tại của dự án trước khi dán vào.

  3. Chạy trình cài đặt, rồi để chuỗi tự đồng bộ

    Một lệnh duy nhất dựng tệp compose, kéo các image về và khởi chạy mọi thứ:

    . ./btcpay-setup.sh -i

    Nó chạy xong trong vài phút và để lại một giao diện web hoạt động được. Nhưng nó không để lại một cửa hàng hoạt động được, vì Bitcoin Core lúc này đang tải về và xác thực chuỗi, và không có gì có thể được thanh toán cho tới khi việc đó hoàn tất. Hãy theo dõi nó thay vì đoán mò:

    bitcoin-cli.sh -getinfo
    btcpay-down.sh     # stop everything
    btcpay-up.sh       # start everything

    Con số đáng tin để theo dõi là verificationprogress, và nó khá đánh lừa ở giai đoạn đầu: chín mươi phần trăm đầu tiên trôi qua nhanh, còn mười phần trăm cuối lại chiếm phần lớn thời gian, vì các block gần đây đều là những block đầy. Trên NVMe với hai đến bốn vCPU, hãy chờ khoảng một ngày. Cứ để yên trong lúc nó chạy — khởi động lại giữa chừng chỉ khiến bạn mất phần cache đã xây được.

  4. Tạo tài khoản quản trị và khóa cửa lại ngay sau lưng bạn

    Mở https://pay.example.com và đăng ký. Tài khoản đầu tiên được tạo sẽ trở thành quản trị viên, điều này khiến khoảng thời gian giữa lúc trình cài đặt chạy xong và lúc bạn đăng ký trở thành khoảnh khắc thực sự nguy hiểm duy nhất trong cả quy trình này. Hãy làm việc đó ngay lập tức, từ một tab trình duyệt bạn đã mở sẵn.

    Sau đó, trong cài đặt máy chủ, hãy tắt tính năng tự do đăng ký để người ghé thăm thứ hai không thể tự tạo tài khoản, và tự bật xác thực hai yếu tố cho chính mình. Cả hai chỉ tốn hai cú click, và cùng nhau chúng chính là khác biệt giữa một bộ xử lý thanh toán của bạn và bộ xử lý thanh toán của người khác. Hãy mời mọi quản trị viên khác một cách tường minh.

  5. Kết nối một ví mà máy chủ không có quyền chi tiêu

    Tạo một cửa hàng, rồi gắn một ví Bitcoin vào. BTCPay đề nghị tự tạo một ví mới cho bạn; hãy chọn con đường còn lại — kết nối một ví đã có sẵn — và dán vào khóa mở rộng cấp tài khoản, đúng phần công khai, mà bạn xuất ra từ ví của chính mình:

    zpub6r...
        # account-level extended PUBLIC key (xpub / ypub / zpub), never a prv
        # Sparrow: wallet settings.  Electrum: Wallet -> Information -> Master Public Key

    Chuỗi đó vốn được thiết kế để công khai. Nó cho phép BTCPay dẫn xuất một lượng không giới hạn địa chỉ nhận và nhận diện các khoản thanh toán tới đó; nó không cho phép BTCPay, hay bất kỳ ai xâm nhập được vào nó, chuyển đi dù chỉ một satoshi. Khóa riêng tư vẫn nằm nguyên chỗ cũ, lý tưởng nhất là trên một ví cứng chưa từng chạm vào máy này.

    Có hai hệ quả đáng để khắc cốt ghi tâm. Hãy dùng một tài khoản hoàn toàn mới hoặc một derivation path riêng cho cửa hàng, thay vì dùng khóa của một ví bạn đã dùng nhiều năm — phần các kiểu lỗi thường gặp đã giải thích vì sao lịch sử và pruning không hợp nhau. Và nhớ rằng bất kỳ ai giữ khóa mở rộng đó đều có thể thấy mọi khoản thanh toán bạn từng nhận: không hẳn là một chiếc chìa khóa, nhưng cũng không phải là vô hại. Hãy đối xử với nó như một cuốn sổ cái bị bỏ quên mở toang trên bàn.

  6. Thêm Lightning, và quyết định bao nhiêu tiền của bạn sẽ nằm ở đó

    Nếu bạn đã đặt BTCPAYGEN_LIGHTNING ngay lúc cài đặt thì node đã chạy sẵn và kết nối nội bộ rồi, cài đặt cửa hàng chỉ cần bật nó lên. Nếu bạn để trống, hãy export biến đó và chạy lại script cài đặt; nó có tính idempotent và sẽ không đồng bộ lại chuỗi.

    export BTCPAYGEN_LIGHTNING="clightning"
    . ./btcpay-setup.sh -i

    Giờ là phần thuộc về một quyết định chứ không phải một cấu hình. Số dư kênh được giữ trong một ví mà máy chủ có thể chi tiêu, vì bản chất một kênh thanh toán là như vậy; không hề có khái niệm Lightning watch-only. Một lần máy này bị xâm nhập sẽ khiến bạn mất đúng bằng số dư kênh và không gì khác, đó là lý do số tiền hợp lý để giữ ở đó là số tiền mà mất đi khiến bạn bực mình chứ không phải khiến bạn sụp đổ. Hãy quét dồn sang cold storage theo một lịch mà bạn thực sự sẽ tuân thủ.

    Hãy lường trước rằng tháng đầu tiên sẽ xoay quanh thanh khoản chứ không phải thanh toán. Một node phía người bán cần dung lượng inbound, ngược hẳn với những gì việc mở một kênh mang lại cho bạn — mở một kênh chỉ cấp vốn cho phía của chính bạn. Mua thanh khoản inbound từ một dịch vụ, chạy một submarine swap để đẩy tiền của bạn sang phía bên kia, hoặc chờ các peer mở kênh hướng về bạn một khi bạn đã có khối lượng giao dịch, là ba lựa chọn trung thực. Cả Core Lightning lẫn LND đều dùng tốt; Core Lightning là loại dễ suy luận hơn khi đặt cạnh một node pruned, vì những lý do mà hướng dẫn full-node đã nói tới.

  7. Thêm Monero bằng một ví view-only

    Monero được gắn vào theo cùng cách, như một crypto slot thứ hai, kéo theo một daemon Monero và một wallet RPC bên cạnh mọi thứ khác:

    export BTCPAYGEN_CRYPTO2="xmr"
    . ./btcpay-setup.sh -i

    Hãy chuẩn bị ngân sách cho một chuỗi thứ hai: khoảng 85 GB ở chế độ pruned, và lần đồng bộ đầu tiên mất chừng một đến hai ngày trên NVMe. Hướng dẫn node Monero có đầy đủ chi tiết cho cả hai con số này.

    Cách xử lý khóa ở đây là phần hay nhất của toàn bộ thiết lập này. Monero tách riêng khả năng thấy các khoản thanh toán đến khỏi khả năng chi tiêu chúng, nên bạn tạo ra một ví view-only từ địa chỉ chính và khóa xem riêng tư của mình, và đó là tất cả những gì máy chủ từng giữ:

    monero-wallet-cli --generate-from-view-key store-view

    Nó sẽ hỏi địa chỉ chuẩn, khóa xem riêng tư và một mật khẩu. Hãy copy các tệp ví tạo ra vào thư mục ví Monero mà bản triển khai này expose ra, trỏ cửa hàng vào đó, và BTCPay sẽ tạo một subaddress cho mỗi hóa đơn rồi theo dõi các khoản thanh toán tới đó. Khóa chi tiêu không bao giờ rời khỏi máy mà bạn đã tạo ra nó.

    Một điều cần tính đến khi thiết kế trang thanh toán: các output nhận được bị khóa trong mười block, tức khoảng hai mươi phút, nên BTCPay thấy khoản thanh toán đến từ khá lâu trước khi nó có thể tiêu được. Với hàng hóa số, đó là một lựa chọn về chính sách. Với bất cứ thứ gì trao tay trực tiếp, đó là một hàng chờ.

  8. Kiểm thử nó như một khách hàng, rồi như một người vận hành

    “Trang tải được” không phải là một bài kiểm thử. Hãy tạo một hóa đơn với số tiền không đáng kể, trả nó bằng một ví thật, rồi rà qua các cài đặt quyết định điều gì xảy ra khi một khoản thanh toán không hoàn hảo:

    • Chính sách xác nhận. Cần bao nhiêu block trước khi một hóa đơn được tính là đã thanh toán xong. Không cần xác nhận nào là hợp lý cho một ly cà phê nhưng lại sai lầm cho một chiếc laptop; đây là một cài đặt theo từng cửa hàng và là con số có ảnh hưởng lớn nhất trong cả giao diện.
    • Thời hạn hóa đơn. Khách hàng có bao lâu trước khi tỷ giá đã báo hết hiệu lực. Mười lăm phút là mặc định và khá ngắn với bất kỳ ai trả tiền từ một lần rút trên sàn giao dịch.
    • Dung sai thanh toán. Tỷ lệ phần trăm trả thiếu mà bạn sẽ chấp nhận, thay vì để khách hàng ôm một hóa đơn trả dở dang cùng một ticket hỗ trợ. Một mức nhỏ nhưng khác không là cài đặt thực dụng nhất.
    • Thanh toán thiếu và thanh toán thừa. Hãy chủ động trả thiếu một hóa đơn, một lần, rồi xem cửa hàng của bạn xử lý việc đó ra sao. Tốt hơn nhiều nếu bạn học được điều này bằng chính tiền của mình.

    Rồi đến nửa phần việc của người vận hành: bật một webhook và xác nhận cửa hàng của bạn thực sự nhận được nó, tạo một Greenfield API key nếu có bất cứ thứ gì sẽ tạo hóa đơn theo cách lập trình, và thực hiện một bản sao lưu đầy đủ trước khi lên live — để lần khôi phục đầu tiên bạn từng thực hiện là một buổi diễn tập, chứ không phải một tình huống khẩn cấp.

Các khóa nằm ở đâu, và sai lầm duy nhất thực sự quan trọng

Gần như mọi kết cục tệ với một bộ xử lý thanh toán tự lưu trữ đều bắt nguồn từ một quyết định duy nhất được đưa ra sớm và tùy tiện: để máy chủ giữ thứ gì đó có thể chi tiêu được. Đáng để nói rõ về ba trường hợp, vì chúng thực sự khác nhau.

  • Bitcoin on-chain: watch-only, luôn luôn như vậy. BTCPay chỉ giữ một khóa công khai mở rộng và không gì khác. Nếu máy bị xâm nhập, kẻ tấn công biết được bạn đã được trả bao nhiêu và có thể đổi hướng các hóa đơn tương lai trỏ đến — một cuộc tấn công có thật, và là lý do để kiểm tra lại ví của cửa hàng bạn sau bất kỳ sự cố nào — nhưng không thể động vào một đồng coin đã nhận rồi.
  • Lightning: hot, đúng theo định nghĩa. Các kênh được cấp vốn bằng coin mà máy chủ có thể chi tiêu, vì bản chất một kênh là như vậy. Đây là ngoại lệ có chủ đích, và phần trên đã tính cấu hình cho nó.
  • Monero: view-only, xét về mặt cấu trúc. Khóa xem riêng tư tiết lộ mọi khoản thanh toán đến nhưng không cho phép chi tiêu bất kỳ khoản nào trong số đó. Không có gì tương đương ở phía Bitcoin.

Tính năng duy nhất phá vỡ mô hình này một cách có chủ đích là Payjoin. Nó cho phép máy chủ của bạn đóng góp một input vào giao dịch của khách hàng, làm suy yếu đáng kể phép suy đoán dựa trên đầu vào chung (common-input heuristic) mà các công cụ phân tích chuỗi vẫn dựa vào, đồng thời mang lại lợi ích riêng tư thực sự cho cả hai bên — nhưng bên nhận phải có khả năng ký, nên nó cần một ví hot bên trong BTCPay. Đó là một sự đánh đổi thực sự, không phải một tính năng miễn phí. Hãy dùng nó một cách có ý thức, và cấp vốn cho nó giống cách bạn cấp vốn cho ví Lightning: theo một khoản cụ thể, không phải toàn bộ.

Và nếu bạn để wizard thiết lập tự tạo ví cho cửa hàng vì đó là con đường nhanh nhất: hãy ghi lại seed mà nó cho bạn xem, xác minh nó trong một ví offline, rồi lên kế hoạch chuyển sang thiết lập watch-only. Một seed đã từng xuất hiện trên một máy chủ có kết nối internet là một seed đã bắt đầu đếm ngược.

Sao lưu, và những phần thực sự không thể thay thế

Hãy sắp xếp trạng thái theo mức độ khó để tái tạo lại, vì câu trả lời cho mỗi thứ rất khác nhau:

  • Chuỗi. Không phải vấn đề sao lưu. Đây là dữ liệu công khai và nó tự đồng bộ lại, chậm nhưng miễn phí. Đừng bao giờ sao lưu nó.
  • Cơ sở dữ liệu. Hóa đơn, cửa hàng, cài đặt, người dùng, API key. Đây mới là bản sao lưu thực sự, nó nhỏ gọn, và mất nó khiến bạn mất luôn bản ghi kế toán của mọi giao dịch — không phải mất tiền, mà là mất giấy tờ.
  • Ví on-chain của bạn. Đã an toàn sẵn rồi, vì khóa chưa bao giờ nằm ở đây. Đó chính là thành quả của bước năm.
  • Trạng thái kênh Lightning. Đây mới là thứ gây đau. Một static channel backup cho phép bạn khôi phục số tiền trong các kênh của bạn sau một tổn thất toàn bộ bằng cách buộc đóng chúng lại; nó không khôi phục lại các kênh, và nó vô giá trị nếu đã cũ. Nó thay đổi mỗi khi một kênh mở hoặc đóng, nên nó thuộc về một bản sao tự động lưu ngoài máy chủ, chứ không phải một thư mục mà bạn nhớ tới mỗi quý một lần.
  • Ví view-only của Monero. Có thể dựng lại từ địa chỉ và khóa xem mà bạn vẫn giữ offline. Hãy sao lưu hai thứ đó và coi các tệp ví chỉ là một cache.

Bản triển khai đi kèm sẵn các script hỗ trợ làm đúng việc này:

btcpay-backup.sh    # stops the stack, dumps Postgres, tars the config, restarts
btcpay-restore.sh   # puts one of those archives back

Khoảng dừng đó chính là điểm mấu chốt — một bản sao hot của một cơ sở dữ liệu đang chạy có thể khôi phục ra một thứ gì đó thú vị. Hãy mã hóa bất cứ thứ gì rời khỏi máy, và nhớ rằng snapshot hàng tuần đi kèm mọi gói chỉ là một tiện ích chứ không phải một bản sao lưu: một snapshot sống chung với chính thứ nó đang bảo vệ.

Những kiểu lỗi mà các hướng dẫn nhanh thường bỏ qua

Xếp theo thứ tự tương đối về mức độ chúng hay ngốn mất một buổi tối của ai đó:

  • Chứng chỉ không bao giờ được cấp. Chín trên mười lần là do bản ghi A được tạo sau khi trình cài đặt đã chạy, hoặc cổng 80 bị lọc chặn. Hãy sửa DNS, xác nhận tên đã phân giải được từ một nơi không phải laptop của chính bạn, rồi chạy lại script cài đặt. Cứ mù quáng thử lại với certificate authority sẽ khiến bạn dính giới hạn tốc độ và mất thêm một tuần chờ đợi, nên hãy thay đổi điều gì đó giữa các lần thử.
  • Một khóa mở rộng nhập vào có lịch sử nhưng lại không hiện số dư. Đây chính là cái bẫy pruning. Bộ lập chỉ mục tìm các khoản thanh toán mới bằng cách theo dõi các block mới, nhưng để dựng lại lịch sử của một ví đã có từ trước nghĩa là phải đọc những block mà một node pruned đã xóa mất rồi. Dùng một tài khoản mới cho cửa hàng thì vấn đề này không tồn tại; còn nếu bắt buộc phải nhập lịch sử cũ, bạn cần một node unpruned và một lần rescan.
  • “Khách đã trả tiền mà hóa đơn vẫn còn mở.” Thường là do trả thiếu vì phí của ví gửi, một hóa đơn hết hạn trong lúc khoản thanh toán còn nằm chờ xác nhận, hoặc một chính sách xác nhận khắt khe hơn bạn nhớ là mình đã chọn. Cả ba đều là các thiết lập, và cả ba đều là lý do vì sao bạn nên tự thử bằng tiền của chính mình trước.
  • Node âm thầm tụt lại phía sau. Một bitcoind bị khựng vẫn phát địa chỉ ra và bỏ lỡ thanh toán mà không hề than phiền gì. Hãy so sánh block height của bạn với bất kỳ nguồn công khai nào theo định kỳ và cảnh báo khi có khoảng lệch; đây không phải điều bạn nên biết lần đầu từ một khách hàng.
  • Cập nhật sai thời điểm. btcpay-update.sh khá ngoan, nhưng nó khởi động lại mọi thứ. Hãy chạy nó một cách có chủ đích, không bao giờ tự động, và không bao giờ trong lúc đang bán hàng.
  • Địa chỉ dính tai tiếng. Một trang thanh toán trên một IPv4 nằm trong blocklist là một trang thanh toán mà một số mạng doanh nghiệp và bộ lọc mail âm thầm từ chối. Mọi gói ở đây đều đi kèm một địa chỉ riêng không có lịch sử, và đáng để kiểm tra nó trước khi bạn in domain lên bất cứ thứ gì.

Khu vực pháp lý, domain, và những gì việc tự lưu trữ không che giấu được

Phần mềm loại bỏ một bên trung gian. Nó không loại bỏ phần còn lại của bề mặt lộ diện, và trung thực về điều đó hữu ích hơn nhiều so với thêm một danh sách tính năng nữa.

Domain là điểm yếu. Nó được đăng ký ở đâu đó, nó phân giải công khai, và nó là thứ đầu tiên bất kỳ ai cũng nhìn vào. Một bộ xử lý thanh toán tự lưu trữ trên một hostname đăng ký dưới chính tên bạn tại một registrar ngay trong nước bạn thì đã chuyển được tiền ra khỏi tay bên thứ ba, nhưng lại để nguyên danh tính ở đúng chỗ cũ. Nếu điều đó quan trọng với thứ bạn đang bán, registrar xứng đáng được cân nhắc kỹ ít nhất ngang với nhà cung cấp host.

Khu vực pháp lý là một biến số có thật. Máy chủ đặt ở đâu quyết định lệnh tòa án của ai có thể chạm tới nó và cần bao nhiêu thủ tục mới chạm được. Đó là ma sát và khoảng cách, không phải miễn nhiễm — một điểm mà bài hosting offshore đã nói kỹ, và đáng đọc trước khi chọn một lá cờ thay vì chọn một mạng lưới.

Tài khoản là mắt xích cuối cùng. Thuê máy chủ bằng một địa chỉ email và trả tiền bằng Monero nghĩa là không có sao kê thẻ nào nối trang thanh toán với một ngân hàng — một điều kỳ lạ nếu bỏ sót trong lúc xây một hệ thống mà cả điểm mấu chốt của nó là không cần đến điều đó. Mọi gói ở đây đều no-KYC theo mặc định, và mọi địa điểm đều đi kèm một IPv4 sạch riêng với reverse DNS tùy chỉnh.

Và ranh giới được nói thẳng ra chứ không chỉ ngụ ý. Node, bộ xử lý thanh toán và cửa hàng đều là hạ tầng bình thường và được chào đón ở đây; chính sách sử dụng chấp nhận được ngắn gọn, công khai, và có một giới hạn cứng bên dưới. Việc bạn có cần giấy phép để nhận thanh toán hay không là câu hỏi về việc bạn bán gì và bạn ở đâu, không phải về phần mềm — và đó là câu hỏi dành cho người có chuyên môn, không phải cho một bài hướng dẫn hosting.

Câu hỏi thường gặp

Tôi cần gói VPS nào để chạy BTCPay Server?

Scout (2 vCPU / 4 GB / 70 GB NVMe, $9.00/mo) chạy một node Bitcoin pruned là mức sàn trung thực cho một cửa hàng hoạt động được, và đó là thứ phần lớn độc giả nên mua. Thêm Lightning thì Runner (3 vCPU / 6 GB / 100 GB, $14.00/mo) thoải mái hơn; thêm Monero như một chuỗi thứ hai thì Alpha (6 vCPU / 12 GB / 200 GB, $28.00/mo) là kích cỡ khiến bạn không còn phải bận tâm về chuyện đó nữa. Dự án ghi trong tài liệu mức tối thiểu là 2 GB, điều này đúng nhưng chẳng dễ chịu chút nào.

Tôi có thể chạy BTCPay Server mà không cần một full node Bitcoin không?

Có, nhưng bạn đang chọn xem nên giữ lại niềm tin ở đâu. BTCPay có thể được trỏ tới một node bên ngoài mà bạn đã tự chạy sẵn — đây là phiên bản hợp lý của việc này, và cũng là một lý do chính đáng để đã đọc qua hướng dẫn full-node từ trước — hoặc trỏ tới node của người khác, việc này lại đưa một bên thứ ba quay trở lại, thấy được mọi địa chỉ mà cửa hàng của bạn tạo ra. Node đi kèm sẵn tồn tại vì đó là cấu hình duy nhất mà không ai đang theo dõi cả. Một node pruned vẫn là một full node: cứ prune nó và phần lớn phản đối về tài nguyên sẽ biến mất.

BTCPay Server có hỗ trợ Monero không?

Có, dưới dạng một tích hợp tùy chọn mà bạn bật lên lúc triển khai. Nó kéo theo một daemon Monero và một wallet RPC, và bạn kết nối bằng một ví view-only được tạo từ địa chỉ chính và khóa xem riêng tư của bạn — nhờ vậy máy chủ có thể thấy các khoản thanh toán nhưng không thể chi tiêu chúng, một cách sắp xếp tốt hơn bất cứ thứ gì hiện có ở phía Bitcoin. Cái giá phải trả là một chuỗi thứ hai cần đồng bộ và lưu trữ, cùng khóa mười block trên các output nhận được, tức khoảng hai mươi phút trước khi số tiền đó có thể tiêu được.

Tự chạy bộ xử lý thanh toán của riêng mình có hợp pháp không?

Chạy phần mềm chỉ là vận hành phần mềm thông thường. Hoạt động bị quản lý ở phần lớn nơi trên thế giới là việc giữ hoặc chuyển tiền thay mặt người khác, và một bộ xử lý thanh toán non-custodial nhận thanh toán cho chính hàng hóa của bạn thì cụ thể không hề làm điều đó, vì không có gì từng được giữ thay mặt ai cả. Bạn bán gì và bạn sống ở đâu vẫn quyết định các nghĩa vụ của bạn, kể cả thuế, và việc tự lưu trữ không thay đổi bất kỳ điều nào trong số đó. Đây là một hướng dẫn về hosting chứ không phải tư vấn pháp lý: nếu bạn định xử lý thanh toán cho bên thứ ba, hãy coi như mình đang ở một nhóm khác và hỏi người có chuyên môn.

Nếu máy chủ chết, tôi có mất tiền không?

Không mất tiền on-chain, miễn là bạn đã làm theo bước năm — số coin đó nằm trong một ví mà khóa của nó chưa bao giờ có mặt trên máy chủ, và một bản cài đặt mới được nạp cùng đúng khóa công khai mở rộng đó sẽ thấy lại chúng ngay. Thứ bạn mất là bản ghi: hóa đơn, cài đặt cửa hàng, API key, trừ khi bạn đã giữ bản sao lưu cơ sở dữ liệu. Lightning là ngoại lệ, vì tiền trong kênh nằm trên máy chủ; khôi phục chúng sau một tổn thất toàn bộ cần một static channel backup còn mới, và nó sẽ buộc đóng các kênh của bạn thay vì khôi phục lại chúng.

Tôi có cần một domain cho BTCPay Server không?

Trên thực tế thì có. Bản triển khai này cấp một chứng chỉ cho một hostname, trình duyệt và ví đều mong đợi HTTPS trên trang thanh toán, và khách hàng đang được yêu cầu gửi tiền tới bất cứ thứ gì hiện trên thanh địa chỉ. Một subdomain của thứ gì đó bạn đã sở hữu sẵn là quá đủ. Nếu chính một domain công khai mới là vấn đề, BTCPay vẫn có thể được truy cập qua một dịch vụ onion thay thế — một cấu hình hoàn toàn hợp lệ, chỉ có điều nó cũng làm thay đổi số lượng khách hàng có thể tiếp cận được trang.

Tự lưu trữ thực sự tốn bao nhiêu mỗi tháng?

Phần mềm này miễn phí và cấp phép theo AGPL, nên hóa đơn chỉ còn là VPS, domain và thời gian của bạn. Với $9.00 mỗi tháng cho Scout và vài đô một năm cho một domain, phép so sánh với bất kỳ bộ xử lý thanh toán tính phần trăm nào cũng hết còn sát sao chỉ ở một khối lượng giao dịch rất nhỏ — và khác với phần trăm, chi phí này không phình to ra khi bạn thành công. Cái giá trung thực nằm ở mục thứ ba: giờ đây chính bạn là người phát hiện ra khi nào node ngừng đồng bộ.

Triển khai VPS offshore trong khoảng một phút

Không KYC, thanh toán crypto, toàn NVMe. Chọn gói, thanh toán bằng Monero hoặc coin lớn bất kỳ, nhận quyền root sau khoảng 60 giây.

Fenrir đứng canh