Любой бизнес, принимающий криптовалюту, рано или поздно замечает одно и то же противоречие. Весь смысл оплаты в Bitcoin или Monero в том, что между вами и покупателем не стоит ни одна организация, — и всё же обычный путь к приёму такой оплаты лежит через регистрацию в компании, которая сначала сама получает платёж, держит его у себя, конвертирует, проверяет вашу личность и переводит вам то, что осталось. Вы променяли банк на стартап с памятью покороче и списком запрещённых видов бизнеса подлиннее.
Альтернатива вовсе не экзотична. Собственный платёжный шлюз — это программа с открытым исходным кодом на арендованном вами сервере: она генерирует новый адрес для каждого заказа, отслеживает поступление денег в блокчейне, сообщает вашему сайту, что счёт оплачен, и при этом у неё нет полномочий переместить ни одной монеты. Это зрелое решение, которое уже много лет используется в продакшене. Ниже — вся сборка от начала до конца: что такой шлюз устраняет, чего не устраняет, как подобрать сервер и где подводные камни.
Во что на самом деле обходится платёжный процессор
Комиссия — наименее интересная статья расходов. У сервиса криптопроцессинга вы на самом деле покупаете набор зависимостей, и их стоит назвать поимённо, прежде чем решать, что они приемлемы.
| Что забирает процессор | Почему это важно |
|---|---|
| Хранение ваших денег — на минуты или на дни | Между моментом, когда покупатель заплатил, и моментом, когда деньги дошли до вас, они принадлежат процессору. Все банкротства, заморозки и побеги с деньгами клиентов в этой отрасли случались именно в этом промежутке |
| Аккаунт, привязанный к вашей личности | Процессор знает ваше настоящее имя, ваш банк, ваши обороты и платёжные привычки ваших клиентов. Хостинг без KYC в связке с кассой, требующей KYC, — это запертая дверь в стеклянной стене |
| Право решать, что вам продавать | Правила допустимого использования меняются без предупреждения и применяются задним числом. Аккаунт, который работал в прошлом квартале, в этом квартале оказывается замороженным |
| Зависимость, которую нельзя проверить | Их простой — это неработающая оплата у вас; их источник курсов — это ваши цены; их баг — это ваш потерянный заказ |
| Постоянная запись о каждой продаже | Достаточно одного судебного запроса к ним, чтобы получить всю вашу историю заказов. Вам об этом не сообщат |
Всё это — вовсе не обвинение в недобросовестности. Просто так устроен любой посредник. Если ваш бизнес не вызывает споров, хорошо капитализирован, а вы не против быть идентифицированным, посредник — вполне рациональный компромисс: вы получаете возвраты, поддержку и аптайм, за который отвечает кто-то другой. Остальная часть руководства — для всех, кто на такой компромисс отвечает «нет».

Что даёт собственный шлюз — и чего не даёт
Оценивайте выигрыш точно: именно из-за его преувеличения люди строят неверную модель угроз. Собственный шлюз меняет ровно три вещи и оставляет нетронутыми несколько важных.
Что действительно меняется. Деньги идут напрямую от покупателя на адрес, который контролируете только вы, поэтому нет ни кастодиана, ни заморозки, которую пришлось бы пережидать. Ни одной третьей стороне не сообщается, кто ваши клиенты и что вы продаёте. И никто не может лишить вас возможности принимать платежи, потому что нет аккаунта, который можно закрыть, — есть только программа, которую запускаете вы.
Что не меняется. Блокчейн Bitcoin — по-прежнему публичный реестр, и каждый адрес, который выдаёт ваш сервер, навсегда остаётся на виду. Ваши обязательства по налогам и отчётности остаются ровно такими же. А как только вы конвертируете эти монеты в местную валюту, вы сталкиваетесь с регулируемой биржей, которой понадобится ваш паспорт, — именно поэтому у большинства людей приватность на самом деле заканчивается не на приёме оплаты, а на выводе денег.
Главное достоинство, если говорить прямо: правильно настроенный собственный шлюз не хранит приватных ключей. Если сервер взломают, изымут или хостер просто заберёт его, злоумышленник получит историю ваших счетов и список ваших адресов — но не возможность потратить хотя бы один сатоши. Это совсем не та катастрофа, что потеря горячего кошелька, и именно поэтому такая архитектура стоит затраченных усилий.
Стек: что на самом деле представляет собой BTCPay Server
Ответом де-факто стал BTCPay Server: бесплатный, под лицензией MIT, размещаемый на собственном сервере и появившийся после того, как решения одного известного процессора разозлили достаточно продавцов, чтобы те создали ему замену. Это не одна программа, а небольшой стек контейнеров, которые запускаются вместе, и полезно знать, какая часть за что отвечает, ещё до того, как что-то сломается в два часа ночи.
- Нода Bitcoin. Ваша собственная копия блокчейна. Именно она избавляет схему от необходимости кому-то доверять: вы ни у кого не спрашиваете, заплатили ли вам, и никто посторонний не узнаёт, за какими адресами вы следите.
- Индексатор, который отслеживает адреса, сгенерированные из вашего кошелька, и сообщает, что на них поступает, — так что самой ноде не нужно хранить кошелёк.
- Приложение BTCPay — та часть, которую вы действительно видите. Магазины, счета, обменные курсы, POS-страница, платёжные кнопки, страницы краудфандинга, возвраты, REST API и вебхуки.
- База данных с магазинами, счетами и настройками. Это единственное незаменимое состояние на машине, что крайне важно, когда дело доходит до бэкапов.
- Обратный прокси с автоматическим TLS, чтобы страница оплаты отдавалась по HTTPS и вам не пришлось собирать это вручную.
- Дополнительные демоны — нода Lightning, нода и кошелёк Monero, другие блокчейны, — каждый из которых ощутимо нагружает машину. Добавляйте их осознанно, а не по умолчанию.
Развёртывание — это стек Docker Compose, которым управляет файл переменных окружения: вы указываете, какие дополнительные компоненты вам нужны, запускаете скрипт установки, и конфигурация генерируется за вас. Это настоящее преимущество перед ручной сборкой шести сервисов — и одновременно причина, по которой машине нужно больше диска, чем можно было бы предположить.
Выбор сервера: всё решает диск
CPU почти никогда не становится узким местом. Шлюз, обрабатывающий несколько сотен счетов в день, большую часть времени простаивает: серьёзная нагрузка бывает только при начальной загрузке блоков, а дальше всё идёт тонкой струйкой. Память важнее, а диск решает всё. Прежде чем что-либо заказывать, определите, в какую строку таблицы попадаете вы.
| Конфигурация | Сколько диска закладывать | Разумный объём RAM | Для кого |
|---|---|---|---|
| Pruned-нода Bitcoin, только ончейн | ~40–60 GB всего, включая операционную систему | 4 GB | Большинство продавцов. Правильный выбор по умолчанию |
| Pruned-нода плюс Lightning | ~60–80 GB | 8 GB | Небольшие частые платежи, где иначе львиную долю съедали бы комиссии |
| Полная нода Bitcoin без прунинга | ~1 TB, с запасом на годы роста | 8 GB | Те, кому нода нужна и для другого софта, или кто ценит наличие всего блокчейна |
| Добавление ноды Monero | Плюс ~120 GB с прунингом, ~300 GB без него | +4 GB | Все, кому нужны платежи, о которых не рассказывает публичный реестр |
| Всё сразу, без прунинга | 1.5 TB и больше | 16 GB | Редкость и обычно признак того, что шлюз пора разнести на две машины |
Две детали регулярно застают людей врасплох, и обе стоят времени, а не денег. Во-первых, прунинг экономит диск, но не трафик: во время начальной синхронизации нода всё равно скачивает и проверяет весь блокчейн, а затем удаляет старые блоки, которые ей больше не нужны. Закладывайте на эту первую синхронизацию несколько сотен гигабайт трафика независимо от итогового объёма на диске — именно поэтому безлимитный трафик должен входить в список требований. Во-вторых, NVMe здесь не роскошь. Начальная загрузка блоков — это беспощадный случайный доступ к диску: синхронизация, которая на NVMe занимает день, на обычном жёстком диске может растянуться на неделю, и всю эту неделю вы будете гадать, не сломалось ли что-нибудь.
Сначала прунинг, расширение — потом; наоборот будет больно. Переход с pruned-ноды на полную означает повторную синхронизацию с генезис-блока. Переход с полной ноды на pruned — это смена конфигурации и перезапуск. Если сомневаетесь, начинайте с прунинга: шлюз работает точно так же, а теряете вы только возможность раздавать исторические блоки другим пирам.
Шаг 1 — подготовка и защита сервера
Закажите сервер заранее и дайте блокчейну синхронизироваться, пока вы занимаетесь всем остальным. Правильный вариант — KVM VPS с полным root-доступом: для Docker нужен контроль на уровне ядра, а вам нужно, чтобы машина была вашей, а не контейнером на чьей-то общей платформе. Оплатите его так же, как собираетесь получать оплату сами: эту сторону вопроса разбирает наше руководство о том, как купить VPS за Bitcoin, а руководство по выбору юрисдикции поможет решить, где его разместить.
Защитите сервер, пока он ещё пуст: пустым он останется недолго, а эта машина по самой своей сути — публичное объявление о том, что через неё идут деньги. SSH только по ключам, никакой аутентификации по паролю, файрвол с запретом по умолчанию, где открыты только порты 22, 80 и 443, автоматические обновления безопасности, а если получится — доступ к самому SSH-порту только с адресов, которые вы контролируете. Чек-лист защиты сервера в первый час — ровно этот список, и пока шлюза ещё нет, на него уйдёт двадцать минут, а не полдня.
Направьте на машину доменное имя ещё до установки — скрипту установки нужен домен, чтобы при первом запуске запросить сертификат. Отдельного поддомена вполне достаточно, и большинство так и поступает. Учтите, что это имя станет частью вашей публичной страницы оплаты, поэтому в момент выпуска сертификата оно появится в журналах Certificate Transparency — навсегда и в открытом для поиска виде. Выбирайте имя, которое вы готовы навечно оставить в индексах, а если сама связь этого имени с вашим основным сайтом чувствительна, прочитайте нашу заметку о том, что раскрывает имя хоста, прежде чем его выбирать.
Шаг 2 — установка шлюза
Установка намеренно скучна: клонируйте репозиторий развёртывания, экспортируйте несколько переменных окружения, описывающих, что вам нужно, и запустите скрипт установки. Важны имя хоста, нужные блокчейны и дополнительные фрагменты — какая реализация Lightning, включать ли прунинг, добавлять ли другие демоны. Есть и полнофункциональный веб-установщик, но путь через переменные окружения можно повторить по своим заметкам и через полгода, а воспроизводимость здесь ценнее удобства.
Дальше — ожидание. Стек поднимается за пару минут, после чего нода Bitcoin тратит от нескольких часов до пары суток, чтобы догнать блокчейн, и BTCPay честно сообщает, что синхронизация ещё идёт, а не делает вид, будто всё работает. Не создавайте счета в этот период и не делайте по нему никаких выводов. Используйте паузу с пользой: сразу создайте учётную запись администратора и включите двухфакторную аутентификацию, потому что этот интерфейс — пульт управления вашей выручкой и он доступен из всего интернета.
Пока ждёте, обратите внимание на две настройки. Задайте срок действия счёта с учётом реального времени подтверждений: по умолчанию это четверть часа — достаточно для Lightning, но впритык для ончейн-платежа во время скачка комиссий. И настройте допуск по оплате: он определяет, будет ли счёт, оплаченный с недостачей в несколько центов, закрыт или повиснет. Нулевой допуск порождает тикеты в поддержку; небольшой процент — ни одного. Одно это поле избавляет от большего числа писем покупателей, чем любое другое.
Шаг 3 — подключение кошелька без ключей на сервере
Именно этот шаг определяет, стоило ли вообще связываться с собственным шлюзом, и именно его чаще всего делают неправильно в спешке.
BTCPay может создать для вас кошелёк прямо на сервере — с приватными ключами на сервере. Не делайте этого для магазина, который принимает настоящие деньги. Правильный подход — создать кошелёк в другом месте (на аппаратном кошельке или в десктопном кошельке на другой машине) и передать серверу только расширенный публичный ключ — xpub. Эта единственная строка позволяет шлюзу генерировать неограниченную последовательность адресов для приёма платежей и следить за ними, оставаясь при этом математически неспособным что-либо потратить. Ваши ключи остаются там, куда вы их положили, а сервер превращается в очень хорошо осведомлённого наблюдателя.
После подключения не полагайтесь на допущения, а проверьте. Создайте счёт на один цент, оплатите его с кошелька, который вы контролируете, и убедитесь в трёх вещах: адрес есть в вашем собственном кошельке, счёт закрылся в BTCPay, а средства видны и доступны для траты в вашем собственном приложении-кошельке — не только в интерфейсе шлюза. Такая тройная проверка позволяет обнаружить неверный путь деривации за пять минут, а не после первого настоящего покупателя.
Не тратьте с этого аккаунта через второй кошелёк. Индексатор следит за ограниченным окном неиспользованных адресов, идущих после последнего адреса, который он видел использованным. Если другой кошелёк незаметно расходует адреса из того же аккаунта, шлюз может смотреть не на тот участок последовательности и пропустить платёж, который на самом деле пришёл. Держите аккаунт магазина только для магазина, а если вам нужен горячий баланс для возвратов или выплат, заведите отдельный кошелёк с небольшим запасом средств, вместо того чтобы ставить под угрозу основной.
Шаг 4 — Lightning и Monero, если они нужны
И то и другое полезно, и ни то ни другое не даётся даром, так что добавляйте их по просьбе клиентов, а не потому, что есть такая галочка.
Lightning делает мелкие платежи осмысленными: они мгновенные, практически бесплатные и не боятся скачков комиссий, из-за которых ончейн-счёт на четыре доллара превращается в абсурд. Подвох не в софте — стек установит его за вас, — а во входящей ликвидности. Вам могут заплатить ровно столько, сколько способны принять ваши каналы, поэтому только что запущенная нода без входящей ёмкости вообще ничего не сможет принять, пока вы не откроете каналы, не купите входящую ёмкость или не воспользуетесь сервисом ликвидности. Заложите на это полдня и некоторый капитал. И относитесь к бэкапам этой ноды как к задаче, отдельной от всего остального на сервере: состояние каналов Lightning — живое, восстановление из старого снапшота может стоить вам баланса канала, а файл восстановления, который вас защищает, нужно держать актуальным и вне этой машины.
Monero — компромисс с противоположной стороны: ни каналов, ни ликвидности, ни маршрутизации — только второй блокчейн со своим демоном и платежи, о которых публичный реестр ничего не сообщает наблюдателям. BTCPay поддерживает Monero через плагин, который работает с вашей собственной нодой Monero и кошельком только для просмотра, — по тому же принципу, что и xpub: вы передаёте серверу адрес и приватный ключ просмотра, чтобы он видел входящие платежи, а ключ траты храните в другом месте. Два эксплуатационных факта, которые нужно учесть заранее: средства в Monero требуют десяти подтверждений, прежде чем их можно потратить, — это примерно двадцать минут, так что срок действия счёта и логика выполнения заказов должны это допускать; кроме того, демон занимает немало места на диске. Если вы ещё только выбираете, какие монеты вообще принимать, наше сравнение Monero, Bitcoin и USDT — более короткий путь к решению.
Шаг 5 — интеграция с сайтом
Шлюз бесполезен, пока ваше приложение не узнаёт, что счёт оплачен. Есть три способа интеграции — по возрастанию трудозатрат и степени контроля.
- Плагин, если вы работаете на одной из популярных e-commerce-платформ. Установите его, вставьте API-ключ — и за полдня всё готово. Этого достаточно для большинства реальных внедрений, и медалей за отказ от этого варианта не выдают.
- Платёжные кнопки или готовая страница оплаты, если вы продаёте всего несколько товаров или принимаете пожертвования. Скопируйте HTML-фрагмент — и BTCPay проведёт весь процесс оплаты на своём собственном домене.
- REST API, если у вас собственное приложение. Создавайте счета программно, получайте вебхуки при смене их статуса и полностью контролируйте пользовательский опыт.
Какой бы путь вы ни выбрали, правило выполнения заказов одно и не обсуждается: никогда не отправляйте заказ на основании непроверенного вебхука. Вебхуки подписываются общим секретом — проверяйте подпись в каждом запросе, а затем обращайтесь к API, чтобы убедиться, что счёт действительно находится в том состоянии, о котором заявляет вебхук. Эндпоинт без аутентификации, помечающий заказы как оплаченные, — это генератор бесплатных товаров, и кто-нибудь со сканером найдёт его гораздо раньше, чем вы.
Затем решите, что для вашего бизнеса значит «оплачено». Засчитывать неподтверждённую транзакцию можно мгновенно, но тогда вы рискуете, что её заменят другой транзакцией; ожидание одного подтверждения стоит покупателю в среднем десяти минут и снимает почти весь этот риск. Цифровые товары, которые выдаются мгновенно, заслуживают подтверждения. Физический товар, который уйдёт завтра, — нет: посылка не сдвинется с места раньше, чем блок.
Эксплуатация: бэкапы, обновления и сценарии сбоев
Платёжный шлюз — это инфраструктура, а инфраструктуру оценивают по плохому дню, а не по хорошему. Три привычки покрывают почти все варианты того, как что-то может пойти не так.
Делайте бэкап того, что действительно нужно. Блокчейн сюда не относится — это несколько сотен гигабайт, которые интернет с радостью пришлёт вам ещё раз. Незаменимы база данных магазинов, счетов и настроек, конфигурация и всё, что связано с Lightning. В комплекте развёртывания есть скрипт бэкапа, который сохраняет именно это; дисциплина в том, чтобы запускать его по расписанию, отправлять результат в другое место, шифровать перед отправкой и хотя бы раз восстановиться из него, чтобы доказать, что он работает. Зашифрованный бэкап вне сервера — та же схема, что и везде на этом сайте, только здесь архив — это полная запись вашей выручки, так что шифрование обязательно.
Обновляйтесь осознанно. У стека есть скрипт обновления, и ведёт он себя прилично, но шлюз, который обновляется сам без присмотра, — это шлюз, который может лежать, пока вы спите. Читайте примечания к релизам, сначала делайте бэкап базы данных и обновляйтесь в спокойные часы. И никогда — во время акции.
Понимайте, во что на самом деле обходится простой. Это обнадёживающая часть. Если шлюз лежит, новые покупатели не могут создать счёт — это проблема доступности, и вполне реальная. Но деньги, уже отправленные на ваши адреса, не потеряны, не задержаны и ничем не рискуют: они лежат в кошельке, ключи от которого никогда не были на сервере, и будут на месте, когда нода вернётся и пересканирует блокчейн. Простой стоит вам продаж, а не средств. Эту разницу стоит усвоить, потому что она превращает аварию в три часа ночи в задачу, которая спокойно подождёт до завтрака.
Приватность на деле: что по-прежнему видно в блокчейне
Убрав процессор, вы убираете только процессор. Bitcoin от этого не становится приватным, а собственный шлюз, если не следить, может даже незаметно ухудшить вашу ончейн-приватность.
| Что утекает | Почему | Что с этим делать |
|---|---|---|
| Вся история вашей выручки — любому, у кого есть xpub | Из одного расширенного публичного ключа выводятся все адреса, которые ваш магазин когда-либо будет использовать | Относитесь к xpub как к коммерческой тайне. Никогда не вставляйте его в обозреватель блоков или в тикет поддержки |
| Какие клиенты вам платили — со связью между ними | Объединение множества оплат по счетам в одну транзакцию доказывает, что все они получены одним и тем же лицом | Консолидируйте редко, крупными партиями и в спокойное время — или не консолидируйте вовсе |
| Связь между страницей оплаты и вашим основным сайтом | Certificate Transparency, DNS-записи и страница, в которую встроена платёжная форма | Исходите из того, что эта связь публична. Если она не должна быть публичной, это ограничение нужно закладывать в архитектуру, а не в последующий патч |
| Ваши собственные сеансы администрирования | Журналы доступа сервера фиксируют, кто администрирует машину и откуда | Никогда не заходите на шлюз с адреса, который вас идентифицирует. Подробная версия — в нашем руководстве по OpSec для серверов |
| В конечном счёте всё — на бирже | Конвертация в фиат — регулируемое узкое место, и там видна история монет | Технически это не исправить. Учитывайте это заранее или принимайте оплату в том, что реестр не публикует |
Две меры стоят усилий, и обе уже встроены. Включение совместных платежей в стиле payjoin ломает наивное предположение, что все входы транзакции принадлежат одному человеку, — а это самая полезная эвристика, на которую опираются аналитики блокчейна. А если предлагать Monero наряду с Bitcoin, покупатели, которым это важнее всего, просто изначально ничего не записывают в публичный реестр. Ни то ни другое не волшебство, но и то и другое повышает цену слежки за вами.
Юридическая часть, которую никто не любит
Коротко и не в качестве юридической консультации: регулируется не запуск программы. Регулироваться может то, что вы делаете с деньгами.
В большинстве юрисдикций приём криптовалюты в оплату собственных товаров и услуг — обычная коммерческая сделка. Вы продавец, которому платят, а не финансовое учреждение. Обязательства, которые из этого следуют, у вас уже есть: признавайте выручку по её стоимости на день получения, применяйте тот же налог с продаж или НДС, что и при оплате картой, и ведите учёт, который выдержит аудит. Собственный шлюз это скорее упрощает, чем усложняет, потому что история счетов принадлежит вам и она полная.
Граница смещается, когда вы начинаете распоряжаться чужими деньгами. Конвертация, перевод или хранение криптовалюты от имени третьих лиц почти везде требует лицензии, и «но у меня же свой сервер» — не оправдание. Санкционные обязательства тоже целиком переживают смену архитектуры. А приём платежей без KYC — совсем не то же самое, что приём платежей, о преступном характере которых вам известно: первое законно в большей части мира, второе — нигде. Наше руководство о том, законен ли офшорный хостинг, разбирает то же различие подробнее.
Вся сборка на одной странице
Если отбросить объяснения, это проект на выходные, большая часть которого — ожидание:
- Определите конфигурацию: pruned или полная нода, с Lightning или без, с Monero или без. От этого зависит диск, а от диска — тариф.
- Закажите сервер — NVMe, безлимитный трафик, полный root — и оплатите его в той валюте, которую собираетесь принимать.
- Защитите его, пока он пуст, затем направьте на него доменное имя и дождитесь выпуска сертификата.
- Разверните стек из файла переменных окружения и дождитесь синхронизации ноды. Пока она идёт, не делайте никаких выводов.
- Создайте кошелёк в другом месте и передайте серверу только расширенный публичный ключ. Прежде всего остального проверьте связку счётом на один цент.
- Добавляйте Lightning или Monero, только если ими будут пользоваться клиенты, и соответственно заложите ликвидность или диск.
- Интегрируйте через плагин, кнопку или API — и проверяйте подпись каждого вебхука, сверяясь с API, прежде чем отправить хотя бы один заказ.
- Настройте бэкап по расписанию, шифруйте его, отправляйте за пределы машины и один раз восстановитесь из него, чтобы знать, что он работает.
В итоге вы получаете нечто неброское, но по-настоящему важное: оплату без единой компании посередине. Деньги приходят на адреса, с которых тратить можете только вы, закрыть аккаунт невозможно, потому что аккаунта нет, а вся эта конструкция стоит одного небольшого сервера. Если вам нужна такая же независимость и для машины, на которой всё это работает, для этого и существует хостинг с оплатой в Bitcoin — и, что приятно, оба решения на самом деле одно и то же решение, принятое дважды.