NordBastion의 마스코트인 북극곰이 조각으로 새긴 노르딕 석조 상인 카운터 뒤에 서 있다. 그 위로는 QR 코드와 호박색 Bitcoin 기호, 번개 모양 글리프를 보여 주는 청록색 홀로그램 체크아웃 패널이 떠 있고, 빛나는 동전들이 끊이지 않고 하나의 호를 그리며 그 패널에서 곧장 그의 옆에 열려 있는 룬 문자 금고 문으로 흘러 들어간다. 뒤로는 서버 랙과 오로라가 비치는 아치형 창문이 보인다.
하우투 · 암호화폐 결제·읽는 데 21분 · 실습 60분

직접 결제를 받으십시오.
그것을 동결할 사람이 이제 아무도 남아 있지 않습니다.

모든 카드 프로세서와 모든 호스팅형 크립토 게이트웨이는 당신과 고객 사이에 끼어들어 수수료를 떼고, 누가 당신에게 무엇을 결제했는지 목록을 쥐고 있으며, 언제든 멈출 권리를 유보해 둡니다. BTCPay Server는 이들을 제거하는 소프트웨어입니다. 오픈소스, 셀프 호스팅, 비수탁형 결제 프로세서로, 코인은 서버가 쓸 수 없는 지갑으로 곧장 들어갑니다. 익명으로 빌린 서버 위에서 작동하는 Bitcoin·Lightning 체크아웃을 만드는 여섯 단계 — 예산을 결정하는 노드 형태, 워치온리 키, 인바운드 유동성 문제, 그리고 Lightning이 깨뜨리는 백업 규칙까지. 서버 비용은 월 $7.90입니다. Debian 12에서 검증했습니다.

6단계
  1. 01

    선택

    풀, 프루닝, 또는 외부 노드

  2. 02

    프로비저닝

    도메인이 먼저, 그다음 포트 네 개

  3. 03

    배포

    제너레이터 하나, 명령어 하나

  4. 04

    연결

    워치온리 키, 시드는 절대 안 됨

  5. 05

    Lightning

    채널과 인바운드 용량

  6. 06

    출시

    체크아웃, 백업, 업그레이드

시작하기 전에 · 프로세서란 무엇인가

Bitcoin은 은행을 없앴습니다. 대부분의 상점은 은행을 도로 데려다 놓습니다.

블록체인 위의 결제에는 중간에 낀 회사가 필요 없습니다. 고객이 트랜잭션에 서명하면 네트워크가 그것을 확인하고, 그러면 그 돈은 당신 것이 됩니다 — 매입사도, 정산 기간도, 결제가 승인을 기다려야 할 누군가도 없습니다. 그것이 바로 이 기술의 핵심이며, 이 기술이 애초에 존재하는 이유입니다.

그다음 상점은 실제로 결제를 받아야 하고, 실질적인 요구 사항들이 한꺼번에 밀려듭니다. 결제를 서로 구별할 수 있도록 모든 인보이스에는 저마다의 주소가 있어야 합니다. 누군가는 체인을 지켜보며 인보이스가 언제 결제되었는지 판단해야 합니다. 금액은 고객이 익숙한 통화로, 그가 전송 버튼을 누를 때까지 버텨 줄 환율로 표시되어야 합니다. 주문 상태는 다시 상점으로 흘러 들어가야 합니다. 그리고 이 모든 것이 새벽 두 시에도 아무도 지켜보지 않는 채로 작동해야 합니다. 이 모든 것을 만드는 일은 하나의 프로젝트이고, 만들지 않는 것이야말로 거의 모두가 대신 호스팅형 게이트웨이에 가입하는 이유입니다 — 그리고 그 순간, 양식 하나를 채우는 사이에, 애초에 없도록 설계된 시스템에 중개자를 도로 들여놓게 됩니다.

그 중개자가 쥐고 있는 것이 무엇인지는 분명히 말해 둘 가치가 있습니다. 수수료보다 훨씬 크기 때문입니다. 그것은 코인을 쥐고 있습니다, 적어도 페이아웃이 실행되기 전까지는요. 즉 그것을 지연시킬 수 있다는 뜻입니다. 그것은 목록을 쥐고 있습니다. 모든 고객, 모든 금액, 모든 타임스탬프, 모든 상품이, 당신은 읽을 수도 지울 수도 없는 데이터베이스 안에 담겨 있습니다. 그것은 당신에 대한 신분 확인 서류를 쥐고 있습니다. 다른 사람의 돈을 만지는 회사는 그것을 수집해야 하기 때문입니다. 그리고 그것은 스위치를 쥐고 있습니다. 이용 약관은 당신의 사업이 더는 반갑지 않다고 결정할 권리를 유보해 두고 있으며, 그 결정은 이메일로 통보되고, 계정뿐 아니라 잔액에도 적용되며, 실제로는 이의를 제기할 수도 없습니다.

BTCPay Server는 정확히 그 문제에 대한 답이며, 그 이상도 이하도 아닙니다. 당신 소유의 머신에서 직접 운영하는 무료 오픈소스 결제 프로세서로, 인보이스마다 주소를 하나씩 파생시키고, 체인을 지켜보고, 법정화폐 가격을 매기고, 체크아웃과 API를 노출하며, Lightning을 구사합니다. 당신의 코인을 절대 쥐지 않는데, 그것이 지켜보는 지갑은 이미 당신이 소유한 지갑이기 때문입니다. 크립토 결제를 받는 네 가지 방법과, 각각이 실제로 얼마나 드는지는 다음과 같습니다.

속성 호스팅형 크립토 게이트웨이 푸터에 그냥 적어 둔 주소 하나 누군가의 인스턴스 위에서 돌아가는 BTCPay 당신 소유의 VPS 위에서 돌아가는 BTCPay
누가 코인을 쥐고 있는가게이트웨이가, 페이아웃 전까지당신당신 — 지켜볼 뿐, 쓸 수는 없습니다당신 — 지켜볼 뿐, 쓸 수는 없습니다
누가 당신의 거래를 막을 수 있는가게이트웨이가, 이메일로아무도 없습니다인스턴스 운영자아무도 없습니다
누가 모든 고객과 금액을 보는가게이트웨이가, 영구히누구에게나 — 주소 하나, 공개된 합계 하나인스턴스 운영자당신
신분증 필요예, 첫 페이아웃 전에아니오운영자가 요구하는 것은 무엇이든아니오
거래당 비용수수료 비율, 영원히없음없음추가 비용 없음 — 월 $7.90 정액
인보이스를 서로 구별해 줍니다예아니요 — 직접 대조해야 합니다예예
적합한 경우운영 부담은 전혀 원하지 않고 약관을 받아들인다면기부금, 연간 몇 건 정도소프트웨어는 원하지만 서버는 원하지 않는다면매출도, 그 목록도 당신 것입니다

두 번째 열도 농담이 아닙니다 — 푸터에 적힌 주소 하나만으로도 후원 링크로는 정말 충분하며, 그렇지 않은 척하는 것은 아무도 필요로 하지 않는 소프트웨어를 파는 것입니다. 그것이 충분하지 않게 되는 시점은 같은 날 두 사람이 같은 금액을 결제하는 순간, 또는 당신의 연 수입이 누구나 합산해 볼 수 있는 공개된 숫자이지 않기를 바라게 되는 순간입니다.

단계 01 · 선택

결정 하나가 청구 총액 전체를 정합니다. 체인을 얼마나 보관할 것인가?

결제 프로세서는 단 하나의 질문에 정직하게 답할 수 있어야 합니다. 이 인보이스는 결제되었는가? 그 답을 알려면 Bitcoin 네트워크를 지켜봐야 하고, 제대로 지켜보려면 누군가의 말을 믿는 대신 블록을 직접 검증하는 노드를 운영해야 합니다. 그 노드가 바로 이 프로젝트의 하드웨어 예산 전부입니다 — BTCPay 자체와 인덱서, 데이터베이스를 다 합쳐도 그 옆에서는 반올림 오차에 지나지 않습니다.

말이 되는 구성이 세 가지, 말이 안 되는 구성이 하나 있습니다. 아카이브 노드는 채굴된 모든 블록을 보관합니다. 2026년 기준 넉넉히 700GB를 넘고 연간 대략 50GB씩 늘어납니다. 블록 탐색기를 함께 운영하거나 역사적 분석을 할 생각이라면 이것이 원하는 선택이며, 상점에는 과합니다. 프루닝 노드는 모든 블록을 정확히 같은 방식으로 내려받아 완전히 검증한 다음, 오래된 것을 버리고 이동하는 창을 유지합니다. 보안 모델은 동일합니다 — 이 부분을 사람들이 흔히 잘못 아는데, "프루닝"이 "부분적"이라는 말처럼 들리지만 그렇지 않기 때문입니다 — 그리고 배포 제너레이터는 이를 위한 완성된 프래그먼트를 제공합니다.

외부 노드가 세 번째 방법입니다. 이미 운영 중인 Bitcoin 노드를 프라이빗 회선으로 연결해 스택이 그것을 가리키게 하는 것입니다. 이미 Lightning 노드 가이드를 따라 했다면 체인 사본을 하나 더 둘 이유가 없으며, 두 서버를 잇는 메시 VPN이 둘을 연결하는 깔끔한 방법입니다. 말이 안 되는 조합은 낯선 사람의 퍼블릭 노드에 상점을 연결하는 것입니다. 그 노드는 당신이 지켜보는 모든 주소를 알게 되며 그것은 곧 당신의 매출이고, 그 노드는 인보이스가 결제되었는지를 두고 거짓말을 할 수 있는 위치에 있습니다.

배포 디스크 위의 체인 필요한 총 용량 당신이 포기하는 것
프루닝, 가장 작은 창~5–25 GB~40 GB재스캔, 그리고 오차를 위한 여유 전부. 가장 작은 설정값은 권장하지 않습니다.
프루닝, 약 50GB 창~50 GB~80 GB상점이 눈치챌 일은 없습니다. 합리적인 최저선입니다.
프루닝, 약 100GB 창~100 GB~140 GB없습니다. Lightning을 위한 여유까지 갖춘 편안한 기본값입니다.
아카이브, 전체 이력700 GB +~960 GB추가 비용은 없지만 — 매달, 영원히 그 값을 치릅니다.
이미 운영 중인 외부 노드이 서버에는 없음~40 GB독립성 — 다른 서버가 죽으면 체크아웃도 함께 죽습니다.
프루닝이 진짜로 당신에게서 앗아 가는 단 한 가지

프루닝 노드는 이미 버린 블록을 다시 스캔할 수 없습니다. 실제로 이는 배포 이전에 이루어진 트랜잭션을 가진 지갑의 이력을 복원할 수 없다는 뜻입니다 — 인덱서는 키를 연결한 날부터 앞으로 스캔하므로, 그 계정으로 들어온 예전 결제는 상점에 아예 나타나지 않습니다. 단계 04의 권장대로 상점에 갓 만든 계정을 내주었다면 이는 전혀 문제가 되지 않습니다. 하지만 3년 동안 써 온 지갑을 연결했는데 이력의 절반이 사라져 있다면 정말로 당혹스러운 오후를 보내게 됩니다. 설치하기 전에 어느 쪽으로 할지 정해 두십시오, 설치한 뒤가 아니라.

여기서 결정해야 할 것이 나중이 아니라 지금 하나 더 있습니다. 설치 프로그램이 무엇을 만들지가 이것으로 바뀌기 때문입니다. 바로 첫날부터 Lightning을 원하는가입니다. 온체인 전용도 완전한 구성이며 출발점으로 삼기에 더할 나위 없이 훌륭합니다. Lightning을 나중에 추가하는 것도 지원되고 힘들지 않지만, 그것은 자기만의 자금과 자기만의 백업 규칙을 가진 두 번째 데몬입니다. 복잡한 쪽을 들이기 전에 단순한 경로로 실제 돈이 들어오는 것을 먼저 증명해 둘 이유는 충분합니다.

단계 02 · 프로비저닝

도메인이 먼저 존재해야 합니다. 설치 프로그램이 인증서를 요청할 것입니다.

서버를 주문하십시오. 패널에서: Order → VPS → Garrison, 이미지는 Debian 12, 상점의 기록이 자리 잡길 원하는 거점은 Helsinki, Stockholm, Oslo, Reykjavík 중에서. Garrison이 올바른 기본값인 이유는 100GB 프루닝 체인과 Lightning 노드, 데이터베이스를 담고도 앞으로 수년간 디스크를 다시 신경 쓰지 않아도 되기 때문입니다. Sentinel은 더 빡빡한 프루닝으로 돌아가고, Bulwark는 아카이브 노드를 위한 티어입니다. 계정을 여는 데 이메일 주소는 필요 없고, 청구서는 Monero, Bitcoin, Lightning을 비롯한 다른 지원 자산으로 정산됩니다 — 크립토 결제를 받는 머신을 만들면서 그 대금을 크립토로 치른다는 점이, 바로 이 프로젝트에서 유독 흐뭇한 부분입니다.

그런 다음 다른 무엇보다 먼저 첫 시간 보안 강화 체크리스트를 실행하십시오 — 옮긴 포트에서의 키 전용 SSH, 무인 업그레이드, 기본 차단 방화벽입니다. 이 서버는 언젠가 당신의 모든 고객 기록과, 실제 자금이 들어 있는 Lightning 노드의 키 자료를 담게 됩니다. 일주일씩이나 비밀번호 인증으로 방치해 둘 서버가 아닙니다.

이제 DNS 레코드입니다. 설치 프로그램을 실행한 다음이 아니라 그 전에 해 두십시오. 체크아웃이 자리 잡을 호스트네임을 고르고 — shop.example.com, pay.example.com, 무엇이든 맞는 것으로 — VPS 주소로 향하는 A 레코드를 지정한 다음, IPv6로도 접속하고 싶다면 AAAA도 하나 지정하십시오. 전파될 시간을 주십시오. 설치 프로그램이 구성하는 리버스 프록시는 첫 부팅 중에 바로 그 이름으로 인증서를 발급받으려 시도하는데, 이때 쓰는 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

계속하기 전에 리소스에 관한 메모 두 가지입니다. 서버에 스왑이 없다면 추가하십시오 — 최초 블록 다운로드는 이 프로젝트에서 메모리를 가장 많이 먹는 시간이며, 4GB의 RAM에 2GB의 스왑을 더한 쪽이 4GB만 있는 것보다 훨씬 낫게 버팁니다. 그리고 단계 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, 5GB로 프루닝하는 변형들을 제공해 왔는데, 그 이름은 릴리스를 거치며 조정되어 왔습니다. 블로그 글에서 — 이 글을 포함해서 — 복사한 값을 그대로 믿지 말고, 방금 클론한 저장소 안의 프래그먼트 목록을 직접 확인하십시오.

설치 프로그램은 몇 분에 걸쳐 많은 이미지를 내려받고, 인증서를 발급받고, 모든 것을 시작합니다. 그런 다음 기다림이 시작됩니다. 상점이 결제를 확인할 수 있으려면 노드가 체인을 내려받고 검증해야 하는데, 프루닝을 하더라도 이는 분이 아니라 시간 단위입니다. 프루닝은 검증 작업 자체를 건너뛰는 것이 아니라 검증을 마친 뒤에 블록을 버리는 것이기 때문입니다. 웹 인터페이스는 곧바로 쓸 수 있으며 동기화 배너를 보여 줄 것입니다. 그것이 사라지기 전까지는 실제 인보이스를 발행하지 마십시오.

./bitcoin-cli.sh getblockchaininfo | grep -E 'blocks|headers|verificationprogress|pruned'
docker ps --format '{{.Names}}\t{{.Status}}'
앞으로 5분 안에 관리자 계정을 차지하십시오

갓 설치한 인스턴스에는 사용자가 없으며, 처음 등록하는 계정이 관리자가 됩니다. 당신이 그 자리를 차지하기 전까지는 그 URL에 닿는 누구라도 그렇게 할 수 있습니다. 게다가 그 URL은 비밀이 아닙니다. 인증서가 발급되는 순간 호스트네임은 공개 인증서 투명성 로그에 실리고, 이 로그는 정확히 이런 것을 노리는 사람들에 의해 색인되고 계속해서 스캔됩니다. 무엇보다 먼저 사이트를 열어 등록한 다음, 서버 설정으로 가서 등록이 낯선 사람에게 열려 있지 않은지 확인하십시오. 상점이 "아직 오픈 전"이라는 이유로 사람들이 며칠씩 열어 두곤 하는 이 5분짜리 틈이 바로 그것입니다.

아직 설정 단계에 있는 동안 알아 둘 가치가 있는 선택적 프래그먼트가 두 가지 있습니다. 하나는 Tor 히든 서비스를 추가해, 체크아웃이 클리어넷 주소뿐 아니라 v3 어니언 주소로도 닿을 수 있게 해 줍니다 — 당신의 도메인을 해석하고 싶어 하지 않는 고객에게 유용하며, 어니언 서비스 가이드와 같은 발상입니다. 다른 하나는 두 번째 암호화폐를 추가합니다. 둘 다 설정 방법은 같습니다. additional-fragments 변수에 추가하고 설정 스크립트를 다시 실행하면, 제너레이터가 compose 파일을 다시 만들고 바뀐 것만 재시작합니다.

단계 04 · 연결

공개 키를 내주십시오. 시드는 절대 내주지 마십시오.

상점을 만든 다음, 이 페이지에서 실제로 중요한 단 하나의 결정을 내리십시오. BTCPay는 Bitcoin 지갑을 연결하는 두 가지 방법을 제시합니다. 기존 지갑을 연결하거나, 새 지갑을 생성해 시드를 서버에 두는 것입니다. 첫 번째가 워치온리이고, 당신이 원하는 방식입니다. 두 번째는 퍼블릭하게 인터넷에 노출된 머신을 당신의 매출을 담은 핫월렛으로 바꿔 버리며, 낯선 사람들에게 닿는 것이 유일한 임무인 서버에게 그것은 아무리 강화를 해도 좋은 거래가 되지 않습니다.

이 권장 사항 뒤에 있는 메커니즘은 이해할 가치가 있을 만큼 우아합니다. 현대적인 지갑은 계층적입니다. 시드 하나가 키의 트리를 파생시키며, 확장 공개 키 — xpub, 또는 네이티브 segwit용 변형인 zpub — 라는 것이 있어서, 이것으로부터 계정의 모든 수신 주소를 서명 능력 없이도 계산해 낼 수 있습니다. 그것을 상점에 건네면 인보이스마다 새 주소를 생성하고, 각각에 대한 결제를 체인에서 지켜보고, 잔액을 보여 줄 수 있습니다. 사토시 하나도 옮길 수 없습니다. 개인 키 쪽은 당신의 지갑이나 하드웨어 장치 안에 머무를 뿐, 결코 밖으로 나가지 않습니다.

그러니: Sparrow나 Electrum, 또는 하드웨어 지갑의 데스크톱 앱을 열어, 이 상점 전용의 새 계정을 만들고 그 확장 공개 키를 내보내십시오. 상점의 지갑 설정에서 기존 지갑 연결을 선택하고 키를 붙여 넣은 다음, BTCPay가 파생시키는 처음 몇 개 주소를 지갑이 보여 주는 주소와 대조하십시오. 일치한다면 파생 경로가 맞은 것이고 연결이 끝난 것입니다. 일치하지 않는다면 스크립트 유형을 잘못 고른 것입니다 — xpub과 zpub의 차이는 완전히 서로 다른 두 벌의 주소 집합의 차이입니다.

확장 공개 키는 무해한 문자열이 아닙니다

그것으로는 돈을 쓸 수 없다는 것이 핵심입니다 — 하지만 열거는 할 수 있습니다. 그것을 손에 넣은 사람은 누구든 그 계정이 앞으로 쓰게 될 모든 주소를 파생시킬 수 있고, 따라서 당신이 그 계정을 쓰는 한 지금까지 받았고 앞으로 받을 모든 결제를 읽어 낼 수 있습니다. 이는 상점의 매출을 영구적으로, 되돌릴 수 없게 노출하는 것이며, 그래서 연결하는 계정은 저축을 담은 계정이 아니라 상점 전용이어야 합니다. 이 키는 기밀로 다루고, 스크린샷이나 지원 티켓에 남기지 마십시오. 만약 유출된다면, 요행을 바라지 말고 상점을 새 계정으로 옮기십시오.

이제 인보이스 설정입니다. 실제로 상점이 조율되는 지점이 바로 여기입니다. 만료 시간은 기본값이 약 15분이며, 기술적 한계라기보다는 환율 고정 시간입니다. 변동성 있는 자산에 대해 법정화폐 표시 가격을 얼마나 오래 유지해 줄 것인지를 정하는 것입니다. 변동성이 큰 시장이라면 짧게, 고객이 느리다면 길게 잡으십시오. 컨펌 수는 인보이스가 언제 정산된 것으로 칠지를 정합니다 — 0컨펌은 즉시 처리되어 커피 한 잔에 어울리고, 1컨펌이 일반적인 기본값이며, 6컨펌은 한 시간을 기다리는 편이 그 대안보다 싼 금액대에 씁니다. 부족 결제 허용치는 살짝 모자라게 도착한 인보이스도 받아들이게 해 주는데, 고객의 지갑이 수수료를 금액에 더하지 않고 그 안에서 떼어 갈 때 끊임없이 벌어지는 일입니다. 여기에 작은 비율을 설정해 두면 지원 이메일의 한 카테고리 전체가 사라집니다.

그런 다음 테스트넷이 아니라 실제 돈으로 테스트하십시오. 아주 적은 금액의 결제 요청을 발행해 휴대폰 지갑으로 결제하고, 인보이스가 신규에서 처리 중을 거쳐 정산됨으로 넘어가는 것을 지켜보십시오. 그 단 하나의 트랜잭션이 다섯 가지를 한꺼번에 증명합니다. 노드가 동기화되어 있다는 것, 파생 경로가 맞다는 것, 환율 제공자가 작동한다는 것, 인증서가 모바일 브라우저에서 유효하다는 것, 그리고 돈이 당신이 통제하는 지갑에 도착했다는 것입니다. 이 다섯 가지를 한꺼번에 증명해 주는 것은 이것 말고는 없습니다.

단계 05 · Lightning

채널은 쉬운 부분입니다. 결제를 받을 수 있게 만드는 것이 어려운 부분입니다.

온체인 Bitcoin은 $400짜리 인보이스는 훌륭하게, $4짜리는 형편없이 처리합니다. 고객은 컨펌을 기다려야 하고 구매액에서 꽤 눈에 띄는 비율을 수수료로 냅니다. Lightning은 이 둘을 모두 뒤집습니다 — 정산은 약 2초, 수수료는 1센트에도 못 미치는 수준입니다 — 그래서 소액을 파는 상점에는 필요하지만 고액을 파는 상점에는 필요 없을 수도 있습니다. 단계 03에서 Lightning 구현체를 설정해 두었다면 데몬은 이미 돌아가고 있고 BTCPay도 이미 그것에 연결되어 있으므로, 상점 설정에서는 Lightning을 결제 수단으로 활성화하기만 하면 됩니다.

어떤 구현체를 골랐는지는 이름 붙일 가치가 있는 결과를 낳습니다. Core Lightning은 보수적이고 가벼우며 깔끔한 플러그인 아키텍처를 갖춘 선택지입니다. LND는 가장 널리 배포되어 있고 그 주변에 가장 큰 관리 도구 생태계를 갖고 있습니다. 이제는 세 번째 종류의 선택지도 있습니다 — 채널 관리를 서비스 제공자에게 맡기면서 키는 당신의 머신에 두는 가벼운 데몬으로, 앞으로 세 문단에서 다룰 모든 것이 사라지는 대신 약간의 독립성을 내주는 방식입니다. 이는 Lightning은 원하지만 노드 운영자가 되고 싶지는 않은 상점에게는 정당한 선택이며, 그저 다른 종류의 거래일 뿐 공짜인 거래는 아닙니다.

갓 만든 노드는 결제를 받을 수 없으며, 그 사실을 알려 주는 것은 아무것도 없습니다

Lightning 채널은 정해진 금액을 담고 있으며, 그 금액은 양쪽 끝에 나뉘어 있습니다. 채널을 열고 자금을 넣는 순간 그 돈은 전부 당신 쪽에 있게 되는데, 이는 보내는 용량이지 받는 용량은 정확히 0이라는 뜻입니다. 상점에게 필요한 것은 그 반대입니다. 그래서 건강한 채널 세 개를 갖추고 갓 자금을 채운 노드조차 들어오는 인보이스를 하나도 빠짐없이 실패시킬 수 있으며, 그 실패는 설정 실수가 아니라 라우팅 오류처럼 보입니다. 셀프 호스팅한 Lightning 체크아웃이 첫날부터 고장 난 것처럼 보이는 가장 흔한 단 하나의 이유가 바로 이것입니다.

인바운드 용량을 확보하는 정직한 방법은 세 가지가 있으며, 서로 배타적이지 않습니다. 아웃바운드 채널을 열고 그것을 통해 지출하는 방법이 있습니다 — 무언가를 사거나, 인보이스를 결제하거나, 거래소로 돈을 옮기는 식으로 — 이는 잔액을 반대쪽으로 밀어 보내는 용량을 받는 용량으로 바꿔 줍니다. 연결이 좋은 노드에게 당신 쪽으로 채널을 열어 달라고 부탁할 수도 있는데, 이는 Lightning 커뮤니티에서 흔한 요청이며 상대의 온체인 수수료 말고는 무료입니다. 아니면 인바운드 유동성을 파는 여러 서비스 중 하나에서 사들일 수도 있는데, 약간의 수수료가 들지만 몇 주가 아니라 몇 분이면 됩니다. 이 페이지에는 제휴 추천이 없으며 앞으로도 없을 것입니다. 평판과 현재 가격을 보고 고르십시오.

결제를 받을 수 있게 되면, 두 가지 기능이 노드를 상점 앞면으로 바꿔 줍니다. Lightning 주소 — 이메일 주소와 똑같은 모양으로, 당신 소유의 도메인에서 만드는 — 는 인보이스가 먼저 존재하지 않아도 최신 지갑이라면 무엇으로든 누구나 돈을 보낼 수 있게 해 주며, 이는 어디서든 구할 수 있는 것 중 가장 친절한 후원·팁 수단입니다. 그리고 체크아웃 페이지의 QR 코드는 두 경로를 한 번에 제공할 수 있어서, Lightning 지갑이 있는 고객은 몇 초 만에 결제하고 없는 고객은 온체인으로 결제하는데, 같은 화면에서 당신이 아무것도 결정할 필요 없이 이루어집니다.

첫 Lightning 결제가 들어오기 전에, 나중이 아니라 지금 해 두어야 하는 백업 작업을 끝내십시오. 모든 구현체는 채널의 현재 상태를 담은 작은 파일을 유지합니다 — LND는 이것을 정적 채널 백업이라 부릅니다 — 그리고 이것이 바로 서버를 잃었을 때 자금을 복구할 수 있게 해 주는 결정적 자료입니다. 채널이 열리거나 닫힐 때마다 바뀌므로, 손으로가 아니라 자동으로 서버 밖에 복사해 두십시오. 야간 아카이브가 이미 이것을 커버한다고 넘겨짚기 전에 단계 06의 경고를 읽으십시오. Lightning만큼은 그렇지 않기 때문입니다.

단계 06 · 출시

이제 고객 앞에 내놓으십시오. 그런 다음 지루하게 유지하십시오.

이미 갖추고 있는 것에 맞는, 가장 작은 체크아웃 형태를 고르십시오. 결제 요청은 누군가에게 보내는 링크입니다 — 웹사이트가 필요 없고, 고객에게 청구하는 가장 빠른 방법입니다. POS 앱은 같은 인스턴스를 상품 목록을 갖춘 계산대로 바꿔 주며, 시장 좌판에서 휴대폰으로도 작동합니다. 페이 버튼은 정적 사이트를 위한 HTML 스니펫입니다. 상점 플러그인은 실제 스토어에 Bitcoin을 결제 수단으로 추가하고 주문 상태를 자동으로 반영합니다. 그리고 REST API는 인보이스를 발행하고 상태를 보고하며 정산될 때 웹훅을 호출합니다. 이것이 가장 오래가는 통합 방식인데, HTTP와 공유 비밀 키 말고는 아무것도 필요로 하지 않기 때문입니다.

무엇을 고르든, 웹훅을 연결한 다음 실제로 발신되는지 테스트하십시오. 정산되었는데 애플리케이션에 한 번도 통지되지 않는 인보이스는 아무도 잡아내지 못하는 실패 양상입니다. 양쪽 모두 따로 보면 다 정상으로 보이기 때문입니다. 돈은 도착했고, 고객은 확인 페이지를 보았으며, 주문은 처리되지 않은 채 남아 있습니다. 일부러 정산 완료 웹훅을 스스로에게 보내 엔드포인트가 그것을 받았는지 확인하고, 페이로드를 그냥 믿지 말고 서명을 검증하십시오 — 그 엔드포인트는 공개되어 있어 누구든 거기에 게시할 수 있습니다.

야간 백업은 Lightning 복구 경로가 아닙니다

이것은 시간이 아니라 돈을 잃게 만들 수 있는, 이 페이지의 유일한 경고이며, 프로젝트 자체의 문서도 똑같은 말로 이렇게 밝힙니다. 오래된 Lightning 채널 상태는 유해합니다. 어젯밤 채널 데이터베이스 사본을 복원해 노드를 돌리는 것은 상대방이 이미 갱신해 버린 상태를 그대로 내보내는 것이며, 프로토콜은 이를 사기 시도로 간주해 채널 잔액 전체를 상대방에게 넘겨주는 벌을 내립니다. 그러니 아카이브는 스토어 데이터베이스와 설정, 인보이스 이력에는 맞지만, 채널의 복구 계획은 되지 못합니다. 정적 채널 백업은 계속해서 서버 밖으로 복사해 최신본을 유지하고, 언젠가 아카이브에서 서버 전체를 복원하게 되더라도 Lightning 쪽만큼은 단순 복원이 아니라 문서화된 복구 절차가 필요하다는 것을 알고 하십시오.

이것을 이해했다면, 루틴은 간단합니다. 배포판은 블록체인 데이터는 건너뛰고 볼륨을 아카이브하고 데이터베이스를 덤프하는 백업 스크립트를 제공하며, 서버를 떠나기 전에 아카이브가 암호화되도록 비밀번호구를 받습니다. 이것을 타이머로 돌린 다음, 백업 가이드가 설명하는 방식으로 결과물을 다른 관할권의 머신으로 보내십시오 — 추가로 드는 10분은 여기서 그만한 값어치를 합니다. 추가 전용 저장소라면, 침해당한 결제 서버가 자신이 처리한 기록을 스스로 지울 수 없기 때문입니다.

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 파일을 다시 생성하고 새 이미지를 받아 오는 자체 업데이트 스크립트가 있습니다. 크론 작업이 내키는 때가 아니라 릴리스 노트를 읽은 뒤에 실행하십시오. 아카이브부터 먼저 만들어 두십시오. 릴리스는 한 번에 하나씩 올리십시오. 그리고 이전 버전을 적어 두십시오. 1분 만에 되돌릴 수 있다는 사실이야말로 이 모든 일을 부담 없게 만들어 줍니다.

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

마지막으로 알림 하나와 리마인더 하나를 설정하십시오. 알림은 디스크 사용량에 관한 것입니다 — 블록체인 노드는 머신에서 스스로 계속 커지는 유일한 프로세스이며, 볼륨이 가득 차면 다른 것은 아무것도 바뀌지 않았기에 원인을 찾기 어려운 방식으로 체크아웃이 멈춥니다. 95퍼센트가 아니라 80퍼센트에서 울리게 하십시오. 리마인더는 매달, 상점을 열어 두 가지를 확인하는 것입니다. 인보이스가 여전히 정산되고 있는지, 그리고 열어 둔 Lightning 채널이 여전히 살아 있는지 말입니다. 결제 프로세서는 조용히 실패하며, 그 사실을 알게 되는 경로는 결제할 수 없었다는 고객의 말뿐입니다.

정직한 부분 · 이것이 해주지 않는 것

당신은 중개자를 없앴습니다. 투명 인간이 된 것은 아닙니다.

프로세서를 셀프 호스팅하는 것은 실질적이고 구체적인 개선이며, 마술처럼 문제를 사라지게 하는 요술이 아닙니다. 위의 모든 것을 다 해내고 나서도 변하지 않는 사실이 다섯 가지 있고, 이것을 아는 것이야말로 진짜 방어와 그저 위안이 되는 이야기의 차이를 가릅니다.

Bitcoin 원장은 공개되어 있고 영구적입니다. 게이트웨이를 없앤 것은 어느 회사의 사설 데이터베이스를 없앤 것이지, 체인을 암호화한 것이 아닙니다. 당신의 상점이 받는 모든 결제는 주소를 아는 사람이라면 누구에게나, 영원히 보입니다. 그리고 주소는 뭉칩니다. 두 결제를 하나의 지출로 합치는 지갑은 그 두 고객이 같은 상점에 결제했다는 사실을 세상에 알린 것이나 마찬가지입니다. 이것은 소프트웨어가 아니라 자산 자체의 속성이며, 진짜 프라이버시 요건이 있는 사업체가 Monero도 함께 살펴보는 이유입니다.

체크아웃 호스트네임은 존재하는 순간 공개됩니다. 인증서 투명성 로그는 공개되어 있고 계속해서 색인되므로, 단계 02에서 고른 이름은 한 번도 링크한 적이 없어도 찾아낼 수 있습니다. 그래서 관리자 계정은 첫째 주가 아니라 첫 몇 분 안에 차지해야 하고, 로그인 페이지는 첫날부터 강력한 비밀번호와 2단계 인증을 갖출 가치가 있습니다.

법정화폐로 나가는 출구, 그곳에서 신원이 다시 돌아옵니다. 이 스택 중 어느 것도 결제를 받기 위해 신원을 밝힐 것을 요구하지 않습니다. 수익을 은행 돈으로 바꾸는 것은 거의 언제나 신원을 요구하는데, 그 환전이 규제받는 거래소나 브로커에서 이루어지기 때문입니다. 셀프 호스팅은 신원 확인 요건을 판매 시점에서 출구 시점으로 옮길 뿐입니다 — 노출을 실제로 줄여 주지만, 노출이 아예 없어지는 것과는 다릅니다.

당신의 신고 의무는 서버와 함께 옮겨 가지 않았습니다. 사업체가 어디에 등록되어 있고 그 소유자가 어디에 사는지가 무엇을 빚지고 무엇을 신고해야 하는지를 정합니다. 인보이스를 발행하는 머신이 어느 관할권에 있는지는 여기에 들어가지 않습니다. 대부분의 지역에서 재화나 서비스의 대가로 크립토를 받는 것은 받은 날의 가치로 매기는 평범한 소득이며, 나중에 그것을 처분하는 것은 또 다른 별개의 사건입니다. 셀프 호스팅한 인스턴스는 잃어버릴 수도 있는 프로세서 계정보다 더 나은 기록입니다 — 그것은 기록을 아예 갖지 않는 방법이 아닙니다.

차지백은 없으며, 이는 양날의 검입니다. 확정된 결제는 되돌릴 수 없으며, 바로 그 성질 때문에 가맹점을 노린 사기가 거의 불가능해지고 수수료가 0이 되는 것입니다. 또한 바로 그 성질 때문에 불만을 품은 고객에게는 당신의 선의 말고는 아무런 수단도 없습니다. 환불 정책을 공개하고, 그것을 지키기 위해 페이아웃 기능을 사용하며, 예전에는 수수료가 대신 처리해 주던 분쟁 해결 업무를 이제 당신이 떠맡게 되었다는 사실을 이해하십시오.

당신이 실제로 산 것은 정확히 이것입니다. 돈은 오직 당신만이 쓸 수 있는 지갑으로 들어오고, 아무도 판매를 막을 수 없으며, 아무도 몫을 떼어 가지 않고, 누가 당신에게 무엇을 결제했는지에 대한 목록은 오직 특정한 이름 없이 빌린 서버 위에만 존재합니다. 이것은 좁지만 진짜인 주장입니다. 이것이 값어치를 하는 것은 오직 단계 06까지 마쳤을 때뿐입니다 — 검증된 복원 절차가 없는 셀프 호스팅 결제 프로세서는 사업의 개선이 아니라, 당신의 매출을 쥐고 있는 단일 장애점일 뿐입니다.

사이징 · 무엇을 주문할까

애플리케이션은 작습니다. 체인이 곧 인보이스의 전부입니다.

티어 월별 리소스 여유 있게 돌아가는 것
Sentinel$3.902 vCPU · 4 GB · 120 GB · 1 GbpsLightning을 갖춘 25~50GB 프루닝 노드. 스왑을 추가하고 디스크를 지켜보십시오.
Garrison$7.904 vCPU · 8 GB · 240 GB · 1 Gbps100GB 프루닝 노드에 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에서 결정됩니다. 동기화야말로 이 프로젝트에서 진짜로 무거운 유일한 시간입니다 — CPU가 아니라 IO에 좌우되며, 그래서 여기서는 코어 수가 아니라 NVMe가 중요합니다. 모든 티어에서 대역폭은 무제한이므로, 퍼블릭으로 접속 가능한 Lightning 노드를 운영하는 데 추가 비용은 들지 않습니다.

현장 노트 · 여섯 가지 함정

이것이 잘못될 수 있는 여섯 가지 방식. 그중 둘은 돈이 듭니다.

함정 01 · 치명적임

아무도 차지하지 않은 관리자 계정

갓 설치한 인스턴스에서는 맨 처음 등록하는 사람이 관리자가 되며, 호스트네임은 인증서가 발급되는 순간 인증서 투명성 로그에 실립니다. 설치가 끝난 지 몇 분 안에 등록한 다음, 서버 설정에서 등록이 낯선 사람에게 열려 있지 않은지 확인하십시오.

함정 02 · 치명적임

퍼블릭 서버 위의 핫월렛

서버가 지갑을 생성하게 두는 것은 클릭 한 번이면 끝나지만, 낯선 사람들에게 응답하는 것이 임무인 머신에 시드를 두는 셈입니다. 대신 확장 공개 키를 연결하십시오. 상점은 지켜보고, 파생시키고, 대조할 뿐 돈을 쓸 수는 없습니다. 개인 키 쪽은 지갑이나 하드웨어 장치에 보관하십시오.

함정 03 · 독성

어젯밤 Lightning 상태를 복원하기

어제 자 채널 데이터베이스는 상대방이 이미 갱신해 버린 상태를 담고 있습니다. 그것을 그대로 되살리면 채널 잔액 전체를 상대방에게 벌칙으로 넘겨줄 수 있습니다. 야간 아카이브는 상점을 다루지만, 채널에는 문서화된 복구 절차와 계속해서 복사되는 채널 백업이 필요합니다.

함정 04 · 조용함

아무도 결제할 수 없는 Lightning 인보이스

채널에 자금을 넣으면 보내는 용량이 생기지, 받는 용량이 생기지는 않습니다. 돈이 들어 있는 새 노드조차 들어오는 결제를 모두 실패시키며, 그 오류는 라우팅 문제처럼 보입니다. 첫 항의가 들어오기 전에, Lightning 옵션을 내걸기 전에 인바운드 유동성부터 확보하십시오.

함정 05 · 헷갈림

프루닝 노드와 이력이 있는 지갑

3년 된 계정을 프루닝 노드에 연결하면 그 오래된 트랜잭션은 절대 나타나지 않습니다. 그것을 담고 있던 블록이 이미 버려졌기 때문입니다. 고장 난 곳은 없고, 그렇다고 알려 주는 곳도 없습니다. 상점에는 갓 만든 계정을 내주거나, 아니면 아카이브로 운영하십시오.

함정 06 · 피할 수 있음

동기화 도중 가득 찬 볼륨

노드는 스스로 계속 커지는 유일한 프로세스이며, 디스크가 가득 차면 얌전히 멈추는 대신 색인을 손상시킵니다 — 즉 다운로드를 처음부터 다시 시작해야 한다는 뜻입니다. 단계 01에서 계산한 수치를 실제로 주문한 티어와 대조해 보고, 95퍼센트가 아니라 80퍼센트에서 알림이 울리게 하십시오.

FAQ · 셀프 호스팅 Bitcoin 결제

질문들, 답변됨.

이것을 구축하는 동안 떠오르는 열한 가지 질문 — 애초에 구축해야 할지를 결정짓는 두 가지부터 시작합니다.

BTCPay Server는 정말로 무료인가요, 아니면 숨겨진 함정이 있나요?

정말로 무료이며, 가격보다 그 무료의 형태가 더 중요합니다. BTCPay Server는 관대한 라이선스로 배포되는 오픈소스 소프트웨어이며, 매출 목표를 가진 회사가 아니라 재단이 관리합니다. 거래당 수수료도, 퍼센트 비율도, 최소 거래량도, 개설할 계정도, 서명할 계약도 없습니다. 애초에 상대방이라는 것이 존재하지 않기 때문입니다 — 당신은 웹서버를 돌리는 것과 같은 방식으로 당신 소유의 서버에서 프로그램 하나를 돌리는 것뿐입니다. 대신 치르는 대가는 실재하지만 성격이 다릅니다. 서버에 매달 몇 달러, 설정에 저녁 시간 한 번, 그리고 결제를 다루는 서비스를 계속 패치해야 한다는 상시적인 의무입니다. 사람들이 실제로 견줘야 할 비교 대상은 "무료 대 1퍼센트"가 아닙니다. "내가 떠안는 운영 업무 대 내가 떠안지 않는 의존성"이며, 정직한 답은 연간 스무 건을 결제받는 상점이라면 아마 호스팅형 서비스가 더 나을 것이고, 주간 스무 건을 결제받는 상점이라면 여기서 더 저렴하면서 더 자유로워진다는 것입니다.

수탁형인가요? 실제로 코인은 누가 쥐고 있나요?

당신이 쥡니다. 그리고 이 메커니즘은 그냥 믿기보다는 이해할 가치가 있습니다. 권장 설정은 이미 소유하고 있는 지갑에서 나온 확장 공개 키를 BTCPay에 내줍니다. 그 키로부터 서버는 인보이스마다 새 수신 주소를 파생시키고 그곳으로 들어오는 결제를 체인에서 지켜볼 수 있습니다 — 그리고 유효한 지출을 구성할 수는 없는데, 개인 키 쪽이 당신의 지갑을 결코 떠나지 않기 때문입니다. 돈은 고객으로부터 오직 당신만이 쓸어 담을 수 있는 주소로 곧장 이동합니다. 서버에는 아무것도 보관되지 않으므로, 보류하거나 동결하거나 침해로 잃을 것도 없습니다. BTCPay는 당신 대신 지갑을 생성해 시드를 서버에 두는 것도 제안할 것이며, 이는 편리하지만 실제 매출을 담는 무엇에든 이 가이드가 반대하는 유일한 구성입니다. 그것은 퍼블릭하게 인터넷에 노출된 서버를 핫월렛으로 바꿔 버립니다. Lightning은 진짜 예외입니다 — 채널 자금은 라우팅을 위해 살아 있어야 하며 — 그래서 Lightning 잔액은 금고가 아니라 계산대 서랍처럼 다뤄야 합니다.

실제로 디스크가 얼마나 필요한가요?

이것은 전적으로 결정 하나에 달려 있으며, 그 범위는 두 자릿수 단위로 벌어집니다. 아카이브 Bitcoin Core 노드는 채굴된 모든 블록을 보관합니다. 2026년 기준 넉넉히 700GB를 넘고 연간 대략 50GB씩 늘어나므로, 거기에 맞춘 티어가 필요하고 앞으로도 계속 더 필요해집니다. 프루닝 노드는 모든 블록을 정확히 같은 방식으로 검증한 다음 오래된 것을 버리고 이동하는 창을 유지합니다 — 배포 제너레이터는 대략 100, 50, 25, 5GB로 프루닝하는 프래그먼트를 제공하며, 50GB 이상이면 무엇이든 가맹점에게 충분히 진지한 운영 선택입니다. 인덱서와 데이터베이스, Lightning 노드, 운영체제를 위해 대략 10~20GB를 더하면 계산이 딱 맞아떨어집니다. 120GB 티어는 25~50GB 프루닝 배포를 감당하고, 240GB 티어는 수년치 여유를 두고 100GB 배포를 감당하며, 아카이브는 960GB를 원합니다. 특별한 이유가 없다면 프루닝을 고르십시오. 보안 모델은 동일합니다.

제 소유의 Bitcoin 노드 없이 BTCPay를 운영할 수 있나요?

부분적으로는 그렇습니다. 그리고 그 경계가 정확히 어디인지 알아 둘 가치가 있습니다. 스택은 어딘가 다른 곳에서 이미 운영 중인 Bitcoin 노드를 — 같은 테일넷 안의 서버이든, 터널 뒤에 있는 서버이든 — 가리키게 할 수 있으며, 이는 Lightning 노드 가이드의 작업을 이미 해 두었다면 체인 사본을 하나 더 두는 수고를 덜어 주는 완전히 지원되는 구성입니다. 상식적으로 할 수 없는 일은 다른 누군가의 퍼블릭 노드를 상대로 결제 프로세서를 운영하는 것인데, 그 이유는 라이선스가 아니라 프라이버시와 신뢰 때문입니다. 당신의 질의에 답하는 쪽은 누구든 당신의 상점이 지켜보는 모든 주소를 알게 되며 이는 당신의 매출을 아는 것과 같고, 인보이스가 결제되었는지에 대해 당신에게 거짓말을 할 수도 있습니다. 사람들이 손을 뻗는 세 번째 선택지가 있습니다 — 제3자가 운영하는 호스팅형 BTCPay 인스턴스를 쓰는 것 — 그리고 이는 시작하기에 얼마든지 합리적인 방법입니다. 다만 그것이 상점의 데이터를 그것을 볼 수 있는 운영자에게로 옮긴다는 점만은 분명히 해 두십시오. 그것이야말로 셀프 호스팅이 있는 이유의 대부분이기 때문입니다.

Lightning 부분까지 꼭 해야 하나요?

아닙니다. 그리고 첫날에는 건너뛰어도 얼마든지 합리적입니다. 온체인 단독으로도 완전하고 제대로 작동하는 구성입니다. 인보이스는 결제되고, 고객은 컨펌을 기다리며, 상점은 정산됩니다. Lightning이 사 주는 것은 "대략 10분에, 소액에는 부담스러운 수수료"와 "2초에, 1센트도 안 되는 수수료"의 차이이며, 이는 곧 $400짜리 인보이스에서만 통하는 체크아웃과 $4짜리에서도 통하는 체크아웃의 차이입니다. 대가는 Lightning이 자기만의 자금과 자기만의 장애 양상, 자기만의 백업 규율을 가진 두 번째 데몬이라는 점입니다 — 단계 05의 인바운드 유동성 문제와 단계 06의 유해 상태 경고까지 포함해서 말입니다. 온체인으로 먼저 출시해 실제 돈으로 전체 파이프라인이 작동하는 것을 확인한 다음, 같은 저녁에 욱여넣지 말고 Lightning을 의도된 두 번째 프로젝트로 추가하는 것이 현명한 순서입니다.

어떤 지갑을 스토어에 연결해야 하나요?

단일 계정의 확장 공개 키를 내보낼 수 있는 지갑이면 무엇이든 됩니다 — Sparrow, Electrum, BlueWallet, 또는 이들 중 하나를 거친 하드웨어 지갑. 여기서 중요한 것은 브랜드가 아니라 그것이 저축을 담아 둔 계정이 아니라 전용 계정이라는 점입니다. 이유는 두 가지입니다. 첫째는 프라이버시이고, 이것은 영구적입니다. 확장 공개 키는 앞으로 파생될 모든 주소의 마스터 색인이므로, 그것을 손에 넣은 사람은 누구든 그 계정이 지금까지 받았고 앞으로 받을 모든 결제를 나열할 수 있습니다. 상점에 전용 계정을 내주면 유출이 일어나도 노출되는 것은 상점의 매출뿐입니다. 둘째는 운영상의 이유입니다. 전용 계정은 뒤섞인 이력을 뒤지지 않고도 상점의 수입을 훤히 보이게 하고, 콜드 스토리지로 쓸어 담는 일을 단순하고 지루한 결정으로 만들어 줍니다. 개인 키는 하드웨어 지갑이 쥐고 공개 키는 상점이 지켜보는 구성이 목표로 삼아야 할 배치입니다.

같은 인스턴스에서 Monero나 다른 코인도 받을 수 있나요?

예, 다만 체인을 하나 추가할 때마다 그 자체의 디스크와 그 자체의 동기화 시간, 그 자체의 유지보수를 가진 완전히 별개의 노드가 하나 더 생긴다는 단서가 붙습니다. 제너레이터는 두 번째, 세 번째 암호화폐를 직접 지원하며, 추가 프래그먼트로 이용 가능한 Monero 통합도 있습니다 — 그러면 같은 배포판이 체크아웃에서 고객에게 결제 경로를 선택하게 해 줍니다. 사람들이 과소평가하는 것은 리소스 비용입니다. 활성화하는 체인마다 같은 볼륨 위에서 또 다른 원장을 색인하는 또 다른 데몬이 하나 더 생기며, 하나를 기준으로 잡은 티어에 체인 두 개를 올리는 것이 결제용 서버가 일요일에 디스크가 바닥나는 흔한 경위입니다. Monero가 당신의 상점에 중요하다면 먼저 Monero 노드 가이드를 읽고 그것에 별도의 서버를 내주는 것을 고려하십시오. 무관한 데몬이 디스크를 채워서 멈춘 결제 프로세서는 Bitcoin만 받는 프로세서보다 더 나쁩니다.

이것이 실제 상점에는 어떻게 연결되나요?

네 가지 방법이 있으며, 이미 갖추고 있는 소프트웨어가 많아지는 순서대로 나열하면 이렇습니다. 아무것도 없다면 BTCPay는 링크로 보낼 수 있는 호스팅형 POS와 결제 요청 페이지를 제공합니다 — 웹사이트가 전혀 없어도 고객에게 청구하거나 시장 좌판에서 결제를 받기에 충분합니다. 정적 사이트가 있다면 페이 버튼은 HTML 스니펫 하나로 끝납니다. 실제 스토어가 있다면, 흔히 쓰는 이커머스 플랫폼용으로 관리되고 있는 플러그인이 있어 Bitcoin을 체크아웃의 또 다른 결제 수단으로 만들어 주고 주문 상태도 자동으로 반영됩니다. 그리고 자체 애플리케이션이 있다면, REST API가 인보이스를 발행하고 상태를 보고하며 결제가 정산될 때 지정한 웹훅을 호출합니다 — 이것이 가장 오래가는 통합 방식인데, HTTP 말고는 아무것도 필요로 하지 않기 때문입니다. 결제 요청으로 시작해 돈이 실제로 들어오는 것을 확인한 다음 통합하십시오.

VPS가 죽으면 어떻게 되나요 — 돈을 잃게 되나요?

온체인이라면 아닙니다. 그리고 이것이 바로 워치온리 설계가 조용히 주는 보상입니다. 코인은 애초에 서버에 있던 적이 없습니다. 주소는 공개 키에서 파생되므로, 같은 확장 공개 키로 새로 설치하면 모든 결제가 다시 발견됩니다. 완전한 장애로 잃는 것은 상점의 설정과 인보이스 이력뿐이며, 바로 이것을 위해 백업 스크립트가 있는 것입니다. Lightning은 완전히 다른 답이며 따로 한 문장을 들일 가치가 있습니다. 채널 자금은 살아 있고, 채널 상태는 결제가 있을 때마다 바뀌며, 그 상태의 오래된 사본을 복원하면 채널 잔액을 통째로 잃을 수 있습니다. 이미 갱신된 상태를 내보내는 것이야말로 프로토콜이 벌하는 행위이기 때문입니다. 그러니 올바른 태도는 비대칭적이어야 합니다. 데이터베이스와 설정은 일정에 따라 백업하고, 암호화한 다음, 이 서버가 아닌 다른 곳으로 보내십시오 — 그리고 Lightning의 정적 채널 백업은 야간 아카이브의 한 줄이 아니라, 계속해서 복사되는 별도의 자료로 다루십시오.

프로세서를 셀프 호스팅하면 신고 의무가 없어지나요?

아닙니다. 그리고 반대로 은근히 가정하는 사람들이 있으니 분명히 짚어 둘 가치가 있습니다. 결제 프로세서를 없애면 중개자와 수수료, 그리고 당신의 자금을 동결할 수 있는 당사자가 사라집니다. 그것이 당신이 누구에게 무엇을 빚지고 있는지, 판매가 과세 대상인지는 바꾸지 않습니다 — 그것은 서버가 어디에 있는지, 어떤 소프트웨어가 인보이스를 발행했는지가 아니라 당신과 당신의 사업체가 어디에 있는지에 따라 정해집니다. 대부분의 관할권에서 재화나 서비스의 대가로 암호화폐를 받는 것은 받은 날의 가치로 매기는 평범한 사업 소득이며, 나중에 그것을 처분하는 것은 또 다른 별개의 과세 사건입니다. 그 기록이 이제 프로세서가 아니라 당신 자신의 데이터베이스에 있다는 사실이 그것을 선택 사항으로 만들어 주지는 않으며, 오히려 셀프 호스팅한 인스턴스는 더는 갖고 있지 않은 계정의 스크린샷보다 실제로 더 나은 감사 기록입니다. 정직한 프라이버시 이득이 있는 지점은 더 좁지만 진짜입니다. 어떤 제3자도 당신의 고객과 금액을 담은 목록을 계속 쥐고 있지 않다는 것입니다. 나머지는 당신이 속한 관할권의 회계사에게 물어보십시오.

NordBastion은 VPS에서 결제 프로세서를 운영해도 허용하나요?

예 — BTCPay 인스턴스는 평범한 데이터베이스와 평범한 블록체인 데몬을 가진 평범한 웹 애플리케이션이며, 이용 정책 어디에도 이것을 상점이나 블로그와 달리 취급하는 조항은 없습니다. 실질적으로 알아 둘 점은 정책이 아니라 리소스에 관한 것입니다. 동기화 중인 노드는 첫날에는 디스크와 IO 부담이 크지만 그 뒤로는 거의 유휴 상태이고, 모든 티어에서 대역폭이 무제한이므로 퍼블릭 Lightning 노드도 종량제로 과금되지 않으며, 피어 연결을 위한 인바운드 포트는 당신이 원하는 대로 열면 됩니다. 이 사이트의 나머지 부분과 맞아떨어지는 부분은 그 대칭성입니다. 계정에 본명이 필요 없고, 청구서는 Monero, Bitcoin, Lightning으로 정산되며, 이제 당신의 모든 고객을 아는 그 머신은 당신이 누구인지 모르는 회사에서 빌린 것입니다. 신원이 확인된 계정 위에 셀프 호스팅한 프로세서는 장부를 옮겼을 뿐, 노출을 옮긴 것은 아닙니다.

서버를 확보하십시오

당신 이름이 아닌 계정 위에, 온전히 당신 소유인 체크아웃. KYC 없이, 암호화폐로 결제.

Garrison — Helsinki, Stockholm, Oslo, Reykjavík 중 어디서든 월 $7.90에 4 vCPU, 8 GB, 240 GB NVMe. 프루닝 Bitcoin 노드, Lightning 데몬, 인덱서, 상점을 돌리고도 수년치 여유 공간이 남습니다. 가입 시 이메일도, 신분증도 필요 없고, 지금까지 당신에게 결제한 모든 사람의 목록을 쥔 회사도 없습니다.

마지막 검토일 · 2026-10-12 · 출처 · BTCPay Server 문서(Docker 배포, 스토리지 프래그먼트, 백업과 복원, 상점 설정), 프루닝에 관한 Bitcoin Core 문서, 정적 채널 백업에 관한 Lightning 구현체 문서 · 주기 · 연간

북유럽에서 구축한 프라이빗 호스팅.