Талисман NordBastion — полярный медведь — стоит за резной нордической каменной стойкой продавца; над ней парит голографическая панель чекаута цвета циан с QR-кодом, янтарным символом Bitcoin и значком молнии, а единая непрерывная дуга светящихся монет тянется от панели прямо в открытую дверь хранилища с рунами рядом с ним, а позади — серверная стойка и арочное окно, подсвеченное северным сиянием.
Инструкция · Криптоплатежи·21 мин чтения · 60 мин практики

Примите платёж самостоятельно.
Не осталось никого, кто мог бы это заморозить.

Любой карточный процессор и любой сторонний криптошлюз встаёт между вами и вашим клиентом, забирает процент, ведёт список того, кто и сколько вам заплатил, и оставляет за собой право всё остановить. BTCPay Server — программа, которая убирает их из уравнения: платёжный процессор с открытым исходным кодом, размещаемый на собственном сервере, некастодиальный, где монеты попадают прямо в кошелёк, с которого сервер не может потратить. Шесть шагов к рабочему чекауту на Bitcoin и Lightning на машине, которую вы арендуете анонимно, — форма узла, определяющая бюджет, ключ только для просмотра, проблема входящей ликвидности и правило резервного копирования, которое Lightning нарушает. Машина стоит $7.90 в месяц. Проверено на Debian 12.

Шесть шагов
  1. 01

    Выбор

    Полный, обрезанный или внешний узел

  2. 02

    Провизионирование

    Сначала домен, затем четыре порта

  3. 03

    Развернуть

    Один генератор, одна команда

  4. 04

    Подключиться

    Ключ только для просмотра, никогда не seed-фраза

  5. 05

    Lightning

    Каналы и входящая ёмкость

  6. 06

    Запуск

    Чекаут, резервные копии, обновления

Перед началом · Что такое процессор

Bitcoin убрал банк. Большинство магазинов возвращают его на место.

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

Затем магазину нужно реально принимать платежи, и практические требования наваливаются все сразу. Каждому инвойсу нужен собственный адрес, чтобы платежи можно было различить. Кто-то должен наблюдать за цепочкой и решать, когда инвойс оплачен. Сумму нужно указывать в валюте, в которой думает клиент, по курсу, который продержится достаточно долго, чтобы клиент успел нажать «отправить». Статус заказа должен возвращаться обратно в магазин. И всё это должно работать в два часа ночи, пока никто не смотрит. Построить всё это — целый проект; не строить это — вот почему почти все вместо этого регистрируются у стороннего хостингового шлюза, — и одной заполненной формой возвращают посредника в систему, изначально спроектированную без него.

Стоит прямо сказать, чем именно владеет этот посредник, потому что это больше, чем просто комиссия. Он держит монеты — по крайней мере, до момента выплаты, а значит, может её отложить. Он держит список: каждого клиента, каждую сумму, каждую метку времени, каждый товар — в базе данных, которую вы не можете ни прочитать, ни удалить. Он держит досье на вашу личность, потому что компания, прикасающаяся к чужим деньгам, обязана его собирать. И он держит рубильник, потому что условия обслуживания оставляют за ним право решить, что ваш бизнес больше не желанен, — решение, которое приходит по email, распространяется и на баланс, и на аккаунт, и на практике не подлежит обжалованию.

BTCPay Server — ответ именно на эту проблему и ни на что больше. Это бесплатный платёжный процессор с открытым исходным кодом, который вы запускаете на собственной машине: он выводит адрес для каждого инвойса, наблюдает за цепочкой, показывает цены в фиате, предоставляет чекаут и API, а также умеет работать с Lightning. Он никогда не держит ваши монеты, потому что кошелёк, за которым он наблюдает, и так принадлежит вам. Четыре способа принять криптоплатёж и во что каждый из них реально обходится:

Свойство Сторонний криптошлюз Голый адрес в футере BTCPay на чужом экземпляре BTCPay на собственном VPS
Кто держит монетыШлюз — до выплатыВыВы — он наблюдает, но не может тратитьВы — он наблюдает, но не может тратить
Кто может остановить вашу торговлюШлюз — по emailНиктоОператор экземпляраНикто
Кто видит каждого клиента и каждую суммуШлюз — навсегдаВсе — один адрес, одна публичная суммаОператор экземпляраВы
Требуется документ, удостоверяющий личностьДа, до первой выплатыНетВсё, что потребует операторНет
Стоимость за транзакциюПроцент — и так навсегдаНичегоНичегоНичего — только $7.90 в месяц, фиксированно
Отличает один инвойс от другогоДаНет — сверяете вручнуюДаДа
Выбирайте, когдаВам нужен нулевой объём эксплуатации, и вы принимаете условияПожертвования, по несколько раз в годВам нужен софт, но не серверВыручка — ваша, и список тоже ваш

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

Шаг 01 · Выбор

Один выбор определяет весь счёт целиком. Сколько цепочки вы храните?

Платёжный процессор должен уметь честно ответить на один вопрос: оплачен ли этот инвойс? Чтобы ответить на него, нужно наблюдать за сетью Bitcoin, а наблюдать за ней как следует — значит держать узел, который сам проверяет блоки, а не верит чужим словам. Этот узел и есть весь аппаратный бюджет проекта — сам BTCPay, индексатор и база данных вместе взятые рядом с ним не более чем погрешность округления.

Есть три схемы, в которых есть смысл, и одна, в которой его нет. Архивный узел хранит каждый когда-либо добытый блок: уверенно за 700 GB в 2026 году, и растёт примерно на 50 GB в год. Он нужен, если вы также планируете запускать обозреватель блокчейна или заниматься историческим анализом, а для магазина это избыточно. Обрезанный узел скачивает и полностью проверяет каждый блок точно так же, а затем отбрасывает старые, храня скользящее окно. Модель безопасности идентична — и именно здесь люди ошибаются, потому что «обрезанный» звучит как «частичный», а это не так, — и генератор развёртывания поставляет для этого готовые фрагменты.

Внешний узел — третий вариант: направить стек на Bitcoin-узел, которым вы уже управляете, через приватное соединение. Если вы уже прошли руководство по узлу Lightning, нет смысла держать вторую копию цепочки, а mesh VPN между двумя машинами — чистый способ их соединить. А вот что не имеет смысла — направлять магазин на чужой публичный узел: он узнаёт каждый адрес, за которым вы следите, то есть вашу выручку, а ещё способен солгать о том, был ли оплачен инвойс.

Развёртывание Цепочка на диске Требуемый общий объём Чем вы жертвуете
Обрезанный, минимальное окно~5–25 GB~40 GBПересканирования и любой запас на ошибку. Минимальное значение не рекомендуется.
Обрезанный, окно ~50 GB~50 GB~80 GBНичего такого, что заметил бы магазин. Разумный минимум.
Обрезанный, окно ~100 GB~100 GB~140 GBНичего. Комфортный вариант по умолчанию, с запасом для Lightning.
Архивный, полная история700 GB +~960 GBНичего — но вы платите за это каждый месяц, и так всегда.
Внешний узел, которым вы уже управляетеНа этой машине — ничего~40 GBНезависимость — чекаут падает вместе с другой машиной.
Единственное, что обрезка у вас по-настоящему отнимает

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

Ещё одно решение нужно принять здесь, а не позже, потому что оно меняет то, что соберёт установщик: нужен ли вам вообще Lightning с первого дня. Режим только ончейн — это полноценная конфигурация и вполне достойная точка старта. Добавить Lightning позже поддерживается и не болезненно, но это второй демон со своими средствами и своими правилами резервного копирования, и есть смысл сначала убедиться, что реальные деньги доходят по простому пути, прежде чем вводить сложный.

Шаг 02 · Подготовка

Сначала должен появиться домен. Установщик запросит сертификат.

Закажите машину. В панели: Order → VPS → Garrison, образ Debian 12, в любом бастионе, где вы хотите держать записи магазина, — Хельсинки, Стокгольм, Осло или Рейкьявик. Garrison — правильный выбор по умолчанию, потому что он вмещает обрезанную цепочку на 100 GB, узел Lightning и базу данных, и вам не придётся снова думать о диске ещё много лет. Sentinel подойдёт при более жёсткой обрезке; Bulwark — тариф для архивного узла. Для открытия аккаунта не нужен email, а инвойс оплачивается в Monero, Bitcoin, Lightning или любом другом поддерживаемом активе, — и это приятная часть именно этого проекта, ведь вы строите машину для приёма криптоплатежей, а платите за неё одним из них.

Затем, прежде чем делать что-либо ещё, пройдите чек-лист защиты первого часа — SSH только по ключу на перенесённом порту, автоматические обновления, файрвол с запретом по умолчанию. Эта машина в итоге будет хранить записи о каждом вашем клиенте и ключевой материал узла Lightning с живыми средствами внутри. Это не та машина, которую можно оставить с парольной аутентификацией на неделю.

Теперь DNS-запись, и сделайте это до запуска установщика, а не после. Выберите имя хоста, на котором будет жить чекаут, — shop.example.com, pay.example.com, что угодно подходящее, — и направьте A-запись на адрес VPS, плюс AAAA, если нужен доступ по IPv6. Дайте ей распространиться. Обратный прокси, который настраивает установщик, попробует получить сертификат именно для этого имени при первом запуске, используя HTTP-проверку, которая требует, чтобы имя уже указывало на эту машину. Запись, которая ещё не распространилась, — безоговорочно самый частый способ, которым первая установка заканчивается запутывающей ошибкой.

Имя хоста не совсем постоянно, но относитесь к нему так, будто это так

Развёртывание включает скрипт для смены домена впоследствии, так что это исправимо, а не фатально. Что не исправить одной командой — так это всё, что от этого зависит: сертификат перевыпускается, каждая розданная вами кнопка оплаты и URL вебхука указывают на старое имя, Lightning-адрес — это имя на домене, и он переезжает вместе с доменом, а любому плагину для магазина требуется перенастройка. Выбирайте имя, которое вы готовы держать на бланке годами, и предпочитайте поддомен уже публикуемого вами домена новому имени, описывающему, чем занимается машина.

Затем напишите правила файрвола, пока ещё никто ничего не слушает. Четыре порта, и только четыре. Чекаут по необходимости — публичная HTTPS-точка: браузер клиента должен до неё дотянуться, — и порт 80 остаётся открытым, потому что его использует продление сертификата. Пиринговый порт Lightning нужен, только если вы хотите, чтобы другие узлы могли открывать каналы в вашу сторону, а шаг 05 объяснит, почему вы этого хотите. Пиринговый порт Bitcoin вообще не нужно открывать: ваш узел прекрасно устанавливает исходящие соединения сам, а открытие его на вход лишь облегчает его поиск.

ufw default deny incoming
ufw allow 47222/tcp                  # administrative SSH, moved off 22
ufw allow 80/tcp                     # ACME HTTP-01 challenge and the redirect
ufw allow 443/tcp                    # the checkout
ufw allow 9735/tcp                   # Lightning peer-to-peer, only if you want inbound channels
ufw enable
ufw status numbered

Прежде чем продолжить — два замечания о ресурсах. Добавьте машине swap, если его ещё нет: первоначальная загрузка блоков — самый прожорливый до памяти час этого проекта, и 4 GB RAM с 2 GB swap ведут себя намного лучше, чем просто 4 GB. А также сверьте арифметику диска из шага 01 с тарифом, который вы на самом деле заказали, потому что узел, заполнивший том посреди синхронизации, не откажет вежливо — он повредит собственный индекс и начнёт всё заново.

fallocate -l 2G /swapfile && chmod 600 /swapfile
mkswap /swapfile && swapon /swapfile
echo '/swapfile none swap sw 0 0' >> /etc/fstab
df -h /                              # confirm the volume matches step 01
Шаг 03 · Установка

Генератор, а не compose-файл. Вы описываете — он собирает.

Официальное развёртывание — это не docker-compose.yml, который вы редактируете руками. Это генератор: вы описываете нужное развёртывание переменными окружения, а скрипт собирает compose-файл из библиотеки фрагментов — один для Bitcoin Core, один для индексатора, один для PostgreSQL, один для приложения BTCPay, один для каждой реализации Lightning, один для обратного прокси и длинный хвост опциональных дополнений. Это более удачное решение, чем кажется на первый взгляд, потому что обновления пересобирают файл заново, а не заставляют вас вручную сливать чужие изменения со своими. Это также значит, что блок переменных окружения ниже — это и есть настоящая конфигурация вашего развёртывания, и её стоит хранить там же, где остальные заметки по инфраструктуре.

Клонируйте репозиторий и экспортируйте переменные окружения. Каждая строка ниже напрямую соответствует решению из шага 01: имя хоста — это домен, который вы направили в шаге 02, фрагмент хранилища — это выбранное вами окно обрезки, а переменная Lightning — это либо конкретная реализация, либо она вовсе опущена для запуска только в ончейн-режиме.

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

export BTCPAY_HOST="pay.example.com"          # exactly the name you pointed in step 02
export NBITCOIN_NETWORK="mainnet"
export BTCPAYGEN_CRYPTO1="btc"
export BTCPAYGEN_REVERSEPROXY="nginx"
export BTCPAYGEN_LIGHTNING="clightning"       # or "lnd", or omit for on-chain only
export BTCPAYGEN_ADDITIONAL_FRAGMENTS="opt-save-storage-s"   # ~50 GB pruned window
export BTCPAY_ENABLE_SSH=true
export LETSENCRYPT_EMAIL="you@example.com"

. ./btcpay-setup.sh -i

Две детали в этом блоке заслуживают отдельного предложения каждая. Ведущая точка в . ./btcpay-setup.sh -i — не опечатка: скрипт не выполняется, а подключается через source, поэтому заданное им окружение остаётся в вашей оболочке, а вспомогательные команды продолжают работать и после этого. А имя фрагмента хранилища зависит от версии: генератор поставлял варианты с обрезкой примерно до 100, 50, 25 и 5 GB под именами, которые менялись от релиза к релизу. Сверяйтесь со списком фрагментов в только что склонированном вами репозитории, а не доверяйте значению, скопированному из блог-поста, включая этот.

Установщик проработает несколько минут, скачает много образов, получит сертификат и всё запустит. Затем начинается ожидание: узлу нужно скачать и проверить цепочку, прежде чем магазин сможет подтверждать платежи, а это часы, а не минуты, даже при обрезке, потому что обрезка отбрасывает блоки только после их проверки, а не пропускает саму работу. Веб-интерфейс доступен сразу и покажет баннер синхронизации. Не выставляйте настоящий инвойс, пока он не исчезнет.

./bitcoin-cli.sh getblockchaininfo | grep -E 'blocks|headers|verificationprogress|pruned'
docker ps --format '{{.Names}}\t{{.Status}}'
Займите учётную запись администратора в ближайшие пять минут

У свежего экземпляра нет ни одного пользователя, и первая же зарегистрированная учётная запись становится администраторской. Пока вы её не заняли, это может сделать кто угодно, кто доберётся до URL, — а URL не секрет: в момент выдачи сертификата имя хоста было опубликовано в открытых логах прозрачности сертификатов, которые постоянно индексируются и сканируются людьми, ищущими именно такой случай. Откройте сайт и зарегистрируйтесь, прежде чем делать что-либо ещё, а затем проверьте настройки сервера и убедитесь, что регистрация не открыта для незнакомцев. Это пятиминутное окно, которое люди оставляют открытым на дни, потому что магазин «ещё не запущен».

Пока вы ещё внутри конфигурации, стоит знать о двух опциональных фрагментах. Один добавляет скрытый сервис Tor, так что чекаут становится доступен по v3 onion-адресу вдобавок к обычному, — полезно для клиентов, которые предпочли бы не разрешать ваш домен, и это та же идея, что и в руководстве по скрытому сервису. Другой добавляет вторую криптовалюту. Оба настраиваются одинаково — добавлением в переменную additional-fragments и повторным запуском setup-скрипта; генератор пересобирает compose-файл и перезапускает только то, что изменилось.

Шаг 04 · Подключение

Дайте ему публичный ключ. Никогда не давайте seed-фразу.

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

Механизм, стоящий за этой рекомендацией, достаточно изящен, чтобы его стоило понять. Современные кошельки иерархичны: один seed выводит целое дерево ключей, и существует расширенный публичный ключ — xpub, или его вариант zpub для нативного segwit, — из которого можно вычислить каждый адрес для получения в кошельке, не имея при этом никакой способности подписывать. Отдайте его магазину, и тот сможет генерировать свежий адрес для каждого инвойса, отслеживать платежи на каждый из них и показывать вам баланс. Он не сможет сдвинуть ни одного сатоши. Приватная половина остаётся в вашем кошельке или на аппаратном устройстве и никогда никуда не передаётся.

Итак: откройте Sparrow, Electrum или настольное приложение вашего аппаратного кошелька, создайте новый кошелёк, выделенный именно для этого магазина, и экспортируйте его расширенный публичный ключ. В настройках кошелька магазина выберите подключение существующего кошелька, вставьте ключ и сверьте первые несколько адресов, которые вывел BTCPay, с теми, что показывает ваш кошелёк. Если они совпадают, путь деривации верен и подключение завершено. Если нет — вы выбрали не тот тип скрипта: разница между xpub и zpub — это разница между двумя полностью разными наборами адресов.

Расширенный публичный ключ — не безобидная строка символов

Он не может тратить — в этом весь смысл, — но может перечислять. Тот, кто его получит, сможет вывести все адреса, которые когда-либо будет использовать этот кошелёк, а значит — прочитать все платежи, которые он когда-либо получал и получит впредь, пока вы им пользуетесь. Это необратимое, неотзываемое раскрытие выручки вашего магазина, и именно поэтому подключаемый кошелёк должен быть выделен для магазина, а не быть тем, где хранятся ваши сбережения. Обращайтесь с ключом как с конфиденциальными данными, не допускайте его в скриншоты и обращения в поддержку, а если утечка всё же произошла — переносите магазин на новый кошелёк, а не надейтесь на лучшее.

Теперь настройки инвойса — именно здесь магазин по-настоящему настраивается. Срок действия по умолчанию — около пятнадцати минут, и это фиксация курса, а не техническое ограничение: это то, как долго вы готовы удерживать цену, выраженную в фиате, против волатильного актива. Сокращайте его при волатильном рынке, увеличивайте, если ваши клиенты медлительны. Подтверждения определяют, когда инвойс считается оплаченным, — ноль подтверждений мгновенны и подходят для чашки кофе, одно подтверждение — обычное значение по умолчанию, а шесть — для сумм, где час ожидания дешевле, чем альтернатива. Допуск на недоплату позволяет принять инвойс, пришедший чуть меньшим, чем нужно, — а это происходит постоянно, когда кошелёк клиента вычитает комиссию из суммы, а не добавляет её сверх; небольшой процент здесь снимает целую категорию писем в поддержку.

Затем проверьте это настоящими деньгами, а не тестовой сетью. Выставите запрос на оплату на символическую сумму, оплатите его с телефонного кошелька и понаблюдайте, как инвойс проходит путь от «новый» через «в обработке» до «оплачен». Эта единственная транзакция доказывает, что узел синхронизирован, путь деривации верен, поставщик курса работает, сертификат действителен в мобильном браузере, а деньги попали в кошелёк, который контролируете вы. Ничто другое не докажет все пять фактов сразу.

Шаг 05 · Lightning

Каналы — это просто. Стать доступным для оплаты — вот что сложно.

Ончейн-Bitcoin прекрасно рассчитывается для инвойса на $400 и плохо — для инвойса на $4: клиент ждёт подтверждения и платит комиссию, которая может составлять заметную долю покупки. Lightning переворачивает оба этих свойства — расчёт занимает около двух секунд, комиссии измеряются долями цента, — поэтому магазину, продающему мелочи, он нужен, а магазину с крупными покупками может и не понадобиться. Если вы указали реализацию Lightning в шаге 03, демон уже запущен, и BTCPay уже к нему подключён; в настройках магазина остаётся только включить Lightning как способ оплаты.

Выбранная вами реализация имеет последствия, о которых стоит сказать прямо. Core Lightning — консервативный, лёгкий вариант с чистой архитектурой плагинов. LND — самый широко распространённый, с крупнейшей экосистемой инструментов управления вокруг него. Теперь есть и третий тип варианта — лёгкий демон, который отдаёт управление каналами стороннему сервису, оставляя ключи на вашей машине, — он меняет часть независимости на исчезновение всего описанного в следующих трёх абзацах. Это законный выбор для магазина, который хочет Lightning, но не хочет становиться оператором узла; это просто другой размен, а не бесплатный.

Совсем новому узлу нельзя заплатить, и ничто вас об этом не предупредит

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

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

Как только вам можно платить, две функции превращают узел в витрину магазина. Lightning-адрес — той же формы, что email-адрес, на вашем собственном домене — позволяет кому угодно отправить вам деньги из любого современного кошелька без предварительно созданного инвойса, и это самый дружелюбный механизм для пожертвований и чаевых из всех существующих. А QR-код на странице чекаута может предлагать оба варианта сразу, так что клиент с Lightning-кошельком платит за секунды, а клиент без него платит ончейн — с того же самого экрана и без необходимости что-либо выбирать с вашей стороны.

Прежде чем придёт первый платёж по Lightning, сделайте резервное копирование, которое нужно выполнить сейчас, а не потом. Каждая реализация хранит небольшой файл, описывающий текущее состояние ваших каналов, — в LND он называется статической резервной копией канала, — и именно этот файл позволяет вернуть средства, если машина потеряна. Он меняется при каждом открытии или закрытии канала, поэтому копируйте его с машины автоматически, а не вручную. Прочитайте предупреждение в шаге 06, прежде чем решить, что ночной архив уже это покрывает, — для Lightning это не так.

Шаг 06 · Запуск

Теперь покажите это клиентам. А затем сделайте так, чтобы это было скучно.

Выберите самую компактную форму чекаута, подходящую тому, что у вас уже есть. Запрос на оплату — это ссылка, которую вы кому-то отправляете: сайт не нужен, и это самый быстрый способ выставить счёт клиенту. Приложение касса превращает тот же экземпляр в кассовый аппарат со списком товаров, который работает с телефона на рыночном прилавке. Кнопка оплаты — это фрагмент HTML для статичного сайта. Плагин для магазина добавляет Bitcoin как способ оплаты в настоящую витрину и автоматически записывает статус заказа обратно. А REST API выставляет инвойсы, сообщает их состояние и вызывает вебхук при оплате — это интеграция, которая стареет лучше всех, потому что зависит только от HTTP и общего секрета.

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

Ночной архив — не способ восстановления Lightning

Это единственное предупреждение на этой странице, которое может стоить вам денег, а не времени, и документация самого проекта формулирует это теми же словами: старое состояние канала Lightning токсично. Восстановить вчерашнюю копию базы данных канала и дать узлу запуститься — значит транслировать состояние, которое ваш контрагент уже заменил новым, а протокол расценивает это как попытку мошенничества и наказывает, отдавая ему весь баланс канала. Так что архив годится для базы данных магазина, конфигурации и истории инвойсов, но не как план восстановления для каналов. Копируйте статическую резервную копию канала с машины непрерывно, храните самую свежую версию, и если вам когда-нибудь придётся восстанавливать весь сервер из архива, делайте это, зная, что для Lightning нужна документированная процедура восстановления, а не прямое восстановление из копии.

С учётом этого рутина короткая. Развёртывание поставляется со скриптом резервного копирования, который архивирует тома и делает дамп базы данных, пропуская данные блокчейна, и принимает кодовую фразу, чтобы архив шифровался ещё до того, как покинет машину. Запускайте его по расписанию, а затем отправляйте результат на машину в другой юрисдикции, как описано в руководстве по резервным копиям, — репозиторий, доступный только на дозапись, здесь стоит лишних десяти минут, потому что скомпрометированный платёжный сервер не должен иметь возможности стереть запись о том, что он обработал.

cd ~/BTCPayServer/btcpayserver-docker
export BTCPAY_BACKUP_PASSPHRASE="a long passphrase you keep elsewhere"
./btcpay-backup.sh                   # archives volumes + database, skips the chain
# then ship the archive offsite, and keep the channel backup separately

Дальше — обновления, и платёжная машина — это как раз тот случай, когда правильная политика — «обновлять позже и осознанно». У развёртывания есть собственный скрипт обновления, который пересобирает compose-файл и подтягивает новые образы; запускайте его, когда прочитали список изменений релиза, а не когда захочется cron-заданию. Сначала сделайте архив. Поднимайтесь на один релиз за раз. И записывайте предыдущую версию, потому что откат, который можно сделать за минуту, — вот что делает всё это малорискованным.

./btcpay-update.sh                   # deliberate, after reading the release notes
df -h /                              # the check that should be an alert, not a habit

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

Честная часть · Чего это не делает

Вы убрали посредника. Но не стали невидимкой.

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

Реестр Bitcoin публичен и неизменен. Устранение шлюза устранило частную базу данных компании — оно не зашифровало цепочку. Каждый платёж, который получает ваш магазин, виден всем, кто знает адрес, и виден навсегда, а адреса кластеризуются: кошелёк, объединивший два платежа в одну трату, только что сообщил всему миру, что эти два клиента заплатили одному и тому же магазину. Это свойство самого актива, а не софта, и именно поэтому бизнес с реальными требованиями к приватности присматривается ещё и к Monero.

Имя хоста чекаута публикуется в тот момент, когда оно появляется. Логи прозрачности сертификатов публичны и постоянно индексируются, так что имя, выбранное вами в шаге 02, можно обнаружить, даже если вы никогда на него не ссылались. Именно поэтому учётную запись администратора нужно занять в первые минуты, а не в первую неделю, и именно поэтому страница входа заслуживает надёжного пароля и второго фактора с первого дня.

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

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

Чарджбэков не существует, и это палка о двух концах. Подтверждённый платёж окончателен — именно это свойство делает мошенничество против продавца практически невозможным и именно поэтому комиссия равна нулю. По той же причине у недовольного клиента нет вообще никакого рычага давления, кроме вашей доброй воли. Опубликуйте политику возвратов, используйте функцию выплат, чтобы её соблюдать, и учтите: вы взяли на себя работу по разрешению споров, за которую раньше платил процент.

Что именно вы на самом деле купили, если точно: деньги приходят в кошелёк, потратить из которого можете только вы, продажу никто не может остановить, никто не берёт свою долю, а список того, кто и сколько вам заплатил, существует только на машине, которую вы арендуете без привязки к какому-либо имени. Это узкое утверждение, но настоящее. Оно стоит своих денег, только если выполнен шаг 06, — платёжный процессор на собственном сервере без протестированного восстановления не улучшение для бизнеса, а единая точка отказа, держащая всю вашу выручку.

Подбор конфигурации · Что заказать

Приложение крошечное. Цепочка — это и есть весь счёт.

Тариф Ежемесячно Ресурсы Что на нём комфортно работает
Sentinel$3.902 vCPU · 4 GB · 120 GB · 1 GbpsОбрезанный узел на 25–50 GB с Lightning. Добавьте swap; следите за диском.
Garrison$7.904 vCPU · 8 GB · 240 GB · 1 GbpsОбрезанный узел на 100 GB, Lightning и запас на годы вперёд. Вариант по умолчанию.
Ravelin$16.908 vCPU · 16 GB · 480 GB · 2.5 GbpsТо же самое, плюс вторая цепочка или загруженный магазин с плагинами.
Bulwark$32.9016 vCPU · 32 GB · 960 GB · 5 GbpsАрхивный узел с запасом на дальнейший рост. Только если вам нужна история.

BTCPay, индексатор и PostgreSQL вместе занимают несколько гигабайт и почти не нагружают CPU, как только узел синхронизирован; магазин, принимающий сто платежей в день, не создаст нагрузки даже для самого младшего тарифа. Тарифы отличаются диском, а диск полностью определяется шагом 01. Синхронизация — единственный по-настоящему тяжёлый час проекта, и она упирается в IO, а не в CPU, — вот почему здесь важен NVMe, а не количество ядер. Трафик безлимитный на любом тарифе, так что публично доступный узел Lightning не стоит ничего сверх базовой цены.

Заметки с практики · Шесть ловушек

Шесть способов всё испортить. Два из них стоят денег.

Ловушка 01 · Фатальная

Учётная запись администратора, которую никто не занял

Первый, кто зарегистрируется на свежем экземпляре, становится администратором, а имя хоста было опубликовано в логах прозрачности сертификатов в тот момент, когда сертификат был выдан. Зарегистрируйтесь в течение первых минут после завершения установки, а затем в настройках сервера убедитесь, что регистрация не открыта для незнакомцев.

Ловушка 02 · Фатальная

Горячий кошелёк на публичной машине

Позволить серверу сгенерировать кошелёк — это одно нажатие, которое кладёт seed-фразу на машину, чья работа — отвечать незнакомцам. Вместо этого подключите расширенный публичный ключ: магазин наблюдает, выводит адреса и сверяет платежи, но не может тратить. Приватную половину храните в кошельке или на аппаратном устройстве.

Ловушка 03 · Токсичная

Восстановление вчерашнего состояния Lightning

База данных канала за вчерашний день описывает состояние, которое ваш контрагент уже сменил на новое. Если вернуть её в строй, это может отдать ему весь баланс канала в качестве штрафа. Ночной архив покрывает магазин; каналам же нужен документированный порядок восстановления и непрерывно копируемая резервная копия канала.

Ловушка 04 · Тихая

Инвойсы Lightning, которые никто не может оплатить

Финансирование канала даёт вам возможность отправлять, а не получать. Новый узел с деньгами внутри всё равно провалит каждый входящий платёж, и ошибка будет выглядеть как проблема маршрутизации. Обеспечьте входящую ликвидность до того, как объявите об опции Lightning, а не после первой жалобы.

Ловушка 05 · Запутывающая

Обрезанный узел и кошелёк с прошлым

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

Ловушка 06 · Предотвратимая

Том, который заполнился во время синхронизации

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

FAQ · Bitcoin-платежи на собственном сервере

Вопросы, и ответы на них.

Одиннадцать вопросов, которые возникают при построении этого — начиная с двух, которые решают, стоит ли вообще это строить.

Правда ли BTCPay Server бесплатен, или есть подвох?

Это по-настоящему бесплатно, и форма этой бесплатности важнее её цены. BTCPay Server — программа с открытым исходным кодом, выпущенная под разрешительной лицензией и поддерживаемая фондом, а не компанией с планом по выручке; здесь нет комиссии за транзакцию, нет процента, нет минимального оборота, нет аккаунта, который нужно открывать, и нет договора, который нужно подписывать, — потому что нет вообще никакого контрагента: вы запускаете программу на собственном сервере точно так же, как запускаете веб-сервер. Взамен вы платите нечто реальное, но другое: несколько долларов в месяц за машину, вечер на настройку и постоянную обязанность вовремя обновлять сервис, обрабатывающий платежи. Сравнивать на самом деле стоит не «бесплатно против одного процента». Стоит сравнивать «эксплуатационную задачу, которая на вас, против зависимости, которой на вас нет», и честный ответ таков: магазину с двадцатью платежами в год, вероятно, лучше подойдёт готовое стороннее решение, а магазин с двадцатью платежами в неделю получит здесь и дешевле, и свободнее.

Это кастодиальное решение? Кто на самом деле держит монеты?

Держите вы, и этот механизм стоит понять, а не просто ему довериться. Рекомендуемая настройка даёт BTCPay расширенный публичный ключ из кошелька, который уже у вас есть. По этому ключу сервер может выводить свежий адрес для получения под каждый инвойс и следить за платежами на него — и он не может составить действительную трату, потому что приватная половина никогда не покидает ваш кошелёк. Деньги идут от клиента прямиком на адрес, который можете вывести только вы; на сервере никогда ничего не хранится, поэтому нечего удерживать, замораживать или терять при взломе. BTCPay также предложит сгенерировать кошелёк за вас и хранить seed-фразу на сервере — это удобно, и это единственная конфигурация, против которой это руководство возражает, если речь о чём-либо, хранящем реальную выручку: она превращает публичную, обращённую в интернет машину в горячий кошелёк. Lightning — настоящее исключение: средства в каналах должны быть живыми, чтобы маршрутизировать платежи, — именно поэтому баланс Lightning стоит считать кассой, а не сейфом.

Сколько диска мне реально нужно?

Это полностью зависит от одного решения, и разброс — два порядка величины. Архивный узел Bitcoin Core хранит каждый когда-либо добытый блок: уверенно за 700 GB в 2026 году и прибавляет примерно 50 GB в год, так что ему нужен тариф под этот рост, и расти он не перестанет. Обрезанный узел проверяет каждый блок точно так же, а затем отбрасывает старые, храня скользящее окно, — генератор развёртывания поставляет фрагменты, обрезающие примерно до 100, 50, 25 или 5 GB, и всё, что от 50 GB и выше, — вполне серьёзный выбор для продакшена продавца. Добавьте примерно от 10 до 20 GB на индексатор, базу данных, узел Lightning и операционную систему — и арифметика складывается так: тариф на 120 GB тянет развёртывание с обрезкой в 25–50 GB, тариф на 240 GB — развёртывание на 100 GB с запасом на годы, а архивному узлу нужно 960 GB. Выбирайте обрезанный вариант, если только у вас нет особой причины поступить иначе; модель безопасности идентична.

Можно ли запустить BTCPay без собственного узла Bitcoin?

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

Обязательно ли настраивать часть с Lightning?

Нет, и вполне разумно пропустить это в первый день. Режим только ончейн — полноценная, рабочая конфигурация: инвойсы оплачиваются, клиент ждёт подтверждения, магазин получает расчёт. Lightning покупает вам разницу между «примерно десятью минутами и комиссией, ощутимой на малых суммах» и «двумя секундами и долей цента» — а это разница между чекаутом, который работает для инвойса на $400, и тем, который работает ещё и для инвойса на $4. Цена в том, что Lightning — это второй демон со своими средствами, своими режимами отказа и своей дисциплиной резервного копирования, включая проблему входящей ликвидности из шага 05 и предупреждение о токсичном состоянии из шага 06. Разумный порядок действий — запустить ончейн, убедиться, что весь конвейер работает с реальными деньгами, а затем добавить Lightning как осознанный второй проект, а не пристёгивать его в тот же вечер.

Какой кошелёк подключить к магазину?

Подойдёт любой кошелёк, способный экспортировать расширенный публичный ключ для отдельного кошелька — Sparrow, Electrum, BlueWallet или аппаратный кошелёк через один из них, — и важен не бренд, а то, что это выделенный кошелёк, а не тот, где хранятся ваши сбережения. Причины две. Первая — приватность, и она необратима: расширенный публичный ключ — это главный индекс всех адресов, которые он когда-либо выведет, так что тот, кто его получит, сможет перечислить все платежи, которые этот кошелёк когда-либо получал и получит в будущем. Если выделить магазину собственный кошелёк, утечка раскроет только выручку магазина и ничего больше. Вторая причина — эксплуатационная: выделенный кошелёк делает доход магазина прозрачным без необходимости заниматься криминалистикой на смешанной истории, а перевод в холодное хранение превращается в единственное, скучное решение. Идеальная схема — аппаратный кошелёк, хранящий приватный ключ, при этом магазин следит только за публичным.

Можно ли принимать Monero или другие монеты на том же экземпляре?

Да, с оговоркой, что каждая дополнительная цепочка — это целый дополнительный узел со своим диском, своим временем синхронизации и своим обслуживанием. Генератор напрямую поддерживает вторую и третью криптовалюту, а интеграция Monero доступна как дополнительный фрагмент — тогда то же самое развёртывание предложит клиенту выбор рельсов при оплате. Чего люди недооценивают, так это счёт за ресурсы: каждая включённая вами цепочка — это ещё один демон, индексирующий ещё один реестр на том же самом томе, и две цепочки на тарифе, рассчитанном на одну, — вот типичный способ, которым платёжная машина исчерпывает диск в воскресенье. Если Monero важна для вашего магазина, сначала прочитайте руководство по узлу Monero и подумайте о том, чтобы выделить ему отдельную машину; платёжный процессор, который лежит из-за того, что диск заполнил посторонний демон, хуже, чем тот, что принимает только Bitcoin.

Как это подключается к реальному магазину?

Четыре способа, в порядке возрастания того, сколько у вас уже есть своего софта. Если нет ничего, BTCPay включает готовую кассу и страницу запроса на оплату, которую можно отправить просто ссылкой, — этого достаточно, чтобы выставить счёт клиенту или принимать платежи на рыночном прилавке вообще без сайта. Если у вас статичный сайт, кнопка оплаты — это просто фрагмент HTML. Если у вас настоящая витрина, для распространённых платформ электронной коммерции есть поддерживаемые плагины, превращающие Bitcoin в ещё один способ оплаты при чекауте, с автоматической записью статуса заказа обратно. А если у вас своё приложение, REST API выставляет инвойсы, сообщает их состояние и вызывает указанный вами вебхук, когда инвойс оплачен, — это интеграция, которая стареет лучше всех, потому что не зависит ни от чего, кроме HTTP. Начните с запроса на оплату, убедитесь, что деньги доходят, а затем переходите к интеграции.

Что будет, если VPS выйдет из строя, — потеряю ли я деньги?

Для ончейн-платежей — нет, и в этом тихая награда схемы «только для просмотра»: монеты никогда не были на сервере. Адреса выводятся из публичного ключа, поэтому свежая установка с тем же расширенным публичным ключом заново обнаружит все платежи; при полном отказе вы теряете только настройки магазина и историю его инвойсов, а для этого и нужен скрипт резервного копирования. С Lightning ответ совсем другой, и он заслуживает отдельного разговора: средства в каналах живые, состояние канала меняется с каждым платежом, а восстановление старой копии этого состояния может стоить вам всего баланса канала, потому что публикация устаревшего состояния — это ровно то, за что протокол наказывает. Поэтому правильная позиция асимметрична. Резервируйте базу данных и конфигурацию по расписанию, шифруйте их, отправляйте куда-то за пределы этой машины — а статическую резервную копию канала Lightning храните как отдельный, непрерывно копируемый артефакт, а не как строку в ночном архиве.

Означает ли самостоятельный хостинг процессора отсутствие обязанностей по отчётности?

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

Разрешает ли NordBastion запускать платёжный процессор на VPS?

Да — экземпляр BTCPay является обычным веб-приложением с обычной базой данных и обычным демоном блокчейна, и в политике допустимого использования нет ничего, что относилось бы к нему иначе, чем к магазину или блогу. Практические замечания касаются ресурсов, а не политики: синхронизирующийся узел сильно нагружает диск и IO в первый день, а затем почти простаивает, трафик безлимитный на любом тарифе, так что публичный узел Lightning не тарифицируется, а входящие порты для пиринговых соединений вы вольны открывать сами. Что действительно согласуется с остальным сайтом, так это симметрия: аккаунту не нужно ваше настоящее имя, инвойс оплачивается в Monero, Bitcoin или Lightning, а машина, которая теперь знает каждого вашего клиента, арендована у компании, которая не знает, кто вы. Процессор, который вы размещаете сами на идентифицированном аккаунте, переместил только реестр, но не раскрытие информации.

Получите машину

Собственный чекаут, оформленный не на ваше имя. Без KYC, оплата криптовалютой.

Garrison — 4 vCPU, 8 GB и 240 GB NVMe за $7.90 в месяц, в Хельсинки, Стокгольме, Осло или Рейкьявике. Достаточно для обрезанного узла Bitcoin, демона Lightning, индексатора и магазина, да ещё с запасом на годы. Никакого email при регистрации, никакого документа, удостоверяющего личность, и никакой компании, хранящей список всех, кто вам когда-либо платил.

Последняя проверка · 2026-10-12 · Источники · Документация BTCPay Server (развёртывание в Docker, фрагменты хранилища, резервное копирование и восстановление, настройки магазина), документация Bitcoin Core по обрезке, документация реализаций Lightning по статическим резервным копиям каналов · Периодичность · ежегодно

Приватный хостинг, построенный на Севере.