ВСЕ СИСТЕМЫ РАБОТАЮТ 14 РЕГИОНОВ · ЗАЩИТА 1.2 TBPS ПОПОЛНЕНИЕ ЧЕРЕЗ BTC · XMR · LTC · ETH · USDT +3 МОНЕТЫ

Руководства

Как самому принимать платежи в Bitcoin с BTCPay Server

11 мин чтения

Как самому принимать платежи в Bitcoin с BTCPay Server

Любой сторонний платёжный процессор — это компания, которая может заморозить ваш счёт. Для тех, кто принимает Bitcoin, это не гипотетический риск: крупные процессоры давно ввели верификацию личности, пороги выплат и правила расчётов, и продавец, не прошедший одну из этих проверок, обычно узнаёт об этом, когда деньги уже в пути. Именно поэтому существует BTCPay Server — бесплатная программа с открытым исходным кодом, которая превращает подконтрольный вам сервер в собственную кассу: инвойсы, POS-экран, плагины магазина, Lightning — без компании-посредника, без процента и без счёта, который можно потерять. Установка — это буквально один день. А вот хорош ли результат, решает машина под капотом, и горстка деталей, которые типовая установка незаметно оставляет указывающими на вас.

Что на самом деле заменяет BTCPay Server

Сторонний процессор встаёт между вашим клиентом и вашим кошельком. Он генерирует адрес, следит за цепочкой, конвертирует сумму, какое-то время держит средства у себя и в итоге переводит их вам. На каждом из этих шагов он узнаёт о вас что-то новое — и в каждой точке может отказать. BTCPay делает ту же работу на арендованном вами железе, и разница в том, что ему известно о вас, — огромна.

  • Платежи попадают напрямую в ваш собственный кошелёк. Вы даёте BTCPay расширенный публичный ключ, он выводит из него новый адрес под каждый инвойс и следит за ним — приватного ключа для on-chain платежей у него нет никогда, и подвинуть хоть один сатоши он не может.
  • Здесь нет ни комиссии, ни аккаунта. Это ПО с открытым исходным кодом, вы разворачиваете его сами, и нет ни заявки, которую нужно подавать, ни аккаунта, который могут заблокировать.
  • Оно берёт на себя всю рутину, которую иначе пришлось бы писать самому: срок действия инвойса, конвертацию по живому курсу, недоплаты и переплаты, частичные платежи, возвраты и квитанцию, которую клиент может проверить самостоятельно.
  • Из коробки есть интерфейсы, которые нужны почти всем, — POS-экран, кнопки оплаты, страница краудфандинга, плагины для популярных платформ электронной коммерции, — а если вы встраиваете его в собственное ПО, есть и полноценный API.
  • Lightning поднимается в том же развёртывании, если он вам нужен, — именно это вообще делает возможными платежи дешевле нескольких долларов.

Стоит чётко обозначить границу. BTCPay не конвертирует Bitcoin в вашу локальную валюту и не убирает биржу или банк, если деньгам в итоге нужно попасть именно туда. Убирается здесь именно процессор — посредник, который брал свой процент, какое-то время держал ваши средства у себя и требовал за это вашу личность. Взамен вы получаете ровно то же самое, что и с сайтом, размещённым без KYC: больше контроля — и работы, которая идёт в комплекте.

Вы становитесь платёжным процессором

Эта работа — честная цена self-hosting, и её стоит осознать до установки, а не после. За аптаймом никто не следит, кроме вас, резервную копию никто не восстановит, кроме вас, и в тот момент, когда клиент настаивает, что заплатил, а вы этого не видите, на другом конце линии поддержки никого нет.

  • Аптайм — на вас. Пока сервер лежит, инвойс не выставить, так что кассе, которая обязана работать всегда, нужна машина, за которой кто-то реально следит.
  • Резервные копии — на вас. Потерю сервера пережить можно; потерю дескриптора кошелька или состояния каналов Lightning — нет.
  • Хранение ключей расходится надвое. On-chain средства лежат в кошельке, за которым BTCPay только наблюдает, — это безопасная схема. Средства Lightning лежат в горячем кошельке прямо на сервере — а это уже не безопасная схема: считайте этот баланс оборотными средствами и никогда — сбережениями.
  • У споров нет арбитра. Чарджбэков не бывает — в этом, по сути, весь смысл, — но это же значит, что каждый возврат средств вы решаете сами и сами же отправляете нужную транзакцию.
  • Обновления — на вас. Под дружелюбным интерфейсом скрывается стек контейнеров с узлом Bitcoin внутри, и он требует той же дисциплины обслуживания, что и любой другой сервис, оставленный работать на публичном IP.

Ничего из этого не тяжело. Это несколько минут в месяц, когда всё уже запущено, плюс один внимательный день в самом начале. Просто это не ноль — а комиссия процессора отчасти как раз это и покупала.

Размер машины: узел под капотом решает всё

Сам BTCPay — лёгкое приложение. А вот узел Bitcoin, с которым он работает, — нет, и почти все ошибки в расчёте размера здесь происходят от того, что бюджет считают под веб-приложение, а не под цепочку под ним. Стандартное развёртывание поднимает Bitcoin Core, индексатор, который отслеживает ваши кошельки, базу данных, reverse proxy и само приложение, — и именно Core требует диска, памяти и терпения.

  • Место на диске — это решение, которое выбирает за вас тариф. Неусечённая цепочка сегодня уже перевалила за 750 GB и растёт примерно на 7 GB в месяц. Развёртывание поставляется с пресетами экономии места, которые вместо этого ограничивают данные блоков примерно 100, 50 или 25 GB, — и в каждом случае это всё равно настоящий полный узел, который сам проверяет каждое правило.
  • Prune не сокращает время первой синхронизации. Core в любом случае скачивает и проверяет каждый блок начиная с генезис-блока; prune решает только то, что остаётся на диске после проверки.
  • Скорость синхронизации берётся именно из памяти. 4 GB достаточно, чтобы всё работало, 8 GB синхронизируются заметно быстрее и оставляют запас для Lightning и для базы данных, которой не приходится бороться с узлом за кэш.
  • NVMe — не опция. Первичная синхронизация — это в основном случайные чтения и записи в базу UTXO, поэтому та же самая работа на медленном диске занимает дни, а не часы.
  • После синхронизации трафик ничем не примечателен, но при первой синхронизации выкачивается вся цепочка целиком. Тариф с лимитом трафика для этого попросту не подходит.

На практике это сводится к VPS-8 за $13.99/mo — 4 vCPU EPYC, 8 GB DDR5 ECC и 120 GB NVMe Gen4 — как разумному варианту по умолчанию для узла с prune и Lightning, либо к VPS-16 за $26.99/mo, если вы хотите вообще больше никогда не думать о диске. Каждый тариф VPS поставляется с NVMe Gen4 в RAID-10 и безлимитным трафиком, так что единственная реальная переменная — это объём. Если вам нужна цепочка без prune — чтобы пересканировать старый кошелёк или запустить рядом с магазином ещё и Electrum-сервер, — забудьте про линейку VPS вообще: выделенный сервер от $64/mo с 2 × 1 TB NVMe одновременно дешевле и заметно просторнее самого старшего VPS, и со временем арифметика становится только хуже. Эти же компромиссы разобраны в материале про полный узел Bitcoin — ведь именно этим вы здесь и занимаетесь, просто с кассой поверх.

У prune есть одно последствие, с которым люди сталкиваются обычно слишком поздно: узел с prune не может пересканировать цепочку глубже, чем блоки, которые у него ещё остались. Направьте BTCPay на уже существующий кошелёк с историей — и старые платежи попросту не найдутся. Начинайте магазин с чистого аккаунта либо запускайте узел без prune.

Шаг за шагом: от чистого VPS до работающей кассы

  1. 01Разверните VPS и сразу защитите егоDebian или Ubuntu, SSH только по ключам, файрвол с запретом по умолчанию — ещё до того, как на сервере появится что-то ценное. Пошаговая версия этого чек-листа — отдельное руководство.
  2. 02Направьте домен на сервер и откройте порты 80 и 443BTCPay при первом запуске сам выпускает сертификат, а это работает, только если hostname уже резолвится на машину и оба порта доступны. Перепутать порядок этих шагов — самая частая причина неудачной установки с большим отрывом.
  3. 03Склонируйте официальный Docker-репозиторий проектаПроект поставляет готовую, продуманную конфигурацию контейнеров. Используйте именно её, а не собирайте всё вручную по частям, — путь обновления тестируется именно против неё.
  4. 04Определитесь с параметрами до первого запускаСеть, hostname, реализация Lightning и пресет хранения — это переменные окружения, которые считываются один раз при настройке. Поменять уровень prune потом бесплатно не получится, так что решайте сейчас.
  5. 05Запустите setup-скрипт и дайте ему синхронизироватьсяВсё поднимается в контейнерах, и Bitcoin Core начинает первичную загрузку блоков. Это самая долгая часть — несколько часов на NVMe — и единственный шаг, который нельзя поторопить.
  6. 06Сразу зарегистрируйте аккаунт администратораАдминистратором становится первый же зарегистрировавшийся аккаунт. Сделайте это в ту же минуту, как только интерфейс откликнется, а не на следующее утро.
  7. 07Подключите кошелёк к магазинуСоздайте магазин, затем подключите кошелёк, импортировав расширенный публичный ключ из аппаратного кошелька или отдельного аккаунта в вашем собственном ПО. BTCPay только следит за адресами и никогда ничего не подписывает.
  8. 08Проверьте реальным платежом, затем подключайте интерфейсОтправьте себе небольшую сумму и убедитесь, что инвойс закрывается. И только после этого подключайте POS-экран, плагин магазина или API, к которому будет обращаться ваш сайт.
Подключайте кошелёк через расширенный публичный ключ, и никогда — через seed-фразу. xpub позволяет BTCPay выводить адреса и обнаруживать платежи; seed же превратил бы публично доступное веб-приложение в горячий кошелёк, хранящий вообще все платежи, которые вы когда-либо получали. Вся модель безопасности on-chain платежей строится именно на этом одном решении.

Lightning: стоит ли оно того — и во что обходится на самом деле

On-chain платежи работают везде и стоят ровно столько, сколько в этот день стоит место в мемпуле, — из-за этого всё, что дешевле нескольких долларов, выглядит неудобно, а иногда и вовсе абсурдно. Lightning это исправляет, и BTCPay поднимет узел за вас в том же самом развёртывании. Для мелких или частых платежей это правильный ответ. Но это ещё и эксплуатационное обязательство совсем другого рода, чем узел Bitcoin, и разницу стоит понимать ещё до того, как вы его включите.

  • Чтобы вам могли платить, сначала нужна входящая ликвидность. Открытие собственного канала даёт вам возможность тратить, а не принимать. Пока кто-то не откроет канал в вашу сторону или вы не приобретёте входящую ёмкость, узел вообще не сможет ничего принять.
  • Баланс горячий по самой своей конструкции. Средства каналов лежат в кошельке прямо на сервере — онлайн, потому что иначе никак. Держите там только необходимые оборотные средства, а остальное выводите on-chain.
  • Состояние каналов не резервируется простым копированием файлов. Восстановление старого снэпшота узла Lightning может стоить вам как раз тех каналов, которые в нём описаны. Используйте штатный механизм резервного копирования вашей реализации Lightning и точно понимайте, что именно он восстанавливает.
  • Простой обходится здесь дороже, чем при on-chain платежах. Офлайн-узел не может ни маршрутизировать платежи, ни принимать их, а если в сеть вернётся устаревшее состояние канала, за это могут оштрафовать.
  • У каналов on-chain издержки на обоих концах. Открытие и закрытие — это транзакции, поэтому привычка плодить много мелких каналов исподволь обходится недёшево.
  • Ваш узел виден лишь настолько, насколько вы сами это позволите. Публично анонсированный узел рассылает всем свой алиас и сетевой адрес, помещая тем самым ваш сервер на карту, которую способен прочитать кто угодно.

Разумный средний путь — Lightning с неанонсированными каналами: так вы можете принимать платежи, не публикуя данные о своей инфраструктуре, — а on-chain оставить по умолчанию для всего сколько-нибудь крупного. Если хочется, чтобы узел оставался доступным, но не связывался с вами напрямую, запустите его через Tor — та же логика, что прячет узел Bitcoin за onion-сервисом вместо публичного IP.

Утечки личности, которые оставляет установка по умолчанию

Этот раздел важен, если вы выбрали BTCPay именно затем, чтобы уйти от процессора, который знал, кто вы. Само по себе ПО убирает этот процессор безупречно. А вот всё остальное, что привязывает кассу к конкретному человеку, само по себе никуда не девается — и в большинстве случаев источник этого — шаги, которые на первый взгляд вообще не связаны с платежами.

  • Домен. Регистратор хранит вашу личность, даже если публичный WHOIS скрыт, и ему нужен рабочий адрес, чтобы продлевать имя. Hostname — самый частый способ вычислить владельца самостоятельно развёрнутой кассы.
  • Прозрачность сертификатов. В момент выпуска сертификата точный hostname публикуется в публичных логах, которые может искать кто угодно. Поддомен, который вы считали приватным, — pay.something, btcpay.something, — объявляется на весь мир с меткой времени.
  • Хостер. Если сервер куплен по карте на ваше настоящее имя, машина числится за вашим настоящим именем — независимо от того, что на ней запущено. Это решается при регистрации, задолго до первого инвойса.
  • Расширенный публичный ключ. Отдав BTCPay xpub, вы позволяете ему следить за каждым адресом, который выводится из этого ключа, — включая балансы и историю, которые вы вовсе не планировали показывать веб-приложению. Используйте для магазина отдельный аккаунт, а не xpub своего основного кошелька.
  • Узел Lightning. Анонсированный узел публикует алиас и адрес. Алиас с названием вашего бренда на том же IP, что обслуживает вашу кассу, навсегда связывает их друг с другом в публичном графе сети.
  • Исходящие обращения. Поставщики курсов, плагины и интеграции уведомлений — все они обращаются вовне с этой же машины, а email-уведомления идут через тот SMTP-аккаунт, который вы настроили. Каждый такой сервис — это третья сторона, которая видит ваш сервер.
  • Путь вывода средств. Монеты, которые уходят из магазина на верифицированный аккаунт биржи, приходят туда вместе со своей историей. Эта утечка происходит уже после BTCPay, и именно она чаще всего сводит на нет всю осторожность, проявленную на предыдущих шагах.
Полезная рамка для понимания: BTCPay убирает посредника из платежа, а не из всего остального стека. Самостоятельно развёрнутая касса приватна ровно настолько, насколько приватен наименее приватный элемент, от которого она зависит, — домен, хостер и то, куда деньги уходят дальше.

Закрыть эти утечки — обычная работа, а не что-то экзотическое. Выберите регистратора, который принимает крипту и запрашивает минимум данных, и укажите ему адрес, не привязанный к вашей личности. Разместите машину на хостинге, который никогда не спрашивал, кто вы, и оплачивайте его с криптобаланса — Bitcoin псевдонимен, а не анонимен, так что если для вас это важно, именно пополнение через Monero закрывает on-chain след. А ещё заходите в админку через туннель WireGuard, вместо того чтобы выставлять наружу страницу входа в сервис, который держит деньги. Каждое из этих решений принимается один раз; вместе они и есть разница между «без процессора» и по-настоящему приватным.

Как касса остаётся в строю после запуска

Касса, которая исправно работает уже год, — это касса, на которую год никто не смотрел. Короткая рутина обслуживания не даёт этому превратиться в отказ именно в ваш самый горячий день.

  • Обновляйтесь в темпе проекта, а не в своём собственном. У этого развёртывания есть путь обновления, который двигает согласованные версии контейнеров вместе; обновление отдельных частей вручную — вот как рабочий стек превращается в сломанный.
  • Резервируйте то, что нельзя восстановить заново: базу данных и конфигурацию магазина, дескриптор кошелька и резервную копию Lightning, если вы её используете. Блокчейн — не резервная копия: он просто перекачивается заново.
  • Сделайте восстановление один раз намеренно, пока всё в порядке. Непроверенная резервная копия платёжной системы — это лишь гипотеза о вашей выручке.
  • Следите за диском. У узла с prune стабильный объём данных, а вот у логов и баз данных — нет, и переполненный диск останавливает узел, а вместе с ним — и выставление инвойсов.
  • Держите машину пропатченной, а порты — закрытыми. Всё из чек-листа первых десяти минут харденинга применимо и здесь, только ставки заметно выше.

Заодно добавьте внешнюю проверку магазина. Простого монитора, который снаружи стучится в эндпоинт инвойсов, достаточно, чтобы узнать о падении кассы раньше, чем об этом сообщит клиент, — а это и есть большая часть практической разницы между self-hosting и полной недоступностью. И отнеситесь к самой машине так же, как описывают первые десять минут на новом VPS, — ставки здесь выше, ведь речь о машине, которая держит деньги.

Ошибки, которые стоят реальных денег

  • Импортировать seed-фразу вместо расширенного публичного ключа, тем самым превращая публичное веб-приложение в горячий кошелёк, хранящий все когда-либо полученные платежи.
  • Настроить DNS уже после запуска инсталлятора — а потом недоумевать, почему сертификат так и не выпустился, а сайт не открывается.
  • Выбрать самый агрессивный пресет prune, а затем попытаться подключить кошелёк с историей за много лет, которую узел уже не способен пересканировать.
  • Считать баланс Lightning сбережениями, а не оборотными средствами, которые просто оказались в сети.
  • Резервировать узел Lightning простым копированием его каталога данных, ошибочно считая это рабочим способом восстановления.
  • Купить тариф, рассчитанный на веб-приложение, и упереться в нехватку диска на середине первичной синхронизации.
  • Оставить административную панель открытой для всего интернета за паролем, который уже используется где-то ещё.
  • Зарегистрировать домен и арендовать сервер на собственное имя — сделав до этого всё остальное правильно.

BTCPay — одна из немногих программ, которая убирает посредника полностью, а не заменяет его более дружелюбным. Установка — это один день, синхронизация — одна ночь. В итоге у вас остаётся касса, которая принимает Bitcoin и Lightning, ничего не берёт себе, ничего не хранит у себя и ни перед кем не отчитывается, — и работает на машине, оплатить которую можно из того же баланса, который она же и собирает. Рассчитывайте диск под узел, держите seed подальше от сервера и разместите машину там, где никто и никогда не спрашивал вашего имени.

Готовы попробовать?Разверните Офшорный VPS от $3.99/мес — без KYC, оплата криптовалютой. Начать