HướNG DẫN
Cách tự nhận thanh toán Bitcoin bằng BTCPay Server
Mọi đơn vị xử lý thanh toán mà bạn không tự vận hành đều là một công ty có thể đóng băng tài khoản của bạn. Đó không phải chuyện giả định đối với bất kỳ ai nhận Bitcoin: các đơn vị xử lý lớn đã bổ sung xác minh danh tính, ngưỡng chi trả và quy tắc quyết toán từ nhiều năm trước, và một người bán không vượt qua một trong các bước kiểm tra đó thường chỉ phát hiện ra khi tiền đã đang trên đường đi. BTCPay Server ra đời chính vì lý do đó. Đây là phần mềm miễn phí, mã nguồn mở, biến một server do bạn kiểm soát thành hệ thống thanh toán của riêng bạn — hóa đơn, màn hình point-of-sale, plugin cho cửa hàng, Lightning — không công ty nào đứng giữa, không bị trích phần trăm nào và không có tài khoản nào để mất. Cài đặt nó thực sự chỉ mất đúng một buổi chiều. Thứ quyết định kết quả có tốt hay không chính là cỗ máy bên dưới nó, cùng một vài chi tiết mà một bản cài đặt mặc định âm thầm để lại, chỉ thẳng ngược về bạn.
Thứ BTCPay Server thực sự thay thế
Một đơn vị xử lý thanh toán thông thường đứng giữa khách hàng và ví của bạn. Nó tạo địa chỉ, theo dõi blockchain, quy đổi số tiền, giữ tiền trong một khoảng thời gian nào đó rồi mới trả lại cho bạn. Mỗi bước trong số đó là một thứ nó biết thêm về bạn, và cũng là một điểm mà nó có thể từ chối. BTCPay làm chính công việc đó trên phần cứng bạn đi thuê, và sự khác biệt về những gì nó biết là tuyệt đối.
- Khoản thanh toán đi thẳng vào ví của chính bạn. Bạn cung cấp cho BTCPay một khóa công khai mở rộng (xpub), nó dẫn xuất một địa chỉ mới cho mỗi hóa đơn rồi theo dõi địa chỉ đó — nó không bao giờ giữ khóa riêng tư cho các khoản thanh toán on-chain và không thể di chuyển dù chỉ một satoshi.
- Không phí, không tài khoản. Phần mềm này mã nguồn mở, bạn tự vận hành nó, nên không có gì để đăng ký xin cấp và cũng không có gì để bị khóa mất.
- Nó xử lý những phần vốn rất tốn công để tự xây dựng: hết hạn hóa đơn, quy đổi tỷ giá theo thời gian thực, thanh toán thiếu hay thừa, thanh toán từng phần, hoàn tiền, và một biên nhận mà khách hàng có thể tự mình xác minh độc lập.
- Nó đi kèm sẵn những giao diện mà hầu hết mọi người cần — một màn hình point-of-sale, các nút thanh toán, một trang gây quỹ cộng đồng, plugin cho các nền tảng thương mại điện tử phổ biến — và một API đầy đủ nếu bạn muốn tích hợp nó vào phần mềm của riêng mình.
- Lightning đi kèm ngay trong cùng một lần triển khai nếu bạn muốn dùng, và đó chính là thứ khiến các khoản thanh toán dưới vài đô la trở nên khả thi.
Ranh giới ở đây đáng được nói rõ. BTCPay không biến Bitcoin thành tiền tệ nội địa của bạn, và cũng không loại bỏ sàn giao dịch hay ngân hàng nếu đó vẫn là nơi cuối cùng số tiền phải đi tới. Thứ nó loại bỏ là đơn vị xử lý thanh toán — bên trung gian từng trích một phần, giữ tiền của bạn ở giữa chừng và đòi hỏi danh tính của bạn để làm việc đó. Thứ bạn nhận lại có cùng hình dạng với một website do chính bạn tự host: nhiều quyền kiểm soát hơn, và cả phần công sức đi kèm với nó.
Bạn trở thành đơn vị xử lý thanh toán
Phần công sức đó chính là cái giá thực sự của việc tự vận hành, và tốt nhất nên hiểu rõ nó trước khi cài đặt chứ không phải sau. Không ai theo dõi uptime giúp bạn, không ai khôi phục bản sao lưu giúp bạn, và cũng không có ai ở đầu dây hỗ trợ vào đúng lúc một khách hàng khăng khăng rằng họ đã trả tiền còn bạn thì không thấy đâu cả.
- Uptime là trách nhiệm của bạn. Một hóa đơn không thể được tạo ra khi server đang gặp sự cố, nên một hệ thống thanh toán luôn phải hoạt động cần một cỗ máy có người thực sự theo dõi.
- Sao lưu là trách nhiệm của bạn. Mất server thì vẫn có thể sống sót qua được; mất descriptor của ví hay trạng thái kênh Lightning thì không.
- Việc lưu giữ khóa được chia làm hai. Tiền on-chain nằm trong một ví mà BTCPay chỉ theo dõi, đây là cách sắp xếp an toàn. Tiền Lightning lại nằm trong một ví nóng ngay trên server, điều này thì không — hãy coi số dư đó như vốn lưu động, không bao giờ là khoản tiết kiệm.
- Tranh chấp không có trọng tài phân xử. Không hề có chargeback, đó phần lớn chính là mục đích, nhưng điều đó cũng có nghĩa là mọi khoản hoàn tiền đều là một quyết định do chính bạn đưa ra và một giao dịch do chính bạn gửi đi.
- Cập nhật là trách nhiệm của bạn. Phía sau giao diện thân thiện đó là một tập hợp container trong đó có một node Bitcoin, và nó cần được duy trì kỷ luật bảo trì giống hệt như bất kỳ thứ gì khác đang chạy trên một IP công khai.
Không có điều nào trong số đó là nặng nề cả. Đó chỉ là vài phút mỗi tháng một khi mọi thứ đã chạy ổn định, cộng thêm một buổi chiều cẩn thận lúc bắt đầu. Nó đơn giản là không bằng không, và khoản phí của đơn vị xử lý thanh toán trước đây một phần chính là để mua lấy đúng thứ này.
Chọn cấu hình máy: node bên dưới quyết định tất cả
Bản thân BTCPay là một ứng dụng nhẹ. Node Bitcoin mà nó chạy dựa vào thì không, và gần như mọi sai lầm về việc chọn cấu hình ở đây đều đến từ việc tính toán ngân sách cho ứng dụng web thay vì cho blockchain bên dưới nó. Một lần triển khai tiêu chuẩn sẽ dựng lên Bitcoin Core, một bộ lập chỉ mục theo dõi ví của bạn, một cơ sở dữ liệu, một reverse proxy và ứng dụng chính — và chính Core mới là thứ đòi hỏi dung lượng đĩa, bộ nhớ và sự kiên nhẫn.
- Dung lượng lưu trữ là quyết định chọn ra gói phù hợp cho bạn. Một blockchain không pruned hiện đã vượt quá 750 GB và tăng thêm khoảng 7 GB mỗi tháng. Bản triển khai đi kèm sẵn các preset tiết kiệm dung lượng, giới hạn dữ liệu khối ở khoảng 100, 50 hoặc 25 GB thay vào đó, và mỗi mức trong số này vẫn là một node đầy đủ thực sự, tự mình xác minh mọi quy tắc.
- Pruning không rút ngắn lần đồng bộ đầu tiên. Dù thế nào Core cũng tải về và kiểm tra mọi khối kể từ khối genesis; pruning chỉ quyết định những gì được giữ lại sau đó mà thôi.
- Bộ nhớ mới là thứ quyết định tốc độ đồng bộ. 4 GB đủ để chạy, còn 8 GB giúp đồng bộ nhanh hơn rõ rệt và vẫn còn chỗ cho Lightning cùng một cơ sở dữ liệu không phải tranh cache với node.
- NVMe không phải là một lựa chọn tùy ý. Quá trình đồng bộ ban đầu bị chi phối bởi các thao tác đọc/ghi ngẫu nhiên vào cơ sở dữ liệu UTXO, nên cùng công việc đó trên một ổ đĩa chậm sẽ mất nhiều ngày thay vì vài giờ.
- Băng thông không có gì đáng nói một khi đã đồng bộ xong, nhưng lần đồng bộ đầu tiên phải kéo về toàn bộ blockchain. Một gói tính phí theo dung lượng hoàn toàn không phù hợp cho việc đó.
Trong thực tế, điều đó dẫn tới VPS-8 giá $13.99/mo — 4 vCPU EPYC, 8 GB DDR5 ECC và 120 GB NVMe Gen4 — như một lựa chọn mặc định hợp lý cho một node pruned kèm Lightning, hoặc VPS-16 giá $26.99/mo nếu bạn muốn không bao giờ phải nghĩ tới chuyện dung lượng đĩa nữa. Mọi gói VPS đều trang bị NVMe Gen4 chạy RAID-10 và băng thông truyền tải unmetered, nên dung lượng mới là biến số thực sự duy nhất. Nếu bạn muốn giữ blockchain ở chế độ unpruned — để quét lại một ví cũ, hoặc để chạy thêm một máy chủ Electrum bên cạnh cửa hàng — hãy bỏ qua hẳn dòng VPS: một máy chủ dedicated từ $64/mo với 2 × 1 TB NVMe vừa rẻ hơn vừa rộng rãi hơn nhiều so với gói VPS lớn nhất, và bài toán chi phí đó chỉ càng tệ hơn theo thời gian. Những đánh đổi ở đây cũng chính là những đánh đổi đã nói tới trong chạy một node Bitcoin đầy đủ, bởi vì đó chính xác là việc bạn đang làm ở đây, chỉ là có gắn thêm một hệ thống thanh toán lên trên.
Từng bước: từ một VPS mới đến một hệ thống thanh toán đang hoạt động
- 01Triển khai VPS và gia cố nó trước tiênMột máy Debian hoặc Ubuntu, SSH chỉ dùng khóa, firewall mặc định từ chối — trước khi bất cứ thứ gì có giá trị được đặt lên đó. Phiên bản checklist đầy đủ theo đúng thứ tự đã được trình bày trong một hướng dẫn riêng.
- 02Trỏ một tên miền về server và mở cổng 80, 443BTCPay tự cấp chứng chỉ riêng của nó ngay lần khởi động đầu tiên, và điều đó chỉ hoạt động nếu hostname đã phân giải đúng về cỗ máy và cả hai cổng đều có thể truy cập được. Làm ngược thứ tự này chính là nguyên nhân phổ biến nhất khiến việc cài đặt thất bại, bỏ xa mọi nguyên nhân khác.
- 03Clone bản triển khai Docker chính thứcDự án đi kèm sẵn một cấu hình container đã được định hình rõ ràng. Hãy dùng đúng nó thay vì tự lắp ráp từng phần bằng tay — đây chính là thứ mà lộ trình nâng cấp sau này được kiểm thử dựa trên đó.
- 04Quyết định các tùy chọn trước lần chạy đầu tiênMạng lưới, hostname, phần mềm Lightning và preset lưu trữ đều là các biến môi trường chỉ được đọc một lần lúc thiết lập. Thay đổi mức pruning sau này không hề miễn phí, nên hãy quyết định ngay từ bây giờ.
- 05Chạy script cài đặt và để nó đồng bộMọi thứ sẽ khởi chạy trong các container và Bitcoin Core bắt đầu tải khối ban đầu. Đây là phần mất nhiều thời gian nhất — vài giờ trên NVMe — và là bước duy nhất bạn không thể rút ngắn bằng cách sốt ruột.
- 06Đăng ký tài khoản quản trị ngay lập tứcTài khoản đầu tiên đăng ký sẽ trở thành quản trị viên. Hãy làm việc đó ngay khi giao diện phản hồi được, đừng để tới sáng hôm sau.
- 07Gắn một ví vào cửa hàng của bạnTạo một cửa hàng, sau đó kết nối một ví bằng cách nhập vào một khóa công khai mở rộng lấy từ một ví cứng hoặc một tài khoản riêng trong phần mềm của chính bạn. BTCPay chỉ theo dõi các địa chỉ; nó không bao giờ ký bất cứ thứ gì.
- 08Thử nghiệm với một khoản thanh toán thật, rồi mới kết nối giao diệnTự gửi cho mình một khoản nhỏ và xác nhận hóa đơn đó được thanh toán xong. Chỉ sau đó mới kết nối màn hình point-of-sale, plugin cửa hàng hoặc API mà website của bạn sẽ thực sự gọi tới.
Lightning: đáng để dùng, và cái giá thực sự phải trả
Thanh toán on-chain hoạt động ở khắp mọi nơi và tốn đúng bằng bất kỳ mức phí nào mempool đang đòi hỏi vào ngày hôm đó, điều này khiến bất cứ khoản nào dưới vài đô la trở nên bất tiện và đôi khi vô lý. Lightning giải quyết đúng vấn đề đó, và BTCPay sẽ dựng sẵn một node cho bạn ngay trong cùng một lần triển khai. Với các khoản thanh toán nhỏ hoặc thường xuyên, đây chính là câu trả lời đúng. Nhưng đó cũng là một cam kết vận hành thuộc loại khác hẳn so với một node Bitcoin, và những khác biệt đó đáng để hiểu rõ trước khi bạn bật nó lên.
- Bạn cần thanh khoản inbound trước khi có thể được trả tiền. Tự mở kênh của riêng mình chỉ cho bạn dung lượng để chi tiêu, không phải để nhận. Cho tới khi có ai đó mở một kênh hướng về phía bạn, hoặc bạn có được dung lượng inbound bằng cách khác, node của bạn sẽ không thể nhận được bất cứ khoản nào cả.
- Số dư đó là ví nóng theo đúng thiết kế. Tiền trong kênh nằm trong một ví trên chính server, luôn online vì bắt buộc phải vậy. Chỉ nên giữ ở đó phần vốn lưu động cần dùng, còn lại hãy quét sang on-chain.
- Trạng thái kênh không thể sao lưu chỉ bằng cách copy file. Khôi phục một snapshot cũ của một node Lightning có thể khiến bạn mất luôn các kênh mà snapshot đó mô tả. Hãy dùng đúng cơ chế sao lưu riêng của phần mềm Lightning bạn đang chạy, và hiểu rõ nó thực sự khôi phục được những gì.
- Downtime ở đây tốn kém hơn nhiều so với on-chain. Một node offline sẽ không thể định tuyến hay nhận thanh toán, và nếu một trạng thái kênh đã cũ quay lại online, nó có thể bị phạt.
- Kênh có chi phí on-chain ở cả hai đầu. Mở và đóng kênh đều là các giao dịch, nên thói quen mở nhiều kênh nhỏ âm thầm gây tốn kém.
- Node của bạn sẽ lộ diện nếu bạn để nó như vậy. Một node được công bố công khai sẽ phát đi alias và địa chỉ mạng của nó cho tất cả mọi người, đặt server của bạn lên một tấm bản đồ mà ai cũng có thể tra cứu.
Một hướng đi trung dung hợp lý là dùng Lightning với các kênh không công bố — bạn vẫn có thể được trả tiền mà không cần công khai hạ tầng của mình — và dùng on-chain làm mặc định cho bất cứ khoản nào lớn. Nếu bạn muốn node có thể liên lạc được mà không thể bị quy về danh tính, hãy chạy nó qua Tor — cùng lý lẽ khiến một node Bitcoin được đặt sau một dịch vụ onion thay vì một IP công khai.
Những rò rỉ danh tính mà một bản cài mặc định để lại
Đây là phần quan trọng nếu bạn chọn BTCPay chính là để thoát khỏi một đơn vị xử lý thanh toán vốn biết rõ bạn là ai. Phần mềm này loại bỏ đơn vị xử lý đó một cách hoàn hảo. Nhưng tự thân nó không loại bỏ mọi thứ khác vẫn gắn hệ thống thanh toán đó với một con người cụ thể — và phần lớn trong số đó lại đến từ những bước tưởng chừng chẳng liên quan gì tới thanh toán.
- Tên miền. Một nhà đăng ký vẫn nắm giữ danh tính của bạn ngay cả khi WHOIS công khai đã được ẩn đi, và nó cần một địa chỉ liên hệ còn hoạt động để giữ cho tên miền không bị thu hồi. Hostname chính là cách phổ biến nhất khiến một hệ thống thanh toán tự vận hành bị truy ngược về chủ sở hữu của nó.
- Minh bạch chứng chỉ (certificate transparency). Ngay khi một chứng chỉ được cấp, hostname chính xác của nó sẽ được công bố trong các log công khai mà bất kỳ ai cũng có thể tra cứu. Một subdomain mà bạn tưởng là riêng tư — pay.something, btcpay.something — sẽ được công bố ra toàn thế giới kèm theo dấu thời gian.
- Host. Nếu server được mua bằng thẻ đứng tên thật của bạn, thì cỗ máy đó mang tên thật của bạn cho dù nó chạy phần mềm gì. Điều đó đã được quyết định ngay từ lúc đăng ký, rất lâu trước hóa đơn đầu tiên.
- Khóa công khai mở rộng. Đưa cho BTCPay một xpub nghĩa là để nó theo dõi mọi địa chỉ mà khóa đó dẫn xuất ra, bao gồm cả số dư và lịch sử mà bạn chưa từng có ý định để lộ cho một ứng dụng web. Hãy dùng một tài khoản riêng cho cửa hàng, không bao giờ dùng xpub của ví chính.
- Node Lightning. Một node được công bố sẽ phát đi một alias và một địa chỉ. Một alias mang thương hiệu của bạn, đặt trên cùng một IP đang phục vụ luôn hệ thống thanh toán, sẽ gắn chặt hai thứ đó lại với nhau vĩnh viễn trong một đồ thị công khai.
- Các cuộc gọi ra ngoài. Các nhà cung cấp tỷ giá, plugin và các tích hợp thông báo đều tự kết nối ra ngoài từ cỗ máy của bạn, còn thông báo qua email thì đi qua bất kỳ tài khoản SMTP nào bạn đã cấu hình. Mỗi kết nối như vậy là một bên thứ ba nhìn thấy được server của bạn.
- Đường đi của khoản chi trả. Coin rời khỏi cửa hàng để đến một tài khoản sàn giao dịch đã xác minh danh tính sẽ mang theo cả lịch sử của nó khi tới nơi. Rò rỉ này nằm ở phía sau BTCPay, và đây chính là rò rỉ thường xuyên phá hỏng nhất mọi công sức cẩn thận đã bỏ ra ở phía trước.
Khép kín những lỗ hổng đó là việc bình thường chứ chẳng có gì quá đặc biệt. Hãy chọn một nhà đăng ký chấp nhận tiền mã hóa và chỉ thu thập tối thiểu thông tin, rồi cung cấp cho họ một địa chỉ không gắn với danh tính của bạn. Đặt cỗ máy lên một host chưa từng hỏi bạn là ai và trả tiền cho nó từ một số dư tiền mã hóa — Bitcoin mang tính danh tính giả, không ẩn danh, nên nạp tiền bằng Monero chính là thứ khép lại dấu vết on-chain nếu điều đó quan trọng với bạn. Và hãy truy cập giao diện quản trị qua một đường hầm WireGuard thay vì để lộ một trang đăng nhập cho thứ đang giữ tiền. Mỗi điều trong số này chỉ là một quyết định nhỏ thực hiện một lần; nhưng gộp lại, chúng chính là khác biệt giữa "không còn đơn vị xử lý thanh toán" và thực sự riêng tư.
Duy trì hoạt động sau khi ra mắt
Một hệ thống thanh toán đã chạy tốt suốt một năm cũng là một hệ thống thanh toán mà không ai để mắt tới suốt một năm. Một quy trình bảo trì ngắn gọn chính là thứ giúp ngăn điều đó biến thành một lần sập hệ thống đúng vào ngày bận rộn nhất của bạn.
- Cập nhật theo đúng nhịp độ của dự án, không phải theo ý riêng của bạn. Bản triển khai có một lộ trình nâng cấp di chuyển các phiên bản container tương thích với nhau cùng lúc; tự ý nâng từng phần bằng tay chính là cách một hệ thống đang chạy tốt biến thành một hệ thống hỏng.
- Sao lưu những gì không thể tạo lại được: cơ sở dữ liệu và cấu hình của cửa hàng, descriptor của ví, và bản sao lưu Lightning nếu bạn có chạy nó. Blockchain không phải là một bản sao lưu — nó chỉ tải lại từ đầu.
- Hãy khôi phục thử một lần, một cách chủ động, ngay khi mọi thứ vẫn đang ổn. Một bản sao lưu chưa từng được kiểm thử cho một hệ thống thanh toán chỉ là một giả thuyết về doanh thu của bạn.
- Theo dõi dung lượng đĩa. Một node pruned có dung lượng chiếm dụng ổn định, nhưng log và cơ sở dữ liệu thì không, và một ổ đĩa đầy sẽ khiến node dừng lại, kéo theo việc các hóa đơn cũng ngừng luôn.
- Luôn vá lỗi cho cỗ máy và giữ các cổng đóng kín. Mọi thứ trong checklist gia cố mười phút đầu tiên đều áp dụng được ở đây, chỉ là mức rủi ro cao hơn hẳn.
Nhân tiện, hãy thêm một cơ chế kiểm tra từ bên ngoài cho cửa hàng của bạn. Chỉ cần đơn giản như một công cụ giám sát gọi tới endpoint hóa đơn từ bên ngoài cũng đủ để báo cho bạn biết hệ thống thanh toán đã ngừng hoạt động trước khi khách hàng kịp phát hiện ra, và đó chính là phần lớn khác biệt thực tế giữa việc tự vận hành và việc trở nên không thể liên lạc được. Và hãy đối xử với chính cỗ máy đó đúng như những gì mười phút đầu tiên trên một VPS mới đã mô tả, bởi vì rủi ro luôn cao hơn trên một cỗ máy đang giữ tiền.
Những sai lầm khiến bạn mất tiền thật
- Nhập vào một seed phrase thay vì một khóa công khai mở rộng, biến một ứng dụng web công khai thành một ví nóng nắm giữ mọi khoản thanh toán từng nhận được.
- Cấu hình DNS sau khi đã chạy trình cài đặt, rồi thắc mắc tại sao chứng chỉ không bao giờ được cấp và trang web không chịu tải.
- Chọn preset pruning mạnh tay nhất, rồi sau đó lại cố gắn vào một ví có lịch sử nhiều năm mà node không còn cách nào quét lại được nữa.
- Coi số dư Lightning như một khoản tiết kiệm thay vì chỉ là vốn lưu động tình cờ đang nằm online.
- Sao lưu một node Lightning chỉ bằng cách copy thư mục dữ liệu của nó rồi mặc định rằng đó là một cách khôi phục hợp lệ.
- Mua một gói chỉ đủ cho ứng dụng web, rồi hết sạch dung lượng đĩa giữa chừng quá trình đồng bộ ban đầu.
- Để giao diện quản trị mở toang cho cả internet, chỉ đứng sau một mật khẩu đã dùng lại từ nơi khác.
- Đăng ký tên miền và thuê server bằng chính tên thật của mình, sau khi đã làm đúng mọi thứ khác.
BTCPay là một trong số ít phần mềm loại bỏ hoàn toàn một bên trung gian thay vì chỉ thay nó bằng một bên trung gian dễ chịu hơn. Việc cài đặt mất một buổi chiều và việc đồng bộ mất một đêm. Thứ bạn có được cuối cùng là một hệ thống thanh toán nhận cả Bitcoin lẫn Lightning, không thu phí, không giữ tiền hộ ai, và không phải trả lời trước bất kỳ ai — chạy trên một cỗ máy mà bạn có thể trả tiền thuê từ chính số dư mà nó thu về. Hãy chọn đúng dung lượng đĩa cho node, giữ seed tránh xa server, và đặt cỗ máy đó ở một nơi chưa từng hỏi tên bạn là gì.