diff --git a/404.html b/404.html index fd01a15f37..6263c71840 100644 --- a/404.html +++ b/404.html @@ -9,13 +9,13 @@ - + -

404

That's a Four-Oh-Four.
+ - + diff --git a/AdvancedForms/index.html b/AdvancedForms/index.html index 4e562d754d..0fc1c858d3 100644 --- a/AdvancedForms/index.html +++ b/AdvancedForms/index.html @@ -9,7 +9,7 @@ - + @@ -151,6 +151,6 @@ →

- + diff --git a/Apps/index.html b/Apps/index.html index 2fb71aeaa0..26ba46bc2d 100644 --- a/Apps/index.html +++ b/Apps/index.html @@ -9,7 +9,7 @@ - + @@ -66,6 +66,6 @@ →

- + diff --git a/BTCPayServer/LocalDevSetup/index.html b/BTCPayServer/LocalDevSetup/index.html index e044f615ad..055babe73a 100644 --- a/BTCPayServer/LocalDevSetup/index.html +++ b/BTCPayServer/LocalDevSetup/index.html @@ -9,7 +9,7 @@ - + @@ -72,6 +72,6 @@ type=lnd-rest;server=https://127.0.0.1:8084/;macaroonfilepath="local path to admin.macaroon on your computer, without these quotes";allowinsecure=true

Now you can create a lightning invoice on BTCPay Server regtest and make a payment through Polar.

PLEASE NOTE: You may get an exception break in Visual Studio. You must quickly click "Continue" in VS so the invoice is generated. Or, uncheck the box that says, "Break when this exception type is thrown".

# FAQ

# docker-compose up dev failed or tests are not passing, what should I do?

  1. Run docker-compose down --volumes (this will reset your test environment)
  2. Run docker-compose pull (this will ensure you have the latest images)
  3. Run again with docker-compose up dev

# How to run the Altcoin environment?

docker-compose -f docker-compose.altcoins.yml up dev

If you still have issues, try to restart docker.

# How to run the Selenium test with a browser?

Run dotnet user-secrets set RunSeleniumInBrowser true to run tests in browser.

To switch back to headless mode (recommended) you can run dotnet user-secrets remove RunSeleniumInBrowser.

# Session not created: This version of ChromeDriver only supports Chrome version 88

When you run tests for selenium, you may end up with this error. This happen when we update the selenium packages on BTCPay Server while you did not update your chrome version.

If you want to use a older chrome driver on this page (opens new window) then point to it with

dotnet user-secrets set ChromeDriverDirectory "path/to/the/driver/directory"

- + diff --git a/BTCPayServer/Security/index.html b/BTCPayServer/Security/index.html index e91c599dd2..338e5d362c 100644 --- a/BTCPayServer/Security/index.html +++ b/BTCPayServer/Security/index.html @@ -9,7 +9,7 @@ - + @@ -89,6 +89,6 @@ →

- + diff --git a/BTCPayServer/db-migration/index.html b/BTCPayServer/db-migration/index.html index b9350efc74..1e19138f50 100644 --- a/BTCPayServer/db-migration/index.html +++ b/BTCPayServer/db-migration/index.html @@ -9,7 +9,7 @@ - + @@ -58,6 +58,6 @@ GitHub (opens new window)

# Migration from SQLite and MySQL to Postgres

# Introduction

This document is intended for BTCPay Server integrators such as Raspiblitz, Umbrel, Embassy OS or anybody running BTCPay Server on SQLite or MySql.

If you are a user of an integrated solution, please contact the integrator directly and provide them with the link to this document.

BTCPay Server has for long time supported three different backends:

  1. Postgres
  2. SQLite
  3. MySql

While most of our users are using the Postgres backend, maintaining supports for all those databases has been very challenging, and Postgres is the only one part of our test suite.

As a result, we regret to inform you that we decided to stop the support of MySql and SQLite.

We understand that dropping support might be painful for users and integrators of our product, and we will do our best to provide a migration path.

Please keep us informed if you experience any issues while migrating on our community chat (opens new window).

# Procedure

In order to successfully migrate, you will need to run BTCPay Server 1.7.8 or newer.

As a reminder there are three settings controlling the choice of backend of BTCPay Server which can be controller by command line, environment variable or configuration settings.

Command line argument Environment variable
--postgres BTCPAY_POSTGRES="..."
--mysql BTCPAY_MYSQL="..."
--sqlitefile BTCPAY_SQLITEFILE="blah.db"

If you are currently using mysql or sqlitefile, and you wish to migrate to postgres, you simply need to add the command line argument --postgres or the environment variable BTCPAY_POSTGRES pointing to a fresh postgres database.

It is strongly advised not to create a database in Postgres before performing the migration with BTCPay Server. This is because BTCPay Server will automatically create the necessary database for you. However, if you must create the database manually, please ensure that the C_TYPE and COLLATE settings are both set to C.

Careful: Do not remove the former mysql or sqlitefile setting, you should have both: the postgres setting and the former sqlite/mysql setting

From 1.7.8, BTCPay Server will interprete this and attempt to copy the data from mysql and sqlite into the new postgres database.

Note that once the migration is complete, the old mysql and sqlite settings will simply be ignored.

If the migration fails, you can revert the postgres setting you added, so the next restart will run on the old unsupported database. You can retry a migration by adding the postgres setting again.

# Known issues

- + diff --git a/BTCPayServer/greenfield-authorization/index.html b/BTCPayServer/greenfield-authorization/index.html index 687eb330de..31edb018d3 100644 --- a/BTCPayServer/greenfield-authorization/index.html +++ b/BTCPayServer/greenfield-authorization/index.html @@ -9,7 +9,7 @@ - + @@ -68,6 +68,6 @@ →

- + diff --git a/BTCPayServer/greenfield-development/index.html b/BTCPayServer/greenfield-development/index.html index c3117fb1ac..6938df3357 100644 --- a/BTCPayServer/greenfield-development/index.html +++ b/BTCPayServer/greenfield-development/index.html @@ -9,7 +9,7 @@ - + @@ -78,6 +78,6 @@ →

- + diff --git a/BTCPayVsOthers/index.html b/BTCPayVsOthers/index.html index 4661f2aa4c..ba5f5dff87 100644 --- a/BTCPayVsOthers/index.html +++ b/BTCPayVsOthers/index.html @@ -9,7 +9,7 @@ - + @@ -69,6 +69,6 @@ →

- + diff --git a/ColdCardWallet/index.html b/ColdCardWallet/index.html index e07bbf7a85..2266acefed 100644 --- a/ColdCardWallet/index.html +++ b/ColdCardWallet/index.html @@ -9,7 +9,7 @@ - + @@ -58,6 +58,6 @@ GitHub (opens new window)

# Connecting Coldcard Wallet to BTCPay Server

This document shows how to use a Coldcard Wallet with your BTCPay Server.

# Coldcard Wallet Setup

This guide assumes, you have a Coldcard wallet set up. To configure the Coldcard, please see the quick setup guide on manufacturer's website (opens new window).

# Quick Setup

  1. Insert the MicroSD card into the Coldcard wallet.
  2. Go to Advanced > MicroSD Card > Electrum Wallet > Native-Segwit
  3. Insert the MicroSD card back into your PC
  4. In BTCPay Server, Stores > Settings > Setup > Connect an existing wallet > Import wallet file
  5. Choose File > select the wallet file earlier exported from Coldcard.
  6. Click Continue
  7. Confirm the addresses match the ones shown in your BTCPay Server.

The Coldcard is now connected to your BTCPay Server. Payments go directly to Coldcard. The video below shows how to connect your BTCPay store to your Coldcard.

# Spending from BTCPay Server wallet with Coldcard (PSBT)

Once there are some funds in received to your BTCPay Wallet connected to Coldcard, you can spend them by using PSBT (opens new window) (Partially Signed Bitcoin Transactions). This allows completely offline signing of your transactions, without ever having to connect your hardware wallet to the internet.

  1. Wallets > Manage > Send
  2. Fill in destination address and the amount
  3. Click on the Sign with a wallet supporting PSBT button.
  4. You will be redirected to PSBT tab, with pre-filled information, click on the Sign with a wallet supporting PSBT (save as file)
  5. Save the file onto MicroSD card
  6. Insert MicroSD into your Coldcard.
  7. In Coldcard, click on the Ready To Sign
  8. Review the transaction information, and click OK button to sign it.
  9. Transaction will be saved onto MicroSD.
  10. In BTCPay, go to PSBT tab of the wallet and upload the signed PSBT file.
  11. Click Decode
  12. Click Other Actions and select Review
  13. Review your transactions and click Broadcast to broadcast it on the network.

The video below shows how to connect your BTCPay store to your Coldcard.

- + diff --git a/Community/index.html b/Community/index.html index edef117b9f..1e4f55695b 100644 --- a/Community/index.html +++ b/Community/index.html @@ -9,7 +9,7 @@ - + @@ -62,6 +62,6 @@

- + diff --git a/Configurator/index.html b/Configurator/index.html index fc14568a82..5365fb9d87 100644 --- a/Configurator/index.html +++ b/Configurator/index.html @@ -9,7 +9,7 @@ - + @@ -66,6 +66,6 @@ →

- + diff --git a/Contribute/Design/index.html b/Contribute/Design/index.html index 39611aea3f..9e41baadf3 100644 --- a/Contribute/Design/index.html +++ b/Contribute/Design/index.html @@ -9,7 +9,7 @@ - + @@ -67,6 +67,6 @@ →

- + diff --git a/Contribute/Dev/index.html b/Contribute/Dev/index.html index 3c4b16c604..09a2999177 100644 --- a/Contribute/Dev/index.html +++ b/Contribute/Dev/index.html @@ -9,7 +9,7 @@ - + @@ -58,6 +58,6 @@ GitHub (opens new window)

# Coding BTCPay Server

# Why coding matters

By helping the project grow, become more mature, advanced and elaborate, coders working on BTCPay Server are a central component of the project.

If you have coding skills, be it writing or reviewing code, you can contribute to BTCPay Server.

# Where to start

If you're a developer looking to help, but you're not sure where to begin, check the good first issue label (opens new window), which contains small pieces of work that have been specifically flagged as being friendly to new contributors.

Contributors looking to do something a bit more challenging, before opening a pull request, please create an issue (opens new window) or join our community chat (opens new window) to get early feedback, discuss best ways to tackle the problem and to ensure there is no work duplication.

We are actively looking for developers who can take on and resolve GitHub issues and help with development. If you would like to help us, but need some guidance, the #dev channel on Mattermost (opens new window) is the place to ask questions.

# Setup Developer Environment

If you are interested in getting started as a developer or tester of the software behind BTCPay Server, check out the Setup Developer Environment guide that will walk you step by step through every software used in development with BTCPay such as Git, GitBash, Github, Docker, Visual Studio, Postgres, etc. If you have never coded before and you are looking to learn something new, start here.

# Local BTCPay Development

If you already have a developer environment setup you can start with the BTCPay specific Local Development documentation.

# Local BTCPay Testing

Once you have your development environment tools setup and your local BTCPay Server running, view the Local Testing guide. This shows you how to use BTCPay in regtest mode for use in development and for users who want to test new features before they are released.

# Requirements

Software requirements (ie. IDE) can also be found in local development.

# Videos

BTCPay Server development videos can be found here or on the BTCPayServer YouTube (opens new window) channel.

- + diff --git a/Contribute/DevCode/index.html b/Contribute/DevCode/index.html index 48db8ac32a..b495cf3f32 100644 --- a/Contribute/DevCode/index.html +++ b/Contribute/DevCode/index.html @@ -9,7 +9,7 @@ - + @@ -99,6 +99,6 @@ →

- + diff --git a/Contribute/DevTest/index.html b/Contribute/DevTest/index.html index 21fb1ce1e2..4b86a2055c 100644 --- a/Contribute/DevTest/index.html +++ b/Contribute/DevTest/index.html @@ -9,7 +9,7 @@ - + @@ -73,6 +73,6 @@ →

- + diff --git a/Contribute/Misc/index.html b/Contribute/Misc/index.html index 3edcfffa55..cb1d090248 100644 --- a/Contribute/Misc/index.html +++ b/Contribute/Misc/index.html @@ -9,7 +9,7 @@ - + @@ -64,6 +64,6 @@

- + diff --git a/Contribute/Translate/index.html b/Contribute/Translate/index.html index 40d24c8700..d0148cf7af 100644 --- a/Contribute/Translate/index.html +++ b/Contribute/Translate/index.html @@ -9,7 +9,7 @@ - + @@ -77,6 +77,6 @@ →

- + diff --git a/Contribute/Write/index.html b/Contribute/Write/index.html index d502a0b8b8..f03b75efff 100644 --- a/Contribute/Write/index.html +++ b/Contribute/Write/index.html @@ -9,7 +9,7 @@ - + @@ -59,6 +59,6 @@ GitHub (opens new window)

# Documenting BTCPay Server

# Why documentation matters

Documentation is essential to give users of all skill levels concise and clear information about the software and how to use it. BTCPay server has many different use cases and as a result many different kinds of users seeking information from the documentation. Writers contributing to BTCPay Server are as important as any other contributor.

If you have technical knowledge in a certain area, want to help document new features or simply get involved in the BTCPay Server project, documentation is a great place to get started with contributing.

If you have writing skills or if you have a fair knowledge of the English language, then you can contribute to BTCPay Server or review the work of other contributors. Writing contributors can help in a number of places.

# BTCPay Documentation

Documentation work needing to be completed can be found in the open issues page (opens new window) on Github. For information on how to start a documentation task, see the documentation guide.

For documentation guidance or discussion of a new documentation idea, join the #documentation channel on Mattermost (opens new window).

# BTCPay Blog

Another great way to contribute is by writing content for the BTCPay blog. To get started on a blog topic, join the #content creation channel on Mattermost (opens new window).

# Requirements

In order to contribute to BTCPay Server as a writer there are some requirements.

Since most of the documentation done in BTCPay Server is submitted and reviewed through Github, you must have a Github account (opens new window). It's also on Github that you can contribute by reviewing the documentation work done by others (pull requests).

Important note: Contributions explained in this documentation are meant to be done in English only. If you wish to contribute in other languages, see Translations.

# Text Editor

It is recommended to have a Rich-Text editor.

Notepad++ (opens new window) is a decent software and easy to use for the newer contributors.

For more advanced users, Visual Studio Code (VS Code) (opens new window) is a good choice. The Markdown All In One extension in VS Code is also recommended, for visual comfort while editing and the ability to preview Markdown changes. This is helpful for the BTCPay documentation which is written primarily in Markdown.

These are only recommended: If you already use other similar software that you're accustomed to, you are free to continue using them.

# Version Control

To be able to manage your contributions (such as forking repositories, creating and working on branches, making pull requests and issues, etc.) it's recommended you have Github Desktop (opens new window). You can see the step by step guide to making a pull request using Github Desktop here.

- + diff --git a/Contribute/WriteBlog/index.html b/Contribute/WriteBlog/index.html index b47c759bd4..c5941028c0 100644 --- a/Contribute/WriteBlog/index.html +++ b/Contribute/WriteBlog/index.html @@ -9,7 +9,7 @@ - + @@ -66,6 +66,6 @@ →

- + diff --git a/Contribute/WriteDocs/index.html b/Contribute/WriteDocs/index.html index a3537a15eb..53ed095b09 100644 --- a/Contribute/WriteDocs/index.html +++ b/Contribute/WriteDocs/index.html @@ -9,7 +9,7 @@ - + @@ -68,6 +68,6 @@ →

- + diff --git a/Contribute/WriteSoftware/index.html b/Contribute/WriteSoftware/index.html index cd626e6553..aef823443d 100644 --- a/Contribute/WriteSoftware/index.html +++ b/Contribute/WriteSoftware/index.html @@ -9,7 +9,7 @@ - + @@ -70,6 +70,6 @@ →

- + diff --git a/Contribute/index.html b/Contribute/index.html index f4d2543811..f8558928d6 100644 --- a/Contribute/index.html +++ b/Contribute/index.html @@ -9,7 +9,7 @@ - + @@ -58,6 +58,6 @@ GitHub (opens new window)

# How to contribute to BTCPay Server?

BTCPay Server is built and maintained entirely by volunteer contributors around the internet.

We welcome, appreciate and encourage new contributions.

Depending on your skills and interest, you can help in a number of ways:

Every contribution is important and if you have any questions, feel free to consult our growing community.

- + diff --git a/CreateStore/index.html b/CreateStore/index.html index bc4274ae71..ad36d92bb6 100644 --- a/CreateStore/index.html +++ b/CreateStore/index.html @@ -9,7 +9,7 @@ - + @@ -66,6 +66,6 @@ →

- + diff --git a/CreateWallet/index.html b/CreateWallet/index.html index 6baedbca99..7a9c75d0c2 100644 --- a/CreateWallet/index.html +++ b/CreateWallet/index.html @@ -9,7 +9,7 @@ - + @@ -67,6 +67,6 @@ →

- + diff --git a/CustomIntegration/index.html b/CustomIntegration/index.html index a8bce6fde5..480d057fc9 100644 --- a/CustomIntegration/index.html +++ b/CustomIntegration/index.html @@ -9,7 +9,7 @@ - + @@ -92,6 +92,6 @@ →

- + diff --git a/Dashboard/index.html b/Dashboard/index.html index a283c95da4..1b480c7569 100644 --- a/Dashboard/index.html +++ b/Dashboard/index.html @@ -9,7 +9,7 @@ - + @@ -69,6 +69,6 @@ →

- + diff --git a/Deployment/Azure/index.html b/Deployment/Azure/index.html index bf84692107..64cb893d84 100644 --- a/Deployment/Azure/index.html +++ b/Deployment/Azure/index.html @@ -9,7 +9,7 @@ - + @@ -58,6 +58,6 @@ GitHub (opens new window)

# Azure Deployment

This setup is similar to the Docker Deployment, except that the docker-compose is hosted by Microsoft Azure.

# One-click setup

Start by clicking the following button:

Deploy to Azure (opens new window)

You can log into Azure (opens new window) with your Microsoft account.

Final installation steps:

Fill in the remaining options: Azure Resource Config

For advanced users, you can connect via SSH with the information on https://EXAMPLE.MYSITE.com/server/services/ssh, and:

Approximate Cost (unpruned, Bitcoin-only, after Azure $200 free trial): 60 USD per month

After all your nodes have synced and you've confirmed everything works, follow this guide to fine-tune for savings; costs should drop to 30 or 40 USD per month.

Learn more: btcpayserver/btcpayserver-azure (opens new window)

- + diff --git a/Deployment/AzurePennyPinching/index.html b/Deployment/AzurePennyPinching/index.html index 7c02279bd8..55c8d4f3a4 100644 --- a/Deployment/AzurePennyPinching/index.html +++ b/Deployment/AzurePennyPinching/index.html @@ -9,7 +9,7 @@ - + @@ -92,6 +92,6 @@ →

- + diff --git a/Deployment/Clovyr/index.html b/Deployment/Clovyr/index.html index 3b7ab17c0c..57cea44331 100644 --- a/Deployment/Clovyr/index.html +++ b/Deployment/Clovyr/index.html @@ -9,7 +9,7 @@ - + @@ -71,6 +71,6 @@ →

- + diff --git a/Deployment/DreamlabNetwork/index.html b/Deployment/DreamlabNetwork/index.html index 2aa6cc792a..02453a7d19 100644 --- a/Deployment/DreamlabNetwork/index.html +++ b/Deployment/DreamlabNetwork/index.html @@ -9,7 +9,7 @@ - + @@ -86,6 +86,6 @@ →

- + diff --git a/Deployment/DynamicDNS/index.html b/Deployment/DynamicDNS/index.html index 88b609d840..c1ddfa3bb5 100644 --- a/Deployment/DynamicDNS/index.html +++ b/Deployment/DynamicDNS/index.html @@ -9,7 +9,7 @@ - + @@ -71,6 +71,6 @@ →

- + diff --git a/Deployment/GoogleCloud/index.html b/Deployment/GoogleCloud/index.html index acef99044e..0211ac5a1a 100644 --- a/Deployment/GoogleCloud/index.html +++ b/Deployment/GoogleCloud/index.html @@ -9,7 +9,7 @@ - + @@ -66,6 +66,6 @@ →

- + diff --git a/Deployment/Hack0/index.html b/Deployment/Hack0/index.html index d4605fb678..8f71668789 100644 --- a/Deployment/Hack0/index.html +++ b/Deployment/Hack0/index.html @@ -9,7 +9,7 @@ - + @@ -71,6 +71,6 @@ →

- + diff --git a/Deployment/Hardware/index.html b/Deployment/Hardware/index.html index 8685de4db4..90baea579d 100644 --- a/Deployment/Hardware/index.html +++ b/Deployment/Hardware/index.html @@ -9,7 +9,7 @@ - + @@ -58,6 +58,6 @@ GitHub (opens new window)

# Hardware Deployment

Hardware deployment is advised when you want to be in total control of your own infrastructure.

Those are very useful for personal use or for people who wants absolute control over their infrastructure.

The main downside of hardware deployment is that it requires some hardware investment, and higher learning curve. The availability of your server will also probably lower than using a VPS such as LunaNode, as you are more likely to suffer from internet down time or hardware failure.

If you are still not sure whether you need hardware deployment, please see our diagram.

While all hardware deployments are similar to one another, we document step by step the process on three different hardware settings.

You can easily adapt those documentation on the custom hardware you prefer, we support arm32, arm64 and amd64.

Note that those solutions are all based on our docker deployment system.

- + diff --git a/Deployment/HardwareAsAService/index.html b/Deployment/HardwareAsAService/index.html index 217d56a46d..caaf7dfccf 100644 --- a/Deployment/HardwareAsAService/index.html +++ b/Deployment/HardwareAsAService/index.html @@ -9,7 +9,7 @@ - + @@ -70,6 +70,6 @@ →

- + diff --git a/Deployment/LightningInABox/index.html b/Deployment/LightningInABox/index.html index f8dba0b604..fcc150e541 100644 --- a/Deployment/LightningInABox/index.html +++ b/Deployment/LightningInABox/index.html @@ -9,7 +9,7 @@ - + @@ -87,6 +87,6 @@ →

- + diff --git a/Deployment/LunaNode/index.html b/Deployment/LunaNode/index.html index ccb2777aca..6da91ccc9c 100644 --- a/Deployment/LunaNode/index.html +++ b/Deployment/LunaNode/index.html @@ -9,7 +9,7 @@ - + @@ -74,6 +74,6 @@ →

- + diff --git a/Deployment/ManualDeployment/index.html b/Deployment/ManualDeployment/index.html index b35128c465..c6b0b033c4 100644 --- a/Deployment/ManualDeployment/index.html +++ b/Deployment/ManualDeployment/index.html @@ -9,7 +9,7 @@ - + @@ -112,6 +112,6 @@ →

- + diff --git a/Deployment/ManualDeploymentExtended/index.html b/Deployment/ManualDeploymentExtended/index.html index 1dc4a930b6..afa1ffb223 100644 --- a/Deployment/ManualDeploymentExtended/index.html +++ b/Deployment/ManualDeploymentExtended/index.html @@ -9,7 +9,7 @@ - + @@ -732,6 +732,6 @@

- + diff --git a/Deployment/RaspberryPi4/index.html b/Deployment/RaspberryPi4/index.html index 18d2499f31..ba196ff101 100644 --- a/Deployment/RaspberryPi4/index.html +++ b/Deployment/RaspberryPi4/index.html @@ -9,7 +9,7 @@ - + @@ -166,6 +166,6 @@ →

- + diff --git a/Deployment/ReverseProxyToTor/index.html b/Deployment/ReverseProxyToTor/index.html index 4300171c08..55ab7dab07 100644 --- a/Deployment/ReverseProxyToTor/index.html +++ b/Deployment/ReverseProxyToTor/index.html @@ -9,7 +9,7 @@ - + @@ -265,6 +265,6 @@ →

- + diff --git a/Deployment/ReverseSSHtunnel/index.html b/Deployment/ReverseSSHtunnel/index.html index 8802f872af..abc7543c3d 100644 --- a/Deployment/ReverseSSHtunnel/index.html +++ b/Deployment/ReverseSSHtunnel/index.html @@ -9,7 +9,7 @@ - + @@ -109,6 +109,6 @@ →

- + diff --git a/Deployment/ThirdPartyHosting/index.html b/Deployment/ThirdPartyHosting/index.html index 82035f7ff1..91ff88dd6b 100644 --- a/Deployment/ThirdPartyHosting/index.html +++ b/Deployment/ThirdPartyHosting/index.html @@ -9,7 +9,7 @@ - + @@ -68,6 +68,6 @@ →

- + diff --git a/Deployment/index.html b/Deployment/index.html index d50b70bc78..893a813a34 100644 --- a/Deployment/index.html +++ b/Deployment/index.html @@ -9,7 +9,7 @@ - + @@ -62,6 +62,6 @@ →

- + diff --git a/Deployment/voltagecloud/index.html b/Deployment/voltagecloud/index.html index 931a579b5a..c02a1f0454 100644 --- a/Deployment/voltagecloud/index.html +++ b/Deployment/voltagecloud/index.html @@ -9,7 +9,7 @@ - + @@ -90,6 +90,6 @@ →

- + diff --git a/Deployment/webdeployment/index.html b/Deployment/webdeployment/index.html index 8c7e971a2b..5beaa0d919 100644 --- a/Deployment/webdeployment/index.html +++ b/Deployment/webdeployment/index.html @@ -9,7 +9,7 @@ - + @@ -74,6 +74,6 @@ Found a deployment that is missing, and do you want it added or notified us? Join the community chat (opens new window) on Mattermost by downloading Mattermost app (opens new window), or on Telegram (opens new window) and tell us about it. You can also create an issue in the BTCPay server Documents on Github (opens new window).

- + diff --git a/Development/Altcoins/index.html b/Development/Altcoins/index.html index 994d818c56..8c09411334 100644 --- a/Development/Altcoins/index.html +++ b/Development/Altcoins/index.html @@ -9,7 +9,7 @@ - + @@ -70,6 +70,6 @@ →

- + diff --git a/Development/GreenFieldExample-NodeJS/index.html b/Development/GreenFieldExample-NodeJS/index.html index 855effe34b..23dbdeb7e8 100644 --- a/Development/GreenFieldExample-NodeJS/index.html +++ b/Development/GreenFieldExample-NodeJS/index.html @@ -9,7 +9,7 @@ - + @@ -173,6 +173,6 @@ →

- + diff --git a/Development/GreenFieldExample/index.html b/Development/GreenFieldExample/index.html index 0f85ca459e..e0a4a10964 100644 --- a/Development/GreenFieldExample/index.html +++ b/Development/GreenFieldExample/index.html @@ -9,7 +9,7 @@ - + @@ -112,6 +112,6 @@ →

- + diff --git a/Development/GreenfieldExample-PHP/index.html b/Development/GreenfieldExample-PHP/index.html index 5b5ac4155f..08558f9481 100644 --- a/Development/GreenfieldExample-PHP/index.html +++ b/Development/GreenfieldExample-PHP/index.html @@ -9,7 +9,7 @@ - + @@ -158,6 +158,6 @@ →

- + diff --git a/Development/InvoiceMetadata/index.html b/Development/InvoiceMetadata/index.html index f32065ff13..00b0c36d6a 100644 --- a/Development/InvoiceMetadata/index.html +++ b/Development/InvoiceMetadata/index.html @@ -9,7 +9,7 @@ - + @@ -132,6 +132,6 @@ →

- + diff --git a/Development/LocalDev/index.html b/Development/LocalDev/index.html index 3f9a346341..75f5148d4a 100644 --- a/Development/LocalDev/index.html +++ b/Development/LocalDev/index.html @@ -9,7 +9,7 @@ - + @@ -77,6 +77,6 @@ dotnet test -c Altcoins-Debug

# HTTPS support for local development

Some browser security features may require that you use HTTPS to be properly tested.

In this case, use Bitcoin-HTTPS (or Altcoin-HTTPS) launch profile. This will create a self signed certificate for your development purpose.

However, your browser will not trust it, making it difficult to debug.

You can instruct your OS to trust this development time certificate by running:

dotnet dev-certs https --trust
 

# Videos

For more information check out these videos:

and these notes:

- + diff --git a/Development/LocalDevelopment/index.html b/Development/LocalDevelopment/index.html index 1a71971015..73cefd43fb 100644 --- a/Development/LocalDevelopment/index.html +++ b/Development/LocalDevelopment/index.html @@ -9,7 +9,7 @@ - + @@ -98,6 +98,6 @@ →

- + diff --git a/Development/Plugins/index.html b/Development/Plugins/index.html index 8df78abe8d..cbabf25bce 100644 --- a/Development/Plugins/index.html +++ b/Development/Plugins/index.html @@ -9,7 +9,7 @@ - + @@ -236,6 +236,6 @@ →

- + diff --git a/Development/TestnetDemo/index.html b/Development/TestnetDemo/index.html index f60b1734ea..11943baad3 100644 --- a/Development/TestnetDemo/index.html +++ b/Development/TestnetDemo/index.html @@ -9,7 +9,7 @@ - + @@ -63,6 +63,6 @@

- + diff --git a/Development/Theme/index.html b/Development/Theme/index.html index 2a54340df8..595242f188 100644 --- a/Development/Theme/index.html +++ b/Development/Theme/index.html @@ -9,7 +9,7 @@ - + @@ -2436,6 +2436,6 @@ →

- + diff --git a/Development/index.html b/Development/index.html index 40b4993cbe..432755f4d1 100644 --- a/Development/index.html +++ b/Development/index.html @@ -9,7 +9,7 @@ - + @@ -66,6 +66,6 @@ →

- + diff --git a/Docker/backup-restore/index.html b/Docker/backup-restore/index.html index dfad3cc9dc..fee6c646be 100644 --- a/Docker/backup-restore/index.html +++ b/Docker/backup-restore/index.html @@ -9,7 +9,7 @@ - + @@ -123,6 +123,6 @@ →

- + diff --git a/Docker/chatwoot/index.html b/Docker/chatwoot/index.html index 980b9265eb..1fd299b4bd 100644 --- a/Docker/chatwoot/index.html +++ b/Docker/chatwoot/index.html @@ -9,7 +9,7 @@ - + @@ -69,6 +69,6 @@
  1. Wait for BTPay to be online and then create the database for chatwoot
docker exec -ti chatwoot sh -c "export DISABLE_DATABASE_ENVIRONMENT_CHECK=1 && bundle exec rails db:reset"
 
  1. Go to chatwoot website at https://chatwoot.xpayserver.com and set up.
- + diff --git a/Docker/cloudflare-tunnel/index.html b/Docker/cloudflare-tunnel/index.html index e43af72c31..32fcaff71e 100644 --- a/Docker/cloudflare-tunnel/index.html +++ b/Docker/cloudflare-tunnel/index.html @@ -9,7 +9,7 @@ - + @@ -77,6 +77,6 @@ →

- + diff --git a/Docker/fastsync/index.html b/Docker/fastsync/index.html index b7ee0e7e6d..a6ed63b119 100644 --- a/Docker/fastsync/index.html +++ b/Docker/fastsync/index.html @@ -9,7 +9,7 @@ - + @@ -86,6 +86,6 @@ →

- + diff --git a/Docker/fireflyiii/index.html b/Docker/fireflyiii/index.html index 3c6376e2db..c54fb68c3e 100644 --- a/Docker/fireflyiii/index.html +++ b/Docker/fireflyiii/index.html @@ -9,7 +9,7 @@ - + @@ -71,6 +71,6 @@ →

- + diff --git a/Docker/index.html b/Docker/index.html index 7052726d1d..326bdd75f9 100644 --- a/Docker/index.html +++ b/Docker/index.html @@ -9,7 +9,7 @@ - + @@ -218,6 +218,6 @@ →

- + diff --git a/Docker/joinmarket/index.html b/Docker/joinmarket/index.html index ae1f1fac4b..ceb7c8cbc9 100644 --- a/Docker/joinmarket/index.html +++ b/Docker/joinmarket/index.html @@ -9,7 +9,7 @@ - + @@ -108,6 +108,6 @@ →

- + diff --git a/Docker/lightning-terminal/index.html b/Docker/lightning-terminal/index.html index da17d8162e..12713db723 100644 --- a/Docker/lightning-terminal/index.html +++ b/Docker/lightning-terminal/index.html @@ -9,7 +9,7 @@ - + @@ -75,6 +75,6 @@ →

- + diff --git a/Docker/ndlc/index.html b/Docker/ndlc/index.html index 540f1d37c3..0c7e0eed43 100644 --- a/Docker/ndlc/index.html +++ b/Docker/ndlc/index.html @@ -9,7 +9,7 @@ - + @@ -71,6 +71,6 @@ →

- + diff --git a/Docker/pihole/index.html b/Docker/pihole/index.html index 88e2b0885c..3b7a7ca475 100644 --- a/Docker/pihole/index.html +++ b/Docker/pihole/index.html @@ -9,7 +9,7 @@ - + @@ -76,6 +76,6 @@ →

- + diff --git a/Docker/tallycoin-connect/index.html b/Docker/tallycoin-connect/index.html index 897ed2ff63..353e4165f2 100644 --- a/Docker/tallycoin-connect/index.html +++ b/Docker/tallycoin-connect/index.html @@ -9,7 +9,7 @@ - + @@ -76,6 +76,6 @@ →

- + diff --git a/Drupal/index.html b/Drupal/index.html index c63b715300..5a8c9fcff6 100644 --- a/Drupal/index.html +++ b/Drupal/index.html @@ -9,7 +9,7 @@ - + @@ -69,6 +69,6 @@ →

- + diff --git a/ElectrumPersonalServer/index.html b/ElectrumPersonalServer/index.html index bf741fe6a2..f541223d8b 100644 --- a/ElectrumPersonalServer/index.html +++ b/ElectrumPersonalServer/index.html @@ -9,7 +9,7 @@ - + @@ -73,6 +73,6 @@ →

- + diff --git a/ElectrumWallet/index.html b/ElectrumWallet/index.html index 170b0d0f74..69e271b3bf 100644 --- a/ElectrumWallet/index.html +++ b/ElectrumWallet/index.html @@ -9,7 +9,7 @@ - + @@ -61,6 +61,6 @@

If you are running a version older than Electrum 4, also enter the following command and press 'enter'

wallet.storage.write()
 
ElectrumWallet

Restart your Electrum and verify that the newly set gap limit is correct by entering in the console:

wallet.gap_limit
 

There's no good answer to how much you should set the gap limit to. Most merchants set 100-200. If you're a big merchants with high transaction volume, you can try with even higher gap limit.

For more details about the Gap Limit, check the FAQ.

Electrum and BTCPay Server are now connected. Any payments received to your BTCPay will be visible in Electrum, where you can further spend them.

- + diff --git a/ElectrumX/index.html b/ElectrumX/index.html index 2bdee88e89..dfd5ac6cb3 100644 --- a/ElectrumX/index.html +++ b/ElectrumX/index.html @@ -9,7 +9,7 @@ - + @@ -75,6 +75,6 @@ →

- + diff --git a/FAQ/Altcoin/index.html b/FAQ/Altcoin/index.html index 6fc815b9ac..9ce003907a 100644 --- a/FAQ/Altcoin/index.html +++ b/FAQ/Altcoin/index.html @@ -9,7 +9,7 @@ - + @@ -71,6 +71,6 @@

- + diff --git a/FAQ/Apps/index.html b/FAQ/Apps/index.html index e8c48ba856..92d5f1922f 100644 --- a/FAQ/Apps/index.html +++ b/FAQ/Apps/index.html @@ -9,7 +9,7 @@ - + @@ -180,6 +180,6 @@ →

- + diff --git a/FAQ/Deployment/index.html b/FAQ/Deployment/index.html index 5071de53d2..d7d1265265 100644 --- a/FAQ/Deployment/index.html +++ b/FAQ/Deployment/index.html @@ -9,7 +9,7 @@ - + @@ -286,6 +286,6 @@ →

- + diff --git a/FAQ/General/index.html b/FAQ/General/index.html index 98fec76108..118e9b856d 100644 --- a/FAQ/General/index.html +++ b/FAQ/General/index.html @@ -9,7 +9,7 @@ - + @@ -80,6 +80,6 @@ →

- + diff --git a/FAQ/Integrations/index.html b/FAQ/Integrations/index.html index 9ab26c7387..1f7986b02c 100644 --- a/FAQ/Integrations/index.html +++ b/FAQ/Integrations/index.html @@ -9,7 +9,7 @@ - + @@ -116,6 +116,6 @@ →

- + diff --git a/FAQ/LightningNetwork/index.html b/FAQ/LightningNetwork/index.html index b5b30e2d81..c775b0a81e 100644 --- a/FAQ/LightningNetwork/index.html +++ b/FAQ/LightningNetwork/index.html @@ -9,7 +9,7 @@ - + @@ -189,6 +189,6 @@ →

- + diff --git a/FAQ/ServerSettings/index.html b/FAQ/ServerSettings/index.html index 53c00e7a48..6115e048b8 100644 --- a/FAQ/ServerSettings/index.html +++ b/FAQ/ServerSettings/index.html @@ -9,7 +9,7 @@ - + @@ -125,6 +125,6 @@ →

- + diff --git a/FAQ/Stores/index.html b/FAQ/Stores/index.html index c1d9ce79a0..58ae0e8980 100644 --- a/FAQ/Stores/index.html +++ b/FAQ/Stores/index.html @@ -9,7 +9,7 @@ - + @@ -77,6 +77,6 @@ →

- + diff --git a/FAQ/Synchronization/index.html b/FAQ/Synchronization/index.html index 26f340b076..4c740ec842 100644 --- a/FAQ/Synchronization/index.html +++ b/FAQ/Synchronization/index.html @@ -9,7 +9,7 @@ - + @@ -132,6 +132,6 @@ →

- + diff --git a/FAQ/Wallet/index.html b/FAQ/Wallet/index.html index 7063547f31..9e233606e4 100644 --- a/FAQ/Wallet/index.html +++ b/FAQ/Wallet/index.html @@ -9,7 +9,7 @@ - + @@ -79,6 +79,6 @@ →

- + diff --git a/FAQ/index.html b/FAQ/index.html index ace82112bf..16710dd53b 100644 --- a/FAQ/index.html +++ b/FAQ/index.html @@ -9,7 +9,7 @@ - + @@ -58,6 +58,6 @@ GitHub (opens new window)

# Frequently Asked Questions and Common Issues

This document contains a Table of contents to all FAQ and common issues.

# General FAQ

General, non-technical questions about BTCPay. What it is, how it works, what are its features, why is it different and who can use it.

# Deployment FAQ

Questions and solutions to BTCPay installation.

# General Deployment FAQ

# Web Deployment FAQ

# Luna Node Web Deployment FAQ

# Manual Deployment FAQ

# Synchronization FAQ

Common questions and issues that may occur during the initial sync of BTCPay.

# Integrations FAQ

Questions about e-commerce and other integrations.

# Integrations General

# WooCommerce FAQ

# Server Settings FAQ

Common problems and questions server admins have.

# Maintenance FAQ

# Theme / Customization FAQ

# Policies FAQ

# Services FAQ

# Files FAQ

# Stores FAQ

Store settings explained.

# Wallet FAQ

Here are some of the questions and problems about wallets in BTCPay.

# Apps FAQ

Frequent questions about the applications in BTCPay.

# Lightning Network FAQ

Lightning Network troubleshooting and common problems.

# Lightning Network General FAQ

# Lightning Network LND FAQ

# Lightning Network Core Lightning (CLN) FAQ

# Altcoins FAQ

- + diff --git a/Forms/index.html b/Forms/index.html index 0c9f841f1a..8f802bec10 100644 --- a/Forms/index.html +++ b/Forms/index.html @@ -9,7 +9,7 @@ - + @@ -89,6 +89,6 @@ IVPN

If you'd like to support the project, please visit the donation page.

- + diff --git a/Guide/index.html b/Guide/index.html index da352b1d30..6802fdcb93 100644 --- a/Guide/index.html +++ b/Guide/index.html @@ -9,7 +9,7 @@ - + @@ -85,6 +85,6 @@ →

- + diff --git a/HardwareWalletIntegration/index.html b/HardwareWalletIntegration/index.html index c8e881cceb..049aa97d24 100644 --- a/HardwareWalletIntegration/index.html +++ b/HardwareWalletIntegration/index.html @@ -9,7 +9,7 @@ - + @@ -66,6 +66,6 @@ →

- + diff --git a/Invoices/index.html b/Invoices/index.html index e6e312a064..7bde9366b5 100644 --- a/Invoices/index.html +++ b/Invoices/index.html @@ -9,7 +9,7 @@ - + @@ -68,6 +68,6 @@ →

- + diff --git a/LNDhubAPI/index.html b/LNDhubAPI/index.html index 5b9165f74c..30018663ba 100644 --- a/LNDhubAPI/index.html +++ b/LNDhubAPI/index.html @@ -9,7 +9,7 @@ - + @@ -73,6 +73,6 @@ →

- + diff --git a/LNbank/LNDhub/index.html b/LNbank/LNDhub/index.html index 288f1142eb..92336f4c3e 100644 --- a/LNbank/LNDhub/index.html +++ b/LNbank/LNDhub/index.html @@ -9,7 +9,7 @@ - + @@ -73,6 +73,6 @@ →

- + diff --git a/LNbank/Troubleshooting/index.html b/LNbank/Troubleshooting/index.html index 5d2a1f3ba4..9cb1fde3d7 100644 --- a/LNbank/Troubleshooting/index.html +++ b/LNbank/Troubleshooting/index.html @@ -9,7 +9,7 @@ - + @@ -80,6 +80,6 @@ →

- + diff --git a/LNbank/index.html b/LNbank/index.html index 879bb870cc..5b9ff6d324 100644 --- a/LNbank/index.html +++ b/LNbank/index.html @@ -9,7 +9,7 @@ - + @@ -63,6 +63,6 @@ LNbank wallets can be seen as layer 3 sub-accounts.
  • All LNbank accounts use the internal Lightning node and share the Node ID of that node.
  • Channels and liquidity are managed by the server admin.
  • # Caveats

    Users rely on the server admin as the custodian, be aware of that trust relationship. When using LNbank on a third-party instance whose owner you don't know, mitigate the risks by following this advise:

    # Features and Compatibility

    # How to activate and use LNbank

    # Server admin

    # User

    # Support this plugin

    Support this plugin (opens new window)
    - + diff --git a/LedgerWallet/index.html b/LedgerWallet/index.html index daf17b518f..4204c3ed79 100644 --- a/LedgerWallet/index.html +++ b/LedgerWallet/index.html @@ -9,7 +9,7 @@ - + @@ -59,6 +59,6 @@ GitHub (opens new window)

    # Connecting Ledger Wallet to BTCPay Server

    This document shows how to connect Ledger Nano S Wallet to BTCPay Server.

    WARNING

    Direct Ledger Nano S integration is no longer supported. For Bitcoin wallets, you can use your Ledger hardware wallet regularly via the new hardware wallet integration.

    For altcoin wallets, you can spend funds from your external wallet, sign a transaction within the internal wallet with HD Private Key or mnemonic seed or a hot wallet.

    To set up a new altcoin wallet, add the extended public key manually or create a new wallet.

    # Ledger Nano S Wallet Setup

    This guide assumes, you have a Nano S wallet set up. To configure the Nano S, please see the quick setup guide on manufacturer's website (opens new window).

    # Requirements

    1. Bitcoin App installed on the Ledger
    2. Google Chrome or Firefox
    3. For Firefox, U2F needs to be enabled in about:config
    4. No other U2F devices plugged in into your PC (Yubikey, other wallets, etc)

    # Quick Setup

    1. Plug in Ledger Nano S into your PC.
    2. Open the Bitcoin app on your Ledger.
    3. In BTCPay Server, Store > Settings > Wallet > Setup > Derivation Scheme > Import from Hardware Device > Ledger wallet
    4. Select the account which you want to use, in most cases it's the Account 0
    5. Confirm the Export public key on the wallet.
    6. The extended public key will now automatically be added from Ledger to your BTCPay Server Store.
    7. Make sure that the derivation scheme is Enabled
    8. Click Continue
    9. Confirm the address match in BTCPay.

    Your Ledger wallet is now connected to your BTCPay. Payments go directly to Ledger.

    # Manual Setup

    If you have more than 20 accounts in your Ledger you might not be able to find the correct account because the select shows a maximum of 20 entries. In this case you can manually find the extended public key for your wanted account in these steps:

    1. Open the Ledger live app (opens new window)
    2. Accounts -> choose your account
    3. Edit Account on the top right via the tool-icon
    4. In Edit Account -> ADVANCED LOGS
    5. Copy the extended public key string
    6. Paste it manually into the "DerivationScheme" textfield
    7. Continue with Step 7 of the Quick Setup above
    Ledger Account "Advanced Logs" info screenshot

    # Spending from BTCPay Server wallet with Ledger

    Once there are some funds in received to your BTCPay Wallet connected to Ledger, you can spend them by signing a transaction with your hardware wallet. This allows easy interaction of the Ledger wallet with your full node, without leaking information to third-party servers.

    1. Plug in Ledger Nano S into your PC.
    2. Open the Bitcoin app on your Ledger.
    3. In BTCPay, go to Wallets > Manage > Send
    4. Fill in destination address and the amount
    5. Click on the Sign with your Ledger Wallet device.
    6. BTCPay will establish a connection with the Ledger wallet and display transaction information on the wallet screen.
    7. Confirm the transaction on the Ledger.
    8. In Ledger, click on the Ready To Sign
    9. Review your transactions and click Broadcast to broadcast it on the network.

    The video below shows how to connect your BTCPay store to your Ledger and how to use Ledger with the internal BTCPay wallet.

    - + diff --git a/LightningNetwork/index.html b/LightningNetwork/index.html index d5e039f131..7ad6711a1a 100644 --- a/LightningNetwork/index.html +++ b/LightningNetwork/index.html @@ -9,7 +9,7 @@ - + @@ -109,6 +109,6 @@

    - + diff --git a/LightningNetwork_PaymentChannels/index.html b/LightningNetwork_PaymentChannels/index.html index 69ea046e19..c710d3234d 100644 --- a/LightningNetwork_PaymentChannels/index.html +++ b/LightningNetwork_PaymentChannels/index.html @@ -9,7 +9,7 @@ - + @@ -58,6 +58,6 @@ GitHub (opens new window)

    # Opening and operating payment channels

    Given that the Lightning Network is a relatively new technology under active development, getting your freshly deployed node ready to send and receive payments, still, requires a couple of steps.

    Overview:

    1. The lightning node is deployed, enabled and its on-chain wallet is funded
    2. A peer is identified and the first payment channel is opened
    3. Inbound and outbound liquidity is acquired. The node is now able to send and receive
    4. Liquidity management, an ongoing process to maintain the capacity to send and receive

    Key considerations:

    • Choosing the channel partner. Consider opening the first channel to a well connected peer with robust uptime. This will increase the chances for your payments to be routed and settled.
    • Inbound vs outbound capacity. Outbound capacity allows nodes to send payments whereas inbound capacity allows nodes to receive payments. As a merchant using lightning, having inbound capacity is essential for customers to be able to pay you.
    • Inbound capacity. A node adds inbound capacity by either spending sats from its local balance or having other nodes in the network open channels to it.
    • Liquidity management: maintaining the ability to send and receive is a continous process where a balance between inbound vs outbound capacity has to be maintained across payment channels. This capacity distribution must be adjusted depending upon the use case of the node operator.
    • Lightning Service Providers: LSPs offer paid third-party services that improve the ease of operating a lightning network node. Such services can be used to acquire inbound capacity or to automate the rebalancing process.

    Below a set of good resources for a deeper dive into topics such as:

    - + diff --git a/Magento/index.html b/Magento/index.html index 847e918d8f..de62aea485 100644 --- a/Magento/index.html +++ b/Magento/index.html @@ -9,7 +9,7 @@ - + @@ -66,6 +66,6 @@ →

    - + diff --git a/NBXplorer/API/index.html b/NBXplorer/API/index.html index 461982d0bc..ef33bd18ba 100644 --- a/NBXplorer/API/index.html +++ b/NBXplorer/API/index.html @@ -9,7 +9,7 @@ - + @@ -670,6 +670,6 @@ →

    - + diff --git a/NBXplorer/Postgres-Migration/index.html b/NBXplorer/Postgres-Migration/index.html index ed6e4cd89e..52fd38fa26 100644 --- a/NBXplorer/Postgres-Migration/index.html +++ b/NBXplorer/Postgres-Migration/index.html @@ -9,7 +9,7 @@ - + @@ -66,6 +66,6 @@ →

    - + diff --git a/NBXplorer/Postgres-Schema/index.html b/NBXplorer/Postgres-Schema/index.html index fb2c7e8f0d..71b404d1b5 100644 --- a/NBXplorer/Postgres-Schema/index.html +++ b/NBXplorer/Postgres-Schema/index.html @@ -9,7 +9,7 @@ - + @@ -87,6 +87,6 @@ →

    - + diff --git a/NBXplorer/index.html b/NBXplorer/index.html index c62caa661d..24bf405b25 100644 --- a/NBXplorer/index.html +++ b/NBXplorer/index.html @@ -9,7 +9,7 @@ - + @@ -108,6 +108,6 @@ →

    - + diff --git a/Nostr/index.html b/Nostr/index.html index 050b02a5ea..6eb881be7d 100644 --- a/Nostr/index.html +++ b/Nostr/index.html @@ -9,7 +9,7 @@ - + @@ -67,6 +67,6 @@ →

    - + diff --git a/Notifications/index.html b/Notifications/index.html index 983c1867a1..4c36b6e2bf 100644 --- a/Notifications/index.html +++ b/Notifications/index.html @@ -9,7 +9,7 @@ - + @@ -66,6 +66,6 @@ {Invoice.Status} {Invoice.OrderId}

    Find the source here for possible updates (opens new window)

    Create new Email rule
    - + diff --git a/OpenCart/index.html b/OpenCart/index.html index a958a843d6..4450de58cb 100644 --- a/OpenCart/index.html +++ b/OpenCart/index.html @@ -9,7 +9,7 @@ - + @@ -88,6 +88,6 @@ →

    - + diff --git a/Payjoin/index.html b/Payjoin/index.html index 968104e956..5fe820ad62 100644 --- a/Payjoin/index.html +++ b/Payjoin/index.html @@ -9,7 +9,7 @@ - + @@ -59,6 +59,6 @@ GitHub (opens new window)

    # BTCPay Server Payjoin Guide

    This document explains how to use BTCPay Server's Payjoin feature. For a detailed, technical explanation of how payjoin is implemented, check BIP78 (opens new window)

    You can follow this video to better understand what payjoin is and how to use it.

    # Enabling Payjoin as a merchant

    1. Create a store
    2. Configure a hot wallet for your derivation scheme. Be sure to use either segwit or segwit wrapped as the address type.
    3. Enable Payjoin/P2EP in the "General Settings" and click "Save"

    It's important to note that you will need at least 1 UTXO for payjoin to work.

    Receive PayJoin in BTCPay Server
    Receive PayJoin in BTCPay Server
    Receive PayJoin in BTCPay Server

    # Paying to Payjoin as a user

    The BTCPay Wallet supports Payjoin.

    1. Retrieve the BIP21 payment link from a BTCPay Server invoice which has payjoin enabled by either:
      • Scan the QR code with the camera scanning feature
      • Copy the link from the "Open in wallet" button and paste it in the "Parse BIP21" prompt
    2. The send form should be populated with the payment details. You can check if the invoice supports payjoin by expanding "advanced settings" to see if there is a "Payjoin endpoint" input with a url.
    3. Sign your transaction using either BTCPay Server's hardware wallet support via BTCPay Vault or the hot wallet feature.
    4. Once your original transaction is ready, you will be given the option to either Broadcast (Payjoin) or to Broadcast (Simple). Choose Broadcast (Payjoin).
    5. The payjoin server will propose a new special transaction, if possible. If the payjoin server is unable to do the payjoin, the original transaction is broadcast instead.
    6. If you are using a hardware wallet, you will be asked to sign the payjoin transaction again (the hot wallet feature signs the transaction for you automatically).
    7. Congratulations, you've just helped improve Bitcoin's fungibility and your financial sovereignty!
    Receive PayJoin in BTCPay Server
    Receive PayJoin in BTCPay Server
    Receive PayJoin in BTCPay Server
    Receive PayJoin in BTCPay Server

    # Why did a payjoin not happen?

    There's multiple reasons for this:

    • The store did not have any utxos to contribute towards a payjoin
    • Your wallet does not use the same format as the store's (essential to not raise suspicion to analysis companies)
    • You are not using segwit or p2sh wrapped segwit.
    • The payjoin server is not available

    # Supported wallets

    Please contact and encourage your wallet developers to add support. The more widespread the usage of payjoin, the more broken the heuristics used by blockchain analysis companies become and can effectively trace your financial history. If you are a wallet developer, please contact us if you need help or have feedback.

    - + diff --git a/PaymentRequests/index.html b/PaymentRequests/index.html index 56263c9e95..1bee07a889 100644 --- a/PaymentRequests/index.html +++ b/PaymentRequests/index.html @@ -9,7 +9,7 @@ - + @@ -93,6 +93,6 @@ →

    - + diff --git a/Payouts/index.html b/Payouts/index.html index b421dd90c4..e6c636e7b3 100644 --- a/Payouts/index.html +++ b/Payouts/index.html @@ -9,7 +9,7 @@ - + @@ -81,6 +81,6 @@ →

    - + diff --git a/PodServer/index.html b/PodServer/index.html index 47b0a0104e..f73a04b5e0 100644 --- a/PodServer/index.html +++ b/PodServer/index.html @@ -9,7 +9,7 @@ - + @@ -68,6 +68,6 @@ →

    - + diff --git a/PrestaShop/index.html b/PrestaShop/index.html index 258ba752c5..7c224a037c 100644 --- a/PrestaShop/index.html +++ b/PrestaShop/index.html @@ -9,7 +9,7 @@ - + @@ -70,6 +70,6 @@ →

    - + diff --git a/PullPayments/index.html b/PullPayments/index.html index 083da0f04d..e24e6e5094 100644 --- a/PullPayments/index.html +++ b/PullPayments/index.html @@ -9,7 +9,7 @@ - + @@ -100,6 +100,6 @@ 6
  • Clicking on the notification brings the sender to a page listing all outstanding payouts 7
  • Check the payout to approve, pay and confirm 8
  • You are then brought to the normal wallet user interface of BTCPay Server
  • WARNING

    Clicking on Confirm selected payouts will use the current exchange rate of your wallet's store settings. The rate is then fixed, even if you don't complete the payment. Payments made at a later time will use this previously confirmed rate.

    # Additional use cases for the Pull Payments feature

    The Pull Payment feature can be used in multiple applications, the first one being Refunds.

    - + diff --git a/Refund/index.html b/Refund/index.html index 11629cf863..d917883bab 100644 --- a/Refund/index.html +++ b/Refund/index.html @@ -9,7 +9,7 @@ - + @@ -67,6 +67,6 @@ →

    - + diff --git a/RegisterAccount/index.html b/RegisterAccount/index.html index ee66ff5a06..1447d16ac1 100644 --- a/RegisterAccount/index.html +++ b/RegisterAccount/index.html @@ -9,7 +9,7 @@ - + @@ -66,6 +66,6 @@ →

    - + diff --git a/Reporting/index.html b/Reporting/index.html index 09b7d865e1..1260140498 100644 --- a/Reporting/index.html +++ b/Reporting/index.html @@ -9,7 +9,7 @@ - + @@ -68,6 +68,6 @@ (opens new window)

    - + diff --git a/Shopify/index.html b/Shopify/index.html index 4d8e292f0e..36f8b684b3 100644 --- a/Shopify/index.html +++ b/Shopify/index.html @@ -9,7 +9,7 @@ - + @@ -66,6 +66,6 @@ →

    - + diff --git a/Shopware/index.html b/Shopware/index.html index 501a532c3d..036c04612f 100644 --- a/Shopware/index.html +++ b/Shopware/index.html @@ -9,7 +9,7 @@ - + @@ -66,6 +66,6 @@ →

    - + diff --git a/Sign-PSBT-with-sparrow-wallet/index.html b/Sign-PSBT-with-sparrow-wallet/index.html index b203cefaf3..08304fe5da 100644 --- a/Sign-PSBT-with-sparrow-wallet/index.html +++ b/Sign-PSBT-with-sparrow-wallet/index.html @@ -9,7 +9,7 @@ - + @@ -58,6 +58,6 @@ GitHub (opens new window)

    # Creating a PSBT with BTCPay Server and Sparrow wallet

    This guide explains how you can create a partially signed bitcoin transaction (PSBT) on BTCPay Server and sign and broadcast it with Sparrow wallet (opens new window). We use BitBox02 (opens new window) hardware wallet in this example, but it will work with any other supported hardware wallet. This can be useful if you have an airgapped setup or persons creating the transaction and signing it are different people.

    # 1. Creating a transaction (on BTCPay Server):

    # On send screen:

    BTCPay: Create transaction on BTCPay Server

    # On choosing signing method screen:

    BTCPay: Choose signing method: Partially Signed Bitcoin Transaction

    # On PSBT screen:

    BTCPay: Download the PSBT file

    # 2. Signing and sending the PSBT (on Sparrow wallet)

    # On showing the imported PSBT transaction:

    Sparrow wallet: Load the PSBT file

    # Signing the transaction:

    Sparrow wallet: PSBT loaded, ready for signing

    # Connect Hardware wallet popup:

    Sparrow wallet: connect to hardware wallet (e.g. in our case BitBox02)

    # Wallet connected successfully:

    Sparrow wallet: hardware wallet successfully connected

    # Broadcasting the transaction:

    Sparrow wallet: broadcast the transaction

    TIP

    Alternatively, instead of broadcasting the transaction from Sparrow wallet (e.g. if you have an airgapped setup) you could also copy and paste the signed transaction PSBT from the textbox and upload it to your BTCPay Server and let it broadcast the transaction to the network.

    Congrats, done!

    - + diff --git a/Support/index.html b/Support/index.html index 03fd0194de..fb8a978f8b 100644 --- a/Support/index.html +++ b/Support/index.html @@ -9,7 +9,7 @@ - + @@ -68,6 +68,6 @@ →

    - + diff --git a/TicketTailor/index.html b/TicketTailor/index.html index 751a4c4da1..d6420f20cd 100644 --- a/TicketTailor/index.html +++ b/TicketTailor/index.html @@ -9,7 +9,7 @@ - + @@ -69,6 +69,6 @@ →

    - + diff --git a/Transmuter/DCA/index.html b/Transmuter/DCA/index.html index 5bced44db2..c0c66e2593 100644 --- a/Transmuter/DCA/index.html +++ b/Transmuter/DCA/index.html @@ -9,7 +9,7 @@ - + @@ -73,6 +73,6 @@ →

    - + diff --git a/Transmuter/EmailReceiptsPreset/index.html b/Transmuter/EmailReceiptsPreset/index.html index bc21591d35..38485b29b2 100644 --- a/Transmuter/EmailReceiptsPreset/index.html +++ b/Transmuter/EmailReceiptsPreset/index.html @@ -9,7 +9,7 @@ - + @@ -67,6 +67,6 @@ →

    - + diff --git a/Transmuter/index.html b/Transmuter/index.html index 1ed5d46aec..b776f4ebab 100644 --- a/Transmuter/index.html +++ b/Transmuter/index.html @@ -9,7 +9,7 @@ - + @@ -67,6 +67,6 @@ There must be a class implementing BtcTransmuterExtension in this library. This file bootstraps the plugin name and adds all the services to system on startup.

    # Adding a Trigger

    # Adding an Action

    # Adding an External Service

    - + diff --git a/Trocador/index.html b/Trocador/index.html index d15ac7eb69..dd2150cced 100644 --- a/Trocador/index.html +++ b/Trocador/index.html @@ -9,7 +9,7 @@ - + @@ -66,6 +66,6 @@ →

    - + diff --git a/Troubleshooting/index.html b/Troubleshooting/index.html index 2392a5642b..0d7fd5cf4e 100644 --- a/Troubleshooting/index.html +++ b/Troubleshooting/index.html @@ -9,7 +9,7 @@ - + @@ -98,6 +98,6 @@ →

    - + diff --git a/TryItOut/index.html b/TryItOut/index.html index 1da0baf60d..d9470c2be4 100644 --- a/TryItOut/index.html +++ b/TryItOut/index.html @@ -9,7 +9,7 @@ - + @@ -66,6 +66,6 @@ →

    - + diff --git a/UseCase/index.html b/UseCase/index.html index d7926eb5cd..6d7faec5c1 100644 --- a/UseCase/index.html +++ b/UseCase/index.html @@ -9,7 +9,7 @@ - + @@ -66,6 +66,6 @@ →

    - + diff --git a/Vault/HowToVerify/index.html b/Vault/HowToVerify/index.html index 136e95a10a..56b0e37d00 100644 --- a/Vault/HowToVerify/index.html +++ b/Vault/HowToVerify/index.html @@ -9,7 +9,7 @@ - + @@ -83,6 +83,6 @@ →

    - + diff --git a/VirtueMart/index.html b/VirtueMart/index.html index 618a6842e0..2bcd4d44b0 100644 --- a/VirtueMart/index.html +++ b/VirtueMart/index.html @@ -9,7 +9,7 @@ - + @@ -88,6 +88,6 @@ →

    - + diff --git a/Wabisabi/index.html b/Wabisabi/index.html index f6c50c481e..e59c1b6e47 100644 --- a/Wabisabi/index.html +++ b/Wabisabi/index.html @@ -9,7 +9,7 @@ - + @@ -88,6 +88,6 @@ →

    - + diff --git a/Walkthrough/index.html b/Walkthrough/index.html index 98584212c7..dabfa4a0b1 100644 --- a/Walkthrough/index.html +++ b/Walkthrough/index.html @@ -9,7 +9,7 @@ - + @@ -80,6 +80,6 @@ →

    - + diff --git a/Wallet/index.html b/Wallet/index.html index 47398f683f..16a2e1280b 100644 --- a/Wallet/index.html +++ b/Wallet/index.html @@ -9,7 +9,7 @@ - + @@ -61,6 +61,6 @@ PSBT is supported in BTCPay Server and can be signed with compatible hardware and software wallets.

    The construction of a fully signed Bitcoin transaction goes through the following steps:

    Tutorials:

    # Signing with a hardware wallet

    BTCPay Server has built-in hardware wallet support allowing you to use your hardware wallet with BTCPay, without leaking information to third-party apps or servers.

    Check instructions on how to set up and sign with a compatible hardware wallet (opens new window).

    # Signing with a hot wallet

    If you created a new wallet when setting up your store and enabled it as a hot wallet, since version 1.2.0, we've added an option that when a hot wallet is created, it'll automatically use the seed stored on a server to sign.

    DANGER

    Using the hot wallet feature comes with security implications; please be sure to read and understand them over at the Hot Wallet documentation

    # Advanced Settings

    Certain wallet features are available for advanced users. Toggle the Advanced Settings within the Send tab to preview them.

    # Don't create UTXO change

    This option is available in the Advanced mode of the Send page.

    It is a privacy enhancing feature which is useful when you're sending funds to another wallet of yours or to an exchange. It makes sure that no change UTXO is created by rounding up the amount sent.

    By default this feature is disabled, so if your wallet has a UTXO of 1.1 BTC and you input an amount equal to 1.0 BTC, the resulting transaction will have two outputs 0.1 BTC of change, and 1.0 BTC to your destination.

    Blockchain analysis will understand that those 0.1 BTC of change belong to the same entity which controlled 1.1 BTC before, and can track the future purchase you make under the same pattern.

    By enabling this feature, BTCPay Server wallet will round up the amount sent to 1.1 BTC such that no change output is sent back to you.

    Warning: Despite the fact, in this example, that you entered 1.0 in the amount field, the amount that will really be sent to your destination will be 1.1 BTC.

    # RBF (Replace-By-Fee)

    Replace-By-Fee (RBF) is a Bitcoin protocol feature that allows you to replace a previously broadcast transaction (while unconfirmed). This allows randomizing your wallet's transaction fingerprint, or simply for replacing it with a higher fee rate to move the transaction higher in the queue of confirmation (mining) priority. This will effectively replace the original transaction as the higher fee rate will be prioritized and once confirmed, invalidating the original one (double spend).

    Press the Advanced Settings button to view the RBF options:

    RBF Options
    # Coin Selection

    Coin selection is an advanced privacy-enhancing feature that allows you to specifically select coins that you would like to spend when crafting a transaction. For example, paying with coins that are fresh from a coinjoin mix.

    To make the selection easier, coin-selection works natively with the wallet labels feature. This allows you to label any incoming funds for smoother UTXO management and spending.

    Coin Selection
    # Other features
    # Camera QR scan

    Scan option in wallet (camera icon in send screen) lets you use your device’s camera to scan a QR code containing an address or BIP21 payment link. It auto-populates the sending information so that you don’t have to manually copy-paste an address and amount.

    QR Scan
    # Paste BIP21 address

    This option decodes a BIP21 payment link. It's useful when you're trying to pay a Payjoin invoice.

    # Receive

    The Receive tab generates an unused address which can be used to receive payments. The same can be achieved by generating an invoice (Invoices > Create new invoice).

    Wallet Receive

    # Pull Payments

    This feature gives you the ability to create a Pull Payment, so that an outside individual may request to pull funds from your wallet.

    For more information, see Pull Payments.

    # Payouts

    This section lets you manage Pull Payments and gives you the ability to accept or decline payouts requested by outside individuals.

    For more information, see Payouts.

    # Re-scan

    The Rescan relies on Bitcoin Core 0.17.0's scantxoutset to scan the current state of the blockchain (called UTXO Set) for coins belonging to the configured derivation scheme.

    Wallet Rescan

    Wallet re-scan solves two critical problems for BTCPay users:

    1. Gap limit
    2. Importing a previously used wallet

    Gap limit: Most wallets typically have the address gap limit set to 20. This means that if a merchant receives 21 or more consecutive unpaid invoices, those wallets show the incorrect balance and some transactions may not be visible.

    Wallet import: When users add a derivation scheme of a wallet that had transactions in the past (previously used wallet), BTCPay won't be able to show the balance and transactions from the past.

    Wallet rescan progress

    Re-scan is a feature that solves both of these problems. Once the scan is complete, BTCPay Server will show the correct balance, along with the past transactions of the wallet.

    Wallet re-scan requires access to the full node which means that this function is only available for server owners.

    Users who use a third-party host should use a newly generated xpub key and also use an external wallet like Electrum which allows them to increase the gap limit.

    # Settings

    In the top right corner of your wallet you will find the wallet settings. In the wallet settings tab you can adjust certain settings. If you've configured your wallet by creating a new wallet or using an existing wallet via the hardware wallet integration these settings will be pre-configured.

    If you manually added the extended public key from an external wallet, you'd need to adjust AccountKeyPath that you can find in your external wallet, for example m/84'/0'/0' to be able to spend from the BTCPay Wallet.

    In wallet settings you will also find the speed policy for the specific store. There are 2 main settings under Payment, Payment invalid if transaction fails to confirm in ... after invoice creation and Consider the invoice confirmed when the payment transaction.... The latter lets you set the number of confirmations required to be recognized as settled.

    Wallet settings
    - + diff --git a/WalletSetup/index.html b/WalletSetup/index.html index 69f75e9479..11cae183b6 100644 --- a/WalletSetup/index.html +++ b/WalletSetup/index.html @@ -9,7 +9,7 @@ - + @@ -58,6 +58,6 @@ GitHub (opens new window)

    # (3) Wallet Setup

    After account registration and store creation, it's time to configure a wallet in your BTCPay Server, so that you can start receiving payments into it.

    There are two ways to set up a wallet in BTCPay Server:

    There are many options on how set up a wallet with your BTCPay Server. It's up to you to decide what works best for your use-case. Once you configure a wallet, you're all set. The next step, is to start exploring the features.

    Proceed to the next step - What's Next?.

    - + diff --git a/WasabiWallet/index.html b/WasabiWallet/index.html index 4b9246e5d2..77453eef6e 100644 --- a/WasabiWallet/index.html +++ b/WasabiWallet/index.html @@ -9,7 +9,7 @@ - + @@ -67,6 +67,6 @@ After the loading is done and the wallet is opened, click on the 3 dots at the top right corner to go to Wallet Info .

    Wasabi Find Wallet Info

    Select and copy the Extended Account Public Key. This is the public key from which BTCPay will derive addresses. This cannot be used to derive private keys and spend the bitcoin.

    Wasabi Extended Account Public Key

    # Setup store wallet

    1. Assuming you created a store and are now in the Dashboard. Click on Set up a wallet
    Connect Wasabi Wallet to BTCPay Server
    1. As you did the above steps in wasabi, Click Connect an existing wallet
    Connect Wasabi Wallet to BTCPay Server
    1. Choose Enter extended public key
    Connect Wasabi Wallet to BTCPay Server
    1. Paste the Extended Account Public Key into derivation scheme field as it is, without adding anything else and click Continue
    Connect Wasabi Wallet to BTCPay Server
    1. Return to the Wasabi Wallet. Click the Receive button and generate a new address.
    Wasabi Receive
    1. Compare the address you see in Wasabi Wallet to addresses shown in BTCPay Server. Find a match, continue.
    Connect Wasabi Wallet to BTCPay Server
    1. When you found a match, your wallet is now connected to the store.
    Connect Wasabi Wallet to BTCPay Server

    # Connecting Wasabi to BTCPay Server Full Node (If you're self-hosting BTCPay)

    After the wallets are connected, it is highly recommended to connect Wasabi Wallet to your full node in BTCPay. The process is easy but can only be done if you self-host BTCPay and are logged in as Admin. Tor has to be enabled in BTCPay (it is enabled by default). This process enhances privacy even further.

    In BTCPay, go Server Settings > Services > Full node P2P > See Information. On the BTCP-P2P page, click on the Show Confidential QR Code. Bellow the QR Code, there's a link See QR Code information by clicking here, so click on the link to reveal your string. Copy the string but remove bitcoin-p2p:// part.

    In Wasabi, go to the Bitcoin tab at Settings and paste the endpoint in Bitcoin P2P Endpoint.

    Restart Wasabi to apply the changes.

    # Configuring the Gap Limit in Wasabi

    At the search bar on top, click on Wallet Folder. Shortly the json file will be shown in a sub-folder. Open that file with a text editor like notepad. Find the line "MinGapLimit": 21, and change it to "MinGapLimit": 100, and save the file.

    There's no good answer to how much you should set the gap limit to. Most merchants set 100-200. If you're a big merchant with high transaction volume, you can try with even a higher gap limit.

    For more details about the Gap Limit, check the FAQ.

    Wasabi Wallet and BTCPay Server are now connected. Any payments received to your BTCPay will be visible in Wasabi, where you can further spend or mix them.

    - + diff --git a/WhatsNext/index.html b/WhatsNext/index.html index 98d4f1c025..c227773d62 100644 --- a/WhatsNext/index.html +++ b/WhatsNext/index.html @@ -9,7 +9,7 @@ - + @@ -66,6 +66,6 @@ →

    - + diff --git a/WooCommerce/index.html b/WooCommerce/index.html index 1af175a9b5..9ced7cb1b0 100644 --- a/WooCommerce/index.html +++ b/WooCommerce/index.html @@ -9,7 +9,7 @@ - + @@ -116,6 +116,6 @@ →

    - + diff --git a/Zapier/index.html b/Zapier/index.html index d8db2acb83..bd6d77889f 100644 --- a/Zapier/index.html +++ b/Zapier/index.html @@ -9,7 +9,7 @@ - + @@ -77,6 +77,6 @@ →

    - + diff --git a/assets/js/101.20fed8a8.js b/assets/js/101.67d3cf0f.js similarity index 98% rename from assets/js/101.20fed8a8.js rename to assets/js/101.67d3cf0f.js index 7104f74ca0..57c4726463 100644 --- a/assets/js/101.20fed8a8.js +++ b/assets/js/101.67d3cf0f.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[101],{716:function(e,t,r){"use strict";r.r(t);var o=r(10),a=Object(o.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"coding-btcpay-server"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#coding-btcpay-server"}},[e._v("#")]),e._v(" Coding BTCPay Server")]),e._v(" "),t("p"),t("div",{staticClass:"table-of-contents"},[t("ul",[t("li",[t("a",{attrs:{href:"#why-coding-matters"}},[e._v("Why coding matters")])]),t("li",[t("a",{attrs:{href:"#where-to-start"}},[e._v("Where to start")]),t("ul",[t("li",[t("a",{attrs:{href:"#setup-developer-environment"}},[e._v("Setup Developer Environment")])]),t("li",[t("a",{attrs:{href:"#local-btcpay-development"}},[e._v("Local BTCPay Development")])]),t("li",[t("a",{attrs:{href:"#local-btcpay-testing"}},[e._v("Local BTCPay Testing")])])])]),t("li",[t("a",{attrs:{href:"#requirements"}},[e._v("Requirements")])]),t("li",[t("a",{attrs:{href:"#videos"}},[e._v("Videos")])])])]),t("p"),e._v(" "),t("h2",{attrs:{id:"why-coding-matters"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#why-coding-matters"}},[e._v("#")]),e._v(" Why coding matters")]),e._v(" "),t("p",[e._v("By helping the project grow, become more mature, advanced and elaborate, coders working on BTCPay Server are a central component of the project.")]),e._v(" "),t("p",[e._v("If you have coding skills, be it writing or reviewing code, you can contribute to BTCPay Server.")]),e._v(" "),t("h2",{attrs:{id:"where-to-start"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#where-to-start"}},[e._v("#")]),e._v(" Where to start")]),e._v(" "),t("p",[e._v("If you're a developer looking to help, but you're not sure where to begin, check the "),t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver/issues?q=is%3Aissue+is%3Aopen+label%3A%22good+first+issue%22",target:"_blank",rel:"noopener noreferrer"}},[e._v("good first issue label"),t("OutboundLink")],1),e._v(", which contains small pieces of work that have been specifically flagged as being friendly to new contributors.")]),e._v(" "),t("p",[e._v("Contributors looking to do something a bit more challenging, before opening a pull request, please "),t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver/issues/new/choose",target:"_blank",rel:"noopener noreferrer"}},[e._v("create an issue"),t("OutboundLink")],1),e._v(" or join "),t("a",{attrs:{href:"https://chat.btcpayserver.org/",target:"_blank",rel:"noopener noreferrer"}},[e._v("our community chat"),t("OutboundLink")],1),e._v(" to get early feedback, discuss best ways to tackle the problem and to ensure there is no work duplication.")]),e._v(" "),t("p",[e._v("We are actively looking for developers who can take on and resolve GitHub issues and help with development. If you would like to help us, but need some guidance, the "),t("a",{attrs:{href:"https://chat.btcpayserver.org/btcpayserver/channels/dev",target:"_blank",rel:"noopener noreferrer"}},[e._v("#dev channel on Mattermost"),t("OutboundLink")],1),e._v(" is the place to ask questions.")]),e._v(" "),t("h3",{attrs:{id:"setup-developer-environment"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#setup-developer-environment"}},[e._v("#")]),e._v(" Setup Developer Environment")]),e._v(" "),t("p",[e._v("If you are interested in getting started as a developer or tester of the software behind BTCPay Server, check out the "),t("RouterLink",{attrs:{to:"/Contribute/DevCode/"}},[e._v("Setup Developer Environment")]),e._v(" guide that will walk you step by step through every software used in development with BTCPay such as Git, GitBash, Github, Docker, Visual Studio, Postgres, etc. If you have never coded before and you are looking to learn something new, start here.")],1),e._v(" "),t("h3",{attrs:{id:"local-btcpay-development"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#local-btcpay-development"}},[e._v("#")]),e._v(" Local BTCPay Development")]),e._v(" "),t("p",[e._v("If you already have a developer environment setup you can start with the BTCPay specific "),t("RouterLink",{attrs:{to:"/Development/LocalDevelopment/"}},[e._v("Local Development")]),e._v(" documentation.")],1),e._v(" "),t("h3",{attrs:{id:"local-btcpay-testing"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#local-btcpay-testing"}},[e._v("#")]),e._v(" Local BTCPay Testing")]),e._v(" "),t("p",[e._v("Once you have your development environment tools setup and your local BTCPay Server running, view the "),t("RouterLink",{attrs:{to:"/Contribute/DevTest/"}},[e._v("Local Testing")]),e._v(" guide. This shows you how to use BTCPay in regtest mode for use in development and for users who want to test new features before they are released.")],1),e._v(" "),t("h2",{attrs:{id:"requirements"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#requirements"}},[e._v("#")]),e._v(" Requirements")]),e._v(" "),t("p",[e._v("Software requirements (ie. IDE) can also be found in "),t("RouterLink",{attrs:{to:"/Development/LocalDevelopment/#which-ide"}},[e._v("local development")]),e._v(".")],1),e._v(" "),t("h2",{attrs:{id:"videos"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#videos"}},[e._v("#")]),e._v(" Videos")]),e._v(" "),t("p",[e._v("BTCPay Server development videos can be found "),t("RouterLink",{attrs:{to:"/Development/LocalDevelopment/#videos"}},[e._v("here")]),e._v(" or on the "),t("a",{attrs:{href:"https://www.youtube.com/channel/UCpG9WL6TJuoNfFVkaDMp9ug",target:"_blank",rel:"noopener noreferrer"}},[e._v("BTCPayServer YouTube"),t("OutboundLink")],1),e._v(" channel.")],1)])}),[],!1,null,null,null);t.default=a.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[101],{714:function(e,t,r){"use strict";r.r(t);var o=r(10),a=Object(o.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"coding-btcpay-server"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#coding-btcpay-server"}},[e._v("#")]),e._v(" Coding BTCPay Server")]),e._v(" "),t("p"),t("div",{staticClass:"table-of-contents"},[t("ul",[t("li",[t("a",{attrs:{href:"#why-coding-matters"}},[e._v("Why coding matters")])]),t("li",[t("a",{attrs:{href:"#where-to-start"}},[e._v("Where to start")]),t("ul",[t("li",[t("a",{attrs:{href:"#setup-developer-environment"}},[e._v("Setup Developer Environment")])]),t("li",[t("a",{attrs:{href:"#local-btcpay-development"}},[e._v("Local BTCPay Development")])]),t("li",[t("a",{attrs:{href:"#local-btcpay-testing"}},[e._v("Local BTCPay Testing")])])])]),t("li",[t("a",{attrs:{href:"#requirements"}},[e._v("Requirements")])]),t("li",[t("a",{attrs:{href:"#videos"}},[e._v("Videos")])])])]),t("p"),e._v(" "),t("h2",{attrs:{id:"why-coding-matters"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#why-coding-matters"}},[e._v("#")]),e._v(" Why coding matters")]),e._v(" "),t("p",[e._v("By helping the project grow, become more mature, advanced and elaborate, coders working on BTCPay Server are a central component of the project.")]),e._v(" "),t("p",[e._v("If you have coding skills, be it writing or reviewing code, you can contribute to BTCPay Server.")]),e._v(" "),t("h2",{attrs:{id:"where-to-start"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#where-to-start"}},[e._v("#")]),e._v(" Where to start")]),e._v(" "),t("p",[e._v("If you're a developer looking to help, but you're not sure where to begin, check the "),t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver/issues?q=is%3Aissue+is%3Aopen+label%3A%22good+first+issue%22",target:"_blank",rel:"noopener noreferrer"}},[e._v("good first issue label"),t("OutboundLink")],1),e._v(", which contains small pieces of work that have been specifically flagged as being friendly to new contributors.")]),e._v(" "),t("p",[e._v("Contributors looking to do something a bit more challenging, before opening a pull request, please "),t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver/issues/new/choose",target:"_blank",rel:"noopener noreferrer"}},[e._v("create an issue"),t("OutboundLink")],1),e._v(" or join "),t("a",{attrs:{href:"https://chat.btcpayserver.org/",target:"_blank",rel:"noopener noreferrer"}},[e._v("our community chat"),t("OutboundLink")],1),e._v(" to get early feedback, discuss best ways to tackle the problem and to ensure there is no work duplication.")]),e._v(" "),t("p",[e._v("We are actively looking for developers who can take on and resolve GitHub issues and help with development. If you would like to help us, but need some guidance, the "),t("a",{attrs:{href:"https://chat.btcpayserver.org/btcpayserver/channels/dev",target:"_blank",rel:"noopener noreferrer"}},[e._v("#dev channel on Mattermost"),t("OutboundLink")],1),e._v(" is the place to ask questions.")]),e._v(" "),t("h3",{attrs:{id:"setup-developer-environment"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#setup-developer-environment"}},[e._v("#")]),e._v(" Setup Developer Environment")]),e._v(" "),t("p",[e._v("If you are interested in getting started as a developer or tester of the software behind BTCPay Server, check out the "),t("RouterLink",{attrs:{to:"/Contribute/DevCode/"}},[e._v("Setup Developer Environment")]),e._v(" guide that will walk you step by step through every software used in development with BTCPay such as Git, GitBash, Github, Docker, Visual Studio, Postgres, etc. If you have never coded before and you are looking to learn something new, start here.")],1),e._v(" "),t("h3",{attrs:{id:"local-btcpay-development"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#local-btcpay-development"}},[e._v("#")]),e._v(" Local BTCPay Development")]),e._v(" "),t("p",[e._v("If you already have a developer environment setup you can start with the BTCPay specific "),t("RouterLink",{attrs:{to:"/Development/LocalDevelopment/"}},[e._v("Local Development")]),e._v(" documentation.")],1),e._v(" "),t("h3",{attrs:{id:"local-btcpay-testing"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#local-btcpay-testing"}},[e._v("#")]),e._v(" Local BTCPay Testing")]),e._v(" "),t("p",[e._v("Once you have your development environment tools setup and your local BTCPay Server running, view the "),t("RouterLink",{attrs:{to:"/Contribute/DevTest/"}},[e._v("Local Testing")]),e._v(" guide. This shows you how to use BTCPay in regtest mode for use in development and for users who want to test new features before they are released.")],1),e._v(" "),t("h2",{attrs:{id:"requirements"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#requirements"}},[e._v("#")]),e._v(" Requirements")]),e._v(" "),t("p",[e._v("Software requirements (ie. IDE) can also be found in "),t("RouterLink",{attrs:{to:"/Development/LocalDevelopment/#which-ide"}},[e._v("local development")]),e._v(".")],1),e._v(" "),t("h2",{attrs:{id:"videos"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#videos"}},[e._v("#")]),e._v(" Videos")]),e._v(" "),t("p",[e._v("BTCPay Server development videos can be found "),t("RouterLink",{attrs:{to:"/Development/LocalDevelopment/#videos"}},[e._v("here")]),e._v(" or on the "),t("a",{attrs:{href:"https://www.youtube.com/channel/UCpG9WL6TJuoNfFVkaDMp9ug",target:"_blank",rel:"noopener noreferrer"}},[e._v("BTCPayServer YouTube"),t("OutboundLink")],1),e._v(" channel.")],1)])}),[],!1,null,null,null);t.default=a.exports}}]); \ No newline at end of file diff --git a/assets/js/103.6850b884.js b/assets/js/103.b148a455.js similarity index 96% rename from assets/js/103.6850b884.js rename to assets/js/103.b148a455.js index e509cec241..8712d5191a 100644 --- a/assets/js/103.6850b884.js +++ b/assets/js/103.b148a455.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[103],{719:function(t,e,o){"use strict";o.r(e);var r=o(10),n=Object(r.a)({},(function(){var t=this,e=t._self._c;return e("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[e("h1",{attrs:{id:"how-to-contribute-to-btcpay-server"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#how-to-contribute-to-btcpay-server"}},[t._v("#")]),t._v(" How to contribute to BTCPay Server?")]),t._v(" "),e("p",[t._v("BTCPay Server is built and maintained entirely by volunteer contributors around the internet.")]),t._v(" "),e("p",[t._v("We welcome, appreciate and encourage new contributions.")]),t._v(" "),e("p",[t._v("Depending on your skills and interest, you can help in a number of ways:")]),t._v(" "),e("ul",[e("li",[e("RouterLink",{attrs:{to:"/Contribute/Dev/"}},[t._v("Software")]),t._v(" "),e("ul",[e("li",[e("RouterLink",{attrs:{to:"/Contribute/DevCode/"}},[t._v("Development")])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/Contribute/DevTest/"}},[t._v("Testing")])],1)])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/Contribute/Write/"}},[t._v("Writing")]),t._v(" "),e("ul",[e("li",[e("RouterLink",{attrs:{to:"/Contribute/WriteSoftware/"}},[t._v("Tools")])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/Contribute/WriteDocs/"}},[t._v("Documentation")])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/Contribute/WriteBlog/"}},[t._v("Blog")])],1)])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/Contribute/Design/"}},[t._v("Designing")])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/Contribute/Translate/"}},[t._v("Translating")])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/Contribute/Misc/"}},[t._v("Miscellaneous")])],1)]),t._v(" "),e("p",[t._v("Every contribution is important and if you have any questions, feel free to consult our growing "),e("RouterLink",{attrs:{to:"/Community/"}},[t._v("community")]),t._v(".")],1)])}),[],!1,null,null,null);e.default=n.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[103],{718:function(t,e,o){"use strict";o.r(e);var r=o(10),n=Object(r.a)({},(function(){var t=this,e=t._self._c;return e("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[e("h1",{attrs:{id:"how-to-contribute-to-btcpay-server"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#how-to-contribute-to-btcpay-server"}},[t._v("#")]),t._v(" How to contribute to BTCPay Server?")]),t._v(" "),e("p",[t._v("BTCPay Server is built and maintained entirely by volunteer contributors around the internet.")]),t._v(" "),e("p",[t._v("We welcome, appreciate and encourage new contributions.")]),t._v(" "),e("p",[t._v("Depending on your skills and interest, you can help in a number of ways:")]),t._v(" "),e("ul",[e("li",[e("RouterLink",{attrs:{to:"/Contribute/Dev/"}},[t._v("Software")]),t._v(" "),e("ul",[e("li",[e("RouterLink",{attrs:{to:"/Contribute/DevCode/"}},[t._v("Development")])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/Contribute/DevTest/"}},[t._v("Testing")])],1)])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/Contribute/Write/"}},[t._v("Writing")]),t._v(" "),e("ul",[e("li",[e("RouterLink",{attrs:{to:"/Contribute/WriteSoftware/"}},[t._v("Tools")])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/Contribute/WriteDocs/"}},[t._v("Documentation")])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/Contribute/WriteBlog/"}},[t._v("Blog")])],1)])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/Contribute/Design/"}},[t._v("Designing")])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/Contribute/Translate/"}},[t._v("Translating")])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/Contribute/Misc/"}},[t._v("Miscellaneous")])],1)]),t._v(" "),e("p",[t._v("Every contribution is important and if you have any questions, feel free to consult our growing "),e("RouterLink",{attrs:{to:"/Community/"}},[t._v("community")]),t._v(".")],1)])}),[],!1,null,null,null);e.default=n.exports}}]); \ No newline at end of file diff --git a/assets/js/104.1dd824be.js b/assets/js/104.832c56dd.js similarity index 99% rename from assets/js/104.1dd824be.js rename to assets/js/104.832c56dd.js index e21946609b..df546fa24f 100644 --- a/assets/js/104.1dd824be.js +++ b/assets/js/104.832c56dd.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[104],{720:function(t,e,r){"use strict";r.r(e);var o=r(10),a=Object(o.a)({},(function(){var t=this,e=t._self._c;return e("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[e("h1",{attrs:{id:"documenting-btcpay-server"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#documenting-btcpay-server"}},[t._v("#")]),t._v(" Documenting BTCPay Server")]),t._v(" "),e("p"),e("div",{staticClass:"table-of-contents"},[e("ul",[e("li",[e("a",{attrs:{href:"#why-documentation-matters"}},[t._v("Why documentation matters")])]),e("li",[e("a",{attrs:{href:"#btcpay-documentation"}},[t._v("BTCPay Documentation")])]),e("li",[e("a",{attrs:{href:"#btcpay-blog"}},[t._v("BTCPay Blog")])]),e("li",[e("a",{attrs:{href:"#requirements"}},[t._v("Requirements")])]),e("li",[e("a",{attrs:{href:"#recommended-software"}},[t._v("Recommended software")]),e("ul",[e("li",[e("a",{attrs:{href:"#text-editor"}},[t._v("Text Editor")])]),e("li",[e("a",{attrs:{href:"#version-control"}},[t._v("Version Control")])])])])])]),e("p"),t._v(" "),e("h2",{attrs:{id:"why-documentation-matters"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#why-documentation-matters"}},[t._v("#")]),t._v(" Why documentation matters")]),t._v(" "),e("p",[t._v("Documentation is essential to give users of all skill levels concise and clear information about the software and how to use it. BTCPay server has many different use cases and as a result many different kinds of users seeking information from the documentation. Writers contributing to BTCPay Server are as important as any other contributor.")]),t._v(" "),e("p",[t._v("If you have technical knowledge in a certain area, want to help document new features or simply get involved in the BTCPay Server project, documentation is a great place to get started with contributing.")]),t._v(" "),e("p",[t._v("If you have writing skills or if you have a fair knowledge of the English language, then you can contribute to BTCPay Server or review the work of other contributors. Writing contributors can help in a number of places.")]),t._v(" "),e("h2",{attrs:{id:"btcpay-documentation"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#btcpay-documentation"}},[t._v("#")]),t._v(" BTCPay Documentation")]),t._v(" "),e("p",[t._v("Documentation work needing to be completed can be found in the "),e("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver-doc/issues",target:"_blank",rel:"noopener noreferrer"}},[t._v("open issues page"),e("OutboundLink")],1),t._v(" on Github. For information on how to start a documentation task, see the "),e("RouterLink",{attrs:{to:"/Contribute/WriteDocs/"}},[t._v("documentation guide")]),t._v(".")],1),t._v(" "),e("p",[t._v("For documentation guidance or discussion of a new documentation idea, join the "),e("a",{attrs:{href:"https://chat.btcpayserver.org/btcpayserver/channels/documentation",target:"_blank",rel:"noopener noreferrer"}},[t._v("#documentation channel on Mattermost"),e("OutboundLink")],1),t._v(".")]),t._v(" "),e("h2",{attrs:{id:"btcpay-blog"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#btcpay-blog"}},[t._v("#")]),t._v(" BTCPay Blog")]),t._v(" "),e("p",[t._v("Another great way to contribute is by writing content for the "),e("RouterLink",{attrs:{to:"/Contribute/WriteBlog/"}},[t._v("BTCPay blog")]),t._v(". To get started on a blog topic, join the "),e("a",{attrs:{href:"https://chat.btcpayserver.org/btcpayserver/channels/content-creation",target:"_blank",rel:"noopener noreferrer"}},[t._v("#content creation channel on Mattermost"),e("OutboundLink")],1),t._v(".")],1),t._v(" "),e("h2",{attrs:{id:"requirements"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#requirements"}},[t._v("#")]),t._v(" Requirements")]),t._v(" "),e("p",[t._v("In order to contribute to BTCPay Server as a writer there are some requirements.")]),t._v(" "),e("p",[t._v("Since most of the documentation done in BTCPay Server is submitted and reviewed through Github, you must have a "),e("a",{attrs:{href:"https://github.com/",target:"_blank",rel:"noopener noreferrer"}},[t._v("Github account"),e("OutboundLink")],1),t._v(". It's also on Github that you can contribute by reviewing the documentation work done by others (pull requests).")]),t._v(" "),e("p",[e("strong",[t._v("Important note")]),t._v(": Contributions explained in this documentation are meant to be done in "),e("strong",[t._v("English")]),t._v(" only. If you wish to contribute in other languages, see "),e("RouterLink",{attrs:{to:"/Contribute/Translate/"}},[t._v("Translations")]),t._v(".")],1),t._v(" "),e("h2",{attrs:{id:"recommended-software"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#recommended-software"}},[t._v("#")]),t._v(" Recommended software")]),t._v(" "),e("h3",{attrs:{id:"text-editor"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#text-editor"}},[t._v("#")]),t._v(" Text Editor")]),t._v(" "),e("p",[t._v("It is recommended to have a Rich-Text editor.")]),t._v(" "),e("p",[e("a",{attrs:{href:"https://notepad-plus-plus.org/downloads/",target:"_blank",rel:"noopener noreferrer"}},[t._v("Notepad++"),e("OutboundLink")],1),t._v(" is a decent software and easy to use for the newer contributors.")]),t._v(" "),e("p",[t._v("For more advanced users, "),e("a",{attrs:{href:"https://visualstudio.microsoft.com/",target:"_blank",rel:"noopener noreferrer"}},[t._v("Visual Studio Code (VS Code)"),e("OutboundLink")],1),t._v(" is a good choice.\nThe "),e("code",[t._v("Markdown All In One")]),t._v(" extension in VS Code is also recommended, for visual comfort while editing and the ability to preview Markdown changes. This is helpful for the BTCPay documentation which is written primarily in Markdown.")]),t._v(" "),e("p",[t._v("These are only recommended: If you already use other similar software that you're accustomed to, you are free to continue using them.")]),t._v(" "),e("h3",{attrs:{id:"version-control"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#version-control"}},[t._v("#")]),t._v(" Version Control")]),t._v(" "),e("p",[t._v("To be able to manage your contributions (such as forking repositories, creating and working on branches, making pull requests and issues, etc.) it's recommended you have "),e("a",{attrs:{href:"https://desktop.github.com/",target:"_blank",rel:"noopener noreferrer"}},[t._v("Github Desktop"),e("OutboundLink")],1),t._v(". You can see the step by step guide to making a pull request using Github Desktop "),e("RouterLink",{attrs:{to:"/Contribute/WriteSoftware/"}},[t._v("here")]),t._v(".")],1)])}),[],!1,null,null,null);e.default=a.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[104],{721:function(t,e,r){"use strict";r.r(e);var o=r(10),a=Object(o.a)({},(function(){var t=this,e=t._self._c;return e("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[e("h1",{attrs:{id:"documenting-btcpay-server"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#documenting-btcpay-server"}},[t._v("#")]),t._v(" Documenting BTCPay Server")]),t._v(" "),e("p"),e("div",{staticClass:"table-of-contents"},[e("ul",[e("li",[e("a",{attrs:{href:"#why-documentation-matters"}},[t._v("Why documentation matters")])]),e("li",[e("a",{attrs:{href:"#btcpay-documentation"}},[t._v("BTCPay Documentation")])]),e("li",[e("a",{attrs:{href:"#btcpay-blog"}},[t._v("BTCPay Blog")])]),e("li",[e("a",{attrs:{href:"#requirements"}},[t._v("Requirements")])]),e("li",[e("a",{attrs:{href:"#recommended-software"}},[t._v("Recommended software")]),e("ul",[e("li",[e("a",{attrs:{href:"#text-editor"}},[t._v("Text Editor")])]),e("li",[e("a",{attrs:{href:"#version-control"}},[t._v("Version Control")])])])])])]),e("p"),t._v(" "),e("h2",{attrs:{id:"why-documentation-matters"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#why-documentation-matters"}},[t._v("#")]),t._v(" Why documentation matters")]),t._v(" "),e("p",[t._v("Documentation is essential to give users of all skill levels concise and clear information about the software and how to use it. BTCPay server has many different use cases and as a result many different kinds of users seeking information from the documentation. Writers contributing to BTCPay Server are as important as any other contributor.")]),t._v(" "),e("p",[t._v("If you have technical knowledge in a certain area, want to help document new features or simply get involved in the BTCPay Server project, documentation is a great place to get started with contributing.")]),t._v(" "),e("p",[t._v("If you have writing skills or if you have a fair knowledge of the English language, then you can contribute to BTCPay Server or review the work of other contributors. Writing contributors can help in a number of places.")]),t._v(" "),e("h2",{attrs:{id:"btcpay-documentation"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#btcpay-documentation"}},[t._v("#")]),t._v(" BTCPay Documentation")]),t._v(" "),e("p",[t._v("Documentation work needing to be completed can be found in the "),e("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver-doc/issues",target:"_blank",rel:"noopener noreferrer"}},[t._v("open issues page"),e("OutboundLink")],1),t._v(" on Github. For information on how to start a documentation task, see the "),e("RouterLink",{attrs:{to:"/Contribute/WriteDocs/"}},[t._v("documentation guide")]),t._v(".")],1),t._v(" "),e("p",[t._v("For documentation guidance or discussion of a new documentation idea, join the "),e("a",{attrs:{href:"https://chat.btcpayserver.org/btcpayserver/channels/documentation",target:"_blank",rel:"noopener noreferrer"}},[t._v("#documentation channel on Mattermost"),e("OutboundLink")],1),t._v(".")]),t._v(" "),e("h2",{attrs:{id:"btcpay-blog"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#btcpay-blog"}},[t._v("#")]),t._v(" BTCPay Blog")]),t._v(" "),e("p",[t._v("Another great way to contribute is by writing content for the "),e("RouterLink",{attrs:{to:"/Contribute/WriteBlog/"}},[t._v("BTCPay blog")]),t._v(". To get started on a blog topic, join the "),e("a",{attrs:{href:"https://chat.btcpayserver.org/btcpayserver/channels/content-creation",target:"_blank",rel:"noopener noreferrer"}},[t._v("#content creation channel on Mattermost"),e("OutboundLink")],1),t._v(".")],1),t._v(" "),e("h2",{attrs:{id:"requirements"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#requirements"}},[t._v("#")]),t._v(" Requirements")]),t._v(" "),e("p",[t._v("In order to contribute to BTCPay Server as a writer there are some requirements.")]),t._v(" "),e("p",[t._v("Since most of the documentation done in BTCPay Server is submitted and reviewed through Github, you must have a "),e("a",{attrs:{href:"https://github.com/",target:"_blank",rel:"noopener noreferrer"}},[t._v("Github account"),e("OutboundLink")],1),t._v(". It's also on Github that you can contribute by reviewing the documentation work done by others (pull requests).")]),t._v(" "),e("p",[e("strong",[t._v("Important note")]),t._v(": Contributions explained in this documentation are meant to be done in "),e("strong",[t._v("English")]),t._v(" only. If you wish to contribute in other languages, see "),e("RouterLink",{attrs:{to:"/Contribute/Translate/"}},[t._v("Translations")]),t._v(".")],1),t._v(" "),e("h2",{attrs:{id:"recommended-software"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#recommended-software"}},[t._v("#")]),t._v(" Recommended software")]),t._v(" "),e("h3",{attrs:{id:"text-editor"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#text-editor"}},[t._v("#")]),t._v(" Text Editor")]),t._v(" "),e("p",[t._v("It is recommended to have a Rich-Text editor.")]),t._v(" "),e("p",[e("a",{attrs:{href:"https://notepad-plus-plus.org/downloads/",target:"_blank",rel:"noopener noreferrer"}},[t._v("Notepad++"),e("OutboundLink")],1),t._v(" is a decent software and easy to use for the newer contributors.")]),t._v(" "),e("p",[t._v("For more advanced users, "),e("a",{attrs:{href:"https://visualstudio.microsoft.com/",target:"_blank",rel:"noopener noreferrer"}},[t._v("Visual Studio Code (VS Code)"),e("OutboundLink")],1),t._v(" is a good choice.\nThe "),e("code",[t._v("Markdown All In One")]),t._v(" extension in VS Code is also recommended, for visual comfort while editing and the ability to preview Markdown changes. This is helpful for the BTCPay documentation which is written primarily in Markdown.")]),t._v(" "),e("p",[t._v("These are only recommended: If you already use other similar software that you're accustomed to, you are free to continue using them.")]),t._v(" "),e("h3",{attrs:{id:"version-control"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#version-control"}},[t._v("#")]),t._v(" Version Control")]),t._v(" "),e("p",[t._v("To be able to manage your contributions (such as forking repositories, creating and working on branches, making pull requests and issues, etc.) it's recommended you have "),e("a",{attrs:{href:"https://desktop.github.com/",target:"_blank",rel:"noopener noreferrer"}},[t._v("Github Desktop"),e("OutboundLink")],1),t._v(". You can see the step by step guide to making a pull request using Github Desktop "),e("RouterLink",{attrs:{to:"/Contribute/WriteSoftware/"}},[t._v("here")]),t._v(".")],1)])}),[],!1,null,null,null);e.default=a.exports}}]); \ No newline at end of file diff --git a/assets/js/105.c5c11dc4.js b/assets/js/105.096be630.js similarity index 95% rename from assets/js/105.c5c11dc4.js rename to assets/js/105.096be630.js index 2b3ceddead..9bda81915a 100644 --- a/assets/js/105.c5c11dc4.js +++ b/assets/js/105.096be630.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[105],{721:function(t,e,r){"use strict";r.r(e);var o=r(10),n=Object(o.a)({},(function(){var t=this,e=t._self._c;return e("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[e("h1",{attrs:{id:"contribute-to-the-blog"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#contribute-to-the-blog"}},[t._v("#")]),t._v(" Contribute to the blog")]),t._v(" "),e("p",[t._v("For the time being, the blog is hosted on Wordpress and the contributing process doesn't require Github.")]),t._v(" "),e("p",[t._v("Simply hit us in the "),e("a",{attrs:{href:"https://chat.btcpayserver.org",target:"_blank",rel:"noopener noreferrer"}},[t._v("chat"),e("OutboundLink")],1),t._v(" and we'll discuss the writing proposed.")]),t._v(" "),e("p",[t._v("Subjects that are suitable for the blog include:")]),t._v(" "),e("ul",[e("li",[t._v("BTCPay Server updates")]),t._v(" "),e("li",[t._v("Tutorials")]),t._v(" "),e("li",[t._v("Testimonies of how BTCPay Server helped you")])]),t._v(" "),e("p",[t._v("Writing articles on our "),e("a",{attrs:{href:"https://blog.btcpayserver.org",target:"_blank",rel:"noopener noreferrer"}},[t._v("Blog"),e("OutboundLink")],1),t._v(" helps spread the word on new features being implemented, or provides tutorials on how to use them.")])])}),[],!1,null,null,null);e.default=n.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[105],{720:function(t,e,r){"use strict";r.r(e);var o=r(10),n=Object(o.a)({},(function(){var t=this,e=t._self._c;return e("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[e("h1",{attrs:{id:"contribute-to-the-blog"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#contribute-to-the-blog"}},[t._v("#")]),t._v(" Contribute to the blog")]),t._v(" "),e("p",[t._v("For the time being, the blog is hosted on Wordpress and the contributing process doesn't require Github.")]),t._v(" "),e("p",[t._v("Simply hit us in the "),e("a",{attrs:{href:"https://chat.btcpayserver.org",target:"_blank",rel:"noopener noreferrer"}},[t._v("chat"),e("OutboundLink")],1),t._v(" and we'll discuss the writing proposed.")]),t._v(" "),e("p",[t._v("Subjects that are suitable for the blog include:")]),t._v(" "),e("ul",[e("li",[t._v("BTCPay Server updates")]),t._v(" "),e("li",[t._v("Tutorials")]),t._v(" "),e("li",[t._v("Testimonies of how BTCPay Server helped you")])]),t._v(" "),e("p",[t._v("Writing articles on our "),e("a",{attrs:{href:"https://blog.btcpayserver.org",target:"_blank",rel:"noopener noreferrer"}},[t._v("Blog"),e("OutboundLink")],1),t._v(" helps spread the word on new features being implemented, or provides tutorials on how to use them.")])])}),[],!1,null,null,null);e.default=n.exports}}]); \ No newline at end of file diff --git a/assets/js/108.04f3519b.js b/assets/js/108.841cf621.js similarity index 96% rename from assets/js/108.04f3519b.js rename to assets/js/108.841cf621.js index 0432bc4341..c5600926ae 100644 --- a/assets/js/108.04f3519b.js +++ b/assets/js/108.841cf621.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[108],{735:function(e,t,r){"use strict";r.r(t);var o=r(10),a=Object(o.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"hardware-deployment"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#hardware-deployment"}},[e._v("#")]),e._v(" Hardware Deployment")]),e._v(" "),t("p",[e._v("Hardware deployment is advised when you want to be in total control of your own infrastructure.")]),e._v(" "),t("p",[e._v("Those are very useful for personal use or for people who wants absolute control over their infrastructure.")]),e._v(" "),t("p",[e._v("The main downside of hardware deployment is that it requires some hardware investment, and higher learning curve. The availability of your server will also probably lower than using a VPS such as LunaNode, as you are more likely to suffer from internet down time or hardware failure.")]),e._v(" "),t("p",[e._v("If you are still not sure whether you need hardware deployment, please "),t("RouterLink",{attrs:{to:"/Deployment/"}},[e._v("see our diagram")]),e._v(".")],1),e._v(" "),t("p",[e._v("While all hardware deployments are similar to one another, we document step by step the process on three different hardware settings.")]),e._v(" "),t("ul",[t("li",[t("RouterLink",{attrs:{to:"/Deployment/RaspberryPi4/"}},[e._v("Raspberry Pi 4")])],1),e._v(" "),t("li",[t("RouterLink",{attrs:{to:"/Deployment/Hack0/"}},[e._v("Hack0")]),e._v(" (based on Armbian and RockPro64)")],1),e._v(" "),t("li",[t("RouterLink",{attrs:{to:"/Deployment/LightningInABox/"}},[e._v("LightningInABox")]),e._v(" (based on Ubuntu and Gigabyte Brix GB-BXBT-1900)")],1)]),e._v(" "),t("p",[e._v("You can easily adapt those documentation on the custom hardware you prefer, we support arm32, arm64 and amd64.")]),e._v(" "),t("p",[e._v("Note that those solutions are all based on our docker deployment system.")])])}),[],!1,null,null,null);t.default=a.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[108],{734:function(e,t,r){"use strict";r.r(t);var o=r(10),a=Object(o.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"hardware-deployment"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#hardware-deployment"}},[e._v("#")]),e._v(" Hardware Deployment")]),e._v(" "),t("p",[e._v("Hardware deployment is advised when you want to be in total control of your own infrastructure.")]),e._v(" "),t("p",[e._v("Those are very useful for personal use or for people who wants absolute control over their infrastructure.")]),e._v(" "),t("p",[e._v("The main downside of hardware deployment is that it requires some hardware investment, and higher learning curve. The availability of your server will also probably lower than using a VPS such as LunaNode, as you are more likely to suffer from internet down time or hardware failure.")]),e._v(" "),t("p",[e._v("If you are still not sure whether you need hardware deployment, please "),t("RouterLink",{attrs:{to:"/Deployment/"}},[e._v("see our diagram")]),e._v(".")],1),e._v(" "),t("p",[e._v("While all hardware deployments are similar to one another, we document step by step the process on three different hardware settings.")]),e._v(" "),t("ul",[t("li",[t("RouterLink",{attrs:{to:"/Deployment/RaspberryPi4/"}},[e._v("Raspberry Pi 4")])],1),e._v(" "),t("li",[t("RouterLink",{attrs:{to:"/Deployment/Hack0/"}},[e._v("Hack0")]),e._v(" (based on Armbian and RockPro64)")],1),e._v(" "),t("li",[t("RouterLink",{attrs:{to:"/Deployment/LightningInABox/"}},[e._v("LightningInABox")]),e._v(" (based on Ubuntu and Gigabyte Brix GB-BXBT-1900)")],1)]),e._v(" "),t("p",[e._v("You can easily adapt those documentation on the custom hardware you prefer, we support arm32, arm64 and amd64.")]),e._v(" "),t("p",[e._v("Note that those solutions are all based on our docker deployment system.")])])}),[],!1,null,null,null);t.default=a.exports}}]); \ No newline at end of file diff --git a/assets/js/110.538c8108.js b/assets/js/110.f22bca3a.js similarity index 99% rename from assets/js/110.538c8108.js rename to assets/js/110.f22bca3a.js index 1cbb15d0ae..76a95f2c7a 100644 --- a/assets/js/110.538c8108.js +++ b/assets/js/110.f22bca3a.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[110],{739:function(e,o,t){"use strict";t.r(o);var r=t(10),n=Object(r.a)({},(function(){var e=this,o=e._self._c;return o("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[o("h1",{attrs:{id:"hardware-deployment"}},[o("a",{staticClass:"header-anchor",attrs:{href:"#hardware-deployment"}},[e._v("#")]),e._v(" Hardware Deployment")]),e._v(" "),o("p",[e._v('Andreas Antonopoulos tells us "Not your keys, not your Bitcoin".\nHere\'s another Bitcoin axiom "Your hardware. Your node. Your keys. Your Bitcoin".')]),e._v(" "),o("p",[e._v("In order for your Bitcoin experience to be truly self-sovereign and trustless you should consider "),o("strong",[e._v("running nodes on your own hardware")]),e._v(" and internet connection.\n"),o("strong",[e._v("BTCPay Server is an excellent way to run both Bitcoin & Lightning nodes")]),e._v(".\nNot only are you validating transactions you also get the ability to accept base layer Bitcoin and second layer Lightning payments.\nTo that end here are instructions to install and host your very own BTCPay Server.")]),e._v(" "),o("p",[e._v("The process is basically the following:")]),e._v(" "),o("ol",[o("li",[e._v("Purchase and assemble hardware.")]),e._v(" "),o("li",[e._v("Install base Operating System and configure networking.")]),e._v(" "),o("li",[e._v("Install BTCPayServer-Docker.")])]),e._v(" "),o("p",[e._v("While it may be possible to "),o("strong",[e._v("install BTCPayServer or parts of it's architecture on ARM based single board computers")]),e._v(" (ie. Raspberry Pi, Odroid, OrangePi or NanoPC) the process may require additional skills and knowledge that are beyond the scope of this tutorial.\nFor the sake of speed, compatibility and ease of installation it is recommended that you use an Intel/AMD based computer with a minimum of 4 GB RAM and a 500 GB hard drive. The Gigabyte Brix or Intel NUC lines of compact computers are a great place to start. They are basically small, fanless boxes that are built using laptop components.")]),e._v(" "),o("p",[o("strong",[e._v("BTCPayServer can be successfully installed on the following hardware")]),e._v('. The end result is a small, quiet node that is fast enough to sync from block zero. The total cost is approximately $225 (including tax and delivery). These are "off the shelf" components that can be purchased from any online retailer (TigerDirect, NewEgg, Amazon, BestBuy etc). It will take roughly 24 hours to sync the Bitcoin blockchain. You can save little money by cutting the RAM and hard drive size in half.')]),e._v(" "),o("ol",[o("li",[e._v("Gigabyte Brix GB-BXBT-1900\n"),o("img",{attrs:{src:"https://i1.wp.com/lightninginabox.co/wp-content/uploads/2018/08/20150603180458_m.png?resize=300%2C254&ssl=1",alt:"Gigabyte Brix GB-BXBT-1900",title:"Gigabyte Brix GB-BXBT-1900"}})]),e._v(" "),o("li",[e._v("Crucial 8GB DDR3L-1600 SODIMM\n"),o("img",{attrs:{src:"https://i0.wp.com/lightninginabox.co/wp-content/uploads/2018/08/204-pinsodimmddr3.png?resize=300%2C133&ssl=1",alt:"Crucial 8GB DDR3L-1600",title:"Crucial 8GB DDR3L-1600"}})]),e._v(" "),o("li",[e._v("WD Blue 1TB Mobile Hard Disk Drive\n"),o("img",{attrs:{src:"https://i1.wp.com/lightninginabox.co/wp-content/uploads/2018/08/81qCyd2gDL._SL1500_.jpg?resize=300%2C300&ssl=1",alt:"WD Blue 1 TB HDD",title:"WD Blue 1 TB HDD"}})])]),e._v(" "),o("p",[e._v("Other requirements are as follows:")]),e._v(" "),o("ol",[o("li",[e._v("High speed internet connection.")]),e._v(" "),o("li",[e._v("Static IP")]),e._v(" "),o("li",[e._v("Domain Name")]),e._v(" "),o("li",[e._v("Ability to open ports (80, 443, 9735) on your router.")]),e._v(" "),o("li",[e._v("Tiny Screwdriver")]),e._v(" "),o("li",[e._v("USB Thumb Drive")]),e._v(" "),o("li",[e._v("USB Keyboard, Mouse and Monitor (for initial install only). Can be headless when completed.")]),e._v(" "),o("li",[e._v("Four Port USB Hub")])]),e._v(" "),o("p",[e._v("Assuming you purchased the hardware mentioned above, here are the build instructions.")]),e._v(" "),o("p",[o("strong",[e._v("Step 1")]),e._v(' - Configure your domain name.\nIt can take several hours for DNS changes to propagate so you should do this step first.\nLogin to your domain registrar and point an A record from your domain to the external IP address of your internet connection.\nI suggest that you use a subdomain (ie. btcpay.yourdomain.com).\nTo find your external IP address Google "whats my ip".')]),e._v(" "),o("p",[o("strong",[e._v("Step 2")]),e._v(" - Assemble your BTCPayBox (BTCPB). If you already have your own Ubuntu Server you can skip to Step 6.")]),e._v(" "),o("ul",[o("li",[e._v("Remove back cover with screwdriver.")]),e._v(" "),o("li",[e._v("Insert RAM")]),e._v(" "),o("li",[e._v("Install hard drive using included cage.")])]),e._v(" "),o("p",[o("strong",[e._v("Step 3")]),e._v(" - Download "),o("a",{attrs:{href:"https://releases.ubuntu.com/18.04/",target:"_blank",rel:"noopener noreferrer"}},[e._v("Ubuntu 18.04 Desktop Image"),o("OutboundLink")],1)]),e._v(" "),o("p",[o("strong",[e._v("Step 4")]),e._v(" - Download and install "),o("a",{attrs:{href:"https://etcher.io/",target:"_blank",rel:"noopener noreferrer"}},[e._v("Etcher"),o("OutboundLink")],1),e._v(". Etcher is software that is used to flash OS images to SD cards and USB Drives.\nIn this case we will be using Etcher to flash our USB Thumb Drive with the Ubuntu OS.")]),e._v(" "),o("p",[o("strong",[e._v("Step 5")]),e._v(" - Connect your USB keyboard, mouse, monitor and thumb drive. Press the power button to boot your BTCPB using the thumb drive. The Ubuntu installation process is pretty simple and easy to follow. Here's a tutorial from the Ubuntu website. "),o("a",{attrs:{href:"https://tutorials.ubuntu.com/tutorial/tutorial-install-ubuntu-desktop#0",target:"_blank",rel:"noopener noreferrer"}},[e._v("Install Ubuntu Desktop"),o("OutboundLink")],1),e._v(". The GB-BXBT-1900 with BIOS version F9 (and earlier) will need to be configured for compatibility with Ubuntu 18.04, due in part to Intel's cstates. Refer to this "),o("a",{attrs:{href:"https://gist.github.com/plembo/4d52f7c71739a54f1a023814bbb87e00",target:"_blank",rel:"noopener noreferrer"}},[e._v("BXBT-1900 Setup Guide"),o("OutboundLink")],1),e._v(" for help.")]),e._v(" "),o("p",[o("strong",[e._v("Step 6")]),e._v(" - Give your BTCPB a static IP address on your local network. There are a few different ways to do this and you will find a ton of articles online. Here's a pretty simple one to follow "),o("a",{attrs:{href:"https://linuxconfig.org/how-to-configure-static-ip-address-on-ubuntu-18-04-bionic-beaver-linux",target:"_blank",rel:"noopener noreferrer"}},[e._v("How to configure a static IP address on Ubuntu 18.04"),o("OutboundLink")],1),e._v('. To avoid conflicts with other devices on your network you should also set a "reservation" for your BTCPB.')]),e._v(" "),o("p",[o("strong",[e._v("Step 7")]),e._v(' - Log into your router and forward ports 80, 443 and 9735 to your BTPCB\'s local IP address. Every router is different and you should be able to find instructions for your router by searching for "Port Forward + your router make and model".')]),e._v(" "),o("p",[o("strong",[e._v("Step 8")]),e._v(" - Install OpenSSH Server, Fail2ban and GIT. OpenSSH server allows you to connect to your server using SSH clients (ie. "),o("a",{attrs:{href:"https://www.putty.org/",target:"_blank",rel:"noopener noreferrer"}},[e._v("Putty"),o("OutboundLink")],1),e._v(") Fail2ban bans IP's that attempt to connect to your server and show malicious signs. GIT allows you to clone and manage repositories on github.com.\nOpen a new terminal window and type the following commands:")]),e._v(" "),o("ul",[o("li",[o("code",[e._v("sudo apt update")])]),e._v(" "),o("li",[o("code",[e._v("sudo apt install -y openssh-server fail2ban git")])])]),e._v(" "),o("p",[o("strong",[e._v("Step 9")]),e._v(" - Install Uncomplicated Firewall (UFW) and allow only specific ports. UFW is a user-friendly front-end for managing iptables firewall rules and its main goal is to make managing iptables easier or as the name says uncomplicated.\nInstall UFW")]),e._v(" "),o("ul",[o("li",[o("code",[e._v("sudo apt install ufw")])])]),e._v(" "),o("p",[e._v("This command allows SSH connections from your LAN only. Replace 192.168.1.0 with your own subnet.")]),e._v(" "),o("ul",[o("li",[o("code",[e._v("sudo ufw allow from 192.168.1.0/24 to any port 22")])])]),e._v(" "),o("p",[e._v("These ports need to be accessible from anywhere. The default subnet is 'any' unless you specify one.")]),e._v(" "),o("ul",[o("li",[o("code",[e._v("sudo ufw allow 80, 443, 9735")])])]),e._v(" "),o("p",[e._v("Verify your configuration.")]),e._v(" "),o("ul",[o("li",[o("code",[e._v("sudo ufw status")])])]),e._v(" "),o("p",[e._v("Enable your firewall.")]),e._v(" "),o("ul",[o("li",[o("code",[e._v("sudo ufw enable")])])]),e._v(" "),o("p",[e._v("Reboot your BTCB and disconnect the keyboard, mouse and monitor. You should now be able to connect to your BTCB from another computer on your LAN via SSH.")]),e._v(" "),o("p",[o("strong",[e._v("Step 10")]),e._v(" - Install BTCPayServer.\nFrom another PC on your network login in to your BTCPB via SSH.")]),e._v(" "),o("p",[e._v("If you are using Windows")]),e._v(" "),o("ul",[o("li",[e._v("download "),o("a",{attrs:{href:"https://releases.ubuntu.com/18.04/",target:"_blank",rel:"noopener noreferrer"}},[e._v("Putty"),o("OutboundLink")],1),e._v(" and create a connection to your BTCPB.")])]),e._v(" "),o("p",[e._v("If you are using another Linux machine open a new terminal and type in the following.\nYou will be prompted for your password.")]),e._v(" "),o("ul",[o("li",[o("code",[e._v("ssh user@LANIP")]),e._v(" (ie. bob@192.168.1.2)")])]),e._v(" "),o("p",[e._v("Run the following commands.\nMake sure you change the "),o("code",[e._v("BTCPAY_HOST")]),e._v(" parameter to your own domain name.")]),e._v(" "),o("p",[e._v("Login as root")]),e._v(" "),o("ul",[o("li",[o("code",[e._v("sudo su -")])])]),e._v(" "),o("p",[e._v("Create a folder for BTCPay")]),e._v(" "),o("ul",[o("li",[o("code",[e._v("mkdir BTCPayServer")])]),e._v(" "),o("li",[o("code",[e._v("cd BTCPayServer")])])]),e._v(" "),o("p",[e._v("Clone the btcpayserver-docker repository")]),e._v(" "),o("ul",[o("li",[o("code",[e._v("git clone https://github.com/btcpayserver/btcpayserver-docker")])]),e._v(" "),o("li",[o("code",[e._v("cd btcpayserver-docker")])])]),e._v(" "),o("p",[e._v("Set your environment variables.\nRun each command separately.")]),e._v(" "),o("ul",[o("li",[o("code",[e._v('export BTCPAY_HOST="btcpay.YourDomain.com"')])]),e._v(" "),o("li",[o("code",[e._v('export NBITCOIN_NETWORK="mainnet"')])]),e._v(" "),o("li",[o("code",[e._v('export BTCPAYGEN_CRYPTO1="btc"')])]),e._v(" "),o("li",[o("code",[e._v('export BTCPAYGEN_CRYPTO2="ltc"')])]),e._v(" "),o("li",[o("code",[e._v('export BTCPAYGEN_REVERSEPROXY="nginx"')])]),e._v(" "),o("li",[o("code",[e._v('export BTCPAYGEN_LIGHTNING="clightning"')])])]),e._v(" "),o("p",[e._v("The last step is to launch the BTCPayServer setup script.")]),e._v(" "),o("ul",[o("li",[o("code",[e._v(". ./btcpay-setup.sh -i")])]),e._v(" "),o("li",[o("code",[e._v("exit")])])]),e._v(" "),o("p",[o("strong",[e._v("Step 11")]),e._v("\nGo to https://btcpay.yourdomain.com and confirm that your nodes are syncing.\nEnjoy!")]),e._v(" "),o("p",[e._v("If you don't have the time or patience to build your own BTCPB there are a few merchants who can build one for you.")]),e._v(" "),o("ul",[o("li",[o("a",{attrs:{href:"https://lightninginabox.co",target:"_blank",rel:"noopener noreferrer"}},[e._v("Lightning in a Box"),o("OutboundLink")],1)]),e._v(" "),o("li",[o("a",{attrs:{href:"https://nodl.it",target:"_blank",rel:"noopener noreferrer"}},[e._v("Nodl.it"),o("OutboundLink")],1)])])])}),[],!1,null,null,null);o.default=n.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[110],{738:function(e,o,t){"use strict";t.r(o);var r=t(10),n=Object(r.a)({},(function(){var e=this,o=e._self._c;return o("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[o("h1",{attrs:{id:"hardware-deployment"}},[o("a",{staticClass:"header-anchor",attrs:{href:"#hardware-deployment"}},[e._v("#")]),e._v(" Hardware Deployment")]),e._v(" "),o("p",[e._v('Andreas Antonopoulos tells us "Not your keys, not your Bitcoin".\nHere\'s another Bitcoin axiom "Your hardware. Your node. Your keys. Your Bitcoin".')]),e._v(" "),o("p",[e._v("In order for your Bitcoin experience to be truly self-sovereign and trustless you should consider "),o("strong",[e._v("running nodes on your own hardware")]),e._v(" and internet connection.\n"),o("strong",[e._v("BTCPay Server is an excellent way to run both Bitcoin & Lightning nodes")]),e._v(".\nNot only are you validating transactions you also get the ability to accept base layer Bitcoin and second layer Lightning payments.\nTo that end here are instructions to install and host your very own BTCPay Server.")]),e._v(" "),o("p",[e._v("The process is basically the following:")]),e._v(" "),o("ol",[o("li",[e._v("Purchase and assemble hardware.")]),e._v(" "),o("li",[e._v("Install base Operating System and configure networking.")]),e._v(" "),o("li",[e._v("Install BTCPayServer-Docker.")])]),e._v(" "),o("p",[e._v("While it may be possible to "),o("strong",[e._v("install BTCPayServer or parts of it's architecture on ARM based single board computers")]),e._v(" (ie. Raspberry Pi, Odroid, OrangePi or NanoPC) the process may require additional skills and knowledge that are beyond the scope of this tutorial.\nFor the sake of speed, compatibility and ease of installation it is recommended that you use an Intel/AMD based computer with a minimum of 4 GB RAM and a 500 GB hard drive. The Gigabyte Brix or Intel NUC lines of compact computers are a great place to start. They are basically small, fanless boxes that are built using laptop components.")]),e._v(" "),o("p",[o("strong",[e._v("BTCPayServer can be successfully installed on the following hardware")]),e._v('. The end result is a small, quiet node that is fast enough to sync from block zero. The total cost is approximately $225 (including tax and delivery). These are "off the shelf" components that can be purchased from any online retailer (TigerDirect, NewEgg, Amazon, BestBuy etc). It will take roughly 24 hours to sync the Bitcoin blockchain. You can save little money by cutting the RAM and hard drive size in half.')]),e._v(" "),o("ol",[o("li",[e._v("Gigabyte Brix GB-BXBT-1900\n"),o("img",{attrs:{src:"https://i1.wp.com/lightninginabox.co/wp-content/uploads/2018/08/20150603180458_m.png?resize=300%2C254&ssl=1",alt:"Gigabyte Brix GB-BXBT-1900",title:"Gigabyte Brix GB-BXBT-1900"}})]),e._v(" "),o("li",[e._v("Crucial 8GB DDR3L-1600 SODIMM\n"),o("img",{attrs:{src:"https://i0.wp.com/lightninginabox.co/wp-content/uploads/2018/08/204-pinsodimmddr3.png?resize=300%2C133&ssl=1",alt:"Crucial 8GB DDR3L-1600",title:"Crucial 8GB DDR3L-1600"}})]),e._v(" "),o("li",[e._v("WD Blue 1TB Mobile Hard Disk Drive\n"),o("img",{attrs:{src:"https://i1.wp.com/lightninginabox.co/wp-content/uploads/2018/08/81qCyd2gDL._SL1500_.jpg?resize=300%2C300&ssl=1",alt:"WD Blue 1 TB HDD",title:"WD Blue 1 TB HDD"}})])]),e._v(" "),o("p",[e._v("Other requirements are as follows:")]),e._v(" "),o("ol",[o("li",[e._v("High speed internet connection.")]),e._v(" "),o("li",[e._v("Static IP")]),e._v(" "),o("li",[e._v("Domain Name")]),e._v(" "),o("li",[e._v("Ability to open ports (80, 443, 9735) on your router.")]),e._v(" "),o("li",[e._v("Tiny Screwdriver")]),e._v(" "),o("li",[e._v("USB Thumb Drive")]),e._v(" "),o("li",[e._v("USB Keyboard, Mouse and Monitor (for initial install only). Can be headless when completed.")]),e._v(" "),o("li",[e._v("Four Port USB Hub")])]),e._v(" "),o("p",[e._v("Assuming you purchased the hardware mentioned above, here are the build instructions.")]),e._v(" "),o("p",[o("strong",[e._v("Step 1")]),e._v(' - Configure your domain name.\nIt can take several hours for DNS changes to propagate so you should do this step first.\nLogin to your domain registrar and point an A record from your domain to the external IP address of your internet connection.\nI suggest that you use a subdomain (ie. btcpay.yourdomain.com).\nTo find your external IP address Google "whats my ip".')]),e._v(" "),o("p",[o("strong",[e._v("Step 2")]),e._v(" - Assemble your BTCPayBox (BTCPB). If you already have your own Ubuntu Server you can skip to Step 6.")]),e._v(" "),o("ul",[o("li",[e._v("Remove back cover with screwdriver.")]),e._v(" "),o("li",[e._v("Insert RAM")]),e._v(" "),o("li",[e._v("Install hard drive using included cage.")])]),e._v(" "),o("p",[o("strong",[e._v("Step 3")]),e._v(" - Download "),o("a",{attrs:{href:"https://releases.ubuntu.com/18.04/",target:"_blank",rel:"noopener noreferrer"}},[e._v("Ubuntu 18.04 Desktop Image"),o("OutboundLink")],1)]),e._v(" "),o("p",[o("strong",[e._v("Step 4")]),e._v(" - Download and install "),o("a",{attrs:{href:"https://etcher.io/",target:"_blank",rel:"noopener noreferrer"}},[e._v("Etcher"),o("OutboundLink")],1),e._v(". Etcher is software that is used to flash OS images to SD cards and USB Drives.\nIn this case we will be using Etcher to flash our USB Thumb Drive with the Ubuntu OS.")]),e._v(" "),o("p",[o("strong",[e._v("Step 5")]),e._v(" - Connect your USB keyboard, mouse, monitor and thumb drive. Press the power button to boot your BTCPB using the thumb drive. The Ubuntu installation process is pretty simple and easy to follow. Here's a tutorial from the Ubuntu website. "),o("a",{attrs:{href:"https://tutorials.ubuntu.com/tutorial/tutorial-install-ubuntu-desktop#0",target:"_blank",rel:"noopener noreferrer"}},[e._v("Install Ubuntu Desktop"),o("OutboundLink")],1),e._v(". The GB-BXBT-1900 with BIOS version F9 (and earlier) will need to be configured for compatibility with Ubuntu 18.04, due in part to Intel's cstates. Refer to this "),o("a",{attrs:{href:"https://gist.github.com/plembo/4d52f7c71739a54f1a023814bbb87e00",target:"_blank",rel:"noopener noreferrer"}},[e._v("BXBT-1900 Setup Guide"),o("OutboundLink")],1),e._v(" for help.")]),e._v(" "),o("p",[o("strong",[e._v("Step 6")]),e._v(" - Give your BTCPB a static IP address on your local network. There are a few different ways to do this and you will find a ton of articles online. Here's a pretty simple one to follow "),o("a",{attrs:{href:"https://linuxconfig.org/how-to-configure-static-ip-address-on-ubuntu-18-04-bionic-beaver-linux",target:"_blank",rel:"noopener noreferrer"}},[e._v("How to configure a static IP address on Ubuntu 18.04"),o("OutboundLink")],1),e._v('. To avoid conflicts with other devices on your network you should also set a "reservation" for your BTCPB.')]),e._v(" "),o("p",[o("strong",[e._v("Step 7")]),e._v(' - Log into your router and forward ports 80, 443 and 9735 to your BTPCB\'s local IP address. Every router is different and you should be able to find instructions for your router by searching for "Port Forward + your router make and model".')]),e._v(" "),o("p",[o("strong",[e._v("Step 8")]),e._v(" - Install OpenSSH Server, Fail2ban and GIT. OpenSSH server allows you to connect to your server using SSH clients (ie. "),o("a",{attrs:{href:"https://www.putty.org/",target:"_blank",rel:"noopener noreferrer"}},[e._v("Putty"),o("OutboundLink")],1),e._v(") Fail2ban bans IP's that attempt to connect to your server and show malicious signs. GIT allows you to clone and manage repositories on github.com.\nOpen a new terminal window and type the following commands:")]),e._v(" "),o("ul",[o("li",[o("code",[e._v("sudo apt update")])]),e._v(" "),o("li",[o("code",[e._v("sudo apt install -y openssh-server fail2ban git")])])]),e._v(" "),o("p",[o("strong",[e._v("Step 9")]),e._v(" - Install Uncomplicated Firewall (UFW) and allow only specific ports. UFW is a user-friendly front-end for managing iptables firewall rules and its main goal is to make managing iptables easier or as the name says uncomplicated.\nInstall UFW")]),e._v(" "),o("ul",[o("li",[o("code",[e._v("sudo apt install ufw")])])]),e._v(" "),o("p",[e._v("This command allows SSH connections from your LAN only. Replace 192.168.1.0 with your own subnet.")]),e._v(" "),o("ul",[o("li",[o("code",[e._v("sudo ufw allow from 192.168.1.0/24 to any port 22")])])]),e._v(" "),o("p",[e._v("These ports need to be accessible from anywhere. The default subnet is 'any' unless you specify one.")]),e._v(" "),o("ul",[o("li",[o("code",[e._v("sudo ufw allow 80, 443, 9735")])])]),e._v(" "),o("p",[e._v("Verify your configuration.")]),e._v(" "),o("ul",[o("li",[o("code",[e._v("sudo ufw status")])])]),e._v(" "),o("p",[e._v("Enable your firewall.")]),e._v(" "),o("ul",[o("li",[o("code",[e._v("sudo ufw enable")])])]),e._v(" "),o("p",[e._v("Reboot your BTCB and disconnect the keyboard, mouse and monitor. You should now be able to connect to your BTCB from another computer on your LAN via SSH.")]),e._v(" "),o("p",[o("strong",[e._v("Step 10")]),e._v(" - Install BTCPayServer.\nFrom another PC on your network login in to your BTCPB via SSH.")]),e._v(" "),o("p",[e._v("If you are using Windows")]),e._v(" "),o("ul",[o("li",[e._v("download "),o("a",{attrs:{href:"https://releases.ubuntu.com/18.04/",target:"_blank",rel:"noopener noreferrer"}},[e._v("Putty"),o("OutboundLink")],1),e._v(" and create a connection to your BTCPB.")])]),e._v(" "),o("p",[e._v("If you are using another Linux machine open a new terminal and type in the following.\nYou will be prompted for your password.")]),e._v(" "),o("ul",[o("li",[o("code",[e._v("ssh user@LANIP")]),e._v(" (ie. bob@192.168.1.2)")])]),e._v(" "),o("p",[e._v("Run the following commands.\nMake sure you change the "),o("code",[e._v("BTCPAY_HOST")]),e._v(" parameter to your own domain name.")]),e._v(" "),o("p",[e._v("Login as root")]),e._v(" "),o("ul",[o("li",[o("code",[e._v("sudo su -")])])]),e._v(" "),o("p",[e._v("Create a folder for BTCPay")]),e._v(" "),o("ul",[o("li",[o("code",[e._v("mkdir BTCPayServer")])]),e._v(" "),o("li",[o("code",[e._v("cd BTCPayServer")])])]),e._v(" "),o("p",[e._v("Clone the btcpayserver-docker repository")]),e._v(" "),o("ul",[o("li",[o("code",[e._v("git clone https://github.com/btcpayserver/btcpayserver-docker")])]),e._v(" "),o("li",[o("code",[e._v("cd btcpayserver-docker")])])]),e._v(" "),o("p",[e._v("Set your environment variables.\nRun each command separately.")]),e._v(" "),o("ul",[o("li",[o("code",[e._v('export BTCPAY_HOST="btcpay.YourDomain.com"')])]),e._v(" "),o("li",[o("code",[e._v('export NBITCOIN_NETWORK="mainnet"')])]),e._v(" "),o("li",[o("code",[e._v('export BTCPAYGEN_CRYPTO1="btc"')])]),e._v(" "),o("li",[o("code",[e._v('export BTCPAYGEN_CRYPTO2="ltc"')])]),e._v(" "),o("li",[o("code",[e._v('export BTCPAYGEN_REVERSEPROXY="nginx"')])]),e._v(" "),o("li",[o("code",[e._v('export BTCPAYGEN_LIGHTNING="clightning"')])])]),e._v(" "),o("p",[e._v("The last step is to launch the BTCPayServer setup script.")]),e._v(" "),o("ul",[o("li",[o("code",[e._v(". ./btcpay-setup.sh -i")])]),e._v(" "),o("li",[o("code",[e._v("exit")])])]),e._v(" "),o("p",[o("strong",[e._v("Step 11")]),e._v("\nGo to https://btcpay.yourdomain.com and confirm that your nodes are syncing.\nEnjoy!")]),e._v(" "),o("p",[e._v("If you don't have the time or patience to build your own BTCPB there are a few merchants who can build one for you.")]),e._v(" "),o("ul",[o("li",[o("a",{attrs:{href:"https://lightninginabox.co",target:"_blank",rel:"noopener noreferrer"}},[e._v("Lightning in a Box"),o("OutboundLink")],1)]),e._v(" "),o("li",[o("a",{attrs:{href:"https://nodl.it",target:"_blank",rel:"noopener noreferrer"}},[e._v("Nodl.it"),o("OutboundLink")],1)])])])}),[],!1,null,null,null);o.default=n.exports}}]); \ No newline at end of file diff --git a/assets/js/112.0f2a2fd0.js b/assets/js/112.d0df21d4.js similarity index 99% rename from assets/js/112.0f2a2fd0.js rename to assets/js/112.d0df21d4.js index b20968f536..fadb7595f5 100644 --- a/assets/js/112.0f2a2fd0.js +++ b/assets/js/112.d0df21d4.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[112],{738:function(t,e,a){"use strict";a.r(e);var s=a(10),n=Object(s.a)({},(function(){var t=this,e=t._self._c;return e("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[e("h1",{attrs:{id:"minimal-manual-setup"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#minimal-manual-setup"}},[t._v("#")]),t._v(" Minimal manual setup")]),t._v(" "),e("div",{staticClass:"custom-block danger"},[e("p",{staticClass:"custom-block-title"},[t._v("DANGER")]),t._v(" "),e("h4",{attrs:{id:"not-recommended-for-production-use"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#not-recommended-for-production-use"}},[t._v("#")]),t._v(" Not recommended for production use")]),t._v(" "),e("p",[t._v("Manual installation is NOT recommended for production use unless you are very confident with your Operating System and Bitcoin security expertise. If you are unsure use the docker deployment or one of the other "),e("RouterLink",{attrs:{to:"/Deployment/"}},[t._v("deployment options")]),t._v(".")],1),t._v(" "),e("h4",{attrs:{id:"you-must-have-technical-literacy-and-be-able-to-resolve-any-issues-on-your-own-the-community-will-not-provide-extensive-support-for-this-deployment"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#you-must-have-technical-literacy-and-be-able-to-resolve-any-issues-on-your-own-the-community-will-not-provide-extensive-support-for-this-deployment"}},[t._v("#")]),t._v(" You must have technical literacy and be able to resolve any issues on your own. The community will not provide extensive support for this deployment.")])]),t._v(" "),e("p",[t._v("The process is basically the following:")]),t._v(" "),e("ol",[e("li",[t._v("Download and sync "),e("a",{attrs:{href:"https://bitcoincore.org",target:"_blank",rel:"noopener noreferrer"}},[t._v("Bitcoin Core"),e("OutboundLink")],1)]),t._v(" "),e("li",[t._v("Clone and run "),e("a",{attrs:{href:"https://github.com/dgarage/NBxplorer",target:"_blank",rel:"noopener noreferrer"}},[t._v("NBXplorer"),e("OutboundLink")],1)]),t._v(" "),e("li",[t._v("Clone and run "),e("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver",target:"_blank",rel:"noopener noreferrer"}},[t._v("BTCPay Server"),e("OutboundLink")],1)])]),t._v(" "),e("p",[t._v("Take a look at our video to learn more:")]),t._v(" "),e("a",{staticClass:"ytEmbed",staticStyle:{"background-image":"url(https://img.youtube.com/vi/Xo_vApXTZBU/hqdefault.jpg)"},attrs:{href:"https://www.youtube.com/watch?v=Xo_vApXTZBU",title:"BTCPay Server - Setup","data-id":"Xo_vApXTZBU"}},[e("iframe",{attrs:{title:"BTCPay Server - Setup","data-src":"https://www.youtube-nocookie.com/embed/Xo_vApXTZBU?&autoplay=1&autohide=1&modestbranding=1&color=white&rel=0",frameborder:"0",allow:"autoplay;encrypted-media;picture-in-picture",allowfullscreen:""}})]),t._v(" "),e("h2",{attrs:{id:"warning-not-recommended-to-use-in-production"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#warning-not-recommended-to-use-in-production"}},[t._v("#")]),t._v(" Warning: Not recommended to use in production")]),t._v(" "),e("p",[e("strong",[t._v("Manual installation")]),t._v(" is NOT recommended in production. It should be only used for learning purpose.")]),t._v(" "),e("p",[t._v("Instead you should use the "),e("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver-docker",target:"_blank",rel:"noopener noreferrer"}},[t._v("docker deployment"),e("OutboundLink")],1),t._v(".")]),t._v(" "),e("p",[t._v("The docker deployment will provide you easy update system and make sure that all moving parts are wired correctly without any technical knowledge. It will also setup HTTPS for you.")]),t._v(" "),e("h2",{attrs:{id:"typical-manual-installation"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#typical-manual-installation"}},[t._v("#")]),t._v(" Typical manual installation")]),t._v(" "),e("p",[t._v("This steps have been done on Ubuntu 18.04, adapt for your own install.")]),t._v(" "),e("p",[t._v("For Testnet specific deployment, after installing Bitcoin, .NET Core, NBXplorer and BTCPayServer, see "),e("a",{attrs:{href:"#testnet-specific-deployments"}},[t._v("Commands for Running in Testnet Mode")])]),t._v(" "),e("h3",{attrs:{id:"1-install-bitcoin-core-0191"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#1-install-bitcoin-core-0191"}},[t._v("#")]),t._v(" 1) Install Bitcoin Core 0.19.1")]),t._v(" "),e("div",{staticClass:"language-bash extra-class"},[e("pre",{pre:!0,attrs:{class:"language-bash"}},[e("code",[e("span",{pre:!0,attrs:{class:"token assign-left variable"}},[t._v("BITCOIN_VERSION")]),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"0.19.1"')]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token assign-left variable"}},[t._v("BITCOIN_URL")]),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"https://bitcoin.org/bin/bitcoin-core-0.19.1/bitcoin-0.19.1-x86_64-linux-gnu.tar.gz"')]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token assign-left variable"}},[t._v("BITCOIN_SHA256")]),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"5fcac9416e486d4960e1a946145566350ca670f9aaba99de6542080851122e4c"')]),t._v("\n\n"),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# install bitcoin binaries")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("cd")]),t._v(" /tmp\n"),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("wget")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-O")]),t._v(" bitcoin.tar.gz "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"'),e("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$BITCOIN_URL")]),t._v('"')]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("echo")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"'),e("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$BITCOIN_SHA256")]),t._v(' bitcoin.tar.gz"')]),t._v(" "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("|")]),t._v(" sha256sum "),e("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-c")]),t._v(" - "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("&&")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("\\")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("mkdir")]),t._v(" bin "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("&&")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("\\")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("tar")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-xzvf")]),t._v(" bitcoin.tar.gz "),e("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-C")]),t._v(" /usr/local/bin --strip-components"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"bitcoin-'),e("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$BITCOIN_VERSION")]),t._v('/bin/bitcoin-cli"')]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"bitcoin-'),e("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$BITCOIN_VERSION")]),t._v('/bin/bitcoind"')]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("rm")]),t._v(" bitcoin.tar.gz\n")])])]),e("h3",{attrs:{id:"2-install-net-60-sdk"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#2-install-net-60-sdk"}},[t._v("#")]),t._v(" 2) Install .NET 6.0 SDK")]),t._v(" "),e("p",[t._v("On my Ubuntu 20.04 (See "),e("a",{attrs:{href:"https://docs.microsoft.com/en-us/dotnet/core/install/linux-ubuntu#2004-",target:"_blank",rel:"noopener noreferrer"}},[t._v("these instructions"),e("OutboundLink")],1),t._v(" or "),e("a",{attrs:{href:"https://dotnet.microsoft.com/en-us/download/dotnet/6.0",target:"_blank",rel:"noopener noreferrer"}},[t._v("here"),e("OutboundLink")],1),t._v(" for different OS).")]),t._v(" "),e("div",{staticClass:"language-bash extra-class"},[e("pre",{pre:!0,attrs:{class:"language-bash"}},[e("code",[e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# Add Microsoft package repository")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("wget")]),t._v(" https://packages.microsoft.com/config/ubuntu/20.04/packages-microsoft-prod.deb "),e("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-O")]),t._v(" packages-microsoft-prod.deb\n"),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" dpkg "),e("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-i")]),t._v(" packages-microsoft-prod.deb\n"),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("rm")]),t._v(" packages-microsoft-prod.deb\n\n"),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# Install the SDK")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("apt-get")]),t._v(" update\n"),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("apt-get")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("install")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-y")]),t._v(" apt-transport-https\n"),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("apt-get")]),t._v(" update\n"),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("apt-get")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("install")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-y")]),t._v(" dotnet-sdk-6.0\n\n"),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("## Check")]),t._v("\ndotnet "),e("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("--version")]),t._v("\n")])])]),e("h3",{attrs:{id:"3-install-nbxplorer"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#3-install-nbxplorer"}},[t._v("#")]),t._v(" 3) Install NBXplorer")]),t._v(" "),e("div",{staticClass:"language-bash extra-class"},[e("pre",{pre:!0,attrs:{class:"language-bash"}},[e("code",[e("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("cd")]),t._v(" ~\n"),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("git")]),t._v(" clone https://github.com/dgarage/NBXplorer\n"),e("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("cd")]),t._v(" NBXplorer\n"),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("git")]),t._v(" checkout latest\n./build.sh\n")])])]),e("h3",{attrs:{id:"4-install-btcpayserver"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#4-install-btcpayserver"}},[t._v("#")]),t._v(" 4) Install BTCPayServer")]),t._v(" "),e("div",{staticClass:"language-bash extra-class"},[e("pre",{pre:!0,attrs:{class:"language-bash"}},[e("code",[e("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("cd")]),t._v(" ~\n"),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("git")]),t._v(" clone https://github.com/btcpayserver/btcpayserver\n"),e("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("cd")]),t._v(" btcpayserver\n"),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("git")]),t._v(" checkout latest\n./build.sh\n")])])]),e("h3",{attrs:{id:"5-run-bitcoind"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#5-run-bitcoind"}},[t._v("#")]),t._v(" 5) Run bitcoind")]),t._v(" "),e("div",{staticClass:"language-bash extra-class"},[e("pre",{pre:!0,attrs:{class:"language-bash"}},[e("code",[t._v("bitcoind\n")])])]),e("h3",{attrs:{id:"6-run-nbxplorer"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#6-run-nbxplorer"}},[t._v("#")]),t._v(" 6) Run NBXplorer")]),t._v(" "),e("div",{staticClass:"language-bash extra-class"},[e("pre",{pre:!0,attrs:{class:"language-bash"}},[e("code",[e("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("cd")]),t._v(" ~/NBXplorer\n./run.sh "),e("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("--dbtrie")]),t._v("\n")])])]),e("p",[t._v("Note that using the "),e("code",[t._v("--dbtrie")]),t._v(" backend for NBXplorer, while easier, is deprecated.\nYou should better use a postgresql backend as documented on "),e("RouterLink",{attrs:{to:"/Deployment/ManualDeploymentExtended/"}},[t._v("Extended Manual Deployment")]),t._v(".")],1),t._v(" "),e("h3",{attrs:{id:"7-run-btcpay-server"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#7-run-btcpay-server"}},[t._v("#")]),t._v(" 7) Run BTCPay Server")]),t._v(" "),e("div",{staticClass:"language-bash extra-class"},[e("pre",{pre:!0,attrs:{class:"language-bash"}},[e("code",[e("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("cd")]),t._v(" ~/btcpayserver\n./run.sh "),e("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("--port")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("8080")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("--bind")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("0.0")]),t._v(".0.0\n")])])]),e("p",[t._v("Now you can browse your server on port 8080.")]),t._v(" "),e("p",[t._v("Note that by default, BTCPay Server will use SQLite as backend, while being easier, this is deprecated.\nYou should better use a postgresql backend as documented on "),e("RouterLink",{attrs:{to:"/Deployment/ManualDeploymentExtended/"}},[t._v("Extended Manual Deployment")]),t._v(".")],1),t._v(" "),e("h2",{attrs:{id:"testnet-specific-deployments"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#testnet-specific-deployments"}},[t._v("#")]),t._v(" Testnet Specific Deployments")]),t._v(" "),e("p",[t._v("Follow the instructions for installing Bitcoin, .NET Core, NBXplorer and BTCPayServer above.")]),t._v(" "),e("p",[t._v("Then when running them use:")]),t._v(" "),e("h3",{attrs:{id:"run-bitcoind-in-testnet-mode"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#run-bitcoind-in-testnet-mode"}},[t._v("#")]),t._v(" Run bitcoind in testnet mode")]),t._v(" "),e("div",{staticClass:"language-bash extra-class"},[e("pre",{pre:!0,attrs:{class:"language-bash"}},[e("code",[t._v("bitcoind "),e("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-testnet")]),t._v("\n")])])]),e("h3",{attrs:{id:"run-nbxplorer-in-testnet-mode"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#run-nbxplorer-in-testnet-mode"}},[t._v("#")]),t._v(" Run NBXplorer in testnet mode")]),t._v(" "),e("div",{staticClass:"language-bash extra-class"},[e("pre",{pre:!0,attrs:{class:"language-bash"}},[e("code",[e("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("cd")]),t._v(" ~/NBXplorer\n./run.sh "),e("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("--network")]),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v("testnet\n")])])]),e("h3",{attrs:{id:"run-btcpayserver-in-testnet-mode"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#run-btcpayserver-in-testnet-mode"}},[t._v("#")]),t._v(" Run BTCPayServer in testnet mode")]),t._v(" "),e("div",{staticClass:"language-bash extra-class"},[e("pre",{pre:!0,attrs:{class:"language-bash"}},[e("code",[e("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("cd")]),t._v(" ~/btcpayserver\n./run.sh "),e("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("--port")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("8080")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("--bind")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("0.0")]),t._v(".0.0 "),e("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("--network")]),t._v(" testnet\n")])])]),e("h2",{attrs:{id:"additional-links"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#additional-links"}},[t._v("#")]),t._v(" Additional links")]),t._v(" "),e("ul",[e("li",[e("RouterLink",{attrs:{to:"/Deployment/ManualDeploymentExtended/"}},[t._v("Extended Manual Deployment")])],1),t._v(" "),e("li",[e("a",{attrs:{href:"https://freedomnode.com/blog/114/how-to-setup-btc-and-lightning-payment-gateway-with-btcpayserver-on-linux-manual-install",target:"_blank",rel:"noopener noreferrer"}},[t._v("How to Setup BTC and Lightning Payment Gateway with BTCPayServer on Linux [Manual Install]"),e("OutboundLink")],1),t._v(" from freedomnode.com.")])])])}),[],!1,null,null,null);e.default=n.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[112],{739:function(t,e,a){"use strict";a.r(e);var s=a(10),n=Object(s.a)({},(function(){var t=this,e=t._self._c;return e("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[e("h1",{attrs:{id:"minimal-manual-setup"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#minimal-manual-setup"}},[t._v("#")]),t._v(" Minimal manual setup")]),t._v(" "),e("div",{staticClass:"custom-block danger"},[e("p",{staticClass:"custom-block-title"},[t._v("DANGER")]),t._v(" "),e("h4",{attrs:{id:"not-recommended-for-production-use"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#not-recommended-for-production-use"}},[t._v("#")]),t._v(" Not recommended for production use")]),t._v(" "),e("p",[t._v("Manual installation is NOT recommended for production use unless you are very confident with your Operating System and Bitcoin security expertise. If you are unsure use the docker deployment or one of the other "),e("RouterLink",{attrs:{to:"/Deployment/"}},[t._v("deployment options")]),t._v(".")],1),t._v(" "),e("h4",{attrs:{id:"you-must-have-technical-literacy-and-be-able-to-resolve-any-issues-on-your-own-the-community-will-not-provide-extensive-support-for-this-deployment"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#you-must-have-technical-literacy-and-be-able-to-resolve-any-issues-on-your-own-the-community-will-not-provide-extensive-support-for-this-deployment"}},[t._v("#")]),t._v(" You must have technical literacy and be able to resolve any issues on your own. The community will not provide extensive support for this deployment.")])]),t._v(" "),e("p",[t._v("The process is basically the following:")]),t._v(" "),e("ol",[e("li",[t._v("Download and sync "),e("a",{attrs:{href:"https://bitcoincore.org",target:"_blank",rel:"noopener noreferrer"}},[t._v("Bitcoin Core"),e("OutboundLink")],1)]),t._v(" "),e("li",[t._v("Clone and run "),e("a",{attrs:{href:"https://github.com/dgarage/NBxplorer",target:"_blank",rel:"noopener noreferrer"}},[t._v("NBXplorer"),e("OutboundLink")],1)]),t._v(" "),e("li",[t._v("Clone and run "),e("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver",target:"_blank",rel:"noopener noreferrer"}},[t._v("BTCPay Server"),e("OutboundLink")],1)])]),t._v(" "),e("p",[t._v("Take a look at our video to learn more:")]),t._v(" "),e("a",{staticClass:"ytEmbed",staticStyle:{"background-image":"url(https://img.youtube.com/vi/Xo_vApXTZBU/hqdefault.jpg)"},attrs:{href:"https://www.youtube.com/watch?v=Xo_vApXTZBU",title:"BTCPay Server - Setup","data-id":"Xo_vApXTZBU"}},[e("iframe",{attrs:{title:"BTCPay Server - Setup","data-src":"https://www.youtube-nocookie.com/embed/Xo_vApXTZBU?&autoplay=1&autohide=1&modestbranding=1&color=white&rel=0",frameborder:"0",allow:"autoplay;encrypted-media;picture-in-picture",allowfullscreen:""}})]),t._v(" "),e("h2",{attrs:{id:"warning-not-recommended-to-use-in-production"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#warning-not-recommended-to-use-in-production"}},[t._v("#")]),t._v(" Warning: Not recommended to use in production")]),t._v(" "),e("p",[e("strong",[t._v("Manual installation")]),t._v(" is NOT recommended in production. It should be only used for learning purpose.")]),t._v(" "),e("p",[t._v("Instead you should use the "),e("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver-docker",target:"_blank",rel:"noopener noreferrer"}},[t._v("docker deployment"),e("OutboundLink")],1),t._v(".")]),t._v(" "),e("p",[t._v("The docker deployment will provide you easy update system and make sure that all moving parts are wired correctly without any technical knowledge. It will also setup HTTPS for you.")]),t._v(" "),e("h2",{attrs:{id:"typical-manual-installation"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#typical-manual-installation"}},[t._v("#")]),t._v(" Typical manual installation")]),t._v(" "),e("p",[t._v("This steps have been done on Ubuntu 18.04, adapt for your own install.")]),t._v(" "),e("p",[t._v("For Testnet specific deployment, after installing Bitcoin, .NET Core, NBXplorer and BTCPayServer, see "),e("a",{attrs:{href:"#testnet-specific-deployments"}},[t._v("Commands for Running in Testnet Mode")])]),t._v(" "),e("h3",{attrs:{id:"1-install-bitcoin-core-0191"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#1-install-bitcoin-core-0191"}},[t._v("#")]),t._v(" 1) Install Bitcoin Core 0.19.1")]),t._v(" "),e("div",{staticClass:"language-bash extra-class"},[e("pre",{pre:!0,attrs:{class:"language-bash"}},[e("code",[e("span",{pre:!0,attrs:{class:"token assign-left variable"}},[t._v("BITCOIN_VERSION")]),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"0.19.1"')]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token assign-left variable"}},[t._v("BITCOIN_URL")]),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"https://bitcoin.org/bin/bitcoin-core-0.19.1/bitcoin-0.19.1-x86_64-linux-gnu.tar.gz"')]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token assign-left variable"}},[t._v("BITCOIN_SHA256")]),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"5fcac9416e486d4960e1a946145566350ca670f9aaba99de6542080851122e4c"')]),t._v("\n\n"),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# install bitcoin binaries")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("cd")]),t._v(" /tmp\n"),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("wget")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-O")]),t._v(" bitcoin.tar.gz "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"'),e("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$BITCOIN_URL")]),t._v('"')]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("echo")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"'),e("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$BITCOIN_SHA256")]),t._v(' bitcoin.tar.gz"')]),t._v(" "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("|")]),t._v(" sha256sum "),e("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-c")]),t._v(" - "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("&&")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("\\")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("mkdir")]),t._v(" bin "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("&&")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("\\")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("tar")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-xzvf")]),t._v(" bitcoin.tar.gz "),e("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-C")]),t._v(" /usr/local/bin --strip-components"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"bitcoin-'),e("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$BITCOIN_VERSION")]),t._v('/bin/bitcoin-cli"')]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"bitcoin-'),e("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$BITCOIN_VERSION")]),t._v('/bin/bitcoind"')]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("rm")]),t._v(" bitcoin.tar.gz\n")])])]),e("h3",{attrs:{id:"2-install-net-60-sdk"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#2-install-net-60-sdk"}},[t._v("#")]),t._v(" 2) Install .NET 6.0 SDK")]),t._v(" "),e("p",[t._v("On my Ubuntu 20.04 (See "),e("a",{attrs:{href:"https://docs.microsoft.com/en-us/dotnet/core/install/linux-ubuntu#2004-",target:"_blank",rel:"noopener noreferrer"}},[t._v("these instructions"),e("OutboundLink")],1),t._v(" or "),e("a",{attrs:{href:"https://dotnet.microsoft.com/en-us/download/dotnet/6.0",target:"_blank",rel:"noopener noreferrer"}},[t._v("here"),e("OutboundLink")],1),t._v(" for different OS).")]),t._v(" "),e("div",{staticClass:"language-bash extra-class"},[e("pre",{pre:!0,attrs:{class:"language-bash"}},[e("code",[e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# Add Microsoft package repository")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("wget")]),t._v(" https://packages.microsoft.com/config/ubuntu/20.04/packages-microsoft-prod.deb "),e("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-O")]),t._v(" packages-microsoft-prod.deb\n"),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" dpkg "),e("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-i")]),t._v(" packages-microsoft-prod.deb\n"),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("rm")]),t._v(" packages-microsoft-prod.deb\n\n"),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# Install the SDK")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("apt-get")]),t._v(" update\n"),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("apt-get")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("install")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-y")]),t._v(" apt-transport-https\n"),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("apt-get")]),t._v(" update\n"),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("apt-get")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("install")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-y")]),t._v(" dotnet-sdk-6.0\n\n"),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("## Check")]),t._v("\ndotnet "),e("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("--version")]),t._v("\n")])])]),e("h3",{attrs:{id:"3-install-nbxplorer"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#3-install-nbxplorer"}},[t._v("#")]),t._v(" 3) Install NBXplorer")]),t._v(" "),e("div",{staticClass:"language-bash extra-class"},[e("pre",{pre:!0,attrs:{class:"language-bash"}},[e("code",[e("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("cd")]),t._v(" ~\n"),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("git")]),t._v(" clone https://github.com/dgarage/NBXplorer\n"),e("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("cd")]),t._v(" NBXplorer\n"),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("git")]),t._v(" checkout latest\n./build.sh\n")])])]),e("h3",{attrs:{id:"4-install-btcpayserver"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#4-install-btcpayserver"}},[t._v("#")]),t._v(" 4) Install BTCPayServer")]),t._v(" "),e("div",{staticClass:"language-bash extra-class"},[e("pre",{pre:!0,attrs:{class:"language-bash"}},[e("code",[e("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("cd")]),t._v(" ~\n"),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("git")]),t._v(" clone https://github.com/btcpayserver/btcpayserver\n"),e("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("cd")]),t._v(" btcpayserver\n"),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("git")]),t._v(" checkout latest\n./build.sh\n")])])]),e("h3",{attrs:{id:"5-run-bitcoind"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#5-run-bitcoind"}},[t._v("#")]),t._v(" 5) Run bitcoind")]),t._v(" "),e("div",{staticClass:"language-bash extra-class"},[e("pre",{pre:!0,attrs:{class:"language-bash"}},[e("code",[t._v("bitcoind\n")])])]),e("h3",{attrs:{id:"6-run-nbxplorer"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#6-run-nbxplorer"}},[t._v("#")]),t._v(" 6) Run NBXplorer")]),t._v(" "),e("div",{staticClass:"language-bash extra-class"},[e("pre",{pre:!0,attrs:{class:"language-bash"}},[e("code",[e("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("cd")]),t._v(" ~/NBXplorer\n./run.sh "),e("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("--dbtrie")]),t._v("\n")])])]),e("p",[t._v("Note that using the "),e("code",[t._v("--dbtrie")]),t._v(" backend for NBXplorer, while easier, is deprecated.\nYou should better use a postgresql backend as documented on "),e("RouterLink",{attrs:{to:"/Deployment/ManualDeploymentExtended/"}},[t._v("Extended Manual Deployment")]),t._v(".")],1),t._v(" "),e("h3",{attrs:{id:"7-run-btcpay-server"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#7-run-btcpay-server"}},[t._v("#")]),t._v(" 7) Run BTCPay Server")]),t._v(" "),e("div",{staticClass:"language-bash extra-class"},[e("pre",{pre:!0,attrs:{class:"language-bash"}},[e("code",[e("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("cd")]),t._v(" ~/btcpayserver\n./run.sh "),e("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("--port")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("8080")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("--bind")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("0.0")]),t._v(".0.0\n")])])]),e("p",[t._v("Now you can browse your server on port 8080.")]),t._v(" "),e("p",[t._v("Note that by default, BTCPay Server will use SQLite as backend, while being easier, this is deprecated.\nYou should better use a postgresql backend as documented on "),e("RouterLink",{attrs:{to:"/Deployment/ManualDeploymentExtended/"}},[t._v("Extended Manual Deployment")]),t._v(".")],1),t._v(" "),e("h2",{attrs:{id:"testnet-specific-deployments"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#testnet-specific-deployments"}},[t._v("#")]),t._v(" Testnet Specific Deployments")]),t._v(" "),e("p",[t._v("Follow the instructions for installing Bitcoin, .NET Core, NBXplorer and BTCPayServer above.")]),t._v(" "),e("p",[t._v("Then when running them use:")]),t._v(" "),e("h3",{attrs:{id:"run-bitcoind-in-testnet-mode"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#run-bitcoind-in-testnet-mode"}},[t._v("#")]),t._v(" Run bitcoind in testnet mode")]),t._v(" "),e("div",{staticClass:"language-bash extra-class"},[e("pre",{pre:!0,attrs:{class:"language-bash"}},[e("code",[t._v("bitcoind "),e("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-testnet")]),t._v("\n")])])]),e("h3",{attrs:{id:"run-nbxplorer-in-testnet-mode"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#run-nbxplorer-in-testnet-mode"}},[t._v("#")]),t._v(" Run NBXplorer in testnet mode")]),t._v(" "),e("div",{staticClass:"language-bash extra-class"},[e("pre",{pre:!0,attrs:{class:"language-bash"}},[e("code",[e("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("cd")]),t._v(" ~/NBXplorer\n./run.sh "),e("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("--network")]),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v("testnet\n")])])]),e("h3",{attrs:{id:"run-btcpayserver-in-testnet-mode"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#run-btcpayserver-in-testnet-mode"}},[t._v("#")]),t._v(" Run BTCPayServer in testnet mode")]),t._v(" "),e("div",{staticClass:"language-bash extra-class"},[e("pre",{pre:!0,attrs:{class:"language-bash"}},[e("code",[e("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("cd")]),t._v(" ~/btcpayserver\n./run.sh "),e("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("--port")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("8080")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("--bind")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("0.0")]),t._v(".0.0 "),e("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("--network")]),t._v(" testnet\n")])])]),e("h2",{attrs:{id:"additional-links"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#additional-links"}},[t._v("#")]),t._v(" Additional links")]),t._v(" "),e("ul",[e("li",[e("RouterLink",{attrs:{to:"/Deployment/ManualDeploymentExtended/"}},[t._v("Extended Manual Deployment")])],1),t._v(" "),e("li",[e("a",{attrs:{href:"https://freedomnode.com/blog/114/how-to-setup-btc-and-lightning-payment-gateway-with-btcpayserver-on-linux-manual-install",target:"_blank",rel:"noopener noreferrer"}},[t._v("How to Setup BTC and Lightning Payment Gateway with BTCPayServer on Linux [Manual Install]"),e("OutboundLink")],1),t._v(" from freedomnode.com.")])])])}),[],!1,null,null,null);e.default=n.exports}}]); \ No newline at end of file diff --git a/assets/js/113.09f0d713.js b/assets/js/113.afdcadec.js similarity index 99% rename from assets/js/113.09f0d713.js rename to assets/js/113.afdcadec.js index bebfed573d..14d0136dc8 100644 --- a/assets/js/113.09f0d713.js +++ b/assets/js/113.afdcadec.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[113],{742:function(t,s,a){"use strict";a.r(s);var e=a(10),n=Object(e.a)({},(function(){var t=this,s=t._self._c;return s("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[s("h1",{attrs:{id:"extended-manual-setup"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#extended-manual-setup"}},[t._v("#")]),t._v(" Extended Manual Setup")]),t._v(" "),s("p",[t._v("This document lists steps for "),s("strong",[t._v("manually deploying BTCPay Server")]),t._v(" and additional related components. Following these steps is likely to take a long time. A shorter and more pragmatic approach is to use a "),s("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver-docker",target:"_blank",rel:"noopener noreferrer"}},[t._v("docker based deployment"),s("OutboundLink")],1),t._v(".")]),t._v(" "),s("p",[t._v("The instructions also build all the application components from source which can be an advantage for certain audit and/or security scenarios.")]),t._v(" "),s("div",{staticClass:"custom-block danger"},[s("p",{staticClass:"custom-block-title"},[t._v("DANGER")]),t._v(" "),s("h4",{attrs:{id:"not-recommended-for-production-use"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#not-recommended-for-production-use"}},[t._v("#")]),t._v(" Not recommended for production use")]),t._v(" "),s("p",[t._v("Manual installation is NOT recommended for production use unless you are very confident with your Operating System and Bitcoin security expertise. If you are unsure use the docker deployment or one of the other "),s("RouterLink",{attrs:{to:"/Deployment/"}},[t._v("deployment options")]),t._v(".")],1),t._v(" "),s("h4",{attrs:{id:"you-must-have-technical-literacy-and-be-able-to-resolve-any-issues-on-your-own-the-community-will-not-provide-extensive-support-for-this-deployment"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#you-must-have-technical-literacy-and-be-able-to-resolve-any-issues-on-your-own-the-community-will-not-provide-extensive-support-for-this-deployment"}},[t._v("#")]),t._v(" You must have technical literacy and be able to resolve any issues on your own. The community will not provide extensive support for this deployment.")])]),t._v(" "),s("h2",{attrs:{id:"installation-steps-overview"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#installation-steps-overview"}},[t._v("#")]),t._v(" Installation Steps Overview")]),t._v(" "),s("p",[t._v("The instructions in this article have been tested on Ubuntu 20.04. They should be applicable to other Linux based distributions. They are also based on all components being on the same host or virtual machine. It is possible to split the components across different hosts but these instructions don't describe that.")]),t._v(" "),s("p",[t._v("An example hostname of "),s("code",[t._v("mainnet.demo.btcpayserver.org")]),t._v(" has been used, it needs to be replaced with the hostname you are using for your BTCPay Server.")]),t._v(" "),s("h3",{attrs:{id:"security"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#security"}},[t._v("#")]),t._v(" Security")]),t._v(" "),s("p",[t._v("If you do use these instructions to install a BTCPay Server connected to the Bitcoin mainnet then at a minimum you should understand how the wallet mechanisms work. It's highly recommended to read the two articles below and ask questions if anything is not clear.")]),t._v(" "),s("ul",[s("li",[s("RouterLink",{attrs:{to:"/FAQ/Wallet/"}},[t._v("BTCPay Wallet FAQ")])],1),t._v(" "),s("li",[s("RouterLink",{attrs:{to:"/LightningNetwork/"}},[t._v("Lightning Network and BTCPay (first section)")])],1)]),t._v(" "),s("p",[t._v("As an additional aid below is a list of iptables rules and instructions which should include all the ports that need to be open. "),s("strong",[t._v("NO WARRANTY")]),t._v(". Use at your own risk, "),s("strong",[t._v("including risk of locking yourself out")]),t._v(".")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("vi")]),t._v(" iptables.txt\n")])])]),s("div",{staticClass:"language- extra-class"},[s("pre",{pre:!0,attrs:{class:"language-text"}},[s("code",[t._v("# Generated by iptables-save v1.6.1 on Mon May 27 18:48:11 2019\n*filter\n:INPUT ACCEPT [0:0]\n:FORWARD ACCEPT [0:0]\n:OUTPUT ACCEPT [0:0]\n-A INPUT -i lo -j ACCEPT\n-A INPUT -p tcp -m tcp --dport 22 -j ACCEPT # SSH\n-A INPUT -p tcp -m tcp --dport 80 -j ACCEPT # BTCPay HTTP\n-A INPUT -p tcp -m tcp --dport 443 -j ACCEPT # BTCPay HTTPS\n-A INPUT -p tcp -m tcp --dport 8333 -j ACCEPT # Bitcoind P2P\n-A INPUT -p tcp -m tcp --dport 9735 -j ACCEPT # Lightning P2P\n-A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT\nCOMMIT\n# Completed on Mon May 27 18:48:11 2019\n")])])]),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" iptables-restore "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v(" iptables.txt\n")])])]),s("p",[t._v("At this point if you are still connected to you ssh session it's a good sign. If not the rules are temporary and you can use whatever mechanism you have to remotely reboot your server and try again.")]),t._v(" "),s("p",[t._v("The rules have now been temporarily applied. To apply the rules automatically each time your server starts use the "),s("code",[t._v("iptables-persistent")]),t._v(" package.")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("apt")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("install")]),t._v(" iptables-persistent\n")])])]),s("p",[t._v("If you subsequently change the iptables rules and want to save them across reboots use the command below.")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" netfilter-persistent save\n")])])]),s("h2",{attrs:{id:"unprivileged-user"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#unprivileged-user"}},[t._v("#")]),t._v(" Unprivileged user")]),t._v(" "),s("p",[t._v("These instructions configure everything to run under an "),s("strong",[t._v("unprivileged user")]),t._v(" called "),s("code",[t._v("admin")]),t._v(". Create this user before proceeding:")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("useradd")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-M")]),t._v(" admin "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("&&")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("usermod")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-L")]),t._v(" admin\n")])])]),s("h3",{attrs:{id:"prerequisites"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#prerequisites"}},[t._v("#")]),t._v(" Prerequisites")]),t._v(" "),s("ul",[s("li",[t._v("Postgresql")]),t._v(" "),s("li",[t._v("Tor")]),t._v(" "),s("li",[t._v("NGINX and Let's Encrypt")])]),t._v(" "),s("h3",{attrs:{id:"application-components"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#application-components"}},[t._v("#")]),t._v(" Application Components")]),t._v(" "),s("ul",[s("li",[t._v("Bitcoin Core"),s("sup",[t._v("1,2")])]),t._v(" "),s("li",[t._v("NBXplorer"),s("sup",[t._v("1,2")])]),t._v(" "),s("li",[t._v("BTCPay Server"),s("sup",[t._v("1,2")])]),t._v(" "),s("li",[t._v("Lightning Network Daemon (LND)"),s("sup",[t._v("2")])]),t._v(" "),s("li",[t._v("Ride The Lightning (RTL)"),s("sup",[t._v("2")])])]),t._v(" "),s("p",[s("sup",[t._v("1")]),t._v(" The bare minimum install of a BTCPay Server only requires these items. Using a bare minimum configuration reduces the functionality: no Lightning payments, no auto-renewal of TLS certificates, less reliable data store, less capable of handling NAT and more.")]),t._v(" "),s("p",[s("sup",[t._v("2")]),t._v(" Built from source code.")]),t._v(" "),s("h2",{attrs:{id:"postgresql"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#postgresql"}},[t._v("#")]),t._v(" Postgresql")]),t._v(" "),s("p",[s("strong",[t._v("Postgresql")]),t._v(" can be used by BTCPay Server in place of the default SQLite file based storage. It's also possible to use MySQL.")]),t._v(" "),s("h5",{attrs:{id:"install"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#install"}},[t._v("#")]),t._v(" Install")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("apt")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("install")]),t._v(" postgresql postgresql-contrib\n")])])]),s("h5",{attrs:{id:"configuration"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#configuration"}},[t._v("#")]),t._v(" Configuration")]),t._v(" "),s("p",[t._v("Covered in BTCPay Server Configuration.")]),t._v(" "),s("h5",{attrs:{id:"check"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#check"}},[t._v("#")]),t._v(" Check")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("~$ psql "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("--version")]),t._v("\npsql "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("PostgreSQL"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("12.2")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("Ubuntu "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("12.2")]),t._v("-4"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" systemctl status postgresql\n~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-u")]),t._v(" postgres psql\npsql "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("12.2")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("Ubuntu "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("12.2")]),t._v("-4"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("))")]),t._v("\nType "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"help"')]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("for")]),t._v(" help.\n\n"),s("span",{pre:!0,attrs:{class:"token assign-left variable"}},[t._v("postgres")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# \\q")]),t._v("\n")])])]),s("h2",{attrs:{id:"tor"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#tor"}},[t._v("#")]),t._v(" Tor")]),t._v(" "),s("p",[s("strong",[t._v("Tor")]),t._v(" can be used by the following components to provide enhanced privacy and/or help with NAT traversal:")]),t._v(" "),s("ul",[s("li",[t._v("Bitcoin Core Daemon")]),t._v(" "),s("li",[t._v("Lightning Network Daemon (LND).")])]),t._v(" "),s("p",[t._v("Additional information running Bitcoin Core with Tor support can be found "),s("a",{attrs:{href:"https://github.com/bitcoin/bitcoin/blob/master/doc/tor.md",target:"_blank",rel:"noopener noreferrer"}},[t._v("here"),s("OutboundLink")],1),t._v(".")]),t._v(" "),s("h5",{attrs:{id:"install-2"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#install-2"}},[t._v("#")]),t._v(" Install")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("apt")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("install")]),t._v(" tor\n")])])]),s("h5",{attrs:{id:"configuration-2"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#configuration-2"}},[t._v("#")]),t._v(" Configuration")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("vi")]),t._v(" /etc/tor/torrc "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# (and uncomment two lines below)")]),t._v("\nControlPort "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("9051")]),t._v("\nCookieAuthentication "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),t._v("\n~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" systemctl restart tor\n")])])]),s("p",[t._v("Covered further in Bitcoin and Lightning Network Daemon sections.")]),t._v(" "),s("h5",{attrs:{id:"check-2"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#check-2"}},[t._v("#")]),t._v(" Check")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("~$ tor "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("--version")]),t._v("\nTor version "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0.4")]),t._v(".2.7\n~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("netstat")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-tlnp")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("|")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("grep")]),t._v(" tor "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# (lines below correspond to the tor control port and SOCKS proxy)")]),t._v("\ntcp "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("127.0")]),t._v(".0.1:9050 "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0.0")]),t._v(".0.0:* LISTEN "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1376")]),t._v("/tor\ntcp "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("127.0")]),t._v(".0.1:9051 "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0.0")]),t._v(".0.0:* LISTEN "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1376")]),t._v("/tor\n")])])]),s("h2",{attrs:{id:"nginx-and-lets-encrypt"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#nginx-and-lets-encrypt"}},[t._v("#")]),t._v(" NGINX and Let's Encrypt")]),t._v(" "),s("p",[s("strong",[t._v("NGINX")]),t._v(" is used as a web server to manage HTTP requests to BTCPay Server and Ride The Lightning. Paired with "),s("strong",[t._v("Let's Encrypt")]),t._v(" it allows seamless procurement and renewal of a TLS certificate for your BTCPay Server instance.")]),t._v(" "),s("p",[t._v("Let's Encrypt is a free service for procuring and renewing TLS certificates. The service comes with scripts that can be installed to automatically manage the whole process.")]),t._v(" "),s("h5",{attrs:{id:"install-3"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#install-3"}},[t._v("#")]),t._v(" Install")]),t._v(" "),s("h5",{attrs:{id:"1-install-nginx"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#1-install-nginx"}},[t._v("#")]),t._v(" 1. Install NGINX.")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("apt")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("install")]),t._v(" nginx\n")])])]),s("h5",{attrs:{id:"2-install-lets-encrypt"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#2-install-lets-encrypt"}},[t._v("#")]),t._v(" 2. Install Let's Encrypt")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("apt")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("install")]),t._v(" certbot python3-certbot-nginx\n")])])]),s("h5",{attrs:{id:"configuration-3"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#configuration-3"}},[t._v("#")]),t._v(" Configuration")]),t._v(" "),s("h5",{attrs:{id:"1-lets-encrypt-tls-certificate"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#1-lets-encrypt-tls-certificate"}},[t._v("#")]),t._v(" 1. Let's Encrypt TLS certificate")]),t._v(" "),s("p",[t._v("You must create an A or AAAA record for "),s("strong",[t._v("")]),t._v(" that points to the IP address of your server instance.\nIf your server is behind NAT then you need to forward port 80 to your instance.")]),t._v(" "),s("p",[t._v("The "),s("strong",[t._v("certbot")]),t._v(" script works by checking for a specific file on the web server hosting the requested domain. If it can't get the file the TLS certificate won't be issued. If the initial attempt fails it will be periodically re-attempted or you can simply re-run the command.")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" certbot "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("--nginx")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-d")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("your domain name"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# (e.g: sudo certbot --nginx -d mainnet.demo.btcpayserver.org)")]),t._v("\n")])])]),s("h5",{attrs:{id:"2-add-nginx-configuration-file"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#2-add-nginx-configuration-file"}},[t._v("#")]),t._v(" 2. Add NGINX configuration file")]),t._v(" "),s("p",[t._v("The configuration file below has been copied from the BTCPay Server docker install.")]),t._v(" "),s("p",[t._v('Search for "mainnet.demo.btcpayserver.org" and replace it with your own domain name.')]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("vi")]),t._v(" /etc/nginx/conf.d/default.conf\n")])])]),s("div",{staticClass:"language- extra-class"},[s("pre",{pre:!0,attrs:{class:"language-text"}},[s("code",[t._v("# If we receive X-Forwarded-Proto, pass it through; otherwise, pass along the\n# scheme used to connect to this server\nmap $http_x_forwarded_proto $proxy_x_forwarded_proto {\n default $http_x_forwarded_proto;\n '' $scheme;\n}\n# If we receive X-Forwarded-Port, pass it through; otherwise, pass along the\n# server port the client connected to\nmap $http_x_forwarded_port $proxy_x_forwarded_port {\n default $http_x_forwarded_port;\n '' $server_port;\n}\n# If we receive Upgrade, set Connection to \"upgrade\"; otherwise, delete any\n# Connection header that may have been passed to this server\nmap $http_upgrade $proxy_connection {\n default upgrade;\n '' close;\n}\n# Apply fix for very long server names\nserver_names_hash_bucket_size 128;\n# Prevent Nginx Information Disclosure\nserver_tokens off;\n# Default dhparam\n# Set appropriate X-Forwarded-Ssl header\nmap $scheme $proxy_x_forwarded_ssl {\n default off;\n https on;\n}\n\ngzip_types text/plain text/css application/javascript application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript;\nlog_format vhost '$host $remote_addr - $remote_user [$time_local] '\n '\"$request\" $status $body_bytes_sent '\n '\"$http_referer\" \"$http_user_agent\"';\naccess_log off;\n# HTTP 1.1 support\nproxy_http_version 1.1;\nproxy_buffering off;\nproxy_set_header Host $http_host;\nproxy_set_header Upgrade $http_upgrade;\nproxy_set_header Connection $proxy_connection;\nproxy_set_header X-Real-IP $remote_addr;\nproxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;\nproxy_set_header X-Forwarded-Proto $proxy_x_forwarded_proto;\nproxy_set_header X-Forwarded-Ssl $proxy_x_forwarded_ssl;\nproxy_set_header X-Forwarded-Port $proxy_x_forwarded_port;\nproxy_buffer_size 128k;\nproxy_buffers 4 256k;\nproxy_busy_buffers_size 256k;\nclient_header_buffer_size 500k;\nlarge_client_header_buffers 4 500k;\n# Mitigate httpoxy attack (see README for details)\nproxy_set_header Proxy \"\";\n\nserver {\n server_name mainnet.demo.btcpayserver.org;\n listen 80;\n access_log /var/log/nginx/access.log vhost;\n return 301 https://$host$request_uri;\n}\nserver {\n client_max_body_size 100M;\n server_name mainnet.demo.btcpayserver.org;\n listen 443 ssl http2 ;\n access_log /var/log/nginx/access.log vhost;\n ssl_protocols TLSv1.2;\n ssl_ciphers 'ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256';\n ssl_prefer_server_ciphers on;\n ssl_session_timeout 5m;\n ssl_session_cache shared:SSL:50m;\n ssl_session_tickets off;\n ssl_certificate /etc/letsencrypt/live/mainnet.demo.btcpayserver.org/cert.pem;\n ssl_certificate_key /etc/letsencrypt/live/mainnet.demo.btcpayserver.org/privkey.pem;\n ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;\n ssl_stapling on;\n ssl_stapling_verify on;\n ssl_trusted_certificate /etc/letsencrypt/live/mainnet.demo.btcpayserver.org/fullchain.pem;\n add_header Strict-Transport-Security \"max-age=31536000\" always;\n #include /etc/nginx/vhost.d/default;\n\n # Here is the main BTCPay Server application\n location / {\n proxy_pass http://127.0.0.1:23000;\n }\n\n # Include the next two stanzas if and only if you want to expose your lightning gRPC & RPC interfaces to the internet\n location /lnrpc.Lightning {\n grpc_pass grpcs://127.0.0.1:10009;\n }\n\n location /lnd-rest/btc/ {\n rewrite ^/lnd-rest/btc/(.*) /$1 break;\n proxy_pass https://127.0.0.1:8080/;\n }\n\n # Include this stanza if you are planning to set up Ride The Lightning (RTL)\n location /rtl/ {\n proxy_pass http://127.0.0.1:3000/rtl/;\n }\n}\n")])])]),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" systemctl restart nginx\n~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" systemctl status nginx\n")])])]),s("p",[t._v("If there is an error message restarting "),s("code",[t._v("nginx")]),t._v(" try:")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" journalctl "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-xe")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("--unit")]),t._v(" nginx\n")])])]),s("h5",{attrs:{id:"check-3"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#check-3"}},[t._v("#")]),t._v(" Check")]),t._v(" "),s("h5",{attrs:{id:"1-check-lets-encrypt"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#1-check-lets-encrypt"}},[t._v("#")]),t._v(" 1. Check Let's Encrypt")]),t._v(" "),s("p",[t._v("It can be a little bit tricky to get everything set up correctly for the Let's Encrypt script to work correctly. Some additional commands are listed below to help with any troubleshooting.")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" certbot certificates\n- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -\nFound the following certs:\n Certificate Name: mainnet.demo.btcpayserver.org\n Domains: mainnet.demo.btcpayserver.org\n Expiry Date: "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("2019")]),t._v("-08-10 "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("18")]),t._v(":00:31+00:00 "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("VALID: "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("79")]),t._v(" days"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n Certificate Path: /etc/letsencrypt/live/mainnet.demo.btcpayserver.org/fullchain.pem\n Private Key Path: /etc/letsencrypt/live/mainnet.demo.btcpayserver.org/privkey.pem\n- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -\n")])])]),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("cat")]),t._v(" /etc/cron.d/certbot "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# (check the cron job exists)")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),t._v(" */12 * * * root "),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("test")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-x")]),t._v(" /usr/bin/certbot "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-a")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("\\")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-d")]),t._v(" /run/systemd/system "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("&&")]),t._v(" perl "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-e")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'sleep int(rand(43200))'")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("&&")]),t._v(" certbot "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-q")]),t._v(" renew\n")])])]),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("tail")]),t._v(" /var/log/letsencrypt/letsencrypt.log "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# (check for problems)")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("2019")]),t._v("-05-22 "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("19")]),t._v(":36:36,062:DEBUG:certbot.main:certbot version: "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0.31")]),t._v(".0\n")])])]),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" certbot renew --dry-run "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# (test renewal)")]),t._v("\n- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -\n** DRY RUN: simulating "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'certbot renew'")]),t._v(" close to cert expiry\n** "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("The "),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("test")]),t._v(" certificates below have not been saved."),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\nCongratulations, all renewals succeeded. The following certs have been renewed:\n /etc/letsencrypt/live/mainnet.demo.btcpayserver.org/fullchain.pem "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("success"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n** DRY RUN: simulating "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'certbot renew'")]),t._v(" close to cert expiry\n** "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("The "),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("test")]),t._v(" certificates above have not been saved."),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -\n")])])]),s("h5",{attrs:{id:"2-check-nginx"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#2-check-nginx"}},[t._v("#")]),t._v(" 2. Check NGINX.")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" nginx "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-v")]),t._v("\nnginx version: nginx/1.18.0 "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("Ubuntu"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("netstat")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-tlnp")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("|")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("grep")]),t._v(" nginx\ntcp "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0.0")]),t._v(".0.0:443 "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0.0")]),t._v(".0.0:* LISTEN "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("266275")]),t._v("/nginx: maste\ntcp "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0.0")]),t._v(".0.0:80 "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0.0")]),t._v(".0.0:* LISTEN "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("266275")]),t._v("/nginx: maste\ntcp6 "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),t._v(" :::443 :::* LISTEN "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("266275")]),t._v("/nginx: maste\ntcp6 "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),t._v(" :::80 :::* LISTEN "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("266275")]),t._v("/nginx: maste\n")])])]),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" journalctl "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-xe")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("--unit")]),t._v(" nginx "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("--follow")]),t._v("\n--\n-- A start job "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("for")]),t._v(" unit nginx.service has finished successfully.\n--\n-- The job identifier is "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("19471")]),t._v(".\n")])])]),s("p",[t._v("Attempt to open your web site in a browser. At this point it is expected that a "),s("code",[t._v("502 Bad Gateway")]),t._v("error will occur. The "),s("code",[t._v("nginx")]),t._v(" logs can be checked to verify that the connection attempt was received.")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("tail")]),t._v(" /var/log/nginx/access.log\nmainnet.demo.btcpayserver.org "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("127.0")]),t._v(".0.1 - - "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("27")]),t._v("/Jul/2020:12:19:57 +0100"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"GET / HTTP/2.0"')]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("502")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("552")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"-"')]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.89 Safari/537.36"')]),t._v("\n")])])]),s("p",[t._v("If there is a problem then the "),s("code",[t._v("nginx")]),t._v(" error log can also be checked.")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("tail")]),t._v(" /var/log/nginx/error.log\n")])])]),s("h2",{attrs:{id:"bitcoin-core"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#bitcoin-core"}},[t._v("#")]),t._v(" Bitcoin Core")]),t._v(" "),s("p",[t._v("The gateway to the Bitcoin network for BTCPay Server components.")]),t._v(" "),s("h5",{attrs:{id:"install-4"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#install-4"}},[t._v("#")]),t._v(" Install")]),t._v(" "),s("p",[t._v("The full instructions to "),s("strong",[t._v("build Bitcoin Core from source")]),t._v(" are "),s("a",{attrs:{href:"https://github.com/bitcoin/bitcoin/blob/master/doc/build-unix.md",target:"_blank",rel:"noopener noreferrer"}},[t._v("here"),s("OutboundLink")],1),t._v(".")]),t._v(" "),s("p",[t._v("The alternative to building from source is to download a signed binary distribution from "),s("a",{attrs:{href:"https://bitcoincore.org/en/download/",target:"_blank",rel:"noopener noreferrer"}},[t._v("https://bitcoincore.org/en/download/"),s("OutboundLink")],1),t._v(".")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("wget")]),t._v(" https://bitcoincore.org/bin/bitcoin-core-0.20.0/bitcoin-0.20.0-x86_64-linux-gnu.tar.gz\n~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("wget")]),t._v(" https://bitcoincore.org/bin/bitcoin-core-0.20.0/SHA256SUMS.asc\n")])])]),s("h5",{attrs:{id:"1-install-pre-requisites-and-dependencies"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#1-install-pre-requisites-and-dependencies"}},[t._v("#")]),t._v(" 1. Install Pre-requisites and dependencies")]),t._v(" "),s("p",[t._v("These instructions do not build the Bitcoin Core GUI components as they are not needed for "),s("code",[t._v("BTCPay Server")]),t._v(".")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("apt")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("install")]),t._v(" build-essential libtool autotools-dev automake pkg-config bsdmainutils python3\n~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("apt")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("install")]),t._v(" libevent-dev libboost-system-dev libboost-filesystem-dev libboost-test-dev libboost-thread-dev libminiupnpc-dev libzmq3-dev\n")])])]),s("h5",{attrs:{id:"2-download-and-build-source"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#2-download-and-build-source"}},[t._v("#")]),t._v(" 2. Download and Build Source")]),t._v(" "),s("p",[t._v("Before cloning the "),s("code",[t._v("Bitcoin Core")]),t._v(' repository identify the most recent stable version. One convenient way to do this is on the GitHub repository page look at the latest version under the "Releases" heading. At the time of writing the stable version is '),s("code",[t._v("0.20.0")]),t._v(". Adjust the tag in the "),s("code",[t._v("git clone")]),t._v(" command below for the stable version you want to build.")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("~$ "),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("cd")]),t._v(" src\n~/src$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("git")]),t._v(" clone "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("--depth")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("--branch")]),t._v(" v0.20.0 https://github.com/bitcoin/bitcoin.git\n~/src$ "),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("cd")]),t._v(" bitcoin\n")])])]),s("p",[t._v("A specific version of the Berkeley DB dependency needs to be installed.")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("~/src/bitcoin$ ./contrib/install_db4.sh "),s("span",{pre:!0,attrs:{class:"token variable"}},[s("span",{pre:!0,attrs:{class:"token variable"}},[t._v("`")]),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("pwd")]),s("span",{pre:!0,attrs:{class:"token variable"}},[t._v("`")])]),t._v("\n")])])]),s("p",[t._v("Use the "),s("code",[t._v("autoconf")]),t._v(" scripts to generate the make files and then build.")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("~/src/bitcoin$ ./autogen.sh\n~/src/bitcoin$ "),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("export")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token assign-left variable"}},[t._v("BDB_PREFIX")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'/home/admin/src/bitcoin/db4'")]),t._v("\n~/src/bitcoin$ ./configure "),s("span",{pre:!0,attrs:{class:"token assign-left variable"}},[t._v("BDB_LIBS")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"-L'),s("span",{pre:!0,attrs:{class:"token variable"}},[t._v("${BDB_PREFIX}")]),t._v('/lib -ldb_cxx-4.8"')]),t._v(" "),s("span",{pre:!0,attrs:{class:"token assign-left variable"}},[t._v("BDB_CFLAGS")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"-I'),s("span",{pre:!0,attrs:{class:"token variable"}},[t._v("${BDB_PREFIX}")]),t._v('/include"')]),t._v("\n~/src/bitcoin$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("make")]),t._v("\n~/src/bitcoin$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("make")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("install")]),t._v("\n~/src/bitcoin$ bitcoind "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-version")]),t._v("\nBitcoin Core version v0.20.0\n")])])]),s("h5",{attrs:{id:"3-create-the-configuration-file"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#3-create-the-configuration-file"}},[t._v("#")]),t._v(" 3. Create the configuration file")]),t._v(" "),s("p",[t._v("An example "),s("strong",[t._v("configuration file")]),t._v(" is available on the Bitcoin Core repository at https://github.com/bitcoin/bitcoin/blob/master/share/examples/bitcoin.conf.")]),t._v(" "),s("p",[t._v("Create a "),s("strong",[t._v("bitcoin.conf file")]),t._v(" to suit your needs. An example file that is suitable for BTCPay Server is shown below. This configuration does not prune blocks which means as of May 2019 you will require 235 GB for the Bitcoin blockchain.")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("vi")]),t._v(" bitcoin.conf\n")])])]),s("div",{staticClass:"language- extra-class"},[s("pre",{pre:!0,attrs:{class:"language-text"}},[s("code",[t._v("server=1 # need RPC for btcpay.\nrpcbind=127.0.0.1 # loopback is default for 0.18.0 but no harm making sure.\nwhitelist=127.0.0.1 # for nbxplorer.\nrpcallowip=127.0.0.1/32 # loopback is default but again no harm.\nzmqpubrawblock=tcp://127.0.0.1:28332 # needed for lightning.\nzmqpubrawtx=tcp://127.0.0.1:28333 # needed for lightning.\n#prune=5000 # Recommended if not enough disk space for full 600+GB blockchain.\n")])])]),s("p",[t._v("Copy the file to the directory specified in the systemd service file and assign read permissions to all users.")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("mkdir")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-p")]),t._v(" /etc/bitcoin\n~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("cp")]),t._v(" bitcoin.conf /etc/bitcoin\n~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("chmod")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("644")]),t._v(" /etc/bitcoin/bitcoin.conf\n")])])]),s("h5",{attrs:{id:"5-create-a-systemd-service"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#5-create-a-systemd-service"}},[t._v("#")]),t._v(" 5. Create a systemd service")]),t._v(" "),s("p",[t._v("An example "),s("strong",[t._v("systemd service")]),t._v(" file is available in the Bitcoin Core repository at https://raw.githubusercontent.com/bitcoin/bitcoin/master/contrib/init/bitcoind.service.")]),t._v(" "),s("p",[t._v("Edit the service file depending on your needs.")]),t._v(" "),s("p",[t._v("In the example below the "),s("strong",[t._v("User")]),t._v(" and "),s("strong",[t._v("Group")]),t._v(" have been changed to use the "),s("code",[t._v("admin")]),t._v(" user instead of requiring a new "),s("code",[t._v("bitcoin")]),t._v(" user. If the "),s("code",[t._v("admin")]),t._v(" user on your system is intended for running "),s("code",[t._v("BTCPayServer")]),t._v(" this is a reasonable choice. Otherwise consider creating a dedicated "),s("code",[t._v("bitcoin")]),t._v(" user.")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("vi")]),t._v(" bitcoind.service\n")])])]),s("div",{staticClass:"language- extra-class"},[s("pre",{pre:!0,attrs:{class:"language-text"}},[s("code",[t._v("[Unit]\nDescription=Bitcoin daemon\nAfter=network.target\n\n[Service]\nExecStart=/usr/bin/bitcoind -daemon \\\n -pid=/run/bitcoind/bitcoind.pid \\\n -conf=/etc/bitcoin/bitcoin.conf \\\n -datadir=/var/lib/bitcoind\n\n# Make sure the config directory is readable by the service user\nPermissionsStartOnly=true\nExecStartPre=/bin/chgrp admin /etc/bitcoin\n\n# Process management\n####################\n\nType=forking\nPIDFile=/run/bitcoind/bitcoind.pid\nRestart=on-failure\nTimeoutStopSec=600\n\n# Run as admin:admin\nUser=admin\nGroup=admin\n\n# /run/bitcoind\nRuntimeDirectory=bitcoind\nRuntimeDirectoryMode=0710\n\n# /etc/bitcoin\nConfigurationDirectory=bitcoin\nConfigurationDirectoryMode=0710\n\n# /var/lib/bitcoind\nStateDirectory=bitcoind\nStateDirectoryMode=0710\n\n# Hardening measures\n####################\n# Provide a private /tmp and /var/tmp.\nPrivateTmp=true\n\n# Deny access to /home, /root and /run/user\nProtectHome=true\n\n# Mount /usr, /boot/ and /etc read-only for the process.\nProtectSystem=full\n\n# Disallow the process and all of its children to gain\n# new privileges through execve().\nNoNewPrivileges=true\n\n# Use a new /dev namespace only populated with API pseudo devices\n# such as /dev/null, /dev/zero and /dev/random.\nPrivateDevices=true\n\n# Deny the creation of writable and executable memory mappings.\nMemoryDenyWriteExecute=true\n\n[Install]\nWantedBy=multi-user.target\n")])])]),s("p",[t._v("Once the service file is ready complete the commands below.")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("cp")]),t._v(" bitcoind.service /etc/systemd/system\n~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" systemctl "),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("enable")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("--now")]),t._v(" bitcoind\n~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" systemctl status bitcoind\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("..")]),t._v(".\nJul "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("26")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("21")]),t._v(":51:52 ubuntu systemd"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(": Started Bitcoin daemon.\n")])])]),s("p",[t._v("If the start attempt shows an error message check the log using:")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" journalctl "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-xe")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("--unit")]),t._v(" bitcoind\n")])])]),s("h5",{attrs:{id:"6-create-a-symbolic-link-to-the-bitcoind-cookie-file"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#6-create-a-symbolic-link-to-the-bitcoind-cookie-file"}},[t._v("#")]),t._v(" 6. Create a symbolic link to the bitcoind cookie file")]),t._v(" "),s("p",[t._v("The "),s("code",[t._v("bitcoin-cli")]),t._v(" client needs to authenticate to "),s("code",[t._v("bitcoind")]),t._v(" for RPC calls. The easiest way to allow this is to create a symbolic link to the cookie file.")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("~$ "),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("cd")]),t._v(" ~\n~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("ln")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-s")]),t._v(" /var/lib/bitcoind/.cookie .bitcoin/.cookie\n")])])]),s("p",[t._v("It's not vital to perform this step but if not done then every "),s("code",[t._v("bitcoin-cli")]),t._v(" command needs to specify the path to the cookie file as below.")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("~$ bitcoin-cli "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-rpccookiefile")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v("/var/lib/bitcoind/.cookie getblockchaininfo\n")])])]),s("h5",{attrs:{id:"check-4"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#check-4"}},[t._v("#")]),t._v(" Check")]),t._v(" "),s("p",[t._v("It will take Bitcoin anywhere from a few hours to a few days to synchronise the blockchain. Use any or all of the commands below to check its status.")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" systemctl status bitcoind\nActive: active "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("running"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" since Sun "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("2020")]),t._v("-07-26 "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("21")]),t._v(":51:52 IST"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" 2min 47s ago\n")])])]),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("tail")]),t._v(" /var/lib/bitcoind/debug.log "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-f")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("..")]),t._v(".\n"),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("2020")]),t._v("-07-26T20:55:09Z UpdateTip: new "),s("span",{pre:!0,attrs:{class:"token assign-left variable"}},[t._v("best")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v("0000000000000361c37dfb6fa905ef967b95411fa96f7dcb4eca5dd4434d9e59 "),s("span",{pre:!0,attrs:{class:"token assign-left variable"}},[t._v("height")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("126732")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token assign-left variable"}},[t._v("version")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v("0x00000001 "),s("span",{pre:!0,attrs:{class:"token assign-left variable"}},[t._v("log2_work")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("62.952182")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token assign-left variable"}},[t._v("tx")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("560114")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token assign-left variable"}},[t._v("date")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'2011-05-25T21:26:08Z'")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token assign-left variable"}},[t._v("progress")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0.001018")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token assign-left variable"}},[t._v("cache")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("43")]),t._v(".6MiB"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("291168txo"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("..")]),t._v(".\n")])])]),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("~$ bitcoin-cli getblockchaininfo\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"chain"')]),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"main"')]),t._v(",\n "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"blocks"')]),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("133015")]),t._v(",\n "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"headers"')]),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("640929")]),t._v(",\n "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"bestblockhash"')]),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"0000000000000e81b67de8d61eab726f40585bed954b1dd59f86ab10e4e55398"')]),t._v(",\n "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"difficulty"')]),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("876954.4935135372")]),t._v(",\n "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"mediantime"')]),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1308897947")]),t._v(",\n "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"verificationprogress"')]),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0.001530462018729556")]),t._v(",\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("..")]),t._v(".\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),s("p",[t._v("When the "),s("code",[t._v("verificationprogress")]),t._v(" gets to either "),s("code",[t._v("0.99..")]),t._v(" or "),s("code",[t._v("1.0")]),t._v(" your node has synchronised. To double check you can also use a public block explorer such as "),s("a",{attrs:{href:"https://blockstream.info/",target:"_blank",rel:"noopener noreferrer"}},[t._v("https://blockstream.info/"),s("OutboundLink")],1),t._v(" to view the latest "),s("code",[t._v("Bitcoin")]),t._v(" block and compare it to the "),s("code",[t._v("blocks")]),t._v(" value from the "),s("code",[t._v("bitcoin-cli getblockchaininfo")]),t._v(" result.")]),t._v(" "),s("h5",{attrs:{id:"check-tor-and-bitcoin"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#check-tor-and-bitcoin"}},[t._v("#")]),t._v(" Check Tor and Bitcoin")]),t._v(" "),s("p",[t._v("If Tor was installed prior to the Bitcoin Daemon then it should have automatically registered and begun listening on a torv2 onion address (note support for torv3 onion addresses is in the "),s("a",{attrs:{href:"https://github.com/bitcoin/bitcoin/issues/18884",target:"_blank",rel:"noopener noreferrer"}},[t._v("pipeline"),s("OutboundLink")],1),t._v(").")]),t._v(" "),s("p",[t._v("The easiest way to get your Bitcoin Daemon torv2 address is using "),s("code",[t._v("bitcoin-cli")]),t._v(":")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("bitcoin-cli getnetworkinfo\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"version"')]),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("200100")]),t._v(",\n "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"subversion"')]),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"/Satoshi:0.20.1/"')]),t._v(",\n "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"protocolversion"')]),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("70015")]),t._v(",\n "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"localservices"')]),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"0000000000000409"')]),t._v(",\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("..")]),t._v(".\n "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"localaddresses"')]),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"address"')]),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"192.168.11.4"')]),t._v(",\n "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"port"')]),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("8333")]),t._v(",\n "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"score"')]),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v(",\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"address"')]),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"v5j6hfz4xafmeckf.onion"')]),t._v(",\n "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"port"')]),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("8333")]),t._v(",\n "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"score"')]),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("156")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(",\n "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"warnings"')]),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('""')]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),s("p",[t._v("An alternative approach is to search the Bitcoin daemon log file:")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("cat")]),t._v(" /var/lib/bitcoind/debug.log "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("|")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("grep")]),t._v(" onion\n"),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("2019")]),t._v("-05-23T18:24:22Z tor: Got "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("service")]),t._v(" ID 4d4al7v4hj5p7bb6, advertising "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("service")]),t._v(" 4d4al7v4hj5p7bb6.onion:8333\n"),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("2019")]),t._v("-05-23T18:24:22Z AddLocal"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("4d4al7v4hj5p7bb6.onion:8333,4"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),s("p",[t._v("If there is a problem and no onion address can be found in the log file then check for Tor related error messages:")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("cat")]),t._v(" /var/lib/bitcoind/debug.log "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("|")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("grep")]),t._v(" tor\n"),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("2020")]),t._v("-07-27T08:03:28Z torcontrol thread start\n"),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("2020")]),t._v("-07-27T08:03:28Z tor: Authentication cookie /run/tor/control.authcookie could not be opened "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("check permissions"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),s("p",[t._v("The above error message can occur if the user accounts running the Bitcoin service does not have read access to the Tor authentication cookie file, "),s("a",{attrs:{href:"https://github.com/bitcoin/bitcoin/blob/master/doc/tor.md#3-automatically-listen-on-tor",target:"_blank",rel:"noopener noreferrer"}},[t._v("more info"),s("OutboundLink")],1),t._v(". To fix this particular error add the required user account to the "),s("code",[t._v("debian-tor")]),t._v(" group.")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("usermod")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-a")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-G")]),t._v(" debian-tor admin\n")])])]),s("p",[t._v("To change your onion address:")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("rm")]),t._v(" /var/lib/bitcoind/onion_private_key\n~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" systemctl restart bitcoind\n~$ bitcoin-cli getnetworkinfo "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("|")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("grep")]),t._v(" onion\n "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"name"')]),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"onion"')]),t._v(",\n "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"address"')]),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"qud5iwbntqxlfwjv.onion"')]),t._v(",\n")])])]),s("p",[t._v("To check your onion address from a remote host with tor installed:")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("~$ torsocks "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("--shell")]),t._v("\n~$ telnet 4d4al7v4hj5p7bb6.onion "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("8333")]),t._v("\n Trying "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("127.42")]),t._v(".42.0"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("..")]),t._v(".\n Connected to "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("127.42")]),t._v(".42.0.\n Escape character is "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'^]'")]),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v(".")]),t._v("\n~$ "),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("exit")]),t._v("\n")])])]),s("p",[t._v("To connect another "),s("code",[t._v("bitcoind")]),t._v(" instance to your new node:")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("~$ bitcoin-cli addnode "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"4d4al7v4hj5p7bb6.onion"')]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"add"')]),t._v("\n~$ bitcoin-cli getaddednodeinfo\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"addednode"')]),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"4d4al7v4hj5p7bb6.onion"')]),t._v(",\n "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"connected"')]),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v(":")]),t._v(" true,\n "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"addresses"')]),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"address"')]),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"4d4al7v4hj5p7bb6.onion:8333"')]),t._v(",\n "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"connected"')]),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"outbound"')]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),s("h2",{attrs:{id:"nbxplorer"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#nbxplorer"}},[t._v("#")]),t._v(" NBXplorer")]),t._v(" "),s("p",[s("strong",[t._v("NBXplorer")]),t._v(" is a dotnet core application that monitors the Bitcoin blockchain for transactions of interest to your BTCPay Server.")]),t._v(" "),s("h5",{attrs:{id:"install-5"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#install-5"}},[t._v("#")]),t._v(" Install")]),t._v(" "),s("h5",{attrs:{id:"1-install-net-60-sdk"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#1-install-net-60-sdk"}},[t._v("#")]),t._v(" 1. Install .NET 6.0 SDK")]),t._v(" "),s("p",[s("a",{attrs:{href:"https://docs.microsoft.com/en-us/dotnet/core/install/linux-ubuntu#2004-",target:"_blank",rel:"noopener noreferrer"}},[t._v("Follow the install instuctions"),s("OutboundLink")],1),t._v(":")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# Add Microsoft package repository")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("wget")]),t._v(" https://packages.microsoft.com/config/ubuntu/20.04/packages-microsoft-prod.deb "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-O")]),t._v(" packages-microsoft-prod.deb\n"),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" dpkg "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-i")]),t._v(" packages-microsoft-prod.deb\n"),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("rm")]),t._v(" packages-microsoft-prod.deb\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# Install the SDK")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("apt-get")]),t._v(" update\n"),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("apt-get")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("install")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-y")]),t._v(" apt-transport-https\n"),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("apt-get")]),t._v(" update\n"),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("apt-get")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("install")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-y")]),t._v(" dotnet-sdk-6.0\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("## Check")]),t._v("\ndotnet "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("--version")]),t._v("\n")])])]),s("h5",{attrs:{id:"2-build-nbxplorer"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#2-build-nbxplorer"}},[t._v("#")]),t._v(" 2. Build NBXplorer")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("~$ "),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("cd")]),t._v(" ~"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("mkdir")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-p")]),t._v(" src"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("cd")]),t._v(" src\n~/src$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("git")]),t._v(" clone https://github.com/dgarage/NBXplorer\n~/src$ "),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("cd")]),t._v(" NBXplorer\n~/src/NBXplorer$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("git")]),t._v(" checkout "),s("span",{pre:!0,attrs:{class:"token variable"}},[s("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$(")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("git")]),t._v(" tag "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("--sort")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-version:refname")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("|")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("awk")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'match($0, /^v[0-9]+\\./)'")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("|")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("head")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-n")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token variable"}},[t._v(")")])]),t._v("\n~/src/NBXplorer$ ./build.sh\n")])])]),s("h5",{attrs:{id:"3-create-postgresql-database"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#3-create-postgresql-database"}},[t._v("#")]),t._v(" 3. Create Postgresql Database")]),t._v(" "),s("p",[t._v("While NBXplorer support storing data in a local database via "),s("code",[t._v("--dbtrie")]),t._v(", this is deprecated. Here how to create the appropriate database and user for NBXlporer in "),s("strong",[t._v("Postgresql")]),t._v(".")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-u")]),t._v(" postgres psql\n")])])]),s("p",[t._v("Then execute")]),t._v(" "),s("div",{staticClass:"language-SQL extra-class"},[s("pre",{pre:!0,attrs:{class:"language-sql"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("CREATE")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("DATABASE")]),t._v(" nbxplorer TEMPLATE "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'template0'")]),t._v(" LC_CTYPE "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'C'")]),t._v(" LC_COLLATE "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'C'")]),t._v(" ENCODING "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'UTF8'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("CREATE")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("USER")]),t._v(" nbxplorer "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("WITH")]),t._v(" ENCRYPTED PASSWORD "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'urpassword'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("GRANT")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("ALL")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("PRIVILEGES")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("ON")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("DATABASE")]),t._v(" nbxplorer "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("TO")]),t._v(" nbxplorer"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),s("p",[t._v("Exit")]),t._v(" "),s("div",{staticClass:"language- extra-class"},[s("pre",{pre:!0,attrs:{class:"language-text"}},[s("code",[t._v("postgres=#\\q\n")])])]),s("h5",{attrs:{id:"4-create-a-configuration-file"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#4-create-a-configuration-file"}},[t._v("#")]),t._v(" 4. Create a configuration file")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("vi")]),t._v(" nbxplorer.config\n")])])]),s("div",{staticClass:"language- extra-class"},[s("pre",{pre:!0,attrs:{class:"language-text"}},[s("code",[t._v("### Database ###\npostgres=User ID=nbxplorer;Password=urpassword;Application Name=nbxplorer;MaxPoolSize=20;Host=localhost;Port=5432;Database=nbxplorer;\n")])])]),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("mkdir")]),t._v(" /etc/nbxplorer\n~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("cp")]),t._v(" nbxplorer.config /etc/nbxplorer\n~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("chmod")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("644")]),t._v(" /etc/nbxplorer/nbxplorer.config\n")])])]),s("p",[t._v("Note: If you previously used a "),s("code",[t._v("dbtrie")]),t._v(" backend for NBXplorer, but want to switch to postgres, "),s("a",{attrs:{href:"https://github.com/dgarage/NBXplorer/blob/master/docs/Postgres-Migration.md",target:"_blank",rel:"noopener noreferrer"}},[t._v("read this documentation"),s("OutboundLink")],1),t._v(".")]),t._v(" "),s("h5",{attrs:{id:"5-create-a-systemd-service-2"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#5-create-a-systemd-service-2"}},[t._v("#")]),t._v(" 5. Create a systemd service")]),t._v(" "),s("p",[t._v("An example "),s("strong",[t._v("systemd service")]),t._v(" file is shown below. Adjust the paths, User and Group accordingly.")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("vi")]),t._v(" nbxplorer.service\n")])])]),s("div",{staticClass:"language- extra-class"},[s("pre",{pre:!0,attrs:{class:"language-text"}},[s("code",[t._v("[Unit]\nDescription=NBXplorer daemon\nRequires=bitcoind.service\nAfter=bitcoind.service\n\n[Service]\nWorkingDirectory=/home/admin/src/NBXplorer\nExecStart=/home/admin/src/NBXplorer/run.sh --conf=/etc/nbxplorer/nbxplorer.config\nUser=admin\nGroup=admin\nType=simple\nPIDFile=/run/nbxplorer/nbxplorer.pid\nRestart=on-failure\n\n[Install]\nWantedBy=multi-user.target\n")])])]),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("cp")]),t._v(" nbxplorer.service /etc/systemd/system\n~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" systemctl "),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("enable")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("--now")]),t._v(" nbxplorer\n")])])]),s("h5",{attrs:{id:"check-5"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#check-5"}},[t._v("#")]),t._v(" Check")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" journalctl "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-xe")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("--unit")]),t._v(" nbxplorer "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("--follow")]),t._v("\nMay "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("23")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("19")]),t._v(":13:35 btc run.sh"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("8065")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(": info: Configuration: Data Directory: /home/admin/.nbxplorer/Main\nMay "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("23")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("19")]),t._v(":13:35 btc run.sh"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("8065")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(": info: Configuration: Configuration File: /home/admin/.nbxplorer/Main/settings.config\nMay "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("23")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("19")]),t._v(":13:35 btc run.sh"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("8065")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(": info: Configuration: Network: Mainnet\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("..")]),t._v(".\nMay "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("23")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("19")]),t._v(":20:04 btc run.sh"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("8065")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(": info: Events: BTC: New block 0000000000000000000c405ba5df5f5533359a4393247a0c52d26c458d4dd989 "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("577449")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),s("p",[t._v("If it doesn't start correctly stop the service and run the application directly to get any error messages.")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" systemctl stop nbxplorer\n~$ "),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("cd")]),t._v(" ~"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("pushd")]),t._v(" ./src/NBXplorer"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" ./run.sh"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("popd")]),t._v("\n")])])]),s("h5",{attrs:{id:"update"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#update"}},[t._v("#")]),t._v(" Update")]),t._v(" "),s("p",[t._v("Updating could break things. Be careful on a live system.")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# Stop the service")]),t._v("\n~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" systemctl stop nbxplorer\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# Checkout and build latest tag")]),t._v("\n~$ "),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("cd")]),t._v(" ~"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("pushd")]),t._v(" ~/src/NBXplorer"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("git")]),t._v(" fetch "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("--tags")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("&&")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("git")]),t._v(" checkout "),s("span",{pre:!0,attrs:{class:"token variable"}},[s("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$(")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("git")]),t._v(" tag "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("--sort")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-version:refname")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("|")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("awk")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'match($0, /^v[0-9]+\\./)'")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("|")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("head")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-n")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token variable"}},[t._v(")")])]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("&&")]),t._v(" ./build.sh"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("popd")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# Restart the service")]),t._v("\n~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" systemctl start nbxplorer\n")])])]),s("h5",{attrs:{id:"migration"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#migration"}},[t._v("#")]),t._v(" Migration")]),t._v(" "),s("p",[t._v("With BTCPay Server v1.5 we "),s("a",{attrs:{href:"https://blog.btcpayserver.org/nbxplorer-postgres/",target:"_blank",rel:"noopener noreferrer"}},[t._v("improved NBXplorer by switching to Postgres"),s("OutboundLink")],1),t._v(".\nIf you are still using the DBTrie based version, please consider "),s("a",{attrs:{href:"https://github.com/dgarage/NBXplorer/blob/master/docs/Postgres-Migration.md",target:"_blank",rel:"noopener noreferrer"}},[t._v("migrating NBXplorer"),s("OutboundLink")],1),t._v(".")]),t._v(" "),s("p",[t._v("Afterwards you need to set "),s("code",[t._v("BTCPAY_EXPLORERPOSTGRES")]),t._v(" to the same connection string as NBXplorer.")]),t._v(" "),s("h2",{attrs:{id:"btcpay-server"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#btcpay-server"}},[t._v("#")]),t._v(" BTCPay Server")]),t._v(" "),s("p",[t._v("Like NBXplorer the BTCPay Server application is also .NET Core. The install steps assume .NET Core was previosuly installed.")]),t._v(" "),s("h5",{attrs:{id:"install-6"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#install-6"}},[t._v("#")]),t._v(" Install")]),t._v(" "),s("h5",{attrs:{id:"1-build-btcpay-server"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#1-build-btcpay-server"}},[t._v("#")]),t._v(" 1. Build BTCPay Server")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("~$ "),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("cd")]),t._v(" ~"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("mkdir")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-p")]),t._v(" src"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("cd")]),t._v(" src\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# Clone the repository")]),t._v("\n~/src$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("git")]),t._v(" clone https://github.com/btcpayserver/btcpayserver.git\n~/src$ "),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("cd")]),t._v(" btcpayserver\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# Checkout latest tag")]),t._v("\n~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("git")]),t._v(" checkout "),s("span",{pre:!0,attrs:{class:"token variable"}},[s("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$(")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("git")]),t._v(" tag "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("--sort")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-version:refname")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("|")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("awk")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'match($0, /^v[0-9]+\\.[0-9]+\\.[0-9]+$/)'")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("|")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("head")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-n")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token variable"}},[t._v(")")])]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# Build the app")]),t._v("\n~/src/btcpayserver$ ./build.sh\n")])])]),s("h5",{attrs:{id:"2-create-postgresql-database"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#2-create-postgresql-database"}},[t._v("#")]),t._v(" 2. Create Postgresql Database")]),t._v(" "),s("p",[t._v("By default BTCPay Server will store data in a single SQLite file. A more robust option is to use "),s("strong",[t._v("Postgresql")]),t._v(" which requires the appropriate database and user to exist.")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-u")]),t._v(" postgres psql\n")])])]),s("p",[t._v("Then execute")]),t._v(" "),s("div",{staticClass:"language-sql extra-class"},[s("pre",{pre:!0,attrs:{class:"language-sql"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("CREATE")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("DATABASE")]),t._v(" btcpay TEMPLATE "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'template0'")]),t._v(" LC_CTYPE "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'C'")]),t._v(" LC_COLLATE "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'C'")]),t._v(" ENCODING "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'UTF8'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("CREATE")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("USER")]),t._v(" btcpay "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("WITH")]),t._v(" ENCRYPTED PASSWORD "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'urpassword'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("GRANT")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("ALL")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("PRIVILEGES")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("ON")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("DATABASE")]),t._v(" btcpay "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("TO")]),t._v(" btcpay"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),s("p",[t._v("Exit")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[s("span",{pre:!0,attrs:{class:"token assign-left variable"}},[t._v("postgres")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("#\\q")]),t._v("\n")])])]),s("h5",{attrs:{id:"3-create-a-configuration-file"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#3-create-a-configuration-file"}},[t._v("#")]),t._v(" 3. Create a configuration file")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("vi")]),t._v(" btcpay.config\n")])])]),s("div",{staticClass:"language- extra-class"},[s("pre",{pre:!0,attrs:{class:"language-text"}},[s("code",[t._v("### Database ###\npostgres=User ID=btcpay;Password=urpassword;Application Name=btcpayserver;Host=localhost;Port=5432;Database=btcpay;\nexplorer.postgres=User ID=nbxplorer;Password=urpassword;Application Name=nbxplorer;MaxPoolSize=20;Host=localhost;Port=5432;Database=nbxplorer;\n")])])]),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("mkdir")]),t._v(" /etc/btcpay\n~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("cp")]),t._v(" btcpay.config /etc/btcpay\n~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("chmod")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("644")]),t._v(" /etc/btcpay/btcpay.config\n")])])]),s("h5",{attrs:{id:"4-create-a-systemd-service"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#4-create-a-systemd-service"}},[t._v("#")]),t._v(" 4. Create a systemd service")]),t._v(" "),s("p",[t._v("An example "),s("strong",[t._v("systemd service")]),t._v(" file is shown below. Adjust the paths, User and Group accordingly.")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("vi")]),t._v(" btcpay.service\n")])])]),s("div",{staticClass:"language- extra-class"},[s("pre",{pre:!0,attrs:{class:"language-text"}},[s("code",[t._v('[Unit]\nDescription=BTCPay Server\nRequires=nbxplorer.service\nAfter=nbxplorer.service\n\n[Service]\nWorkingDirectory=/home/admin/src/btcpayserver\nEnvironment=BTCPAY_BTCEXTERNALRTL="server=https://mainnet.demo.btcpayserver.org/rtl;cookiefile=/var/lib/rtl/.cookie"\nExecStart=/home/admin/src/btcpayserver/run.sh --conf=/etc/btcpay/btcpay.config\nUser=admin\nGroup=admin\nType=simple\nPIDFile=/run/btcpayserver/btcpayserver.pid\nRestart=on-failure\n\n[Install]\nWantedBy=multi-user.target\n')])])]),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("cp")]),t._v(" btcpay.service /etc/systemd/system\n~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" systemctl "),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("enable")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("--now")]),t._v(" btcpay\n")])])]),s("h5",{attrs:{id:"check-6"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#check-6"}},[t._v("#")]),t._v(" Check")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" journalctl "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-xe")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("--unit")]),t._v(" btcpay "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("--follow")]),t._v("\n-- The start-up result is RESULT.\nMay "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("23")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("20")]),t._v(":01:25 btc run.sh"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("10263")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(": info: Configuration: Data Directory: /home/admin/.btcpayserver/Main\nMay "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("23")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("20")]),t._v(":01:25 btc run.sh"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("10263")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(": info: Configuration: Configuration File: /etc/btcpay/btcpay.config\nMay "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("23")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("20")]),t._v(":01:25 btc run.sh"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("10263")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(": info: Configuration: Network: Mainnet\n")])])]),s("p",[t._v("If it doesn't start correctly stop the service and run the application directly to get any error messages.")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" systemctl stop btcpay\n~$ "),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("cd")]),t._v(" ~"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("pushd")]),t._v(" ~/src/btcpayserver"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" ./run.sh "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("--conf")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v("/etc/btcpay/btcpay.config"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("popd")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),s("p",[t._v("An example of checking information in the database.")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-u")]),t._v(" postgres psql\n"),s("span",{pre:!0,attrs:{class:"token assign-left variable"}},[t._v("postgres")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# \\connect btcpay;")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token assign-left variable"}},[t._v("btcpay")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# \\dt")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token assign-left variable"}},[t._v("btcpay")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v('# select * from "Invoices";')]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token assign-left variable"}},[t._v("btcpay")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# \\q")]),t._v("\n")])])]),s("p",[t._v('Attempting to open your BTCPay Server domain in a browser now should show the "Welcome to your BTCPay Server" page.\nIf you are not using a Lightning Node this is the end of the install.')]),t._v(" "),s("h5",{attrs:{id:"update-2"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#update-2"}},[t._v("#")]),t._v(" Update")]),t._v(" "),s("p",[t._v("Updating could break things. Be careful on a live system.")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# Stop the service")]),t._v("\n~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" systemctl stop btcpay\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# Checkout and build latest tag")]),t._v("\n~$ "),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("cd")]),t._v(" ~"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("pushd")]),t._v(" ~/src/btcpayserver"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("git")]),t._v(" fetch "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("--tags")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("&&")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("git")]),t._v(" checkout "),s("span",{pre:!0,attrs:{class:"token variable"}},[s("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$(")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("git")]),t._v(" tag "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("--sort")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-version:refname")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("|")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("awk")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'match($0, /^v[0-9]+\\.[0-9]+\\.[0-9]+$/)'")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("|")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("head")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-n")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token variable"}},[t._v(")")])]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("&&")]),t._v(" ./build.sh"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("popd")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# Restart the service")]),t._v("\n~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" systemctl start btcpay\n")])])]),s("h2",{attrs:{id:"lightning-network-daemon-lnd"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#lightning-network-daemon-lnd"}},[t._v("#")]),t._v(" Lightning Network Daemon (LND)")]),t._v(" "),s("h5",{attrs:{id:"install-7"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#install-7"}},[t._v("#")]),t._v(" Install")]),t._v(" "),s("p",[t._v("Full "),s("a",{attrs:{href:"https://github.com/lightningnetwork/lnd/blob/master/docs/INSTALL.md",target:"_blank",rel:"noopener noreferrer"}},[t._v("instructions"),s("OutboundLink")],1),t._v(".")]),t._v(" "),s("h5",{attrs:{id:"1-install-go"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#1-install-go"}},[t._v("#")]),t._v(" 1. Install Go")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("apt")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("install")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("make")]),t._v("\n~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("wget")]),t._v(" https://dl.google.com/go/go1.13.linux-amd64.tar.gz\n~$ sha256sum go1.13.linux-amd64.tar.gz\n68a2297eb099d1a76097905a2ce334e3155004ec08cdea85f24527be3c48e856 go1.13.linux-amd64.tar.gz\n~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("tar")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-C")]),t._v(" /usr/local "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-xzf")]),t._v(" go1.13.linux-amd64.tar.gz\n~$ "),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("export")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token assign-left variable"}},[s("span",{pre:!0,attrs:{class:"token environment constant"}},[t._v("PATH")])]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token environment constant"}},[t._v("$PATH")]),t._v(":/usr/local/go/bin\n~$ "),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("export")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token assign-left variable"}},[t._v("GOPATH")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=~")]),t._v("/gocode\n~$ "),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("export")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token assign-left variable"}},[s("span",{pre:!0,attrs:{class:"token environment constant"}},[t._v("PATH")])]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token environment constant"}},[t._v("$PATH")]),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v(":")]),s("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$GOPATH")]),t._v("/bin\n~$ go version\ngo version go1.13 linux/amd64\n")])])]),s("h5",{attrs:{id:"2-build-and-install-lnd"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#2-build-and-install-lnd"}},[t._v("#")]),t._v(" 2. Build and install LND")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("~$ "),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("cd")]),t._v(" ~"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("mkdir")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-p")]),t._v(" src"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("cd")]),t._v(" src\n~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("git")]),t._v(" clone https://github.com/lightningnetwork/lnd\n~$ "),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("cd")]),t._v(" lnd\n~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("make")]),t._v("\n~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("make")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("install")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# installs to a directory in $GOPATH/bin")]),t._v("\n~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("cp")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$GOPATH")]),t._v("/bin/lnd "),s("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$GOPATH")]),t._v("/bin/lncli /usr/bin\n~$ lnd "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("--version")]),t._v("\nlnd version "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0.10")]),t._v(".99-beta "),s("span",{pre:!0,attrs:{class:"token assign-left variable"}},[t._v("commit")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v("clock/v1.0.0-229-ge64e71d86dc1ac716c30a80f85a22e8fb544697f\n")])])]),s("h5",{attrs:{id:"3-create-a-symbolic-link-to-the-bitcoin-configuration-file"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#3-create-a-symbolic-link-to-the-bitcoin-configuration-file"}},[t._v("#")]),t._v(" 3. Create a symbolic link to the Bitcoin configuration file")]),t._v(" "),s("p",[t._v("lnd looks for bitcoin.conf in a specific location to get necessary RPC and zeromq details.")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("ln")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-s")]),t._v(" ~/.bitcoin/bitcoin.conf /etc/bitcoin/bitcoin.conf\n")])])]),s("h5",{attrs:{id:"4-create-a-configuration-file-2"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#4-create-a-configuration-file-2"}},[t._v("#")]),t._v(" 4. Create a configuration file")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("vi")]),t._v(" lnd.conf\n")])])]),s("div",{staticClass:"language- extra-class"},[s("pre",{pre:!0,attrs:{class:"language-text"}},[s("code",[t._v("[Application Options]\ndatadir=/var/lib/lnd/data\ntlscertpath=/var/lib/lnd/tls.cert\ntlskeypath=/var/lib/lnd/tls.key\nlogdir=/var/lib/lnd/logs\nmaxlogfiles=3\nmaxlogfilesize=10\n#externalip=1.1.1.1 # change to your public IP address if required.\nalias=i_luv_btcpay\nlisten=0.0.0.0:9735\n\n[Bitcoin]\nbitcoin.active=1\nbitcoin.node=bitcoind\nbitcoin.mainnet=true\n\n[tor]\ntor.active=true\ntor.v3=true\n")])])]),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("mkdir")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-p")]),t._v(" /etc/lnd\n~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("mkdir")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-p")]),t._v(" /var/lib/lnd\n~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("chown")]),t._v(" admin:admin "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-R")]),t._v(" /var/lib/lnd\n~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("cp")]),t._v(" lnd.conf /etc/lnd\n~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("chmod")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("644")]),t._v(" /etc/lnd/lnd.conf\n")])])]),s("h5",{attrs:{id:"5-create-a-systemd-service-3"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#5-create-a-systemd-service-3"}},[t._v("#")]),t._v(" 5. Create a systemd service")]),t._v(" "),s("p",[t._v("An example "),s("strong",[t._v("systemd service")]),t._v(" file is shown below. Adjust the paths, User and Group accordingly.")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("vi")]),t._v(" lnd.service\n")])])]),s("div",{staticClass:"language- extra-class"},[s("pre",{pre:!0,attrs:{class:"language-text"}},[s("code",[t._v("[Unit]\nDescription=LND Lightning Network Daemon\nRequires=bitcoind.service\nAfter=bitcoind.service\n\n[Service]\nExecStart=/usr/bin/lnd --configfile=/etc/lnd/lnd.conf\nExecStop=/usr/bin/lncli --lnddir /var/lib/lnd stop\nPIDFile= /run/lnd/lnd.pid\n\nUser=admin\nGroup=admin\n\nType=simple\nKillMode=process\nTimeoutStartSec=60\nTimeoutStopSec=60\nRestart=always\nRestartSec=60\n\n[Install]\nWantedBy=multi-user.target\n")])])]),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("cp")]),t._v(" lnd.service /etc/systemd/system\n~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" systemctl "),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("enable")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("--now")]),t._v(" lnd\n")])])]),s("h5",{attrs:{id:"configuration-4"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#configuration-4"}},[t._v("#")]),t._v(" Configuration")]),t._v(" "),s("div",{staticClass:"custom-block danger"},[s("p",{staticClass:"custom-block-title"},[t._v("DANGER")]),t._v(" "),s("p",[s("strong",[t._v("Running a Bitcoin Lightning daemon requires a hot wallet on your BTCPay Server.")])])]),t._v(" "),s("p",[t._v("With Bitcoin the protocol has evolved and deterministic key derivation means the keys for your wallet can be kept in a different location to the BTCPay Server. Lightning daemons do not have this facility. Any Bitcoins committed or received in your lightning channels are controlled by private keys that are on your BTCPay Server.")]),t._v(" "),s("h5",{attrs:{id:"1-create-a-symbolic-link-to-the-lnd-data-directory"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#1-create-a-symbolic-link-to-the-lnd-data-directory"}},[t._v("#")]),t._v(" 1. Create a symbolic link to the lnd data directory")]),t._v(" "),s("p",[t._v("The install steps above use "),s("code",[t._v("/var/lib/lnd")]),t._v(" as the data directory rather than the default "),s("code",[t._v("/home/user/.lnd")]),t._v(". In order to save typing when using the "),s("code",[t._v("lncli")]),t._v(" client it's useful to add a symbolic directory link.")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[s("span",{pre:!0,attrs:{class:"token function"}},[t._v("ln")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-s")]),t._v(" /var/lib/lnd .lnd\n")])])]),s("h5",{attrs:{id:"2-create-lightning-wallet"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#2-create-lightning-wallet"}},[t._v("#")]),t._v(" 2. Create Lightning wallet")]),t._v(" "),s("p",[t._v("The first time the lnd is started a new wallet must be created and the backup seed safely recorded (if someone else gets your seed they can steal your funds so keep it safe).")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("~$ lncli create\nInput wallet password:\nConfirm password:\n\nDo you have an existing cipher seed mnemonic you want to use? "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("Enter y/n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(": n\n\nYour cipher seed can optionally be encrypted.\nInput your passphrase "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" you wish to encrypt it "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("or press enter to proceed without a cipher seed passphrase"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(":\n\nGenerating fresh cipher seed"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("..")]),t._v(".\n\n"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!")]),t._v("YOU MUST WRITE DOWN THIS SEED TO BE ABLE TO RESTORE THE WALLET"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!")]),t._v("\n---------------BEGIN LND CIPHER SEED---------------\n "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),t._v(". above "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),t._v(". catch "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("3")]),t._v(". start "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("4")]),t._v(". tape\n "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("5")]),t._v(". sound "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("6")]),t._v(". friend "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("7")]),t._v(". water "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("8")]),t._v(". royal\n "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("9")]),t._v(". solid "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("10")]),t._v(". poet "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("11")]),t._v(". wisdom "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("12")]),t._v(". match\n"),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("13")]),t._v(". virtual "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("14")]),t._v(". zero "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("15")]),t._v(". slender "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("16")]),t._v(". thrive\n"),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("17")]),t._v(". idle "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("18")]),t._v(". catch "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("19")]),t._v(". robot "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("20")]),t._v(". clay\n"),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("21")]),t._v(". resemble "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("22")]),t._v(". angry "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("23")]),t._v(". work "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("24")]),t._v(". "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("until")]),t._v("\n---------------END LND CIPHER SEED-----------------\n\n"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!")]),t._v("YOU MUST WRITE DOWN THIS SEED TO BE ABLE TO RESTORE THE WALLET"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!")]),t._v("\n\nlnd successfully initialized"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!")]),t._v("\n")])])]),s("p",[t._v("Note that if the symbolic directory link from the previous step "),s("strong",[t._v("was not")]),t._v(" created the command is:")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("lncli "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("--lnddir")]),t._v(" /var/lib/lnd create\n")])])]),s("h5",{attrs:{id:"3-unlock-the-wallet"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#3-unlock-the-wallet"}},[t._v("#")]),t._v(" 3. Unlock the wallet")]),t._v(" "),s("p",[t._v("Every time lnd is restarted the wallet "),s("strong",[t._v("needs to be unlocked")]),t._v(". This is not ideal for a BTCPay Server that can is designed to run unattended but Lighting is still in its infancy.")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("~$ lncli unlock\n")])])]),s("h5",{attrs:{id:"check-7"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#check-7"}},[t._v("#")]),t._v(" Check")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("~$ lncli getinfo\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"version"')]),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"0.10.99-beta commit=clock/v1.0.0-229-ge64e71d86dc1ac716c30a80f85a22e8fb544697f"')]),t._v(",\n "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"commit_hash"')]),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"e64e71d86dc1ac716c30a80f85a22e8fb544697f"')]),t._v(",\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("..")]),t._v(".\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),s("p",[t._v("Check the service:")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" journalctl "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-xe")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("--unit")]),t._v(" lnd "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("--follow")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("..")]),t._v(".\nJul "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("27")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("15")]),t._v(":46:29 ubuntu lnd"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("654474")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(": "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("2020")]),t._v("-07-27 "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("15")]),t._v(":46:29.909 "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("INF"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" DISC: Attempting to bootstrap with: BOLT-0010 DNS Seed: "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("nodes.lightning.directory soa.nodes.lightning.directory"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("lseed.bitcoinstats.com "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\nJul "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("27")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("15")]),t._v(":49:41 ubuntu lnd"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("654474")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(": "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("2020")]),t._v("-07-27 "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("15")]),t._v(":49:41.939 "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("INF"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" DISC: Attempting to bootstrap with: Authenticated Channel Graph\nJul "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("27")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("15")]),t._v(":49:41 ubuntu lnd"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("654474")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(": "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("2020")]),t._v("-07-27 "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("15")]),t._v(":49:41.940 "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("ERR"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" SRVR: Unable to retrieve initial bootstrap peers: no addresses found\n")])])]),s("p",[t._v("The "),s("strong",[t._v("Lightning Node Connection String")]),t._v(" to use with "),s("code",[t._v("BTCPay Server")]),t._v(" is:")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[s("span",{pre:!0,attrs:{class:"token assign-left variable"}},[t._v("type")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v("lnd-rest"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),s("span",{pre:!0,attrs:{class:"token assign-left variable"}},[t._v("server")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v("https://127.0.0.1:8080/"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),s("span",{pre:!0,attrs:{class:"token assign-left variable"}},[t._v("macaroonfilepath")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v("/home/admin/.lnd/data/chain/bitcoin/mainnet/admin.macaroon"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),s("span",{pre:!0,attrs:{class:"token assign-left variable"}},[t._v("allowinsecure")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v("true\n")])])]),s("h5",{attrs:{id:"add-lnd-as-internal-node"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#add-lnd-as-internal-node"}},[t._v("#")]),t._v(" Add LND as internal node")]),t._v(" "),s("p",[t._v("To add LND as internal node you have to edit the "),s("a",{attrs:{href:"#3-create-a-configuration-file"}},[t._v("btcpay.config file")]),t._v(":")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("cd")]),t._v(" /etc/btcpay\n"),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("vi")]),t._v(" btcpay.config\n")])])]),s("p",[t._v("Right below the database part, add the "),s("code",[t._v("BTC.lightning")]),t._v(" setting:")]),t._v(" "),s("div",{staticClass:"language- extra-class"},[s("pre",{pre:!0,attrs:{class:"language-text"}},[s("code",[t._v("### Lightning ###\nBTC.lightning=type=lnd-rest;server=https://127.0.0.1:8080/;macaroonfilepath=/home/admin/.lnd/data/chain/bitcoin/mainnet/admin.macaroon;allowinsecure=true\n")])])]),s("p",[t._v('See the "Use custom node" view on the Lightning node connection setting screen in BTCPay Server for details on the connection string.')]),t._v(" "),s("p",[t._v("You need to restart BTCPay Server for the settings update to take effect:")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" systemctl restart btcpay\n")])])]),s("h5",{attrs:{id:"check-tor-and-lnd"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#check-tor-and-lnd"}},[t._v("#")]),t._v(" Check Tor and LND")]),t._v(" "),s("p",[t._v("As with the Bitcoin daemon if Tor is installed and the configuration file enables it (the one above does) then "),s("code",[t._v("lnd")]),t._v(" will automatically register an onion address. In lnd's case torv3 addresses are supported.")]),t._v(" "),s("p",[t._v("The torv3 onion address below is a lot longer than the torv2 one from the Bitcoin daemon section (16 characters compared to 56 characters).")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("~$ lncli getinfo "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("|")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("grep")]),t._v(" onion\n"),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"029b0e3c05595074afcffdca0fb22fb68a95a9c4698dd20962f647de4891eceabd@liyuvwbbycrvvuzcrsd5rq7svwckabejlsymcxiwzkj3smvlwcsqpjyd.onion:9735"')]),t._v("\n")])])]),s("p",[t._v("The Tor address created by lnd can be used to connect to other Lighting peers on the Tor network. The Tor address can work in parallel with an IPv4 or IPv6 address. To register one of those make sure the "),s("code",[t._v("externalip")]),t._v(" is set in the lnd configuration file.")]),t._v(" "),s("h5",{attrs:{id:"update-3"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#update-3"}},[t._v("#")]),t._v(" Update")]),t._v(" "),s("p",[t._v("Updating could break things. Be careful on a live system.")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" systemctl stop lnd\n~$ "),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("export")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token assign-left variable"}},[s("span",{pre:!0,attrs:{class:"token environment constant"}},[t._v("PATH")])]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token environment constant"}},[t._v("$PATH")]),t._v(":/usr/local/go/bin\n~$ "),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("export")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token assign-left variable"}},[t._v("GOPATH")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=~")]),t._v("/gocode\n~$ "),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("export")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token assign-left variable"}},[s("span",{pre:!0,attrs:{class:"token environment constant"}},[t._v("PATH")])]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token environment constant"}},[t._v("$PATH")]),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v(":")]),s("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$GOPATH")]),t._v("/bin\n~$ "),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("cd")]),t._v(" ~/src/lnd\n~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("git")]),t._v(" pull\n~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("make")]),t._v("\n~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("make")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("install")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# installs to a directory in $GOPATH/bin")]),t._v("\n~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("cp")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$GOPATH")]),t._v("/bin/lnd "),s("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$GOPATH")]),t._v("/bin/lncli /usr/bin\n~$ lnd "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("--version")]),t._v("\nlnd version "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0.10")]),t._v(".99-beta "),s("span",{pre:!0,attrs:{class:"token assign-left variable"}},[t._v("commit")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v("clock/v1.0.0-229-ge64e71d86dc1ac716c30a80f85a22e8fb544697f\n~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" systemctl start lnd\n")])])]),s("p",[t._v("After the daemon has been restarted the wallet needs to be unlocked:")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("~$ lncli unlock\n")])])]),s("p",[t._v("If "),s("code",[t._v("Ride The Lightning (RTL)")]),t._v(" is installed, see next section, it may have stopped when lnd disappeared so it will also need to be restarted.")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" systemctl start rtl\n")])])]),s("h2",{attrs:{id:"ride-the-lightning-rtl"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#ride-the-lightning-rtl"}},[t._v("#")]),t._v(" Ride The Lightning (RTL)")]),t._v(" "),s("p",[s("strong",[t._v("Ride the Lightning")]),t._v(" is a Node.js application to manage your Lightning peers, channels, wallet etc.")]),t._v(" "),s("p",[t._v("The advantage of the work that has gone into BTCPay Server is that the RTL web page can be controlled and accessed in the same manner as the BTCPay site.")]),t._v(" "),s("h5",{attrs:{id:"install-8"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#install-8"}},[t._v("#")]),t._v(" Install")]),t._v(" "),s("h5",{attrs:{id:"1-install-dependencies"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#1-install-dependencies"}},[t._v("#")]),t._v(" 1. Install dependencies")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("apt")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("install")]),t._v(" nodejs build-essential "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("npm")]),t._v("\n")])])]),s("h5",{attrs:{id:"2-build-rtl"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#2-build-rtl"}},[t._v("#")]),t._v(" 2. Build RTL")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("~$ "),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("cd")]),t._v(" ~/src\n~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("git")]),t._v(" clone https://github.com/Ride-The-Lightning/RTL.git\n~$ "),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("cd")]),t._v(" RTL\n~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("npm")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("install")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("--only")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v("prod\n")])])]),s("h5",{attrs:{id:"3-create-a-configuration-file-2"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#3-create-a-configuration-file-2"}},[t._v("#")]),t._v(" 3. Create a configuration file")]),t._v(" "),s("p",[t._v("Copy the sample config file from "),s("code",[t._v("sample-RTL-Config.json")]),t._v(" and adjust accordingly. An example that works with the rest of the instructions in this document is shown below.")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("cp")]),t._v(" src/RTL/sample-RTL-Config.json RTL-Config.json\n~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("vi")]),t._v(" RTL-Config.json\n")])])]),s("div",{staticClass:"language-json extra-class"},[s("pre",{pre:!0,attrs:{class:"language-json"}},[s("code",[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"port"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"3000"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"defaultNodeIndex"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"SSO"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"rtlSSO"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"rtlCookiePath"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"/var/lib/rtl/.cookie"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" # Needs to match the value in BTCPay systemd settings.\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"logoutRedirectLink"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"https://mainnet.demo.btcpayserver.org/login"')]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"nodes"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"index"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"lnNode"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Node 1"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"lnImplementation"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"LND"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"Authentication"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"macaroonPath"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"/var/lib/lnd/data/chain/bitcoin/mainnet"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"configPath"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"/etc/lnd/lnd.conf"')]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"Settings"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"userPersona"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"MERCHANT"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"themeMode"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"DAY"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"themeColor"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"PURPLE"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"channelBackupPath"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"/home/admin/rtl/backup/node-1"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"enableLogging"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("false")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"lnServerUrl"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"https://localhost:8080/v1"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"swapServerUrl"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"http://localhost:8081/v1"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"fiatConversion"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("false")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),s("p",[t._v("Note that RTL has different behaviour and requirements compared to the other services documented in theses instructions, specifically:")]),t._v(" "),s("ol",[s("li",[t._v("The configuration file needs to exist in RTL's data directory,")]),t._v(" "),s("li",[t._v("The RTL process may write update to the configuration file.")])]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("mkdir")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-p")]),t._v(" /var/lib/rtl\n~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("cp")]),t._v(" ~/RTL-Config.json /var/lib/rtl\n~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("chown")]),t._v(" admin:admin "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-R")]),t._v(" /var/lib/rtl\n~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("chmod")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("644")]),t._v(" /var/lib/rtl/RTL-Config.json\n")])])]),s("h5",{attrs:{id:"4-create-a-systemd-service-2"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#4-create-a-systemd-service-2"}},[t._v("#")]),t._v(" 4. Create a systemd service")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("vi")]),t._v(" rtl.service\n")])])]),s("div",{staticClass:"language- extra-class"},[s("pre",{pre:!0,attrs:{class:"language-text"}},[s("code",[t._v('[Unit]\nDescription=Ride The Lightning\nRequires=lnd.service\nAfter=lnd.service\n\n[Service]\nEnvironment="RTL_CONFIG_PATH=/var/lib/rtl"\nWorkingDirectory=/var/lib/rtl\nExecStart=/usr/bin/node /home/admin/src/RTL/rtl\nUser=admin\nGroup=admin\nType=simple\nPIDFile=/run/rtl/rtl.pid\nRestart=on-failure\n\n[Install]\nWantedBy=multi-user.target\n')])])]),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("cp")]),t._v(" rtl.service /etc/systemd/system\n~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" systemctl "),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("enable")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("--now")]),t._v(" rtl\n")])])]),s("h5",{attrs:{id:"check-8"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#check-8"}},[t._v("#")]),t._v(" Check")]),t._v(" "),s("p",[t._v("Check the service:")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" journalctl "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-xe")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("--unit")]),t._v(" rtl "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("--follow")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("..")]),t._v(".\nJul "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("27")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("18")]),t._v(":27:52 ubuntu node"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("988638")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(": Server is up and running, please "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("open")]),t._v(" the UI at http://localhost:3000\n")])])]),s("p",[t._v("If it doesn't start correctly stop the service and run the application directly to get any error messages.")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" systemctl stop rtl\n~$ "),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("export")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token assign-left variable"}},[t._v("RTL_CONFIG_PATH")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v("/var/lib/rtl"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("pushd")]),t._v(" ~/src/RTL"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("node")]),t._v(" rtl"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("popd")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\nServer is up and running, please "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("open")]),t._v(" the UI at http://localhost:3000\n")])])]),s("p",[t._v("From the "),s("code",[t._v("BTCPay Server")]),t._v(" web page the "),s("code",[t._v("RTL")]),t._v(" interface should be accessible from "),s("code",[t._v("Server Settings->Services")]),t._v(' under the "Crypto services exposed by your server" heading.')]),t._v(" "),s("h5",{attrs:{id:"update-4"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#update-4"}},[t._v("#")]),t._v(" Update")]),t._v(" "),s("p",[t._v("Updating could break things. Be careful on a live system.")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" systemctl stop rtl\n~$ "),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("cd")]),t._v(" ~"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("pushd")]),t._v(" ~/src/RTL"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("git")]),t._v(" pull"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("npm")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("install")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("popd")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" systemctl start rtl\n")])])]),s("h2",{attrs:{id:"the-end"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#the-end"}},[t._v("#")]),t._v(" The End")]),t._v(" "),s("h3",{attrs:{id:"questions"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#questions"}},[t._v("#")]),t._v(" Questions")]),t._v(" "),s("p",[t._v("Join the "),s("a",{attrs:{href:"https://chat.btcpayserver.org/",target:"_blank",rel:"noopener noreferrer"}},[t._v("community chat"),s("OutboundLink")],1),t._v(" on Mattermost by downloading "),s("a",{attrs:{href:"https://mattermost.com/download/",target:"_blank",rel:"noopener noreferrer"}},[t._v("Mattermost app"),s("OutboundLink")],1),t._v(", or on "),s("a",{attrs:{href:"https://t.me/btcpayserver",target:"_blank",rel:"noopener noreferrer"}},[t._v("Telegram"),s("OutboundLink")],1),t._v(" in case you need further help or help or want to hang around with like-minded people.")])])}),[],!1,null,null,null);s.default=n.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[113],{740:function(t,s,a){"use strict";a.r(s);var e=a(10),n=Object(e.a)({},(function(){var t=this,s=t._self._c;return s("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[s("h1",{attrs:{id:"extended-manual-setup"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#extended-manual-setup"}},[t._v("#")]),t._v(" Extended Manual Setup")]),t._v(" "),s("p",[t._v("This document lists steps for "),s("strong",[t._v("manually deploying BTCPay Server")]),t._v(" and additional related components. Following these steps is likely to take a long time. A shorter and more pragmatic approach is to use a "),s("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver-docker",target:"_blank",rel:"noopener noreferrer"}},[t._v("docker based deployment"),s("OutboundLink")],1),t._v(".")]),t._v(" "),s("p",[t._v("The instructions also build all the application components from source which can be an advantage for certain audit and/or security scenarios.")]),t._v(" "),s("div",{staticClass:"custom-block danger"},[s("p",{staticClass:"custom-block-title"},[t._v("DANGER")]),t._v(" "),s("h4",{attrs:{id:"not-recommended-for-production-use"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#not-recommended-for-production-use"}},[t._v("#")]),t._v(" Not recommended for production use")]),t._v(" "),s("p",[t._v("Manual installation is NOT recommended for production use unless you are very confident with your Operating System and Bitcoin security expertise. If you are unsure use the docker deployment or one of the other "),s("RouterLink",{attrs:{to:"/Deployment/"}},[t._v("deployment options")]),t._v(".")],1),t._v(" "),s("h4",{attrs:{id:"you-must-have-technical-literacy-and-be-able-to-resolve-any-issues-on-your-own-the-community-will-not-provide-extensive-support-for-this-deployment"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#you-must-have-technical-literacy-and-be-able-to-resolve-any-issues-on-your-own-the-community-will-not-provide-extensive-support-for-this-deployment"}},[t._v("#")]),t._v(" You must have technical literacy and be able to resolve any issues on your own. The community will not provide extensive support for this deployment.")])]),t._v(" "),s("h2",{attrs:{id:"installation-steps-overview"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#installation-steps-overview"}},[t._v("#")]),t._v(" Installation Steps Overview")]),t._v(" "),s("p",[t._v("The instructions in this article have been tested on Ubuntu 20.04. They should be applicable to other Linux based distributions. They are also based on all components being on the same host or virtual machine. It is possible to split the components across different hosts but these instructions don't describe that.")]),t._v(" "),s("p",[t._v("An example hostname of "),s("code",[t._v("mainnet.demo.btcpayserver.org")]),t._v(" has been used, it needs to be replaced with the hostname you are using for your BTCPay Server.")]),t._v(" "),s("h3",{attrs:{id:"security"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#security"}},[t._v("#")]),t._v(" Security")]),t._v(" "),s("p",[t._v("If you do use these instructions to install a BTCPay Server connected to the Bitcoin mainnet then at a minimum you should understand how the wallet mechanisms work. It's highly recommended to read the two articles below and ask questions if anything is not clear.")]),t._v(" "),s("ul",[s("li",[s("RouterLink",{attrs:{to:"/FAQ/Wallet/"}},[t._v("BTCPay Wallet FAQ")])],1),t._v(" "),s("li",[s("RouterLink",{attrs:{to:"/LightningNetwork/"}},[t._v("Lightning Network and BTCPay (first section)")])],1)]),t._v(" "),s("p",[t._v("As an additional aid below is a list of iptables rules and instructions which should include all the ports that need to be open. "),s("strong",[t._v("NO WARRANTY")]),t._v(". Use at your own risk, "),s("strong",[t._v("including risk of locking yourself out")]),t._v(".")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("vi")]),t._v(" iptables.txt\n")])])]),s("div",{staticClass:"language- extra-class"},[s("pre",{pre:!0,attrs:{class:"language-text"}},[s("code",[t._v("# Generated by iptables-save v1.6.1 on Mon May 27 18:48:11 2019\n*filter\n:INPUT ACCEPT [0:0]\n:FORWARD ACCEPT [0:0]\n:OUTPUT ACCEPT [0:0]\n-A INPUT -i lo -j ACCEPT\n-A INPUT -p tcp -m tcp --dport 22 -j ACCEPT # SSH\n-A INPUT -p tcp -m tcp --dport 80 -j ACCEPT # BTCPay HTTP\n-A INPUT -p tcp -m tcp --dport 443 -j ACCEPT # BTCPay HTTPS\n-A INPUT -p tcp -m tcp --dport 8333 -j ACCEPT # Bitcoind P2P\n-A INPUT -p tcp -m tcp --dport 9735 -j ACCEPT # Lightning P2P\n-A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT\nCOMMIT\n# Completed on Mon May 27 18:48:11 2019\n")])])]),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" iptables-restore "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v(" iptables.txt\n")])])]),s("p",[t._v("At this point if you are still connected to you ssh session it's a good sign. If not the rules are temporary and you can use whatever mechanism you have to remotely reboot your server and try again.")]),t._v(" "),s("p",[t._v("The rules have now been temporarily applied. To apply the rules automatically each time your server starts use the "),s("code",[t._v("iptables-persistent")]),t._v(" package.")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("apt")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("install")]),t._v(" iptables-persistent\n")])])]),s("p",[t._v("If you subsequently change the iptables rules and want to save them across reboots use the command below.")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" netfilter-persistent save\n")])])]),s("h2",{attrs:{id:"unprivileged-user"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#unprivileged-user"}},[t._v("#")]),t._v(" Unprivileged user")]),t._v(" "),s("p",[t._v("These instructions configure everything to run under an "),s("strong",[t._v("unprivileged user")]),t._v(" called "),s("code",[t._v("admin")]),t._v(". Create this user before proceeding:")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("useradd")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-M")]),t._v(" admin "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("&&")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("usermod")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-L")]),t._v(" admin\n")])])]),s("h3",{attrs:{id:"prerequisites"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#prerequisites"}},[t._v("#")]),t._v(" Prerequisites")]),t._v(" "),s("ul",[s("li",[t._v("Postgresql")]),t._v(" "),s("li",[t._v("Tor")]),t._v(" "),s("li",[t._v("NGINX and Let's Encrypt")])]),t._v(" "),s("h3",{attrs:{id:"application-components"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#application-components"}},[t._v("#")]),t._v(" Application Components")]),t._v(" "),s("ul",[s("li",[t._v("Bitcoin Core"),s("sup",[t._v("1,2")])]),t._v(" "),s("li",[t._v("NBXplorer"),s("sup",[t._v("1,2")])]),t._v(" "),s("li",[t._v("BTCPay Server"),s("sup",[t._v("1,2")])]),t._v(" "),s("li",[t._v("Lightning Network Daemon (LND)"),s("sup",[t._v("2")])]),t._v(" "),s("li",[t._v("Ride The Lightning (RTL)"),s("sup",[t._v("2")])])]),t._v(" "),s("p",[s("sup",[t._v("1")]),t._v(" The bare minimum install of a BTCPay Server only requires these items. Using a bare minimum configuration reduces the functionality: no Lightning payments, no auto-renewal of TLS certificates, less reliable data store, less capable of handling NAT and more.")]),t._v(" "),s("p",[s("sup",[t._v("2")]),t._v(" Built from source code.")]),t._v(" "),s("h2",{attrs:{id:"postgresql"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#postgresql"}},[t._v("#")]),t._v(" Postgresql")]),t._v(" "),s("p",[s("strong",[t._v("Postgresql")]),t._v(" can be used by BTCPay Server in place of the default SQLite file based storage. It's also possible to use MySQL.")]),t._v(" "),s("h5",{attrs:{id:"install"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#install"}},[t._v("#")]),t._v(" Install")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("apt")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("install")]),t._v(" postgresql postgresql-contrib\n")])])]),s("h5",{attrs:{id:"configuration"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#configuration"}},[t._v("#")]),t._v(" Configuration")]),t._v(" "),s("p",[t._v("Covered in BTCPay Server Configuration.")]),t._v(" "),s("h5",{attrs:{id:"check"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#check"}},[t._v("#")]),t._v(" Check")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("~$ psql "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("--version")]),t._v("\npsql "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("PostgreSQL"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("12.2")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("Ubuntu "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("12.2")]),t._v("-4"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" systemctl status postgresql\n~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-u")]),t._v(" postgres psql\npsql "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("12.2")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("Ubuntu "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("12.2")]),t._v("-4"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("))")]),t._v("\nType "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"help"')]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("for")]),t._v(" help.\n\n"),s("span",{pre:!0,attrs:{class:"token assign-left variable"}},[t._v("postgres")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# \\q")]),t._v("\n")])])]),s("h2",{attrs:{id:"tor"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#tor"}},[t._v("#")]),t._v(" Tor")]),t._v(" "),s("p",[s("strong",[t._v("Tor")]),t._v(" can be used by the following components to provide enhanced privacy and/or help with NAT traversal:")]),t._v(" "),s("ul",[s("li",[t._v("Bitcoin Core Daemon")]),t._v(" "),s("li",[t._v("Lightning Network Daemon (LND).")])]),t._v(" "),s("p",[t._v("Additional information running Bitcoin Core with Tor support can be found "),s("a",{attrs:{href:"https://github.com/bitcoin/bitcoin/blob/master/doc/tor.md",target:"_blank",rel:"noopener noreferrer"}},[t._v("here"),s("OutboundLink")],1),t._v(".")]),t._v(" "),s("h5",{attrs:{id:"install-2"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#install-2"}},[t._v("#")]),t._v(" Install")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("apt")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("install")]),t._v(" tor\n")])])]),s("h5",{attrs:{id:"configuration-2"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#configuration-2"}},[t._v("#")]),t._v(" Configuration")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("vi")]),t._v(" /etc/tor/torrc "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# (and uncomment two lines below)")]),t._v("\nControlPort "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("9051")]),t._v("\nCookieAuthentication "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),t._v("\n~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" systemctl restart tor\n")])])]),s("p",[t._v("Covered further in Bitcoin and Lightning Network Daemon sections.")]),t._v(" "),s("h5",{attrs:{id:"check-2"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#check-2"}},[t._v("#")]),t._v(" Check")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("~$ tor "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("--version")]),t._v("\nTor version "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0.4")]),t._v(".2.7\n~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("netstat")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-tlnp")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("|")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("grep")]),t._v(" tor "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# (lines below correspond to the tor control port and SOCKS proxy)")]),t._v("\ntcp "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("127.0")]),t._v(".0.1:9050 "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0.0")]),t._v(".0.0:* LISTEN "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1376")]),t._v("/tor\ntcp "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("127.0")]),t._v(".0.1:9051 "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0.0")]),t._v(".0.0:* LISTEN "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1376")]),t._v("/tor\n")])])]),s("h2",{attrs:{id:"nginx-and-lets-encrypt"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#nginx-and-lets-encrypt"}},[t._v("#")]),t._v(" NGINX and Let's Encrypt")]),t._v(" "),s("p",[s("strong",[t._v("NGINX")]),t._v(" is used as a web server to manage HTTP requests to BTCPay Server and Ride The Lightning. Paired with "),s("strong",[t._v("Let's Encrypt")]),t._v(" it allows seamless procurement and renewal of a TLS certificate for your BTCPay Server instance.")]),t._v(" "),s("p",[t._v("Let's Encrypt is a free service for procuring and renewing TLS certificates. The service comes with scripts that can be installed to automatically manage the whole process.")]),t._v(" "),s("h5",{attrs:{id:"install-3"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#install-3"}},[t._v("#")]),t._v(" Install")]),t._v(" "),s("h5",{attrs:{id:"1-install-nginx"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#1-install-nginx"}},[t._v("#")]),t._v(" 1. Install NGINX.")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("apt")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("install")]),t._v(" nginx\n")])])]),s("h5",{attrs:{id:"2-install-lets-encrypt"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#2-install-lets-encrypt"}},[t._v("#")]),t._v(" 2. Install Let's Encrypt")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("apt")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("install")]),t._v(" certbot python3-certbot-nginx\n")])])]),s("h5",{attrs:{id:"configuration-3"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#configuration-3"}},[t._v("#")]),t._v(" Configuration")]),t._v(" "),s("h5",{attrs:{id:"1-lets-encrypt-tls-certificate"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#1-lets-encrypt-tls-certificate"}},[t._v("#")]),t._v(" 1. Let's Encrypt TLS certificate")]),t._v(" "),s("p",[t._v("You must create an A or AAAA record for "),s("strong",[t._v("")]),t._v(" that points to the IP address of your server instance.\nIf your server is behind NAT then you need to forward port 80 to your instance.")]),t._v(" "),s("p",[t._v("The "),s("strong",[t._v("certbot")]),t._v(" script works by checking for a specific file on the web server hosting the requested domain. If it can't get the file the TLS certificate won't be issued. If the initial attempt fails it will be periodically re-attempted or you can simply re-run the command.")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" certbot "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("--nginx")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-d")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("your domain name"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# (e.g: sudo certbot --nginx -d mainnet.demo.btcpayserver.org)")]),t._v("\n")])])]),s("h5",{attrs:{id:"2-add-nginx-configuration-file"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#2-add-nginx-configuration-file"}},[t._v("#")]),t._v(" 2. Add NGINX configuration file")]),t._v(" "),s("p",[t._v("The configuration file below has been copied from the BTCPay Server docker install.")]),t._v(" "),s("p",[t._v('Search for "mainnet.demo.btcpayserver.org" and replace it with your own domain name.')]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("vi")]),t._v(" /etc/nginx/conf.d/default.conf\n")])])]),s("div",{staticClass:"language- extra-class"},[s("pre",{pre:!0,attrs:{class:"language-text"}},[s("code",[t._v("# If we receive X-Forwarded-Proto, pass it through; otherwise, pass along the\n# scheme used to connect to this server\nmap $http_x_forwarded_proto $proxy_x_forwarded_proto {\n default $http_x_forwarded_proto;\n '' $scheme;\n}\n# If we receive X-Forwarded-Port, pass it through; otherwise, pass along the\n# server port the client connected to\nmap $http_x_forwarded_port $proxy_x_forwarded_port {\n default $http_x_forwarded_port;\n '' $server_port;\n}\n# If we receive Upgrade, set Connection to \"upgrade\"; otherwise, delete any\n# Connection header that may have been passed to this server\nmap $http_upgrade $proxy_connection {\n default upgrade;\n '' close;\n}\n# Apply fix for very long server names\nserver_names_hash_bucket_size 128;\n# Prevent Nginx Information Disclosure\nserver_tokens off;\n# Default dhparam\n# Set appropriate X-Forwarded-Ssl header\nmap $scheme $proxy_x_forwarded_ssl {\n default off;\n https on;\n}\n\ngzip_types text/plain text/css application/javascript application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript;\nlog_format vhost '$host $remote_addr - $remote_user [$time_local] '\n '\"$request\" $status $body_bytes_sent '\n '\"$http_referer\" \"$http_user_agent\"';\naccess_log off;\n# HTTP 1.1 support\nproxy_http_version 1.1;\nproxy_buffering off;\nproxy_set_header Host $http_host;\nproxy_set_header Upgrade $http_upgrade;\nproxy_set_header Connection $proxy_connection;\nproxy_set_header X-Real-IP $remote_addr;\nproxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;\nproxy_set_header X-Forwarded-Proto $proxy_x_forwarded_proto;\nproxy_set_header X-Forwarded-Ssl $proxy_x_forwarded_ssl;\nproxy_set_header X-Forwarded-Port $proxy_x_forwarded_port;\nproxy_buffer_size 128k;\nproxy_buffers 4 256k;\nproxy_busy_buffers_size 256k;\nclient_header_buffer_size 500k;\nlarge_client_header_buffers 4 500k;\n# Mitigate httpoxy attack (see README for details)\nproxy_set_header Proxy \"\";\n\nserver {\n server_name mainnet.demo.btcpayserver.org;\n listen 80;\n access_log /var/log/nginx/access.log vhost;\n return 301 https://$host$request_uri;\n}\nserver {\n client_max_body_size 100M;\n server_name mainnet.demo.btcpayserver.org;\n listen 443 ssl http2 ;\n access_log /var/log/nginx/access.log vhost;\n ssl_protocols TLSv1.2;\n ssl_ciphers 'ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256';\n ssl_prefer_server_ciphers on;\n ssl_session_timeout 5m;\n ssl_session_cache shared:SSL:50m;\n ssl_session_tickets off;\n ssl_certificate /etc/letsencrypt/live/mainnet.demo.btcpayserver.org/cert.pem;\n ssl_certificate_key /etc/letsencrypt/live/mainnet.demo.btcpayserver.org/privkey.pem;\n ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;\n ssl_stapling on;\n ssl_stapling_verify on;\n ssl_trusted_certificate /etc/letsencrypt/live/mainnet.demo.btcpayserver.org/fullchain.pem;\n add_header Strict-Transport-Security \"max-age=31536000\" always;\n #include /etc/nginx/vhost.d/default;\n\n # Here is the main BTCPay Server application\n location / {\n proxy_pass http://127.0.0.1:23000;\n }\n\n # Include the next two stanzas if and only if you want to expose your lightning gRPC & RPC interfaces to the internet\n location /lnrpc.Lightning {\n grpc_pass grpcs://127.0.0.1:10009;\n }\n\n location /lnd-rest/btc/ {\n rewrite ^/lnd-rest/btc/(.*) /$1 break;\n proxy_pass https://127.0.0.1:8080/;\n }\n\n # Include this stanza if you are planning to set up Ride The Lightning (RTL)\n location /rtl/ {\n proxy_pass http://127.0.0.1:3000/rtl/;\n }\n}\n")])])]),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" systemctl restart nginx\n~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" systemctl status nginx\n")])])]),s("p",[t._v("If there is an error message restarting "),s("code",[t._v("nginx")]),t._v(" try:")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" journalctl "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-xe")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("--unit")]),t._v(" nginx\n")])])]),s("h5",{attrs:{id:"check-3"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#check-3"}},[t._v("#")]),t._v(" Check")]),t._v(" "),s("h5",{attrs:{id:"1-check-lets-encrypt"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#1-check-lets-encrypt"}},[t._v("#")]),t._v(" 1. Check Let's Encrypt")]),t._v(" "),s("p",[t._v("It can be a little bit tricky to get everything set up correctly for the Let's Encrypt script to work correctly. Some additional commands are listed below to help with any troubleshooting.")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" certbot certificates\n- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -\nFound the following certs:\n Certificate Name: mainnet.demo.btcpayserver.org\n Domains: mainnet.demo.btcpayserver.org\n Expiry Date: "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("2019")]),t._v("-08-10 "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("18")]),t._v(":00:31+00:00 "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("VALID: "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("79")]),t._v(" days"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n Certificate Path: /etc/letsencrypt/live/mainnet.demo.btcpayserver.org/fullchain.pem\n Private Key Path: /etc/letsencrypt/live/mainnet.demo.btcpayserver.org/privkey.pem\n- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -\n")])])]),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("cat")]),t._v(" /etc/cron.d/certbot "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# (check the cron job exists)")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),t._v(" */12 * * * root "),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("test")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-x")]),t._v(" /usr/bin/certbot "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-a")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("\\")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-d")]),t._v(" /run/systemd/system "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("&&")]),t._v(" perl "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-e")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'sleep int(rand(43200))'")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("&&")]),t._v(" certbot "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-q")]),t._v(" renew\n")])])]),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("tail")]),t._v(" /var/log/letsencrypt/letsencrypt.log "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# (check for problems)")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("2019")]),t._v("-05-22 "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("19")]),t._v(":36:36,062:DEBUG:certbot.main:certbot version: "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0.31")]),t._v(".0\n")])])]),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" certbot renew --dry-run "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# (test renewal)")]),t._v("\n- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -\n** DRY RUN: simulating "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'certbot renew'")]),t._v(" close to cert expiry\n** "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("The "),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("test")]),t._v(" certificates below have not been saved."),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\nCongratulations, all renewals succeeded. The following certs have been renewed:\n /etc/letsencrypt/live/mainnet.demo.btcpayserver.org/fullchain.pem "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("success"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n** DRY RUN: simulating "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'certbot renew'")]),t._v(" close to cert expiry\n** "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("The "),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("test")]),t._v(" certificates above have not been saved."),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -\n")])])]),s("h5",{attrs:{id:"2-check-nginx"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#2-check-nginx"}},[t._v("#")]),t._v(" 2. Check NGINX.")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" nginx "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-v")]),t._v("\nnginx version: nginx/1.18.0 "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("Ubuntu"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("netstat")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-tlnp")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("|")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("grep")]),t._v(" nginx\ntcp "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0.0")]),t._v(".0.0:443 "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0.0")]),t._v(".0.0:* LISTEN "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("266275")]),t._v("/nginx: maste\ntcp "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0.0")]),t._v(".0.0:80 "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0.0")]),t._v(".0.0:* LISTEN "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("266275")]),t._v("/nginx: maste\ntcp6 "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),t._v(" :::443 :::* LISTEN "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("266275")]),t._v("/nginx: maste\ntcp6 "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),t._v(" :::80 :::* LISTEN "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("266275")]),t._v("/nginx: maste\n")])])]),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" journalctl "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-xe")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("--unit")]),t._v(" nginx "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("--follow")]),t._v("\n--\n-- A start job "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("for")]),t._v(" unit nginx.service has finished successfully.\n--\n-- The job identifier is "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("19471")]),t._v(".\n")])])]),s("p",[t._v("Attempt to open your web site in a browser. At this point it is expected that a "),s("code",[t._v("502 Bad Gateway")]),t._v("error will occur. The "),s("code",[t._v("nginx")]),t._v(" logs can be checked to verify that the connection attempt was received.")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("tail")]),t._v(" /var/log/nginx/access.log\nmainnet.demo.btcpayserver.org "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("127.0")]),t._v(".0.1 - - "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("27")]),t._v("/Jul/2020:12:19:57 +0100"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"GET / HTTP/2.0"')]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("502")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("552")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"-"')]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.89 Safari/537.36"')]),t._v("\n")])])]),s("p",[t._v("If there is a problem then the "),s("code",[t._v("nginx")]),t._v(" error log can also be checked.")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("tail")]),t._v(" /var/log/nginx/error.log\n")])])]),s("h2",{attrs:{id:"bitcoin-core"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#bitcoin-core"}},[t._v("#")]),t._v(" Bitcoin Core")]),t._v(" "),s("p",[t._v("The gateway to the Bitcoin network for BTCPay Server components.")]),t._v(" "),s("h5",{attrs:{id:"install-4"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#install-4"}},[t._v("#")]),t._v(" Install")]),t._v(" "),s("p",[t._v("The full instructions to "),s("strong",[t._v("build Bitcoin Core from source")]),t._v(" are "),s("a",{attrs:{href:"https://github.com/bitcoin/bitcoin/blob/master/doc/build-unix.md",target:"_blank",rel:"noopener noreferrer"}},[t._v("here"),s("OutboundLink")],1),t._v(".")]),t._v(" "),s("p",[t._v("The alternative to building from source is to download a signed binary distribution from "),s("a",{attrs:{href:"https://bitcoincore.org/en/download/",target:"_blank",rel:"noopener noreferrer"}},[t._v("https://bitcoincore.org/en/download/"),s("OutboundLink")],1),t._v(".")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("wget")]),t._v(" https://bitcoincore.org/bin/bitcoin-core-0.20.0/bitcoin-0.20.0-x86_64-linux-gnu.tar.gz\n~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("wget")]),t._v(" https://bitcoincore.org/bin/bitcoin-core-0.20.0/SHA256SUMS.asc\n")])])]),s("h5",{attrs:{id:"1-install-pre-requisites-and-dependencies"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#1-install-pre-requisites-and-dependencies"}},[t._v("#")]),t._v(" 1. Install Pre-requisites and dependencies")]),t._v(" "),s("p",[t._v("These instructions do not build the Bitcoin Core GUI components as they are not needed for "),s("code",[t._v("BTCPay Server")]),t._v(".")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("apt")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("install")]),t._v(" build-essential libtool autotools-dev automake pkg-config bsdmainutils python3\n~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("apt")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("install")]),t._v(" libevent-dev libboost-system-dev libboost-filesystem-dev libboost-test-dev libboost-thread-dev libminiupnpc-dev libzmq3-dev\n")])])]),s("h5",{attrs:{id:"2-download-and-build-source"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#2-download-and-build-source"}},[t._v("#")]),t._v(" 2. Download and Build Source")]),t._v(" "),s("p",[t._v("Before cloning the "),s("code",[t._v("Bitcoin Core")]),t._v(' repository identify the most recent stable version. One convenient way to do this is on the GitHub repository page look at the latest version under the "Releases" heading. At the time of writing the stable version is '),s("code",[t._v("0.20.0")]),t._v(". Adjust the tag in the "),s("code",[t._v("git clone")]),t._v(" command below for the stable version you want to build.")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("~$ "),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("cd")]),t._v(" src\n~/src$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("git")]),t._v(" clone "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("--depth")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("--branch")]),t._v(" v0.20.0 https://github.com/bitcoin/bitcoin.git\n~/src$ "),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("cd")]),t._v(" bitcoin\n")])])]),s("p",[t._v("A specific version of the Berkeley DB dependency needs to be installed.")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("~/src/bitcoin$ ./contrib/install_db4.sh "),s("span",{pre:!0,attrs:{class:"token variable"}},[s("span",{pre:!0,attrs:{class:"token variable"}},[t._v("`")]),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("pwd")]),s("span",{pre:!0,attrs:{class:"token variable"}},[t._v("`")])]),t._v("\n")])])]),s("p",[t._v("Use the "),s("code",[t._v("autoconf")]),t._v(" scripts to generate the make files and then build.")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("~/src/bitcoin$ ./autogen.sh\n~/src/bitcoin$ "),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("export")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token assign-left variable"}},[t._v("BDB_PREFIX")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'/home/admin/src/bitcoin/db4'")]),t._v("\n~/src/bitcoin$ ./configure "),s("span",{pre:!0,attrs:{class:"token assign-left variable"}},[t._v("BDB_LIBS")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"-L'),s("span",{pre:!0,attrs:{class:"token variable"}},[t._v("${BDB_PREFIX}")]),t._v('/lib -ldb_cxx-4.8"')]),t._v(" "),s("span",{pre:!0,attrs:{class:"token assign-left variable"}},[t._v("BDB_CFLAGS")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"-I'),s("span",{pre:!0,attrs:{class:"token variable"}},[t._v("${BDB_PREFIX}")]),t._v('/include"')]),t._v("\n~/src/bitcoin$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("make")]),t._v("\n~/src/bitcoin$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("make")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("install")]),t._v("\n~/src/bitcoin$ bitcoind "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-version")]),t._v("\nBitcoin Core version v0.20.0\n")])])]),s("h5",{attrs:{id:"3-create-the-configuration-file"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#3-create-the-configuration-file"}},[t._v("#")]),t._v(" 3. Create the configuration file")]),t._v(" "),s("p",[t._v("An example "),s("strong",[t._v("configuration file")]),t._v(" is available on the Bitcoin Core repository at https://github.com/bitcoin/bitcoin/blob/master/share/examples/bitcoin.conf.")]),t._v(" "),s("p",[t._v("Create a "),s("strong",[t._v("bitcoin.conf file")]),t._v(" to suit your needs. An example file that is suitable for BTCPay Server is shown below. This configuration does not prune blocks which means as of May 2019 you will require 235 GB for the Bitcoin blockchain.")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("vi")]),t._v(" bitcoin.conf\n")])])]),s("div",{staticClass:"language- extra-class"},[s("pre",{pre:!0,attrs:{class:"language-text"}},[s("code",[t._v("server=1 # need RPC for btcpay.\nrpcbind=127.0.0.1 # loopback is default for 0.18.0 but no harm making sure.\nwhitelist=127.0.0.1 # for nbxplorer.\nrpcallowip=127.0.0.1/32 # loopback is default but again no harm.\nzmqpubrawblock=tcp://127.0.0.1:28332 # needed for lightning.\nzmqpubrawtx=tcp://127.0.0.1:28333 # needed for lightning.\n#prune=5000 # Recommended if not enough disk space for full 600+GB blockchain.\n")])])]),s("p",[t._v("Copy the file to the directory specified in the systemd service file and assign read permissions to all users.")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("mkdir")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-p")]),t._v(" /etc/bitcoin\n~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("cp")]),t._v(" bitcoin.conf /etc/bitcoin\n~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("chmod")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("644")]),t._v(" /etc/bitcoin/bitcoin.conf\n")])])]),s("h5",{attrs:{id:"5-create-a-systemd-service"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#5-create-a-systemd-service"}},[t._v("#")]),t._v(" 5. Create a systemd service")]),t._v(" "),s("p",[t._v("An example "),s("strong",[t._v("systemd service")]),t._v(" file is available in the Bitcoin Core repository at https://raw.githubusercontent.com/bitcoin/bitcoin/master/contrib/init/bitcoind.service.")]),t._v(" "),s("p",[t._v("Edit the service file depending on your needs.")]),t._v(" "),s("p",[t._v("In the example below the "),s("strong",[t._v("User")]),t._v(" and "),s("strong",[t._v("Group")]),t._v(" have been changed to use the "),s("code",[t._v("admin")]),t._v(" user instead of requiring a new "),s("code",[t._v("bitcoin")]),t._v(" user. If the "),s("code",[t._v("admin")]),t._v(" user on your system is intended for running "),s("code",[t._v("BTCPayServer")]),t._v(" this is a reasonable choice. Otherwise consider creating a dedicated "),s("code",[t._v("bitcoin")]),t._v(" user.")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("vi")]),t._v(" bitcoind.service\n")])])]),s("div",{staticClass:"language- extra-class"},[s("pre",{pre:!0,attrs:{class:"language-text"}},[s("code",[t._v("[Unit]\nDescription=Bitcoin daemon\nAfter=network.target\n\n[Service]\nExecStart=/usr/bin/bitcoind -daemon \\\n -pid=/run/bitcoind/bitcoind.pid \\\n -conf=/etc/bitcoin/bitcoin.conf \\\n -datadir=/var/lib/bitcoind\n\n# Make sure the config directory is readable by the service user\nPermissionsStartOnly=true\nExecStartPre=/bin/chgrp admin /etc/bitcoin\n\n# Process management\n####################\n\nType=forking\nPIDFile=/run/bitcoind/bitcoind.pid\nRestart=on-failure\nTimeoutStopSec=600\n\n# Run as admin:admin\nUser=admin\nGroup=admin\n\n# /run/bitcoind\nRuntimeDirectory=bitcoind\nRuntimeDirectoryMode=0710\n\n# /etc/bitcoin\nConfigurationDirectory=bitcoin\nConfigurationDirectoryMode=0710\n\n# /var/lib/bitcoind\nStateDirectory=bitcoind\nStateDirectoryMode=0710\n\n# Hardening measures\n####################\n# Provide a private /tmp and /var/tmp.\nPrivateTmp=true\n\n# Deny access to /home, /root and /run/user\nProtectHome=true\n\n# Mount /usr, /boot/ and /etc read-only for the process.\nProtectSystem=full\n\n# Disallow the process and all of its children to gain\n# new privileges through execve().\nNoNewPrivileges=true\n\n# Use a new /dev namespace only populated with API pseudo devices\n# such as /dev/null, /dev/zero and /dev/random.\nPrivateDevices=true\n\n# Deny the creation of writable and executable memory mappings.\nMemoryDenyWriteExecute=true\n\n[Install]\nWantedBy=multi-user.target\n")])])]),s("p",[t._v("Once the service file is ready complete the commands below.")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("cp")]),t._v(" bitcoind.service /etc/systemd/system\n~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" systemctl "),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("enable")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("--now")]),t._v(" bitcoind\n~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" systemctl status bitcoind\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("..")]),t._v(".\nJul "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("26")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("21")]),t._v(":51:52 ubuntu systemd"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(": Started Bitcoin daemon.\n")])])]),s("p",[t._v("If the start attempt shows an error message check the log using:")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" journalctl "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-xe")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("--unit")]),t._v(" bitcoind\n")])])]),s("h5",{attrs:{id:"6-create-a-symbolic-link-to-the-bitcoind-cookie-file"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#6-create-a-symbolic-link-to-the-bitcoind-cookie-file"}},[t._v("#")]),t._v(" 6. Create a symbolic link to the bitcoind cookie file")]),t._v(" "),s("p",[t._v("The "),s("code",[t._v("bitcoin-cli")]),t._v(" client needs to authenticate to "),s("code",[t._v("bitcoind")]),t._v(" for RPC calls. The easiest way to allow this is to create a symbolic link to the cookie file.")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("~$ "),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("cd")]),t._v(" ~\n~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("ln")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-s")]),t._v(" /var/lib/bitcoind/.cookie .bitcoin/.cookie\n")])])]),s("p",[t._v("It's not vital to perform this step but if not done then every "),s("code",[t._v("bitcoin-cli")]),t._v(" command needs to specify the path to the cookie file as below.")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("~$ bitcoin-cli "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-rpccookiefile")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v("/var/lib/bitcoind/.cookie getblockchaininfo\n")])])]),s("h5",{attrs:{id:"check-4"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#check-4"}},[t._v("#")]),t._v(" Check")]),t._v(" "),s("p",[t._v("It will take Bitcoin anywhere from a few hours to a few days to synchronise the blockchain. Use any or all of the commands below to check its status.")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" systemctl status bitcoind\nActive: active "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("running"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" since Sun "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("2020")]),t._v("-07-26 "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("21")]),t._v(":51:52 IST"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" 2min 47s ago\n")])])]),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("tail")]),t._v(" /var/lib/bitcoind/debug.log "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-f")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("..")]),t._v(".\n"),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("2020")]),t._v("-07-26T20:55:09Z UpdateTip: new "),s("span",{pre:!0,attrs:{class:"token assign-left variable"}},[t._v("best")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v("0000000000000361c37dfb6fa905ef967b95411fa96f7dcb4eca5dd4434d9e59 "),s("span",{pre:!0,attrs:{class:"token assign-left variable"}},[t._v("height")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("126732")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token assign-left variable"}},[t._v("version")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v("0x00000001 "),s("span",{pre:!0,attrs:{class:"token assign-left variable"}},[t._v("log2_work")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("62.952182")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token assign-left variable"}},[t._v("tx")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("560114")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token assign-left variable"}},[t._v("date")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'2011-05-25T21:26:08Z'")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token assign-left variable"}},[t._v("progress")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0.001018")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token assign-left variable"}},[t._v("cache")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("43")]),t._v(".6MiB"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("291168txo"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("..")]),t._v(".\n")])])]),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("~$ bitcoin-cli getblockchaininfo\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"chain"')]),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"main"')]),t._v(",\n "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"blocks"')]),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("133015")]),t._v(",\n "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"headers"')]),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("640929")]),t._v(",\n "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"bestblockhash"')]),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"0000000000000e81b67de8d61eab726f40585bed954b1dd59f86ab10e4e55398"')]),t._v(",\n "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"difficulty"')]),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("876954.4935135372")]),t._v(",\n "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"mediantime"')]),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1308897947")]),t._v(",\n "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"verificationprogress"')]),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0.001530462018729556")]),t._v(",\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("..")]),t._v(".\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),s("p",[t._v("When the "),s("code",[t._v("verificationprogress")]),t._v(" gets to either "),s("code",[t._v("0.99..")]),t._v(" or "),s("code",[t._v("1.0")]),t._v(" your node has synchronised. To double check you can also use a public block explorer such as "),s("a",{attrs:{href:"https://blockstream.info/",target:"_blank",rel:"noopener noreferrer"}},[t._v("https://blockstream.info/"),s("OutboundLink")],1),t._v(" to view the latest "),s("code",[t._v("Bitcoin")]),t._v(" block and compare it to the "),s("code",[t._v("blocks")]),t._v(" value from the "),s("code",[t._v("bitcoin-cli getblockchaininfo")]),t._v(" result.")]),t._v(" "),s("h5",{attrs:{id:"check-tor-and-bitcoin"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#check-tor-and-bitcoin"}},[t._v("#")]),t._v(" Check Tor and Bitcoin")]),t._v(" "),s("p",[t._v("If Tor was installed prior to the Bitcoin Daemon then it should have automatically registered and begun listening on a torv2 onion address (note support for torv3 onion addresses is in the "),s("a",{attrs:{href:"https://github.com/bitcoin/bitcoin/issues/18884",target:"_blank",rel:"noopener noreferrer"}},[t._v("pipeline"),s("OutboundLink")],1),t._v(").")]),t._v(" "),s("p",[t._v("The easiest way to get your Bitcoin Daemon torv2 address is using "),s("code",[t._v("bitcoin-cli")]),t._v(":")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("bitcoin-cli getnetworkinfo\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"version"')]),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("200100")]),t._v(",\n "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"subversion"')]),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"/Satoshi:0.20.1/"')]),t._v(",\n "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"protocolversion"')]),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("70015")]),t._v(",\n "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"localservices"')]),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"0000000000000409"')]),t._v(",\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("..")]),t._v(".\n "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"localaddresses"')]),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"address"')]),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"192.168.11.4"')]),t._v(",\n "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"port"')]),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("8333")]),t._v(",\n "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"score"')]),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v(",\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"address"')]),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"v5j6hfz4xafmeckf.onion"')]),t._v(",\n "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"port"')]),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("8333")]),t._v(",\n "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"score"')]),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("156")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(",\n "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"warnings"')]),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('""')]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),s("p",[t._v("An alternative approach is to search the Bitcoin daemon log file:")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("cat")]),t._v(" /var/lib/bitcoind/debug.log "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("|")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("grep")]),t._v(" onion\n"),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("2019")]),t._v("-05-23T18:24:22Z tor: Got "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("service")]),t._v(" ID 4d4al7v4hj5p7bb6, advertising "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("service")]),t._v(" 4d4al7v4hj5p7bb6.onion:8333\n"),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("2019")]),t._v("-05-23T18:24:22Z AddLocal"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("4d4al7v4hj5p7bb6.onion:8333,4"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),s("p",[t._v("If there is a problem and no onion address can be found in the log file then check for Tor related error messages:")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("cat")]),t._v(" /var/lib/bitcoind/debug.log "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("|")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("grep")]),t._v(" tor\n"),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("2020")]),t._v("-07-27T08:03:28Z torcontrol thread start\n"),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("2020")]),t._v("-07-27T08:03:28Z tor: Authentication cookie /run/tor/control.authcookie could not be opened "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("check permissions"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),s("p",[t._v("The above error message can occur if the user accounts running the Bitcoin service does not have read access to the Tor authentication cookie file, "),s("a",{attrs:{href:"https://github.com/bitcoin/bitcoin/blob/master/doc/tor.md#3-automatically-listen-on-tor",target:"_blank",rel:"noopener noreferrer"}},[t._v("more info"),s("OutboundLink")],1),t._v(". To fix this particular error add the required user account to the "),s("code",[t._v("debian-tor")]),t._v(" group.")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("usermod")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-a")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-G")]),t._v(" debian-tor admin\n")])])]),s("p",[t._v("To change your onion address:")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("rm")]),t._v(" /var/lib/bitcoind/onion_private_key\n~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" systemctl restart bitcoind\n~$ bitcoin-cli getnetworkinfo "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("|")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("grep")]),t._v(" onion\n "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"name"')]),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"onion"')]),t._v(",\n "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"address"')]),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"qud5iwbntqxlfwjv.onion"')]),t._v(",\n")])])]),s("p",[t._v("To check your onion address from a remote host with tor installed:")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("~$ torsocks "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("--shell")]),t._v("\n~$ telnet 4d4al7v4hj5p7bb6.onion "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("8333")]),t._v("\n Trying "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("127.42")]),t._v(".42.0"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("..")]),t._v(".\n Connected to "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("127.42")]),t._v(".42.0.\n Escape character is "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'^]'")]),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v(".")]),t._v("\n~$ "),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("exit")]),t._v("\n")])])]),s("p",[t._v("To connect another "),s("code",[t._v("bitcoind")]),t._v(" instance to your new node:")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("~$ bitcoin-cli addnode "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"4d4al7v4hj5p7bb6.onion"')]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"add"')]),t._v("\n~$ bitcoin-cli getaddednodeinfo\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"addednode"')]),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"4d4al7v4hj5p7bb6.onion"')]),t._v(",\n "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"connected"')]),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v(":")]),t._v(" true,\n "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"addresses"')]),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"address"')]),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"4d4al7v4hj5p7bb6.onion:8333"')]),t._v(",\n "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"connected"')]),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"outbound"')]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),s("h2",{attrs:{id:"nbxplorer"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#nbxplorer"}},[t._v("#")]),t._v(" NBXplorer")]),t._v(" "),s("p",[s("strong",[t._v("NBXplorer")]),t._v(" is a dotnet core application that monitors the Bitcoin blockchain for transactions of interest to your BTCPay Server.")]),t._v(" "),s("h5",{attrs:{id:"install-5"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#install-5"}},[t._v("#")]),t._v(" Install")]),t._v(" "),s("h5",{attrs:{id:"1-install-net-60-sdk"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#1-install-net-60-sdk"}},[t._v("#")]),t._v(" 1. Install .NET 6.0 SDK")]),t._v(" "),s("p",[s("a",{attrs:{href:"https://docs.microsoft.com/en-us/dotnet/core/install/linux-ubuntu#2004-",target:"_blank",rel:"noopener noreferrer"}},[t._v("Follow the install instuctions"),s("OutboundLink")],1),t._v(":")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# Add Microsoft package repository")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("wget")]),t._v(" https://packages.microsoft.com/config/ubuntu/20.04/packages-microsoft-prod.deb "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-O")]),t._v(" packages-microsoft-prod.deb\n"),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" dpkg "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-i")]),t._v(" packages-microsoft-prod.deb\n"),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("rm")]),t._v(" packages-microsoft-prod.deb\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# Install the SDK")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("apt-get")]),t._v(" update\n"),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("apt-get")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("install")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-y")]),t._v(" apt-transport-https\n"),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("apt-get")]),t._v(" update\n"),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("apt-get")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("install")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-y")]),t._v(" dotnet-sdk-6.0\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("## Check")]),t._v("\ndotnet "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("--version")]),t._v("\n")])])]),s("h5",{attrs:{id:"2-build-nbxplorer"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#2-build-nbxplorer"}},[t._v("#")]),t._v(" 2. Build NBXplorer")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("~$ "),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("cd")]),t._v(" ~"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("mkdir")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-p")]),t._v(" src"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("cd")]),t._v(" src\n~/src$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("git")]),t._v(" clone https://github.com/dgarage/NBXplorer\n~/src$ "),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("cd")]),t._v(" NBXplorer\n~/src/NBXplorer$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("git")]),t._v(" checkout "),s("span",{pre:!0,attrs:{class:"token variable"}},[s("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$(")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("git")]),t._v(" tag "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("--sort")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-version:refname")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("|")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("awk")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'match($0, /^v[0-9]+\\./)'")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("|")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("head")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-n")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token variable"}},[t._v(")")])]),t._v("\n~/src/NBXplorer$ ./build.sh\n")])])]),s("h5",{attrs:{id:"3-create-postgresql-database"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#3-create-postgresql-database"}},[t._v("#")]),t._v(" 3. Create Postgresql Database")]),t._v(" "),s("p",[t._v("While NBXplorer support storing data in a local database via "),s("code",[t._v("--dbtrie")]),t._v(", this is deprecated. Here how to create the appropriate database and user for NBXlporer in "),s("strong",[t._v("Postgresql")]),t._v(".")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-u")]),t._v(" postgres psql\n")])])]),s("p",[t._v("Then execute")]),t._v(" "),s("div",{staticClass:"language-SQL extra-class"},[s("pre",{pre:!0,attrs:{class:"language-sql"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("CREATE")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("DATABASE")]),t._v(" nbxplorer TEMPLATE "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'template0'")]),t._v(" LC_CTYPE "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'C'")]),t._v(" LC_COLLATE "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'C'")]),t._v(" ENCODING "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'UTF8'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("CREATE")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("USER")]),t._v(" nbxplorer "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("WITH")]),t._v(" ENCRYPTED PASSWORD "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'urpassword'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("GRANT")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("ALL")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("PRIVILEGES")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("ON")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("DATABASE")]),t._v(" nbxplorer "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("TO")]),t._v(" nbxplorer"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),s("p",[t._v("Exit")]),t._v(" "),s("div",{staticClass:"language- extra-class"},[s("pre",{pre:!0,attrs:{class:"language-text"}},[s("code",[t._v("postgres=#\\q\n")])])]),s("h5",{attrs:{id:"4-create-a-configuration-file"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#4-create-a-configuration-file"}},[t._v("#")]),t._v(" 4. Create a configuration file")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("vi")]),t._v(" nbxplorer.config\n")])])]),s("div",{staticClass:"language- extra-class"},[s("pre",{pre:!0,attrs:{class:"language-text"}},[s("code",[t._v("### Database ###\npostgres=User ID=nbxplorer;Password=urpassword;Application Name=nbxplorer;MaxPoolSize=20;Host=localhost;Port=5432;Database=nbxplorer;\n")])])]),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("mkdir")]),t._v(" /etc/nbxplorer\n~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("cp")]),t._v(" nbxplorer.config /etc/nbxplorer\n~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("chmod")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("644")]),t._v(" /etc/nbxplorer/nbxplorer.config\n")])])]),s("p",[t._v("Note: If you previously used a "),s("code",[t._v("dbtrie")]),t._v(" backend for NBXplorer, but want to switch to postgres, "),s("a",{attrs:{href:"https://github.com/dgarage/NBXplorer/blob/master/docs/Postgres-Migration.md",target:"_blank",rel:"noopener noreferrer"}},[t._v("read this documentation"),s("OutboundLink")],1),t._v(".")]),t._v(" "),s("h5",{attrs:{id:"5-create-a-systemd-service-2"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#5-create-a-systemd-service-2"}},[t._v("#")]),t._v(" 5. Create a systemd service")]),t._v(" "),s("p",[t._v("An example "),s("strong",[t._v("systemd service")]),t._v(" file is shown below. Adjust the paths, User and Group accordingly.")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("vi")]),t._v(" nbxplorer.service\n")])])]),s("div",{staticClass:"language- extra-class"},[s("pre",{pre:!0,attrs:{class:"language-text"}},[s("code",[t._v("[Unit]\nDescription=NBXplorer daemon\nRequires=bitcoind.service\nAfter=bitcoind.service\n\n[Service]\nWorkingDirectory=/home/admin/src/NBXplorer\nExecStart=/home/admin/src/NBXplorer/run.sh --conf=/etc/nbxplorer/nbxplorer.config\nUser=admin\nGroup=admin\nType=simple\nPIDFile=/run/nbxplorer/nbxplorer.pid\nRestart=on-failure\n\n[Install]\nWantedBy=multi-user.target\n")])])]),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("cp")]),t._v(" nbxplorer.service /etc/systemd/system\n~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" systemctl "),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("enable")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("--now")]),t._v(" nbxplorer\n")])])]),s("h5",{attrs:{id:"check-5"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#check-5"}},[t._v("#")]),t._v(" Check")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" journalctl "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-xe")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("--unit")]),t._v(" nbxplorer "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("--follow")]),t._v("\nMay "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("23")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("19")]),t._v(":13:35 btc run.sh"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("8065")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(": info: Configuration: Data Directory: /home/admin/.nbxplorer/Main\nMay "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("23")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("19")]),t._v(":13:35 btc run.sh"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("8065")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(": info: Configuration: Configuration File: /home/admin/.nbxplorer/Main/settings.config\nMay "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("23")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("19")]),t._v(":13:35 btc run.sh"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("8065")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(": info: Configuration: Network: Mainnet\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("..")]),t._v(".\nMay "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("23")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("19")]),t._v(":20:04 btc run.sh"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("8065")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(": info: Events: BTC: New block 0000000000000000000c405ba5df5f5533359a4393247a0c52d26c458d4dd989 "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("577449")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),s("p",[t._v("If it doesn't start correctly stop the service and run the application directly to get any error messages.")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" systemctl stop nbxplorer\n~$ "),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("cd")]),t._v(" ~"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("pushd")]),t._v(" ./src/NBXplorer"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" ./run.sh"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("popd")]),t._v("\n")])])]),s("h5",{attrs:{id:"update"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#update"}},[t._v("#")]),t._v(" Update")]),t._v(" "),s("p",[t._v("Updating could break things. Be careful on a live system.")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# Stop the service")]),t._v("\n~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" systemctl stop nbxplorer\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# Checkout and build latest tag")]),t._v("\n~$ "),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("cd")]),t._v(" ~"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("pushd")]),t._v(" ~/src/NBXplorer"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("git")]),t._v(" fetch "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("--tags")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("&&")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("git")]),t._v(" checkout "),s("span",{pre:!0,attrs:{class:"token variable"}},[s("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$(")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("git")]),t._v(" tag "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("--sort")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-version:refname")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("|")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("awk")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'match($0, /^v[0-9]+\\./)'")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("|")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("head")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-n")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token variable"}},[t._v(")")])]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("&&")]),t._v(" ./build.sh"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("popd")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# Restart the service")]),t._v("\n~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" systemctl start nbxplorer\n")])])]),s("h5",{attrs:{id:"migration"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#migration"}},[t._v("#")]),t._v(" Migration")]),t._v(" "),s("p",[t._v("With BTCPay Server v1.5 we "),s("a",{attrs:{href:"https://blog.btcpayserver.org/nbxplorer-postgres/",target:"_blank",rel:"noopener noreferrer"}},[t._v("improved NBXplorer by switching to Postgres"),s("OutboundLink")],1),t._v(".\nIf you are still using the DBTrie based version, please consider "),s("a",{attrs:{href:"https://github.com/dgarage/NBXplorer/blob/master/docs/Postgres-Migration.md",target:"_blank",rel:"noopener noreferrer"}},[t._v("migrating NBXplorer"),s("OutboundLink")],1),t._v(".")]),t._v(" "),s("p",[t._v("Afterwards you need to set "),s("code",[t._v("BTCPAY_EXPLORERPOSTGRES")]),t._v(" to the same connection string as NBXplorer.")]),t._v(" "),s("h2",{attrs:{id:"btcpay-server"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#btcpay-server"}},[t._v("#")]),t._v(" BTCPay Server")]),t._v(" "),s("p",[t._v("Like NBXplorer the BTCPay Server application is also .NET Core. The install steps assume .NET Core was previosuly installed.")]),t._v(" "),s("h5",{attrs:{id:"install-6"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#install-6"}},[t._v("#")]),t._v(" Install")]),t._v(" "),s("h5",{attrs:{id:"1-build-btcpay-server"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#1-build-btcpay-server"}},[t._v("#")]),t._v(" 1. Build BTCPay Server")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("~$ "),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("cd")]),t._v(" ~"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("mkdir")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-p")]),t._v(" src"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("cd")]),t._v(" src\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# Clone the repository")]),t._v("\n~/src$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("git")]),t._v(" clone https://github.com/btcpayserver/btcpayserver.git\n~/src$ "),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("cd")]),t._v(" btcpayserver\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# Checkout latest tag")]),t._v("\n~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("git")]),t._v(" checkout "),s("span",{pre:!0,attrs:{class:"token variable"}},[s("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$(")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("git")]),t._v(" tag "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("--sort")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-version:refname")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("|")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("awk")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'match($0, /^v[0-9]+\\.[0-9]+\\.[0-9]+$/)'")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("|")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("head")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-n")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token variable"}},[t._v(")")])]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# Build the app")]),t._v("\n~/src/btcpayserver$ ./build.sh\n")])])]),s("h5",{attrs:{id:"2-create-postgresql-database"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#2-create-postgresql-database"}},[t._v("#")]),t._v(" 2. Create Postgresql Database")]),t._v(" "),s("p",[t._v("By default BTCPay Server will store data in a single SQLite file. A more robust option is to use "),s("strong",[t._v("Postgresql")]),t._v(" which requires the appropriate database and user to exist.")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-u")]),t._v(" postgres psql\n")])])]),s("p",[t._v("Then execute")]),t._v(" "),s("div",{staticClass:"language-sql extra-class"},[s("pre",{pre:!0,attrs:{class:"language-sql"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("CREATE")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("DATABASE")]),t._v(" btcpay TEMPLATE "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'template0'")]),t._v(" LC_CTYPE "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'C'")]),t._v(" LC_COLLATE "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'C'")]),t._v(" ENCODING "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'UTF8'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("CREATE")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("USER")]),t._v(" btcpay "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("WITH")]),t._v(" ENCRYPTED PASSWORD "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'urpassword'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("GRANT")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("ALL")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("PRIVILEGES")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("ON")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("DATABASE")]),t._v(" btcpay "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("TO")]),t._v(" btcpay"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),s("p",[t._v("Exit")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[s("span",{pre:!0,attrs:{class:"token assign-left variable"}},[t._v("postgres")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("#\\q")]),t._v("\n")])])]),s("h5",{attrs:{id:"3-create-a-configuration-file"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#3-create-a-configuration-file"}},[t._v("#")]),t._v(" 3. Create a configuration file")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("vi")]),t._v(" btcpay.config\n")])])]),s("div",{staticClass:"language- extra-class"},[s("pre",{pre:!0,attrs:{class:"language-text"}},[s("code",[t._v("### Database ###\npostgres=User ID=btcpay;Password=urpassword;Application Name=btcpayserver;Host=localhost;Port=5432;Database=btcpay;\nexplorer.postgres=User ID=nbxplorer;Password=urpassword;Application Name=nbxplorer;MaxPoolSize=20;Host=localhost;Port=5432;Database=nbxplorer;\n")])])]),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("mkdir")]),t._v(" /etc/btcpay\n~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("cp")]),t._v(" btcpay.config /etc/btcpay\n~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("chmod")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("644")]),t._v(" /etc/btcpay/btcpay.config\n")])])]),s("h5",{attrs:{id:"4-create-a-systemd-service"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#4-create-a-systemd-service"}},[t._v("#")]),t._v(" 4. Create a systemd service")]),t._v(" "),s("p",[t._v("An example "),s("strong",[t._v("systemd service")]),t._v(" file is shown below. Adjust the paths, User and Group accordingly.")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("vi")]),t._v(" btcpay.service\n")])])]),s("div",{staticClass:"language- extra-class"},[s("pre",{pre:!0,attrs:{class:"language-text"}},[s("code",[t._v('[Unit]\nDescription=BTCPay Server\nRequires=nbxplorer.service\nAfter=nbxplorer.service\n\n[Service]\nWorkingDirectory=/home/admin/src/btcpayserver\nEnvironment=BTCPAY_BTCEXTERNALRTL="server=https://mainnet.demo.btcpayserver.org/rtl;cookiefile=/var/lib/rtl/.cookie"\nExecStart=/home/admin/src/btcpayserver/run.sh --conf=/etc/btcpay/btcpay.config\nUser=admin\nGroup=admin\nType=simple\nPIDFile=/run/btcpayserver/btcpayserver.pid\nRestart=on-failure\n\n[Install]\nWantedBy=multi-user.target\n')])])]),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("cp")]),t._v(" btcpay.service /etc/systemd/system\n~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" systemctl "),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("enable")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("--now")]),t._v(" btcpay\n")])])]),s("h5",{attrs:{id:"check-6"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#check-6"}},[t._v("#")]),t._v(" Check")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" journalctl "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-xe")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("--unit")]),t._v(" btcpay "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("--follow")]),t._v("\n-- The start-up result is RESULT.\nMay "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("23")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("20")]),t._v(":01:25 btc run.sh"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("10263")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(": info: Configuration: Data Directory: /home/admin/.btcpayserver/Main\nMay "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("23")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("20")]),t._v(":01:25 btc run.sh"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("10263")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(": info: Configuration: Configuration File: /etc/btcpay/btcpay.config\nMay "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("23")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("20")]),t._v(":01:25 btc run.sh"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("10263")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(": info: Configuration: Network: Mainnet\n")])])]),s("p",[t._v("If it doesn't start correctly stop the service and run the application directly to get any error messages.")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" systemctl stop btcpay\n~$ "),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("cd")]),t._v(" ~"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("pushd")]),t._v(" ~/src/btcpayserver"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" ./run.sh "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("--conf")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v("/etc/btcpay/btcpay.config"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("popd")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),s("p",[t._v("An example of checking information in the database.")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-u")]),t._v(" postgres psql\n"),s("span",{pre:!0,attrs:{class:"token assign-left variable"}},[t._v("postgres")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# \\connect btcpay;")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token assign-left variable"}},[t._v("btcpay")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# \\dt")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token assign-left variable"}},[t._v("btcpay")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v('# select * from "Invoices";')]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token assign-left variable"}},[t._v("btcpay")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# \\q")]),t._v("\n")])])]),s("p",[t._v('Attempting to open your BTCPay Server domain in a browser now should show the "Welcome to your BTCPay Server" page.\nIf you are not using a Lightning Node this is the end of the install.')]),t._v(" "),s("h5",{attrs:{id:"update-2"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#update-2"}},[t._v("#")]),t._v(" Update")]),t._v(" "),s("p",[t._v("Updating could break things. Be careful on a live system.")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# Stop the service")]),t._v("\n~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" systemctl stop btcpay\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# Checkout and build latest tag")]),t._v("\n~$ "),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("cd")]),t._v(" ~"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("pushd")]),t._v(" ~/src/btcpayserver"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("git")]),t._v(" fetch "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("--tags")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("&&")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("git")]),t._v(" checkout "),s("span",{pre:!0,attrs:{class:"token variable"}},[s("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$(")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("git")]),t._v(" tag "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("--sort")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-version:refname")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("|")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("awk")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'match($0, /^v[0-9]+\\.[0-9]+\\.[0-9]+$/)'")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("|")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("head")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-n")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token variable"}},[t._v(")")])]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("&&")]),t._v(" ./build.sh"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("popd")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# Restart the service")]),t._v("\n~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" systemctl start btcpay\n")])])]),s("h2",{attrs:{id:"lightning-network-daemon-lnd"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#lightning-network-daemon-lnd"}},[t._v("#")]),t._v(" Lightning Network Daemon (LND)")]),t._v(" "),s("h5",{attrs:{id:"install-7"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#install-7"}},[t._v("#")]),t._v(" Install")]),t._v(" "),s("p",[t._v("Full "),s("a",{attrs:{href:"https://github.com/lightningnetwork/lnd/blob/master/docs/INSTALL.md",target:"_blank",rel:"noopener noreferrer"}},[t._v("instructions"),s("OutboundLink")],1),t._v(".")]),t._v(" "),s("h5",{attrs:{id:"1-install-go"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#1-install-go"}},[t._v("#")]),t._v(" 1. Install Go")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("apt")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("install")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("make")]),t._v("\n~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("wget")]),t._v(" https://dl.google.com/go/go1.13.linux-amd64.tar.gz\n~$ sha256sum go1.13.linux-amd64.tar.gz\n68a2297eb099d1a76097905a2ce334e3155004ec08cdea85f24527be3c48e856 go1.13.linux-amd64.tar.gz\n~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("tar")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-C")]),t._v(" /usr/local "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-xzf")]),t._v(" go1.13.linux-amd64.tar.gz\n~$ "),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("export")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token assign-left variable"}},[s("span",{pre:!0,attrs:{class:"token environment constant"}},[t._v("PATH")])]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token environment constant"}},[t._v("$PATH")]),t._v(":/usr/local/go/bin\n~$ "),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("export")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token assign-left variable"}},[t._v("GOPATH")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=~")]),t._v("/gocode\n~$ "),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("export")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token assign-left variable"}},[s("span",{pre:!0,attrs:{class:"token environment constant"}},[t._v("PATH")])]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token environment constant"}},[t._v("$PATH")]),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v(":")]),s("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$GOPATH")]),t._v("/bin\n~$ go version\ngo version go1.13 linux/amd64\n")])])]),s("h5",{attrs:{id:"2-build-and-install-lnd"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#2-build-and-install-lnd"}},[t._v("#")]),t._v(" 2. Build and install LND")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("~$ "),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("cd")]),t._v(" ~"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("mkdir")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-p")]),t._v(" src"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("cd")]),t._v(" src\n~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("git")]),t._v(" clone https://github.com/lightningnetwork/lnd\n~$ "),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("cd")]),t._v(" lnd\n~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("make")]),t._v("\n~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("make")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("install")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# installs to a directory in $GOPATH/bin")]),t._v("\n~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("cp")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$GOPATH")]),t._v("/bin/lnd "),s("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$GOPATH")]),t._v("/bin/lncli /usr/bin\n~$ lnd "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("--version")]),t._v("\nlnd version "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0.10")]),t._v(".99-beta "),s("span",{pre:!0,attrs:{class:"token assign-left variable"}},[t._v("commit")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v("clock/v1.0.0-229-ge64e71d86dc1ac716c30a80f85a22e8fb544697f\n")])])]),s("h5",{attrs:{id:"3-create-a-symbolic-link-to-the-bitcoin-configuration-file"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#3-create-a-symbolic-link-to-the-bitcoin-configuration-file"}},[t._v("#")]),t._v(" 3. Create a symbolic link to the Bitcoin configuration file")]),t._v(" "),s("p",[t._v("lnd looks for bitcoin.conf in a specific location to get necessary RPC and zeromq details.")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("ln")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-s")]),t._v(" ~/.bitcoin/bitcoin.conf /etc/bitcoin/bitcoin.conf\n")])])]),s("h5",{attrs:{id:"4-create-a-configuration-file-2"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#4-create-a-configuration-file-2"}},[t._v("#")]),t._v(" 4. Create a configuration file")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("vi")]),t._v(" lnd.conf\n")])])]),s("div",{staticClass:"language- extra-class"},[s("pre",{pre:!0,attrs:{class:"language-text"}},[s("code",[t._v("[Application Options]\ndatadir=/var/lib/lnd/data\ntlscertpath=/var/lib/lnd/tls.cert\ntlskeypath=/var/lib/lnd/tls.key\nlogdir=/var/lib/lnd/logs\nmaxlogfiles=3\nmaxlogfilesize=10\n#externalip=1.1.1.1 # change to your public IP address if required.\nalias=i_luv_btcpay\nlisten=0.0.0.0:9735\n\n[Bitcoin]\nbitcoin.active=1\nbitcoin.node=bitcoind\nbitcoin.mainnet=true\n\n[tor]\ntor.active=true\ntor.v3=true\n")])])]),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("mkdir")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-p")]),t._v(" /etc/lnd\n~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("mkdir")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-p")]),t._v(" /var/lib/lnd\n~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("chown")]),t._v(" admin:admin "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-R")]),t._v(" /var/lib/lnd\n~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("cp")]),t._v(" lnd.conf /etc/lnd\n~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("chmod")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("644")]),t._v(" /etc/lnd/lnd.conf\n")])])]),s("h5",{attrs:{id:"5-create-a-systemd-service-3"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#5-create-a-systemd-service-3"}},[t._v("#")]),t._v(" 5. Create a systemd service")]),t._v(" "),s("p",[t._v("An example "),s("strong",[t._v("systemd service")]),t._v(" file is shown below. Adjust the paths, User and Group accordingly.")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("vi")]),t._v(" lnd.service\n")])])]),s("div",{staticClass:"language- extra-class"},[s("pre",{pre:!0,attrs:{class:"language-text"}},[s("code",[t._v("[Unit]\nDescription=LND Lightning Network Daemon\nRequires=bitcoind.service\nAfter=bitcoind.service\n\n[Service]\nExecStart=/usr/bin/lnd --configfile=/etc/lnd/lnd.conf\nExecStop=/usr/bin/lncli --lnddir /var/lib/lnd stop\nPIDFile= /run/lnd/lnd.pid\n\nUser=admin\nGroup=admin\n\nType=simple\nKillMode=process\nTimeoutStartSec=60\nTimeoutStopSec=60\nRestart=always\nRestartSec=60\n\n[Install]\nWantedBy=multi-user.target\n")])])]),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("cp")]),t._v(" lnd.service /etc/systemd/system\n~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" systemctl "),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("enable")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("--now")]),t._v(" lnd\n")])])]),s("h5",{attrs:{id:"configuration-4"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#configuration-4"}},[t._v("#")]),t._v(" Configuration")]),t._v(" "),s("div",{staticClass:"custom-block danger"},[s("p",{staticClass:"custom-block-title"},[t._v("DANGER")]),t._v(" "),s("p",[s("strong",[t._v("Running a Bitcoin Lightning daemon requires a hot wallet on your BTCPay Server.")])])]),t._v(" "),s("p",[t._v("With Bitcoin the protocol has evolved and deterministic key derivation means the keys for your wallet can be kept in a different location to the BTCPay Server. Lightning daemons do not have this facility. Any Bitcoins committed or received in your lightning channels are controlled by private keys that are on your BTCPay Server.")]),t._v(" "),s("h5",{attrs:{id:"1-create-a-symbolic-link-to-the-lnd-data-directory"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#1-create-a-symbolic-link-to-the-lnd-data-directory"}},[t._v("#")]),t._v(" 1. Create a symbolic link to the lnd data directory")]),t._v(" "),s("p",[t._v("The install steps above use "),s("code",[t._v("/var/lib/lnd")]),t._v(" as the data directory rather than the default "),s("code",[t._v("/home/user/.lnd")]),t._v(". In order to save typing when using the "),s("code",[t._v("lncli")]),t._v(" client it's useful to add a symbolic directory link.")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[s("span",{pre:!0,attrs:{class:"token function"}},[t._v("ln")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-s")]),t._v(" /var/lib/lnd .lnd\n")])])]),s("h5",{attrs:{id:"2-create-lightning-wallet"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#2-create-lightning-wallet"}},[t._v("#")]),t._v(" 2. Create Lightning wallet")]),t._v(" "),s("p",[t._v("The first time the lnd is started a new wallet must be created and the backup seed safely recorded (if someone else gets your seed they can steal your funds so keep it safe).")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("~$ lncli create\nInput wallet password:\nConfirm password:\n\nDo you have an existing cipher seed mnemonic you want to use? "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("Enter y/n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(": n\n\nYour cipher seed can optionally be encrypted.\nInput your passphrase "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" you wish to encrypt it "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("or press enter to proceed without a cipher seed passphrase"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(":\n\nGenerating fresh cipher seed"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("..")]),t._v(".\n\n"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!")]),t._v("YOU MUST WRITE DOWN THIS SEED TO BE ABLE TO RESTORE THE WALLET"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!")]),t._v("\n---------------BEGIN LND CIPHER SEED---------------\n "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),t._v(". above "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),t._v(". catch "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("3")]),t._v(". start "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("4")]),t._v(". tape\n "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("5")]),t._v(". sound "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("6")]),t._v(". friend "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("7")]),t._v(". water "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("8")]),t._v(". royal\n "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("9")]),t._v(". solid "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("10")]),t._v(". poet "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("11")]),t._v(". wisdom "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("12")]),t._v(". match\n"),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("13")]),t._v(". virtual "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("14")]),t._v(". zero "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("15")]),t._v(". slender "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("16")]),t._v(". thrive\n"),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("17")]),t._v(". idle "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("18")]),t._v(". catch "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("19")]),t._v(". robot "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("20")]),t._v(". clay\n"),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("21")]),t._v(". resemble "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("22")]),t._v(". angry "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("23")]),t._v(". work "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("24")]),t._v(". "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("until")]),t._v("\n---------------END LND CIPHER SEED-----------------\n\n"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!")]),t._v("YOU MUST WRITE DOWN THIS SEED TO BE ABLE TO RESTORE THE WALLET"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!")]),t._v("\n\nlnd successfully initialized"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!")]),t._v("\n")])])]),s("p",[t._v("Note that if the symbolic directory link from the previous step "),s("strong",[t._v("was not")]),t._v(" created the command is:")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("lncli "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("--lnddir")]),t._v(" /var/lib/lnd create\n")])])]),s("h5",{attrs:{id:"3-unlock-the-wallet"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#3-unlock-the-wallet"}},[t._v("#")]),t._v(" 3. Unlock the wallet")]),t._v(" "),s("p",[t._v("Every time lnd is restarted the wallet "),s("strong",[t._v("needs to be unlocked")]),t._v(". This is not ideal for a BTCPay Server that can is designed to run unattended but Lighting is still in its infancy.")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("~$ lncli unlock\n")])])]),s("h5",{attrs:{id:"check-7"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#check-7"}},[t._v("#")]),t._v(" Check")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("~$ lncli getinfo\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"version"')]),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"0.10.99-beta commit=clock/v1.0.0-229-ge64e71d86dc1ac716c30a80f85a22e8fb544697f"')]),t._v(",\n "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"commit_hash"')]),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"e64e71d86dc1ac716c30a80f85a22e8fb544697f"')]),t._v(",\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("..")]),t._v(".\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),s("p",[t._v("Check the service:")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" journalctl "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-xe")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("--unit")]),t._v(" lnd "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("--follow")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("..")]),t._v(".\nJul "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("27")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("15")]),t._v(":46:29 ubuntu lnd"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("654474")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(": "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("2020")]),t._v("-07-27 "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("15")]),t._v(":46:29.909 "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("INF"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" DISC: Attempting to bootstrap with: BOLT-0010 DNS Seed: "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("nodes.lightning.directory soa.nodes.lightning.directory"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("lseed.bitcoinstats.com "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\nJul "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("27")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("15")]),t._v(":49:41 ubuntu lnd"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("654474")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(": "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("2020")]),t._v("-07-27 "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("15")]),t._v(":49:41.939 "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("INF"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" DISC: Attempting to bootstrap with: Authenticated Channel Graph\nJul "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("27")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("15")]),t._v(":49:41 ubuntu lnd"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("654474")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(": "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("2020")]),t._v("-07-27 "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("15")]),t._v(":49:41.940 "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("ERR"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" SRVR: Unable to retrieve initial bootstrap peers: no addresses found\n")])])]),s("p",[t._v("The "),s("strong",[t._v("Lightning Node Connection String")]),t._v(" to use with "),s("code",[t._v("BTCPay Server")]),t._v(" is:")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[s("span",{pre:!0,attrs:{class:"token assign-left variable"}},[t._v("type")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v("lnd-rest"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),s("span",{pre:!0,attrs:{class:"token assign-left variable"}},[t._v("server")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v("https://127.0.0.1:8080/"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),s("span",{pre:!0,attrs:{class:"token assign-left variable"}},[t._v("macaroonfilepath")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v("/home/admin/.lnd/data/chain/bitcoin/mainnet/admin.macaroon"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),s("span",{pre:!0,attrs:{class:"token assign-left variable"}},[t._v("allowinsecure")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v("true\n")])])]),s("h5",{attrs:{id:"add-lnd-as-internal-node"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#add-lnd-as-internal-node"}},[t._v("#")]),t._v(" Add LND as internal node")]),t._v(" "),s("p",[t._v("To add LND as internal node you have to edit the "),s("a",{attrs:{href:"#3-create-a-configuration-file"}},[t._v("btcpay.config file")]),t._v(":")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("cd")]),t._v(" /etc/btcpay\n"),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("vi")]),t._v(" btcpay.config\n")])])]),s("p",[t._v("Right below the database part, add the "),s("code",[t._v("BTC.lightning")]),t._v(" setting:")]),t._v(" "),s("div",{staticClass:"language- extra-class"},[s("pre",{pre:!0,attrs:{class:"language-text"}},[s("code",[t._v("### Lightning ###\nBTC.lightning=type=lnd-rest;server=https://127.0.0.1:8080/;macaroonfilepath=/home/admin/.lnd/data/chain/bitcoin/mainnet/admin.macaroon;allowinsecure=true\n")])])]),s("p",[t._v('See the "Use custom node" view on the Lightning node connection setting screen in BTCPay Server for details on the connection string.')]),t._v(" "),s("p",[t._v("You need to restart BTCPay Server for the settings update to take effect:")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" systemctl restart btcpay\n")])])]),s("h5",{attrs:{id:"check-tor-and-lnd"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#check-tor-and-lnd"}},[t._v("#")]),t._v(" Check Tor and LND")]),t._v(" "),s("p",[t._v("As with the Bitcoin daemon if Tor is installed and the configuration file enables it (the one above does) then "),s("code",[t._v("lnd")]),t._v(" will automatically register an onion address. In lnd's case torv3 addresses are supported.")]),t._v(" "),s("p",[t._v("The torv3 onion address below is a lot longer than the torv2 one from the Bitcoin daemon section (16 characters compared to 56 characters).")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("~$ lncli getinfo "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("|")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("grep")]),t._v(" onion\n"),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"029b0e3c05595074afcffdca0fb22fb68a95a9c4698dd20962f647de4891eceabd@liyuvwbbycrvvuzcrsd5rq7svwckabejlsymcxiwzkj3smvlwcsqpjyd.onion:9735"')]),t._v("\n")])])]),s("p",[t._v("The Tor address created by lnd can be used to connect to other Lighting peers on the Tor network. The Tor address can work in parallel with an IPv4 or IPv6 address. To register one of those make sure the "),s("code",[t._v("externalip")]),t._v(" is set in the lnd configuration file.")]),t._v(" "),s("h5",{attrs:{id:"update-3"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#update-3"}},[t._v("#")]),t._v(" Update")]),t._v(" "),s("p",[t._v("Updating could break things. Be careful on a live system.")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" systemctl stop lnd\n~$ "),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("export")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token assign-left variable"}},[s("span",{pre:!0,attrs:{class:"token environment constant"}},[t._v("PATH")])]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token environment constant"}},[t._v("$PATH")]),t._v(":/usr/local/go/bin\n~$ "),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("export")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token assign-left variable"}},[t._v("GOPATH")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=~")]),t._v("/gocode\n~$ "),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("export")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token assign-left variable"}},[s("span",{pre:!0,attrs:{class:"token environment constant"}},[t._v("PATH")])]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token environment constant"}},[t._v("$PATH")]),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v(":")]),s("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$GOPATH")]),t._v("/bin\n~$ "),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("cd")]),t._v(" ~/src/lnd\n~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("git")]),t._v(" pull\n~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("make")]),t._v("\n~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("make")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("install")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# installs to a directory in $GOPATH/bin")]),t._v("\n~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("cp")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$GOPATH")]),t._v("/bin/lnd "),s("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$GOPATH")]),t._v("/bin/lncli /usr/bin\n~$ lnd "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("--version")]),t._v("\nlnd version "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0.10")]),t._v(".99-beta "),s("span",{pre:!0,attrs:{class:"token assign-left variable"}},[t._v("commit")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v("clock/v1.0.0-229-ge64e71d86dc1ac716c30a80f85a22e8fb544697f\n~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" systemctl start lnd\n")])])]),s("p",[t._v("After the daemon has been restarted the wallet needs to be unlocked:")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("~$ lncli unlock\n")])])]),s("p",[t._v("If "),s("code",[t._v("Ride The Lightning (RTL)")]),t._v(" is installed, see next section, it may have stopped when lnd disappeared so it will also need to be restarted.")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" systemctl start rtl\n")])])]),s("h2",{attrs:{id:"ride-the-lightning-rtl"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#ride-the-lightning-rtl"}},[t._v("#")]),t._v(" Ride The Lightning (RTL)")]),t._v(" "),s("p",[s("strong",[t._v("Ride the Lightning")]),t._v(" is a Node.js application to manage your Lightning peers, channels, wallet etc.")]),t._v(" "),s("p",[t._v("The advantage of the work that has gone into BTCPay Server is that the RTL web page can be controlled and accessed in the same manner as the BTCPay site.")]),t._v(" "),s("h5",{attrs:{id:"install-8"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#install-8"}},[t._v("#")]),t._v(" Install")]),t._v(" "),s("h5",{attrs:{id:"1-install-dependencies"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#1-install-dependencies"}},[t._v("#")]),t._v(" 1. Install dependencies")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("apt")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("install")]),t._v(" nodejs build-essential "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("npm")]),t._v("\n")])])]),s("h5",{attrs:{id:"2-build-rtl"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#2-build-rtl"}},[t._v("#")]),t._v(" 2. Build RTL")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("~$ "),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("cd")]),t._v(" ~/src\n~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("git")]),t._v(" clone https://github.com/Ride-The-Lightning/RTL.git\n~$ "),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("cd")]),t._v(" RTL\n~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("npm")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("install")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("--only")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v("prod\n")])])]),s("h5",{attrs:{id:"3-create-a-configuration-file-2"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#3-create-a-configuration-file-2"}},[t._v("#")]),t._v(" 3. Create a configuration file")]),t._v(" "),s("p",[t._v("Copy the sample config file from "),s("code",[t._v("sample-RTL-Config.json")]),t._v(" and adjust accordingly. An example that works with the rest of the instructions in this document is shown below.")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("cp")]),t._v(" src/RTL/sample-RTL-Config.json RTL-Config.json\n~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("vi")]),t._v(" RTL-Config.json\n")])])]),s("div",{staticClass:"language-json extra-class"},[s("pre",{pre:!0,attrs:{class:"language-json"}},[s("code",[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"port"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"3000"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"defaultNodeIndex"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"SSO"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"rtlSSO"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"rtlCookiePath"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"/var/lib/rtl/.cookie"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" # Needs to match the value in BTCPay systemd settings.\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"logoutRedirectLink"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"https://mainnet.demo.btcpayserver.org/login"')]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"nodes"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"index"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"lnNode"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Node 1"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"lnImplementation"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"LND"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"Authentication"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"macaroonPath"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"/var/lib/lnd/data/chain/bitcoin/mainnet"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"configPath"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"/etc/lnd/lnd.conf"')]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"Settings"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"userPersona"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"MERCHANT"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"themeMode"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"DAY"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"themeColor"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"PURPLE"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"channelBackupPath"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"/home/admin/rtl/backup/node-1"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"enableLogging"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("false")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"lnServerUrl"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"https://localhost:8080/v1"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"swapServerUrl"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"http://localhost:8081/v1"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"fiatConversion"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("false")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),s("p",[t._v("Note that RTL has different behaviour and requirements compared to the other services documented in theses instructions, specifically:")]),t._v(" "),s("ol",[s("li",[t._v("The configuration file needs to exist in RTL's data directory,")]),t._v(" "),s("li",[t._v("The RTL process may write update to the configuration file.")])]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("mkdir")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-p")]),t._v(" /var/lib/rtl\n~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("cp")]),t._v(" ~/RTL-Config.json /var/lib/rtl\n~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("chown")]),t._v(" admin:admin "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-R")]),t._v(" /var/lib/rtl\n~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("chmod")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("644")]),t._v(" /var/lib/rtl/RTL-Config.json\n")])])]),s("h5",{attrs:{id:"4-create-a-systemd-service-2"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#4-create-a-systemd-service-2"}},[t._v("#")]),t._v(" 4. Create a systemd service")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("vi")]),t._v(" rtl.service\n")])])]),s("div",{staticClass:"language- extra-class"},[s("pre",{pre:!0,attrs:{class:"language-text"}},[s("code",[t._v('[Unit]\nDescription=Ride The Lightning\nRequires=lnd.service\nAfter=lnd.service\n\n[Service]\nEnvironment="RTL_CONFIG_PATH=/var/lib/rtl"\nWorkingDirectory=/var/lib/rtl\nExecStart=/usr/bin/node /home/admin/src/RTL/rtl\nUser=admin\nGroup=admin\nType=simple\nPIDFile=/run/rtl/rtl.pid\nRestart=on-failure\n\n[Install]\nWantedBy=multi-user.target\n')])])]),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("cp")]),t._v(" rtl.service /etc/systemd/system\n~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" systemctl "),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("enable")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("--now")]),t._v(" rtl\n")])])]),s("h5",{attrs:{id:"check-8"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#check-8"}},[t._v("#")]),t._v(" Check")]),t._v(" "),s("p",[t._v("Check the service:")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" journalctl "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-xe")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("--unit")]),t._v(" rtl "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("--follow")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("..")]),t._v(".\nJul "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("27")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("18")]),t._v(":27:52 ubuntu node"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("988638")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(": Server is up and running, please "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("open")]),t._v(" the UI at http://localhost:3000\n")])])]),s("p",[t._v("If it doesn't start correctly stop the service and run the application directly to get any error messages.")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" systemctl stop rtl\n~$ "),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("export")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token assign-left variable"}},[t._v("RTL_CONFIG_PATH")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v("/var/lib/rtl"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("pushd")]),t._v(" ~/src/RTL"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("node")]),t._v(" rtl"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("popd")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\nServer is up and running, please "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("open")]),t._v(" the UI at http://localhost:3000\n")])])]),s("p",[t._v("From the "),s("code",[t._v("BTCPay Server")]),t._v(" web page the "),s("code",[t._v("RTL")]),t._v(" interface should be accessible from "),s("code",[t._v("Server Settings->Services")]),t._v(' under the "Crypto services exposed by your server" heading.')]),t._v(" "),s("h5",{attrs:{id:"update-4"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#update-4"}},[t._v("#")]),t._v(" Update")]),t._v(" "),s("p",[t._v("Updating could break things. Be careful on a live system.")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" systemctl stop rtl\n~$ "),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("cd")]),t._v(" ~"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("pushd")]),t._v(" ~/src/RTL"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("git")]),t._v(" pull"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("npm")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("install")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("popd")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" systemctl start rtl\n")])])]),s("h2",{attrs:{id:"the-end"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#the-end"}},[t._v("#")]),t._v(" The End")]),t._v(" "),s("h3",{attrs:{id:"questions"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#questions"}},[t._v("#")]),t._v(" Questions")]),t._v(" "),s("p",[t._v("Join the "),s("a",{attrs:{href:"https://chat.btcpayserver.org/",target:"_blank",rel:"noopener noreferrer"}},[t._v("community chat"),s("OutboundLink")],1),t._v(" on Mattermost by downloading "),s("a",{attrs:{href:"https://mattermost.com/download/",target:"_blank",rel:"noopener noreferrer"}},[t._v("Mattermost app"),s("OutboundLink")],1),t._v(", or on "),s("a",{attrs:{href:"https://t.me/btcpayserver",target:"_blank",rel:"noopener noreferrer"}},[t._v("Telegram"),s("OutboundLink")],1),t._v(" in case you need further help or help or want to hang around with like-minded people.")])])}),[],!1,null,null,null);s.default=n.exports}}]); \ No newline at end of file diff --git a/assets/js/114.e0c307a5.js b/assets/js/114.a292fbf5.js similarity index 99% rename from assets/js/114.e0c307a5.js rename to assets/js/114.a292fbf5.js index 82e7e3d344..1734971361 100644 --- a/assets/js/114.e0c307a5.js +++ b/assets/js/114.a292fbf5.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[114],{743:function(t,s,a){"use strict";a.r(s);var e=a(10),n=Object(e.a)({},(function(){var t=this,s=t._self._c;return s("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[s("h1",{attrs:{id:"reverse-proxy-to-tor"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#reverse-proxy-to-tor"}},[t._v("#")]),t._v(" Reverse proxy to Tor")]),t._v(" "),s("h2",{attrs:{id:"advantages"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#advantages"}},[t._v("#")]),t._v(" Advantages")]),t._v(" "),s("ul",[s("li",[t._v("no port forwarding needed on the LAN of the host")]),t._v(" "),s("li",[t._v("encrypted connection")]),t._v(" "),s("li",[t._v("hides the IP of the host")])]),t._v(" "),s("h2",{attrs:{id:"requirements"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#requirements"}},[t._v("#")]),t._v(" Requirements")]),t._v(" "),s("ul",[s("li",[t._v("a Virtual Private Server (VPS) - eg. a minimal package on Lunanode for ~3.5$/month")]),t._v(" "),s("li",[t._v("root access on the VPS - you need to set up webserver and install packages")]),t._v(" "),s("li",[t._v("a domain or subdomain - this will be setup on the proxy webserver")])]),t._v(" "),s("p",[t._v("Get the Tor "),s("code",[t._v(".onion")]),t._v(" address of your BTCPay Server via the "),s("code",[t._v("Server settings > Services")]),t._v(' page.\nSee information in the "HTTP-based TOR hidden services" section.')]),t._v(" "),s("p",[t._v("Note: There is also a "),s("a",{attrs:{href:"#do-all-this-in-a-docker-container"}},[t._v("Docker version")]),t._v(" of this setup.")]),t._v(" "),s("h2",{attrs:{id:"vps-setup"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#vps-setup"}},[t._v("#")]),t._v(" VPS Setup")]),t._v(" "),s("p",[t._v("You will create a nginx reverse proxy and a "),s("code",[t._v("socat")]),t._v(" service, which forwards requests to your BTCPay Server.")]),t._v(" "),s("p",[t._v("Login as root and install the required dependencies: (example assumes a Debian based system)")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# switch to root user (if not logged in as root)")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("su")]),t._v(" -\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# install dependencies")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("apt")]),t._v(" update\n"),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("apt")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("install")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-y")]),t._v(" certbot nginx socat tor\n")])])]),s("h3",{attrs:{id:"socat-setup"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#socat-setup"}},[t._v("#")]),t._v(" Socat setup")]),t._v(" "),s("p",[t._v("Create the service file "),s("code",[t._v("/etc/systemd/system/http-to-socks-proxy@.service")]),t._v(":")]),t._v(" "),s("div",{staticClass:"language-ini extra-class"},[s("pre",{pre:!0,attrs:{class:"language-ini"}},[s("code",[s("span",{pre:!0,attrs:{class:"token section"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token section-name selector"}},[t._v("Unit")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")])]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token key attr-name"}},[t._v("Description")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token value attr-value"}},[t._v("HTTP-to-SOCKS proxy")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token key attr-name"}},[t._v("After")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token value attr-value"}},[t._v("network.target")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token section"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token section-name selector"}},[t._v("Service")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")])]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token key attr-name"}},[t._v("EnvironmentFile")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token value attr-value"}},[t._v("/etc/http-to-socks-proxy/%i.conf")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token key attr-name"}},[t._v("ExecStart")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token value attr-value"}},[t._v("/usr/bin/socat tcp4-LISTEN:${LOCAL_PORT},reuseaddr,fork,keepalive,bind=127.0.0.1 SOCKS4A:${PROXY_HOST}:${REMOTE_HOST}:${REMOTE_PORT},socksport=${PROXY_PORT}")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token section"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token section-name selector"}},[t._v("Install")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")])]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token key attr-name"}},[t._v("WantedBy")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token value attr-value"}},[t._v("multi-user.target")]),t._v("\n")])])]),s("p",[t._v("Create the configuration for the service in "),s("code",[t._v("/etc/http-to-socks-proxy/btcpayserver.conf")]),t._v(":")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# create the directory")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("mkdir")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-p")]),t._v(" /etc/http-to-socks-proxy/\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# create the file with the content below")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("nano")]),t._v(" /etc/http-to-socks-proxy/btcpayserver.conf\n")])])]),s("p",[t._v("Replace the "),s("code",[t._v("REMOTE_HOST")]),t._v(" and adapt the ports if needed:")]),t._v(" "),s("div",{staticClass:"language-conf extra-class"},[s("pre",{pre:!0,attrs:{class:"language-text"}},[s("code",[t._v("PROXY_HOST=127.0.0.1\nPROXY_PORT=9050\nLOCAL_PORT=9081\nREMOTE_HOST=heregoesthebtcpayserverhiddenserviceaddress.onion\nREMOTE_PORT=80\n")])])]),s("p",[t._v("Create a symlink in "),s("code",[t._v("/etc/systemd/system/multi-user.target.wants")]),t._v(" to enable the service and start it:")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# enable")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("ln")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-s")]),t._v(" /etc/systemd/system/http-to-socks-proxy"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("\\")]),t._v("@.service /etc/systemd/system/multi-user.target.wants/http-to-socks-proxy"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("\\")]),t._v("@btcpayserver.service\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# start")]),t._v("\nsystemctl start http-to-socks-proxy@btcpayserver\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# check service status")]),t._v("\nsystemctl status http-to-socks-proxy@btcpayserver\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# check if tunnel is active")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("netstat")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-tulpn")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("|")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("grep")]),t._v(" socat\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# should give something like this:")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# tcp 0 0 127.0.0.1:9081 0.0.0.0:* LISTEN 951/socat")]),t._v("\n")])])]),s("h3",{attrs:{id:"webserver-setup"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#webserver-setup"}},[t._v("#")]),t._v(" Webserver setup")]),t._v(" "),s("h4",{attrs:{id:"point-domain-to-the-vps"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#point-domain-to-the-vps"}},[t._v("#")]),t._v(" Point domain to the VPS")]),t._v(" "),s("p",[t._v("Create the A record on the DNS server of your domain/subdomain and point it to your VPS IP address.")]),t._v(" "),s("h4",{attrs:{id:"prepare-ssl-and-lets-encrypt"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#prepare-ssl-and-lets-encrypt"}},[t._v("#")]),t._v(" Prepare SSL and Let's Encrypt")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# generate 4096 bit DH params to strengthen the security, may take a while")]),t._v("\nopenssl dhparam "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-out")]),t._v(" /etc/ssl/certs/dhparam.pem "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("4096")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# create directory for Let's Encrypt files")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("mkdir")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-p")]),t._v(" /var/lib/letsencrypt/.well-known\n"),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("chgrp")]),t._v(" www-data /var/lib/letsencrypt\n"),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("chmod")]),t._v(" g+s /var/lib/letsencrypt\n")])])]),s("h4",{attrs:{id:"nginx-configuration-http"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#nginx-configuration-http"}},[t._v("#")]),t._v(" nginx configuration: http")]),t._v(" "),s("p",[t._v("Create a variable mapping to forward the correct protocol setting and check if the Upgrade header is sent by the client, e.g. "),s("code",[t._v("/etc/nginx/conf.d/map.conf")]),t._v(":")]),t._v(" "),s("div",{staticClass:"language-nginx extra-class"},[s("pre",{pre:!0,attrs:{class:"language-nginx"}},[s("code",[s("span",{pre:!0,attrs:{class:"token directive"}},[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("map")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$http_x_forwarded_proto")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$proxy_x_forwarded_proto")])]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token directive"}},[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("default")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$http_x_forwarded_proto")])]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n '' $scheme"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token directive"}},[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("map")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$http_upgrade")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$connection_upgrade")])]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token directive"}},[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("default")]),t._v(" upgrade")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n '' "),s("span",{pre:!0,attrs:{class:"token directive"}},[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("close")])]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),s("p",[t._v("Create a config file for the domain, e.g. "),s("code",[t._v("/etc/nginx/sites-available/btcpayserver.conf")]),t._v(":")]),t._v(" "),s("div",{staticClass:"language-nginx extra-class"},[s("pre",{pre:!0,attrs:{class:"language-nginx"}},[s("code",[s("span",{pre:!0,attrs:{class:"token directive"}},[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("server")])]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token directive"}},[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("listen")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("80")])]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token directive"}},[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("server_name")]),t._v(" btcpayserver.mydomain.com")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# Let's Encrypt verification requests")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token directive"}},[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("location")]),t._v(" ^~ /.well-known/acme-challenge/")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token directive"}},[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("allow")]),t._v(" all")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token directive"}},[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("root")]),t._v(" /var/lib/letsencrypt/")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token directive"}},[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("default_type")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"text/plain"')])]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token directive"}},[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("try_files")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$uri")]),t._v(" =404")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# Redirect everything else to https")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token directive"}},[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("location")]),t._v(" /")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token directive"}},[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("301")]),t._v(" https://"),s("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$server_name")]),s("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$request_uri")])]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),s("p",[t._v("We will configure the https server part in the same config file once we obtained the SSL certificate.")]),t._v(" "),s("p",[t._v("Enable the web server config by creating a symlink and restarting nginx:")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[s("span",{pre:!0,attrs:{class:"token function"}},[t._v("ln")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-s")]),t._v(" /etc/nginx/sites-available/btcpayserver.conf /etc/nginx/sites-enabled/btcpayserver.conf\n\nsystemctl restart nginx\n")])])]),s("h4",{attrs:{id:"obtain-ssl-certificate-via-lets-encrypt"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#obtain-ssl-certificate-via-lets-encrypt"}},[t._v("#")]),t._v(" Obtain SSL certificate via Let's Encrypt")]),t._v(" "),s("p",[t._v("Run the following command with adapted email and domain parameters:")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("certbot certonly --agree-tos "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("--email")]),t._v(" admin@mydomain.com "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("--webroot")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-w")]),t._v(" /var/lib/letsencrypt/ "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-d")]),t._v(" btcpayserver.mydomain.com\n")])])]),s("h4",{attrs:{id:"nginx-configuration-https"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#nginx-configuration-https"}},[t._v("#")]),t._v(" nginx configuration: https")]),t._v(" "),s("p",[t._v("Now that we have a valid SSL certificate, add the https server part at the end of "),s("code",[t._v("/etc/nginx/sites-available/btcpayserver.conf")]),t._v(":")]),t._v(" "),s("div",{staticClass:"language-nginx extra-class"},[s("pre",{pre:!0,attrs:{class:"language-nginx"}},[s("code",[s("span",{pre:!0,attrs:{class:"token directive"}},[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("server")])]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token directive"}},[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("listen")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("443")]),t._v(" ssl http2")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token directive"}},[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("server_name")]),t._v(" btcpayserver.mydomain.com")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# SSL settings")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token directive"}},[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("ssl_stapling")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("on")])]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token directive"}},[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("ssl_stapling_verify")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("on")])]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token directive"}},[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("ssl_session_timeout")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1d")])]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token directive"}},[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("ssl_session_cache")]),t._v(" shared:SSL:10m")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token directive"}},[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("ssl_session_tickets")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("off")])]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# Update this with the path of your certificate files")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token directive"}},[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("ssl_certificate")]),t._v(" /etc/letsencrypt/live/btcpayserver.mydomain.com/fullchain.pem")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token directive"}},[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("ssl_certificate_key")]),t._v(" /etc/letsencrypt/live/btcpayserver.mydomain.com/privkey.pem")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token directive"}},[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("ssl_dhparam")]),t._v(" /etc/ssl/certs/dhparam.pem")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token directive"}},[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("ssl_protocols")]),t._v(" TLSv1.2 TLSv1.3")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token directive"}},[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("ssl_ciphers")]),t._v(" ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token directive"}},[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("ssl_prefer_server_ciphers")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("off")])]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token directive"}},[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("resolver")]),t._v(" 8.8.8.8 8.8.4.4 valid=300s")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token directive"}},[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("resolver_timeout")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("30s")])]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token directive"}},[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("add_header")]),t._v(" Strict-Transport-Security "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"max-age=63072000"')]),t._v(" always")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token directive"}},[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("add_header")]),t._v(" Content-Security-Policy "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("\"frame-ancestors 'self';\"")])]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token directive"}},[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("add_header")]),t._v(" X-Content-Type-Options nosniff")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# Proxy requests to the socat service")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token directive"}},[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("location")]),t._v(" /")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token directive"}},[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("proxy_pass")]),t._v(" http://127.0.0.1:9081/")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token directive"}},[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("proxy_http_version")]),t._v(" 1.1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token directive"}},[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("proxy_set_header")]),t._v(" Host "),s("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$host")])]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token directive"}},[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("proxy_set_header")]),t._v(" X-Real-IP "),s("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$remote_addr")])]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token directive"}},[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("proxy_set_header")]),t._v(" X-Forwarded-For "),s("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$remote_addr")])]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token directive"}},[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("proxy_set_header")]),t._v(" X-Forwarded-Proto "),s("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$proxy_x_forwarded_proto")])]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token directive"}},[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("proxy_set_header")]),t._v(" Upgrade "),s("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$http_upgrade")])]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token directive"}},[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("proxy_set_header")]),t._v(" Connection "),s("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$connection_upgrade")])]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),s("p",[t._v("Restart nginx once more:")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("systemctl restart nginx\n")])])]),s("p",[t._v("Now, visiting "),s("code",[t._v("btcpayserver.mydomain.com")]),t._v(" should show your BTCPay Server instance.")]),t._v(" "),s("div",{staticClass:"custom-block tip"},[s("p",{staticClass:"custom-block-title"},[t._v("TIP")]),t._v(" "),s("p",[t._v('If you see an nginx error of "503 Service Temporarily Unavailable" or similar but your BTCPay Server is reachable otherwise, you need to make BTCPay Server aware of your new domain. You can do so by using environment variables (Docker based setup), log into your BTCPay Server via SSH:')]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("su")]),t._v(" -\n"),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("cd")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$BTCPAY_BASE_DIRECTORY")]),t._v("/btcpayserver-docker/\n"),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("export")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token assign-left variable"}},[t._v("BTCPAY_ADDITIONAL_HOSTS")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"btcpayserver.mydomain.com"')]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v(".")]),t._v(" ./btcpay-setup.sh "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-i")]),t._v("\n")])])])]),t._v(" "),s("h2",{attrs:{id:"do-all-this-in-a-docker-container"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#do-all-this-in-a-docker-container"}},[t._v("#")]),t._v(" Do all this in a Docker container")]),t._v(" "),s("p",[t._v("Ready made "),s("a",{attrs:{href:"https://hub.docker.com/r/cloudgenius/socator",target:"_blank",rel:"noopener noreferrer"}},[t._v("Docker image"),s("OutboundLink")],1),t._v(" ("),s("a",{attrs:{href:"https://github.com/beacloudgenius/socator",target:"_blank",rel:"noopener noreferrer"}},[t._v("Code"),s("OutboundLink")],1),t._v(")")]),t._v(" "),s("h3",{attrs:{id:"socator-socat-tor"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#socator-socat-tor"}},[t._v("#")]),t._v(" SocaTor = SOCAT + TOR")]),t._v(" "),s("p",[t._v("Based on "),s("a",{attrs:{href:"https://github.com/Arno0x/Docker-Socator",target:"_blank",rel:"noopener noreferrer"}},[t._v("Docker-Socator"),s("OutboundLink")],1)]),t._v(" "),s("p",[t._v("It uses socat to listen on a given TCP port (5000 in this example) and to redirect incoming traffic to a Tor hidden service specified through environment variables.\nIt acts as a relay between the standard web and a hidden service on the Tor network.\nYou can optionally restrict the IP addresses that are allowed to connect to this service by specifying an "),s("code",[t._v("ALLOWED_RANGE")]),t._v(" environment variable and using CIDR notation.")]),t._v(" "),s("p",[t._v("Please note:")]),t._v(" "),s("p",[t._v("This container does not have any nginx component because Kubernetes provides for it.")]),t._v(" "),s("h3",{attrs:{id:"usage"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#usage"}},[t._v("#")]),t._v(" Usage")]),t._v(" "),s("p",[t._v("Break free from cloud services providers limitations, secure and protect your bitcoin full node, connect that with a BTC Pay server, all behind TOR.\nSelectively expose the BTCPay Server payment gateway and API to clearnet using socat+tor running on the Internet.")]),t._v(" "),s("hr"),t._v(" "),s("h4",{attrs:{id:"build"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#build"}},[t._v("#")]),t._v(" Build")]),t._v(" "),s("div",{staticClass:"language-sh extra-class"},[s("pre",{pre:!0,attrs:{class:"language-sh"}},[s("code",[s("span",{pre:!0,attrs:{class:"token function"}},[t._v("docker")]),t._v(" build "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-t")]),t._v(" cloudgenius/socator "),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v(".")]),t._v("\n")])])]),s("h4",{attrs:{id:"push"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#push"}},[t._v("#")]),t._v(" Push")]),t._v(" "),s("div",{staticClass:"language-sh extra-class"},[s("pre",{pre:!0,attrs:{class:"language-sh"}},[s("code",[s("span",{pre:!0,attrs:{class:"token function"}},[t._v("docker")]),t._v(" push cloudgenius/socator\n")])])]),s("h4",{attrs:{id:"start-the-image-in-background-daemon-mode-with-ip-address-restriction"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#start-the-image-in-background-daemon-mode-with-ip-address-restriction"}},[t._v("#")]),t._v(" Start the image in background ("),s("em",[t._v("daemon mode")]),t._v(") with IP address restriction")]),t._v(" "),s("div",{staticClass:"language-sh extra-class"},[s("pre",{pre:!0,attrs:{class:"language-sh"}},[s("code",[s("span",{pre:!0,attrs:{class:"token function"}},[t._v("docker")]),t._v(" run "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-d")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("\\")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-p")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("5000")]),t._v(":5000 "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("\\")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-e")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"ALLOWED_RANGE=192.168.1.0/24"')]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("\\")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-e")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"TOR_SITE=zqktlwiuavvvqqt4ybvgvi7tyo4hjl5xgfuvpdf6otjiycgwqbym2qad.onion"')]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("\\")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-e")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"TOR_SITE_PORT=80"')]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("\\")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("--name")]),t._v(" socator "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("\\")]),t._v("\n cloudgenius/socator\n")])])]),s("h4",{attrs:{id:"start-the-image-in-foreground"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#start-the-image-in-foreground"}},[t._v("#")]),t._v(" Start the image in foreground")]),t._v(" "),s("div",{staticClass:"language-sh extra-class"},[s("pre",{pre:!0,attrs:{class:"language-sh"}},[s("code",[s("span",{pre:!0,attrs:{class:"token function"}},[t._v("docker")]),t._v(" run "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("--rm")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-ti")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("\\")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-p")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("5000")]),t._v(":5000 "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("\\")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-e")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"TOR_SITE=zqktlwiuavvvqqt4ybvgvi7tyo4hjl5xgfuvpdf6otjiycgwqbym2qad.onion"')]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("\\")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-e")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"TOR_SITE_PORT=80"')]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("\\")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("--name")]),t._v(" socator "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("\\")]),t._v("\n cloudgenius/socator\n")])])]),s("p",[t._v("Now "),s("code",[t._v("http://localhost:5000")]),t._v(" should show you the tor hidden service you specified in the above command.")]),t._v(" "),s("h2",{attrs:{id:"use-that-docker-container-in-a-kubernetes-cluster-using-these-manifests"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#use-that-docker-container-in-a-kubernetes-cluster-using-these-manifests"}},[t._v("#")]),t._v(" Use that Docker container in a Kubernetes Cluster using these manifests")]),t._v(" "),s("p",[t._v("These manifest assumes a typical Kubernetes cluster that exposes internal services (like socator running internallly at port 5000) to the clearnet/public internet via "),s("a",{attrs:{href:"https://github.com/kubernetes/ingress-nginx",target:"_blank",rel:"noopener noreferrer"}},[t._v("Nginx Ingress"),s("OutboundLink")],1),t._v(" and provide automated Let's Encrypt TLS/SSL certificates via "),s("a",{attrs:{href:"https://github.com/jetstack/cert-manager",target:"_blank",rel:"noopener noreferrer"}},[t._v("cert-manager"),s("OutboundLink")],1),t._v(".")]),t._v(" "),s("p",[t._v("Deployment manifest")]),t._v(" "),s("div",{staticClass:"language-yaml extra-class"},[s("pre",{pre:!0,attrs:{class:"language-yaml"}},[s("code",[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("---")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token key atrule"}},[t._v("apiVersion")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" apps/v1\n"),s("span",{pre:!0,attrs:{class:"token key atrule"}},[t._v("kind")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" Deployment\n"),s("span",{pre:!0,attrs:{class:"token key atrule"}},[t._v("metadata")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token key atrule"}},[t._v("name")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" socator\n"),s("span",{pre:!0,attrs:{class:"token key atrule"}},[t._v("spec")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token key atrule"}},[t._v("replicas")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token key atrule"}},[t._v("selector")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token key atrule"}},[t._v("matchLabels")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token key atrule"}},[t._v("role")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" socator\n "),s("span",{pre:!0,attrs:{class:"token key atrule"}},[t._v("template")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token key atrule"}},[t._v("metadata")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token key atrule"}},[t._v("labels")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token key atrule"}},[t._v("role")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" socator\n "),s("span",{pre:!0,attrs:{class:"token key atrule"}},[t._v("spec")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token key atrule"}},[t._v("containers")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("-")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token key atrule"}},[t._v("image")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" cloudgenius/socator "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# code https://github.com/beacloudgenius/socator")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token key atrule"}},[t._v("imagePullPolicy")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" IfNotPresent\n "),s("span",{pre:!0,attrs:{class:"token key atrule"}},[t._v("name")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" socator\n "),s("span",{pre:!0,attrs:{class:"token key atrule"}},[t._v("env")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("-")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token key atrule"}},[t._v("name")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" TOR_SITE\n "),s("span",{pre:!0,attrs:{class:"token key atrule"}},[t._v("value")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'zqktlwiuavvvqqt4ybvgvi7tyo4hjl5xgfuvpdf6otjiycgwqbym2qad.onion'")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# BTCPay Server Tor address => docker exec tor cat /var/lib/tor/app-btcpay-server/hostname")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("-")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token key atrule"}},[t._v("name")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" TOR_SITE_PORT\n "),s("span",{pre:!0,attrs:{class:"token key atrule"}},[t._v("value")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'80'")]),t._v("\n")])])]),s("p",[t._v("Service manifest")]),t._v(" "),s("div",{staticClass:"language-yaml extra-class"},[s("pre",{pre:!0,attrs:{class:"language-yaml"}},[s("code",[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("---")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token key atrule"}},[t._v("apiVersion")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" v1\n"),s("span",{pre:!0,attrs:{class:"token key atrule"}},[t._v("kind")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" Service\n"),s("span",{pre:!0,attrs:{class:"token key atrule"}},[t._v("metadata")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token key atrule"}},[t._v("name")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" socator\n"),s("span",{pre:!0,attrs:{class:"token key atrule"}},[t._v("spec")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token key atrule"}},[t._v("ports")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("-")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token key atrule"}},[t._v("name")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" http\n "),s("span",{pre:!0,attrs:{class:"token key atrule"}},[t._v("port")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("5000")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token key atrule"}},[t._v("selector")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token key atrule"}},[t._v("role")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" socator\n")])])]),s("p",[t._v("Ingress manifest")]),t._v(" "),s("div",{staticClass:"language-yaml extra-class"},[s("pre",{pre:!0,attrs:{class:"language-yaml"}},[s("code",[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("---")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token key atrule"}},[t._v("apiVersion")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" networking.k8s.io/v1\n"),s("span",{pre:!0,attrs:{class:"token key atrule"}},[t._v("kind")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" Ingress\n"),s("span",{pre:!0,attrs:{class:"token key atrule"}},[t._v("metadata")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token key atrule"}},[t._v("name")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" socator\n "),s("span",{pre:!0,attrs:{class:"token key atrule"}},[t._v("annotations")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token key atrule"}},[t._v("kubernetes.io/ingress.class")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" nginx\n "),s("span",{pre:!0,attrs:{class:"token key atrule"}},[t._v("cert-manager.io/cluster-issuer")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" letsencrypt"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("-")]),t._v("prod\n"),s("span",{pre:!0,attrs:{class:"token key atrule"}},[t._v("spec")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token key atrule"}},[t._v("rules")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("-")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token key atrule"}},[t._v("host")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" btcpayserver.mydomain.com\n "),s("span",{pre:!0,attrs:{class:"token key atrule"}},[t._v("http")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token key atrule"}},[t._v("paths")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("-")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token key atrule"}},[t._v("backend")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token key atrule"}},[t._v("service")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token key atrule"}},[t._v("name")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" socator\n "),s("span",{pre:!0,attrs:{class:"token key atrule"}},[t._v("port")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token key atrule"}},[t._v("number")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("5000")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token key atrule"}},[t._v("path")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" /\n "),s("span",{pre:!0,attrs:{class:"token key atrule"}},[t._v("pathType")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" Prefix\n "),s("span",{pre:!0,attrs:{class:"token key atrule"}},[t._v("tls")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("-")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token key atrule"}},[t._v("hosts")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("-")]),t._v(" btcpayserver.mydomain.com\n "),s("span",{pre:!0,attrs:{class:"token key atrule"}},[t._v("secretName")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" socator"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("-")]),t._v("tls\n")])])]),s("h2",{attrs:{id:"resources"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#resources"}},[t._v("#")]),t._v(" Resources")]),t._v(" "),s("ul",[s("li",[s("a",{attrs:{href:"https://itgala.xyz/nginx-reverse-proxy-to-onion-site-in-tor-network/",target:"_blank",rel:"noopener noreferrer"}},[t._v("nginx reverse proxy to .onion site in Tor network"),s("OutboundLink")],1)]),t._v(" "),s("li",[s("a",{attrs:{href:"https://github.com/openoms/bitcoin-tutorials/blob/master/tor2ip_tunnel.md",target:"_blank",rel:"noopener noreferrer"}},[t._v("Tor-to-IP tunnel service"),s("OutboundLink")],1)]),t._v(" "),s("li",[s("a",{attrs:{href:"https://stackoverflow.com/questions/55487324/how-to-make-a-nginx-reverse-proxy-direct-to-tor-hidden-service",target:"_blank",rel:"noopener noreferrer"}},[t._v("How to make a nginx reverse proxy direct to tor hidden service"),s("OutboundLink")],1)]),t._v(" "),s("li",[s("a",{attrs:{href:"https://linuxize.com/post/secure-nginx-with-let-s-encrypt-on-debian-10/",target:"_blank",rel:"noopener noreferrer"}},[t._v("Secure Nginx with Let's Encrypt on Debian 10 Linux"),s("OutboundLink")],1)]),t._v(" "),s("li",[s("a",{attrs:{href:"http://nginx.org/en/docs/http/websocket.html",target:"_blank",rel:"noopener noreferrer"}},[t._v("Nginx WebSocket proxying"),s("OutboundLink")],1)])])])}),[],!1,null,null,null);s.default=n.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[114],{742:function(t,s,a){"use strict";a.r(s);var e=a(10),n=Object(e.a)({},(function(){var t=this,s=t._self._c;return s("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[s("h1",{attrs:{id:"reverse-proxy-to-tor"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#reverse-proxy-to-tor"}},[t._v("#")]),t._v(" Reverse proxy to Tor")]),t._v(" "),s("h2",{attrs:{id:"advantages"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#advantages"}},[t._v("#")]),t._v(" Advantages")]),t._v(" "),s("ul",[s("li",[t._v("no port forwarding needed on the LAN of the host")]),t._v(" "),s("li",[t._v("encrypted connection")]),t._v(" "),s("li",[t._v("hides the IP of the host")])]),t._v(" "),s("h2",{attrs:{id:"requirements"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#requirements"}},[t._v("#")]),t._v(" Requirements")]),t._v(" "),s("ul",[s("li",[t._v("a Virtual Private Server (VPS) - eg. a minimal package on Lunanode for ~3.5$/month")]),t._v(" "),s("li",[t._v("root access on the VPS - you need to set up webserver and install packages")]),t._v(" "),s("li",[t._v("a domain or subdomain - this will be setup on the proxy webserver")])]),t._v(" "),s("p",[t._v("Get the Tor "),s("code",[t._v(".onion")]),t._v(" address of your BTCPay Server via the "),s("code",[t._v("Server settings > Services")]),t._v(' page.\nSee information in the "HTTP-based TOR hidden services" section.')]),t._v(" "),s("p",[t._v("Note: There is also a "),s("a",{attrs:{href:"#do-all-this-in-a-docker-container"}},[t._v("Docker version")]),t._v(" of this setup.")]),t._v(" "),s("h2",{attrs:{id:"vps-setup"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#vps-setup"}},[t._v("#")]),t._v(" VPS Setup")]),t._v(" "),s("p",[t._v("You will create a nginx reverse proxy and a "),s("code",[t._v("socat")]),t._v(" service, which forwards requests to your BTCPay Server.")]),t._v(" "),s("p",[t._v("Login as root and install the required dependencies: (example assumes a Debian based system)")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# switch to root user (if not logged in as root)")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("su")]),t._v(" -\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# install dependencies")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("apt")]),t._v(" update\n"),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("apt")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("install")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-y")]),t._v(" certbot nginx socat tor\n")])])]),s("h3",{attrs:{id:"socat-setup"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#socat-setup"}},[t._v("#")]),t._v(" Socat setup")]),t._v(" "),s("p",[t._v("Create the service file "),s("code",[t._v("/etc/systemd/system/http-to-socks-proxy@.service")]),t._v(":")]),t._v(" "),s("div",{staticClass:"language-ini extra-class"},[s("pre",{pre:!0,attrs:{class:"language-ini"}},[s("code",[s("span",{pre:!0,attrs:{class:"token section"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token section-name selector"}},[t._v("Unit")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")])]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token key attr-name"}},[t._v("Description")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token value attr-value"}},[t._v("HTTP-to-SOCKS proxy")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token key attr-name"}},[t._v("After")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token value attr-value"}},[t._v("network.target")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token section"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token section-name selector"}},[t._v("Service")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")])]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token key attr-name"}},[t._v("EnvironmentFile")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token value attr-value"}},[t._v("/etc/http-to-socks-proxy/%i.conf")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token key attr-name"}},[t._v("ExecStart")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token value attr-value"}},[t._v("/usr/bin/socat tcp4-LISTEN:${LOCAL_PORT},reuseaddr,fork,keepalive,bind=127.0.0.1 SOCKS4A:${PROXY_HOST}:${REMOTE_HOST}:${REMOTE_PORT},socksport=${PROXY_PORT}")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token section"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token section-name selector"}},[t._v("Install")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")])]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token key attr-name"}},[t._v("WantedBy")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token value attr-value"}},[t._v("multi-user.target")]),t._v("\n")])])]),s("p",[t._v("Create the configuration for the service in "),s("code",[t._v("/etc/http-to-socks-proxy/btcpayserver.conf")]),t._v(":")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# create the directory")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("mkdir")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-p")]),t._v(" /etc/http-to-socks-proxy/\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# create the file with the content below")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("nano")]),t._v(" /etc/http-to-socks-proxy/btcpayserver.conf\n")])])]),s("p",[t._v("Replace the "),s("code",[t._v("REMOTE_HOST")]),t._v(" and adapt the ports if needed:")]),t._v(" "),s("div",{staticClass:"language-conf extra-class"},[s("pre",{pre:!0,attrs:{class:"language-text"}},[s("code",[t._v("PROXY_HOST=127.0.0.1\nPROXY_PORT=9050\nLOCAL_PORT=9081\nREMOTE_HOST=heregoesthebtcpayserverhiddenserviceaddress.onion\nREMOTE_PORT=80\n")])])]),s("p",[t._v("Create a symlink in "),s("code",[t._v("/etc/systemd/system/multi-user.target.wants")]),t._v(" to enable the service and start it:")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# enable")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("ln")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-s")]),t._v(" /etc/systemd/system/http-to-socks-proxy"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("\\")]),t._v("@.service /etc/systemd/system/multi-user.target.wants/http-to-socks-proxy"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("\\")]),t._v("@btcpayserver.service\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# start")]),t._v("\nsystemctl start http-to-socks-proxy@btcpayserver\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# check service status")]),t._v("\nsystemctl status http-to-socks-proxy@btcpayserver\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# check if tunnel is active")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("netstat")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-tulpn")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("|")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("grep")]),t._v(" socat\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# should give something like this:")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# tcp 0 0 127.0.0.1:9081 0.0.0.0:* LISTEN 951/socat")]),t._v("\n")])])]),s("h3",{attrs:{id:"webserver-setup"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#webserver-setup"}},[t._v("#")]),t._v(" Webserver setup")]),t._v(" "),s("h4",{attrs:{id:"point-domain-to-the-vps"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#point-domain-to-the-vps"}},[t._v("#")]),t._v(" Point domain to the VPS")]),t._v(" "),s("p",[t._v("Create the A record on the DNS server of your domain/subdomain and point it to your VPS IP address.")]),t._v(" "),s("h4",{attrs:{id:"prepare-ssl-and-lets-encrypt"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#prepare-ssl-and-lets-encrypt"}},[t._v("#")]),t._v(" Prepare SSL and Let's Encrypt")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# generate 4096 bit DH params to strengthen the security, may take a while")]),t._v("\nopenssl dhparam "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-out")]),t._v(" /etc/ssl/certs/dhparam.pem "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("4096")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# create directory for Let's Encrypt files")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("mkdir")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-p")]),t._v(" /var/lib/letsencrypt/.well-known\n"),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("chgrp")]),t._v(" www-data /var/lib/letsencrypt\n"),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("chmod")]),t._v(" g+s /var/lib/letsencrypt\n")])])]),s("h4",{attrs:{id:"nginx-configuration-http"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#nginx-configuration-http"}},[t._v("#")]),t._v(" nginx configuration: http")]),t._v(" "),s("p",[t._v("Create a variable mapping to forward the correct protocol setting and check if the Upgrade header is sent by the client, e.g. "),s("code",[t._v("/etc/nginx/conf.d/map.conf")]),t._v(":")]),t._v(" "),s("div",{staticClass:"language-nginx extra-class"},[s("pre",{pre:!0,attrs:{class:"language-nginx"}},[s("code",[s("span",{pre:!0,attrs:{class:"token directive"}},[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("map")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$http_x_forwarded_proto")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$proxy_x_forwarded_proto")])]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token directive"}},[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("default")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$http_x_forwarded_proto")])]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n '' $scheme"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token directive"}},[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("map")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$http_upgrade")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$connection_upgrade")])]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token directive"}},[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("default")]),t._v(" upgrade")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n '' "),s("span",{pre:!0,attrs:{class:"token directive"}},[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("close")])]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),s("p",[t._v("Create a config file for the domain, e.g. "),s("code",[t._v("/etc/nginx/sites-available/btcpayserver.conf")]),t._v(":")]),t._v(" "),s("div",{staticClass:"language-nginx extra-class"},[s("pre",{pre:!0,attrs:{class:"language-nginx"}},[s("code",[s("span",{pre:!0,attrs:{class:"token directive"}},[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("server")])]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token directive"}},[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("listen")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("80")])]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token directive"}},[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("server_name")]),t._v(" btcpayserver.mydomain.com")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# Let's Encrypt verification requests")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token directive"}},[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("location")]),t._v(" ^~ /.well-known/acme-challenge/")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token directive"}},[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("allow")]),t._v(" all")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token directive"}},[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("root")]),t._v(" /var/lib/letsencrypt/")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token directive"}},[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("default_type")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"text/plain"')])]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token directive"}},[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("try_files")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$uri")]),t._v(" =404")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# Redirect everything else to https")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token directive"}},[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("location")]),t._v(" /")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token directive"}},[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("301")]),t._v(" https://"),s("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$server_name")]),s("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$request_uri")])]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),s("p",[t._v("We will configure the https server part in the same config file once we obtained the SSL certificate.")]),t._v(" "),s("p",[t._v("Enable the web server config by creating a symlink and restarting nginx:")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[s("span",{pre:!0,attrs:{class:"token function"}},[t._v("ln")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-s")]),t._v(" /etc/nginx/sites-available/btcpayserver.conf /etc/nginx/sites-enabled/btcpayserver.conf\n\nsystemctl restart nginx\n")])])]),s("h4",{attrs:{id:"obtain-ssl-certificate-via-lets-encrypt"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#obtain-ssl-certificate-via-lets-encrypt"}},[t._v("#")]),t._v(" Obtain SSL certificate via Let's Encrypt")]),t._v(" "),s("p",[t._v("Run the following command with adapted email and domain parameters:")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("certbot certonly --agree-tos "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("--email")]),t._v(" admin@mydomain.com "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("--webroot")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-w")]),t._v(" /var/lib/letsencrypt/ "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-d")]),t._v(" btcpayserver.mydomain.com\n")])])]),s("h4",{attrs:{id:"nginx-configuration-https"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#nginx-configuration-https"}},[t._v("#")]),t._v(" nginx configuration: https")]),t._v(" "),s("p",[t._v("Now that we have a valid SSL certificate, add the https server part at the end of "),s("code",[t._v("/etc/nginx/sites-available/btcpayserver.conf")]),t._v(":")]),t._v(" "),s("div",{staticClass:"language-nginx extra-class"},[s("pre",{pre:!0,attrs:{class:"language-nginx"}},[s("code",[s("span",{pre:!0,attrs:{class:"token directive"}},[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("server")])]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token directive"}},[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("listen")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("443")]),t._v(" ssl http2")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token directive"}},[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("server_name")]),t._v(" btcpayserver.mydomain.com")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# SSL settings")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token directive"}},[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("ssl_stapling")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("on")])]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token directive"}},[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("ssl_stapling_verify")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("on")])]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token directive"}},[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("ssl_session_timeout")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1d")])]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token directive"}},[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("ssl_session_cache")]),t._v(" shared:SSL:10m")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token directive"}},[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("ssl_session_tickets")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("off")])]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# Update this with the path of your certificate files")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token directive"}},[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("ssl_certificate")]),t._v(" /etc/letsencrypt/live/btcpayserver.mydomain.com/fullchain.pem")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token directive"}},[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("ssl_certificate_key")]),t._v(" /etc/letsencrypt/live/btcpayserver.mydomain.com/privkey.pem")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token directive"}},[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("ssl_dhparam")]),t._v(" /etc/ssl/certs/dhparam.pem")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token directive"}},[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("ssl_protocols")]),t._v(" TLSv1.2 TLSv1.3")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token directive"}},[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("ssl_ciphers")]),t._v(" ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token directive"}},[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("ssl_prefer_server_ciphers")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("off")])]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token directive"}},[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("resolver")]),t._v(" 8.8.8.8 8.8.4.4 valid=300s")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token directive"}},[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("resolver_timeout")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("30s")])]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token directive"}},[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("add_header")]),t._v(" Strict-Transport-Security "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"max-age=63072000"')]),t._v(" always")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token directive"}},[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("add_header")]),t._v(" Content-Security-Policy "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("\"frame-ancestors 'self';\"")])]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token directive"}},[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("add_header")]),t._v(" X-Content-Type-Options nosniff")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# Proxy requests to the socat service")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token directive"}},[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("location")]),t._v(" /")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token directive"}},[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("proxy_pass")]),t._v(" http://127.0.0.1:9081/")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token directive"}},[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("proxy_http_version")]),t._v(" 1.1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token directive"}},[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("proxy_set_header")]),t._v(" Host "),s("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$host")])]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token directive"}},[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("proxy_set_header")]),t._v(" X-Real-IP "),s("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$remote_addr")])]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token directive"}},[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("proxy_set_header")]),t._v(" X-Forwarded-For "),s("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$remote_addr")])]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token directive"}},[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("proxy_set_header")]),t._v(" X-Forwarded-Proto "),s("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$proxy_x_forwarded_proto")])]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token directive"}},[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("proxy_set_header")]),t._v(" Upgrade "),s("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$http_upgrade")])]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token directive"}},[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("proxy_set_header")]),t._v(" Connection "),s("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$connection_upgrade")])]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),s("p",[t._v("Restart nginx once more:")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("systemctl restart nginx\n")])])]),s("p",[t._v("Now, visiting "),s("code",[t._v("btcpayserver.mydomain.com")]),t._v(" should show your BTCPay Server instance.")]),t._v(" "),s("div",{staticClass:"custom-block tip"},[s("p",{staticClass:"custom-block-title"},[t._v("TIP")]),t._v(" "),s("p",[t._v('If you see an nginx error of "503 Service Temporarily Unavailable" or similar but your BTCPay Server is reachable otherwise, you need to make BTCPay Server aware of your new domain. You can do so by using environment variables (Docker based setup), log into your BTCPay Server via SSH:')]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("su")]),t._v(" -\n"),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("cd")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$BTCPAY_BASE_DIRECTORY")]),t._v("/btcpayserver-docker/\n"),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("export")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token assign-left variable"}},[t._v("BTCPAY_ADDITIONAL_HOSTS")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"btcpayserver.mydomain.com"')]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v(".")]),t._v(" ./btcpay-setup.sh "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-i")]),t._v("\n")])])])]),t._v(" "),s("h2",{attrs:{id:"do-all-this-in-a-docker-container"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#do-all-this-in-a-docker-container"}},[t._v("#")]),t._v(" Do all this in a Docker container")]),t._v(" "),s("p",[t._v("Ready made "),s("a",{attrs:{href:"https://hub.docker.com/r/cloudgenius/socator",target:"_blank",rel:"noopener noreferrer"}},[t._v("Docker image"),s("OutboundLink")],1),t._v(" ("),s("a",{attrs:{href:"https://github.com/beacloudgenius/socator",target:"_blank",rel:"noopener noreferrer"}},[t._v("Code"),s("OutboundLink")],1),t._v(")")]),t._v(" "),s("h3",{attrs:{id:"socator-socat-tor"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#socator-socat-tor"}},[t._v("#")]),t._v(" SocaTor = SOCAT + TOR")]),t._v(" "),s("p",[t._v("Based on "),s("a",{attrs:{href:"https://github.com/Arno0x/Docker-Socator",target:"_blank",rel:"noopener noreferrer"}},[t._v("Docker-Socator"),s("OutboundLink")],1)]),t._v(" "),s("p",[t._v("It uses socat to listen on a given TCP port (5000 in this example) and to redirect incoming traffic to a Tor hidden service specified through environment variables.\nIt acts as a relay between the standard web and a hidden service on the Tor network.\nYou can optionally restrict the IP addresses that are allowed to connect to this service by specifying an "),s("code",[t._v("ALLOWED_RANGE")]),t._v(" environment variable and using CIDR notation.")]),t._v(" "),s("p",[t._v("Please note:")]),t._v(" "),s("p",[t._v("This container does not have any nginx component because Kubernetes provides for it.")]),t._v(" "),s("h3",{attrs:{id:"usage"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#usage"}},[t._v("#")]),t._v(" Usage")]),t._v(" "),s("p",[t._v("Break free from cloud services providers limitations, secure and protect your bitcoin full node, connect that with a BTC Pay server, all behind TOR.\nSelectively expose the BTCPay Server payment gateway and API to clearnet using socat+tor running on the Internet.")]),t._v(" "),s("hr"),t._v(" "),s("h4",{attrs:{id:"build"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#build"}},[t._v("#")]),t._v(" Build")]),t._v(" "),s("div",{staticClass:"language-sh extra-class"},[s("pre",{pre:!0,attrs:{class:"language-sh"}},[s("code",[s("span",{pre:!0,attrs:{class:"token function"}},[t._v("docker")]),t._v(" build "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-t")]),t._v(" cloudgenius/socator "),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v(".")]),t._v("\n")])])]),s("h4",{attrs:{id:"push"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#push"}},[t._v("#")]),t._v(" Push")]),t._v(" "),s("div",{staticClass:"language-sh extra-class"},[s("pre",{pre:!0,attrs:{class:"language-sh"}},[s("code",[s("span",{pre:!0,attrs:{class:"token function"}},[t._v("docker")]),t._v(" push cloudgenius/socator\n")])])]),s("h4",{attrs:{id:"start-the-image-in-background-daemon-mode-with-ip-address-restriction"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#start-the-image-in-background-daemon-mode-with-ip-address-restriction"}},[t._v("#")]),t._v(" Start the image in background ("),s("em",[t._v("daemon mode")]),t._v(") with IP address restriction")]),t._v(" "),s("div",{staticClass:"language-sh extra-class"},[s("pre",{pre:!0,attrs:{class:"language-sh"}},[s("code",[s("span",{pre:!0,attrs:{class:"token function"}},[t._v("docker")]),t._v(" run "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-d")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("\\")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-p")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("5000")]),t._v(":5000 "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("\\")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-e")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"ALLOWED_RANGE=192.168.1.0/24"')]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("\\")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-e")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"TOR_SITE=zqktlwiuavvvqqt4ybvgvi7tyo4hjl5xgfuvpdf6otjiycgwqbym2qad.onion"')]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("\\")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-e")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"TOR_SITE_PORT=80"')]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("\\")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("--name")]),t._v(" socator "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("\\")]),t._v("\n cloudgenius/socator\n")])])]),s("h4",{attrs:{id:"start-the-image-in-foreground"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#start-the-image-in-foreground"}},[t._v("#")]),t._v(" Start the image in foreground")]),t._v(" "),s("div",{staticClass:"language-sh extra-class"},[s("pre",{pre:!0,attrs:{class:"language-sh"}},[s("code",[s("span",{pre:!0,attrs:{class:"token function"}},[t._v("docker")]),t._v(" run "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("--rm")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-ti")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("\\")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-p")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("5000")]),t._v(":5000 "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("\\")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-e")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"TOR_SITE=zqktlwiuavvvqqt4ybvgvi7tyo4hjl5xgfuvpdf6otjiycgwqbym2qad.onion"')]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("\\")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-e")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"TOR_SITE_PORT=80"')]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("\\")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("--name")]),t._v(" socator "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("\\")]),t._v("\n cloudgenius/socator\n")])])]),s("p",[t._v("Now "),s("code",[t._v("http://localhost:5000")]),t._v(" should show you the tor hidden service you specified in the above command.")]),t._v(" "),s("h2",{attrs:{id:"use-that-docker-container-in-a-kubernetes-cluster-using-these-manifests"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#use-that-docker-container-in-a-kubernetes-cluster-using-these-manifests"}},[t._v("#")]),t._v(" Use that Docker container in a Kubernetes Cluster using these manifests")]),t._v(" "),s("p",[t._v("These manifest assumes a typical Kubernetes cluster that exposes internal services (like socator running internallly at port 5000) to the clearnet/public internet via "),s("a",{attrs:{href:"https://github.com/kubernetes/ingress-nginx",target:"_blank",rel:"noopener noreferrer"}},[t._v("Nginx Ingress"),s("OutboundLink")],1),t._v(" and provide automated Let's Encrypt TLS/SSL certificates via "),s("a",{attrs:{href:"https://github.com/jetstack/cert-manager",target:"_blank",rel:"noopener noreferrer"}},[t._v("cert-manager"),s("OutboundLink")],1),t._v(".")]),t._v(" "),s("p",[t._v("Deployment manifest")]),t._v(" "),s("div",{staticClass:"language-yaml extra-class"},[s("pre",{pre:!0,attrs:{class:"language-yaml"}},[s("code",[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("---")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token key atrule"}},[t._v("apiVersion")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" apps/v1\n"),s("span",{pre:!0,attrs:{class:"token key atrule"}},[t._v("kind")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" Deployment\n"),s("span",{pre:!0,attrs:{class:"token key atrule"}},[t._v("metadata")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token key atrule"}},[t._v("name")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" socator\n"),s("span",{pre:!0,attrs:{class:"token key atrule"}},[t._v("spec")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token key atrule"}},[t._v("replicas")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token key atrule"}},[t._v("selector")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token key atrule"}},[t._v("matchLabels")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token key atrule"}},[t._v("role")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" socator\n "),s("span",{pre:!0,attrs:{class:"token key atrule"}},[t._v("template")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token key atrule"}},[t._v("metadata")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token key atrule"}},[t._v("labels")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token key atrule"}},[t._v("role")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" socator\n "),s("span",{pre:!0,attrs:{class:"token key atrule"}},[t._v("spec")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token key atrule"}},[t._v("containers")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("-")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token key atrule"}},[t._v("image")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" cloudgenius/socator "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# code https://github.com/beacloudgenius/socator")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token key atrule"}},[t._v("imagePullPolicy")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" IfNotPresent\n "),s("span",{pre:!0,attrs:{class:"token key atrule"}},[t._v("name")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" socator\n "),s("span",{pre:!0,attrs:{class:"token key atrule"}},[t._v("env")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("-")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token key atrule"}},[t._v("name")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" TOR_SITE\n "),s("span",{pre:!0,attrs:{class:"token key atrule"}},[t._v("value")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'zqktlwiuavvvqqt4ybvgvi7tyo4hjl5xgfuvpdf6otjiycgwqbym2qad.onion'")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# BTCPay Server Tor address => docker exec tor cat /var/lib/tor/app-btcpay-server/hostname")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("-")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token key atrule"}},[t._v("name")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" TOR_SITE_PORT\n "),s("span",{pre:!0,attrs:{class:"token key atrule"}},[t._v("value")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'80'")]),t._v("\n")])])]),s("p",[t._v("Service manifest")]),t._v(" "),s("div",{staticClass:"language-yaml extra-class"},[s("pre",{pre:!0,attrs:{class:"language-yaml"}},[s("code",[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("---")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token key atrule"}},[t._v("apiVersion")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" v1\n"),s("span",{pre:!0,attrs:{class:"token key atrule"}},[t._v("kind")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" Service\n"),s("span",{pre:!0,attrs:{class:"token key atrule"}},[t._v("metadata")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token key atrule"}},[t._v("name")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" socator\n"),s("span",{pre:!0,attrs:{class:"token key atrule"}},[t._v("spec")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token key atrule"}},[t._v("ports")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("-")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token key atrule"}},[t._v("name")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" http\n "),s("span",{pre:!0,attrs:{class:"token key atrule"}},[t._v("port")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("5000")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token key atrule"}},[t._v("selector")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token key atrule"}},[t._v("role")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" socator\n")])])]),s("p",[t._v("Ingress manifest")]),t._v(" "),s("div",{staticClass:"language-yaml extra-class"},[s("pre",{pre:!0,attrs:{class:"language-yaml"}},[s("code",[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("---")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token key atrule"}},[t._v("apiVersion")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" networking.k8s.io/v1\n"),s("span",{pre:!0,attrs:{class:"token key atrule"}},[t._v("kind")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" Ingress\n"),s("span",{pre:!0,attrs:{class:"token key atrule"}},[t._v("metadata")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token key atrule"}},[t._v("name")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" socator\n "),s("span",{pre:!0,attrs:{class:"token key atrule"}},[t._v("annotations")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token key atrule"}},[t._v("kubernetes.io/ingress.class")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" nginx\n "),s("span",{pre:!0,attrs:{class:"token key atrule"}},[t._v("cert-manager.io/cluster-issuer")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" letsencrypt"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("-")]),t._v("prod\n"),s("span",{pre:!0,attrs:{class:"token key atrule"}},[t._v("spec")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token key atrule"}},[t._v("rules")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("-")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token key atrule"}},[t._v("host")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" btcpayserver.mydomain.com\n "),s("span",{pre:!0,attrs:{class:"token key atrule"}},[t._v("http")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token key atrule"}},[t._v("paths")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("-")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token key atrule"}},[t._v("backend")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token key atrule"}},[t._v("service")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token key atrule"}},[t._v("name")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" socator\n "),s("span",{pre:!0,attrs:{class:"token key atrule"}},[t._v("port")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token key atrule"}},[t._v("number")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("5000")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token key atrule"}},[t._v("path")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" /\n "),s("span",{pre:!0,attrs:{class:"token key atrule"}},[t._v("pathType")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" Prefix\n "),s("span",{pre:!0,attrs:{class:"token key atrule"}},[t._v("tls")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("-")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token key atrule"}},[t._v("hosts")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("-")]),t._v(" btcpayserver.mydomain.com\n "),s("span",{pre:!0,attrs:{class:"token key atrule"}},[t._v("secretName")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" socator"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("-")]),t._v("tls\n")])])]),s("h2",{attrs:{id:"resources"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#resources"}},[t._v("#")]),t._v(" Resources")]),t._v(" "),s("ul",[s("li",[s("a",{attrs:{href:"https://itgala.xyz/nginx-reverse-proxy-to-onion-site-in-tor-network/",target:"_blank",rel:"noopener noreferrer"}},[t._v("nginx reverse proxy to .onion site in Tor network"),s("OutboundLink")],1)]),t._v(" "),s("li",[s("a",{attrs:{href:"https://github.com/openoms/bitcoin-tutorials/blob/master/tor2ip_tunnel.md",target:"_blank",rel:"noopener noreferrer"}},[t._v("Tor-to-IP tunnel service"),s("OutboundLink")],1)]),t._v(" "),s("li",[s("a",{attrs:{href:"https://stackoverflow.com/questions/55487324/how-to-make-a-nginx-reverse-proxy-direct-to-tor-hidden-service",target:"_blank",rel:"noopener noreferrer"}},[t._v("How to make a nginx reverse proxy direct to tor hidden service"),s("OutboundLink")],1)]),t._v(" "),s("li",[s("a",{attrs:{href:"https://linuxize.com/post/secure-nginx-with-let-s-encrypt-on-debian-10/",target:"_blank",rel:"noopener noreferrer"}},[t._v("Secure Nginx with Let's Encrypt on Debian 10 Linux"),s("OutboundLink")],1)]),t._v(" "),s("li",[s("a",{attrs:{href:"http://nginx.org/en/docs/http/websocket.html",target:"_blank",rel:"noopener noreferrer"}},[t._v("Nginx WebSocket proxying"),s("OutboundLink")],1)])])])}),[],!1,null,null,null);s.default=n.exports}}]); \ No newline at end of file diff --git a/assets/js/115.f5cb3415.js b/assets/js/115.8f69cc7e.js similarity index 99% rename from assets/js/115.f5cb3415.js rename to assets/js/115.8f69cc7e.js index b285dcff5c..61e3c15fe1 100644 --- a/assets/js/115.f5cb3415.js +++ b/assets/js/115.8f69cc7e.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[115],{745:function(t,s,a){"use strict";a.r(s);var e=a(10),n=Object(e.a)({},(function(){var t=this,s=t._self._c;return s("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[s("h1",{attrs:{id:"forward-ports-with-a-reverse-ssh-tunnel"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#forward-ports-with-a-reverse-ssh-tunnel"}},[t._v("#")]),t._v(" Forward ports with a reverse SSH tunnel")]),t._v(" "),s("h2",{attrs:{id:"advantages"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#advantages"}},[t._v("#")]),t._v(" Advantages")]),t._v(" "),s("ul",[s("li",[t._v("no port forwarding needed on the LAN of the host")]),t._v(" "),s("li",[t._v("encrypted connection")]),t._v(" "),s("li",[t._v("hides the IP of the host")])]),t._v(" "),s("h2",{attrs:{id:"requirements"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#requirements"}},[t._v("#")]),t._v(" Requirements")]),t._v(" "),s("ul",[s("li",[t._v("a Virtual Private Server (VPS) - eg. a minimal package on Lunanode for ~3.5$/month")]),t._v(" "),s("li",[t._v("root access on the VPS - only root can forward ports under no. 1000")]),t._v(" "),s("li",[t._v("ssh access to the host computer (where the ports will be forwarded from)")])]),t._v(" "),s("h2",{attrs:{id:"setup"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#setup"}},[t._v("#")]),t._v(" Setup")]),t._v(" "),s("h3",{attrs:{id:"on-the-host-your-btcpay-server-instance"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#on-the-host-your-btcpay-server-instance"}},[t._v("#")]),t._v(" On the host (your BTCPay Server instance)")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# switch to root user (if not logged in as root)")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("su")]),t._v(" -\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# check for an existing ssh public key")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("cat")]),t._v(" ~/.ssh/*.pub\n")])])]),s("p",[t._v("If there is none generate one (keep pressing ENTER):")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("ssh-keygen "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-t")]),t._v(" rsa "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-b")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("4096")]),t._v("\n")])])]),s("p",[t._v("This will generate the SSH keypair "),s("code",[t._v("id_rsa")]),t._v(" (private key) and "),s("code",[t._v("id_rsa.pub")]),t._v(" inside "),s("code",[t._v("~/.ssh")]),t._v(".")]),t._v(" "),s("p",[t._v("The private key needs to get added to the ssh-agent:")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# start the ssh-agent in the background")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("eval")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token variable"}},[s("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$(")]),t._v("ssh-agent "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-s")]),s("span",{pre:!0,attrs:{class:"token variable"}},[t._v(")")])]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# add private key to ssh-agent")]),t._v("\nssh-add ~/.ssh/id_rsa\n")])])]),s("p",[t._v("Copy the public key over to the VPS (fill in the "),s("code",[t._v("VPS_IP_ADDRESS")]),t._v(").\nYou will be prompted for the root password of the VPS.")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("ssh-copy-id "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-i")]),t._v(" ~/.ssh/id_rsa.pub root@VPS_IP_ADDRESS\n")])])]),s("p",[t._v("To verify that it works, SSH into the VPS – this should not prompt for the password anymore:")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[s("span",{pre:!0,attrs:{class:"token function"}},[t._v("ssh")]),t._v(" root@VPS_IP_ADDRESS\n")])])]),s("h3",{attrs:{id:"on-the-vps"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#on-the-vps"}},[t._v("#")]),t._v(" On the VPS")]),t._v(" "),s("p",[t._v("You can either reuse the connection from before or login as root.")]),t._v(" "),s("p",[t._v("Edit the sshd config:")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("nano")]),t._v(" /etc/ssh/sshd_config\n")])])]),s("p",[t._v("Make sure these entries are active (meaning there is no "),s("code",[t._v("#")]),t._v(" at the beggining of the line).\nAlternatively, you can just paste these on the end of the file:")]),t._v(" "),s("div",{staticClass:"language- extra-class"},[s("pre",{pre:!0,attrs:{class:"language-text"}},[s("code",[t._v("RSAAuthentication yes # not needed on latest OpenSSH versions\nPubkeyAuthentication yes\nGatewayPorts yes\nAllowTcpForwarding yes\nClientAliveInterval 60\n")])])]),s("p",[t._v("CTRL+O, ENTER to save, CTRL+X to exit.")]),t._v(" "),s("div",{staticClass:"custom-block warning"},[s("p",{staticClass:"custom-block-title"},[t._v("WARNING")]),t._v(" "),s("p",[t._v("You can lose access at this point if the sshd config is wrong. Please double-check!")])]),t._v(" "),s("p",[t._v("Restart the sshd service:")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" systemctl restart sshd\n")])])]),s("h3",{attrs:{id:"back-to-the-host-your-btcpay-server-instance"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#back-to-the-host-your-btcpay-server-instance"}},[t._v("#")]),t._v(" Back to the host (your BTCPay Server instance)")]),t._v(" "),s("h4",{attrs:{id:"install-and-set-up-autossh"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#install-and-set-up-autossh"}},[t._v("#")]),t._v(" Install and set up autossh")]),t._v(" "),s("p",[t._v("Install the "),s("code",[t._v("autossh")]),t._v(" dependency:")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("apt-get")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("install")]),t._v(" autossh\n")])])]),s("p",[t._v("Create the service file:")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("nano")]),t._v(" /etc/systemd/system/autossh-tunnel.service\n")])])]),s("p",[t._v("Paste the following and fill in the "),s("code",[t._v("VPS_IP_ADDRESS")]),t._v(".\nAdd or remove ports as required.")]),t._v(" "),s("div",{staticClass:"language-ini extra-class"},[s("pre",{pre:!0,attrs:{class:"language-ini"}},[s("code",[s("span",{pre:!0,attrs:{class:"token section"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token section-name selector"}},[t._v("Unit")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")])]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token key attr-name"}},[t._v("Description")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token value attr-value"}},[t._v("AutoSSH tunnel service")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token key attr-name"}},[t._v("After")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token value attr-value"}},[t._v("network.target")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token section"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token section-name selector"}},[t._v("Service")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")])]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token key attr-name"}},[t._v("User")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token value attr-value"}},[t._v("root")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token key attr-name"}},[t._v("Group")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token value attr-value"}},[t._v("root")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token key attr-name"}},[t._v("Environment")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token value attr-value"}},[t._v('"'),s("span",{pre:!0,attrs:{class:"token inner-value"}},[t._v("AUTOSSH_GATETIME=0")]),t._v('"')]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token key attr-name"}},[t._v("ExecStart")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token value attr-value"}},[t._v('/usr/bin/autossh -C -M 0 -v -N -o "ServerAliveInterval=60" -R 9735:localhost:9735 -R 443:localhost:443 -R 80:localhost:80 root@VPS_IP_ADDRESS')]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token key attr-name"}},[t._v("StandardOutput")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token value attr-value"}},[t._v("journal")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token section"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token section-name selector"}},[t._v("Install")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")])]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token key attr-name"}},[t._v("WantedBy")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token value attr-value"}},[t._v("multi-user.target")]),t._v("\n")])])]),s("p",[t._v("Enable and start the service:")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" systemctl "),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("enable")]),t._v(" autossh-tunnel\n"),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" systemctl start autossh-tunnel\n")])])]),s("p",[t._v("The port forwarding with a reverse ssh-tunnel is now complete.\nYou should be able access the ports/services of the host computer through the IP of the VPS.")]),t._v(" "),s("h2",{attrs:{id:"monitoring"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#monitoring"}},[t._v("#")]),t._v(" Monitoring")]),t._v(" "),s("p",[t._v("Check if there are any errors on the host computer:")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" journalctl "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-f")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-n")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("20")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-u")]),t._v(" autossh-tunnel\n")])])]),s("p",[t._v("To check if tunnel is active on the VPS:")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[s("span",{pre:!0,attrs:{class:"token function"}},[t._v("netstat")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-tulpn")]),t._v("\n")])])]),s("h2",{attrs:{id:"resources"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#resources"}},[t._v("#")]),t._v(" Resources")]),t._v(" "),s("ul",[s("li",[t._v("Raspiblitz FAQ: "),s("a",{attrs:{href:"https://github.com/rootzoll/raspiblitz/blob/master/FAQ.md#how-to-setup-port-forwarding-with-a-ssh-tunnel",target:"_blank",rel:"noopener noreferrer"}},[t._v("How to setup port-forwarding with a SSH tunnel?"),s("OutboundLink")],1)]),t._v(" "),s("li",[t._v("RaspiBolt Docs: "),s("a",{attrs:{href:"https://raspibolt.org/guide/raspberry-pi/security.html#login-with-ssh-keys",target:"_blank",rel:"noopener noreferrer"}},[t._v("Login with SSH keys"),s("OutboundLink")],1)])])])}),[],!1,null,null,null);s.default=n.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[115],{744:function(t,s,a){"use strict";a.r(s);var e=a(10),n=Object(e.a)({},(function(){var t=this,s=t._self._c;return s("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[s("h1",{attrs:{id:"forward-ports-with-a-reverse-ssh-tunnel"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#forward-ports-with-a-reverse-ssh-tunnel"}},[t._v("#")]),t._v(" Forward ports with a reverse SSH tunnel")]),t._v(" "),s("h2",{attrs:{id:"advantages"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#advantages"}},[t._v("#")]),t._v(" Advantages")]),t._v(" "),s("ul",[s("li",[t._v("no port forwarding needed on the LAN of the host")]),t._v(" "),s("li",[t._v("encrypted connection")]),t._v(" "),s("li",[t._v("hides the IP of the host")])]),t._v(" "),s("h2",{attrs:{id:"requirements"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#requirements"}},[t._v("#")]),t._v(" Requirements")]),t._v(" "),s("ul",[s("li",[t._v("a Virtual Private Server (VPS) - eg. a minimal package on Lunanode for ~3.5$/month")]),t._v(" "),s("li",[t._v("root access on the VPS - only root can forward ports under no. 1000")]),t._v(" "),s("li",[t._v("ssh access to the host computer (where the ports will be forwarded from)")])]),t._v(" "),s("h2",{attrs:{id:"setup"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#setup"}},[t._v("#")]),t._v(" Setup")]),t._v(" "),s("h3",{attrs:{id:"on-the-host-your-btcpay-server-instance"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#on-the-host-your-btcpay-server-instance"}},[t._v("#")]),t._v(" On the host (your BTCPay Server instance)")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# switch to root user (if not logged in as root)")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("su")]),t._v(" -\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# check for an existing ssh public key")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("cat")]),t._v(" ~/.ssh/*.pub\n")])])]),s("p",[t._v("If there is none generate one (keep pressing ENTER):")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("ssh-keygen "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-t")]),t._v(" rsa "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-b")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("4096")]),t._v("\n")])])]),s("p",[t._v("This will generate the SSH keypair "),s("code",[t._v("id_rsa")]),t._v(" (private key) and "),s("code",[t._v("id_rsa.pub")]),t._v(" inside "),s("code",[t._v("~/.ssh")]),t._v(".")]),t._v(" "),s("p",[t._v("The private key needs to get added to the ssh-agent:")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# start the ssh-agent in the background")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("eval")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token variable"}},[s("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$(")]),t._v("ssh-agent "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-s")]),s("span",{pre:!0,attrs:{class:"token variable"}},[t._v(")")])]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# add private key to ssh-agent")]),t._v("\nssh-add ~/.ssh/id_rsa\n")])])]),s("p",[t._v("Copy the public key over to the VPS (fill in the "),s("code",[t._v("VPS_IP_ADDRESS")]),t._v(").\nYou will be prompted for the root password of the VPS.")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("ssh-copy-id "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-i")]),t._v(" ~/.ssh/id_rsa.pub root@VPS_IP_ADDRESS\n")])])]),s("p",[t._v("To verify that it works, SSH into the VPS – this should not prompt for the password anymore:")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[s("span",{pre:!0,attrs:{class:"token function"}},[t._v("ssh")]),t._v(" root@VPS_IP_ADDRESS\n")])])]),s("h3",{attrs:{id:"on-the-vps"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#on-the-vps"}},[t._v("#")]),t._v(" On the VPS")]),t._v(" "),s("p",[t._v("You can either reuse the connection from before or login as root.")]),t._v(" "),s("p",[t._v("Edit the sshd config:")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("nano")]),t._v(" /etc/ssh/sshd_config\n")])])]),s("p",[t._v("Make sure these entries are active (meaning there is no "),s("code",[t._v("#")]),t._v(" at the beggining of the line).\nAlternatively, you can just paste these on the end of the file:")]),t._v(" "),s("div",{staticClass:"language- extra-class"},[s("pre",{pre:!0,attrs:{class:"language-text"}},[s("code",[t._v("RSAAuthentication yes # not needed on latest OpenSSH versions\nPubkeyAuthentication yes\nGatewayPorts yes\nAllowTcpForwarding yes\nClientAliveInterval 60\n")])])]),s("p",[t._v("CTRL+O, ENTER to save, CTRL+X to exit.")]),t._v(" "),s("div",{staticClass:"custom-block warning"},[s("p",{staticClass:"custom-block-title"},[t._v("WARNING")]),t._v(" "),s("p",[t._v("You can lose access at this point if the sshd config is wrong. Please double-check!")])]),t._v(" "),s("p",[t._v("Restart the sshd service:")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" systemctl restart sshd\n")])])]),s("h3",{attrs:{id:"back-to-the-host-your-btcpay-server-instance"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#back-to-the-host-your-btcpay-server-instance"}},[t._v("#")]),t._v(" Back to the host (your BTCPay Server instance)")]),t._v(" "),s("h4",{attrs:{id:"install-and-set-up-autossh"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#install-and-set-up-autossh"}},[t._v("#")]),t._v(" Install and set up autossh")]),t._v(" "),s("p",[t._v("Install the "),s("code",[t._v("autossh")]),t._v(" dependency:")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("apt-get")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("install")]),t._v(" autossh\n")])])]),s("p",[t._v("Create the service file:")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("nano")]),t._v(" /etc/systemd/system/autossh-tunnel.service\n")])])]),s("p",[t._v("Paste the following and fill in the "),s("code",[t._v("VPS_IP_ADDRESS")]),t._v(".\nAdd or remove ports as required.")]),t._v(" "),s("div",{staticClass:"language-ini extra-class"},[s("pre",{pre:!0,attrs:{class:"language-ini"}},[s("code",[s("span",{pre:!0,attrs:{class:"token section"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token section-name selector"}},[t._v("Unit")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")])]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token key attr-name"}},[t._v("Description")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token value attr-value"}},[t._v("AutoSSH tunnel service")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token key attr-name"}},[t._v("After")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token value attr-value"}},[t._v("network.target")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token section"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token section-name selector"}},[t._v("Service")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")])]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token key attr-name"}},[t._v("User")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token value attr-value"}},[t._v("root")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token key attr-name"}},[t._v("Group")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token value attr-value"}},[t._v("root")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token key attr-name"}},[t._v("Environment")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token value attr-value"}},[t._v('"'),s("span",{pre:!0,attrs:{class:"token inner-value"}},[t._v("AUTOSSH_GATETIME=0")]),t._v('"')]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token key attr-name"}},[t._v("ExecStart")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token value attr-value"}},[t._v('/usr/bin/autossh -C -M 0 -v -N -o "ServerAliveInterval=60" -R 9735:localhost:9735 -R 443:localhost:443 -R 80:localhost:80 root@VPS_IP_ADDRESS')]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token key attr-name"}},[t._v("StandardOutput")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token value attr-value"}},[t._v("journal")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token section"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token section-name selector"}},[t._v("Install")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")])]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token key attr-name"}},[t._v("WantedBy")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token value attr-value"}},[t._v("multi-user.target")]),t._v("\n")])])]),s("p",[t._v("Enable and start the service:")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" systemctl "),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("enable")]),t._v(" autossh-tunnel\n"),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" systemctl start autossh-tunnel\n")])])]),s("p",[t._v("The port forwarding with a reverse ssh-tunnel is now complete.\nYou should be able access the ports/services of the host computer through the IP of the VPS.")]),t._v(" "),s("h2",{attrs:{id:"monitoring"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#monitoring"}},[t._v("#")]),t._v(" Monitoring")]),t._v(" "),s("p",[t._v("Check if there are any errors on the host computer:")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" journalctl "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-f")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-n")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("20")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-u")]),t._v(" autossh-tunnel\n")])])]),s("p",[t._v("To check if tunnel is active on the VPS:")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[s("span",{pre:!0,attrs:{class:"token function"}},[t._v("netstat")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-tulpn")]),t._v("\n")])])]),s("h2",{attrs:{id:"resources"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#resources"}},[t._v("#")]),t._v(" Resources")]),t._v(" "),s("ul",[s("li",[t._v("Raspiblitz FAQ: "),s("a",{attrs:{href:"https://github.com/rootzoll/raspiblitz/blob/master/FAQ.md#how-to-setup-port-forwarding-with-a-ssh-tunnel",target:"_blank",rel:"noopener noreferrer"}},[t._v("How to setup port-forwarding with a SSH tunnel?"),s("OutboundLink")],1)]),t._v(" "),s("li",[t._v("RaspiBolt Docs: "),s("a",{attrs:{href:"https://raspibolt.org/guide/raspberry-pi/security.html#login-with-ssh-keys",target:"_blank",rel:"noopener noreferrer"}},[t._v("Login with SSH keys"),s("OutboundLink")],1)])])])}),[],!1,null,null,null);s.default=n.exports}}]); \ No newline at end of file diff --git a/assets/js/116.90403267.js b/assets/js/116.a5f39c57.js similarity index 99% rename from assets/js/116.90403267.js rename to assets/js/116.a5f39c57.js index 33897e9de0..b6a2188dd2 100644 --- a/assets/js/116.90403267.js +++ b/assets/js/116.a5f39c57.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[116],{747:function(e,t,r){"use strict";r.r(t);var s=r(10),a=Object(s.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"third-party-hosting"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#third-party-hosting"}},[e._v("#")]),e._v(" Third-party hosting")]),e._v(" "),t("p",[e._v("A "),t("strong",[e._v("third-party host")]),e._v(" is an individual or a business which "),t("strong",[e._v("self-hosts a BTCPay Server instance and enables other users to register and use the server")]),e._v(". On a self-hosted server, the owner can add an unlimited amount of users and stores and allow those users to manage their stores independently and receive payments to their own wallets.")]),e._v(" "),t("p",[e._v("While this feature in BTCPay Server exists for complex multi-store business management, community enthusiasts use it to help other users (mostly beginners), sometimes skip an overwhelming step of "),t("strong",[e._v("deploying a self-hosted BTCPay server")]),e._v(". Users who want to test or develop applications on top of BTCPay Server also use "),t("strong",[e._v("instances hosted by third-parties")]),e._v(". Some hosts try to spread the adoption of cryptocurrencies by allowing their local merchants to receive payments for free or for a small sign-up fee.")]),e._v(" "),t("p",[e._v("In layman words, think of this feature as a payment processor factory which allows anyone to deploy a server and help others receive payments which are validated via the server owners' "),t("a",{attrs:{href:"https://en.bitcoin.it/wiki/Full_node",target:"_blank",rel:"noopener noreferrer"}},[e._v("full Bitcoin node"),t("OutboundLink")],1),e._v(".")]),e._v(" "),t("p",[t("strong",[e._v("Third-party hosts")]),e._v(" play an important role in the ecosystem since they provide an easy and cost-effective "),t("strong",[e._v("way for users to try and use BTCPay Server")]),e._v(". The role of honest hosts who provide free service to others is essential in the early phase of BTCPay Server adoption. However, users should be familiar with the pros, cons and potential risks involved when using a trusted third-party. Find the optimal balance between your use-case, cost, and privacy/security trade-offs.")]),e._v(" "),t("p",[e._v("Some of the hosts are entirely free to use and maintain the server cost from donations of their users. If you've been using a reliable free host for a while, you should consider donating to them to support them.")]),e._v(" "),t("ul",[t("li",[t("a",{attrs:{href:"#third-party-hosting"}},[e._v("Third-party hosting")]),e._v(" "),t("ul",[t("li",[t("a",{attrs:{href:"#advantages-and-disadvantages"}},[e._v("Advantages and disadvantages")]),e._v(" "),t("ul",[t("li",[t("a",{attrs:{href:"#pros"}},[e._v("Pros")])]),e._v(" "),t("li",[t("a",{attrs:{href:"#cons"}},[e._v("Cons")])])])]),e._v(" "),t("li",[t("a",{attrs:{href:"#concerns-for-use"}},[e._v("Concerns For Use")]),e._v(" "),t("ul",[t("li",[t("a",{attrs:{href:"#security-concerns"}},[e._v("Security Concerns")])]),e._v(" "),t("li",[t("a",{attrs:{href:"#privacy-concerns"}},[e._v("Privacy Concerns")])]),e._v(" "),t("li",[t("a",{attrs:{href:"#trust-concerns"}},[e._v("Trust Concerns")])])])]),e._v(" "),t("li",[t("a",{attrs:{href:"#third-party-hosting-faq"}},[e._v("Third Party Hosting FAQ")])]),e._v(" "),t("li",[t("a",{attrs:{href:"#where-is-the-list-of-btcpay-third-party-hosts"}},[e._v("Where is the list of BTCPay third-party hosts?")])]),e._v(" "),t("li",[t("a",{attrs:{href:"#how-can-one-become-a-third-party-host"}},[e._v("How can one become a third-party host?")])]),e._v(" "),t("li",[t("a",{attrs:{href:"#are-there-any-limitations-in-features-when-using-a-third-party-host"}},[e._v("Are there any limitations in features when using a third-party host?")])]),e._v(" "),t("li",[t("a",{attrs:{href:"#can-i-enable-the-use-of-my-lightning-network-node-to-others"}},[e._v("Can I enable the use of my Lightning Network node to others?")])]),e._v(" "),t("li",[t("a",{attrs:{href:"#what-does-the-trusted-third-party-host-know-about-their-users"}},[e._v("What does the trusted third-party host know about their users?")])])])])]),e._v(" "),t("h2",{attrs:{id:"advantages-and-disadvantages"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#advantages-and-disadvantages"}},[e._v("#")]),e._v(" Advantages and disadvantages")]),e._v(" "),t("h3",{attrs:{id:"pros"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#pros"}},[e._v("#")]),e._v(" Pros")]),e._v(" "),t("ul",[t("li",[e._v("Easy and quicker setup")]),e._v(" "),t("li",[e._v("Cheaper and in most cases free (depending if the host is premium or free)")]),e._v(" "),t("li",[e._v("Receive payments directly to your wallet")]),e._v(" "),t("li",[e._v("Private key never required (if it is, it's a scam!)")])]),e._v(" "),t("h3",{attrs:{id:"cons"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#cons"}},[e._v("#")]),e._v(" Cons")]),e._v(" "),t("ul",[t("li",[e._v("Security concerns")]),e._v(" "),t("li",[e._v("Privacy concerns")]),e._v(" "),t("li",[e._v("Limitation of features")]),e._v(" "),t("li",[e._v("No control over a server")]),e._v(" "),t("li",[e._v("Have to trust the owner of the server")])]),e._v(" "),t("h2",{attrs:{id:"concerns-for-use"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#concerns-for-use"}},[e._v("#")]),e._v(" Concerns For Use")]),e._v(" "),t("h3",{attrs:{id:"security-concerns"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#security-concerns"}},[e._v("#")]),e._v(" Security Concerns")]),e._v(" "),t("p",[t("a",{attrs:{href:"https://nakamotoinstitute.org/trusted-third-parties/#selection-7.6-6.2",target:"_blank",rel:"noopener noreferrer"}},[e._v("Trusted third parties are security holes"),t("OutboundLink")],1),e._v(". By relying on someone else to manage a server for you, you are potentially exposing yourself to a certain attack vector.")]),e._v(" "),t("p",[e._v("The most significant attack vector when using a third-party host is the chance that this host will gain access to the management of your funds. This can occur in two ways.")]),e._v(" "),t("p",[e._v("First, a host may allow you to create "),t("a",{attrs:{href:"https://en.bitcoin.it/wiki/Hot_wallet",target:"_blank",rel:"noopener noreferrer"}},[e._v("hot wallets"),t("OutboundLink")],1),e._v(" on their server. This gives the host complete access to your funds. They will act as a custodian of your private keys and thus your funds. This means you must trust they will not spend your funds. This type of wallet is NOT recommended for use with third-party hosts.")]),e._v(" "),t("p",[e._v("Secondly, a malicious and technically skilled host can create a forked version of BTCPay Server and modify it to be able to either spy on your transactions or replace your "),t("a",{attrs:{href:"https://en.bitcoin.it/wiki/Deterministic_wallet_tools#Risks_of_Sharing_an_Extended_Public_Key_.28xpub.29",target:"_blank",rel:"noopener noreferrer"}},[e._v("extended public key"),t("OutboundLink")],1),e._v(" with their own. This means that future payments made to you may end up in this malicious party's wallet.")]),e._v(" "),t("p",[e._v("While a wallet connected with an extended public key IS recommended for use with third-party hosts, It's impossible to know for certain, if the third party host is using a malicious fork. If you don't trust the third party host it is best to do the following:")]),e._v(" "),t("ul",[t("li",[e._v("Do not use hot wallet on the third party server, use an extended public key")]),e._v(" "),t("li",[e._v("Use it mainly for testing, learning and getting started with BTCPay")]),e._v(" "),t("li",[e._v("Do not use it with high volume payments or extremely valuable transactions")])]),e._v(" "),t("p",[e._v("In BTCPay Server, a private key is never "),t("em",[e._v("required")]),e._v(". This means that funds are safe even if the server is hacked, but a malicious host can intercept future payments and steal those funds. If you follow your transactions via a watch-only wallet, you should be able to detect such attack quickly and notice that your orders are being marked as paid, whereas you don't see the transactions in your wallet.")]),e._v(" "),t("div",{staticClass:"custom-block danger"},[t("p",{staticClass:"custom-block-title"},[e._v("DANGER")]),e._v(" "),t("p",[e._v("If a third-party host asks for your private key or pre-generates one for you, be sure it's a scam. Never share your private key with anyone. It's called private for a reason.")])]),e._v(" "),t("p",[e._v("An extended public key replacement attack applies to a self-hosted server as well. A malicious hacker can try to hack your server and try to replace an extended public key.")]),e._v(" "),t("h3",{attrs:{id:"privacy-concerns"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#privacy-concerns"}},[e._v("#")]),e._v(" Privacy Concerns")]),e._v(" "),t("p",[e._v("BTCPay Server does not allow server hosts to view the stores of other users nor have access to any personal data (except for registration email address). The extended public key and even balances of other users can't be seen. However, as mentioned, a malicious third-party could modify that by creating a fork that can look like BTCPay Server on the front but be something completely different in reality.")]),e._v(" "),t("p",[e._v("The biggest concern, which happens when using a third-party host (even if the owner of a self-hosted server is not malicious) comes from the nature of the Bitcoin itself. If a user is not running a full node but instead relies on someone else's node, his transactions can be listened to by the owner of that node. Running a full node is not just a convenience that gives you features and enables privacy, it gives you better security and the right to \"vote\" and validate all the transactions yourself. Don't trust, verify.")]),e._v(" "),t("p",[e._v("Here are some good resources where you learn more about the importance of full nodes")]),e._v(" "),t("ul",[t("li",[t("a",{attrs:{href:"https://en.bitcoin.it/wiki/Why_Your_Business_Should_Use_a_Full_Node_to_Accept_Bitcoin",target:"_blank",rel:"noopener noreferrer"}},[e._v("Why Your Business Should Use a Full Node to Accept Bitcoin"),t("OutboundLink")],1)]),e._v(" "),t("li",[t("a",{attrs:{href:"https://en.bitcoin.it/wiki/Clearing_Up_Misconceptions_About_Full_Nodes",target:"_blank",rel:"noopener noreferrer"}},[e._v("Clearing Up Misconceptions About Full Nodes"),t("OutboundLink")],1)])]),e._v(" "),t("h3",{attrs:{id:"trust-concerns"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#trust-concerns"}},[e._v("#")]),e._v(" Trust Concerns")]),e._v(" "),t("p",[e._v("Third-party hosts have the ability to enable specific features for their non-admin users which require users to place some level of trust in the third-party host, if such features are used.")]),e._v(" "),t("p",[e._v("Specifically, third-party hosts should not enable the following policies without understanding that users will be using hot wallets on the server. These features are disabled by default for non-admins to reduce the risk considerations for both third-party hosts and their users:")]),e._v(" "),t("ul",[t("li",[e._v("Allow non-admins to create hot wallets for their stores")]),e._v(" "),t("li",[e._v("Allow non-admins to import their hot wallets to the node wallet")]),e._v(" "),t("li",[e._v("Allow non-admins to use the internal lightning node in their stores")])]),e._v(" "),t("p",[e._v("Third-party users who are granted access to an internal lightning node or hot wallet functionality to enable features such as Payjoin, should understand the risk and trust associated with "),t("RouterLink",{attrs:{to:"/CreateWallet/#hot-wallet"}},[e._v("using hot wallets")]),e._v(" before choosing to use it. Use one of the "),t("RouterLink",{attrs:{to:"/WalletSetup/"}},[e._v("recommended wallets")]),e._v(" which provide an extended public key to use in your store, if you are unsure which wallet type to use.")],1),e._v(" "),t("h2",{attrs:{id:"third-party-hosting-faq"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#third-party-hosting-faq"}},[e._v("#")]),e._v(" Third Party Hosting FAQ")]),e._v(" "),t("h2",{attrs:{id:"where-is-the-list-of-btcpay-third-party-hosts"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#where-is-the-list-of-btcpay-third-party-hosts"}},[e._v("#")]),e._v(" Where is the list of BTCPay third-party hosts?")]),e._v(" "),t("p",[e._v("Feel free to chat with the "),t("RouterLink",{attrs:{to:"/Community/"}},[e._v("Community")]),e._v(" to find the appropriate host for your needs, but also make sure to choose one that is trustworthy. Read the rest of this document to better understand the pros and cons of using a third-party host.")],1),e._v(" "),t("div",{staticClass:"custom-block tip"},[t("p",{staticClass:"custom-block-title"},[e._v("TIP")]),e._v(" "),t("p",[e._v("The BTCPay Server "),t("a",{attrs:{href:"https://directory.btcpayserver.org/filter/hosts",target:"_blank",rel:"noopener noreferrer"}},[e._v("Directory"),t("OutboundLink")],1),e._v(" lists multiple free or paid third-party hosts that you can register to, to start exploring BTCPay Server.")])]),e._v(" "),t("h2",{attrs:{id:"how-can-one-become-a-third-party-host"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#how-can-one-become-a-third-party-host"}},[e._v("#")]),e._v(" How can one become a third-party host?")]),e._v(" "),t("p",[e._v("To become a third-party host, you need to self-host a BTCPay Server and enable registration for other users.\nGo to Server Settings > Policies > Disable registration, unmark the checkbox. You may also want to configure the "),t("RouterLink",{attrs:{to:"/FAQ/ServerSettings/#how-to-configure-smtp-settings-in-btcpay"}},[e._v("SMTP settings")]),e._v(" to allow them to reset their password if they forget it.")],1),e._v(" "),t("p",[e._v("Alternatively you may keep public registration disabled on your homepage and only invite specific users to create a new account by "),t("RouterLink",{attrs:{to:"/FAQ/ServerSettings/#how-to-add-a-new-user-by-invite"}},[e._v("invitation link")]),e._v(".")],1),e._v(" "),t("h2",{attrs:{id:"are-there-any-limitations-in-features-when-using-a-third-party-host"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#are-there-any-limitations-in-features-when-using-a-third-party-host"}},[e._v("#")]),e._v(" Are there any limitations in features when using a third-party host?")]),e._v(" "),t("p",[e._v("Yes. Here are some restrictions.")]),e._v(" "),t("ul",[t("li",[e._v("No "),t("RouterLink",{attrs:{to:"/LightningNetwork/"}},[e._v("Lightning Network")]),e._v(" by default. Can be enabled by the third-party host but at the cost of a security risk for registrants using that third-party. "),t("a",{attrs:{href:"#can-i-enable-the-use-of-my-lightning-network-node-to-others"}},[e._v("More information")])],1),e._v(" "),t("li",[e._v("No "),t("RouterLink",{attrs:{to:"/FAQ/Wallet/#what-is-wallet-re-scan-in-btcpay"}},[e._v("wallet re-scan")])],1),e._v(" "),t("li",[e._v("No "),t("RouterLink",{attrs:{to:"/Walkthrough/#server-settings"}},[e._v("Server Settings")]),e._v(" access")],1)]),e._v(" "),t("p",[e._v("The limitations happen for technical reasons, mostly because these features require a user to run a full node to use them.")]),e._v(" "),t("h2",{attrs:{id:"can-i-enable-the-use-of-my-lightning-network-node-to-others"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#can-i-enable-the-use-of-my-lightning-network-node-to-others"}},[e._v("#")]),e._v(" Can I enable the use of my Lightning Network node to others?")]),e._v(" "),t("p",[e._v("Yes, you can enable users that have registered on your BTCPay Server instance to use your Lightning Network node.\n"),t("RouterLink",{attrs:{to:"/FAQ/LightningNetwork/#how-many-users-can-use-lightning-network-in-btcpay"}},[e._v("See how")])],1),e._v(" "),t("h2",{attrs:{id:"what-does-the-trusted-third-party-host-know-about-their-users"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#what-does-the-trusted-third-party-host-know-about-their-users"}},[e._v("#")]),e._v(" What does the trusted third-party host know about their users?")]),e._v(" "),t("p",[e._v("Third party hosts (non-malicious) can see the following:")]),e._v(" "),t("ul",[t("li",[e._v("Total number of users")]),e._v(" "),t("li",[e._v("The email and username of those users")])]),e._v(" "),t("p",[e._v("Note: If additional features are enabled such as non-admin lightning wallet, hot wallets or transmuter, the server admin can see additional information related to those features. Since it's impossible to know if the third party host is using a malicious fork, it's best to assume they may know all details about your BTCPay Server usage.")]),e._v(" "),t("p",[e._v("If you are worried about the information a third party host knows about you, please consider "),t("RouterLink",{attrs:{to:"/Deployment/"}},[e._v("deploying your own")]),e._v(" self-hosted server.")],1)])}),[],!1,null,null,null);t.default=a.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[116],{746:function(e,t,r){"use strict";r.r(t);var s=r(10),a=Object(s.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"third-party-hosting"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#third-party-hosting"}},[e._v("#")]),e._v(" Third-party hosting")]),e._v(" "),t("p",[e._v("A "),t("strong",[e._v("third-party host")]),e._v(" is an individual or a business which "),t("strong",[e._v("self-hosts a BTCPay Server instance and enables other users to register and use the server")]),e._v(". On a self-hosted server, the owner can add an unlimited amount of users and stores and allow those users to manage their stores independently and receive payments to their own wallets.")]),e._v(" "),t("p",[e._v("While this feature in BTCPay Server exists for complex multi-store business management, community enthusiasts use it to help other users (mostly beginners), sometimes skip an overwhelming step of "),t("strong",[e._v("deploying a self-hosted BTCPay server")]),e._v(". Users who want to test or develop applications on top of BTCPay Server also use "),t("strong",[e._v("instances hosted by third-parties")]),e._v(". Some hosts try to spread the adoption of cryptocurrencies by allowing their local merchants to receive payments for free or for a small sign-up fee.")]),e._v(" "),t("p",[e._v("In layman words, think of this feature as a payment processor factory which allows anyone to deploy a server and help others receive payments which are validated via the server owners' "),t("a",{attrs:{href:"https://en.bitcoin.it/wiki/Full_node",target:"_blank",rel:"noopener noreferrer"}},[e._v("full Bitcoin node"),t("OutboundLink")],1),e._v(".")]),e._v(" "),t("p",[t("strong",[e._v("Third-party hosts")]),e._v(" play an important role in the ecosystem since they provide an easy and cost-effective "),t("strong",[e._v("way for users to try and use BTCPay Server")]),e._v(". The role of honest hosts who provide free service to others is essential in the early phase of BTCPay Server adoption. However, users should be familiar with the pros, cons and potential risks involved when using a trusted third-party. Find the optimal balance between your use-case, cost, and privacy/security trade-offs.")]),e._v(" "),t("p",[e._v("Some of the hosts are entirely free to use and maintain the server cost from donations of their users. If you've been using a reliable free host for a while, you should consider donating to them to support them.")]),e._v(" "),t("ul",[t("li",[t("a",{attrs:{href:"#third-party-hosting"}},[e._v("Third-party hosting")]),e._v(" "),t("ul",[t("li",[t("a",{attrs:{href:"#advantages-and-disadvantages"}},[e._v("Advantages and disadvantages")]),e._v(" "),t("ul",[t("li",[t("a",{attrs:{href:"#pros"}},[e._v("Pros")])]),e._v(" "),t("li",[t("a",{attrs:{href:"#cons"}},[e._v("Cons")])])])]),e._v(" "),t("li",[t("a",{attrs:{href:"#concerns-for-use"}},[e._v("Concerns For Use")]),e._v(" "),t("ul",[t("li",[t("a",{attrs:{href:"#security-concerns"}},[e._v("Security Concerns")])]),e._v(" "),t("li",[t("a",{attrs:{href:"#privacy-concerns"}},[e._v("Privacy Concerns")])]),e._v(" "),t("li",[t("a",{attrs:{href:"#trust-concerns"}},[e._v("Trust Concerns")])])])]),e._v(" "),t("li",[t("a",{attrs:{href:"#third-party-hosting-faq"}},[e._v("Third Party Hosting FAQ")])]),e._v(" "),t("li",[t("a",{attrs:{href:"#where-is-the-list-of-btcpay-third-party-hosts"}},[e._v("Where is the list of BTCPay third-party hosts?")])]),e._v(" "),t("li",[t("a",{attrs:{href:"#how-can-one-become-a-third-party-host"}},[e._v("How can one become a third-party host?")])]),e._v(" "),t("li",[t("a",{attrs:{href:"#are-there-any-limitations-in-features-when-using-a-third-party-host"}},[e._v("Are there any limitations in features when using a third-party host?")])]),e._v(" "),t("li",[t("a",{attrs:{href:"#can-i-enable-the-use-of-my-lightning-network-node-to-others"}},[e._v("Can I enable the use of my Lightning Network node to others?")])]),e._v(" "),t("li",[t("a",{attrs:{href:"#what-does-the-trusted-third-party-host-know-about-their-users"}},[e._v("What does the trusted third-party host know about their users?")])])])])]),e._v(" "),t("h2",{attrs:{id:"advantages-and-disadvantages"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#advantages-and-disadvantages"}},[e._v("#")]),e._v(" Advantages and disadvantages")]),e._v(" "),t("h3",{attrs:{id:"pros"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#pros"}},[e._v("#")]),e._v(" Pros")]),e._v(" "),t("ul",[t("li",[e._v("Easy and quicker setup")]),e._v(" "),t("li",[e._v("Cheaper and in most cases free (depending if the host is premium or free)")]),e._v(" "),t("li",[e._v("Receive payments directly to your wallet")]),e._v(" "),t("li",[e._v("Private key never required (if it is, it's a scam!)")])]),e._v(" "),t("h3",{attrs:{id:"cons"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#cons"}},[e._v("#")]),e._v(" Cons")]),e._v(" "),t("ul",[t("li",[e._v("Security concerns")]),e._v(" "),t("li",[e._v("Privacy concerns")]),e._v(" "),t("li",[e._v("Limitation of features")]),e._v(" "),t("li",[e._v("No control over a server")]),e._v(" "),t("li",[e._v("Have to trust the owner of the server")])]),e._v(" "),t("h2",{attrs:{id:"concerns-for-use"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#concerns-for-use"}},[e._v("#")]),e._v(" Concerns For Use")]),e._v(" "),t("h3",{attrs:{id:"security-concerns"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#security-concerns"}},[e._v("#")]),e._v(" Security Concerns")]),e._v(" "),t("p",[t("a",{attrs:{href:"https://nakamotoinstitute.org/trusted-third-parties/#selection-7.6-6.2",target:"_blank",rel:"noopener noreferrer"}},[e._v("Trusted third parties are security holes"),t("OutboundLink")],1),e._v(". By relying on someone else to manage a server for you, you are potentially exposing yourself to a certain attack vector.")]),e._v(" "),t("p",[e._v("The most significant attack vector when using a third-party host is the chance that this host will gain access to the management of your funds. This can occur in two ways.")]),e._v(" "),t("p",[e._v("First, a host may allow you to create "),t("a",{attrs:{href:"https://en.bitcoin.it/wiki/Hot_wallet",target:"_blank",rel:"noopener noreferrer"}},[e._v("hot wallets"),t("OutboundLink")],1),e._v(" on their server. This gives the host complete access to your funds. They will act as a custodian of your private keys and thus your funds. This means you must trust they will not spend your funds. This type of wallet is NOT recommended for use with third-party hosts.")]),e._v(" "),t("p",[e._v("Secondly, a malicious and technically skilled host can create a forked version of BTCPay Server and modify it to be able to either spy on your transactions or replace your "),t("a",{attrs:{href:"https://en.bitcoin.it/wiki/Deterministic_wallet_tools#Risks_of_Sharing_an_Extended_Public_Key_.28xpub.29",target:"_blank",rel:"noopener noreferrer"}},[e._v("extended public key"),t("OutboundLink")],1),e._v(" with their own. This means that future payments made to you may end up in this malicious party's wallet.")]),e._v(" "),t("p",[e._v("While a wallet connected with an extended public key IS recommended for use with third-party hosts, It's impossible to know for certain, if the third party host is using a malicious fork. If you don't trust the third party host it is best to do the following:")]),e._v(" "),t("ul",[t("li",[e._v("Do not use hot wallet on the third party server, use an extended public key")]),e._v(" "),t("li",[e._v("Use it mainly for testing, learning and getting started with BTCPay")]),e._v(" "),t("li",[e._v("Do not use it with high volume payments or extremely valuable transactions")])]),e._v(" "),t("p",[e._v("In BTCPay Server, a private key is never "),t("em",[e._v("required")]),e._v(". This means that funds are safe even if the server is hacked, but a malicious host can intercept future payments and steal those funds. If you follow your transactions via a watch-only wallet, you should be able to detect such attack quickly and notice that your orders are being marked as paid, whereas you don't see the transactions in your wallet.")]),e._v(" "),t("div",{staticClass:"custom-block danger"},[t("p",{staticClass:"custom-block-title"},[e._v("DANGER")]),e._v(" "),t("p",[e._v("If a third-party host asks for your private key or pre-generates one for you, be sure it's a scam. Never share your private key with anyone. It's called private for a reason.")])]),e._v(" "),t("p",[e._v("An extended public key replacement attack applies to a self-hosted server as well. A malicious hacker can try to hack your server and try to replace an extended public key.")]),e._v(" "),t("h3",{attrs:{id:"privacy-concerns"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#privacy-concerns"}},[e._v("#")]),e._v(" Privacy Concerns")]),e._v(" "),t("p",[e._v("BTCPay Server does not allow server hosts to view the stores of other users nor have access to any personal data (except for registration email address). The extended public key and even balances of other users can't be seen. However, as mentioned, a malicious third-party could modify that by creating a fork that can look like BTCPay Server on the front but be something completely different in reality.")]),e._v(" "),t("p",[e._v("The biggest concern, which happens when using a third-party host (even if the owner of a self-hosted server is not malicious) comes from the nature of the Bitcoin itself. If a user is not running a full node but instead relies on someone else's node, his transactions can be listened to by the owner of that node. Running a full node is not just a convenience that gives you features and enables privacy, it gives you better security and the right to \"vote\" and validate all the transactions yourself. Don't trust, verify.")]),e._v(" "),t("p",[e._v("Here are some good resources where you learn more about the importance of full nodes")]),e._v(" "),t("ul",[t("li",[t("a",{attrs:{href:"https://en.bitcoin.it/wiki/Why_Your_Business_Should_Use_a_Full_Node_to_Accept_Bitcoin",target:"_blank",rel:"noopener noreferrer"}},[e._v("Why Your Business Should Use a Full Node to Accept Bitcoin"),t("OutboundLink")],1)]),e._v(" "),t("li",[t("a",{attrs:{href:"https://en.bitcoin.it/wiki/Clearing_Up_Misconceptions_About_Full_Nodes",target:"_blank",rel:"noopener noreferrer"}},[e._v("Clearing Up Misconceptions About Full Nodes"),t("OutboundLink")],1)])]),e._v(" "),t("h3",{attrs:{id:"trust-concerns"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#trust-concerns"}},[e._v("#")]),e._v(" Trust Concerns")]),e._v(" "),t("p",[e._v("Third-party hosts have the ability to enable specific features for their non-admin users which require users to place some level of trust in the third-party host, if such features are used.")]),e._v(" "),t("p",[e._v("Specifically, third-party hosts should not enable the following policies without understanding that users will be using hot wallets on the server. These features are disabled by default for non-admins to reduce the risk considerations for both third-party hosts and their users:")]),e._v(" "),t("ul",[t("li",[e._v("Allow non-admins to create hot wallets for their stores")]),e._v(" "),t("li",[e._v("Allow non-admins to import their hot wallets to the node wallet")]),e._v(" "),t("li",[e._v("Allow non-admins to use the internal lightning node in their stores")])]),e._v(" "),t("p",[e._v("Third-party users who are granted access to an internal lightning node or hot wallet functionality to enable features such as Payjoin, should understand the risk and trust associated with "),t("RouterLink",{attrs:{to:"/CreateWallet/#hot-wallet"}},[e._v("using hot wallets")]),e._v(" before choosing to use it. Use one of the "),t("RouterLink",{attrs:{to:"/WalletSetup/"}},[e._v("recommended wallets")]),e._v(" which provide an extended public key to use in your store, if you are unsure which wallet type to use.")],1),e._v(" "),t("h2",{attrs:{id:"third-party-hosting-faq"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#third-party-hosting-faq"}},[e._v("#")]),e._v(" Third Party Hosting FAQ")]),e._v(" "),t("h2",{attrs:{id:"where-is-the-list-of-btcpay-third-party-hosts"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#where-is-the-list-of-btcpay-third-party-hosts"}},[e._v("#")]),e._v(" Where is the list of BTCPay third-party hosts?")]),e._v(" "),t("p",[e._v("Feel free to chat with the "),t("RouterLink",{attrs:{to:"/Community/"}},[e._v("Community")]),e._v(" to find the appropriate host for your needs, but also make sure to choose one that is trustworthy. Read the rest of this document to better understand the pros and cons of using a third-party host.")],1),e._v(" "),t("div",{staticClass:"custom-block tip"},[t("p",{staticClass:"custom-block-title"},[e._v("TIP")]),e._v(" "),t("p",[e._v("The BTCPay Server "),t("a",{attrs:{href:"https://directory.btcpayserver.org/filter/hosts",target:"_blank",rel:"noopener noreferrer"}},[e._v("Directory"),t("OutboundLink")],1),e._v(" lists multiple free or paid third-party hosts that you can register to, to start exploring BTCPay Server.")])]),e._v(" "),t("h2",{attrs:{id:"how-can-one-become-a-third-party-host"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#how-can-one-become-a-third-party-host"}},[e._v("#")]),e._v(" How can one become a third-party host?")]),e._v(" "),t("p",[e._v("To become a third-party host, you need to self-host a BTCPay Server and enable registration for other users.\nGo to Server Settings > Policies > Disable registration, unmark the checkbox. You may also want to configure the "),t("RouterLink",{attrs:{to:"/FAQ/ServerSettings/#how-to-configure-smtp-settings-in-btcpay"}},[e._v("SMTP settings")]),e._v(" to allow them to reset their password if they forget it.")],1),e._v(" "),t("p",[e._v("Alternatively you may keep public registration disabled on your homepage and only invite specific users to create a new account by "),t("RouterLink",{attrs:{to:"/FAQ/ServerSettings/#how-to-add-a-new-user-by-invite"}},[e._v("invitation link")]),e._v(".")],1),e._v(" "),t("h2",{attrs:{id:"are-there-any-limitations-in-features-when-using-a-third-party-host"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#are-there-any-limitations-in-features-when-using-a-third-party-host"}},[e._v("#")]),e._v(" Are there any limitations in features when using a third-party host?")]),e._v(" "),t("p",[e._v("Yes. Here are some restrictions.")]),e._v(" "),t("ul",[t("li",[e._v("No "),t("RouterLink",{attrs:{to:"/LightningNetwork/"}},[e._v("Lightning Network")]),e._v(" by default. Can be enabled by the third-party host but at the cost of a security risk for registrants using that third-party. "),t("a",{attrs:{href:"#can-i-enable-the-use-of-my-lightning-network-node-to-others"}},[e._v("More information")])],1),e._v(" "),t("li",[e._v("No "),t("RouterLink",{attrs:{to:"/FAQ/Wallet/#what-is-wallet-re-scan-in-btcpay"}},[e._v("wallet re-scan")])],1),e._v(" "),t("li",[e._v("No "),t("RouterLink",{attrs:{to:"/Walkthrough/#server-settings"}},[e._v("Server Settings")]),e._v(" access")],1)]),e._v(" "),t("p",[e._v("The limitations happen for technical reasons, mostly because these features require a user to run a full node to use them.")]),e._v(" "),t("h2",{attrs:{id:"can-i-enable-the-use-of-my-lightning-network-node-to-others"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#can-i-enable-the-use-of-my-lightning-network-node-to-others"}},[e._v("#")]),e._v(" Can I enable the use of my Lightning Network node to others?")]),e._v(" "),t("p",[e._v("Yes, you can enable users that have registered on your BTCPay Server instance to use your Lightning Network node.\n"),t("RouterLink",{attrs:{to:"/FAQ/LightningNetwork/#how-many-users-can-use-lightning-network-in-btcpay"}},[e._v("See how")])],1),e._v(" "),t("h2",{attrs:{id:"what-does-the-trusted-third-party-host-know-about-their-users"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#what-does-the-trusted-third-party-host-know-about-their-users"}},[e._v("#")]),e._v(" What does the trusted third-party host know about their users?")]),e._v(" "),t("p",[e._v("Third party hosts (non-malicious) can see the following:")]),e._v(" "),t("ul",[t("li",[e._v("Total number of users")]),e._v(" "),t("li",[e._v("The email and username of those users")])]),e._v(" "),t("p",[e._v("Note: If additional features are enabled such as non-admin lightning wallet, hot wallets or transmuter, the server admin can see additional information related to those features. Since it's impossible to know if the third party host is using a malicious fork, it's best to assume they may know all details about your BTCPay Server usage.")]),e._v(" "),t("p",[e._v("If you are worried about the information a third party host knows about you, please consider "),t("RouterLink",{attrs:{to:"/Deployment/"}},[e._v("deploying your own")]),e._v(" self-hosted server.")],1)])}),[],!1,null,null,null);t.default=a.exports}}]); \ No newline at end of file diff --git a/assets/js/117.0641f264.js b/assets/js/117.4c666d9e.js similarity index 98% rename from assets/js/117.0641f264.js rename to assets/js/117.4c666d9e.js index 1c81c1dadb..899930f5aa 100644 --- a/assets/js/117.0641f264.js +++ b/assets/js/117.4c666d9e.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[117],{746:function(e,t,o){"use strict";o.r(t);var r=o(10),a=Object(r.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"introduction-to-web-deployments"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#introduction-to-web-deployments"}},[e._v("#")]),e._v(" Introduction to Web Deployments")]),e._v(" "),t("p",[e._v("We will take you through possible "),t("code",[e._v("Web Deployments")]),e._v(" on this page and update the list as more providers offer BTCPay Server as a service.\nBut what is a "),t("code",[e._v("Web deployment")]),e._v("?\nIn short, a third-party hosted environment.")]),e._v(" "),t("p",[e._v("What do they do? They offer you the user, storage space, and compute power.\nAnd in particular, for this page, they offer hosted Bitcoin nodes.")]),e._v(" "),t("p",[e._v("Now you don't have to buy, host and maintain your own hardware. The service provider takes care of this.\nThis comes with the risk factor of trusting someone to host your bitcoin node and BTCPay Server on top of that.\nEvery hoster comes with its own pros and cons. One might be cheaper, and the other maybe has better support levels.\nHowever, we will guide you through the ones we've listed and offer BTCPay Server solutions.")]),e._v(" "),t("p",[e._v("Below you will find a short introduction to each service and a detailed guide on each of them.")]),e._v(" "),t("h2",{attrs:{id:"known-web-deployments"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#known-web-deployments"}},[e._v("#")]),e._v(" Known web deployments.")]),e._v(" "),t("h3",{attrs:{id:"lunanode-web-wizard"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#lunanode-web-wizard"}},[e._v("#")]),e._v(" LunaNode web-wizard.")]),e._v(" "),t("p",[t("a",{attrs:{href:"https://www.lunanode.com/",target:"_blank",rel:"noopener noreferrer"}},[e._v("LunaNode"),t("OutboundLink")],1),e._v(" is a Canadian-based hosting provider that accepts Bitcoin payments and requires no personal identification except for a phone number verification.")]),e._v(" "),t("p",[e._v("Their web wizard is one of the easiest ways to "),t("strong",[e._v("deploy BTCPay Servers from a very user-friendly interface")]),e._v(".\nLunaNode will provide you with a generic domain for your server to get you started.")]),e._v(" "),t("p",[e._v("For more details on "),t("code",[e._v("LunaNode")]),e._v(" click "),t("RouterLink",{attrs:{to:"/Deployment/LunaNode/"}},[e._v("here")])],1),e._v(" "),t("h3",{attrs:{id:"voltage-cloud"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#voltage-cloud"}},[e._v("#")]),e._v(" Voltage Cloud")]),e._v(" "),t("p",[t("a",{attrs:{href:"https://www.voltage.cloud",target:"_blank",rel:"noopener noreferrer"}},[e._v("Voltage"),t("OutboundLink")],1),e._v(" is an infrastructure provider for Bitcoin.\nBy focusing on Bitcoin exclusively, they can offer quality services to their clients.\nAutomatically connect your Voltage Lightning node.")]),e._v(" "),t("p",[e._v("For more details on "),t("code",[e._v("Voltage Cloud")]),e._v(" click "),t("RouterLink",{attrs:{to:"/Deployment/voltagecloud/"}},[e._v("here")])],1),e._v(" "),t("h3",{attrs:{id:"dreamlab-network-solutions"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#dreamlab-network-solutions"}},[e._v("#")]),e._v(" DreamLab Network Solutions")]),e._v(" "),t("p",[t("a",{attrs:{href:"https://dreamlabnetwork.solutions",target:"_blank",rel:"noopener noreferrer"}},[e._v("DreamLab Network Solutions"),t("OutboundLink")],1),e._v(" has datacenters around the globe.\nNow out of their North American location, they have started hosting BTCPay Server as a service.\nWith 24/7 support and a future of multiple locations of hosting check "),t("code",[e._v("Dreamlab Networks")]),e._v(" BTCPay Server setup guide "),t("RouterLink",{attrs:{to:"/Deployment/DreamlabNetwork/"}},[e._v("here")])],1),e._v(" "),t("h3",{attrs:{id:"clovyr"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#clovyr"}},[e._v("#")]),e._v(" Clovyr")]),e._v(" "),t("p",[t("a",{attrs:{href:"https://clovyr.app/",target:"_blank",rel:"noopener noreferrer"}},[e._v("Clovyr"),t("OutboundLink")],1),e._v(" is an application deployment service.\nThey allow deploying services, including BTCPay Server, either to their own servers, or to a variety of other VPS providers, such as Digital Ocean, AWS, and Linode.\nFor more details on "),t("code",[e._v("Clovyr")]),e._v(" click "),t("RouterLink",{attrs:{to:"/Deployment/Clovyr/"}},[e._v("here")])],1),e._v(" "),t("h2",{attrs:{id:"missing-deployments"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#missing-deployments"}},[e._v("#")]),e._v(" Missing deployments?")]),e._v(" "),t("p",[e._v("As we are a FOSS project, we might miss certain deployments.\nFound a deployment that is missing, and do you want it added or notified us?\nJoin the "),t("a",{attrs:{href:"https://chat.btcpayserver.org/",target:"_blank",rel:"noopener noreferrer"}},[e._v("community chat"),t("OutboundLink")],1),e._v(" on Mattermost by downloading "),t("a",{attrs:{href:"https://mattermost.com/download/",target:"_blank",rel:"noopener noreferrer"}},[e._v("Mattermost app"),t("OutboundLink")],1),e._v(", or on "),t("a",{attrs:{href:"https://t.me/btcpayserver",target:"_blank",rel:"noopener noreferrer"}},[e._v("Telegram"),t("OutboundLink")],1),e._v(" and tell us about it.\nYou can also create an issue in the BTCPay server Documents on "),t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver-doc/issues",target:"_blank",rel:"noopener noreferrer"}},[e._v("Github"),t("OutboundLink")],1),e._v(".")])])}),[],!1,null,null,null);t.default=a.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[117],{747:function(e,t,o){"use strict";o.r(t);var r=o(10),a=Object(r.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"introduction-to-web-deployments"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#introduction-to-web-deployments"}},[e._v("#")]),e._v(" Introduction to Web Deployments")]),e._v(" "),t("p",[e._v("We will take you through possible "),t("code",[e._v("Web Deployments")]),e._v(" on this page and update the list as more providers offer BTCPay Server as a service.\nBut what is a "),t("code",[e._v("Web deployment")]),e._v("?\nIn short, a third-party hosted environment.")]),e._v(" "),t("p",[e._v("What do they do? They offer you the user, storage space, and compute power.\nAnd in particular, for this page, they offer hosted Bitcoin nodes.")]),e._v(" "),t("p",[e._v("Now you don't have to buy, host and maintain your own hardware. The service provider takes care of this.\nThis comes with the risk factor of trusting someone to host your bitcoin node and BTCPay Server on top of that.\nEvery hoster comes with its own pros and cons. One might be cheaper, and the other maybe has better support levels.\nHowever, we will guide you through the ones we've listed and offer BTCPay Server solutions.")]),e._v(" "),t("p",[e._v("Below you will find a short introduction to each service and a detailed guide on each of them.")]),e._v(" "),t("h2",{attrs:{id:"known-web-deployments"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#known-web-deployments"}},[e._v("#")]),e._v(" Known web deployments.")]),e._v(" "),t("h3",{attrs:{id:"lunanode-web-wizard"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#lunanode-web-wizard"}},[e._v("#")]),e._v(" LunaNode web-wizard.")]),e._v(" "),t("p",[t("a",{attrs:{href:"https://www.lunanode.com/",target:"_blank",rel:"noopener noreferrer"}},[e._v("LunaNode"),t("OutboundLink")],1),e._v(" is a Canadian-based hosting provider that accepts Bitcoin payments and requires no personal identification except for a phone number verification.")]),e._v(" "),t("p",[e._v("Their web wizard is one of the easiest ways to "),t("strong",[e._v("deploy BTCPay Servers from a very user-friendly interface")]),e._v(".\nLunaNode will provide you with a generic domain for your server to get you started.")]),e._v(" "),t("p",[e._v("For more details on "),t("code",[e._v("LunaNode")]),e._v(" click "),t("RouterLink",{attrs:{to:"/Deployment/LunaNode/"}},[e._v("here")])],1),e._v(" "),t("h3",{attrs:{id:"voltage-cloud"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#voltage-cloud"}},[e._v("#")]),e._v(" Voltage Cloud")]),e._v(" "),t("p",[t("a",{attrs:{href:"https://www.voltage.cloud",target:"_blank",rel:"noopener noreferrer"}},[e._v("Voltage"),t("OutboundLink")],1),e._v(" is an infrastructure provider for Bitcoin.\nBy focusing on Bitcoin exclusively, they can offer quality services to their clients.\nAutomatically connect your Voltage Lightning node.")]),e._v(" "),t("p",[e._v("For more details on "),t("code",[e._v("Voltage Cloud")]),e._v(" click "),t("RouterLink",{attrs:{to:"/Deployment/voltagecloud/"}},[e._v("here")])],1),e._v(" "),t("h3",{attrs:{id:"dreamlab-network-solutions"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#dreamlab-network-solutions"}},[e._v("#")]),e._v(" DreamLab Network Solutions")]),e._v(" "),t("p",[t("a",{attrs:{href:"https://dreamlabnetwork.solutions",target:"_blank",rel:"noopener noreferrer"}},[e._v("DreamLab Network Solutions"),t("OutboundLink")],1),e._v(" has datacenters around the globe.\nNow out of their North American location, they have started hosting BTCPay Server as a service.\nWith 24/7 support and a future of multiple locations of hosting check "),t("code",[e._v("Dreamlab Networks")]),e._v(" BTCPay Server setup guide "),t("RouterLink",{attrs:{to:"/Deployment/DreamlabNetwork/"}},[e._v("here")])],1),e._v(" "),t("h3",{attrs:{id:"clovyr"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#clovyr"}},[e._v("#")]),e._v(" Clovyr")]),e._v(" "),t("p",[t("a",{attrs:{href:"https://clovyr.app/",target:"_blank",rel:"noopener noreferrer"}},[e._v("Clovyr"),t("OutboundLink")],1),e._v(" is an application deployment service.\nThey allow deploying services, including BTCPay Server, either to their own servers, or to a variety of other VPS providers, such as Digital Ocean, AWS, and Linode.\nFor more details on "),t("code",[e._v("Clovyr")]),e._v(" click "),t("RouterLink",{attrs:{to:"/Deployment/Clovyr/"}},[e._v("here")])],1),e._v(" "),t("h2",{attrs:{id:"missing-deployments"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#missing-deployments"}},[e._v("#")]),e._v(" Missing deployments?")]),e._v(" "),t("p",[e._v("As we are a FOSS project, we might miss certain deployments.\nFound a deployment that is missing, and do you want it added or notified us?\nJoin the "),t("a",{attrs:{href:"https://chat.btcpayserver.org/",target:"_blank",rel:"noopener noreferrer"}},[e._v("community chat"),t("OutboundLink")],1),e._v(" on Mattermost by downloading "),t("a",{attrs:{href:"https://mattermost.com/download/",target:"_blank",rel:"noopener noreferrer"}},[e._v("Mattermost app"),t("OutboundLink")],1),e._v(", or on "),t("a",{attrs:{href:"https://t.me/btcpayserver",target:"_blank",rel:"noopener noreferrer"}},[e._v("Telegram"),t("OutboundLink")],1),e._v(" and tell us about it.\nYou can also create an issue in the BTCPay server Documents on "),t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver-doc/issues",target:"_blank",rel:"noopener noreferrer"}},[e._v("Github"),t("OutboundLink")],1),e._v(".")])])}),[],!1,null,null,null);t.default=a.exports}}]); \ No newline at end of file diff --git a/assets/js/122.1b01a7e9.js b/assets/js/122.90d93749.js similarity index 99% rename from assets/js/122.1b01a7e9.js rename to assets/js/122.90d93749.js index ba9f80e455..2f29805000 100644 --- a/assets/js/122.1b01a7e9.js +++ b/assets/js/122.90d93749.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[122],{753:function(t,s,a){"use strict";a.r(s);var e=a(10),n=Object(e.a)({},(function(){var t=this,s=t._self._c;return s("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[s("h1",{attrs:{id:"invoice-metadata"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#invoice-metadata"}},[t._v("#")]),t._v(" Invoice metadata")]),t._v(" "),s("p",[t._v("Each invoice contains metadata, which is a customizable JSON object that can be tailored through the API during the creation of an invoice. Although it lacks a fixed schema, certain properties within the metadata can be interpreted by the UI.")]),t._v(" "),s("p",[t._v("This page provides an overview of these properties and explains how they are utilized within the BTCPay Server.")]),t._v(" "),s("h2",{attrs:{id:"well-known-properties"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#well-known-properties"}},[t._v("#")]),t._v(" Well-known properties")]),t._v(" "),s("table",[s("thead",[s("tr",[s("th",[t._v("Property path")]),t._v(" "),s("th",[t._v("Description")])])]),t._v(" "),s("tbody",[s("tr",[s("td",[s("code",[t._v(".orderId")])]),t._v(" "),s("td",[t._v("Refers to the order ID from an external system, such as an e-commerce platform like WooCommerce. This property is indexed, allowing for efficient invoice searches using the "),s("code",[t._v("orderId")]),t._v(".")])]),t._v(" "),s("tr",[s("td",[s("code",[t._v(".orderUrl")])]),t._v(" "),s("td",[t._v("Refers to a URL linking back to the order page of the external system. This link is displayed in the invoice details view.")])]),t._v(" "),s("tr",[s("td",[s("code",[t._v(".paymentRequestId")])]),t._v(" "),s("td",[t._v("In the invoice details view, a link is provided for navigating to the payment request page associated with the invoice.")])]),t._v(" "),s("tr",[s("td",[s("code",[t._v(".posData")])]),t._v(" "),s("td",[t._v("A custom JSON object that represents information displayed in the invoice details view.")])]),t._v(" "),s("tr",[s("td",[s("code",[t._v(".receiptData")])]),t._v(" "),s("td",[t._v("A custom JSON object that represents information displayed on the receipt page of an invoice.")])]),t._v(" "),s("tr",[s("td",[s("code",[t._v(".buyerName")])]),t._v(" "),s("td",[t._v("Visible in the invoice details view and in the BitPay API-compatible endpoints.")])]),t._v(" "),s("tr",[s("td",[s("code",[t._v(".buyerEmail")])]),t._v(" "),s("td",[t._v("Visible in the invoice details view and in the BitPay API-compatible endpoints.")])]),t._v(" "),s("tr",[s("td",[s("code",[t._v(".buyerAddress1")])]),t._v(" "),s("td",[t._v("Visible in the invoice details view and in the BitPay API-compatible endpoints.")])]),t._v(" "),s("tr",[s("td",[s("code",[t._v(".buyerAddress2")])]),t._v(" "),s("td",[t._v("Visible in the invoice details view and in the BitPay API-compatible endpoints.")])]),t._v(" "),s("tr",[s("td",[s("code",[t._v(".buyerCity")])]),t._v(" "),s("td",[t._v("Visible in the invoice details view and in the BitPay API-compatible endpoints.")])]),t._v(" "),s("tr",[s("td",[s("code",[t._v(".buyerState")])]),t._v(" "),s("td",[t._v("Visible in the invoice details view and in the BitPay API-compatible endpoints.")])]),t._v(" "),s("tr",[s("td",[s("code",[t._v(".buyerZip")])]),t._v(" "),s("td",[t._v("Visible in the invoice details view and in the BitPay API-compatible endpoints.")])]),t._v(" "),s("tr",[s("td",[s("code",[t._v(".buyerCountry")])]),t._v(" "),s("td",[t._v("Visible in the invoice details view and in the BitPay API-compatible endpoints.")])]),t._v(" "),s("tr",[s("td",[s("code",[t._v(".buyerPhone")])]),t._v(" "),s("td",[t._v("Visible in the invoice details view and in the BitPay API-compatible endpoints.")])]),t._v(" "),s("tr",[s("td",[s("code",[t._v(".itemDesc")])]),t._v(" "),s("td",[t._v("When using the Point of Sale (except in keypad or cart view), this field is set to the item description of the purchased item. This information is included in the CSV invoice export feature and appears in the invoice details view.")])]),t._v(" "),s("tr",[s("td",[s("code",[t._v(".itemCode")])]),t._v(" "),s("td",[t._v("When using the Point of Sale (except in keypad or cart view), this field is set to the item code of the purchased item. This information is included in the CSV invoice export feature and appears in the invoice details view.")])]),t._v(" "),s("tr",[s("td",[s("code",[t._v(".physical")])]),t._v(" "),s("td",[t._v("Boolean value indicating whether this is a physical good; displayed in the invoice details view and in the BitPay API-compatible endpoints.")])]),t._v(" "),s("tr",[s("td",[s("code",[t._v(".taxIncluded")])]),t._v(" "),s("td",[t._v("Number representing the tax amount in the invoice currency. This information will appear in the invoice details view. During invoice creation, the value is automatically rounded to significant digits and ensured not to be greater than the invoice's price.")])])])]),t._v(" "),s("h2",{attrs:{id:"examples"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#examples"}},[t._v("#")]),t._v(" Examples")]),t._v(" "),s("p",[t._v("Point of sale invoice (Product list view):")]),t._v(" "),s("div",{staticClass:"language-json extra-class"},[s("pre",{pre:!0,attrs:{class:"language-json"}},[s("code",[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"orderId"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"pos-app_346KRC5BjXXXo8cRFKwTBmdR6ZJ4"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"itemCode"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"green tea"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"itemDesc"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Green Tea"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"orderUrl"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"https://localhost:14142/apps/346KRC5BjXXXo8cRFKwTBmdR6ZJ4/pos"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"receiptData"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"Title"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Green Tea"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"Description"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("\"Lovely, fresh and tender, Meng Ding Gan Lu ('sweet dew') is grown in the lush Meng Ding Mountains of the southwestern province of Sichuan where it has been cultivated for over a thousand years.\"")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),s("p",[t._v("Point of sale invoice (Cart view):")]),t._v(" "),s("div",{staticClass:"language-json extra-class"},[s("pre",{pre:!0,attrs:{class:"language-json"}},[s("code",[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"orderId"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"pos-app_346KRC5BjXXXo8cRFKwTBmdR6ZJ4"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"posData"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"tip"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0.48")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"cart"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"id"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"pu erh"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"count"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"image"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"~/img/pos-sample/pu-erh.jpg"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"price"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"type"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"value"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"formatted"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"$2.00"')]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"title"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Pu Erh"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"inventory"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token null keyword"}},[t._v("null")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"id"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"rooibos"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"count"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"image"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"~/img/pos-sample/rooibos.jpg"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"price"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"type"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"value"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1.2")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"formatted"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"$1.20"')]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"title"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Rooibos"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"inventory"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token null keyword"}},[t._v("null")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"total"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("3.68")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"subTotal"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("3.2")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"customAmount"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"discountAmount"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"discountPercentage"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"itemDesc"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Tea shop"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"orderUrl"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"https://localhost:14142/apps/346KRC5BjXXXo8cRFKwTBmdR6ZJ4/pos"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"receiptData"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"Tip"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"$0.48"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"Cart"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"Pu Erh"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"$2.00 x 1 = $2.00"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"Rooibos"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"$1.20 x 1 = $1.20"')]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),s("p",[t._v("Point of sale invoice (Keypad view):")]),t._v(" "),s("div",{staticClass:"language-json extra-class"},[s("pre",{pre:!0,attrs:{class:"language-json"}},[s("code",[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"orderId"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"pos-app_346KRC5BjXXXo8cRFKwTBmdR6ZJ4"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"posData"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"total"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"12.00"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"subTotal"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"12.00"')]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"itemDesc"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Tea shop"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"orderUrl"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"https://localhost:14142/apps/346KRC5BjXXXo8cRFKwTBmdR6ZJ4/pos"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"receiptData"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])])])}),[],!1,null,null,null);s.default=n.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[122],{752:function(t,s,a){"use strict";a.r(s);var e=a(10),n=Object(e.a)({},(function(){var t=this,s=t._self._c;return s("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[s("h1",{attrs:{id:"invoice-metadata"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#invoice-metadata"}},[t._v("#")]),t._v(" Invoice metadata")]),t._v(" "),s("p",[t._v("Each invoice contains metadata, which is a customizable JSON object that can be tailored through the API during the creation of an invoice. Although it lacks a fixed schema, certain properties within the metadata can be interpreted by the UI.")]),t._v(" "),s("p",[t._v("This page provides an overview of these properties and explains how they are utilized within the BTCPay Server.")]),t._v(" "),s("h2",{attrs:{id:"well-known-properties"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#well-known-properties"}},[t._v("#")]),t._v(" Well-known properties")]),t._v(" "),s("table",[s("thead",[s("tr",[s("th",[t._v("Property path")]),t._v(" "),s("th",[t._v("Description")])])]),t._v(" "),s("tbody",[s("tr",[s("td",[s("code",[t._v(".orderId")])]),t._v(" "),s("td",[t._v("Refers to the order ID from an external system, such as an e-commerce platform like WooCommerce. This property is indexed, allowing for efficient invoice searches using the "),s("code",[t._v("orderId")]),t._v(".")])]),t._v(" "),s("tr",[s("td",[s("code",[t._v(".orderUrl")])]),t._v(" "),s("td",[t._v("Refers to a URL linking back to the order page of the external system. This link is displayed in the invoice details view.")])]),t._v(" "),s("tr",[s("td",[s("code",[t._v(".paymentRequestId")])]),t._v(" "),s("td",[t._v("In the invoice details view, a link is provided for navigating to the payment request page associated with the invoice.")])]),t._v(" "),s("tr",[s("td",[s("code",[t._v(".posData")])]),t._v(" "),s("td",[t._v("A custom JSON object that represents information displayed in the invoice details view.")])]),t._v(" "),s("tr",[s("td",[s("code",[t._v(".receiptData")])]),t._v(" "),s("td",[t._v("A custom JSON object that represents information displayed on the receipt page of an invoice.")])]),t._v(" "),s("tr",[s("td",[s("code",[t._v(".buyerName")])]),t._v(" "),s("td",[t._v("Visible in the invoice details view and in the BitPay API-compatible endpoints.")])]),t._v(" "),s("tr",[s("td",[s("code",[t._v(".buyerEmail")])]),t._v(" "),s("td",[t._v("Visible in the invoice details view and in the BitPay API-compatible endpoints.")])]),t._v(" "),s("tr",[s("td",[s("code",[t._v(".buyerAddress1")])]),t._v(" "),s("td",[t._v("Visible in the invoice details view and in the BitPay API-compatible endpoints.")])]),t._v(" "),s("tr",[s("td",[s("code",[t._v(".buyerAddress2")])]),t._v(" "),s("td",[t._v("Visible in the invoice details view and in the BitPay API-compatible endpoints.")])]),t._v(" "),s("tr",[s("td",[s("code",[t._v(".buyerCity")])]),t._v(" "),s("td",[t._v("Visible in the invoice details view and in the BitPay API-compatible endpoints.")])]),t._v(" "),s("tr",[s("td",[s("code",[t._v(".buyerState")])]),t._v(" "),s("td",[t._v("Visible in the invoice details view and in the BitPay API-compatible endpoints.")])]),t._v(" "),s("tr",[s("td",[s("code",[t._v(".buyerZip")])]),t._v(" "),s("td",[t._v("Visible in the invoice details view and in the BitPay API-compatible endpoints.")])]),t._v(" "),s("tr",[s("td",[s("code",[t._v(".buyerCountry")])]),t._v(" "),s("td",[t._v("Visible in the invoice details view and in the BitPay API-compatible endpoints.")])]),t._v(" "),s("tr",[s("td",[s("code",[t._v(".buyerPhone")])]),t._v(" "),s("td",[t._v("Visible in the invoice details view and in the BitPay API-compatible endpoints.")])]),t._v(" "),s("tr",[s("td",[s("code",[t._v(".itemDesc")])]),t._v(" "),s("td",[t._v("When using the Point of Sale (except in keypad or cart view), this field is set to the item description of the purchased item. This information is included in the CSV invoice export feature and appears in the invoice details view.")])]),t._v(" "),s("tr",[s("td",[s("code",[t._v(".itemCode")])]),t._v(" "),s("td",[t._v("When using the Point of Sale (except in keypad or cart view), this field is set to the item code of the purchased item. This information is included in the CSV invoice export feature and appears in the invoice details view.")])]),t._v(" "),s("tr",[s("td",[s("code",[t._v(".physical")])]),t._v(" "),s("td",[t._v("Boolean value indicating whether this is a physical good; displayed in the invoice details view and in the BitPay API-compatible endpoints.")])]),t._v(" "),s("tr",[s("td",[s("code",[t._v(".taxIncluded")])]),t._v(" "),s("td",[t._v("Number representing the tax amount in the invoice currency. This information will appear in the invoice details view. During invoice creation, the value is automatically rounded to significant digits and ensured not to be greater than the invoice's price.")])])])]),t._v(" "),s("h2",{attrs:{id:"examples"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#examples"}},[t._v("#")]),t._v(" Examples")]),t._v(" "),s("p",[t._v("Point of sale invoice (Product list view):")]),t._v(" "),s("div",{staticClass:"language-json extra-class"},[s("pre",{pre:!0,attrs:{class:"language-json"}},[s("code",[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"orderId"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"pos-app_346KRC5BjXXXo8cRFKwTBmdR6ZJ4"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"itemCode"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"green tea"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"itemDesc"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Green Tea"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"orderUrl"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"https://localhost:14142/apps/346KRC5BjXXXo8cRFKwTBmdR6ZJ4/pos"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"receiptData"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"Title"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Green Tea"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"Description"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("\"Lovely, fresh and tender, Meng Ding Gan Lu ('sweet dew') is grown in the lush Meng Ding Mountains of the southwestern province of Sichuan where it has been cultivated for over a thousand years.\"")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),s("p",[t._v("Point of sale invoice (Cart view):")]),t._v(" "),s("div",{staticClass:"language-json extra-class"},[s("pre",{pre:!0,attrs:{class:"language-json"}},[s("code",[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"orderId"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"pos-app_346KRC5BjXXXo8cRFKwTBmdR6ZJ4"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"posData"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"tip"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0.48")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"cart"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"id"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"pu erh"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"count"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"image"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"~/img/pos-sample/pu-erh.jpg"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"price"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"type"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"value"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"formatted"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"$2.00"')]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"title"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Pu Erh"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"inventory"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token null keyword"}},[t._v("null")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"id"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"rooibos"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"count"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"image"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"~/img/pos-sample/rooibos.jpg"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"price"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"type"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"value"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1.2")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"formatted"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"$1.20"')]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"title"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Rooibos"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"inventory"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token null keyword"}},[t._v("null")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"total"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("3.68")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"subTotal"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("3.2")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"customAmount"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"discountAmount"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"discountPercentage"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"itemDesc"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Tea shop"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"orderUrl"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"https://localhost:14142/apps/346KRC5BjXXXo8cRFKwTBmdR6ZJ4/pos"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"receiptData"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"Tip"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"$0.48"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"Cart"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"Pu Erh"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"$2.00 x 1 = $2.00"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"Rooibos"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"$1.20 x 1 = $1.20"')]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),s("p",[t._v("Point of sale invoice (Keypad view):")]),t._v(" "),s("div",{staticClass:"language-json extra-class"},[s("pre",{pre:!0,attrs:{class:"language-json"}},[s("code",[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"orderId"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"pos-app_346KRC5BjXXXo8cRFKwTBmdR6ZJ4"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"posData"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"total"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"12.00"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"subTotal"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"12.00"')]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"itemDesc"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Tea shop"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"orderUrl"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"https://localhost:14142/apps/346KRC5BjXXXo8cRFKwTBmdR6ZJ4/pos"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"receiptData"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])])])}),[],!1,null,null,null);s.default=n.exports}}]); \ No newline at end of file diff --git a/assets/js/123.5be2cb14.js b/assets/js/123.e37ff053.js similarity index 99% rename from assets/js/123.5be2cb14.js rename to assets/js/123.e37ff053.js index f7c0b4ab83..5d7d043181 100644 --- a/assets/js/123.5be2cb14.js +++ b/assets/js/123.e37ff053.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[123],{752:function(e,t,r){"use strict";r.r(t);var s=r(10),a=Object(s.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"local-development"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#local-development"}},[e._v("#")]),e._v(" Local development")]),e._v(" "),t("h2",{attrs:{id:"prerequisites"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#prerequisites"}},[e._v("#")]),e._v(" Prerequisites")]),e._v(" "),t("p",[e._v("For the "),t("strong",[e._v("development environment")]),e._v(" you need to install these tools:")]),e._v(" "),t("ul",[t("li",[t("a",{attrs:{href:"https://dotnet.microsoft.com/en-us/download/dotnet/6.0",target:"_blank",rel:"noopener noreferrer"}},[e._v(".NET 6.0 SDK"),t("OutboundLink")],1)]),e._v(" "),t("li",[e._v("Docker: "),t("a",{attrs:{href:"https://docs.docker.com/docker-for-windows/install/",target:"_blank",rel:"noopener noreferrer"}},[e._v("Windows"),t("OutboundLink")],1),e._v(" | "),t("a",{attrs:{href:"https://docs.docker.com/docker-for-mac/install/",target:"_blank",rel:"noopener noreferrer"}},[e._v("Mac OS"),t("OutboundLink")],1),e._v(" | "),t("a",{attrs:{href:"https://docs.docker.com/install/linux/docker-ce/ubuntu/",target:"_blank",rel:"noopener noreferrer"}},[e._v("Linux"),t("OutboundLink")],1)])]),e._v(" "),t("h2",{attrs:{id:"dependencies"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#dependencies"}},[e._v("#")]),e._v(" Dependencies")]),e._v(" "),t("p",[e._v("To execute tests and run the project for debugging, you need to run a number of "),t("strong",[e._v("dependencies")]),e._v(".")]),e._v(" "),t("p",[e._v("We wrapped all our dependencies in a docker-compose file that you can use to bootstrap the development environment:\nThe file "),t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver/blob/master/BTCPayServer.Tests/docker-compose.yml",target:"_blank",rel:"noopener noreferrer"}},[e._v("BTCPayServer.Tests/docker-compose.yml"),t("OutboundLink")],1),e._v(" can be used to spin everything up:")]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token function"}},[e._v("git")]),e._v(" clone https://github.com/btcpayserver/btcpayserver.git\n"),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("cd")]),e._v(" btcpayserver/BTCPayServer.Tests\n"),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("docker-compose")]),e._v(" up dev\n")])])]),t("h2",{attrs:{id:"which-ide"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#which-ide"}},[e._v("#")]),e._v(" Which IDE?")]),e._v(" "),t("p",[e._v("We recommend using Visual Studio 2022 (Windows Only) or Rider (cross platform). Visual Studio Code (cross platform) should also be possible, but isn't as straightforward to setup for a comfortable development environment.\nYou can of course use VIM if you are hardcore, .NET Core is easy to use via command-line.")]),e._v(" "),t("p",[e._v("Visual Studio Code, Visual Studio and Rider will run the launch profile "),t("code",[e._v("Bitcoin")]),e._v(".\nThis will run a "),t("strong",[e._v("BTCPay Server instance connecting to the services in your Docker service")]),e._v(", so you can easily debug and step through the code.")]),e._v(" "),t("h2",{attrs:{id:"build-configuration"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#build-configuration"}},[e._v("#")]),e._v(" Build configuration")]),e._v(" "),t("p",[e._v("A build configuration defines how to "),t("strong",[e._v("build BTCPay Server")]),e._v(". For example, whether to include some source files, whether to optimize for debugging or performance.")]),e._v(" "),t("p",[e._v("There are several build configurations:")]),e._v(" "),t("ul",[t("li",[t("code",[e._v("Debug")])]),e._v(" "),t("li",[t("code",[e._v("Release")])]),e._v(" "),t("li",[t("code",[e._v("Altcoins-Debug")])]),e._v(" "),t("li",[t("code",[e._v("Altcoins-Release")])])]),e._v(" "),t("p",[e._v("How to use a different one during your local development depends on your IDE.\nBy default "),t("code",[e._v("Debug")]),e._v(" is used, this is a Bitcoin only build excluding any altcoin dependencies. How to use a different one during your local development depends on your IDE.")]),e._v(" "),t("p",[e._v("You can select which build to use via the "),t("code",[e._v("-c")]),e._v(" switch in "),t("code",[e._v("dotnet")]),e._v(" command line. If you use command line and want to run a Release build:")]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[e._v("dotnet run "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-c")]),e._v(" Release\n")])])]),t("h2",{attrs:{id:"launch-profiles"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#launch-profiles"}},[e._v("#")]),e._v(" Launch profiles")]),e._v(" "),t("p",[e._v("When you "),t("strong",[e._v("start BTCPay Server locally for local development")]),e._v(", it needs the right parameter so it can connect to the development time dependencies in the docker-compose file.")]),e._v(" "),t("p",[e._v("Those parameters are wrapped into the dotnet concept of "),t("code",[e._v("launch profile")]),e._v(".")]),e._v(" "),t("p",[e._v("The launch profiles are specified in the "),t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver/blob/master/BTCPayServer/Properties/launchSettings.json",target:"_blank",rel:"noopener noreferrer"}},[e._v("launchSettings.json"),t("OutboundLink")],1),e._v(".")]),e._v(" "),t("p",[e._v("There are currently three launch profiles:")]),e._v(" "),t("ul",[t("li",[t("code",[e._v("Bitcoin")])]),e._v(" "),t("li",[t("code",[e._v("Bitcoin-HTTPS")])]),e._v(" "),t("li",[t("code",[e._v("Altcoins-HTTPS")])])]),e._v(" "),t("p",[e._v("By default, "),t("code",[e._v("Bitcoin")]),e._v(" is used. How to use a different one during your local development depends on your IDE.")]),e._v(" "),t("p",[e._v("If you use command line, "),t("code",[e._v("dotnet run")]),e._v(" allows you to select the launch profile of your choice:")]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[e._v("dotnet run --launch-profile Bitcoin\n")])])]),t("h2",{attrs:{id:"running-tests"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#running-tests"}},[e._v("#")]),e._v(" Running tests")]),e._v(" "),t("p",[e._v("Running tests is functioning in the exact same way as running the development time BTCPay Server.")]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("cd")]),e._v(" BTCPayServer.Tests\ndotnet "),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("test")]),e._v("\n")])])]),t("p",[e._v("The concept of "),t("code",[e._v("launch profile")]),e._v(" does not apply for tests, but the concept of build configuration does. For example, if I want to run tests on the Release build:")]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[e._v("dotnet "),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("test")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-c")]),e._v(" Release\n")])])]),t("p",[e._v("The tests are already configured to use the development time dependencies in the docker-compose presented earlier.")]),e._v(" "),t("p",[e._v("You can use the "),t("code",[e._v("--f")]),e._v(" (filter) switch to run a specific test.")]),e._v(" "),t("p",[e._v("If you use an IDE, consult your IDE documentation to run tests or switch to different configurations.")]),e._v(" "),t("h2",{attrs:{id:"altcoin-support-development"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#altcoin-support-development"}},[e._v("#")]),e._v(" Altcoin support development")]),e._v(" "),t("p",[e._v("By default, your IDE or simple "),t("code",[e._v("dotnet run")]),e._v(" will use "),t("code",[e._v("Bitcoin")]),e._v(" launch profile on "),t("code",[e._v("Debug")]),e._v(" build.")]),e._v(" "),t("ul",[t("li",[e._v("This means that BTCPay Server will be hosted on a local HTTP port, building without altcoin support,")]),e._v(" "),t("li",[e._v("Run BTCPay Server to connect to Bitcoin only dependencies specified in "),t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver/blob/master/BTCPayServer.Tests/docker-compose.yml",target:"_blank",rel:"noopener noreferrer"}},[e._v("BTCPayServer.Tests/docker-compose.yml"),t("OutboundLink")],1),e._v(".")])]),e._v(" "),t("p",[e._v("If you want to "),t("strong",[e._v("develop with altcoins support")]),e._v(" you need to use the "),t("code",[e._v("Altcoins-HTTPS")]),e._v(" launch profile, on the "),t("code",[e._v("Altcoins-Debug")]),e._v(" build, and run the "),t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver/blob/master/BTCPayServer.Tests/docker-compose.altcoins.yml",target:"_blank",rel:"noopener noreferrer"}},[e._v("BTCPayServer.Tests/docker-compose.altcoins.yml"),t("OutboundLink")],1),e._v(".")]),e._v(" "),t("p",[e._v("If using command line:")]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("cd")]),e._v(" BTCPayServer.Tests\n"),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("docker-compose")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-f")]),e._v(" docker-compose.altcoins.yml up dev\n"),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("cd")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("..")]),e._v("/BTCPayServer\ndotnet run "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-c")]),e._v(" Altcoins-Debug --launch-profile Altcoins-HTTPS\n")])])]),t("p",[e._v("For tests")]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("cd")]),e._v(" BTCPayServer.Tests\ndotnet "),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("test")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-c")]),e._v(" Altcoins-Debug\n")])])]),t("h2",{attrs:{id:"https-support-for-local-development"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#https-support-for-local-development"}},[e._v("#")]),e._v(" HTTPS support for local development")]),e._v(" "),t("p",[e._v("Some browser security features may require that you use "),t("strong",[e._v("HTTPS")]),e._v(" to be properly tested.")]),e._v(" "),t("p",[e._v("In this case, use "),t("code",[e._v("Bitcoin-HTTPS")]),e._v(" (or "),t("code",[e._v("Altcoin-HTTPS")]),e._v(") launch profile. This will create a self signed certificate for your development purpose.")]),e._v(" "),t("p",[e._v("However, your browser will not trust it, making it difficult to debug.")]),e._v(" "),t("p",[e._v("You can instruct your OS to trust this development time certificate by running:")]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[e._v("dotnet dev-certs https "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("--trust")]),e._v("\n")])])]),t("h2",{attrs:{id:"videos"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#videos"}},[e._v("#")]),e._v(" Videos")]),e._v(" "),t("p",[e._v("For more information check out these videos:")]),e._v(" "),t("ul",[t("li",[t("a",{attrs:{href:"https://youtube.com/watch?v=ZePbMPSIvHM",target:"_blank",rel:"noopener noreferrer"}},[e._v("How to contribute to BTCPay Server Development (Windows)"),t("OutboundLink")],1),e._v(" by Nicolas Dorier")]),e._v(" "),t("li",[t("a",{attrs:{href:"https://youtube.com/watch?v=j486T_Rk-yw",target:"_blank",rel:"noopener noreferrer"}},[e._v("Setting up BTCPayServer development environment on Linux (Ubuntu)"),t("OutboundLink")],1),e._v(" by RockStarDev")]),e._v(" "),t("li",[t("a",{attrs:{href:"https://youtube.com/watch?v=GWR_CcMsEV0",target:"_blank",rel:"noopener noreferrer"}},[e._v("BTCPay Server Development - Testing pull request, payments (MacOS)"),t("OutboundLink")],1),e._v(" by Pavlenex")])]),e._v(" "),t("p",[e._v("and these notes:")]),e._v(" "),t("ul",[t("li",[t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver/blob/master/BTCPayServer.Tests/README.md",target:"_blank",rel:"noopener noreferrer"}},[e._v("How to get started with development"),t("OutboundLink")],1),e._v(" by Nicolas Dorier (covering relevant docker commands, paying regtest invoices)")])])])}),[],!1,null,null,null);t.default=a.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[123],{755:function(e,t,r){"use strict";r.r(t);var s=r(10),a=Object(s.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"local-development"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#local-development"}},[e._v("#")]),e._v(" Local development")]),e._v(" "),t("h2",{attrs:{id:"prerequisites"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#prerequisites"}},[e._v("#")]),e._v(" Prerequisites")]),e._v(" "),t("p",[e._v("For the "),t("strong",[e._v("development environment")]),e._v(" you need to install these tools:")]),e._v(" "),t("ul",[t("li",[t("a",{attrs:{href:"https://dotnet.microsoft.com/en-us/download/dotnet/6.0",target:"_blank",rel:"noopener noreferrer"}},[e._v(".NET 6.0 SDK"),t("OutboundLink")],1)]),e._v(" "),t("li",[e._v("Docker: "),t("a",{attrs:{href:"https://docs.docker.com/docker-for-windows/install/",target:"_blank",rel:"noopener noreferrer"}},[e._v("Windows"),t("OutboundLink")],1),e._v(" | "),t("a",{attrs:{href:"https://docs.docker.com/docker-for-mac/install/",target:"_blank",rel:"noopener noreferrer"}},[e._v("Mac OS"),t("OutboundLink")],1),e._v(" | "),t("a",{attrs:{href:"https://docs.docker.com/install/linux/docker-ce/ubuntu/",target:"_blank",rel:"noopener noreferrer"}},[e._v("Linux"),t("OutboundLink")],1)])]),e._v(" "),t("h2",{attrs:{id:"dependencies"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#dependencies"}},[e._v("#")]),e._v(" Dependencies")]),e._v(" "),t("p",[e._v("To execute tests and run the project for debugging, you need to run a number of "),t("strong",[e._v("dependencies")]),e._v(".")]),e._v(" "),t("p",[e._v("We wrapped all our dependencies in a docker-compose file that you can use to bootstrap the development environment:\nThe file "),t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver/blob/master/BTCPayServer.Tests/docker-compose.yml",target:"_blank",rel:"noopener noreferrer"}},[e._v("BTCPayServer.Tests/docker-compose.yml"),t("OutboundLink")],1),e._v(" can be used to spin everything up:")]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token function"}},[e._v("git")]),e._v(" clone https://github.com/btcpayserver/btcpayserver.git\n"),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("cd")]),e._v(" btcpayserver/BTCPayServer.Tests\n"),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("docker-compose")]),e._v(" up dev\n")])])]),t("h2",{attrs:{id:"which-ide"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#which-ide"}},[e._v("#")]),e._v(" Which IDE?")]),e._v(" "),t("p",[e._v("We recommend using Visual Studio 2022 (Windows Only) or Rider (cross platform). Visual Studio Code (cross platform) should also be possible, but isn't as straightforward to setup for a comfortable development environment.\nYou can of course use VIM if you are hardcore, .NET Core is easy to use via command-line.")]),e._v(" "),t("p",[e._v("Visual Studio Code, Visual Studio and Rider will run the launch profile "),t("code",[e._v("Bitcoin")]),e._v(".\nThis will run a "),t("strong",[e._v("BTCPay Server instance connecting to the services in your Docker service")]),e._v(", so you can easily debug and step through the code.")]),e._v(" "),t("h2",{attrs:{id:"build-configuration"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#build-configuration"}},[e._v("#")]),e._v(" Build configuration")]),e._v(" "),t("p",[e._v("A build configuration defines how to "),t("strong",[e._v("build BTCPay Server")]),e._v(". For example, whether to include some source files, whether to optimize for debugging or performance.")]),e._v(" "),t("p",[e._v("There are several build configurations:")]),e._v(" "),t("ul",[t("li",[t("code",[e._v("Debug")])]),e._v(" "),t("li",[t("code",[e._v("Release")])]),e._v(" "),t("li",[t("code",[e._v("Altcoins-Debug")])]),e._v(" "),t("li",[t("code",[e._v("Altcoins-Release")])])]),e._v(" "),t("p",[e._v("How to use a different one during your local development depends on your IDE.\nBy default "),t("code",[e._v("Debug")]),e._v(" is used, this is a Bitcoin only build excluding any altcoin dependencies. How to use a different one during your local development depends on your IDE.")]),e._v(" "),t("p",[e._v("You can select which build to use via the "),t("code",[e._v("-c")]),e._v(" switch in "),t("code",[e._v("dotnet")]),e._v(" command line. If you use command line and want to run a Release build:")]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[e._v("dotnet run "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-c")]),e._v(" Release\n")])])]),t("h2",{attrs:{id:"launch-profiles"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#launch-profiles"}},[e._v("#")]),e._v(" Launch profiles")]),e._v(" "),t("p",[e._v("When you "),t("strong",[e._v("start BTCPay Server locally for local development")]),e._v(", it needs the right parameter so it can connect to the development time dependencies in the docker-compose file.")]),e._v(" "),t("p",[e._v("Those parameters are wrapped into the dotnet concept of "),t("code",[e._v("launch profile")]),e._v(".")]),e._v(" "),t("p",[e._v("The launch profiles are specified in the "),t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver/blob/master/BTCPayServer/Properties/launchSettings.json",target:"_blank",rel:"noopener noreferrer"}},[e._v("launchSettings.json"),t("OutboundLink")],1),e._v(".")]),e._v(" "),t("p",[e._v("There are currently three launch profiles:")]),e._v(" "),t("ul",[t("li",[t("code",[e._v("Bitcoin")])]),e._v(" "),t("li",[t("code",[e._v("Bitcoin-HTTPS")])]),e._v(" "),t("li",[t("code",[e._v("Altcoins-HTTPS")])])]),e._v(" "),t("p",[e._v("By default, "),t("code",[e._v("Bitcoin")]),e._v(" is used. How to use a different one during your local development depends on your IDE.")]),e._v(" "),t("p",[e._v("If you use command line, "),t("code",[e._v("dotnet run")]),e._v(" allows you to select the launch profile of your choice:")]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[e._v("dotnet run --launch-profile Bitcoin\n")])])]),t("h2",{attrs:{id:"running-tests"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#running-tests"}},[e._v("#")]),e._v(" Running tests")]),e._v(" "),t("p",[e._v("Running tests is functioning in the exact same way as running the development time BTCPay Server.")]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("cd")]),e._v(" BTCPayServer.Tests\ndotnet "),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("test")]),e._v("\n")])])]),t("p",[e._v("The concept of "),t("code",[e._v("launch profile")]),e._v(" does not apply for tests, but the concept of build configuration does. For example, if I want to run tests on the Release build:")]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[e._v("dotnet "),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("test")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-c")]),e._v(" Release\n")])])]),t("p",[e._v("The tests are already configured to use the development time dependencies in the docker-compose presented earlier.")]),e._v(" "),t("p",[e._v("You can use the "),t("code",[e._v("--f")]),e._v(" (filter) switch to run a specific test.")]),e._v(" "),t("p",[e._v("If you use an IDE, consult your IDE documentation to run tests or switch to different configurations.")]),e._v(" "),t("h2",{attrs:{id:"altcoin-support-development"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#altcoin-support-development"}},[e._v("#")]),e._v(" Altcoin support development")]),e._v(" "),t("p",[e._v("By default, your IDE or simple "),t("code",[e._v("dotnet run")]),e._v(" will use "),t("code",[e._v("Bitcoin")]),e._v(" launch profile on "),t("code",[e._v("Debug")]),e._v(" build.")]),e._v(" "),t("ul",[t("li",[e._v("This means that BTCPay Server will be hosted on a local HTTP port, building without altcoin support,")]),e._v(" "),t("li",[e._v("Run BTCPay Server to connect to Bitcoin only dependencies specified in "),t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver/blob/master/BTCPayServer.Tests/docker-compose.yml",target:"_blank",rel:"noopener noreferrer"}},[e._v("BTCPayServer.Tests/docker-compose.yml"),t("OutboundLink")],1),e._v(".")])]),e._v(" "),t("p",[e._v("If you want to "),t("strong",[e._v("develop with altcoins support")]),e._v(" you need to use the "),t("code",[e._v("Altcoins-HTTPS")]),e._v(" launch profile, on the "),t("code",[e._v("Altcoins-Debug")]),e._v(" build, and run the "),t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver/blob/master/BTCPayServer.Tests/docker-compose.altcoins.yml",target:"_blank",rel:"noopener noreferrer"}},[e._v("BTCPayServer.Tests/docker-compose.altcoins.yml"),t("OutboundLink")],1),e._v(".")]),e._v(" "),t("p",[e._v("If using command line:")]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("cd")]),e._v(" BTCPayServer.Tests\n"),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("docker-compose")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-f")]),e._v(" docker-compose.altcoins.yml up dev\n"),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("cd")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("..")]),e._v("/BTCPayServer\ndotnet run "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-c")]),e._v(" Altcoins-Debug --launch-profile Altcoins-HTTPS\n")])])]),t("p",[e._v("For tests")]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("cd")]),e._v(" BTCPayServer.Tests\ndotnet "),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("test")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-c")]),e._v(" Altcoins-Debug\n")])])]),t("h2",{attrs:{id:"https-support-for-local-development"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#https-support-for-local-development"}},[e._v("#")]),e._v(" HTTPS support for local development")]),e._v(" "),t("p",[e._v("Some browser security features may require that you use "),t("strong",[e._v("HTTPS")]),e._v(" to be properly tested.")]),e._v(" "),t("p",[e._v("In this case, use "),t("code",[e._v("Bitcoin-HTTPS")]),e._v(" (or "),t("code",[e._v("Altcoin-HTTPS")]),e._v(") launch profile. This will create a self signed certificate for your development purpose.")]),e._v(" "),t("p",[e._v("However, your browser will not trust it, making it difficult to debug.")]),e._v(" "),t("p",[e._v("You can instruct your OS to trust this development time certificate by running:")]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[e._v("dotnet dev-certs https "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("--trust")]),e._v("\n")])])]),t("h2",{attrs:{id:"videos"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#videos"}},[e._v("#")]),e._v(" Videos")]),e._v(" "),t("p",[e._v("For more information check out these videos:")]),e._v(" "),t("ul",[t("li",[t("a",{attrs:{href:"https://youtube.com/watch?v=ZePbMPSIvHM",target:"_blank",rel:"noopener noreferrer"}},[e._v("How to contribute to BTCPay Server Development (Windows)"),t("OutboundLink")],1),e._v(" by Nicolas Dorier")]),e._v(" "),t("li",[t("a",{attrs:{href:"https://youtube.com/watch?v=j486T_Rk-yw",target:"_blank",rel:"noopener noreferrer"}},[e._v("Setting up BTCPayServer development environment on Linux (Ubuntu)"),t("OutboundLink")],1),e._v(" by RockStarDev")]),e._v(" "),t("li",[t("a",{attrs:{href:"https://youtube.com/watch?v=GWR_CcMsEV0",target:"_blank",rel:"noopener noreferrer"}},[e._v("BTCPay Server Development - Testing pull request, payments (MacOS)"),t("OutboundLink")],1),e._v(" by Pavlenex")])]),e._v(" "),t("p",[e._v("and these notes:")]),e._v(" "),t("ul",[t("li",[t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver/blob/master/BTCPayServer.Tests/README.md",target:"_blank",rel:"noopener noreferrer"}},[e._v("How to get started with development"),t("OutboundLink")],1),e._v(" by Nicolas Dorier (covering relevant docker commands, paying regtest invoices)")])])])}),[],!1,null,null,null);t.default=a.exports}}]); \ No newline at end of file diff --git a/assets/js/124.0238c141.js b/assets/js/124.520571e5.js similarity index 99% rename from assets/js/124.0238c141.js rename to assets/js/124.520571e5.js index 92f067c2b6..2d8e7a66cf 100644 --- a/assets/js/124.0238c141.js +++ b/assets/js/124.520571e5.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[124],{754:function(e,t,s){"use strict";s.r(t);var a=s(10),r=Object(a.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"local-development"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#local-development"}},[e._v("#")]),e._v(" Local development")]),e._v(" "),t("h2",{attrs:{id:"prerequisites"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#prerequisites"}},[e._v("#")]),e._v(" Prerequisites")]),e._v(" "),t("p",[e._v("For the "),t("strong",[e._v("development environment")]),e._v(" you need to install these tools:")]),e._v(" "),t("ul",[t("li",[t("a",{attrs:{href:"https://dotnet.microsoft.com/en-us/download/dotnet/6.0",target:"_blank",rel:"noopener noreferrer"}},[e._v(".NET 6.0 SDK"),t("OutboundLink")],1)]),e._v(" "),t("li",[e._v("Docker: "),t("a",{attrs:{href:"https://docs.docker.com/docker-for-windows/install/",target:"_blank",rel:"noopener noreferrer"}},[e._v("Windows"),t("OutboundLink")],1),e._v(" | "),t("a",{attrs:{href:"https://docs.docker.com/docker-for-mac/install/",target:"_blank",rel:"noopener noreferrer"}},[e._v("Mac OS"),t("OutboundLink")],1),e._v(" | "),t("a",{attrs:{href:"https://docs.docker.com/install/linux/docker-ce/ubuntu/",target:"_blank",rel:"noopener noreferrer"}},[e._v("Linux"),t("OutboundLink")],1)])]),e._v(" "),t("h2",{attrs:{id:"dependencies"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#dependencies"}},[e._v("#")]),e._v(" Dependencies")]),e._v(" "),t("p",[e._v("To execute tests and run the project for debugging, you need to run a number of "),t("strong",[e._v("dependencies")]),e._v(".")]),e._v(" "),t("p",[e._v("We wrapped all our dependencies in a docker-compose file that you can use to bootstrap the development environment:\nThe file "),t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver/blob/master/BTCPayServer.Tests/docker-compose.yml",target:"_blank",rel:"noopener noreferrer"}},[e._v("BTCPayServer.Tests/docker-compose.yml"),t("OutboundLink")],1),e._v(" can be used to spin everything up:")]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token function"}},[e._v("git")]),e._v(" clone https://github.com/btcpayserver/btcpayserver.git\n"),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("cd")]),e._v(" btcpayserver/BTCPayServer.Tests\n"),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("docker-compose")]),e._v(" up dev\n")])])]),t("h2",{attrs:{id:"which-ide"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#which-ide"}},[e._v("#")]),e._v(" Which IDE?")]),e._v(" "),t("p",[e._v("We recommend using Visual Studio 2022 (Windows Only) or Rider (cross platform). Visual Studio Code (cross platform) should also be possible, but isn't as straightforward to setup for a comfortable development environment.\nYou can of course use VIM if you are hardcore, .NET Core is easy to use via command-line.")]),e._v(" "),t("p",[e._v("Visual Studio Code, Visual Studio and Rider will run the launch profile "),t("code",[e._v("Bitcoin")]),e._v(".\nThis will run a "),t("strong",[e._v("BTCPay Server instance connecting to the services in your Docker service")]),e._v(", so you can easily debug and step through the code.")]),e._v(" "),t("h2",{attrs:{id:"build-configuration"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#build-configuration"}},[e._v("#")]),e._v(" Build configuration")]),e._v(" "),t("p",[e._v("A build configuration defines how to "),t("strong",[e._v("build BTCPay Server")]),e._v(". For example, whether to include some source files, whether to optimize for debugging or performance.")]),e._v(" "),t("p",[e._v("There are several build configurations:")]),e._v(" "),t("ul",[t("li",[t("code",[e._v("Debug")])]),e._v(" "),t("li",[t("code",[e._v("Release")])]),e._v(" "),t("li",[t("code",[e._v("Altcoins-Debug")])]),e._v(" "),t("li",[t("code",[e._v("Altcoins-Release")])])]),e._v(" "),t("p",[e._v("How to use a different one during your local development depends on your IDE.\nBy default "),t("code",[e._v("Debug")]),e._v(" is used, this is a Bitcoin only build excluding any altcoin dependencies. How to use a different one during your local development depends on your IDE.")]),e._v(" "),t("p",[e._v("You can select which build to use via the "),t("code",[e._v("-c")]),e._v(" switch in "),t("code",[e._v("dotnet")]),e._v(" command line. If you use command line and want to run a Release build:")]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[e._v("dotnet run "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-c")]),e._v(" Release\n")])])]),t("h2",{attrs:{id:"launch-profiles"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#launch-profiles"}},[e._v("#")]),e._v(" Launch profiles")]),e._v(" "),t("p",[e._v("When you "),t("strong",[e._v("start BTCPay Server locally for local development")]),e._v(", it needs the right parameter so it can connect to the development time dependencies in the docker-compose file.")]),e._v(" "),t("p",[e._v("Those parameters are wrapped into the dotnet concept of "),t("code",[e._v("launch profile")]),e._v(".")]),e._v(" "),t("p",[e._v("The launch profiles are specified in the "),t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver/blob/master/BTCPayServer/Properties/launchSettings.json",target:"_blank",rel:"noopener noreferrer"}},[e._v("launchSettings.json"),t("OutboundLink")],1),e._v(".")]),e._v(" "),t("p",[e._v("There are currently three launch profiles:")]),e._v(" "),t("ul",[t("li",[t("code",[e._v("Bitcoin")])]),e._v(" "),t("li",[t("code",[e._v("Bitcoin-HTTPS")])]),e._v(" "),t("li",[t("code",[e._v("Altcoins-HTTPS")])])]),e._v(" "),t("p",[e._v("By default, "),t("code",[e._v("Bitcoin")]),e._v(" is used. How to use a different one during your local development depends on your IDE.")]),e._v(" "),t("p",[e._v("If you use command line, "),t("code",[e._v("dotnet run")]),e._v(" allows you to select the launch profile of your choice:")]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[e._v("dotnet run --launch-profile Bitcoin\n")])])]),t("h2",{attrs:{id:"running-tests"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#running-tests"}},[e._v("#")]),e._v(" Running tests")]),e._v(" "),t("p",[e._v("Running tests is functioning in the exact same way as running the development time BTCPay Server.")]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("cd")]),e._v(" BTCPayServer.Tests\ndotnet "),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("test")]),e._v("\n")])])]),t("p",[e._v("The concept of "),t("code",[e._v("launch profile")]),e._v(" does not apply for tests, but the concept of build configuration does. For example, if I want to run tests on the Release build:")]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[e._v("dotnet "),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("test")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-c")]),e._v(" Release\n")])])]),t("p",[e._v("The tests are already configured to use the development time dependencies in the docker-compose presented earlier.")]),e._v(" "),t("p",[e._v("You can use the "),t("code",[e._v("--f")]),e._v(" (filter) switch to run a specific test.")]),e._v(" "),t("p",[e._v("If you use an IDE, consult your IDE documentation to run tests or switch to different configurations.")]),e._v(" "),t("h2",{attrs:{id:"altcoin-support-development"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#altcoin-support-development"}},[e._v("#")]),e._v(" Altcoin support development")]),e._v(" "),t("p",[e._v("By default, your IDE or simple "),t("code",[e._v("dotnet run")]),e._v(" will use "),t("code",[e._v("Bitcoin")]),e._v(" launch profile on "),t("code",[e._v("Debug")]),e._v(" build.")]),e._v(" "),t("ul",[t("li",[e._v("This means that BTCPay Server will be hosted on a local HTTP port, building without altcoin support,")]),e._v(" "),t("li",[e._v("Run BTCPay Server to connect to Bitcoin only dependencies specified in "),t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver/blob/master/BTCPayServer.Tests/docker-compose.yml",target:"_blank",rel:"noopener noreferrer"}},[e._v("BTCPayServer.Tests/docker-compose.yml"),t("OutboundLink")],1),e._v(".")])]),e._v(" "),t("p",[e._v("If you want to "),t("strong",[e._v("develop with altcoins support")]),e._v(" you need to use the "),t("code",[e._v("Altcoins-HTTPS")]),e._v(" launch profile, on the "),t("code",[e._v("Altcoins-Debug")]),e._v(" build, and run the "),t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver/blob/master/BTCPayServer.Tests/docker-compose.altcoins.yml",target:"_blank",rel:"noopener noreferrer"}},[e._v("BTCPayServer.Tests/docker-compose.altcoins.yml"),t("OutboundLink")],1),e._v(".")]),e._v(" "),t("p",[e._v("If using command line:")]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("cd")]),e._v(" BTCPayServer.Tests\n"),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("docker-compose")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-f")]),e._v(" docker-compose.altcoins.yml up dev\n"),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("cd")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("..")]),e._v("/BTCPayServer\ndotnet run "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-c")]),e._v(" Altcoins-Debug --launch-profile Altcoins-HTTPS\n")])])]),t("p",[e._v("For tests")]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("cd")]),e._v(" BTCPayServer.Tests\ndotnet "),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("test")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-c")]),e._v(" Altcoins-Debug\n")])])]),t("h2",{attrs:{id:"https-support-for-local-development"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#https-support-for-local-development"}},[e._v("#")]),e._v(" HTTPS support for local development")]),e._v(" "),t("p",[e._v("Some browser security features may require that you use "),t("strong",[e._v("HTTPS")]),e._v(" to be properly tested.")]),e._v(" "),t("p",[e._v("In this case, use "),t("code",[e._v("Bitcoin-HTTPS")]),e._v(" (or "),t("code",[e._v("Altcoin-HTTPS")]),e._v(") launch profile. This will create a self signed certificate for your development purpose.")]),e._v(" "),t("p",[e._v("However, your browser will not trust it, making it difficult to debug.")]),e._v(" "),t("p",[e._v("You can instruct your OS to trust this development time certificate by running:")]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[e._v("dotnet dev-certs https "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("--trust")]),e._v("\n")])])]),t("h2",{attrs:{id:"videos"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#videos"}},[e._v("#")]),e._v(" Videos")]),e._v(" "),t("p",[e._v("For more information check out these videos:")]),e._v(" "),t("ul",[t("li",[t("a",{attrs:{href:"https://youtube.com/watch?v=ZePbMPSIvHM",target:"_blank",rel:"noopener noreferrer"}},[e._v("How to contribute to BTCPay Server Development (Windows)"),t("OutboundLink")],1),e._v(" by Nicolas Dorier")]),e._v(" "),t("li",[t("a",{attrs:{href:"https://youtube.com/watch?v=j486T_Rk-yw",target:"_blank",rel:"noopener noreferrer"}},[e._v("Setting up BTCPayServer development environment on Linux (Ubuntu)"),t("OutboundLink")],1),e._v(" by RockStarDev")]),e._v(" "),t("li",[t("a",{attrs:{href:"https://youtube.com/watch?v=GWR_CcMsEV0",target:"_blank",rel:"noopener noreferrer"}},[e._v("BTCPay Server Development - Testing pull request, payments (MacOS)"),t("OutboundLink")],1),e._v(" by Pavlenex")])]),e._v(" "),t("p",[e._v("and these notes:")]),e._v(" "),t("ul",[t("li",[t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver/blob/master/BTCPayServer.Tests/README.md",target:"_blank",rel:"noopener noreferrer"}},[e._v("How to get started with development"),t("OutboundLink")],1),e._v(" by Nicolas Dorier (covering relevant docker commands, paying regtest invoices)")])]),e._v(" "),t("h2",{attrs:{id:"how-to-manually-test-payments"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#how-to-manually-test-payments"}},[e._v("#")]),e._v(" How to manually test payments")]),e._v(" "),t("h3",{attrs:{id:"using-the-test-bitcoin-cli"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#using-the-test-bitcoin-cli"}},[e._v("#")]),e._v(" Using the test bitcoin-cli")]),e._v(" "),t("p",[e._v("You can call bitcoin-cli inside the container with "),t("code",[e._v("docker exec")]),e._v(".\nFor example, if you want to send "),t("code",[e._v("0.23111090")]),e._v(" to "),t("code",[e._v("mohu16LH66ptoWGEL1GtP6KHTBJYXMWhEf")]),e._v(":")]),e._v(" "),t("div",{staticClass:"language-sh extra-class"},[t("pre",{pre:!0,attrs:{class:"language-sh"}},[t("code",[e._v("./docker-bitcoin-cli.sh sendtoaddress "),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"mohu16LH66ptoWGEL1GtP6KHTBJYXMWhEf"')]),e._v(" "),t("span",{pre:!0,attrs:{class:"token number"}},[e._v("0.23111090")]),e._v("\n")])])]),t("p",[e._v("If you are using Powershell:")]),e._v(" "),t("div",{staticClass:"language-powershell extra-class"},[t("pre",{pre:!0,attrs:{class:"language-powershell"}},[t("code",[t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(".")]),e._v("\\docker-bitcoin-"),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("cli")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(".")]),e._v("ps1 sendtoaddress "),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"mohu16LH66ptoWGEL1GtP6KHTBJYXMWhEf"')]),e._v(" 0"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(".")]),e._v("23111090\n")])])]),t("p",[e._v("You can also generate blocks:")]),e._v(" "),t("div",{staticClass:"language-powershell extra-class"},[t("pre",{pre:!0,attrs:{class:"language-powershell"}},[t("code",[t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(".")]),e._v("\\docker-bitcoin-generate"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(".")]),e._v("ps1 3\n")])])]),t("h3",{attrs:{id:"using-polar-to-test-lightning-payments"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#using-polar-to-test-lightning-payments"}},[e._v("#")]),e._v(" Using Polar to test Lightning payments")]),e._v(" "),t("ul",[t("li",[e._v("Install and run "),t("a",{attrs:{href:"https://lightningpolar.com/",target:"_blank",rel:"noopener noreferrer"}},[e._v("Polar"),t("OutboundLink")],1),e._v(". Setup a small network of nodes.")]),e._v(" "),t("li",[e._v("Go to your store's General Settings and enable Lightning.")]),e._v(" "),t("li",[e._v("Build your connection string using the Connect information in the Polar app.")])]),e._v(" "),t("p",[e._v('LND Connection string example:\ntype=lnd-rest;server=https://127.0.0.1:8084/;macaroonfilepath="local path to admin.macaroon on your computer, without these quotes";allowinsecure=true')]),e._v(" "),t("p",[e._v("Now you can create a Lightning invoice on BTCPay Server regtest and make a payment through Polar.")]),e._v(" "),t("p",[e._v('PLEASE NOTE: You may get an exception break in Visual Studio. You must quickly click "Continue" in VS so the invoice is generated.\nOr, uncheck the box that says, "Break when this exception type is thrown".')]),e._v(" "),t("h3",{attrs:{id:"using-the-test-litecoin-cli"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#using-the-test-litecoin-cli"}},[e._v("#")]),e._v(" Using the test litecoin-cli")]),e._v(" "),t("p",[e._v("Same as bitcoin-cli, but with "),t("code",[e._v(".\\docker-litecoin-cli.ps1")]),e._v(" and "),t("code",[e._v(".\\docker-litecoin-cli.sh")]),e._v(" instead.")]),e._v(" "),t("h3",{attrs:{id:"using-the-test-lightning-cli"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#using-the-test-lightning-cli"}},[e._v("#")]),e._v(" Using the test lightning-cli")]),e._v(" "),t("p",[e._v("If you are using Linux:")]),e._v(" "),t("div",{staticClass:"language-sh extra-class"},[t("pre",{pre:!0,attrs:{class:"language-sh"}},[t("code",[e._v("./docker-customer-lightning-cli.sh pay lnbcrt100u1pd2e6uspp5ajnadvhazjrz55twd5k6yeg9u87wpw0q2fdr7g960yl5asv5fmnqdq9d3hkccqpxmedyrk0ehw5ueqx5e0r4qrrv74cewddfcvsxaawqz7634cmjj39sqwy5tvhz0hasktkk6t9pqfdh3edmf3z09zst5y7khv3rvxh8ctqqw6mwhh\n")])])]),t("p",[e._v("If you are using Powershell:")]),e._v(" "),t("div",{staticClass:"language-powershell extra-class"},[t("pre",{pre:!0,attrs:{class:"language-powershell"}},[t("code",[t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(".")]),e._v("\\docker-customer-lightning-"),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("cli")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(".")]),e._v("ps1 pay lnbcrt100u1pd2e6uspp5ajnadvhazjrz55twd5k6yeg9u87wpw0q2fdr7g960yl5asv5fmnqdq9d3hkccqpxmedyrk0ehw5ueqx5e0r4qrrv74cewddfcvsxaawqz7634cmjj39sqwy5tvhz0hasktkk6t9pqfdh3edmf3z09zst5y7khv3rvxh8ctqqw6mwhh\n")])])]),t("p",[e._v("If you get this message:")]),e._v(" "),t("div",{staticClass:"language-json extra-class"},[t("pre",{pre:!0,attrs:{class:"language-json"}},[t("code",[t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("{")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token property"}},[e._v('"code"')]),e._v(" "),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v(":")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token number"}},[e._v("205")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(",")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token property"}},[e._v('"message"')]),e._v(" "),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v(":")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"Could not find a route"')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(",")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token property"}},[e._v('"data"')]),e._v(" "),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v(":")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("{")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token property"}},[e._v('"getroute_tries"')]),e._v(" "),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v(":")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token number"}},[e._v("1")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(",")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token property"}},[e._v('"sendpay_tries"')]),e._v(" "),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v(":")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token number"}},[e._v("0")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("}")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("}")]),e._v("\n")])])]),t("p",[e._v("Please, run the test "),t("code",[e._v("CanSetLightningServer")]),e._v(", this will establish a channel between the customer and the merchant, then, retry.")]),e._v(" "),t("p",[e._v("Alternatively you can run the "),t("code",[e._v("./docker-lightning-channel-setup.sh")]),e._v(" script to establish the channel connection.\nThe "),t("code",[e._v("./docker-lightning-channel-teardown.sh")]),e._v(" script closes any existing lightning channels.")]),e._v(" "),t("h3",{attrs:{id:"alternative-lightning-testing-using-polar-to-test-lightning-payments"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#alternative-lightning-testing-using-polar-to-test-lightning-payments"}},[e._v("#")]),e._v(" Alternative Lightning testing: Using Polar to test Lightning payments")]),e._v(" "),t("ul",[t("li",[e._v("Install and run "),t("a",{attrs:{href:"https://lightningpolar.com/",target:"_blank",rel:"noopener noreferrer"}},[e._v("Polar"),t("OutboundLink")],1),e._v(". Setup a small network of nodes.")]),e._v(" "),t("li",[e._v("Go to your store's General Settings and enable Lightning.")]),e._v(" "),t("li",[e._v("Build your connection string using the Connect information in the Polar app.")])]),e._v(" "),t("p",[e._v('LND Connection string example:\ntype=lnd-rest;server=https://127.0.0.1:8084/;macaroonfilepath="local path to admin.macaroon on your computer, without these quotes";allowinsecure=true')]),e._v(" "),t("p",[e._v("Now you can create a lightning invoice on BTCPay Server regtest and make a payment through Polar.")]),e._v(" "),t("p",[e._v('PLEASE NOTE: You may get an exception break in Visual Studio. You must quickly click "Continue" in VS so the invoice is generated.\nOr, uncheck the box that says, "Break when this exception type is thrown".')]),e._v(" "),t("h2",{attrs:{id:"faq"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#faq"}},[e._v("#")]),e._v(" FAQ")]),e._v(" "),t("h3",{attrs:{id:"docker-compose-up-dev-failed-or-tests-are-not-passing-what-should-i-do"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#docker-compose-up-dev-failed-or-tests-are-not-passing-what-should-i-do"}},[e._v("#")]),e._v(" "),t("code",[e._v("docker-compose up dev")]),e._v(" failed or tests are not passing, what should I do?")]),e._v(" "),t("ol",[t("li",[e._v("Run "),t("code",[e._v("docker-compose down --volumes")]),e._v(" (this will reset your test environment)")]),e._v(" "),t("li",[e._v("Run "),t("code",[e._v("docker-compose pull")]),e._v(" (this will ensure you have the latest images)")]),e._v(" "),t("li",[e._v("Run again with "),t("code",[e._v("docker-compose up dev")])])]),e._v(" "),t("h3",{attrs:{id:"how-to-run-the-altcoin-environment"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#how-to-run-the-altcoin-environment"}},[e._v("#")]),e._v(" How to run the Altcoin environment?")]),e._v(" "),t("p",[t("code",[e._v("docker-compose -f docker-compose.altcoins.yml up dev")])]),e._v(" "),t("p",[e._v("If you still have issues, try to restart docker.")]),e._v(" "),t("h3",{attrs:{id:"how-to-run-the-selenium-test-with-a-browser"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#how-to-run-the-selenium-test-with-a-browser"}},[e._v("#")]),e._v(" How to run the Selenium test with a browser?")]),e._v(" "),t("p",[e._v("Run "),t("code",[e._v("dotnet user-secrets set RunSeleniumInBrowser true")]),e._v(" to run tests in browser.")]),e._v(" "),t("p",[e._v("To switch back to headless mode (recommended) you can run "),t("code",[e._v("dotnet user-secrets remove RunSeleniumInBrowser")]),e._v(".")]),e._v(" "),t("h3",{attrs:{id:"session-not-created-this-version-of-chromedriver-only-supports-chrome-version-88"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#session-not-created-this-version-of-chromedriver-only-supports-chrome-version-88"}},[e._v("#")]),e._v(" Session not created: This version of ChromeDriver only supports Chrome version 88")]),e._v(" "),t("p",[e._v("When you run tests for selenium, you may end up with this error.\nThis happen when we update the selenium packages on BTCPay Server while you did not update your chrome version.")]),e._v(" "),t("p",[e._v("If you want to use a older chrome driver on "),t("a",{attrs:{href:"https://chromedriver.chromium.org/downloads",target:"_blank",rel:"noopener noreferrer"}},[e._v("this page"),t("OutboundLink")],1),e._v(" then point to it with")]),e._v(" "),t("p",[t("code",[e._v('dotnet user-secrets set ChromeDriverDirectory "path/to/the/driver/directory"')])])])}),[],!1,null,null,null);t.default=r.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[124],{753:function(e,t,s){"use strict";s.r(t);var a=s(10),r=Object(a.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"local-development"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#local-development"}},[e._v("#")]),e._v(" Local development")]),e._v(" "),t("h2",{attrs:{id:"prerequisites"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#prerequisites"}},[e._v("#")]),e._v(" Prerequisites")]),e._v(" "),t("p",[e._v("For the "),t("strong",[e._v("development environment")]),e._v(" you need to install these tools:")]),e._v(" "),t("ul",[t("li",[t("a",{attrs:{href:"https://dotnet.microsoft.com/en-us/download/dotnet/6.0",target:"_blank",rel:"noopener noreferrer"}},[e._v(".NET 6.0 SDK"),t("OutboundLink")],1)]),e._v(" "),t("li",[e._v("Docker: "),t("a",{attrs:{href:"https://docs.docker.com/docker-for-windows/install/",target:"_blank",rel:"noopener noreferrer"}},[e._v("Windows"),t("OutboundLink")],1),e._v(" | "),t("a",{attrs:{href:"https://docs.docker.com/docker-for-mac/install/",target:"_blank",rel:"noopener noreferrer"}},[e._v("Mac OS"),t("OutboundLink")],1),e._v(" | "),t("a",{attrs:{href:"https://docs.docker.com/install/linux/docker-ce/ubuntu/",target:"_blank",rel:"noopener noreferrer"}},[e._v("Linux"),t("OutboundLink")],1)])]),e._v(" "),t("h2",{attrs:{id:"dependencies"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#dependencies"}},[e._v("#")]),e._v(" Dependencies")]),e._v(" "),t("p",[e._v("To execute tests and run the project for debugging, you need to run a number of "),t("strong",[e._v("dependencies")]),e._v(".")]),e._v(" "),t("p",[e._v("We wrapped all our dependencies in a docker-compose file that you can use to bootstrap the development environment:\nThe file "),t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver/blob/master/BTCPayServer.Tests/docker-compose.yml",target:"_blank",rel:"noopener noreferrer"}},[e._v("BTCPayServer.Tests/docker-compose.yml"),t("OutboundLink")],1),e._v(" can be used to spin everything up:")]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token function"}},[e._v("git")]),e._v(" clone https://github.com/btcpayserver/btcpayserver.git\n"),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("cd")]),e._v(" btcpayserver/BTCPayServer.Tests\n"),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("docker-compose")]),e._v(" up dev\n")])])]),t("h2",{attrs:{id:"which-ide"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#which-ide"}},[e._v("#")]),e._v(" Which IDE?")]),e._v(" "),t("p",[e._v("We recommend using Visual Studio 2022 (Windows Only) or Rider (cross platform). Visual Studio Code (cross platform) should also be possible, but isn't as straightforward to setup for a comfortable development environment.\nYou can of course use VIM if you are hardcore, .NET Core is easy to use via command-line.")]),e._v(" "),t("p",[e._v("Visual Studio Code, Visual Studio and Rider will run the launch profile "),t("code",[e._v("Bitcoin")]),e._v(".\nThis will run a "),t("strong",[e._v("BTCPay Server instance connecting to the services in your Docker service")]),e._v(", so you can easily debug and step through the code.")]),e._v(" "),t("h2",{attrs:{id:"build-configuration"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#build-configuration"}},[e._v("#")]),e._v(" Build configuration")]),e._v(" "),t("p",[e._v("A build configuration defines how to "),t("strong",[e._v("build BTCPay Server")]),e._v(". For example, whether to include some source files, whether to optimize for debugging or performance.")]),e._v(" "),t("p",[e._v("There are several build configurations:")]),e._v(" "),t("ul",[t("li",[t("code",[e._v("Debug")])]),e._v(" "),t("li",[t("code",[e._v("Release")])]),e._v(" "),t("li",[t("code",[e._v("Altcoins-Debug")])]),e._v(" "),t("li",[t("code",[e._v("Altcoins-Release")])])]),e._v(" "),t("p",[e._v("How to use a different one during your local development depends on your IDE.\nBy default "),t("code",[e._v("Debug")]),e._v(" is used, this is a Bitcoin only build excluding any altcoin dependencies. How to use a different one during your local development depends on your IDE.")]),e._v(" "),t("p",[e._v("You can select which build to use via the "),t("code",[e._v("-c")]),e._v(" switch in "),t("code",[e._v("dotnet")]),e._v(" command line. If you use command line and want to run a Release build:")]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[e._v("dotnet run "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-c")]),e._v(" Release\n")])])]),t("h2",{attrs:{id:"launch-profiles"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#launch-profiles"}},[e._v("#")]),e._v(" Launch profiles")]),e._v(" "),t("p",[e._v("When you "),t("strong",[e._v("start BTCPay Server locally for local development")]),e._v(", it needs the right parameter so it can connect to the development time dependencies in the docker-compose file.")]),e._v(" "),t("p",[e._v("Those parameters are wrapped into the dotnet concept of "),t("code",[e._v("launch profile")]),e._v(".")]),e._v(" "),t("p",[e._v("The launch profiles are specified in the "),t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver/blob/master/BTCPayServer/Properties/launchSettings.json",target:"_blank",rel:"noopener noreferrer"}},[e._v("launchSettings.json"),t("OutboundLink")],1),e._v(".")]),e._v(" "),t("p",[e._v("There are currently three launch profiles:")]),e._v(" "),t("ul",[t("li",[t("code",[e._v("Bitcoin")])]),e._v(" "),t("li",[t("code",[e._v("Bitcoin-HTTPS")])]),e._v(" "),t("li",[t("code",[e._v("Altcoins-HTTPS")])])]),e._v(" "),t("p",[e._v("By default, "),t("code",[e._v("Bitcoin")]),e._v(" is used. How to use a different one during your local development depends on your IDE.")]),e._v(" "),t("p",[e._v("If you use command line, "),t("code",[e._v("dotnet run")]),e._v(" allows you to select the launch profile of your choice:")]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[e._v("dotnet run --launch-profile Bitcoin\n")])])]),t("h2",{attrs:{id:"running-tests"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#running-tests"}},[e._v("#")]),e._v(" Running tests")]),e._v(" "),t("p",[e._v("Running tests is functioning in the exact same way as running the development time BTCPay Server.")]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("cd")]),e._v(" BTCPayServer.Tests\ndotnet "),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("test")]),e._v("\n")])])]),t("p",[e._v("The concept of "),t("code",[e._v("launch profile")]),e._v(" does not apply for tests, but the concept of build configuration does. For example, if I want to run tests on the Release build:")]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[e._v("dotnet "),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("test")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-c")]),e._v(" Release\n")])])]),t("p",[e._v("The tests are already configured to use the development time dependencies in the docker-compose presented earlier.")]),e._v(" "),t("p",[e._v("You can use the "),t("code",[e._v("--f")]),e._v(" (filter) switch to run a specific test.")]),e._v(" "),t("p",[e._v("If you use an IDE, consult your IDE documentation to run tests or switch to different configurations.")]),e._v(" "),t("h2",{attrs:{id:"altcoin-support-development"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#altcoin-support-development"}},[e._v("#")]),e._v(" Altcoin support development")]),e._v(" "),t("p",[e._v("By default, your IDE or simple "),t("code",[e._v("dotnet run")]),e._v(" will use "),t("code",[e._v("Bitcoin")]),e._v(" launch profile on "),t("code",[e._v("Debug")]),e._v(" build.")]),e._v(" "),t("ul",[t("li",[e._v("This means that BTCPay Server will be hosted on a local HTTP port, building without altcoin support,")]),e._v(" "),t("li",[e._v("Run BTCPay Server to connect to Bitcoin only dependencies specified in "),t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver/blob/master/BTCPayServer.Tests/docker-compose.yml",target:"_blank",rel:"noopener noreferrer"}},[e._v("BTCPayServer.Tests/docker-compose.yml"),t("OutboundLink")],1),e._v(".")])]),e._v(" "),t("p",[e._v("If you want to "),t("strong",[e._v("develop with altcoins support")]),e._v(" you need to use the "),t("code",[e._v("Altcoins-HTTPS")]),e._v(" launch profile, on the "),t("code",[e._v("Altcoins-Debug")]),e._v(" build, and run the "),t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver/blob/master/BTCPayServer.Tests/docker-compose.altcoins.yml",target:"_blank",rel:"noopener noreferrer"}},[e._v("BTCPayServer.Tests/docker-compose.altcoins.yml"),t("OutboundLink")],1),e._v(".")]),e._v(" "),t("p",[e._v("If using command line:")]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("cd")]),e._v(" BTCPayServer.Tests\n"),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("docker-compose")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-f")]),e._v(" docker-compose.altcoins.yml up dev\n"),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("cd")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("..")]),e._v("/BTCPayServer\ndotnet run "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-c")]),e._v(" Altcoins-Debug --launch-profile Altcoins-HTTPS\n")])])]),t("p",[e._v("For tests")]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("cd")]),e._v(" BTCPayServer.Tests\ndotnet "),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("test")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-c")]),e._v(" Altcoins-Debug\n")])])]),t("h2",{attrs:{id:"https-support-for-local-development"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#https-support-for-local-development"}},[e._v("#")]),e._v(" HTTPS support for local development")]),e._v(" "),t("p",[e._v("Some browser security features may require that you use "),t("strong",[e._v("HTTPS")]),e._v(" to be properly tested.")]),e._v(" "),t("p",[e._v("In this case, use "),t("code",[e._v("Bitcoin-HTTPS")]),e._v(" (or "),t("code",[e._v("Altcoin-HTTPS")]),e._v(") launch profile. This will create a self signed certificate for your development purpose.")]),e._v(" "),t("p",[e._v("However, your browser will not trust it, making it difficult to debug.")]),e._v(" "),t("p",[e._v("You can instruct your OS to trust this development time certificate by running:")]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[e._v("dotnet dev-certs https "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("--trust")]),e._v("\n")])])]),t("h2",{attrs:{id:"videos"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#videos"}},[e._v("#")]),e._v(" Videos")]),e._v(" "),t("p",[e._v("For more information check out these videos:")]),e._v(" "),t("ul",[t("li",[t("a",{attrs:{href:"https://youtube.com/watch?v=ZePbMPSIvHM",target:"_blank",rel:"noopener noreferrer"}},[e._v("How to contribute to BTCPay Server Development (Windows)"),t("OutboundLink")],1),e._v(" by Nicolas Dorier")]),e._v(" "),t("li",[t("a",{attrs:{href:"https://youtube.com/watch?v=j486T_Rk-yw",target:"_blank",rel:"noopener noreferrer"}},[e._v("Setting up BTCPayServer development environment on Linux (Ubuntu)"),t("OutboundLink")],1),e._v(" by RockStarDev")]),e._v(" "),t("li",[t("a",{attrs:{href:"https://youtube.com/watch?v=GWR_CcMsEV0",target:"_blank",rel:"noopener noreferrer"}},[e._v("BTCPay Server Development - Testing pull request, payments (MacOS)"),t("OutboundLink")],1),e._v(" by Pavlenex")])]),e._v(" "),t("p",[e._v("and these notes:")]),e._v(" "),t("ul",[t("li",[t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver/blob/master/BTCPayServer.Tests/README.md",target:"_blank",rel:"noopener noreferrer"}},[e._v("How to get started with development"),t("OutboundLink")],1),e._v(" by Nicolas Dorier (covering relevant docker commands, paying regtest invoices)")])]),e._v(" "),t("h2",{attrs:{id:"how-to-manually-test-payments"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#how-to-manually-test-payments"}},[e._v("#")]),e._v(" How to manually test payments")]),e._v(" "),t("h3",{attrs:{id:"using-the-test-bitcoin-cli"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#using-the-test-bitcoin-cli"}},[e._v("#")]),e._v(" Using the test bitcoin-cli")]),e._v(" "),t("p",[e._v("You can call bitcoin-cli inside the container with "),t("code",[e._v("docker exec")]),e._v(".\nFor example, if you want to send "),t("code",[e._v("0.23111090")]),e._v(" to "),t("code",[e._v("mohu16LH66ptoWGEL1GtP6KHTBJYXMWhEf")]),e._v(":")]),e._v(" "),t("div",{staticClass:"language-sh extra-class"},[t("pre",{pre:!0,attrs:{class:"language-sh"}},[t("code",[e._v("./docker-bitcoin-cli.sh sendtoaddress "),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"mohu16LH66ptoWGEL1GtP6KHTBJYXMWhEf"')]),e._v(" "),t("span",{pre:!0,attrs:{class:"token number"}},[e._v("0.23111090")]),e._v("\n")])])]),t("p",[e._v("If you are using Powershell:")]),e._v(" "),t("div",{staticClass:"language-powershell extra-class"},[t("pre",{pre:!0,attrs:{class:"language-powershell"}},[t("code",[t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(".")]),e._v("\\docker-bitcoin-"),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("cli")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(".")]),e._v("ps1 sendtoaddress "),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"mohu16LH66ptoWGEL1GtP6KHTBJYXMWhEf"')]),e._v(" 0"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(".")]),e._v("23111090\n")])])]),t("p",[e._v("You can also generate blocks:")]),e._v(" "),t("div",{staticClass:"language-powershell extra-class"},[t("pre",{pre:!0,attrs:{class:"language-powershell"}},[t("code",[t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(".")]),e._v("\\docker-bitcoin-generate"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(".")]),e._v("ps1 3\n")])])]),t("h3",{attrs:{id:"using-polar-to-test-lightning-payments"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#using-polar-to-test-lightning-payments"}},[e._v("#")]),e._v(" Using Polar to test Lightning payments")]),e._v(" "),t("ul",[t("li",[e._v("Install and run "),t("a",{attrs:{href:"https://lightningpolar.com/",target:"_blank",rel:"noopener noreferrer"}},[e._v("Polar"),t("OutboundLink")],1),e._v(". Setup a small network of nodes.")]),e._v(" "),t("li",[e._v("Go to your store's General Settings and enable Lightning.")]),e._v(" "),t("li",[e._v("Build your connection string using the Connect information in the Polar app.")])]),e._v(" "),t("p",[e._v('LND Connection string example:\ntype=lnd-rest;server=https://127.0.0.1:8084/;macaroonfilepath="local path to admin.macaroon on your computer, without these quotes";allowinsecure=true')]),e._v(" "),t("p",[e._v("Now you can create a Lightning invoice on BTCPay Server regtest and make a payment through Polar.")]),e._v(" "),t("p",[e._v('PLEASE NOTE: You may get an exception break in Visual Studio. You must quickly click "Continue" in VS so the invoice is generated.\nOr, uncheck the box that says, "Break when this exception type is thrown".')]),e._v(" "),t("h3",{attrs:{id:"using-the-test-litecoin-cli"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#using-the-test-litecoin-cli"}},[e._v("#")]),e._v(" Using the test litecoin-cli")]),e._v(" "),t("p",[e._v("Same as bitcoin-cli, but with "),t("code",[e._v(".\\docker-litecoin-cli.ps1")]),e._v(" and "),t("code",[e._v(".\\docker-litecoin-cli.sh")]),e._v(" instead.")]),e._v(" "),t("h3",{attrs:{id:"using-the-test-lightning-cli"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#using-the-test-lightning-cli"}},[e._v("#")]),e._v(" Using the test lightning-cli")]),e._v(" "),t("p",[e._v("If you are using Linux:")]),e._v(" "),t("div",{staticClass:"language-sh extra-class"},[t("pre",{pre:!0,attrs:{class:"language-sh"}},[t("code",[e._v("./docker-customer-lightning-cli.sh pay lnbcrt100u1pd2e6uspp5ajnadvhazjrz55twd5k6yeg9u87wpw0q2fdr7g960yl5asv5fmnqdq9d3hkccqpxmedyrk0ehw5ueqx5e0r4qrrv74cewddfcvsxaawqz7634cmjj39sqwy5tvhz0hasktkk6t9pqfdh3edmf3z09zst5y7khv3rvxh8ctqqw6mwhh\n")])])]),t("p",[e._v("If you are using Powershell:")]),e._v(" "),t("div",{staticClass:"language-powershell extra-class"},[t("pre",{pre:!0,attrs:{class:"language-powershell"}},[t("code",[t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(".")]),e._v("\\docker-customer-lightning-"),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("cli")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(".")]),e._v("ps1 pay lnbcrt100u1pd2e6uspp5ajnadvhazjrz55twd5k6yeg9u87wpw0q2fdr7g960yl5asv5fmnqdq9d3hkccqpxmedyrk0ehw5ueqx5e0r4qrrv74cewddfcvsxaawqz7634cmjj39sqwy5tvhz0hasktkk6t9pqfdh3edmf3z09zst5y7khv3rvxh8ctqqw6mwhh\n")])])]),t("p",[e._v("If you get this message:")]),e._v(" "),t("div",{staticClass:"language-json extra-class"},[t("pre",{pre:!0,attrs:{class:"language-json"}},[t("code",[t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("{")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token property"}},[e._v('"code"')]),e._v(" "),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v(":")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token number"}},[e._v("205")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(",")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token property"}},[e._v('"message"')]),e._v(" "),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v(":")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"Could not find a route"')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(",")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token property"}},[e._v('"data"')]),e._v(" "),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v(":")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("{")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token property"}},[e._v('"getroute_tries"')]),e._v(" "),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v(":")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token number"}},[e._v("1")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(",")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token property"}},[e._v('"sendpay_tries"')]),e._v(" "),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v(":")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token number"}},[e._v("0")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("}")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("}")]),e._v("\n")])])]),t("p",[e._v("Please, run the test "),t("code",[e._v("CanSetLightningServer")]),e._v(", this will establish a channel between the customer and the merchant, then, retry.")]),e._v(" "),t("p",[e._v("Alternatively you can run the "),t("code",[e._v("./docker-lightning-channel-setup.sh")]),e._v(" script to establish the channel connection.\nThe "),t("code",[e._v("./docker-lightning-channel-teardown.sh")]),e._v(" script closes any existing lightning channels.")]),e._v(" "),t("h3",{attrs:{id:"alternative-lightning-testing-using-polar-to-test-lightning-payments"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#alternative-lightning-testing-using-polar-to-test-lightning-payments"}},[e._v("#")]),e._v(" Alternative Lightning testing: Using Polar to test Lightning payments")]),e._v(" "),t("ul",[t("li",[e._v("Install and run "),t("a",{attrs:{href:"https://lightningpolar.com/",target:"_blank",rel:"noopener noreferrer"}},[e._v("Polar"),t("OutboundLink")],1),e._v(". Setup a small network of nodes.")]),e._v(" "),t("li",[e._v("Go to your store's General Settings and enable Lightning.")]),e._v(" "),t("li",[e._v("Build your connection string using the Connect information in the Polar app.")])]),e._v(" "),t("p",[e._v('LND Connection string example:\ntype=lnd-rest;server=https://127.0.0.1:8084/;macaroonfilepath="local path to admin.macaroon on your computer, without these quotes";allowinsecure=true')]),e._v(" "),t("p",[e._v("Now you can create a lightning invoice on BTCPay Server regtest and make a payment through Polar.")]),e._v(" "),t("p",[e._v('PLEASE NOTE: You may get an exception break in Visual Studio. You must quickly click "Continue" in VS so the invoice is generated.\nOr, uncheck the box that says, "Break when this exception type is thrown".')]),e._v(" "),t("h2",{attrs:{id:"faq"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#faq"}},[e._v("#")]),e._v(" FAQ")]),e._v(" "),t("h3",{attrs:{id:"docker-compose-up-dev-failed-or-tests-are-not-passing-what-should-i-do"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#docker-compose-up-dev-failed-or-tests-are-not-passing-what-should-i-do"}},[e._v("#")]),e._v(" "),t("code",[e._v("docker-compose up dev")]),e._v(" failed or tests are not passing, what should I do?")]),e._v(" "),t("ol",[t("li",[e._v("Run "),t("code",[e._v("docker-compose down --volumes")]),e._v(" (this will reset your test environment)")]),e._v(" "),t("li",[e._v("Run "),t("code",[e._v("docker-compose pull")]),e._v(" (this will ensure you have the latest images)")]),e._v(" "),t("li",[e._v("Run again with "),t("code",[e._v("docker-compose up dev")])])]),e._v(" "),t("h3",{attrs:{id:"how-to-run-the-altcoin-environment"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#how-to-run-the-altcoin-environment"}},[e._v("#")]),e._v(" How to run the Altcoin environment?")]),e._v(" "),t("p",[t("code",[e._v("docker-compose -f docker-compose.altcoins.yml up dev")])]),e._v(" "),t("p",[e._v("If you still have issues, try to restart docker.")]),e._v(" "),t("h3",{attrs:{id:"how-to-run-the-selenium-test-with-a-browser"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#how-to-run-the-selenium-test-with-a-browser"}},[e._v("#")]),e._v(" How to run the Selenium test with a browser?")]),e._v(" "),t("p",[e._v("Run "),t("code",[e._v("dotnet user-secrets set RunSeleniumInBrowser true")]),e._v(" to run tests in browser.")]),e._v(" "),t("p",[e._v("To switch back to headless mode (recommended) you can run "),t("code",[e._v("dotnet user-secrets remove RunSeleniumInBrowser")]),e._v(".")]),e._v(" "),t("h3",{attrs:{id:"session-not-created-this-version-of-chromedriver-only-supports-chrome-version-88"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#session-not-created-this-version-of-chromedriver-only-supports-chrome-version-88"}},[e._v("#")]),e._v(" Session not created: This version of ChromeDriver only supports Chrome version 88")]),e._v(" "),t("p",[e._v("When you run tests for selenium, you may end up with this error.\nThis happen when we update the selenium packages on BTCPay Server while you did not update your chrome version.")]),e._v(" "),t("p",[e._v("If you want to use a older chrome driver on "),t("a",{attrs:{href:"https://chromedriver.chromium.org/downloads",target:"_blank",rel:"noopener noreferrer"}},[e._v("this page"),t("OutboundLink")],1),e._v(" then point to it with")]),e._v(" "),t("p",[t("code",[e._v('dotnet user-secrets set ChromeDriverDirectory "path/to/the/driver/directory"')])])])}),[],!1,null,null,null);t.default=r.exports}}]); \ No newline at end of file diff --git a/assets/js/126.e538f108.js b/assets/js/126.9535d8df.js similarity index 99% rename from assets/js/126.e538f108.js rename to assets/js/126.9535d8df.js index 989ec81884..a51ed2cca4 100644 --- a/assets/js/126.e538f108.js +++ b/assets/js/126.9535d8df.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[126],{760:function(e,t,r){"use strict";r.r(t);var a=r(10),n=Object(a.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"introduction"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#introduction"}},[e._v("#")]),e._v(" Introduction")]),e._v(" "),t("p",[e._v("While "),t("RouterLink",{attrs:{to:"/LunaNodeWebDeployment/"}},[e._v("our instructions")]),e._v(" cover how to install BTCPayServer in one click on Azure or Lunanode, BTCPay Server is not limited to those options.")],1),e._v(" "),t("p",[e._v("You will find below information about how you can install BTCPay Server easily in any environment having docker available.")]),e._v(" "),t("h1",{attrs:{id:"architecture"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#architecture"}},[e._v("#")]),e._v(" Architecture")]),e._v(" "),t("figure",[t("img",{attrs:{src:"https://github.com/btcpayserver/btcpayserver-doc/raw/master/docs/img/Architecture.png",alt:"Architecture",title:"Architecture"}})]),e._v(" "),t("p",[e._v("As you can see, BTCPay depends on several pieces of infrastructure, mainly:")]),e._v(" "),t("ul",[t("li",[e._v("A lightweight block explorer (NBXplorer),")]),e._v(" "),t("li",[e._v("A database (PostgreSQL),")]),e._v(" "),t("li",[e._v("A full node (eg. Bitcoin Core)")])]),e._v(" "),t("p",[e._v("There can be more dependencies if you support more than just standard Bitcoin transactions, including:")]),e._v(" "),t("ul",[t("li",[t("a",{attrs:{href:"https://github.com/ElementsProject/lightning",target:"_blank",rel:"noopener noreferrer"}},[e._v("Core Lightning (CLN)"),t("OutboundLink")],1)]),e._v(" "),t("li",[t("a",{attrs:{href:"https://github.com/litecoin-project/litecoin",target:"_blank",rel:"noopener noreferrer"}},[e._v("LitecoinD"),t("OutboundLink")],1),e._v(" and other coin daemons")]),e._v(" "),t("li",[e._v("And more...")])]),e._v(" "),t("p",[e._v("Note: The setup process can be time consuming, but is heavily automated to make it a fun and easy experience.")]),e._v(" "),t("p",[e._v("Take a look at how BTCPay works in a video below.")]),e._v(" "),t("a",{staticClass:"ytEmbed",staticStyle:{"background-image":"url(https://img.youtube.com/vi/nr0UNbz3AoQ/hqdefault.jpg)"},attrs:{href:"https://www.youtube.com/watch?v=nr0UNbz3AoQ",title:"YouTube","data-id":"nr0UNbz3AoQ"}},[t("iframe",{attrs:{title:"YouTube","data-src":"https://www.youtube-nocookie.com/embed/nr0UNbz3AoQ?&autoplay=1&autohide=1&modestbranding=1&color=white&rel=0",frameborder:"0",allow:"autoplay;encrypted-media;picture-in-picture",allowfullscreen:""}})]),e._v(" "),t("p",[e._v("Here is a presentation of the global architecture at Advancing Bitcoin conference.")]),e._v(" "),t("a",{staticClass:"ytEmbed",staticStyle:{"background-image":"url(https://img.youtube.com/vi/Up0dvorzSNM/hqdefault.jpg)"},attrs:{href:"https://www.youtube.com/watch?v=Up0dvorzSNM",title:"BTCPay - Architecture overview","data-id":"Up0dvorzSNM"}},[t("iframe",{attrs:{title:"BTCPay - Architecture overview","data-src":"https://www.youtube-nocookie.com/embed/Up0dvorzSNM?&autoplay=1&autohide=1&modestbranding=1&color=white&rel=0",frameborder:"0",allow:"autoplay;encrypted-media;picture-in-picture",allowfullscreen:""}})]),e._v(" "),t("h1",{attrs:{id:"full-installation-for-technical-users"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#full-installation-for-technical-users"}},[e._v("#")]),e._v(" Full installation (for technical users)")]),e._v(" "),t("p",[e._v("You can also install BTCPay Server on your own machine or VPS instance.")]),e._v(" "),t("p",[e._v("The officially supported setup is driven by Docker (and Docker-Compose).")]),e._v(" "),t("p",[e._v("First, make sure you have a domain name pointing to your host "),t("code",[e._v("A record")]),e._v(", with ports "),t("code",[e._v("443")]),e._v(" and "),t("code",[e._v("80")]),e._v(" externally accessible. For Lightning Network, port "),t("code",[e._v("9735")]),e._v(" is required ("),t("code",[e._v("9736")]),e._v(" if you use Litecoin Lightning). Otherwise, you will have to set a domain manually by running "),t("code",[e._v("changedomain.sh")]),e._v(".")]),e._v(" "),t("p",[e._v("Let's assume your domain is "),t("code",[e._v("btcpay.EXAMPLE.com")]),e._v(".")]),e._v(" "),t("p",[e._v("The setup below assumes you want to support Bitcoin, Core Lightning (CLN), HTTPS automatically configured by Nginx. It also enables node pruning, which you can "),t("a",{attrs:{href:"#generated-docker-compose"}},[e._v("modify")]),e._v(" or ignore if you have enough disk space for a full node. Finally, your domain is "),t("code",[e._v("btcpay.EXAMPLE.com")]),e._v(" should reflect your actual domain name.")]),e._v(" "),t("p",[t("a",{attrs:{href:"#environment-variables"}},[e._v("Environment variables")]),e._v(" can be tailored to your needs. Some variables require additional storage space.")]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token comment"}},[e._v("# Login as root")]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("sudo")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("su")]),e._v(" -\n\n"),t("span",{pre:!0,attrs:{class:"token comment"}},[e._v("# Create a folder for BTCPay")]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("mkdir")]),e._v(" BTCPayServer\n"),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("cd")]),e._v(" BTCPayServer\n\n"),t("span",{pre:!0,attrs:{class:"token comment"}},[e._v("# Clone this repository")]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("git")]),e._v(" clone https://github.com/btcpayserver/btcpayserver-docker\n"),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("cd")]),e._v(" btcpayserver-docker\n\n"),t("span",{pre:!0,attrs:{class:"token comment"}},[e._v("# Run btcpay-setup.sh with the right parameters")]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("export")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[e._v("BTCPAY_HOST")]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"btcpay.EXAMPLE.com"')]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("export")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[e._v("NBITCOIN_NETWORK")]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"mainnet"')]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("export")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[e._v("BTCPAYGEN_CRYPTO1")]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"btc"')]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("export")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[e._v("BTCPAYGEN_ADDITIONAL_FRAGMENTS")]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"opt-save-storage-s"')]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("export")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[e._v("BTCPAYGEN_REVERSEPROXY")]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"nginx"')]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("export")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[e._v("BTCPAYGEN_LIGHTNING")]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"clightning"')]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("export")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[e._v("BTCPAY_ENABLE_SSH")]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),e._v("true\n"),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v(".")]),e._v(" ./btcpay-setup.sh "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-i")]),e._v("\n\n"),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("exit")]),e._v("\n")])])]),t("p",[t("code",[e._v("btcpay-setup.sh")]),e._v(" will then:")]),e._v(" "),t("ul",[t("li",[e._v("Install Docker")]),e._v(" "),t("li",[e._v("Install Docker-Compose")]),e._v(" "),t("li",[e._v("Make sure BTCPay starts at reboot via upstart or systemd")]),e._v(" "),t("li",[e._v("Setup environment variables to use BTCPay utilities")]),e._v(" "),t("li",[e._v("Add BTCPay utilities in /usr/bin")]),e._v(" "),t("li",[e._v("Start BTCPay Server")])]),e._v(" "),t("p",[e._v("Video below guides you step by step on how to set up BTCPay Server on a VPS with Docker.")]),e._v(" "),t("a",{staticClass:"ytEmbed",staticStyle:{"background-image":"url(https://img.youtube.com/vi/x6hqTFgHqhA/hqdefault.jpg)"},attrs:{href:"https://www.youtube.com/watch?v=x6hqTFgHqhA",title:"YouTube","data-id":"x6hqTFgHqhA"}},[t("iframe",{attrs:{title:"YouTube","data-src":"https://www.youtube-nocookie.com/embed/x6hqTFgHqhA?&autoplay=1&autohide=1&modestbranding=1&color=white&rel=0",frameborder:"0",allow:"autoplay;encrypted-media;picture-in-picture",allowfullscreen:""}})]),e._v(" "),t("p",[e._v("Check out this video if you're interested in learning more about setting up "),t("a",{attrs:{href:"https://www.youtube.com/playlist?list=PLH4m2oS2ratfaprAFx9E3ZDjwxNKvCk4e",target:"_blank",rel:"noopener noreferrer"}},[e._v("BTCPay with Docker Compose"),t("OutboundLink")],1),e._v(".")]),e._v(" "),t("figure",[t("a",{attrs:{href:"https://hub.docker.com/r/btcpayserver/btcpayserver/",target:"_blank",rel:"noopener noreferrer"}},[t("img",{attrs:{src:"https://img.shields.io/docker/automated/btcpayserver/btcpayserver.svg",alt:"Docker automated build",title:"Docker automated build"}}),t("OutboundLink")],1)]),e._v(" "),t("h1",{attrs:{id:"environment-variables"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#environment-variables"}},[e._v("#")]),e._v(" Environment variables")]),e._v(" "),t("p",[t("code",[e._v("btcpay-setup.sh")]),e._v(" will use the following environment variables:")]),e._v(" "),t("ul",[t("li",[t("code",[e._v("BTCPAY_HOST")]),e._v(": The hostname of your website (eg. "),t("code",[e._v("btcpay.example.com")]),e._v(")")]),e._v(" "),t("li",[t("code",[e._v("BTCPAY_ADDITIONAL_HOSTS")]),e._v(": Optional, specify additional domains to your BTCPayServer with https support if enabled. (eg. example2.com,example3.com)")]),e._v(" "),t("li",[t("code",[e._v("REVERSEPROXY_HTTP_PORT")]),e._v(": The public port the reverse proxy binds to for HTTP traffic (default: 80)")]),e._v(" "),t("li",[t("code",[e._v("REVERSEPROXY_HTTPS_PORT")]),e._v(": The public port the reverse proxy binds to for HTTPS traffic (default: 443)")]),e._v(" "),t("li",[t("code",[e._v("REVERSEPROXY_DEFAULT_HOST")]),e._v(": Optional, if using a reverse proxy nginx, specify which website should be presented if the server is accessed by its IP or by an unrecognized domain name.")]),e._v(" "),t("li",[t("code",[e._v("NOREVERSEPROXY_HTTP_PORT")]),e._v(": Optional, if not using a reverse proxy, specify which port should be opened for HTTP traffic. (default: 80)")]),e._v(" "),t("li",[t("code",[e._v("NBITCOIN_NETWORK")]),e._v(": The type of network to use (eg. "),t("code",[e._v("mainnet")]),e._v(", "),t("code",[e._v("testnet")]),e._v(", or "),t("code",[e._v("regtest")]),e._v(". Default: "),t("code",[e._v("mainnet")]),e._v(")")]),e._v(" "),t("li",[t("code",[e._v("LIGHTNING_ALIAS")]),e._v(": An alias for your lightning network node, if used")]),e._v(" "),t("li",[t("code",[e._v("BTCPAYGEN_CRYPTO1")]),e._v(": First supported crypto currency (eg. "),t("code",[e._v("btc")]),e._v(", "),t("code",[e._v("ltc")]),e._v(". Default: "),t("code",[e._v("btc")]),e._v(")")]),e._v(" "),t("li",[t("code",[e._v("BTCPAYGEN_CRYPTO2")]),e._v(": Second supported crypto currency (eg. "),t("code",[e._v("btc")]),e._v(", "),t("code",[e._v("ltc")]),e._v(". Default: "),t("code",[e._v("(empty)")]),e._v(")")]),e._v(" "),t("li",[t("code",[e._v("BTCPAYGEN_CRYPTON")]),e._v(": N'th supported crypto currency where N is 9 at maximum. (eg. "),t("code",[e._v("btc")]),e._v(", "),t("code",[e._v("ltc")]),e._v(". Default: "),t("code",[e._v("(empty)")]),e._v(")")]),e._v(" "),t("li",[t("code",[e._v("BTCPAYGEN_REVERSEPROXY")]),e._v(": Specify reverse proxy to use; NGinx has HTTPS support. (eg. "),t("code",[e._v("nginx")]),e._v(", "),t("code",[e._v("traefik")]),e._v(", "),t("code",[e._v("(empty)")]),e._v(". Default: "),t("code",[e._v("nginx")]),e._v(")")]),e._v(" "),t("li",[t("code",[e._v("BTCPAYGEN_LIGHTNING")]),e._v(": Lightning network implementation to use (eg. "),t("code",[e._v("clightning")]),e._v(", "),t("code",[e._v("lnd")]),e._v(", Default: "),t("code",[e._v("(empty)")]),e._v(")")]),e._v(" "),t("li",[t("code",[e._v("BTCPAYGEN_SUBNAME")]),e._v(": The subname of the generated docker-compose file, where the full name is "),t("code",[e._v("Generated/docker-compose.SUBNAME.yml")]),e._v(" (Default: "),t("code",[e._v("generated")]),e._v(")")]),e._v(" "),t("li",[t("code",[e._v("BTCPAYGEN_ADDITIONAL_FRAGMENTS")]),e._v(": Semicolon-separated list of additional fragments you want to use (eg. "),t("code",[e._v("opt-save-storage")]),e._v(")")]),e._v(" "),t("li",[t("code",[e._v("LETSENCRYPT_EMAIL")]),e._v(": An email will be sent to this address if certificate expires and fails to renew automatically (eg. "),t("code",[e._v("me@example.com")]),e._v(")")]),e._v(" "),t("li",[t("code",[e._v("ACME_CA_URI")]),e._v(": The API endpoint to ask for HTTPS certificate (Default: "),t("code",[e._v("production")]),e._v(")")]),e._v(" "),t("li",[t("code",[e._v("BTCPAY_ENABLE_SSH")]),e._v(": Optional, gives BTCPay Server SSH access to the host by allowing it to edit authorized_keys of the host, it can be used for managing the authorized_keys or updating BTCPay Server directly through the website. (Default: false)")]),e._v(" "),t("li",[t("code",[e._v("BTCPAYGEN_DOCKER_IMAGE")]),e._v(": Optional, Specify which generator image to use if you have customized the C# generator. Set to "),t("code",[e._v("btcpayserver/docker-compose-generator:local")]),e._v(" to build the generator locally at runtime.")]),e._v(" "),t("li",[t("code",[e._v("BTCPAY_IMAGE")]),e._v(": Optional, Specify which btcpayserver image to use if you have a customized btcpayserver.")]),e._v(" "),t("li",[t("code",[e._v("BTCPAYGEN_EXCLUDE_FRAGMENTS")]),e._v(": Semicolon-separated list of fragments you want to forcefully exclude (eg. "),t("code",[e._v("litecoin-clightning")]),e._v(")")]),e._v(" "),t("li",[t("code",[e._v("TOR_RELAY_NICKNAME")]),e._v(": If tor relay is activated with opt-add-tor-relay, the relay nickname")]),e._v(" "),t("li",[t("code",[e._v("TOR_RELAY_EMAIL")]),e._v(": If tor relay is activated with opt-add-tor-relay, the email for Tor to contact you regarding your relay")])]),e._v(" "),t("p",[e._v("Additionally, there are specific environment variables for some addons:")]),e._v(" "),t("ul",[t("li",[t("code",[e._v("LIBREPATRON_HOST")]),e._v(": If libre patron is activated with "),t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver-docker/blob/master/docker-compose-generator/docker-fragments/opt-add-librepatron.yml",target:"_blank",rel:"noopener noreferrer"}},[e._v("opt-add-librepatron"),t("OutboundLink")],1),e._v(", the hostname of your libre patron website (eg. "),t("code",[e._v("librepatron.example.com")]),e._v(")")]),e._v(" "),t("li",[t("code",[e._v("ZAMMAD_HOST")]),e._v(": If zammad is activated with "),t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver-docker/blob/master/docker-compose-generator/docker-fragments/opt-add-zammad.yml",target:"_blank",rel:"noopener noreferrer"}},[e._v("opt-add-zammad"),t("OutboundLink")],1),e._v(", the hostname of your zammad website (eg. "),t("code",[e._v("zammad.example.com")]),e._v(")")]),e._v(" "),t("li",[t("code",[e._v("WOOCOMMERCE_HOST")]),e._v(": If woocommerce is activated with "),t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver-docker/blob/master/docker-compose-generator/docker-fragments/opt-add-woocommerce.yml",target:"_blank",rel:"noopener noreferrer"}},[e._v("opt-add-woocommerce"),t("OutboundLink")],1),e._v(", the hostname of your woocommerce website (eg. "),t("code",[e._v("store.example.com")]),e._v(")")]),e._v(" "),t("li",[t("code",[e._v("EPS_XPUB")]),e._v(": If Electrum Personal Server (EPS) is activated with "),t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver-docker/blob/master/docker-compose-generator/docker-fragments/opt-add-electrum-ps.yml",target:"_blank",rel:"noopener noreferrer"}},[e._v("opt-add-electrum-ps"),t("OutboundLink")],1),e._v(", you must set the Extended Public Key (XPUB, YPUB or ZPUB) of the wallet you want to use, before first run of the EPS server. If you accidently start EPS without this, it will not work properly as the model of EPS is to monitor only specified wallets.")]),e._v(" "),t("li",[e._v("If Bitcoin Wallet Tracker is activated with "),t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver-docker/blob/master/docker-compose-generator/docker-fragments/opt-add-bwt.yml",target:"_blank",rel:"noopener noreferrer"}},[e._v("opt-add-bwt"),t("OutboundLink")],1),e._v(", you can use "),t("code",[e._v("BWT_XPUB")]),e._v("/"),t("code",[e._v("BWT_XPUB_*")]),e._v(" (to set your XPUB/YPUB/ZPUB), "),t("code",[e._v("BWT_DESCRIPTOR")]),e._v("/"),t("code",[e._v("BWT_DESCRIPTOR_*")]),e._v(" (for script descriptors), "),t("code",[e._v("BWT_RESCAN_SINCE")]),e._v(" (set to the wallet creation date in YYYY-MM-DD to speed up the rescan), "),t("code",[e._v("BWT_BITCOIND_WALLET")]),e._v(" and "),t("code",[e._v("BWT_GAP_LIMIT")]),e._v(".")]),e._v(" "),t("li",[t("code",[e._v("LND_WTCLIENT_SWEEP_FEE")]),e._v(": If LND watchtower is activated with "),t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver-docker/blob/master/docker-compose-generator/docker-fragments/opt-lnd-wtclient.yml",target:"_blank",rel:"noopener noreferrer"}},[e._v("opt-lnd-wtclient"),t("OutboundLink")],1),e._v(", you can use "),t("code",[e._v("LND_WTCLIENT_SWEEP_FEE")]),e._v(" to change the sweep fee used in constructing the justice transaction (default is 10 sat/byte)")]),e._v(" "),t("li",[t("code",[e._v("FIREFLY_HOST")]),e._v(": If fireflyiii is activated with "),t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver-docker/blob/master/docker-compose-generator/docker-fragments/opt-add-fireflyiii.yml",target:"_blank",rel:"noopener noreferrer"}},[e._v("opt-add-fireflyiii"),t("OutboundLink")],1),e._v(", the hostname of your fireflyiii website (eg. "),t("code",[e._v("firefly.example.com")]),e._v(")")]),e._v(" "),t("li",[t("code",[e._v("CLOUDFLARE_TUNNEL_TOKEN")]),e._v(": Used to expose your instance to clearnet with a Cloudflare Argo Tunnel (if cloudflare tunnel is activated with "),t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver-docker/blob/master/docker-compose-generator/docker-fragments/opt-add-cloudflared.yml",target:"_blank",rel:"noopener noreferrer"}},[e._v("opt-add-cloudflared"),t("OutboundLink")],1),e._v(", for setup instructions "),t("RouterLink",{attrs:{to:"/Docker/cloudflare-tunnel/"}},[e._v("see documentation")]),e._v(")")],1)]),e._v(" "),t("h1",{attrs:{id:"tooling"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#tooling"}},[e._v("#")]),e._v(" Tooling")]),e._v(" "),t("p",[e._v("A wide variety of useful scripts are available once BTCPay is installed:")]),e._v(" "),t("ul",[t("li",[t("code",[e._v("bitcoin-cli.sh")]),e._v(": Access your Bitcoin node instance (for RPC)")]),e._v(" "),t("li",[t("code",[e._v("bitcoin-lightning-cli.sh")]),e._v(": Access your CLN node instance (for RPC)")]),e._v(" "),t("li",[t("code",[e._v("changedomain.sh")]),e._v(": Change the domain of your BTCPayServer (remember to disable 2FA/U2F first, as you risk being unable to log in to your account)")]),e._v(" "),t("li",[t("code",[e._v("btcpay-update.sh")]),e._v(": Update BTCPayServer to the latest version")]),e._v(" "),t("li",[t("code",[e._v("btcpay-up.sh")]),e._v(": Run "),t("code",[e._v("docker-compose up")])]),e._v(" "),t("li",[t("code",[e._v("btcpay-down.sh")]),e._v(": Run "),t("code",[e._v("docker-compose down")])]),e._v(" "),t("li",[t("code",[e._v("btcpay-setup.sh")]),e._v(": Change the settings of your server")]),e._v(" "),t("li",[t("code",[e._v("btcpay-clean.sh")]),e._v(": Purge any unused docker images")]),e._v(" "),t("li",[t("code",[e._v(". ./btcpay-setup.sh")]),e._v(": Information about additional parameters")]),e._v(" "),t("li",[t("code",[e._v(". ./btcpay-setup.sh -i")]),e._v(": Set up your BTCPayServer")]),e._v(" "),t("li",[t("code",[e._v("btcpay-restart.sh")]),e._v(": Restart your BTCPayServer")])]),e._v(" "),t("h1",{attrs:{id:"under-the-hood"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#under-the-hood"}},[e._v("#")]),e._v(" Under the hood")]),e._v(" "),t("h2",{attrs:{id:"generated-docker-compose"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#generated-docker-compose"}},[e._v("#")]),e._v(" Generated docker-compose")]),e._v(" "),t("p",[e._v("When you run "),t("code",[e._v("btcpay-setup.sh")]),e._v(", your environment variables are used by "),t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver-docker/blob/master/build.sh",target:"_blank",rel:"noopener noreferrer"}},[e._v("build.sh"),t("OutboundLink")],1),e._v(" (or "),t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver-docker/blob/master/build.ps1",target:"_blank",rel:"noopener noreferrer"}},[e._v("build.ps1"),t("OutboundLink")],1),e._v(") to generate a docker-compose adapted for your needs. For the full list of options, see: "),t("a",{attrs:{href:"#environment-variables"}},[e._v("Environment variables")])]),e._v(" "),t("p",[e._v("By default, the generated file is "),t("code",[e._v("Generated/docker-compose.generated.yml")]),e._v(", constructed from the relevant "),t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver-docker/blob/master/docker-compose-generator/docker-fragments",target:"_blank",rel:"noopener noreferrer"}},[e._v("Docker fragments"),t("OutboundLink")],1),e._v(" for your setup.")]),e._v(" "),t("p",[e._v("Available "),t("code",[e._v("BTCPAYGEN_ADDITIONAL_FRAGMENTS")]),e._v(" currently are:")]),e._v(" "),t("ul",[t("li",[t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver-docker/blob/master/docker-compose-generator/docker-fragments/opt-save-storage.yml",target:"_blank",rel:"noopener noreferrer"}},[e._v("opt-save-storage"),t("OutboundLink")],1),e._v(" will keep around 1 year of blocks (prune BTC for 100 GB)")]),e._v(" "),t("li",[t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver-docker/blob/master/docker-compose-generator/docker-fragments/opt-save-storage-s.yml",target:"_blank",rel:"noopener noreferrer"}},[e._v("opt-save-storage-s"),t("OutboundLink")],1),e._v(" will keep around 6 months of blocks (prune BTC for 50 GB)")]),e._v(" "),t("li",[t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver-docker/blob/master/docker-compose-generator/docker-fragments/opt-save-storage-xs.yml",target:"_blank",rel:"noopener noreferrer"}},[e._v("opt-save-storage-xs"),t("OutboundLink")],1),e._v(" will keep around 3 months of blocks (prune BTC for 25 GB)")]),e._v(" "),t("li",[t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver-docker/blob/master/docker-compose-generator/docker-fragments/opt-save-storage-xxs.yml",target:"_blank",rel:"noopener noreferrer"}},[e._v("opt-save-storage-xxs"),t("OutboundLink")],1),e._v(" will keep around 2 weeks of blocks (prune BTC for 5 GB) (lightning not supported)")]),e._v(" "),t("li",[t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver-docker/blob/master/docker-compose-generator/docker-fragments/opt-lnd-autocompact",target:"_blank",rel:"noopener noreferrer"}},[e._v("opt-lnd-autocompact"),t("OutboundLink")],1),e._v(" will activate auto compacting of LND database.")]),e._v(" "),t("li",[t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver-docker/blob/master/docker-compose-generator/docker-fragments/opt-lnd-autopilot.yml",target:"_blank",rel:"noopener noreferrer"}},[e._v("opt-lnd-autopilot"),t("OutboundLink")],1),e._v(" will activate auto pilot on LND. (5 channels, 60% of allocation)")]),e._v(" "),t("li",[t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver-docker/blob/master/docker-compose-generator/docker-fragments/opt-lnd-keysend.yml",target:"_blank",rel:"noopener noreferrer"}},[e._v("opt-lnd-keysend"),t("OutboundLink")],1),e._v(" will activate keysend on LND.")]),e._v(" "),t("li",[t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver-docker/blob/master/docker-compose-generator/docker-fragments/opt-lnd-wtclient.yml",target:"_blank",rel:"noopener noreferrer"}},[e._v("opt-lnd-wtclient"),t("OutboundLink")],1),e._v(" will activate the watchtower client on LND. "),t("code",[e._v("LND_WTCLIENT_SWEEP_FEE")]),e._v(" can be used to override the default 10 sat/byte justice transaction fee")]),e._v(" "),t("li",[t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver-docker/blob/master/docker-compose-generator/docker-fragments/opt-lnd-watchtower.yml",target:"_blank",rel:"noopener noreferrer"}},[e._v("opt-lnd-watchtower"),t("OutboundLink")],1),e._v(" will activate the LND watchtower RPC")]),e._v(" "),t("li",[t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver-docker/blob/master/docker-compose-generator/docker-fragments/opt-save-memory.yml",target:"_blank",rel:"noopener noreferrer"}},[e._v("opt-save-memory"),t("OutboundLink")],1),e._v(" will decrease the default dbcache at the expense of longer synchronization time. (Useful if your machine is less than 2GB)")]),e._v(" "),t("li",[t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver-docker/blob/master/docker-compose-generator/docker-fragments/opt-more-memory.yml",target:"_blank",rel:"noopener noreferrer"}},[e._v("opt-more-memory"),t("OutboundLink")],1),e._v(" will increase the default dbcache to make synchronization faster (Useful if your machine is has around 4GB)")]),e._v(" "),t("li",[t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver-docker/blob/master/docker-compose-generator/docker-fragments/opt-add-btcqbo.yml",target:"_blank",rel:"noopener noreferrer"}},[e._v("opt-add-btcqbo"),t("OutboundLink")],1),e._v(" will allow you to create an invoice on Quickbooks which include a way for your customer to pay on BTCPay Server (More information on this "),t("a",{attrs:{href:"https://github.com/JeffVandrewJr/btcqbo/",target:"_blank",rel:"noopener noreferrer"}},[e._v("github repository"),t("OutboundLink")],1),e._v(", this add-on is maintained by "),t("a",{attrs:{href:"https://github.com/JeffVandrewJr",target:"_blank",rel:"noopener noreferrer"}},[e._v("JeffVandrewJr"),t("OutboundLink")],1),e._v(", see more on "),t("a",{attrs:{href:"https://www.youtube.com/watch?v=srgwL9ozg6c",target:"_blank",rel:"noopener noreferrer"}},[e._v("this video"),t("OutboundLink")],1),e._v(")")]),e._v(" "),t("li",[t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver-docker/blob/master/docker-compose-generator/docker-fragments/opt-add-librepatron.yml",target:"_blank",rel:"noopener noreferrer"}},[e._v("opt-add-librepatron"),t("OutboundLink")],1),e._v(", for a self-hosted Patreon alternative backed by BTCPay (More information on this "),t("a",{attrs:{href:"https://github.com/JeffVandrewJr/patron",target:"_blank",rel:"noopener noreferrer"}},[e._v("github repository"),t("OutboundLink")],1),e._v(", this add-on is maintained by "),t("a",{attrs:{href:"https://github.com/JeffVandrewJr",target:"_blank",rel:"noopener noreferrer"}},[e._v("JeffVandrewJr"),t("OutboundLink")],1),e._v(".")]),e._v(" "),t("li",[t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver-docker/blob/master/docker-compose-generator/docker-fragments/opt-add-woocommerce.yml",target:"_blank",rel:"noopener noreferrer"}},[e._v("opt-add-woocommerce"),t("OutboundLink")],1),e._v(", for a self-hosted woocommerce with BTCPay Server plugin pre installed.")]),e._v(" "),t("li",[t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver-docker/blob/master/docker-compose-generator/docker-fragments/opt-add-tor.yml",target:"_blank",rel:"noopener noreferrer"}},[e._v("opt-add-tor"),t("OutboundLink")],1),e._v(", for exposing BTCPayServer, Woocommerce, your lightning nodes as hidden services and accept onion peers for your full node. Warning: This options is for working around NAT and firewall problems as well as to help protect your customer's privacy. This will not protect your privacy against a targeted attack against you.")]),e._v(" "),t("li",[t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver-docker/blob/master/docker-compose-generator/docker-fragments/opt-add-btctransmuter.yml",target:"_blank",rel:"noopener noreferrer"}},[e._v("opt-add-btctransmuter"),t("OutboundLink")],1),e._v(", for a self-hosted IFTTT style service for crypto services such as fiat settlement. (More information on this "),t("a",{attrs:{href:"https://github.com/btcpayserver/btcTransmuter/",target:"_blank",rel:"noopener noreferrer"}},[e._v("github repository"),t("OutboundLink")],1)]),e._v(" "),t("li",[t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver-docker/blob/master/docker-compose-generator/docker-fragments/opt-txindex.yml",target:"_blank",rel:"noopener noreferrer"}},[e._v("opt-txindex"),t("OutboundLink")],1),e._v(", to enable txindex=1 in bitcoin.conf if you require txindexing for Bisq, DOJO, etc.")]),e._v(" "),t("li",[t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver-docker/blob/master/docker-compose-generator/docker-fragments/opt-expose-unsafe.yml",target:"_blank",rel:"noopener noreferrer"}},[e._v("opt-expose-unsafe"),t("OutboundLink")],1),e._v(", to unsafely expose bitcoind P2P port 8333 if you require P2P for Bisq, DOJO, Esplora, etc. WARNING: ONLY USE ON TRUSTED LAN OR WITH FIREWALL RULES WHITELISTING SPECIFIC HOSTS")]),e._v(" "),t("li",[t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver-docker/blob/master/docker-compose-generator/docker-fragments/opt-add-tor-relay.yml",target:"_blank",rel:"noopener noreferrer"}},[e._v("opt-add-tor-relay"),t("OutboundLink")],1),e._v(", for a non-exit tor relay. Make sure to have port 9001 accessible externally. "),t("a",{attrs:{href:"https://community.torproject.org/relay/community-resources/eff-tor-legal-faq",target:"_blank",rel:"noopener noreferrer"}},[e._v("Please read the legal implications of running a tor relay"),t("OutboundLink")],1),e._v(" and "),t("a",{attrs:{href:"https://trac.torproject.org/projects/tor/wiki/TorRelayGuide#RelayRequirements",target:"_blank",rel:"noopener noreferrer"}},[e._v("what resources are used to operate the relay"),t("OutboundLink")],1),e._v(".")]),e._v(" "),t("li",[t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver-docker/blob/master/docker-compose-generator/docker-fragments/opt-add-electrumx.yml",target:"_blank",rel:"noopener noreferrer"}},[e._v("opt-add-electrumx"),t("OutboundLink")],1),e._v(", to integrate a full ElectrumX server (from official source) with BTCPay, using the BTCPay server's full bitcoin node for complete privacy when using your own Electrum wallet. You can also open port 50002 up to the internet on your router etc, to be part of the ElectrumX network, helping other Electrum wallet users to get connected. The bitcoin option "),t("code",[e._v("-txindex")]),e._v(" is mandatory for ElectrumX, and this fragment will enable it on your BTCPay server automatically - No need to use the fragment opt-txindex.yml.")]),e._v(" "),t("li",[t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver-docker/blob/master/docker-compose-generator/docker-fragments/opt-add-electrum-ps.yml",target:"_blank",rel:"noopener noreferrer"}},[e._v("opt-add-electrum-ps"),t("OutboundLink")],1),e._v(", to integrate Electrum Personal Server (EPS) with BTCPay (EPS is a single-user alternative to the ElectrumX Server option above). EPS will also use the BTCPay server's full bitcoin node for complete privacy when using your own Electrum wallet, for your own personal use (i.e. other users cannot use your server to verify transactions). Also, the bitcoin option "),t("code",[e._v("-txindex")]),e._v(" is NOT mandatory for EPS, and it will run on a pruned node (unlike ElectrumX). You will need to add your XPUB/YPUB/ZPUB as environment variable "),t("code",[e._v("EPS_XPUB")]),e._v(" before enabling EPS for the first time (see above section on environment variables, and see "),t("RouterLink",{attrs:{to:"/ElectrumPersonalServer/"}},[e._v("full documentation")]),e._v(" for details).")],1),e._v(" "),t("li",[t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver-docker/blob/master/docker-compose-generator/docker-fragments/opt-add-bwt.yml",target:"_blank",rel:"noopener noreferrer"}},[e._v("opt-add-electrum-bwt"),t("OutboundLink")],1),e._v(", to integrate the "),t("a",{attrs:{href:"https://github.com/bwt-dev/bwt",target:"_blank",rel:"noopener noreferrer"}},[e._v("Bitcoin Wallet Tracker"),t("OutboundLink")],1),e._v(" Electrum server, which uses a personal wallet index model similar to that of EPS. You will need to set "),t("code",[e._v("BWT_XPUB")]),e._v(" with your XPUB/YPUB/ZPUB (see environment variables section). The server will only be available locally and through an onion service.")]),e._v(" "),t("li",[t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver-docker/blob/master/docker-compose-generator/docker-fragments/opt-add-configurator.yml",target:"_blank",rel:"noopener noreferrer"}},[e._v("opt-add-configurator"),t("OutboundLink")],1),e._v(", to integrate the "),t("a",{attrs:{href:"https://install.btcpayserver.org",target:"_blank",rel:"noopener noreferrer"}},[e._v("BTCPay Server Configurator"),t("OutboundLink")],1),e._v(" to manage your BTCPay deployment through a UI, and to allow new deployments elsewhere easily.")]),e._v(" "),t("li",[t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver-docker/blob/master/docker-compose-generator/docker-fragments/opt-add-pihole.yml",target:"_blank",rel:"noopener noreferrer"}},[e._v("opt-add-pihole"),t("OutboundLink")],1),e._v(" ("),t("RouterLink",{attrs:{to:"/Docker/pihole/"}},[e._v("See the documentation")]),e._v(")")],1),e._v(" "),t("li",[t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver-docker/blob/master/docker-compose-generator/docker-fragments/opt-add-bluewallet-lndhub.yml",target:"_blank",rel:"noopener noreferrer"}},[e._v("opt-add-bluewallet-lndhub"),t("OutboundLink")],1),e._v(" for "),t("a",{attrs:{href:"https://github.com/BlueWallet/LndHub",target:"_blank",rel:"noopener noreferrer"}},[e._v("Bluewallet LNDHub"),t("OutboundLink")],1),e._v(" - Use non-custodial LND Lightning directly from your Bluewallet, and freely let others open accounts on your node. Fragment maintained by "),t("a",{attrs:{href:"https://github.com/maltokyo",target:"_blank",rel:"noopener noreferrer"}},[e._v("maltokyo"),t("OutboundLink")],1),e._v(".")]),e._v(" "),t("li",[t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver-docker/blob/master/docker-compose-generator/docker-fragments/opt-add-ndlc.yml",target:"_blank",rel:"noopener noreferrer"}},[e._v("opt-add-ndlc"),t("OutboundLink")],1),e._v(" ("),t("RouterLink",{attrs:{to:"/Docker/ndlc/"}},[e._v("See the documentation")]),e._v(")")],1),e._v(" "),t("li",[t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver-docker/blob/master/docker-compose-generator/docker-fragments/opt-add-lightning-terminal.yml",target:"_blank",rel:"noopener noreferrer"}},[e._v("opt-add-lightning-terminal"),t("OutboundLink")],1),e._v(" for "),t("a",{attrs:{href:"https://github.com/lightninglabs/lightning-terminal",target:"_blank",rel:"noopener noreferrer"}},[e._v("Lightning Terminal/LiT"),t("OutboundLink")],1),e._v(". Maintained by "),t("a",{attrs:{href:"https://github.com/dennisreimann",target:"_blank",rel:"noopener noreferrer"}},[e._v("dennisreimann"),t("OutboundLink")],1),e._v(".")]),e._v(" "),t("li",[t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver-docker/blob/master/docker-compose-generator/docker-fragments/opt-add-mempool.yml",target:"_blank",rel:"noopener noreferrer"}},[e._v("opt-add-mempool"),t("OutboundLink")],1),e._v(" for "),t("a",{attrs:{href:"https://github.com/mempool/mempool",target:"_blank",rel:"noopener noreferrer"}},[e._v("Mempool"),t("OutboundLink")],1),e._v(". Maintained by "),t("a",{attrs:{href:"https://github.com/dennisreimann",target:"_blank",rel:"noopener noreferrer"}},[e._v("dennisreimann"),t("OutboundLink")],1),e._v(".")]),e._v(" "),t("li",[t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver-docker/blob/master/docker-compose-generator/docker-fragments/opt-add-sphinxrelay.yml",target:"_blank",rel:"noopener noreferrer"}},[e._v("opt-add-sphinxrelay"),t("OutboundLink")],1),e._v(" for "),t("a",{attrs:{href:"https://github.com/stakwork/sphinx-relay",target:"_blank",rel:"noopener noreferrer"}},[e._v("Sphinx Relay"),t("OutboundLink")],1),e._v(". Maintained by "),t("a",{attrs:{href:"https://github.com/dennisreimann",target:"_blank",rel:"noopener noreferrer"}},[e._v("dennisreimann"),t("OutboundLink")],1),e._v(".")]),e._v(" "),t("li",[t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver-docker/blob/master/docker-compose-generator/docker-fragments/opt-add-tallycoin-connect.yml",target:"_blank",rel:"noopener noreferrer"}},[e._v("opt-add-tallycoin-connect"),t("OutboundLink")],1),e._v(" for "),t("a",{attrs:{href:"https://github.com/djbooth007/tallycoin_connect",target:"_blank",rel:"noopener noreferrer"}},[e._v("Tallycoin Connect"),t("OutboundLink")],1),e._v(". Maintained by "),t("a",{attrs:{href:"https://github.com/dennisreimann",target:"_blank",rel:"noopener noreferrer"}},[e._v("dennisreimann"),t("OutboundLink")],1),e._v(".")]),e._v(" "),t("li",[t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver-docker/blob/master/docker-compose-generator/docker-fragments/opt-add-thunderhub.yml",target:"_blank",rel:"noopener noreferrer"}},[e._v("opt-add-thunderhub"),t("OutboundLink")],1),e._v(" for a LND Lightning Node Manager in your Browser. Maintained by "),t("a",{attrs:{href:"https://github.com/apotdevin",target:"_blank",rel:"noopener noreferrer"}},[e._v("apotdevin"),t("OutboundLink")],1),e._v(".")]),e._v(" "),t("li",[t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver-docker/blob/master/docker-compose-generator/docker-fragments/opt-add-teos.yml",target:"_blank",rel:"noopener noreferrer"}},[e._v("opt-add-teos"),t("OutboundLink")],1),e._v(" for "),t("a",{attrs:{href:"https://github.com/talaia-labs/python-teos",target:"_blank",rel:"noopener noreferrer"}},[e._v("The Eye Of Satoshi"),t("OutboundLink")],1),e._v(", a BOLT13 Lightning Watchtower. Use port 9814 on your server or Tor to connect.")]),e._v(" "),t("li",[t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver-docker/blob/master/docker-compose-generator/docker-fragments/opt-add-chatwoot.yml",target:"_blank",rel:"noopener noreferrer"}},[e._v("opt-add-chatwoot"),t("OutboundLink")],1),e._v(" for open source chat support system. ("),t("RouterLink",{attrs:{to:"/Docker/chatwoot/"}},[e._v("See the documentation")]),e._v(")")],1),e._v(" "),t("li",[t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver-docker/blob/master/docker-compose-generator/docker-fragments/opt-add-zammad.yml",target:"_blank",rel:"noopener noreferrer"}},[e._v("opt-add-zammad"),t("OutboundLink")],1),e._v(" for "),t("a",{attrs:{href:"https://zammad.com/features",target:"_blank",rel:"noopener noreferrer"}},[e._v("Zammad"),t("OutboundLink")],1),e._v(", a web based open source helpdesk/customer support system with many features to manage customer communication via several channels like telephone, facebook, twitter, chat and e-mails")]),e._v(" "),t("li",[t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver-docker/blob/master/docker-compose-generator/docker-fragments/opt-monero-expose.yml",target:"_blank",rel:"noopener noreferrer"}},[e._v("opt-monero-expose"),t("OutboundLink")],1),e._v(" to expose monero node's RPC port at 127.0.0.1:18081 to connect your own wallet. Use f.e. ssh port forwarding to forward to your own computer.")]),e._v(" "),t("li",[t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver-docker/blob/master/docker-compose-generator/docker-fragments/opt-add-fireflyiii.yml",target:"_blank",rel:"noopener noreferrer"}},[e._v("opt-add-fireflyiii"),t("OutboundLink")],1),e._v(" ("),t("RouterLink",{attrs:{to:"/Docker/fireflyiii/"}},[e._v("See the documentation")]),e._v(")")],1),e._v(" "),t("li",[t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver-docker/blob/master/docker-compose-generator/docker-fragments/opt-add-joinmarket.yml",target:"_blank",rel:"noopener noreferrer"}},[e._v("opt-add-joinmarket"),t("OutboundLink")],1),e._v(" ("),t("RouterLink",{attrs:{to:"/Docker/joinmarket/"}},[e._v("See the documentation")]),e._v(")")],1),e._v(" "),t("li",[t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver-docker/blob/master/docker-compose-generator/docker-fragments/opt-add-helipad.yml",target:"_blank",rel:"noopener noreferrer"}},[e._v("opt-add-helipad"),t("OutboundLink")],1),e._v(" for "),t("a",{attrs:{href:"https://github.com/Podcastindex-org/helipad",target:"_blank",rel:"noopener noreferrer"}},[e._v("Podcastindex.org Helipad"),t("OutboundLink")],1),e._v(". Requires LND.")]),e._v(" "),t("li",[t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver-docker/blob/master/docker-compose-generator/docker-fragments/opt-add-nostr-relay.yml",target:"_blank",rel:"noopener noreferrer"}},[e._v("opt-add-nostr-relay"),t("OutboundLink")],1),e._v(" for "),t("a",{attrs:{href:"https://github.com/kukks/Nnostr",target:"_blank",rel:"noopener noreferrer"}},[e._v("Nostr Relay"),t("OutboundLink")],1),e._v(".")]),e._v(" "),t("li",[t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver-docker/blob/master/docker-compose-generator/docker-fragments/opt-add-cloudflared.yml",target:"_blank",rel:"noopener noreferrer"}},[e._v("opt-add-cloudflared"),t("OutboundLink")],1),e._v(" to expose your local server on clearnet painlessly ("),t("RouterLink",{attrs:{to:"/Docker/cloudflare-tunnel/"}},[e._v("see documentation")]),e._v(").")],1),e._v(" "),t("li",[t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver-docker/blob/master/docker-compose-generator/docker-fragments/opt-add-torq.yml",target:"_blank",rel:"noopener noreferrer"}},[e._v("opt-add-torq"),t("OutboundLink")],1),e._v(" to install "),t("a",{attrs:{href:"https://github.com/lncapital/torq",target:"_blank",rel:"noopener noreferrer"}},[e._v("Torq"),t("OutboundLink")],1),e._v(" node management application. Requires LND.")])]),e._v(" "),t("p",[e._v("You can also create your own "),t("a",{attrs:{href:"#how-can-i-customize-the-generated-docker-compose-file"}},[e._v("custom fragments")]),e._v(".")]),e._v(" "),t("p",[e._v("If you want to add an option to "),t("code",[e._v("BTCPAYGEN_ADDITIONAL_FRAGMENTS")]),e._v(" and re-configure your install:")]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("export")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[e._v("BTCPAYGEN_ADDITIONAL_FRAGMENTS")]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"'),t("span",{pre:!0,attrs:{class:"token variable"}},[e._v("$BTCPAYGEN_ADDITIONAL_FRAGMENTS")]),e._v(';opt-lnd-autopilot"')]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v(".")]),e._v(" btcpay-setup.sh "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-i")]),e._v("\n")])])]),t("p",[e._v("For example, if you want "),t("code",[e._v("btc")]),e._v(" and "),t("code",[e._v("ltc")]),e._v(" support with "),t("code",[e._v("nginx")]),e._v(" and "),t("code",[e._v("clightning")]),e._v(" inside "),t("code",[e._v("Generated/docker-compose.custom.yml")]),e._v(":")]),e._v(" "),t("p",[e._v("Note: The first run might take a while, but following runs are instantaneous.")]),e._v(" "),t("p",[e._v("On Windows (run in "),t("a",{attrs:{href:"https://docs.microsoft.com/en-us/powershell/scripting/windows-powershell/starting-windows-powershell",target:"_blank",rel:"noopener noreferrer"}},[e._v("powershell"),t("OutboundLink")],1),e._v("):")]),e._v(" "),t("div",{staticClass:"language-powershell extra-class"},[t("pre",{pre:!0,attrs:{class:"language-powershell"}},[t("code",[t("span",{pre:!0,attrs:{class:"token function"}},[e._v("Invoke-Command")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("{")]),e._v("\n "),t("span",{pre:!0,attrs:{class:"token variable"}},[e._v("$BTCPAYGEN_CRYPTO1")]),e._v("="),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"btc"')]),e._v("\n "),t("span",{pre:!0,attrs:{class:"token variable"}},[e._v("$BTCPAYGEN_CRYPTO2")]),e._v("="),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"ltc"')]),e._v("\n "),t("span",{pre:!0,attrs:{class:"token variable"}},[e._v("$BTCPAYGEN_REVERSEPROXY")]),e._v("="),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"nginx"')]),e._v("\n "),t("span",{pre:!0,attrs:{class:"token variable"}},[e._v("$BTCPAYGEN_LIGHTNING")]),e._v("="),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"clightning"')]),e._v("\n "),t("span",{pre:!0,attrs:{class:"token variable"}},[e._v("$BTCPAYGEN_SUBNAME")]),e._v("="),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"custom"')]),e._v("\n "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(".")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(".")]),e._v("\\build"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(".")]),e._v("ps1\n"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("}")]),e._v("\n")])])]),t("p",[e._v("On Linux:")]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[e._v("BTCPAYGEN_CRYPTO1")]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"btc"')]),e._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("\\")]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[e._v("BTCPAYGEN_CRYPTO2")]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"ltc"')]),e._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("\\")]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[e._v("BTCPAYGEN_REVERSEPROXY")]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"nginx"')]),e._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("\\")]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[e._v("BTCPAYGEN_LIGHTNING")]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"clightning"')]),e._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("\\")]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[e._v("BTCPAYGEN_SUBNAME")]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"custom"')]),e._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("\\")]),e._v("\n./build.sh\n")])])]),t("p",[e._v("Next, you will need to configure the runtime environment variables for "),t("code",[e._v("Generated/docker-compose.custom.yml")]),e._v(":")]),e._v(" "),t("ul",[t("li",[e._v("If you are using NGinx, "),t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver-docker/blob/master/Production/README.md",target:"_blank",rel:"noopener noreferrer"}},[e._v("read this"),t("OutboundLink")],1),e._v(".")]),e._v(" "),t("li",[e._v("If you are not using NGinx, "),t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver-docker/blob/master/Production-NoReverseProxy/README.md",target:"_blank",rel:"noopener noreferrer"}},[e._v("read this instead"),t("OutboundLink")],1),e._v(".")])]),e._v(" "),t("h2",{attrs:{id:"again-what-does-btcpay-setupsh-do"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#again-what-does-btcpay-setupsh-do"}},[e._v("#")]),e._v(" Again, what does "),t("code",[e._v("btcpay-setup.sh")]),e._v(" do?")]),e._v(" "),t("p",[t("code",[e._v("btcpay-setup.sh")]),e._v(" is a utility which does the following:")]),e._v(" "),t("ol",[t("li",[e._v("Makes sure docker and docker-compose are installed on your system")]),e._v(" "),t("li",[e._v("Generates a docker-compose via "),t("code",[e._v("./build.sh")])]),e._v(" "),t("li",[e._v("Sets up an "),t("a",{attrs:{href:"https://docs.docker.com/compose/env-file/",target:"_blank",rel:"noopener noreferrer"}},[e._v("Environment File"),t("OutboundLink")],1),e._v(" to configure your docker-compose")]),e._v(" "),t("li",[e._v("Sets up environment variables so the tools described in "),t("a",{attrs:{href:"#tooling"}},[e._v("Tooling")]),e._v(" can work")]),e._v(" "),t("li",[e._v("Adds symlinks of those tools into "),t("code",[e._v("/usr/bin")])]),e._v(" "),t("li",[e._v("Makes sure BTCPay restarts on reboot via upstart or systemd")]),e._v(" "),t("li",[e._v("Starts BTCPay via docker-compose")])]),e._v(" "),t("h2",{attrs:{id:"overview-of-files-generated-by-btcpay-setupsh"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#overview-of-files-generated-by-btcpay-setupsh"}},[e._v("#")]),e._v(" Overview of files generated by "),t("code",[e._v("btcpay-setup.sh")])]),e._v(" "),t("p",[t("code",[e._v("/etc/profile.d/btcpay-env.sh")]),e._v(" ensures that your environment variables are correctly setup when you login, so you can use the tools:")]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("export")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[e._v("BTCPAYGEN_OLD_PREGEN")]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"false"')]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("export")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[e._v("BTCPAYGEN_CRYPTO1")]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"btc"')]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("export")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[e._v("BTCPAYGEN_CRYPTO2")]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('""')]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("export")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[e._v("BTCPAYGEN_CRYPTO3")]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('""')]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("export")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[e._v("BTCPAYGEN_CRYPTO4")]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('""')]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("export")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[e._v("BTCPAYGEN_CRYPTO5")]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('""')]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("export")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[e._v("BTCPAYGEN_CRYPTO6")]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('""')]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("export")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[e._v("BTCPAYGEN_CRYPTO7")]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('""')]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("export")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[e._v("BTCPAYGEN_CRYPTO8")]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('""')]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("export")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[e._v("BTCPAYGEN_CRYPTO9")]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('""')]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("export")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[e._v("BTCPAYGEN_LIGHTNING")]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"clightning"')]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("export")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[e._v("BTCPAYGEN_REVERSEPROXY")]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"nginx"')]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("export")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[e._v("BTCPAYGEN_ADDITIONAL_FRAGMENTS")]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('""')]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("export")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[e._v("BTCPAY_DOCKER_COMPOSE")]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"/var/lib/waagent/custom-script/download/0/btcpayserver-docker/Production/docker-compose.generated.yml"')]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("export")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[e._v("BTCPAY_BASE_DIRECTORY")]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"/var/lib/waagent/custom-script/download/0"')]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("export")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[e._v("BTCPAY_ENV_FILE")]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"/var/lib/waagent/custom-script/download/0/.env"')]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("export")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[e._v("BTCPAY_HOST_SSHKEYFILE")]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"/root/.ssh/id_rsa_btcpay"')]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token keyword"}},[e._v("if")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("cat")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token variable"}},[e._v("$BTCPAY_ENV_FILE")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("&>")]),e._v(" /dev/null"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(";")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token keyword"}},[e._v("then")]),e._v("\n "),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("export")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token variable"}},[t("span",{pre:!0,attrs:{class:"token variable"}},[e._v("$(")]),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("grep")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-v")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[e._v("'^#'")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"'),t("span",{pre:!0,attrs:{class:"token variable"}},[e._v("$BTCPAY_ENV_FILE")]),e._v('"')]),e._v(" "),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("|")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("xargs")]),t("span",{pre:!0,attrs:{class:"token variable"}},[e._v(")")])]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token keyword"}},[e._v("fi")]),e._v("\n")])])]),t("p",[t("code",[e._v("/etc/systemd/system/btcpayserver.service")]),e._v(" ensures that you can control btcpay via "),t("code",[e._v("systemctl")]),e._v(", and that BTCPayServer starts on reboot:")]),e._v(" "),t("div",{staticClass:"language-ini extra-class"},[t("pre",{pre:!0,attrs:{class:"language-ini"}},[t("code",[t("span",{pre:!0,attrs:{class:"token section"}},[t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("[")]),t("span",{pre:!0,attrs:{class:"token section-name selector"}},[e._v("Unit")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("]")])]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token key attr-name"}},[e._v("Description")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("=")]),t("span",{pre:!0,attrs:{class:"token value attr-value"}},[e._v("BTCPayServer service")]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token key attr-name"}},[e._v("After")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("=")]),t("span",{pre:!0,attrs:{class:"token value attr-value"}},[e._v("docker.service network-online.target")]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token key attr-name"}},[e._v("Requires")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("=")]),t("span",{pre:!0,attrs:{class:"token value attr-value"}},[e._v("docker.service network-online.target")]),e._v("\n\n"),t("span",{pre:!0,attrs:{class:"token section"}},[t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("[")]),t("span",{pre:!0,attrs:{class:"token section-name selector"}},[e._v("Service")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("]")])]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token key attr-name"}},[e._v("Type")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("=")]),t("span",{pre:!0,attrs:{class:"token value attr-value"}},[e._v("oneshot")]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token key attr-name"}},[e._v("RemainAfterExit")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("=")]),t("span",{pre:!0,attrs:{class:"token value attr-value"}},[e._v("yes")]),e._v("\n\n"),t("span",{pre:!0,attrs:{class:"token key attr-name"}},[e._v("ExecStart")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("=")]),t("span",{pre:!0,attrs:{class:"token value attr-value"}},[e._v("/bin/bash -c '. /etc/profile.d/btcpay-env.sh && cd \"$BTCPAY_BASE_DIRECTORY/btcpayserver-docker\" && . helpers.sh && btcpay_up'")]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token key attr-name"}},[e._v("ExecStop")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("=")]),t("span",{pre:!0,attrs:{class:"token value attr-value"}},[e._v("/bin/bash -c '. /etc/profile.d/btcpay-env.sh && cd \"$BTCPAY_BASE_DIRECTORY/btcpayserver-docker\" && . helpers.sh && btcpay_down'")]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token key attr-name"}},[e._v("ExecReload")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("=")]),t("span",{pre:!0,attrs:{class:"token value attr-value"}},[e._v("/bin/bash -c '. /etc/profile.d/btcpay-env.sh && cd \"$BTCPAY_BASE_DIRECTORY/btcpayserver-docker\" && . helpers.sh && btcpay_restart'")]),e._v("\n\n"),t("span",{pre:!0,attrs:{class:"token section"}},[t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("[")]),t("span",{pre:!0,attrs:{class:"token section-name selector"}},[e._v("Install")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("]")])]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token key attr-name"}},[e._v("WantedBy")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("=")]),t("span",{pre:!0,attrs:{class:"token value attr-value"}},[e._v("multi-user.target")]),e._v("\n")])])]),t("p",[t("code",[e._v(".env")]),e._v(" ("),t("code",[e._v("$BTCPAY_ENV_FILE")]),e._v(") contains environment variables passed to the containers managed by your docker-compose:")]),e._v(" "),t("div",{staticClass:"language-ini extra-class"},[t("pre",{pre:!0,attrs:{class:"language-ini"}},[t("code",[t("span",{pre:!0,attrs:{class:"token key attr-name"}},[e._v("BTCPAY_HOST")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("=")]),t("span",{pre:!0,attrs:{class:"token value attr-value"}},[e._v("btcpay.EXAMPLE.com")]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token key attr-name"}},[e._v("ACME_CA_URI")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("=")]),t("span",{pre:!0,attrs:{class:"token value attr-value"}},[e._v("production")]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token key attr-name"}},[e._v("NBITCOIN_NETWORK")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("=")]),t("span",{pre:!0,attrs:{class:"token value attr-value"}},[e._v("mainnet")]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token key attr-name"}},[e._v("LETSENCRYPT_EMAIL")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("=")]),t("span",{pre:!0,attrs:{class:"token value attr-value"}},[e._v("me@EXAMPLE.com")]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token key attr-name"}},[e._v("BTCPAY_SSHTRUSTEDFINGERPRINTS")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("=")]),t("span",{pre:!0,attrs:{class:"token value attr-value"}},[e._v("SHA256:eSCD7NtQ/Q6IBl2iRB9caAQ3lDZd8s8iUL6SdeNnhpA")]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token key attr-name"}},[e._v("BTCPAY_SSHKEYFILE")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("=")]),t("span",{pre:!0,attrs:{class:"token value attr-value"}},[e._v("/datadir/id_rsa")]),e._v("\n")])])]),t("h1",{attrs:{id:"how-can-i-add-an-altcoin-to-btcpayserver"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#how-can-i-add-an-altcoin-to-btcpayserver"}},[e._v("#")]),e._v(" How can I add an altcoin to BTCPayServer?")]),e._v(" "),t("ol",[t("li",[e._v("Add support for your crypto to "),t("a",{attrs:{href:"https://github.com/MetacoSA/NBitcoin/tree/master/NBitcoin.Altcoins",target:"_blank",rel:"noopener noreferrer"}},[e._v("NBitcoin"),t("OutboundLink")],1),e._v(", "),t("a",{attrs:{href:"https://github.com/dgarage/NBXplorer",target:"_blank",rel:"noopener noreferrer"}},[e._v("NBxplorer"),t("OutboundLink")],1),e._v(", and "),t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver",target:"_blank",rel:"noopener noreferrer"}},[e._v("BTCPayServer"),t("OutboundLink")],1),e._v(". (Use examples from other coins)")]),e._v(" "),t("li",[e._v("Create your own docker image ("),t("a",{attrs:{href:"https://hub.docker.com/r/nicolasdorier/docker-bitcoin/",target:"_blank",rel:"noopener noreferrer"}},[e._v("Example for BTC"),t("OutboundLink")],1),e._v(")")]),e._v(" "),t("li",[e._v("Create a docker-compose fragment ("),t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver-docker/blob/master/docker-compose-generator/docker-fragments/bitcoin.yml",target:"_blank",rel:"noopener noreferrer"}},[e._v("Example for BTC"),t("OutboundLink")],1),e._v(")")]),e._v(" "),t("li",[e._v("Add your "),t("code",[e._v("CryptoDefinition")]),e._v(" ("),t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver-docker/blob/master/docker-compose-generator/src/CryptoDefinition.cs",target:"_blank",rel:"noopener noreferrer"}},[e._v("Example for BTC"),t("OutboundLink")],1),e._v(")")])]),e._v(" "),t("p",[t("code",[e._v("build.sh")]),e._v(" is using a pre-built image of the "),t("code",[e._v("docker-compose generator")]),e._v(" on "),t("a",{attrs:{href:"https://hub.docker.com/r/btcpayserver/docker-compose-generator/",target:"_blank",rel:"noopener noreferrer"}},[e._v("docker hub"),t("OutboundLink")],1),e._v(".\nIf you modify the code source of "),t("code",[e._v("docker-compose generator")]),e._v(" (for example, the "),t("code",[e._v("CryptoDefinition")]),e._v(" "),t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver-docker/blob/master/docker-compose-generator/src/CryptoDefinition.cs",target:"_blank",rel:"noopener noreferrer"}},[e._v("Example for BTC"),t("OutboundLink")],1),e._v("), you need to configure "),t("code",[e._v("build.sh")]),e._v(" to use your own image by setting the environment variable "),t("code",[e._v("BTCPAYGEN_DOCKER_IMAGE")]),e._v(" to "),t("code",[e._v("btcpayserver/docker-compose-generator:local")]),e._v(".")]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("cd")]),e._v(" docker-compose-generator\n"),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[e._v("BTCPAYGEN_DOCKER_IMAGE")]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"btcpayserver/docker-compose-generator:local"')]),e._v("\n")])])]),t("p",[e._v("Or on powershell:")]),e._v(" "),t("div",{staticClass:"language-powershell extra-class"},[t("pre",{pre:!0,attrs:{class:"language-powershell"}},[t("code",[e._v("cd docker-compose-generator\n"),t("span",{pre:!0,attrs:{class:"token variable"}},[e._v("$BTCPAYGEN_DOCKER_IMAGE")]),e._v("="),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"btcpayserver/docker-compose-generator:local"')]),e._v("\n")])])]),t("p",[e._v("Then run "),t("code",[e._v("./build.sh")]),e._v(" or "),t("code",[e._v(". .\\build.ps1")]),e._v(".\nThis will generate your docker-compose in the "),t("code",[e._v("Generated")]),e._v(" folder, which you can then run and test.")]),e._v(" "),t("p",[e._v("Note that BTCPayServer developers will not spend excessive time testing your image, so make sure it works.")]),e._v(" "),t("h1",{attrs:{id:"support"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#support"}},[e._v("#")]),e._v(" Support")]),e._v(" "),t("table",[t("thead",[t("tr",[t("th",[e._v("Image")]),e._v(" "),t("th",[e._v("Version")]),e._v(" "),t("th",{staticStyle:{"text-align":"center"}},[e._v("x64")]),e._v(" "),t("th",{staticStyle:{"text-align":"center"}},[e._v("arm32v7")]),e._v(" "),t("th",{staticStyle:{"text-align":"center"}},[e._v("arm64v8")]),e._v(" "),t("th",{staticStyle:{"text-align":"center"}},[e._v("links")])])]),e._v(" "),t("tbody",[t("tr",[t("td",[e._v("btcpayserver/docker-compose-generator")]),e._v(" "),t("td",[e._v("latest")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/btcpayserver/btcpayserver-docker/dcg-latest/docker-compose-generator/linuxamd64.Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[e._v("✔️"),t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/btcpayserver/btcpayserver-docker/dcg-latest/docker-compose-generator/linuxarm32v7.Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[e._v("✔️"),t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/btcpayserver/btcpayserver-docker/dcg-latest/docker-compose-generator/linuxarm64v8.Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[e._v("✔️"),t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver-docker",target:"_blank",rel:"noopener noreferrer"}},[e._v("Github"),t("OutboundLink")],1),e._v(" - "),t("a",{attrs:{href:"https://hub.docker.com/r/btcpayserver/docker-compose-generator",target:"_blank",rel:"noopener noreferrer"}},[e._v("DockerHub"),t("OutboundLink")],1)])]),e._v(" "),t("tr",[t("td",[e._v("btcpayserver/docker-compose")]),e._v(" "),t("td",[e._v("1.28.6")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/btcpayserver/dockerfile-deps/docker-compose/1.28.6/docker-compose/1.28.6/linuxamd64.Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[e._v("✔️"),t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/btcpayserver/dockerfile-deps/docker-compose/1.28.6/docker-compose/1.28.6/linuxarm32v7.Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[e._v("✔️"),t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/btcpayserver/dockerfile-deps/docker-compose/1.28.6/docker-compose/1.28.6/linuxarm64v8.Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[e._v("✔️"),t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://github.com/btcpayserver/dockerfile-deps",target:"_blank",rel:"noopener noreferrer"}},[e._v("Github"),t("OutboundLink")],1),e._v(" - "),t("a",{attrs:{href:"https://hub.docker.com/r/btcpayserver/docker-compose",target:"_blank",rel:"noopener noreferrer"}},[e._v("DockerHub"),t("OutboundLink")],1)])]),e._v(" "),t("tr",[t("td",[e._v("btcpayserver/lightning")]),e._v(" "),t("td",[e._v("v23.08")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/btcpayserver/lightning/basedon-v23.08/Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[e._v("✔️"),t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/btcpayserver/lightning/basedon-v23.08/contrib/docker/linuxarm32v7.Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[e._v("✔️"),t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/btcpayserver/lightning/basedon-v23.08/contrib/docker/linuxarm64v8.Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[e._v("✔️"),t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://github.com/btcpayserver/lightning",target:"_blank",rel:"noopener noreferrer"}},[e._v("Github"),t("OutboundLink")],1),e._v(" - "),t("a",{attrs:{href:"https://hub.docker.com/r/btcpayserver/lightning",target:"_blank",rel:"noopener noreferrer"}},[e._v("DockerHub"),t("OutboundLink")],1)])]),e._v(" "),t("tr",[t("td",[e._v("saubyk/c-lightning-rest")]),e._v(" "),t("td",[e._v("0.10.6")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/Ride-The-Lightning/c-lightning-REST/v0.10.6/amd64.Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[e._v("✔️"),t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/Ride-The-Lightning/c-lightning-REST/v0.10.6/arm32v7.Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[e._v("✔️"),t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/Ride-The-Lightning/c-lightning-REST/v0.10.6/arm64v8.Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[e._v("✔️"),t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://github.com/Ride-The-Lightning/c-lightning-REST",target:"_blank",rel:"noopener noreferrer"}},[e._v("Github"),t("OutboundLink")],1),e._v(" - "),t("a",{attrs:{href:"https://hub.docker.com/r/saubyk/c-lightning-rest",target:"_blank",rel:"noopener noreferrer"}},[e._v("DockerHub"),t("OutboundLink")],1)])]),e._v(" "),t("tr",[t("td",[e._v("shahanafarooqui/rtl")]),e._v(" "),t("td",[e._v("0.14.1")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/Ride-The-Lightning/RTL/v0.14.1/dockerfiles/Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[e._v("✔️"),t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/Ride-The-Lightning/RTL/v0.14.1/dockerfiles/Dockerfile.arm32v7",target:"_blank",rel:"noopener noreferrer"}},[e._v("✔️"),t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/Ride-The-Lightning/RTL/v0.14.1/dockerfiles/Dockerfile.arm64v8",target:"_blank",rel:"noopener noreferrer"}},[e._v("✔️"),t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://github.com/Ride-The-Lightning/RTL",target:"_blank",rel:"noopener noreferrer"}},[e._v("Github"),t("OutboundLink")],1),e._v(" - "),t("a",{attrs:{href:"https://hub.docker.com/r/shahanafarooqui/rtl",target:"_blank",rel:"noopener noreferrer"}},[e._v("DockerHub"),t("OutboundLink")],1)])]),e._v(" "),t("tr",[t("td",[e._v("btcpayserver/lnd")]),e._v(" "),t("td",[e._v("v0.17.2-beta")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/btcpayserver/lnd/basedon-v0.17.2-beta/linuxamd64.Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[e._v("✔️"),t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/btcpayserver/lnd/basedon-v0.17.2-beta/linuxarm32v7.Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[e._v("✔️"),t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/btcpayserver/lnd/basedon-v0.17.2-beta/linuxarm64v8.Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[e._v("✔️"),t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://github.com/btcpayserver/lnd",target:"_blank",rel:"noopener noreferrer"}},[e._v("Github"),t("OutboundLink")],1),e._v(" - "),t("a",{attrs:{href:"https://hub.docker.com/r/btcpayserver/lnd",target:"_blank",rel:"noopener noreferrer"}},[e._v("DockerHub"),t("OutboundLink")],1)])]),e._v(" "),t("tr",[t("td",[e._v("btcpayserver/bitcoin")]),e._v(" "),t("td",[e._v("25.0")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/btcpayserver/dockerfile-deps/Bitcoin/25.0/Bitcoin/25.0/linuxamd64.Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[e._v("✔️"),t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/btcpayserver/dockerfile-deps/Bitcoin/25.0/Bitcoin/25.0/linuxarm32v7.Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[e._v("✔️"),t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/btcpayserver/dockerfile-deps/Bitcoin/25.0/Bitcoin/25.0/linuxarm64v8.Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[e._v("✔️"),t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://github.com/btcpayserver/dockerfile-deps",target:"_blank",rel:"noopener noreferrer"}},[e._v("Github"),t("OutboundLink")],1),e._v(" - "),t("a",{attrs:{href:"https://hub.docker.com/r/btcpayserver/bitcoin",target:"_blank",rel:"noopener noreferrer"}},[e._v("DockerHub"),t("OutboundLink")],1)])]),e._v(" "),t("tr",[t("td",[e._v("btcpayserver/btcpayserver")]),e._v(" "),t("td",[e._v("1.11.7$?")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/btcpayserver/btcpayserver/v1.11.7/amd64.Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[e._v("✔️"),t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/btcpayserver/btcpayserver/v1.11.7/arm32v7.Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[e._v("✔️"),t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/btcpayserver/btcpayserver/v1.11.7/arm64v8.Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[e._v("✔️"),t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver",target:"_blank",rel:"noopener noreferrer"}},[e._v("Github"),t("OutboundLink")],1),e._v(" - "),t("a",{attrs:{href:"https://hub.docker.com/r/btcpayserver/btcpayserver",target:"_blank",rel:"noopener noreferrer"}},[e._v("DockerHub"),t("OutboundLink")],1)])]),e._v(" "),t("tr",[t("td",[e._v("btcpayserver/monero")]),e._v(" "),t("td",[e._v("0.18.3.1")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/btcpayserver/dockerfile-deps/Monero/0.18.3.1/Monero/0.18.3.1/linuxamd64.Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[e._v("✔️"),t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/btcpayserver/dockerfile-deps/Monero/0.18.3.1/Monero/0.18.3.1/linuxarm32v7.Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[e._v("✔️"),t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/btcpayserver/dockerfile-deps/Monero/0.18.3.1/Monero/0.18.3.1/linuxarm64v8.Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[e._v("✔️"),t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://github.com/btcpayserver/dockerfile-deps",target:"_blank",rel:"noopener noreferrer"}},[e._v("Github"),t("OutboundLink")],1),e._v(" - "),t("a",{attrs:{href:"https://hub.docker.com/r/btcpayserver/monero",target:"_blank",rel:"noopener noreferrer"}},[e._v("DockerHub"),t("OutboundLink")],1)])]),e._v(" "),t("tr",[t("td",[e._v("nicolasdorier/nbxplorer")]),e._v(" "),t("td",[e._v("2.4.0")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/dgarage/nbxplorer/v2.4.0/Dockerfile.linuxamd64",target:"_blank",rel:"noopener noreferrer"}},[e._v("✔️"),t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/dgarage/nbxplorer/v2.4.0/Dockerfile.linuxarm32v7",target:"_blank",rel:"noopener noreferrer"}},[e._v("✔️"),t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/dgarage/nbxplorer/v2.4.0/Dockerfile.linuxarm64v8",target:"_blank",rel:"noopener noreferrer"}},[e._v("✔️"),t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://github.com/dgarage/nbxplorer",target:"_blank",rel:"noopener noreferrer"}},[e._v("Github"),t("OutboundLink")],1),e._v(" - "),t("a",{attrs:{href:"https://hub.docker.com/r/nicolasdorier/nbxplorer",target:"_blank",rel:"noopener noreferrer"}},[e._v("DockerHub"),t("OutboundLink")],1)])]),e._v(" "),t("tr",[t("td",[e._v("btcpayserver/letsencrypt-nginx-proxy-companion")]),e._v(" "),t("td",[e._v("1.12.2")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/btcpayserver/docker-letsencrypt-nginx-proxy-companion/v1.12.2/linuxamd64.Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[e._v("✔️"),t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/btcpayserver/docker-letsencrypt-nginx-proxy-companion/v1.12.2/linuxarm32v7.Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[e._v("✔️"),t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/btcpayserver/docker-letsencrypt-nginx-proxy-companion/v1.12.2/linuxarm64v8.Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[e._v("✔️"),t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://github.com/btcpayserver/docker-letsencrypt-nginx-proxy-companion",target:"_blank",rel:"noopener noreferrer"}},[e._v("Github"),t("OutboundLink")],1),e._v(" - "),t("a",{attrs:{href:"https://hub.docker.com/r/btcpayserver/letsencrypt-nginx-proxy-companion",target:"_blank",rel:"noopener noreferrer"}},[e._v("DockerHub"),t("OutboundLink")],1)])]),e._v(" "),t("tr",[t("td",[e._v("nginx")]),e._v(" "),t("td",[e._v("1.23.3")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/nginxinc/docker-nginx/1.23.2/stable/debian/Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[e._v("✔️"),t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/nginxinc/docker-nginx/1.23.2/stable/debian/Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[e._v("✔️"),t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/nginxinc/docker-nginx/1.23.2/stable/debian/Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[e._v("✔️"),t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://github.com/nginxinc/docker-nginx",target:"_blank",rel:"noopener noreferrer"}},[e._v("Github"),t("OutboundLink")],1),e._v(" - "),t("a",{attrs:{href:"https://hub.docker.com/_/nginx",target:"_blank",rel:"noopener noreferrer"}},[e._v("DockerHub"),t("OutboundLink")],1)])]),e._v(" "),t("tr",[t("td",[e._v("btcpayserver/docker-gen")]),e._v(" "),t("td",[e._v("0.7.8")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/btcpayserver/docker-gen/v0.7.8/linuxamd64.Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[e._v("✔️"),t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/btcpayserver/docker-gen/v0.7.8/linuxarm32v7.Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[e._v("✔️"),t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/btcpayserver/docker-gen/v0.7.8/linuxarm64v8.Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[e._v("✔️"),t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://github.com/btcpayserver/docker-gen",target:"_blank",rel:"noopener noreferrer"}},[e._v("Github"),t("OutboundLink")],1),e._v(" - "),t("a",{attrs:{href:"https://hub.docker.com/r/btcpayserver/docker-gen",target:"_blank",rel:"noopener noreferrer"}},[e._v("DockerHub"),t("OutboundLink")],1)])]),e._v(" "),t("tr",[t("td",[e._v("btcpayserver/btctransmuter")]),e._v(" "),t("td",[e._v("0.0.59")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/btcpayserver/btctransmuter/v0.0.59/Dockerfiles/amd64.Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[e._v("✔️"),t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/btcpayserver/btctransmuter/v0.0.59/Dockerfiles/arm32v7.Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[e._v("✔️"),t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/btcpayserver/btctransmuter/v0.0.59/Dockerfiles/arm64v8.Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[e._v("✔️"),t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://github.com/btcpayserver/btctransmuter",target:"_blank",rel:"noopener noreferrer"}},[e._v("Github"),t("OutboundLink")],1),e._v(" - "),t("a",{attrs:{href:"https://hub.docker.com/r/btcpayserver/btctransmuter",target:"_blank",rel:"noopener noreferrer"}},[e._v("DockerHub"),t("OutboundLink")],1)])]),e._v(" "),t("tr",[t("td",[e._v("btcpayserver/cloudflared")]),e._v(" "),t("td",[e._v("2023.7.3")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/btcpayserver/dockerfile-deps/Cloudflared/2023.7.3/Cloudflared/2023.7.3/linuxamd64.Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[e._v("✔️"),t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/btcpayserver/dockerfile-deps/Cloudflared/2023.7.3/Cloudflared/2023.7.3/linuxarm32v7.Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[e._v("✔️"),t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/btcpayserver/dockerfile-deps/Cloudflared/2023.7.3/Cloudflared/2023.7.3/linuxarm64v8.Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[e._v("✔️"),t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://github.com/btcpayserver/dockerfile-deps",target:"_blank",rel:"noopener noreferrer"}},[e._v("Github"),t("OutboundLink")],1),e._v(" - "),t("a",{attrs:{href:"https://hub.docker.com/r/btcpayserver/cloudflared",target:"_blank",rel:"noopener noreferrer"}},[e._v("DockerHub"),t("OutboundLink")],1)])]),e._v(" "),t("tr",[t("td",[e._v("btcpayserver/btcpayserver-configurator")]),e._v(" "),t("td",[e._v("0.0.21")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/btcpayserver/btcpayserver-configurator/v0.0.21/Dockerfiles/amd64.Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[e._v("✔️"),t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/btcpayserver/btcpayserver-configurator/v0.0.21/Dockerfiles/arm32v7.Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[e._v("✔️"),t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/btcpayserver/btcpayserver-configurator/v0.0.21/Dockerfiles/arm64v8.Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[e._v("✔️"),t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver-configurator",target:"_blank",rel:"noopener noreferrer"}},[e._v("Github"),t("OutboundLink")],1),e._v(" - "),t("a",{attrs:{href:"https://hub.docker.com/r/btcpayserver/btcpayserver-configurator",target:"_blank",rel:"noopener noreferrer"}},[e._v("DockerHub"),t("OutboundLink")],1)])]),e._v(" "),t("tr",[t("td",[e._v("btcpayserver/eps")]),e._v(" "),t("td",[e._v("0.2.2")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/btcpayserver/dockerfile-deps/EPS/0.2.2/EPS/0.2.2/linuxamd64.Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[e._v("✔️"),t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/btcpayserver/dockerfile-deps/EPS/0.2.2/EPS/0.2.2/linuxarm32v7.Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[e._v("✔️"),t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/btcpayserver/dockerfile-deps/EPS/0.2.2/EPS/0.2.2/linuxarm64v8.Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[e._v("✔️"),t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://github.com/btcpayserver/dockerfile-deps",target:"_blank",rel:"noopener noreferrer"}},[e._v("Github"),t("OutboundLink")],1),e._v(" - "),t("a",{attrs:{href:"https://hub.docker.com/r/btcpayserver/eps",target:"_blank",rel:"noopener noreferrer"}},[e._v("DockerHub"),t("OutboundLink")],1)])]),e._v(" "),t("tr",[t("td",[e._v("btcpayserver/joinmarket")]),e._v(" "),t("td",[e._v("0.9.5")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/btcpayserver/dockerfile-deps/JoinMarket/0.9.5/JoinMarket/0.9.5/linuxamd64.Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[e._v("✔️"),t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/btcpayserver/dockerfile-deps/JoinMarket/0.9.5/JoinMarket/0.9.5/linuxarm32v7.Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[e._v("✔️"),t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/btcpayserver/dockerfile-deps/JoinMarket/0.9.5/JoinMarket/0.9.5/linuxarm64v8.Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[e._v("✔️"),t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://github.com/btcpayserver/dockerfile-deps",target:"_blank",rel:"noopener noreferrer"}},[e._v("Github"),t("OutboundLink")],1),e._v(" - "),t("a",{attrs:{href:"https://hub.docker.com/r/btcpayserver/joinmarket",target:"_blank",rel:"noopener noreferrer"}},[e._v("DockerHub"),t("OutboundLink")],1)])]),e._v(" "),t("tr",[t("td",[e._v("nicolasdorier/ndlc-cli")]),e._v(" "),t("td",[e._v("1.0.1")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/dgarage/ndlc/releases/1.0.1/amd64.Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[e._v("✔️"),t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/dgarage/ndlc/releases/1.0.1/arm32v7.Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[e._v("✔️"),t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/dgarage/ndlc/releases/1.0.1/arm64v8.Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[e._v("✔️"),t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://github.com/dgarage/ndlc",target:"_blank",rel:"noopener noreferrer"}},[e._v("Github"),t("OutboundLink")],1),e._v(" - "),t("a",{attrs:{href:"https://hub.docker.com/r/nicolasdorier/ndlc-cli",target:"_blank",rel:"noopener noreferrer"}},[e._v("DockerHub"),t("OutboundLink")],1)])]),e._v(" "),t("tr",[t("td",[e._v("pihole/pihole")]),e._v(" "),t("td",[e._v("2023.05.2")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/pi-hole/docker-pi-hole/2023.05.2/src/Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[e._v("✔️"),t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/pi-hole/docker-pi-hole/2023.05.2/src/Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[e._v("✔️"),t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/pi-hole/docker-pi-hole/2023.05.2/src/Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[e._v("✔️"),t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://github.com/pi-hole/docker-pi-hole",target:"_blank",rel:"noopener noreferrer"}},[e._v("Github"),t("OutboundLink")],1),e._v(" - "),t("a",{attrs:{href:"https://hub.docker.com/r/pihole/pihole",target:"_blank",rel:"noopener noreferrer"}},[e._v("DockerHub"),t("OutboundLink")],1)])]),e._v(" "),t("tr",[t("td",[e._v("btcpayserver/tor")]),e._v(" "),t("td",[e._v("0.4.7.10")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/btcpayserver/dockerfile-deps/Tor/0.4.7.10/Tor/0.4.7.10/linuxamd64.Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[e._v("✔️"),t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/btcpayserver/dockerfile-deps/Tor/0.4.7.10/Tor/0.4.7.10/linuxarm32v7.Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[e._v("✔️"),t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/btcpayserver/dockerfile-deps/Tor/0.4.7.10/Tor/0.4.7.10/linuxarm64v8.Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[e._v("✔️"),t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://github.com/btcpayserver/dockerfile-deps",target:"_blank",rel:"noopener noreferrer"}},[e._v("Github"),t("OutboundLink")],1),e._v(" - "),t("a",{attrs:{href:"https://hub.docker.com/r/btcpayserver/tor",target:"_blank",rel:"noopener noreferrer"}},[e._v("DockerHub"),t("OutboundLink")],1)])]),e._v(" "),t("tr",[t("td",[e._v("btcpayserver/woocommerce")]),e._v(" "),t("td",[e._v("3.1.0")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/btcpayserver/dockerfile-deps/WooCommerce/3.1.0/WooCommerce/3.1.0/linuxamd64.Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[e._v("✔️"),t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[e._v("️❌")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/btcpayserver/dockerfile-deps/WooCommerce/3.1.0/WooCommerce/3.1.0/linuxarm64v8.Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[e._v("✔️"),t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://github.com/btcpayserver/dockerfile-deps",target:"_blank",rel:"noopener noreferrer"}},[e._v("Github"),t("OutboundLink")],1),e._v(" - "),t("a",{attrs:{href:"https://hub.docker.com/r/btcpayserver/woocommerce",target:"_blank",rel:"noopener noreferrer"}},[e._v("DockerHub"),t("OutboundLink")],1)])]),e._v(" "),t("tr",[t("td",[e._v("btcpayserver/postgres")]),e._v(" "),t("td",[e._v("13.13")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/btcpayserver/dockerfile-deps/Postgres/13.13/Postgres/13.13/linuxamd64.Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[e._v("✔️"),t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/btcpayserver/dockerfile-deps/Postgres/13.13/Postgres/13.13/linuxarm32v7.Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[e._v("✔️"),t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/btcpayserver/dockerfile-deps/Postgres/13.13/Postgres/13.13/linuxarm64v8.Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[e._v("✔️"),t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://github.com/btcpayserver/dockerfile-deps",target:"_blank",rel:"noopener noreferrer"}},[e._v("Github"),t("OutboundLink")],1),e._v(" - "),t("a",{attrs:{href:"https://hub.docker.com/r/btcpayserver/postgres",target:"_blank",rel:"noopener noreferrer"}},[e._v("DockerHub"),t("OutboundLink")],1)])]),e._v(" "),t("tr",[t("td",[e._v("kamigawabul/btglnd")]),e._v(" "),t("td",[e._v("latest")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/vutov/lnd/master/Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[e._v("✔️"),t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[e._v("️❌")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[e._v("️❌")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://github.com/vutov/lnd",target:"_blank",rel:"noopener noreferrer"}},[e._v("Github"),t("OutboundLink")],1),e._v(" - "),t("a",{attrs:{href:"https://hub.docker.com/r/kamigawabul/btglnd",target:"_blank",rel:"noopener noreferrer"}},[e._v("DockerHub"),t("OutboundLink")],1)])]),e._v(" "),t("tr",[t("td",[e._v("kamigawabul/docker-bitcoingold")]),e._v(" "),t("td",[e._v("0.15.2")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/Vutov/docker-bitcoin/master/bitcoingold/0.15.2/Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[e._v("✔️"),t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[e._v("️❌")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[e._v("️❌")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://github.com/Vutov/docker-bitcoin",target:"_blank",rel:"noopener noreferrer"}},[e._v("Github"),t("OutboundLink")],1),e._v(" - "),t("a",{attrs:{href:"https://hub.docker.com/r/kamigawabul/docker-bitcoingold",target:"_blank",rel:"noopener noreferrer"}},[e._v("DockerHub"),t("OutboundLink")],1)])]),e._v(" "),t("tr",[t("td",[e._v("acinq/eclair")]),e._v(" "),t("td",[e._v("release-0.7.0")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/ACINQ/eclair/v0.7.0/Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[e._v("✔️"),t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[e._v("️❌")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[e._v("️❌")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://github.com/ACINQ/eclair",target:"_blank",rel:"noopener noreferrer"}},[e._v("Github"),t("OutboundLink")],1),e._v(" - "),t("a",{attrs:{href:"https://hub.docker.com/r/acinq/eclair",target:"_blank",rel:"noopener noreferrer"}},[e._v("DockerHub"),t("OutboundLink")],1)])]),e._v(" "),t("tr",[t("td",[e._v("chekaz/docker-bitcoinplus")]),e._v(" "),t("td",[e._v("2.7.0")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/ChekaZ/docker/master/bitcoinplus/2.7.0/Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[e._v("✔️"),t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[e._v("️❌")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[e._v("️❌")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://github.com/ChekaZ/docker",target:"_blank",rel:"noopener noreferrer"}},[e._v("Github"),t("OutboundLink")],1),e._v(" - "),t("a",{attrs:{href:"https://hub.docker.com/r/chekaz/docker-bitcoinplus",target:"_blank",rel:"noopener noreferrer"}},[e._v("DockerHub"),t("OutboundLink")],1)])]),e._v(" "),t("tr",[t("td",[e._v("dalijolijo/docker-bitcore")]),e._v(" "),t("td",[e._v("0.90.9.10")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/dalijolijo/btcpayserver-docker-bitcore/master/docker-bitcored/Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[e._v("✔️"),t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[e._v("️❌")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[e._v("️❌")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://github.com/dalijolijo/btcpayserver-docker-bitcore",target:"_blank",rel:"noopener noreferrer"}},[e._v("Github"),t("OutboundLink")],1),e._v(" - "),t("a",{attrs:{href:"https://hub.docker.com/r/dalijolijo/docker-bitcore",target:"_blank",rel:"noopener noreferrer"}},[e._v("DockerHub"),t("OutboundLink")],1)])]),e._v(" "),t("tr",[t("td",[e._v("btcpayserver/dash")]),e._v(" "),t("td",[e._v("19.2.0")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/btcpayserver/dockerfile-deps/Dash/19.2.0/Dash/19.2.0/linuxamd64.Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[e._v("✔️"),t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[e._v("️❌")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/btcpayserver/dockerfile-deps/Dash/19.2.0/Dash/19.2.0/linuxarm64v8.Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[e._v("✔️"),t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://github.com/btcpayserver/dockerfile-deps",target:"_blank",rel:"noopener noreferrer"}},[e._v("Github"),t("OutboundLink")],1),e._v(" - "),t("a",{attrs:{href:"https://hub.docker.com/r/btcpayserver/dash",target:"_blank",rel:"noopener noreferrer"}},[e._v("DockerHub"),t("OutboundLink")],1)])]),e._v(" "),t("tr",[t("td",[e._v("btcpayserver/dogecoin")]),e._v(" "),t("td",[e._v("1.14.6")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/btcpayserver/dockerfile-deps/Dogecoin/1.14.6/Dogecoin/1.14.6/linuxamd64.Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[e._v("✔️"),t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[e._v("️❌")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[e._v("️❌")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://github.com/btcpayserver/dockerfile-deps",target:"_blank",rel:"noopener noreferrer"}},[e._v("Github"),t("OutboundLink")],1),e._v(" - "),t("a",{attrs:{href:"https://hub.docker.com/r/btcpayserver/dogecoin",target:"_blank",rel:"noopener noreferrer"}},[e._v("DockerHub"),t("OutboundLink")],1)])]),e._v(" "),t("tr",[t("td",[e._v("chekaz/docker-feathercoin")]),e._v(" "),t("td",[e._v("0.16.3")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/ChekaZ/docker/master/feathercoin/0.16.3/Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[e._v("✔️"),t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[e._v("️❌")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[e._v("️❌")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://github.com/ChekaZ/docker",target:"_blank",rel:"noopener noreferrer"}},[e._v("Github"),t("OutboundLink")],1),e._v(" - "),t("a",{attrs:{href:"https://hub.docker.com/r/chekaz/docker-feathercoin",target:"_blank",rel:"noopener noreferrer"}},[e._v("DockerHub"),t("OutboundLink")],1)])]),e._v(" "),t("tr",[t("td",[e._v("groestlcoin/lightning")]),e._v(" "),t("td",[e._v("v23.05")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/Groestlcoin/lightning/v23.05/Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[e._v("✔️"),t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[e._v("️❌")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[e._v("️❌")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://github.com/Groestlcoin/lightning",target:"_blank",rel:"noopener noreferrer"}},[e._v("Github"),t("OutboundLink")],1),e._v(" - "),t("a",{attrs:{href:"https://hub.docker.com/r/groestlcoin/lightning",target:"_blank",rel:"noopener noreferrer"}},[e._v("DockerHub"),t("OutboundLink")],1)])]),e._v(" "),t("tr",[t("td",[e._v("groestlcoin/groestlcoin-lightning-charge")]),e._v(" "),t("td",[e._v("version-0.4.22")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/Groestlcoin/groestlcoin-lightning-charge/v0.4.22/Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[e._v("✔️"),t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[e._v("️❌")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[e._v("️❌")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://github.com/Groestlcoin/groestlcoin-lightning-charge",target:"_blank",rel:"noopener noreferrer"}},[e._v("Github"),t("OutboundLink")],1),e._v(" - "),t("a",{attrs:{href:"https://hub.docker.com/r/groestlcoin/groestlcoin-lightning-charge",target:"_blank",rel:"noopener noreferrer"}},[e._v("DockerHub"),t("OutboundLink")],1)])]),e._v(" "),t("tr",[t("td",[e._v("groestlcoin/groestlcoin-spark")]),e._v(" "),t("td",[e._v("version-0.2.16")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/Groestlcoin/groestlcoin-spark/v0.2.16/Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[e._v("✔️"),t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[e._v("️❌")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[e._v("️❌")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://github.com/Groestlcoin/groestlcoin-spark",target:"_blank",rel:"noopener noreferrer"}},[e._v("Github"),t("OutboundLink")],1),e._v(" - "),t("a",{attrs:{href:"https://hub.docker.com/r/groestlcoin/groestlcoin-spark",target:"_blank",rel:"noopener noreferrer"}},[e._v("DockerHub"),t("OutboundLink")],1)])]),e._v(" "),t("tr",[t("td",[e._v("groestlcoin/eclair")]),e._v(" "),t("td",[e._v("v0.6.0")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/Groestlcoin/eclair/v0.6.0/Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[e._v("✔️"),t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[e._v("️❌")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[e._v("️❌")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://github.com/Groestlcoin/eclair",target:"_blank",rel:"noopener noreferrer"}},[e._v("Github"),t("OutboundLink")],1),e._v(" - "),t("a",{attrs:{href:"https://hub.docker.com/r/groestlcoin/eclair",target:"_blank",rel:"noopener noreferrer"}},[e._v("DockerHub"),t("OutboundLink")],1)])]),e._v(" "),t("tr",[t("td",[e._v("groestlcoin/lnd")]),e._v(" "),t("td",[e._v("v0.10.0-grs")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/Groestlcoin/lnd/v0.10.0-grs/Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[e._v("✔️"),t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[e._v("️❌")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[e._v("️❌")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://github.com/Groestlcoin/lnd",target:"_blank",rel:"noopener noreferrer"}},[e._v("Github"),t("OutboundLink")],1),e._v(" - "),t("a",{attrs:{href:"https://hub.docker.com/r/groestlcoin/lnd",target:"_blank",rel:"noopener noreferrer"}},[e._v("DockerHub"),t("OutboundLink")],1)])]),e._v(" "),t("tr",[t("td",[e._v("btcpayserver/groestlcoin")]),e._v(" "),t("td",[e._v("25.0")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/btcpayserver/dockerfile-deps/Groestlcoin/25.0/Groestlcoin/25.0/linuxamd64.Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[e._v("✔️"),t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/btcpayserver/dockerfile-deps/Groestlcoin/25.0/Groestlcoin/25.0/linuxarm32v7.Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[e._v("✔️"),t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/btcpayserver/dockerfile-deps/Groestlcoin/25.0/Groestlcoin/25.0/linuxarm64v8.Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[e._v("✔️"),t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://github.com/btcpayserver/dockerfile-deps",target:"_blank",rel:"noopener noreferrer"}},[e._v("Github"),t("OutboundLink")],1),e._v(" - "),t("a",{attrs:{href:"https://hub.docker.com/r/btcpayserver/groestlcoin",target:"_blank",rel:"noopener noreferrer"}},[e._v("DockerHub"),t("OutboundLink")],1)])]),e._v(" "),t("tr",[t("td",[e._v("btcpayserver/elements")]),e._v(" "),t("td",[e._v("22.1.1")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/btcpayserver/dockerfile-deps/Elements/22.1.1/Elements/22.1.1/linuxamd64.Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[e._v("✔️"),t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/btcpayserver/dockerfile-deps/Elements/22.1.1/Elements/22.1.1/linuxarm32v7.Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[e._v("✔️"),t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/btcpayserver/dockerfile-deps/Elements/22.1.1/Elements/22.1.1/linuxarm64v8.Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[e._v("✔️"),t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://github.com/btcpayserver/dockerfile-deps",target:"_blank",rel:"noopener noreferrer"}},[e._v("Github"),t("OutboundLink")],1),e._v(" - "),t("a",{attrs:{href:"https://hub.docker.com/r/btcpayserver/elements",target:"_blank",rel:"noopener noreferrer"}},[e._v("DockerHub"),t("OutboundLink")],1)])]),e._v(" "),t("tr",[t("td",[e._v("btcpayserver/litecoin")]),e._v(" "),t("td",[e._v("0.21.2.1-2")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/btcpayserver/dockerfile-deps/Litecoin/0.21.2.1-2/Litecoin/0.21.2.1/linuxamd64.Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[e._v("✔️"),t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/btcpayserver/dockerfile-deps/Litecoin/0.21.2.1-2/Litecoin/0.21.2.1/linuxarm32v7.Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[e._v("✔️"),t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/btcpayserver/dockerfile-deps/Litecoin/0.21.2.1-2/Litecoin/0.21.2.1/linuxarm64v8.Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[e._v("✔️"),t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://github.com/btcpayserver/dockerfile-deps",target:"_blank",rel:"noopener noreferrer"}},[e._v("Github"),t("OutboundLink")],1),e._v(" - "),t("a",{attrs:{href:"https://hub.docker.com/r/btcpayserver/litecoin",target:"_blank",rel:"noopener noreferrer"}},[e._v("DockerHub"),t("OutboundLink")],1)])]),e._v(" "),t("tr",[t("td",[e._v("wakiyamap/docker-monacoin")]),e._v(" "),t("td",[e._v("0.20.2")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/wakiyamap/docker-bitcoin/master/monacoin/0.20.2/Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[e._v("✔️"),t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[e._v("️❌")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[e._v("️❌")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://github.com/wakiyamap/docker-bitcoin",target:"_blank",rel:"noopener noreferrer"}},[e._v("Github"),t("OutboundLink")],1),e._v(" - "),t("a",{attrs:{href:"https://hub.docker.com/r/wakiyamap/docker-monacoin",target:"_blank",rel:"noopener noreferrer"}},[e._v("DockerHub"),t("OutboundLink")],1)])]),e._v(" "),t("tr",[t("td",[e._v("redis")]),e._v(" "),t("td",[e._v("6.2.2-buster")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/docker-library/redis/f1a8498333ae3ab340b5b39fbac1d7e1dc0d628c/5.0/Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[e._v("✔️"),t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[e._v("️❌")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[e._v("️❌")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://github.com/docker-library/redis",target:"_blank",rel:"noopener noreferrer"}},[e._v("Github"),t("OutboundLink")],1),e._v(" - "),t("a",{attrs:{href:"https://hub.docker.com/_/redis",target:"_blank",rel:"noopener noreferrer"}},[e._v("DockerHub"),t("OutboundLink")],1)])]),e._v(" "),t("tr",[t("td",[e._v("bluewalletorganization/lndhub")]),e._v(" "),t("td",[e._v("v1.4.1")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/BlueWallet/LndHub/v1.4.1/Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[e._v("✔️"),t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/BlueWallet/LndHub/v1.4.1/Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[e._v("✔️"),t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/BlueWallet/LndHub/v1.4.1/Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[e._v("✔️"),t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://github.com/BlueWallet/LndHub",target:"_blank",rel:"noopener noreferrer"}},[e._v("Github"),t("OutboundLink")],1),e._v(" - "),t("a",{attrs:{href:"https://hub.docker.com/r/bluewalletorganization/lndhub",target:"_blank",rel:"noopener noreferrer"}},[e._v("DockerHub"),t("OutboundLink")],1)])]),e._v(" "),t("tr",[t("td",[e._v("jvandrew/btcqbo")]),e._v(" "),t("td",[e._v("0.3.36")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/JeffVandrewJr/btcqbo/v0.3.36/Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[e._v("✔️"),t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[e._v("️❌")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[e._v("️❌")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://github.com/JeffVandrewJr/btcqbo",target:"_blank",rel:"noopener noreferrer"}},[e._v("Github"),t("OutboundLink")],1),e._v(" - "),t("a",{attrs:{href:"https://hub.docker.com/r/jvandrew/btcqbo",target:"_blank",rel:"noopener noreferrer"}},[e._v("DockerHub"),t("OutboundLink")],1)])]),e._v(" "),t("tr",[t("td",[e._v("shesek/bwt")]),e._v(" "),t("td",[e._v("0.2.2-electrum")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/bwt-dev/bwt/v0.2.2/docker/Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[e._v("✔️"),t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/bwt-dev/bwt/v0.2.2/docker/arm32v7.Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[e._v("✔️"),t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/bwt-dev/bwt/v0.2.2/docker/arm64v8.Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[e._v("✔️"),t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://github.com/bwt-dev/bwt",target:"_blank",rel:"noopener noreferrer"}},[e._v("Github"),t("OutboundLink")],1),e._v(" - "),t("a",{attrs:{href:"https://hub.docker.com/r/shesek/bwt",target:"_blank",rel:"noopener noreferrer"}},[e._v("DockerHub"),t("OutboundLink")],1)])]),e._v(" "),t("tr",[t("td",[e._v("chatwoot/chatwoot")]),e._v(" "),t("td",[e._v("v1.7.0")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/chatwoot/chatwoot/v1.7.0/docker/Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[e._v("✔️"),t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/chatwoot/chatwoot/v1.7.0/docker/Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[e._v("✔️"),t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/chatwoot/chatwoot/v1.7.0/docker/Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[e._v("✔️"),t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://github.com/chatwoot/chatwoot",target:"_blank",rel:"noopener noreferrer"}},[e._v("Github"),t("OutboundLink")],1),e._v(" - "),t("a",{attrs:{href:"https://hub.docker.com/r/chatwoot/chatwoot",target:"_blank",rel:"noopener noreferrer"}},[e._v("DockerHub"),t("OutboundLink")],1)])]),e._v(" "),t("tr",[t("td",[e._v("lukechilds/electrumx")]),e._v(" "),t("td",[e._v("latest")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/lukechilds/docker-electrumx/master/Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[e._v("✔️"),t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[e._v("️❌")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[e._v("️❌")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://github.com/lukechilds/docker-electrumx",target:"_blank",rel:"noopener noreferrer"}},[e._v("Github"),t("OutboundLink")],1),e._v(" - "),t("a",{attrs:{href:"https://hub.docker.com/r/lukechilds/electrumx",target:"_blank",rel:"noopener noreferrer"}},[e._v("DockerHub"),t("OutboundLink")],1)])]),e._v(" "),t("tr",[t("td",[e._v("fireflyiii/core")]),e._v(" "),t("td",[e._v("latest")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://dev.azure.com/Firefly-III/66fb773b-063e-42d7-b6a5-e7729a22e8b3/_apis/git/repositories/e9c3dcf8-4533-4ef1-83cc-75527cab3377/items?path=%2FDockerfile&versionDescriptor%5BversionOptions%5D=0&versionDescriptor%5BversionType%5D=0&versionDescriptor%5Bversion%5D=main&resolveLfs=true&%24format=octetStream&api-version=5.0&download=true",target:"_blank",rel:"noopener noreferrer"}},[e._v("✔️"),t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://dev.azure.com/Firefly-III/66fb773b-063e-42d7-b6a5-e7729a22e8b3/_apis/git/repositories/e9c3dcf8-4533-4ef1-83cc-75527cab3377/items?path=%2FDockerfile&versionDescriptor%5BversionOptions%5D=0&versionDescriptor%5BversionType%5D=0&versionDescriptor%5Bversion%5D=main&resolveLfs=true&%24format=octetStream&api-version=5.0&download=true",target:"_blank",rel:"noopener noreferrer"}},[e._v("✔️"),t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://dev.azure.com/Firefly-III/66fb773b-063e-42d7-b6a5-e7729a22e8b3/_apis/git/repositories/e9c3dcf8-4533-4ef1-83cc-75527cab3377/items?path=%2FDockerfile&versionDescriptor%5BversionOptions%5D=0&versionDescriptor%5BversionType%5D=0&versionDescriptor%5Bversion%5D=main&resolveLfs=true&%24format=octetStream&api-version=5.0&download=true",target:"_blank",rel:"noopener noreferrer"}},[e._v("✔️"),t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://dev.azure.com/Firefly-III/_git/MainImage",target:"_blank",rel:"noopener noreferrer"}},[e._v("Github"),t("OutboundLink")],1),e._v(" - "),t("a",{attrs:{href:"https://hub.docker.com/r/fireflyiii/core",target:"_blank",rel:"noopener noreferrer"}},[e._v("DockerHub"),t("OutboundLink")],1)])]),e._v(" "),t("tr",[t("td",[e._v("podcastindexorg/podcasting20-helipad")]),e._v(" "),t("td",[e._v("v0.1.10")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/Podcastindex-org/helipad/v0.1.10/umbrel/Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[e._v("✔️"),t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/Podcastindex-org/helipad/v0.1.10/umbrel/Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[e._v("✔️"),t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/Podcastindex-org/helipad/v0.1.10/umbrel/Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[e._v("✔️"),t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://github.com/Podcastindex-org/helipad",target:"_blank",rel:"noopener noreferrer"}},[e._v("Github"),t("OutboundLink")],1),e._v(" - "),t("a",{attrs:{href:"https://hub.docker.com/r/podcastindexorg/podcasting20-helipad",target:"_blank",rel:"noopener noreferrer"}},[e._v("DockerHub"),t("OutboundLink")],1)])]),e._v(" "),t("tr",[t("td",[e._v("jvandrew/librepatron")]),e._v(" "),t("td",[e._v("0.7.39")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/JeffVandrewJr/patron/v0.7.39/Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[e._v("✔️"),t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[e._v("️❌")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[e._v("️❌")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://github.com/JeffVandrewJr/patron",target:"_blank",rel:"noopener noreferrer"}},[e._v("Github"),t("OutboundLink")],1),e._v(" - "),t("a",{attrs:{href:"https://hub.docker.com/r/jvandrew/librepatron",target:"_blank",rel:"noopener noreferrer"}},[e._v("DockerHub"),t("OutboundLink")],1)])]),e._v(" "),t("tr",[t("td",[e._v("jvandrew/isso")]),e._v(" "),t("td",[e._v("atron.22")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/JeffVandrewJr/isso/patron.22/Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[e._v("✔️"),t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[e._v("️❌")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[e._v("️❌")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://github.com/JeffVandrewJr/isso",target:"_blank",rel:"noopener noreferrer"}},[e._v("Github"),t("OutboundLink")],1),e._v(" - "),t("a",{attrs:{href:"https://hub.docker.com/r/jvandrew/isso",target:"_blank",rel:"noopener noreferrer"}},[e._v("DockerHub"),t("OutboundLink")],1)])]),e._v(" "),t("tr",[t("td",[e._v("lightninglabs/lightning-terminal")]),e._v(" "),t("td",[e._v("v0.9.2-alpha-path-prefix")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/lightninglabs/lightning-terminal/v0.9.2-alpha/Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[e._v("✔️"),t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[e._v("️❌")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/lightninglabs/lightning-terminal/v0.9.2-alpha/Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[e._v("✔️"),t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://github.com/lightninglabs/lightning-terminal",target:"_blank",rel:"noopener noreferrer"}},[e._v("Github"),t("OutboundLink")],1),e._v(" - "),t("a",{attrs:{href:"https://hub.docker.com/r/lightninglabs/lightning-terminal",target:"_blank",rel:"noopener noreferrer"}},[e._v("DockerHub"),t("OutboundLink")],1)])]),e._v(" "),t("tr",[t("td",[e._v("mempool/frontend")]),e._v(" "),t("td",[e._v("v2.5.0")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/mempool/mempool/v2.5.0/docker/frontend/Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[e._v("✔️"),t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/mempool/mempool/v2.5.0/docker/frontend/Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[e._v("✔️"),t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/mempool/mempool/v2.5.0/docker/frontend/Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[e._v("✔️"),t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://github.com/mempool/mempool",target:"_blank",rel:"noopener noreferrer"}},[e._v("Github"),t("OutboundLink")],1),e._v(" - "),t("a",{attrs:{href:"https://hub.docker.com/r/mempool/frontend",target:"_blank",rel:"noopener noreferrer"}},[e._v("DockerHub"),t("OutboundLink")],1)])]),e._v(" "),t("tr",[t("td",[e._v("mempool/backend")]),e._v(" "),t("td",[e._v("v2.5.0")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/mempool/mempool/v2.5.0/docker/backend/Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[e._v("✔️"),t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/mempool/mempool/v2.5.0/docker/backend/Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[e._v("✔️"),t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/mempool/mempool/v2.5.0/docker/backend/Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[e._v("✔️"),t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://github.com/mempool/mempool",target:"_blank",rel:"noopener noreferrer"}},[e._v("Github"),t("OutboundLink")],1),e._v(" - "),t("a",{attrs:{href:"https://hub.docker.com/r/mempool/backend",target:"_blank",rel:"noopener noreferrer"}},[e._v("DockerHub"),t("OutboundLink")],1)])]),e._v(" "),t("tr",[t("td",[e._v("mariadb")]),e._v(" "),t("td",[e._v("10.11")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/docker-library/mariadb/master/10.11/Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[e._v("✔️"),t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[e._v("️❌")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[e._v("️❌")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://github.com/docker-library/mariadb",target:"_blank",rel:"noopener noreferrer"}},[e._v("Github"),t("OutboundLink")],1),e._v(" - "),t("a",{attrs:{href:"https://hub.docker.com/_/mariadb",target:"_blank",rel:"noopener noreferrer"}},[e._v("DockerHub"),t("OutboundLink")],1)])]),e._v(" "),t("tr",[t("td",[e._v("kukks/nnostr-relay")]),e._v(" "),t("td",[e._v("v0.0.18")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/kukks/nnostr/Relay/v0.0.18/Relay/Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[e._v("✔️"),t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/kukks/nnostr/Relay/v0.0.18/Relay/Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[e._v("✔️"),t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/kukks/nnostr/Relay/v0.0.18/Relay/Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[e._v("✔️"),t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://github.com/kukks/nnostr",target:"_blank",rel:"noopener noreferrer"}},[e._v("Github"),t("OutboundLink")],1),e._v(" - "),t("a",{attrs:{href:"https://hub.docker.com/r/kukks/nnostr-relay",target:"_blank",rel:"noopener noreferrer"}},[e._v("DockerHub"),t("OutboundLink")],1)])]),e._v(" "),t("tr",[t("td",[e._v("sphinxlightning/sphinx-relay")]),e._v(" "),t("td",[e._v("v2.2.9")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/stakwork/sphinx-relay/v2.2.9/Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[e._v("✔️"),t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/stakwork/sphinx-relay/v2.2.9/Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[e._v("✔️"),t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/stakwork/sphinx-relay/v2.2.9/Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[e._v("✔️"),t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://github.com/stakwork/sphinx-relay",target:"_blank",rel:"noopener noreferrer"}},[e._v("Github"),t("OutboundLink")],1),e._v(" - "),t("a",{attrs:{href:"https://hub.docker.com/r/sphinxlightning/sphinx-relay",target:"_blank",rel:"noopener noreferrer"}},[e._v("DockerHub"),t("OutboundLink")],1)])]),e._v(" "),t("tr",[t("td",[e._v("djbooth007/tallycoin_connect")]),e._v(" "),t("td",[e._v("v1.8.0")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/djbooth007/tallycoin_connect/v1.8.0/Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[e._v("✔️"),t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/djbooth007/tallycoin_connect/v1.8.0/Dockerfile.arm32v7",target:"_blank",rel:"noopener noreferrer"}},[e._v("✔️"),t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/djbooth007/tallycoin_connect/v1.8.0/Dockerfile.arm64v8",target:"_blank",rel:"noopener noreferrer"}},[e._v("✔️"),t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://github.com/djbooth007/tallycoin_connect",target:"_blank",rel:"noopener noreferrer"}},[e._v("Github"),t("OutboundLink")],1),e._v(" - "),t("a",{attrs:{href:"https://hub.docker.com/r/djbooth007/tallycoin_connect",target:"_blank",rel:"noopener noreferrer"}},[e._v("DockerHub"),t("OutboundLink")],1)])]),e._v(" "),t("tr",[t("td",[e._v("talaia/python-teos")]),e._v(" "),t("td",[e._v("latest")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/talaia-labs/python-teos/master/docker/Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[e._v("✔️"),t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/talaia-labs/python-teos/master/docker/arm32v7.Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[e._v("✔️"),t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/talaia-labs/python-teos/master/docker/arm64v8.Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[e._v("✔️"),t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://github.com/talaia-labs/python-teos",target:"_blank",rel:"noopener noreferrer"}},[e._v("Github"),t("OutboundLink")],1),e._v(" - "),t("a",{attrs:{href:"https://hub.docker.com/r/talaia/python-teos",target:"_blank",rel:"noopener noreferrer"}},[e._v("DockerHub"),t("OutboundLink")],1)])]),e._v(" "),t("tr",[t("td",[e._v("apotdevin/thunderhub")]),e._v(" "),t("td",[e._v("base-v0.13.23")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/apotdevin/thunderhub/v0.13.23/Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[e._v("✔️"),t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/apotdevin/thunderhub/v0.13.23/Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[e._v("✔️"),t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/apotdevin/thunderhub/v0.13.23/Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[e._v("✔️"),t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://github.com/apotdevin/thunderhub",target:"_blank",rel:"noopener noreferrer"}},[e._v("Github"),t("OutboundLink")],1),e._v(" - "),t("a",{attrs:{href:"https://hub.docker.com/r/apotdevin/thunderhub",target:"_blank",rel:"noopener noreferrer"}},[e._v("DockerHub"),t("OutboundLink")],1)])]),e._v(" "),t("tr",[t("td",[e._v("lncapital/torq")]),e._v(" "),t("td",[e._v("0.20.3")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/lncapital/torq/master/README.md",target:"_blank",rel:"noopener noreferrer"}},[e._v("✔️"),t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/lncapital/torq/master/README.md",target:"_blank",rel:"noopener noreferrer"}},[e._v("✔️"),t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/lncapital/torq/master/README.md",target:"_blank",rel:"noopener noreferrer"}},[e._v("✔️"),t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://github.com/lncapital/torq",target:"_blank",rel:"noopener noreferrer"}},[e._v("Github"),t("OutboundLink")],1),e._v(" - "),t("a",{attrs:{href:"https://hub.docker.com/r/lncapital/torq",target:"_blank",rel:"noopener noreferrer"}},[e._v("DockerHub"),t("OutboundLink")],1)])]),e._v(" "),t("tr",[t("td",[e._v("timescale/timescaledb")]),e._v(" "),t("td",[e._v("latest-pg14")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/timescale/timescaledb-docker/main/Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[e._v("✔️"),t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/timescale/timescaledb-docker/main/Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[e._v("✔️"),t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/timescale/timescaledb-docker/main/Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[e._v("✔️"),t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://github.com/timescale/timescaledb-docker",target:"_blank",rel:"noopener noreferrer"}},[e._v("Github"),t("OutboundLink")],1),e._v(" - "),t("a",{attrs:{href:"https://hub.docker.com/r/timescale/timescaledb",target:"_blank",rel:"noopener noreferrer"}},[e._v("DockerHub"),t("OutboundLink")],1)])]),e._v(" "),t("tr",[t("td",[e._v("zammad/zammad-docker-compose")]),e._v(" "),t("td",[e._v("zammad-postgresql-3.4.0-4")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/zammad/zammad-docker-compose/ff20084ce2829486076e9781fe27407ca6cc09bb/containers/zammad-postgresql/Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[e._v("✔️"),t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[e._v("️❌")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[e._v("️❌")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://github.com/zammad/zammad-docker-compose",target:"_blank",rel:"noopener noreferrer"}},[e._v("Github"),t("OutboundLink")],1),e._v(" - "),t("a",{attrs:{href:"https://hub.docker.com/r/zammad/zammad-docker-compose",target:"_blank",rel:"noopener noreferrer"}},[e._v("DockerHub"),t("OutboundLink")],1)])]),e._v(" "),t("tr",[t("td",[e._v("memcached")]),e._v(" "),t("td",[e._v("1.5.22-alpine")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/docker-library/memcached/eb38bf28263b8e5bb7367797cb7b181b65d769bd/alpine/Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[e._v("✔️"),t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[e._v("️❌")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[e._v("️❌")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://github.com/docker-library/memcached",target:"_blank",rel:"noopener noreferrer"}},[e._v("Github"),t("OutboundLink")],1),e._v(" - "),t("a",{attrs:{href:"https://hub.docker.com/_/memcached",target:"_blank",rel:"noopener noreferrer"}},[e._v("DockerHub"),t("OutboundLink")],1)])]),e._v(" "),t("tr",[t("td",[e._v("traefik")]),e._v(" "),t("td",[e._v("v2.6")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/containous/traefik-library-image/master/scratch/Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[e._v("✔️"),t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[e._v("️❌")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[e._v("️❌")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://github.com/containous/traefik-library-image",target:"_blank",rel:"noopener noreferrer"}},[e._v("Github"),t("OutboundLink")],1),e._v(" - "),t("a",{attrs:{href:"https://hub.docker.com/_/traefik",target:"_blank",rel:"noopener noreferrer"}},[e._v("DockerHub"),t("OutboundLink")],1)])]),e._v(" "),t("tr",[t("td",[e._v("chekaz/docker-trezarcoin")]),e._v(" "),t("td",[e._v("0.13.0")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/ChekaZ/docker/master/trezarcoin/1.2.0/Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[e._v("✔️"),t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[e._v("️❌")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[e._v("️❌")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://github.com/ChekaZ/docker",target:"_blank",rel:"noopener noreferrer"}},[e._v("Github"),t("OutboundLink")],1),e._v(" - "),t("a",{attrs:{href:"https://hub.docker.com/r/chekaz/docker-trezarcoin",target:"_blank",rel:"noopener noreferrer"}},[e._v("DockerHub"),t("OutboundLink")],1)])]),e._v(" "),t("tr",[t("td",[e._v("romanornr/docker-viacoin")]),e._v(" "),t("td",[e._v("0.15.2")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/viacoin/docker-viacoin/master/viacoin/0.15.2/docker-viacoin",target:"_blank",rel:"noopener noreferrer"}},[e._v("✔️"),t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[e._v("️❌")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[e._v("️❌")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://github.com/viacoin/docker-viacoin",target:"_blank",rel:"noopener noreferrer"}},[e._v("Github"),t("OutboundLink")],1),e._v(" - "),t("a",{attrs:{href:"https://hub.docker.com/r/romanornr/docker-viacoin",target:"_blank",rel:"noopener noreferrer"}},[e._v("DockerHub"),t("OutboundLink")],1)])])])]),e._v(" "),t("h1",{attrs:{id:"faq"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#faq"}},[e._v("#")]),e._v(" FAQ")]),e._v(" "),t("h2",{attrs:{id:"how-can-i-modify-my-environment"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#how-can-i-modify-my-environment"}},[e._v("#")]),e._v(" How can I modify my environment?")]),e._v(" "),t("p",[e._v("As root, run "),t("code",[e._v(". btcpay-setup.sh")]),e._v("; this will show you the environment variable it is expecting.\nFor example, if you support "),t("code",[e._v("btc")]),e._v(" and "),t("code",[e._v("ltc")]),e._v(" already, and want to add "),t("code",[e._v("btg")]),e._v(":")]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("export")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[e._v("BTCPAYGEN_CRYPTO3")]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),t("span",{pre:!0,attrs:{class:"token string"}},[e._v("'btg'")]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v(".")]),e._v(" btcpay-setup.sh "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-i")]),e._v("\n")])])]),t("h2",{attrs:{id:"i-deployed-before-btcpay-setupsh-existed-before-may-17-2018-can-i-migrate-to-this-new-system"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#i-deployed-before-btcpay-setupsh-existed-before-may-17-2018-can-i-migrate-to-this-new-system"}},[e._v("#")]),e._v(" I deployed before "),t("code",[e._v("btcpay-setup.sh")]),e._v(" existed (before May 17, 2018), can I migrate to this new system?")]),e._v(" "),t("p",[e._v("Yes, run the following commands to update:")]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token function"}},[e._v("sudo")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("su")]),e._v(" -\n\n"),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("cd")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token variable"}},[e._v("$DOWNLOAD_ROOT")]),e._v("/btcpayserver-docker\n"),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("git")]),e._v(" checkout master\n"),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("git")]),e._v(" pull\n"),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("git")]),e._v(" checkout 9acb5d8067cb5c46f59858137feb699b41ac9f19\nbtcpay-update.sh\n"),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v(".")]),e._v(" ./btcpay-setup.sh "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-i")]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("git")]),e._v(" checkout master\nbtcpay-update.sh\n\n"),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("exit")]),e._v("\n")])])]),t("h2",{attrs:{id:"im-getting-an-error-on-windows-cannot-create-container-for-service-docker-mount-denied"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#im-getting-an-error-on-windows-cannot-create-container-for-service-docker-mount-denied"}},[e._v("#")]),e._v(" I'm getting an error on Windows: "),t("code",[e._v("Cannot create container for service docker: Mount denied")]),e._v("?")]),e._v(" "),t("p",[e._v("If you see this error:")]),e._v(" "),t("p",[t("code",[e._v("Cannot create container for service docker: b'Mount denied:\\nThe source path \"\\\\\\\\var\\\\\\\\run\\\\\\\\docker.sock:/var/run/docker.sock\"\\nis not a valid Windows path'")]),e._v(".")]),e._v(" "),t("p",[e._v("Run this in "),t("a",{attrs:{href:"https://docs.microsoft.com/en-us/powershell/scripting/windows-powershell/starting-windows-powershell",target:"_blank",rel:"noopener noreferrer"}},[e._v("powershell"),t("OutboundLink")],1),e._v(":")]),e._v(" "),t("div",{staticClass:"language-powershell extra-class"},[t("pre",{pre:!0,attrs:{class:"language-powershell"}},[t("code",[t("span",{pre:!0,attrs:{class:"token variable"}},[e._v("$Env")]),e._v(":COMPOSE_CONVERT_WINDOWS_PATHS=1\n")])])]),t("p",[e._v("Then, run "),t("code",[e._v("docker-compose -f EXAMPLE.yml up")]),e._v(".")]),e._v(" "),t("p",[e._v("This bug comes from Docker for Windows and is "),t("a",{attrs:{href:"https://github.com/docker/for-win/issues/1829",target:"_blank",rel:"noopener noreferrer"}},[e._v("tracked on Github"),t("OutboundLink")],1),e._v(".")]),e._v(" "),t("h2",{attrs:{id:"how-i-can-prune-my-nodes"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#how-i-can-prune-my-nodes"}},[e._v("#")]),e._v(" How I can prune my node(s)?")]),e._v(" "),t("p",[e._v("This will prune your Bitcoin full node to a maximum of 100GB (of blocks):")]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("export")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[e._v("BTCPAYGEN_ADDITIONAL_FRAGMENTS")]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"opt-save-storage"')]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v(".")]),e._v(" ./btcpay-setup.sh "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-i")]),e._v("\n")])])]),t("p",[e._v("Other options are "),t("a",{attrs:{href:"#generated-docker-compose"}},[e._v("documented here")]),e._v(".")]),e._v(" "),t("h2",{attrs:{id:"how-can-i-customize-the-generated-docker-compose-file"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#how-can-i-customize-the-generated-docker-compose-file"}},[e._v("#")]),e._v(" How can I customize the generated docker-compose file?")]),e._v(" "),t("p",[e._v("In some instances, you might want to customize your environment in more detail. While you could modify "),t("code",[e._v("Generated/docker-compose.generated.yml")]),e._v(" manually, your changes would be overwritten the next time you run "),t("code",[e._v("btcpay-update.sh")]),e._v(".")]),e._v(" "),t("p",[e._v("Luckily, you can leverage "),t("code",[e._v("BTCPAYGEN_ADDITIONAL_FRAGMENTS")]),e._v(" for this!")]),e._v(" "),t("p",[e._v("Let's enable "),t("strong",[e._v("pruning to 60 GB")]),e._v(", for example:")]),e._v(" "),t("p",[e._v("First, copy "),t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver-docker/blob/master/docker-compose-generator/docker-fragments/opt-save-storage.yml",target:"_blank",rel:"noopener noreferrer"}},[e._v("opt-save-storage"),t("OutboundLink")],1),e._v(" into the "),t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver-docker/blob/master/docker-compose-generator/docker-fragments",target:"_blank",rel:"noopener noreferrer"}},[e._v("the docker fragment folder"),t("OutboundLink")],1),e._v(" as "),t("code",[e._v("opt-save-storage.custom.yml")]),e._v(". "),t("strong",[e._v("Important:")]),e._v(" the file must end with "),t("code",[e._v(".custom.yml")]),e._v(", or there will be git conflicts whenever you run "),t("code",[e._v("btcpay-update.sh")]),e._v(".")]),e._v(" "),t("p",[e._v("Modify the new "),t("code",[e._v("opt-save-storage.custom.yml")]),e._v(" file to your taste:")]),e._v(" "),t("div",{staticClass:"language-diff extra-class"},[t("pre",{pre:!0,attrs:{class:"language-diff"}},[t("code",[e._v('@@ -14,8 +14,7 @@ version: "3"\n'),t("span",{pre:!0,attrs:{class:"token unchanged"}},[t("span",{pre:!0,attrs:{class:"token prefix unchanged"}},[e._v(" ")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v("services:\n")]),t("span",{pre:!0,attrs:{class:"token prefix unchanged"}},[e._v(" ")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" bitcoind:\n")]),t("span",{pre:!0,attrs:{class:"token prefix unchanged"}},[e._v(" ")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" environment:\n")])]),t("span",{pre:!0,attrs:{class:"token deleted-sign deleted"}},[t("span",{pre:!0,attrs:{class:"token prefix deleted"}},[e._v("-")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" BITCOIN_EXTRA_ARGS: prune=100000\n")])]),t("span",{pre:!0,attrs:{class:"token inserted-sign inserted"}},[t("span",{pre:!0,attrs:{class:"token prefix inserted"}},[e._v("+")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" BITCOIN_EXTRA_ARGS: prune=60000\n")])])])])]),t("p",[e._v("Then set it up:")]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("export")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[e._v("BTCPAYGEN_ADDITIONAL_FRAGMENTS")]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"'),t("span",{pre:!0,attrs:{class:"token variable"}},[e._v("$BTCPAYGEN_ADDITIONAL_FRAGMENTS")]),e._v(';opt-save-storage.custom"')]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v(".")]),e._v(" ./btcpay-setup.sh "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-i")]),e._v("\n")])])]),t("h2",{attrs:{id:"can-i-run-btcpay-server-on-ports-other-than-80-and-443"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#can-i-run-btcpay-server-on-ports-other-than-80-and-443"}},[e._v("#")]),e._v(" Can I run BTCPay Server on ports other than 80 and 443?")]),e._v(" "),t("p",[e._v("You can change the ports for HTTP and HTTPS by setting the environment variables "),t("code",[e._v("REVERSEPROXY_HTTP_PORT")]),e._v(" and "),t("code",[e._v("REVERSEPROXY_HTTPS_PORT")]),e._v(". This is handy when ports 80 and 443 are already in use on your host, or you want to offload SSL termination with an existing web proxy.")]),e._v(" "),t("p",[e._v("When you set "),t("code",[e._v("REVERSEPROXY_HTTP_PORT")]),e._v(" to another value than 80, the built-in Let's Encrypt certificate will not work, as Let's Encrypt will try to validate your SSL certificate request by connecting from the internet to your domain on port 80. This validation request should be able to reach BTCPay Server in order to receive the certificate.")]),e._v(" "),t("p",[e._v("If you need to run on a different port, it's best to terminate SSL using another web proxy and forward your traffic.")]),e._v(" "),t("h2",{attrs:{id:"can-i-offload-https-termination"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#can-i-offload-https-termination"}},[e._v("#")]),e._v(" Can I offload HTTPS termination?")]),e._v(" "),t("p",[e._v("Yes. Please "),t("RouterLink",{attrs:{to:"/FAQ/FAQ-Deployment/#can-i-use-an-existing-nginx-server-as-a-reverse-proxy-with-ssl-termination"}},[e._v("see the documentation")]),e._v(".")],1),e._v(" "),t("h2",{attrs:{id:"how-can-i-back-up-my-btcpay-server"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#how-can-i-back-up-my-btcpay-server"}},[e._v("#")]),e._v(" How can I back up my BTCPay Server?")]),e._v(" "),t("p",[e._v("See the "),t("RouterLink",{attrs:{to:"/Docker/backup-restore/"}},[e._v("Backup & Restore")]),e._v(" guide in our documentation.")],1),e._v(" "),t("details",[t("summary",[e._v("For backwards compatibility: Click here for the description of the old backup.sh process")]),e._v(" "),t("div",{staticClass:"custom-block warning"},[t("p",{staticClass:"custom-block-title"},[e._v("WARNING")]),e._v(" "),t("p",[e._v("Please consider switching to the "),t("RouterLink",{attrs:{to:"/Docker/backup-restore/"}},[e._v("new Backup & Restore process")]),e._v(", because the "),t("code",[e._v("backup.sh")]),e._v(" will not be maintained anymore.")],1)]),e._v(" "),t("p",[e._v("We provide a backup script that dumps the database and saves the important files:")]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("cd")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"'),t("span",{pre:!0,attrs:{class:"token variable"}},[e._v("$BTCPAY_BASE_DIRECTORY")]),e._v('/btcpayserver-docker"')]),e._v("\n./backup.sh\n")])])]),t("p",[e._v("This will save the backup locally as "),t("code",[e._v("/var/lib/docker/volumes/backup_datadir/_data/backup.tar.gz")]),e._v(".\nThese are the options to customize the backup name and location:")]),e._v(" "),t("ul",[t("li",[t("code",[e._v("BACKUP_TIMESTAMP=true")]),e._v(" saves the backup with datetime as part of the file name, so that backups do not get overwritten.")]),e._v(" "),t("li",[t("code",[e._v("BACKUP_PROVIDER=SCP")]),e._v(" saves the backup remotely, requires additional "),t("code",[e._v("SCP_TARGET")]),e._v(" environment variable (see below).")]),e._v(" "),t("li",[t("code",[e._v("BACKUP_PROVIDER=Dropbox")]),e._v(" saves the backup to Dropbox, requires additional "),t("code",[e._v("DROPBOX_TOKEN")]),e._v(" environment variable (see below).")])]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("cd")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"'),t("span",{pre:!0,attrs:{class:"token variable"}},[e._v("$BTCPAY_BASE_DIRECTORY")]),e._v('/btcpayserver-docker"')]),e._v("\n\n"),t("span",{pre:!0,attrs:{class:"token comment"}},[e._v("# Backup with custom file name and timestamp:")]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[e._v("BACKUP_TIMESTAMP")]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),e._v("true ./backup.sh\n\n"),t("span",{pre:!0,attrs:{class:"token comment"}},[e._v("# Backup via SCP:")]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[e._v("BACKUP_PROVIDER")]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),e._v("SCP "),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[e._v("SCP_TARGET")]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),e._v("myhost:backups/btcpay ./backup.sh\n\n"),t("span",{pre:!0,attrs:{class:"token comment"}},[e._v("# Backup to Dropbox:")]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[e._v("BACKUP_PROVIDER")]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),e._v("Dropbox "),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[e._v("DROPBOX_TOKEN")]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),e._v("myDropboxToken ./backup.sh\n")])])]),t("p",[e._v("You can also choose to only dump the database.\nThis option does not need to stop and restart the docker-containers:")]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("cd")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"'),t("span",{pre:!0,attrs:{class:"token variable"}},[e._v("$BTCPAY_BASE_DIRECTORY")]),e._v('/btcpayserver-docker"')]),e._v("\n./backup.sh --only-db\n")])])])]),e._v(" "),t("h2",{attrs:{id:"how-can-i-connect-to-the-database"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#how-can-i-connect-to-the-database"}},[e._v("#")]),e._v(" How can I connect to the database?")]),e._v(" "),t("p",[e._v("On the server you can open a database session by connecting via "),t("code",[e._v("psql")]),e._v(" as the postgres user:")]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token function"}},[e._v("docker")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("exec")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-ti")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token variable"}},[t("span",{pre:!0,attrs:{class:"token variable"}},[e._v("$(")]),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("docker")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("ps")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-a")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-q")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-f")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"name=postgres_1"')]),t("span",{pre:!0,attrs:{class:"token variable"}},[e._v(")")])]),e._v(" psql "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-U")]),e._v(" postgres\n")])])]),t("p",[e._v("Then, inside "),t("code",[e._v("psql")]),e._v(" you can select a database and interact with the tables:")]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token comment"}},[e._v("# list databases")]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("\\")]),e._v("l\n\n"),t("span",{pre:!0,attrs:{class:"token comment"}},[e._v("# connect to database")]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("\\")]),e._v("c btcpayservermainnet\n\n"),t("span",{pre:!0,attrs:{class:"token comment"}},[e._v("# list tables")]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("\\")]),e._v("dt\n\n"),t("span",{pre:!0,attrs:{class:"token comment"}},[e._v("# list users")]),e._v("\nSELECT "),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"Id"')]),e._v(", "),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"Email"')]),e._v(" FROM "),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"AspNetUsers"')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(";")]),e._v("\n\n"),t("span",{pre:!0,attrs:{class:"token comment"}},[e._v("# end session")]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("\\")]),e._v("q\n")])])]),t("p",[e._v("The main BTCPay Server database tables are part of the "),t("code",[e._v("public")]),e._v(" schema.\nPlugins have their own schema, named after the plugin.")]),e._v(" "),t("p",[e._v("By default, only the tables of the "),t("code",[e._v("public")]),e._v(" schema are shown.\nIf you want to also see and select the plugin tables, you need to extend the search path:")]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token comment"}},[e._v("# list plugin schemas")]),e._v("\nSELECT * FROM pg_catalog.pg_namespace WHERE nspname LIKE "),t("span",{pre:!0,attrs:{class:"token string"}},[e._v("'BTCPayServer.%'")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(";")]),e._v("\n\n"),t("span",{pre:!0,attrs:{class:"token comment"}},[e._v("# extend search path")]),e._v("\nSET search_path TO "),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"BTCPayServer.Plugins.MyPlugin"')]),e._v(", public"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(";")]),e._v("\n\n"),t("span",{pre:!0,attrs:{class:"token comment"}},[e._v("# table list now also shows the MyPlugin tables")]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("\\")]),e._v("dt\n")])])]),t("h2",{attrs:{id:"how-do-i-upgrade-my-btcpay-server-docker"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#how-do-i-upgrade-my-btcpay-server-docker"}},[e._v("#")]),e._v(" How do I upgrade my BTCPay Server docker?")]),e._v(" "),t("p",[e._v("Run the script "),t("code",[e._v("./btcpay-update.sh")]),e._v(" and patiently wait for your server to be upgraded.")])])}),[],!1,null,null,null);t.default=n.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[126],{759:function(e,t,r){"use strict";r.r(t);var a=r(10),n=Object(a.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"introduction"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#introduction"}},[e._v("#")]),e._v(" Introduction")]),e._v(" "),t("p",[e._v("While "),t("RouterLink",{attrs:{to:"/LunaNodeWebDeployment/"}},[e._v("our instructions")]),e._v(" cover how to install BTCPayServer in one click on Azure or Lunanode, BTCPay Server is not limited to those options.")],1),e._v(" "),t("p",[e._v("You will find below information about how you can install BTCPay Server easily in any environment having docker available.")]),e._v(" "),t("h1",{attrs:{id:"architecture"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#architecture"}},[e._v("#")]),e._v(" Architecture")]),e._v(" "),t("figure",[t("img",{attrs:{src:"https://github.com/btcpayserver/btcpayserver-doc/raw/master/docs/img/Architecture.png",alt:"Architecture",title:"Architecture"}})]),e._v(" "),t("p",[e._v("As you can see, BTCPay depends on several pieces of infrastructure, mainly:")]),e._v(" "),t("ul",[t("li",[e._v("A lightweight block explorer (NBXplorer),")]),e._v(" "),t("li",[e._v("A database (PostgreSQL),")]),e._v(" "),t("li",[e._v("A full node (eg. Bitcoin Core)")])]),e._v(" "),t("p",[e._v("There can be more dependencies if you support more than just standard Bitcoin transactions, including:")]),e._v(" "),t("ul",[t("li",[t("a",{attrs:{href:"https://github.com/ElementsProject/lightning",target:"_blank",rel:"noopener noreferrer"}},[e._v("Core Lightning (CLN)"),t("OutboundLink")],1)]),e._v(" "),t("li",[t("a",{attrs:{href:"https://github.com/litecoin-project/litecoin",target:"_blank",rel:"noopener noreferrer"}},[e._v("LitecoinD"),t("OutboundLink")],1),e._v(" and other coin daemons")]),e._v(" "),t("li",[e._v("And more...")])]),e._v(" "),t("p",[e._v("Note: The setup process can be time consuming, but is heavily automated to make it a fun and easy experience.")]),e._v(" "),t("p",[e._v("Take a look at how BTCPay works in a video below.")]),e._v(" "),t("a",{staticClass:"ytEmbed",staticStyle:{"background-image":"url(https://img.youtube.com/vi/nr0UNbz3AoQ/hqdefault.jpg)"},attrs:{href:"https://www.youtube.com/watch?v=nr0UNbz3AoQ",title:"YouTube","data-id":"nr0UNbz3AoQ"}},[t("iframe",{attrs:{title:"YouTube","data-src":"https://www.youtube-nocookie.com/embed/nr0UNbz3AoQ?&autoplay=1&autohide=1&modestbranding=1&color=white&rel=0",frameborder:"0",allow:"autoplay;encrypted-media;picture-in-picture",allowfullscreen:""}})]),e._v(" "),t("p",[e._v("Here is a presentation of the global architecture at Advancing Bitcoin conference.")]),e._v(" "),t("a",{staticClass:"ytEmbed",staticStyle:{"background-image":"url(https://img.youtube.com/vi/Up0dvorzSNM/hqdefault.jpg)"},attrs:{href:"https://www.youtube.com/watch?v=Up0dvorzSNM",title:"BTCPay - Architecture overview","data-id":"Up0dvorzSNM"}},[t("iframe",{attrs:{title:"BTCPay - Architecture overview","data-src":"https://www.youtube-nocookie.com/embed/Up0dvorzSNM?&autoplay=1&autohide=1&modestbranding=1&color=white&rel=0",frameborder:"0",allow:"autoplay;encrypted-media;picture-in-picture",allowfullscreen:""}})]),e._v(" "),t("h1",{attrs:{id:"full-installation-for-technical-users"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#full-installation-for-technical-users"}},[e._v("#")]),e._v(" Full installation (for technical users)")]),e._v(" "),t("p",[e._v("You can also install BTCPay Server on your own machine or VPS instance.")]),e._v(" "),t("p",[e._v("The officially supported setup is driven by Docker (and Docker-Compose).")]),e._v(" "),t("p",[e._v("First, make sure you have a domain name pointing to your host "),t("code",[e._v("A record")]),e._v(", with ports "),t("code",[e._v("443")]),e._v(" and "),t("code",[e._v("80")]),e._v(" externally accessible. For Lightning Network, port "),t("code",[e._v("9735")]),e._v(" is required ("),t("code",[e._v("9736")]),e._v(" if you use Litecoin Lightning). Otherwise, you will have to set a domain manually by running "),t("code",[e._v("changedomain.sh")]),e._v(".")]),e._v(" "),t("p",[e._v("Let's assume your domain is "),t("code",[e._v("btcpay.EXAMPLE.com")]),e._v(".")]),e._v(" "),t("p",[e._v("The setup below assumes you want to support Bitcoin, Core Lightning (CLN), HTTPS automatically configured by Nginx. It also enables node pruning, which you can "),t("a",{attrs:{href:"#generated-docker-compose"}},[e._v("modify")]),e._v(" or ignore if you have enough disk space for a full node. Finally, your domain is "),t("code",[e._v("btcpay.EXAMPLE.com")]),e._v(" should reflect your actual domain name.")]),e._v(" "),t("p",[t("a",{attrs:{href:"#environment-variables"}},[e._v("Environment variables")]),e._v(" can be tailored to your needs. Some variables require additional storage space.")]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token comment"}},[e._v("# Login as root")]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("sudo")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("su")]),e._v(" -\n\n"),t("span",{pre:!0,attrs:{class:"token comment"}},[e._v("# Create a folder for BTCPay")]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("mkdir")]),e._v(" BTCPayServer\n"),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("cd")]),e._v(" BTCPayServer\n\n"),t("span",{pre:!0,attrs:{class:"token comment"}},[e._v("# Clone this repository")]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("git")]),e._v(" clone https://github.com/btcpayserver/btcpayserver-docker\n"),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("cd")]),e._v(" btcpayserver-docker\n\n"),t("span",{pre:!0,attrs:{class:"token comment"}},[e._v("# Run btcpay-setup.sh with the right parameters")]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("export")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[e._v("BTCPAY_HOST")]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"btcpay.EXAMPLE.com"')]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("export")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[e._v("NBITCOIN_NETWORK")]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"mainnet"')]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("export")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[e._v("BTCPAYGEN_CRYPTO1")]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"btc"')]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("export")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[e._v("BTCPAYGEN_ADDITIONAL_FRAGMENTS")]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"opt-save-storage-s"')]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("export")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[e._v("BTCPAYGEN_REVERSEPROXY")]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"nginx"')]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("export")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[e._v("BTCPAYGEN_LIGHTNING")]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"clightning"')]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("export")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[e._v("BTCPAY_ENABLE_SSH")]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),e._v("true\n"),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v(".")]),e._v(" ./btcpay-setup.sh "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-i")]),e._v("\n\n"),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("exit")]),e._v("\n")])])]),t("p",[t("code",[e._v("btcpay-setup.sh")]),e._v(" will then:")]),e._v(" "),t("ul",[t("li",[e._v("Install Docker")]),e._v(" "),t("li",[e._v("Install Docker-Compose")]),e._v(" "),t("li",[e._v("Make sure BTCPay starts at reboot via upstart or systemd")]),e._v(" "),t("li",[e._v("Setup environment variables to use BTCPay utilities")]),e._v(" "),t("li",[e._v("Add BTCPay utilities in /usr/bin")]),e._v(" "),t("li",[e._v("Start BTCPay Server")])]),e._v(" "),t("p",[e._v("Video below guides you step by step on how to set up BTCPay Server on a VPS with Docker.")]),e._v(" "),t("a",{staticClass:"ytEmbed",staticStyle:{"background-image":"url(https://img.youtube.com/vi/x6hqTFgHqhA/hqdefault.jpg)"},attrs:{href:"https://www.youtube.com/watch?v=x6hqTFgHqhA",title:"YouTube","data-id":"x6hqTFgHqhA"}},[t("iframe",{attrs:{title:"YouTube","data-src":"https://www.youtube-nocookie.com/embed/x6hqTFgHqhA?&autoplay=1&autohide=1&modestbranding=1&color=white&rel=0",frameborder:"0",allow:"autoplay;encrypted-media;picture-in-picture",allowfullscreen:""}})]),e._v(" "),t("p",[e._v("Check out this video if you're interested in learning more about setting up "),t("a",{attrs:{href:"https://www.youtube.com/playlist?list=PLH4m2oS2ratfaprAFx9E3ZDjwxNKvCk4e",target:"_blank",rel:"noopener noreferrer"}},[e._v("BTCPay with Docker Compose"),t("OutboundLink")],1),e._v(".")]),e._v(" "),t("figure",[t("a",{attrs:{href:"https://hub.docker.com/r/btcpayserver/btcpayserver/",target:"_blank",rel:"noopener noreferrer"}},[t("img",{attrs:{src:"https://img.shields.io/docker/automated/btcpayserver/btcpayserver.svg",alt:"Docker automated build",title:"Docker automated build"}}),t("OutboundLink")],1)]),e._v(" "),t("h1",{attrs:{id:"environment-variables"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#environment-variables"}},[e._v("#")]),e._v(" Environment variables")]),e._v(" "),t("p",[t("code",[e._v("btcpay-setup.sh")]),e._v(" will use the following environment variables:")]),e._v(" "),t("ul",[t("li",[t("code",[e._v("BTCPAY_HOST")]),e._v(": The hostname of your website (eg. "),t("code",[e._v("btcpay.example.com")]),e._v(")")]),e._v(" "),t("li",[t("code",[e._v("BTCPAY_ADDITIONAL_HOSTS")]),e._v(": Optional, specify additional domains to your BTCPayServer with https support if enabled. (eg. example2.com,example3.com)")]),e._v(" "),t("li",[t("code",[e._v("REVERSEPROXY_HTTP_PORT")]),e._v(": The public port the reverse proxy binds to for HTTP traffic (default: 80)")]),e._v(" "),t("li",[t("code",[e._v("REVERSEPROXY_HTTPS_PORT")]),e._v(": The public port the reverse proxy binds to for HTTPS traffic (default: 443)")]),e._v(" "),t("li",[t("code",[e._v("REVERSEPROXY_DEFAULT_HOST")]),e._v(": Optional, if using a reverse proxy nginx, specify which website should be presented if the server is accessed by its IP or by an unrecognized domain name.")]),e._v(" "),t("li",[t("code",[e._v("NOREVERSEPROXY_HTTP_PORT")]),e._v(": Optional, if not using a reverse proxy, specify which port should be opened for HTTP traffic. (default: 80)")]),e._v(" "),t("li",[t("code",[e._v("NBITCOIN_NETWORK")]),e._v(": The type of network to use (eg. "),t("code",[e._v("mainnet")]),e._v(", "),t("code",[e._v("testnet")]),e._v(", or "),t("code",[e._v("regtest")]),e._v(". Default: "),t("code",[e._v("mainnet")]),e._v(")")]),e._v(" "),t("li",[t("code",[e._v("LIGHTNING_ALIAS")]),e._v(": An alias for your lightning network node, if used")]),e._v(" "),t("li",[t("code",[e._v("BTCPAYGEN_CRYPTO1")]),e._v(": First supported crypto currency (eg. "),t("code",[e._v("btc")]),e._v(", "),t("code",[e._v("ltc")]),e._v(". Default: "),t("code",[e._v("btc")]),e._v(")")]),e._v(" "),t("li",[t("code",[e._v("BTCPAYGEN_CRYPTO2")]),e._v(": Second supported crypto currency (eg. "),t("code",[e._v("btc")]),e._v(", "),t("code",[e._v("ltc")]),e._v(". Default: "),t("code",[e._v("(empty)")]),e._v(")")]),e._v(" "),t("li",[t("code",[e._v("BTCPAYGEN_CRYPTON")]),e._v(": N'th supported crypto currency where N is 9 at maximum. (eg. "),t("code",[e._v("btc")]),e._v(", "),t("code",[e._v("ltc")]),e._v(". Default: "),t("code",[e._v("(empty)")]),e._v(")")]),e._v(" "),t("li",[t("code",[e._v("BTCPAYGEN_REVERSEPROXY")]),e._v(": Specify reverse proxy to use; NGinx has HTTPS support. (eg. "),t("code",[e._v("nginx")]),e._v(", "),t("code",[e._v("traefik")]),e._v(", "),t("code",[e._v("(empty)")]),e._v(". Default: "),t("code",[e._v("nginx")]),e._v(")")]),e._v(" "),t("li",[t("code",[e._v("BTCPAYGEN_LIGHTNING")]),e._v(": Lightning network implementation to use (eg. "),t("code",[e._v("clightning")]),e._v(", "),t("code",[e._v("lnd")]),e._v(", Default: "),t("code",[e._v("(empty)")]),e._v(")")]),e._v(" "),t("li",[t("code",[e._v("BTCPAYGEN_SUBNAME")]),e._v(": The subname of the generated docker-compose file, where the full name is "),t("code",[e._v("Generated/docker-compose.SUBNAME.yml")]),e._v(" (Default: "),t("code",[e._v("generated")]),e._v(")")]),e._v(" "),t("li",[t("code",[e._v("BTCPAYGEN_ADDITIONAL_FRAGMENTS")]),e._v(": Semicolon-separated list of additional fragments you want to use (eg. "),t("code",[e._v("opt-save-storage")]),e._v(")")]),e._v(" "),t("li",[t("code",[e._v("LETSENCRYPT_EMAIL")]),e._v(": An email will be sent to this address if certificate expires and fails to renew automatically (eg. "),t("code",[e._v("me@example.com")]),e._v(")")]),e._v(" "),t("li",[t("code",[e._v("ACME_CA_URI")]),e._v(": The API endpoint to ask for HTTPS certificate (Default: "),t("code",[e._v("production")]),e._v(")")]),e._v(" "),t("li",[t("code",[e._v("BTCPAY_ENABLE_SSH")]),e._v(": Optional, gives BTCPay Server SSH access to the host by allowing it to edit authorized_keys of the host, it can be used for managing the authorized_keys or updating BTCPay Server directly through the website. (Default: false)")]),e._v(" "),t("li",[t("code",[e._v("BTCPAYGEN_DOCKER_IMAGE")]),e._v(": Optional, Specify which generator image to use if you have customized the C# generator. Set to "),t("code",[e._v("btcpayserver/docker-compose-generator:local")]),e._v(" to build the generator locally at runtime.")]),e._v(" "),t("li",[t("code",[e._v("BTCPAY_IMAGE")]),e._v(": Optional, Specify which btcpayserver image to use if you have a customized btcpayserver.")]),e._v(" "),t("li",[t("code",[e._v("BTCPAYGEN_EXCLUDE_FRAGMENTS")]),e._v(": Semicolon-separated list of fragments you want to forcefully exclude (eg. "),t("code",[e._v("litecoin-clightning")]),e._v(")")]),e._v(" "),t("li",[t("code",[e._v("TOR_RELAY_NICKNAME")]),e._v(": If tor relay is activated with opt-add-tor-relay, the relay nickname")]),e._v(" "),t("li",[t("code",[e._v("TOR_RELAY_EMAIL")]),e._v(": If tor relay is activated with opt-add-tor-relay, the email for Tor to contact you regarding your relay")])]),e._v(" "),t("p",[e._v("Additionally, there are specific environment variables for some addons:")]),e._v(" "),t("ul",[t("li",[t("code",[e._v("LIBREPATRON_HOST")]),e._v(": If libre patron is activated with "),t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver-docker/blob/master/docker-compose-generator/docker-fragments/opt-add-librepatron.yml",target:"_blank",rel:"noopener noreferrer"}},[e._v("opt-add-librepatron"),t("OutboundLink")],1),e._v(", the hostname of your libre patron website (eg. "),t("code",[e._v("librepatron.example.com")]),e._v(")")]),e._v(" "),t("li",[t("code",[e._v("ZAMMAD_HOST")]),e._v(": If zammad is activated with "),t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver-docker/blob/master/docker-compose-generator/docker-fragments/opt-add-zammad.yml",target:"_blank",rel:"noopener noreferrer"}},[e._v("opt-add-zammad"),t("OutboundLink")],1),e._v(", the hostname of your zammad website (eg. "),t("code",[e._v("zammad.example.com")]),e._v(")")]),e._v(" "),t("li",[t("code",[e._v("WOOCOMMERCE_HOST")]),e._v(": If woocommerce is activated with "),t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver-docker/blob/master/docker-compose-generator/docker-fragments/opt-add-woocommerce.yml",target:"_blank",rel:"noopener noreferrer"}},[e._v("opt-add-woocommerce"),t("OutboundLink")],1),e._v(", the hostname of your woocommerce website (eg. "),t("code",[e._v("store.example.com")]),e._v(")")]),e._v(" "),t("li",[t("code",[e._v("EPS_XPUB")]),e._v(": If Electrum Personal Server (EPS) is activated with "),t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver-docker/blob/master/docker-compose-generator/docker-fragments/opt-add-electrum-ps.yml",target:"_blank",rel:"noopener noreferrer"}},[e._v("opt-add-electrum-ps"),t("OutboundLink")],1),e._v(", you must set the Extended Public Key (XPUB, YPUB or ZPUB) of the wallet you want to use, before first run of the EPS server. If you accidently start EPS without this, it will not work properly as the model of EPS is to monitor only specified wallets.")]),e._v(" "),t("li",[e._v("If Bitcoin Wallet Tracker is activated with "),t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver-docker/blob/master/docker-compose-generator/docker-fragments/opt-add-bwt.yml",target:"_blank",rel:"noopener noreferrer"}},[e._v("opt-add-bwt"),t("OutboundLink")],1),e._v(", you can use "),t("code",[e._v("BWT_XPUB")]),e._v("/"),t("code",[e._v("BWT_XPUB_*")]),e._v(" (to set your XPUB/YPUB/ZPUB), "),t("code",[e._v("BWT_DESCRIPTOR")]),e._v("/"),t("code",[e._v("BWT_DESCRIPTOR_*")]),e._v(" (for script descriptors), "),t("code",[e._v("BWT_RESCAN_SINCE")]),e._v(" (set to the wallet creation date in YYYY-MM-DD to speed up the rescan), "),t("code",[e._v("BWT_BITCOIND_WALLET")]),e._v(" and "),t("code",[e._v("BWT_GAP_LIMIT")]),e._v(".")]),e._v(" "),t("li",[t("code",[e._v("LND_WTCLIENT_SWEEP_FEE")]),e._v(": If LND watchtower is activated with "),t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver-docker/blob/master/docker-compose-generator/docker-fragments/opt-lnd-wtclient.yml",target:"_blank",rel:"noopener noreferrer"}},[e._v("opt-lnd-wtclient"),t("OutboundLink")],1),e._v(", you can use "),t("code",[e._v("LND_WTCLIENT_SWEEP_FEE")]),e._v(" to change the sweep fee used in constructing the justice transaction (default is 10 sat/byte)")]),e._v(" "),t("li",[t("code",[e._v("FIREFLY_HOST")]),e._v(": If fireflyiii is activated with "),t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver-docker/blob/master/docker-compose-generator/docker-fragments/opt-add-fireflyiii.yml",target:"_blank",rel:"noopener noreferrer"}},[e._v("opt-add-fireflyiii"),t("OutboundLink")],1),e._v(", the hostname of your fireflyiii website (eg. "),t("code",[e._v("firefly.example.com")]),e._v(")")]),e._v(" "),t("li",[t("code",[e._v("CLOUDFLARE_TUNNEL_TOKEN")]),e._v(": Used to expose your instance to clearnet with a Cloudflare Argo Tunnel (if cloudflare tunnel is activated with "),t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver-docker/blob/master/docker-compose-generator/docker-fragments/opt-add-cloudflared.yml",target:"_blank",rel:"noopener noreferrer"}},[e._v("opt-add-cloudflared"),t("OutboundLink")],1),e._v(", for setup instructions "),t("RouterLink",{attrs:{to:"/Docker/cloudflare-tunnel/"}},[e._v("see documentation")]),e._v(")")],1)]),e._v(" "),t("h1",{attrs:{id:"tooling"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#tooling"}},[e._v("#")]),e._v(" Tooling")]),e._v(" "),t("p",[e._v("A wide variety of useful scripts are available once BTCPay is installed:")]),e._v(" "),t("ul",[t("li",[t("code",[e._v("bitcoin-cli.sh")]),e._v(": Access your Bitcoin node instance (for RPC)")]),e._v(" "),t("li",[t("code",[e._v("bitcoin-lightning-cli.sh")]),e._v(": Access your CLN node instance (for RPC)")]),e._v(" "),t("li",[t("code",[e._v("changedomain.sh")]),e._v(": Change the domain of your BTCPayServer (remember to disable 2FA/U2F first, as you risk being unable to log in to your account)")]),e._v(" "),t("li",[t("code",[e._v("btcpay-update.sh")]),e._v(": Update BTCPayServer to the latest version")]),e._v(" "),t("li",[t("code",[e._v("btcpay-up.sh")]),e._v(": Run "),t("code",[e._v("docker-compose up")])]),e._v(" "),t("li",[t("code",[e._v("btcpay-down.sh")]),e._v(": Run "),t("code",[e._v("docker-compose down")])]),e._v(" "),t("li",[t("code",[e._v("btcpay-setup.sh")]),e._v(": Change the settings of your server")]),e._v(" "),t("li",[t("code",[e._v("btcpay-clean.sh")]),e._v(": Purge any unused docker images")]),e._v(" "),t("li",[t("code",[e._v(". ./btcpay-setup.sh")]),e._v(": Information about additional parameters")]),e._v(" "),t("li",[t("code",[e._v(". ./btcpay-setup.sh -i")]),e._v(": Set up your BTCPayServer")]),e._v(" "),t("li",[t("code",[e._v("btcpay-restart.sh")]),e._v(": Restart your BTCPayServer")])]),e._v(" "),t("h1",{attrs:{id:"under-the-hood"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#under-the-hood"}},[e._v("#")]),e._v(" Under the hood")]),e._v(" "),t("h2",{attrs:{id:"generated-docker-compose"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#generated-docker-compose"}},[e._v("#")]),e._v(" Generated docker-compose")]),e._v(" "),t("p",[e._v("When you run "),t("code",[e._v("btcpay-setup.sh")]),e._v(", your environment variables are used by "),t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver-docker/blob/master/build.sh",target:"_blank",rel:"noopener noreferrer"}},[e._v("build.sh"),t("OutboundLink")],1),e._v(" (or "),t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver-docker/blob/master/build.ps1",target:"_blank",rel:"noopener noreferrer"}},[e._v("build.ps1"),t("OutboundLink")],1),e._v(") to generate a docker-compose adapted for your needs. For the full list of options, see: "),t("a",{attrs:{href:"#environment-variables"}},[e._v("Environment variables")])]),e._v(" "),t("p",[e._v("By default, the generated file is "),t("code",[e._v("Generated/docker-compose.generated.yml")]),e._v(", constructed from the relevant "),t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver-docker/blob/master/docker-compose-generator/docker-fragments",target:"_blank",rel:"noopener noreferrer"}},[e._v("Docker fragments"),t("OutboundLink")],1),e._v(" for your setup.")]),e._v(" "),t("p",[e._v("Available "),t("code",[e._v("BTCPAYGEN_ADDITIONAL_FRAGMENTS")]),e._v(" currently are:")]),e._v(" "),t("ul",[t("li",[t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver-docker/blob/master/docker-compose-generator/docker-fragments/opt-save-storage.yml",target:"_blank",rel:"noopener noreferrer"}},[e._v("opt-save-storage"),t("OutboundLink")],1),e._v(" will keep around 1 year of blocks (prune BTC for 100 GB)")]),e._v(" "),t("li",[t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver-docker/blob/master/docker-compose-generator/docker-fragments/opt-save-storage-s.yml",target:"_blank",rel:"noopener noreferrer"}},[e._v("opt-save-storage-s"),t("OutboundLink")],1),e._v(" will keep around 6 months of blocks (prune BTC for 50 GB)")]),e._v(" "),t("li",[t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver-docker/blob/master/docker-compose-generator/docker-fragments/opt-save-storage-xs.yml",target:"_blank",rel:"noopener noreferrer"}},[e._v("opt-save-storage-xs"),t("OutboundLink")],1),e._v(" will keep around 3 months of blocks (prune BTC for 25 GB)")]),e._v(" "),t("li",[t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver-docker/blob/master/docker-compose-generator/docker-fragments/opt-save-storage-xxs.yml",target:"_blank",rel:"noopener noreferrer"}},[e._v("opt-save-storage-xxs"),t("OutboundLink")],1),e._v(" will keep around 2 weeks of blocks (prune BTC for 5 GB) (lightning not supported)")]),e._v(" "),t("li",[t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver-docker/blob/master/docker-compose-generator/docker-fragments/opt-lnd-autocompact",target:"_blank",rel:"noopener noreferrer"}},[e._v("opt-lnd-autocompact"),t("OutboundLink")],1),e._v(" will activate auto compacting of LND database.")]),e._v(" "),t("li",[t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver-docker/blob/master/docker-compose-generator/docker-fragments/opt-lnd-autopilot.yml",target:"_blank",rel:"noopener noreferrer"}},[e._v("opt-lnd-autopilot"),t("OutboundLink")],1),e._v(" will activate auto pilot on LND. (5 channels, 60% of allocation)")]),e._v(" "),t("li",[t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver-docker/blob/master/docker-compose-generator/docker-fragments/opt-lnd-keysend.yml",target:"_blank",rel:"noopener noreferrer"}},[e._v("opt-lnd-keysend"),t("OutboundLink")],1),e._v(" will activate keysend on LND.")]),e._v(" "),t("li",[t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver-docker/blob/master/docker-compose-generator/docker-fragments/opt-lnd-wtclient.yml",target:"_blank",rel:"noopener noreferrer"}},[e._v("opt-lnd-wtclient"),t("OutboundLink")],1),e._v(" will activate the watchtower client on LND. "),t("code",[e._v("LND_WTCLIENT_SWEEP_FEE")]),e._v(" can be used to override the default 10 sat/byte justice transaction fee")]),e._v(" "),t("li",[t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver-docker/blob/master/docker-compose-generator/docker-fragments/opt-lnd-watchtower.yml",target:"_blank",rel:"noopener noreferrer"}},[e._v("opt-lnd-watchtower"),t("OutboundLink")],1),e._v(" will activate the LND watchtower RPC")]),e._v(" "),t("li",[t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver-docker/blob/master/docker-compose-generator/docker-fragments/opt-save-memory.yml",target:"_blank",rel:"noopener noreferrer"}},[e._v("opt-save-memory"),t("OutboundLink")],1),e._v(" will decrease the default dbcache at the expense of longer synchronization time. (Useful if your machine is less than 2GB)")]),e._v(" "),t("li",[t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver-docker/blob/master/docker-compose-generator/docker-fragments/opt-more-memory.yml",target:"_blank",rel:"noopener noreferrer"}},[e._v("opt-more-memory"),t("OutboundLink")],1),e._v(" will increase the default dbcache to make synchronization faster (Useful if your machine is has around 4GB)")]),e._v(" "),t("li",[t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver-docker/blob/master/docker-compose-generator/docker-fragments/opt-add-btcqbo.yml",target:"_blank",rel:"noopener noreferrer"}},[e._v("opt-add-btcqbo"),t("OutboundLink")],1),e._v(" will allow you to create an invoice on Quickbooks which include a way for your customer to pay on BTCPay Server (More information on this "),t("a",{attrs:{href:"https://github.com/JeffVandrewJr/btcqbo/",target:"_blank",rel:"noopener noreferrer"}},[e._v("github repository"),t("OutboundLink")],1),e._v(", this add-on is maintained by "),t("a",{attrs:{href:"https://github.com/JeffVandrewJr",target:"_blank",rel:"noopener noreferrer"}},[e._v("JeffVandrewJr"),t("OutboundLink")],1),e._v(", see more on "),t("a",{attrs:{href:"https://www.youtube.com/watch?v=srgwL9ozg6c",target:"_blank",rel:"noopener noreferrer"}},[e._v("this video"),t("OutboundLink")],1),e._v(")")]),e._v(" "),t("li",[t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver-docker/blob/master/docker-compose-generator/docker-fragments/opt-add-librepatron.yml",target:"_blank",rel:"noopener noreferrer"}},[e._v("opt-add-librepatron"),t("OutboundLink")],1),e._v(", for a self-hosted Patreon alternative backed by BTCPay (More information on this "),t("a",{attrs:{href:"https://github.com/JeffVandrewJr/patron",target:"_blank",rel:"noopener noreferrer"}},[e._v("github repository"),t("OutboundLink")],1),e._v(", this add-on is maintained by "),t("a",{attrs:{href:"https://github.com/JeffVandrewJr",target:"_blank",rel:"noopener noreferrer"}},[e._v("JeffVandrewJr"),t("OutboundLink")],1),e._v(".")]),e._v(" "),t("li",[t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver-docker/blob/master/docker-compose-generator/docker-fragments/opt-add-woocommerce.yml",target:"_blank",rel:"noopener noreferrer"}},[e._v("opt-add-woocommerce"),t("OutboundLink")],1),e._v(", for a self-hosted woocommerce with BTCPay Server plugin pre installed.")]),e._v(" "),t("li",[t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver-docker/blob/master/docker-compose-generator/docker-fragments/opt-add-tor.yml",target:"_blank",rel:"noopener noreferrer"}},[e._v("opt-add-tor"),t("OutboundLink")],1),e._v(", for exposing BTCPayServer, Woocommerce, your lightning nodes as hidden services and accept onion peers for your full node. Warning: This options is for working around NAT and firewall problems as well as to help protect your customer's privacy. This will not protect your privacy against a targeted attack against you.")]),e._v(" "),t("li",[t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver-docker/blob/master/docker-compose-generator/docker-fragments/opt-add-btctransmuter.yml",target:"_blank",rel:"noopener noreferrer"}},[e._v("opt-add-btctransmuter"),t("OutboundLink")],1),e._v(", for a self-hosted IFTTT style service for crypto services such as fiat settlement. (More information on this "),t("a",{attrs:{href:"https://github.com/btcpayserver/btcTransmuter/",target:"_blank",rel:"noopener noreferrer"}},[e._v("github repository"),t("OutboundLink")],1)]),e._v(" "),t("li",[t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver-docker/blob/master/docker-compose-generator/docker-fragments/opt-txindex.yml",target:"_blank",rel:"noopener noreferrer"}},[e._v("opt-txindex"),t("OutboundLink")],1),e._v(", to enable txindex=1 in bitcoin.conf if you require txindexing for Bisq, DOJO, etc.")]),e._v(" "),t("li",[t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver-docker/blob/master/docker-compose-generator/docker-fragments/opt-expose-unsafe.yml",target:"_blank",rel:"noopener noreferrer"}},[e._v("opt-expose-unsafe"),t("OutboundLink")],1),e._v(", to unsafely expose bitcoind P2P port 8333 if you require P2P for Bisq, DOJO, Esplora, etc. WARNING: ONLY USE ON TRUSTED LAN OR WITH FIREWALL RULES WHITELISTING SPECIFIC HOSTS")]),e._v(" "),t("li",[t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver-docker/blob/master/docker-compose-generator/docker-fragments/opt-add-tor-relay.yml",target:"_blank",rel:"noopener noreferrer"}},[e._v("opt-add-tor-relay"),t("OutboundLink")],1),e._v(", for a non-exit tor relay. Make sure to have port 9001 accessible externally. "),t("a",{attrs:{href:"https://community.torproject.org/relay/community-resources/eff-tor-legal-faq",target:"_blank",rel:"noopener noreferrer"}},[e._v("Please read the legal implications of running a tor relay"),t("OutboundLink")],1),e._v(" and "),t("a",{attrs:{href:"https://trac.torproject.org/projects/tor/wiki/TorRelayGuide#RelayRequirements",target:"_blank",rel:"noopener noreferrer"}},[e._v("what resources are used to operate the relay"),t("OutboundLink")],1),e._v(".")]),e._v(" "),t("li",[t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver-docker/blob/master/docker-compose-generator/docker-fragments/opt-add-electrumx.yml",target:"_blank",rel:"noopener noreferrer"}},[e._v("opt-add-electrumx"),t("OutboundLink")],1),e._v(", to integrate a full ElectrumX server (from official source) with BTCPay, using the BTCPay server's full bitcoin node for complete privacy when using your own Electrum wallet. You can also open port 50002 up to the internet on your router etc, to be part of the ElectrumX network, helping other Electrum wallet users to get connected. The bitcoin option "),t("code",[e._v("-txindex")]),e._v(" is mandatory for ElectrumX, and this fragment will enable it on your BTCPay server automatically - No need to use the fragment opt-txindex.yml.")]),e._v(" "),t("li",[t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver-docker/blob/master/docker-compose-generator/docker-fragments/opt-add-electrum-ps.yml",target:"_blank",rel:"noopener noreferrer"}},[e._v("opt-add-electrum-ps"),t("OutboundLink")],1),e._v(", to integrate Electrum Personal Server (EPS) with BTCPay (EPS is a single-user alternative to the ElectrumX Server option above). EPS will also use the BTCPay server's full bitcoin node for complete privacy when using your own Electrum wallet, for your own personal use (i.e. other users cannot use your server to verify transactions). Also, the bitcoin option "),t("code",[e._v("-txindex")]),e._v(" is NOT mandatory for EPS, and it will run on a pruned node (unlike ElectrumX). You will need to add your XPUB/YPUB/ZPUB as environment variable "),t("code",[e._v("EPS_XPUB")]),e._v(" before enabling EPS for the first time (see above section on environment variables, and see "),t("RouterLink",{attrs:{to:"/ElectrumPersonalServer/"}},[e._v("full documentation")]),e._v(" for details).")],1),e._v(" "),t("li",[t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver-docker/blob/master/docker-compose-generator/docker-fragments/opt-add-bwt.yml",target:"_blank",rel:"noopener noreferrer"}},[e._v("opt-add-electrum-bwt"),t("OutboundLink")],1),e._v(", to integrate the "),t("a",{attrs:{href:"https://github.com/bwt-dev/bwt",target:"_blank",rel:"noopener noreferrer"}},[e._v("Bitcoin Wallet Tracker"),t("OutboundLink")],1),e._v(" Electrum server, which uses a personal wallet index model similar to that of EPS. You will need to set "),t("code",[e._v("BWT_XPUB")]),e._v(" with your XPUB/YPUB/ZPUB (see environment variables section). The server will only be available locally and through an onion service.")]),e._v(" "),t("li",[t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver-docker/blob/master/docker-compose-generator/docker-fragments/opt-add-configurator.yml",target:"_blank",rel:"noopener noreferrer"}},[e._v("opt-add-configurator"),t("OutboundLink")],1),e._v(", to integrate the "),t("a",{attrs:{href:"https://install.btcpayserver.org",target:"_blank",rel:"noopener noreferrer"}},[e._v("BTCPay Server Configurator"),t("OutboundLink")],1),e._v(" to manage your BTCPay deployment through a UI, and to allow new deployments elsewhere easily.")]),e._v(" "),t("li",[t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver-docker/blob/master/docker-compose-generator/docker-fragments/opt-add-pihole.yml",target:"_blank",rel:"noopener noreferrer"}},[e._v("opt-add-pihole"),t("OutboundLink")],1),e._v(" ("),t("RouterLink",{attrs:{to:"/Docker/pihole/"}},[e._v("See the documentation")]),e._v(")")],1),e._v(" "),t("li",[t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver-docker/blob/master/docker-compose-generator/docker-fragments/opt-add-bluewallet-lndhub.yml",target:"_blank",rel:"noopener noreferrer"}},[e._v("opt-add-bluewallet-lndhub"),t("OutboundLink")],1),e._v(" for "),t("a",{attrs:{href:"https://github.com/BlueWallet/LndHub",target:"_blank",rel:"noopener noreferrer"}},[e._v("Bluewallet LNDHub"),t("OutboundLink")],1),e._v(" - Use non-custodial LND Lightning directly from your Bluewallet, and freely let others open accounts on your node. Fragment maintained by "),t("a",{attrs:{href:"https://github.com/maltokyo",target:"_blank",rel:"noopener noreferrer"}},[e._v("maltokyo"),t("OutboundLink")],1),e._v(".")]),e._v(" "),t("li",[t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver-docker/blob/master/docker-compose-generator/docker-fragments/opt-add-ndlc.yml",target:"_blank",rel:"noopener noreferrer"}},[e._v("opt-add-ndlc"),t("OutboundLink")],1),e._v(" ("),t("RouterLink",{attrs:{to:"/Docker/ndlc/"}},[e._v("See the documentation")]),e._v(")")],1),e._v(" "),t("li",[t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver-docker/blob/master/docker-compose-generator/docker-fragments/opt-add-lightning-terminal.yml",target:"_blank",rel:"noopener noreferrer"}},[e._v("opt-add-lightning-terminal"),t("OutboundLink")],1),e._v(" for "),t("a",{attrs:{href:"https://github.com/lightninglabs/lightning-terminal",target:"_blank",rel:"noopener noreferrer"}},[e._v("Lightning Terminal/LiT"),t("OutboundLink")],1),e._v(". Maintained by "),t("a",{attrs:{href:"https://github.com/dennisreimann",target:"_blank",rel:"noopener noreferrer"}},[e._v("dennisreimann"),t("OutboundLink")],1),e._v(".")]),e._v(" "),t("li",[t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver-docker/blob/master/docker-compose-generator/docker-fragments/opt-add-mempool.yml",target:"_blank",rel:"noopener noreferrer"}},[e._v("opt-add-mempool"),t("OutboundLink")],1),e._v(" for "),t("a",{attrs:{href:"https://github.com/mempool/mempool",target:"_blank",rel:"noopener noreferrer"}},[e._v("Mempool"),t("OutboundLink")],1),e._v(". Maintained by "),t("a",{attrs:{href:"https://github.com/dennisreimann",target:"_blank",rel:"noopener noreferrer"}},[e._v("dennisreimann"),t("OutboundLink")],1),e._v(".")]),e._v(" "),t("li",[t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver-docker/blob/master/docker-compose-generator/docker-fragments/opt-add-sphinxrelay.yml",target:"_blank",rel:"noopener noreferrer"}},[e._v("opt-add-sphinxrelay"),t("OutboundLink")],1),e._v(" for "),t("a",{attrs:{href:"https://github.com/stakwork/sphinx-relay",target:"_blank",rel:"noopener noreferrer"}},[e._v("Sphinx Relay"),t("OutboundLink")],1),e._v(". Maintained by "),t("a",{attrs:{href:"https://github.com/dennisreimann",target:"_blank",rel:"noopener noreferrer"}},[e._v("dennisreimann"),t("OutboundLink")],1),e._v(".")]),e._v(" "),t("li",[t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver-docker/blob/master/docker-compose-generator/docker-fragments/opt-add-tallycoin-connect.yml",target:"_blank",rel:"noopener noreferrer"}},[e._v("opt-add-tallycoin-connect"),t("OutboundLink")],1),e._v(" for "),t("a",{attrs:{href:"https://github.com/djbooth007/tallycoin_connect",target:"_blank",rel:"noopener noreferrer"}},[e._v("Tallycoin Connect"),t("OutboundLink")],1),e._v(". Maintained by "),t("a",{attrs:{href:"https://github.com/dennisreimann",target:"_blank",rel:"noopener noreferrer"}},[e._v("dennisreimann"),t("OutboundLink")],1),e._v(".")]),e._v(" "),t("li",[t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver-docker/blob/master/docker-compose-generator/docker-fragments/opt-add-thunderhub.yml",target:"_blank",rel:"noopener noreferrer"}},[e._v("opt-add-thunderhub"),t("OutboundLink")],1),e._v(" for a LND Lightning Node Manager in your Browser. Maintained by "),t("a",{attrs:{href:"https://github.com/apotdevin",target:"_blank",rel:"noopener noreferrer"}},[e._v("apotdevin"),t("OutboundLink")],1),e._v(".")]),e._v(" "),t("li",[t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver-docker/blob/master/docker-compose-generator/docker-fragments/opt-add-teos.yml",target:"_blank",rel:"noopener noreferrer"}},[e._v("opt-add-teos"),t("OutboundLink")],1),e._v(" for "),t("a",{attrs:{href:"https://github.com/talaia-labs/python-teos",target:"_blank",rel:"noopener noreferrer"}},[e._v("The Eye Of Satoshi"),t("OutboundLink")],1),e._v(", a BOLT13 Lightning Watchtower. Use port 9814 on your server or Tor to connect.")]),e._v(" "),t("li",[t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver-docker/blob/master/docker-compose-generator/docker-fragments/opt-add-chatwoot.yml",target:"_blank",rel:"noopener noreferrer"}},[e._v("opt-add-chatwoot"),t("OutboundLink")],1),e._v(" for open source chat support system. ("),t("RouterLink",{attrs:{to:"/Docker/chatwoot/"}},[e._v("See the documentation")]),e._v(")")],1),e._v(" "),t("li",[t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver-docker/blob/master/docker-compose-generator/docker-fragments/opt-add-zammad.yml",target:"_blank",rel:"noopener noreferrer"}},[e._v("opt-add-zammad"),t("OutboundLink")],1),e._v(" for "),t("a",{attrs:{href:"https://zammad.com/features",target:"_blank",rel:"noopener noreferrer"}},[e._v("Zammad"),t("OutboundLink")],1),e._v(", a web based open source helpdesk/customer support system with many features to manage customer communication via several channels like telephone, facebook, twitter, chat and e-mails")]),e._v(" "),t("li",[t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver-docker/blob/master/docker-compose-generator/docker-fragments/opt-monero-expose.yml",target:"_blank",rel:"noopener noreferrer"}},[e._v("opt-monero-expose"),t("OutboundLink")],1),e._v(" to expose monero node's RPC port at 127.0.0.1:18081 to connect your own wallet. Use f.e. ssh port forwarding to forward to your own computer.")]),e._v(" "),t("li",[t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver-docker/blob/master/docker-compose-generator/docker-fragments/opt-add-fireflyiii.yml",target:"_blank",rel:"noopener noreferrer"}},[e._v("opt-add-fireflyiii"),t("OutboundLink")],1),e._v(" ("),t("RouterLink",{attrs:{to:"/Docker/fireflyiii/"}},[e._v("See the documentation")]),e._v(")")],1),e._v(" "),t("li",[t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver-docker/blob/master/docker-compose-generator/docker-fragments/opt-add-joinmarket.yml",target:"_blank",rel:"noopener noreferrer"}},[e._v("opt-add-joinmarket"),t("OutboundLink")],1),e._v(" ("),t("RouterLink",{attrs:{to:"/Docker/joinmarket/"}},[e._v("See the documentation")]),e._v(")")],1),e._v(" "),t("li",[t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver-docker/blob/master/docker-compose-generator/docker-fragments/opt-add-helipad.yml",target:"_blank",rel:"noopener noreferrer"}},[e._v("opt-add-helipad"),t("OutboundLink")],1),e._v(" for "),t("a",{attrs:{href:"https://github.com/Podcastindex-org/helipad",target:"_blank",rel:"noopener noreferrer"}},[e._v("Podcastindex.org Helipad"),t("OutboundLink")],1),e._v(". Requires LND.")]),e._v(" "),t("li",[t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver-docker/blob/master/docker-compose-generator/docker-fragments/opt-add-nostr-relay.yml",target:"_blank",rel:"noopener noreferrer"}},[e._v("opt-add-nostr-relay"),t("OutboundLink")],1),e._v(" for "),t("a",{attrs:{href:"https://github.com/kukks/Nnostr",target:"_blank",rel:"noopener noreferrer"}},[e._v("Nostr Relay"),t("OutboundLink")],1),e._v(".")]),e._v(" "),t("li",[t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver-docker/blob/master/docker-compose-generator/docker-fragments/opt-add-cloudflared.yml",target:"_blank",rel:"noopener noreferrer"}},[e._v("opt-add-cloudflared"),t("OutboundLink")],1),e._v(" to expose your local server on clearnet painlessly ("),t("RouterLink",{attrs:{to:"/Docker/cloudflare-tunnel/"}},[e._v("see documentation")]),e._v(").")],1),e._v(" "),t("li",[t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver-docker/blob/master/docker-compose-generator/docker-fragments/opt-add-torq.yml",target:"_blank",rel:"noopener noreferrer"}},[e._v("opt-add-torq"),t("OutboundLink")],1),e._v(" to install "),t("a",{attrs:{href:"https://github.com/lncapital/torq",target:"_blank",rel:"noopener noreferrer"}},[e._v("Torq"),t("OutboundLink")],1),e._v(" node management application. Requires LND.")])]),e._v(" "),t("p",[e._v("You can also create your own "),t("a",{attrs:{href:"#how-can-i-customize-the-generated-docker-compose-file"}},[e._v("custom fragments")]),e._v(".")]),e._v(" "),t("p",[e._v("If you want to add an option to "),t("code",[e._v("BTCPAYGEN_ADDITIONAL_FRAGMENTS")]),e._v(" and re-configure your install:")]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("export")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[e._v("BTCPAYGEN_ADDITIONAL_FRAGMENTS")]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"'),t("span",{pre:!0,attrs:{class:"token variable"}},[e._v("$BTCPAYGEN_ADDITIONAL_FRAGMENTS")]),e._v(';opt-lnd-autopilot"')]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v(".")]),e._v(" btcpay-setup.sh "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-i")]),e._v("\n")])])]),t("p",[e._v("For example, if you want "),t("code",[e._v("btc")]),e._v(" and "),t("code",[e._v("ltc")]),e._v(" support with "),t("code",[e._v("nginx")]),e._v(" and "),t("code",[e._v("clightning")]),e._v(" inside "),t("code",[e._v("Generated/docker-compose.custom.yml")]),e._v(":")]),e._v(" "),t("p",[e._v("Note: The first run might take a while, but following runs are instantaneous.")]),e._v(" "),t("p",[e._v("On Windows (run in "),t("a",{attrs:{href:"https://docs.microsoft.com/en-us/powershell/scripting/windows-powershell/starting-windows-powershell",target:"_blank",rel:"noopener noreferrer"}},[e._v("powershell"),t("OutboundLink")],1),e._v("):")]),e._v(" "),t("div",{staticClass:"language-powershell extra-class"},[t("pre",{pre:!0,attrs:{class:"language-powershell"}},[t("code",[t("span",{pre:!0,attrs:{class:"token function"}},[e._v("Invoke-Command")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("{")]),e._v("\n "),t("span",{pre:!0,attrs:{class:"token variable"}},[e._v("$BTCPAYGEN_CRYPTO1")]),e._v("="),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"btc"')]),e._v("\n "),t("span",{pre:!0,attrs:{class:"token variable"}},[e._v("$BTCPAYGEN_CRYPTO2")]),e._v("="),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"ltc"')]),e._v("\n "),t("span",{pre:!0,attrs:{class:"token variable"}},[e._v("$BTCPAYGEN_REVERSEPROXY")]),e._v("="),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"nginx"')]),e._v("\n "),t("span",{pre:!0,attrs:{class:"token variable"}},[e._v("$BTCPAYGEN_LIGHTNING")]),e._v("="),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"clightning"')]),e._v("\n "),t("span",{pre:!0,attrs:{class:"token variable"}},[e._v("$BTCPAYGEN_SUBNAME")]),e._v("="),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"custom"')]),e._v("\n "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(".")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(".")]),e._v("\\build"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(".")]),e._v("ps1\n"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("}")]),e._v("\n")])])]),t("p",[e._v("On Linux:")]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[e._v("BTCPAYGEN_CRYPTO1")]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"btc"')]),e._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("\\")]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[e._v("BTCPAYGEN_CRYPTO2")]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"ltc"')]),e._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("\\")]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[e._v("BTCPAYGEN_REVERSEPROXY")]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"nginx"')]),e._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("\\")]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[e._v("BTCPAYGEN_LIGHTNING")]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"clightning"')]),e._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("\\")]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[e._v("BTCPAYGEN_SUBNAME")]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"custom"')]),e._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("\\")]),e._v("\n./build.sh\n")])])]),t("p",[e._v("Next, you will need to configure the runtime environment variables for "),t("code",[e._v("Generated/docker-compose.custom.yml")]),e._v(":")]),e._v(" "),t("ul",[t("li",[e._v("If you are using NGinx, "),t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver-docker/blob/master/Production/README.md",target:"_blank",rel:"noopener noreferrer"}},[e._v("read this"),t("OutboundLink")],1),e._v(".")]),e._v(" "),t("li",[e._v("If you are not using NGinx, "),t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver-docker/blob/master/Production-NoReverseProxy/README.md",target:"_blank",rel:"noopener noreferrer"}},[e._v("read this instead"),t("OutboundLink")],1),e._v(".")])]),e._v(" "),t("h2",{attrs:{id:"again-what-does-btcpay-setupsh-do"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#again-what-does-btcpay-setupsh-do"}},[e._v("#")]),e._v(" Again, what does "),t("code",[e._v("btcpay-setup.sh")]),e._v(" do?")]),e._v(" "),t("p",[t("code",[e._v("btcpay-setup.sh")]),e._v(" is a utility which does the following:")]),e._v(" "),t("ol",[t("li",[e._v("Makes sure docker and docker-compose are installed on your system")]),e._v(" "),t("li",[e._v("Generates a docker-compose via "),t("code",[e._v("./build.sh")])]),e._v(" "),t("li",[e._v("Sets up an "),t("a",{attrs:{href:"https://docs.docker.com/compose/env-file/",target:"_blank",rel:"noopener noreferrer"}},[e._v("Environment File"),t("OutboundLink")],1),e._v(" to configure your docker-compose")]),e._v(" "),t("li",[e._v("Sets up environment variables so the tools described in "),t("a",{attrs:{href:"#tooling"}},[e._v("Tooling")]),e._v(" can work")]),e._v(" "),t("li",[e._v("Adds symlinks of those tools into "),t("code",[e._v("/usr/bin")])]),e._v(" "),t("li",[e._v("Makes sure BTCPay restarts on reboot via upstart or systemd")]),e._v(" "),t("li",[e._v("Starts BTCPay via docker-compose")])]),e._v(" "),t("h2",{attrs:{id:"overview-of-files-generated-by-btcpay-setupsh"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#overview-of-files-generated-by-btcpay-setupsh"}},[e._v("#")]),e._v(" Overview of files generated by "),t("code",[e._v("btcpay-setup.sh")])]),e._v(" "),t("p",[t("code",[e._v("/etc/profile.d/btcpay-env.sh")]),e._v(" ensures that your environment variables are correctly setup when you login, so you can use the tools:")]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("export")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[e._v("BTCPAYGEN_OLD_PREGEN")]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"false"')]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("export")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[e._v("BTCPAYGEN_CRYPTO1")]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"btc"')]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("export")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[e._v("BTCPAYGEN_CRYPTO2")]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('""')]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("export")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[e._v("BTCPAYGEN_CRYPTO3")]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('""')]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("export")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[e._v("BTCPAYGEN_CRYPTO4")]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('""')]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("export")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[e._v("BTCPAYGEN_CRYPTO5")]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('""')]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("export")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[e._v("BTCPAYGEN_CRYPTO6")]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('""')]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("export")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[e._v("BTCPAYGEN_CRYPTO7")]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('""')]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("export")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[e._v("BTCPAYGEN_CRYPTO8")]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('""')]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("export")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[e._v("BTCPAYGEN_CRYPTO9")]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('""')]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("export")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[e._v("BTCPAYGEN_LIGHTNING")]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"clightning"')]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("export")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[e._v("BTCPAYGEN_REVERSEPROXY")]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"nginx"')]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("export")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[e._v("BTCPAYGEN_ADDITIONAL_FRAGMENTS")]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('""')]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("export")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[e._v("BTCPAY_DOCKER_COMPOSE")]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"/var/lib/waagent/custom-script/download/0/btcpayserver-docker/Production/docker-compose.generated.yml"')]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("export")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[e._v("BTCPAY_BASE_DIRECTORY")]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"/var/lib/waagent/custom-script/download/0"')]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("export")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[e._v("BTCPAY_ENV_FILE")]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"/var/lib/waagent/custom-script/download/0/.env"')]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("export")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[e._v("BTCPAY_HOST_SSHKEYFILE")]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"/root/.ssh/id_rsa_btcpay"')]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token keyword"}},[e._v("if")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("cat")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token variable"}},[e._v("$BTCPAY_ENV_FILE")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("&>")]),e._v(" /dev/null"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(";")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token keyword"}},[e._v("then")]),e._v("\n "),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("export")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token variable"}},[t("span",{pre:!0,attrs:{class:"token variable"}},[e._v("$(")]),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("grep")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-v")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[e._v("'^#'")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"'),t("span",{pre:!0,attrs:{class:"token variable"}},[e._v("$BTCPAY_ENV_FILE")]),e._v('"')]),e._v(" "),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("|")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("xargs")]),t("span",{pre:!0,attrs:{class:"token variable"}},[e._v(")")])]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token keyword"}},[e._v("fi")]),e._v("\n")])])]),t("p",[t("code",[e._v("/etc/systemd/system/btcpayserver.service")]),e._v(" ensures that you can control btcpay via "),t("code",[e._v("systemctl")]),e._v(", and that BTCPayServer starts on reboot:")]),e._v(" "),t("div",{staticClass:"language-ini extra-class"},[t("pre",{pre:!0,attrs:{class:"language-ini"}},[t("code",[t("span",{pre:!0,attrs:{class:"token section"}},[t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("[")]),t("span",{pre:!0,attrs:{class:"token section-name selector"}},[e._v("Unit")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("]")])]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token key attr-name"}},[e._v("Description")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("=")]),t("span",{pre:!0,attrs:{class:"token value attr-value"}},[e._v("BTCPayServer service")]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token key attr-name"}},[e._v("After")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("=")]),t("span",{pre:!0,attrs:{class:"token value attr-value"}},[e._v("docker.service network-online.target")]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token key attr-name"}},[e._v("Requires")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("=")]),t("span",{pre:!0,attrs:{class:"token value attr-value"}},[e._v("docker.service network-online.target")]),e._v("\n\n"),t("span",{pre:!0,attrs:{class:"token section"}},[t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("[")]),t("span",{pre:!0,attrs:{class:"token section-name selector"}},[e._v("Service")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("]")])]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token key attr-name"}},[e._v("Type")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("=")]),t("span",{pre:!0,attrs:{class:"token value attr-value"}},[e._v("oneshot")]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token key attr-name"}},[e._v("RemainAfterExit")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("=")]),t("span",{pre:!0,attrs:{class:"token value attr-value"}},[e._v("yes")]),e._v("\n\n"),t("span",{pre:!0,attrs:{class:"token key attr-name"}},[e._v("ExecStart")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("=")]),t("span",{pre:!0,attrs:{class:"token value attr-value"}},[e._v("/bin/bash -c '. /etc/profile.d/btcpay-env.sh && cd \"$BTCPAY_BASE_DIRECTORY/btcpayserver-docker\" && . helpers.sh && btcpay_up'")]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token key attr-name"}},[e._v("ExecStop")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("=")]),t("span",{pre:!0,attrs:{class:"token value attr-value"}},[e._v("/bin/bash -c '. /etc/profile.d/btcpay-env.sh && cd \"$BTCPAY_BASE_DIRECTORY/btcpayserver-docker\" && . helpers.sh && btcpay_down'")]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token key attr-name"}},[e._v("ExecReload")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("=")]),t("span",{pre:!0,attrs:{class:"token value attr-value"}},[e._v("/bin/bash -c '. /etc/profile.d/btcpay-env.sh && cd \"$BTCPAY_BASE_DIRECTORY/btcpayserver-docker\" && . helpers.sh && btcpay_restart'")]),e._v("\n\n"),t("span",{pre:!0,attrs:{class:"token section"}},[t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("[")]),t("span",{pre:!0,attrs:{class:"token section-name selector"}},[e._v("Install")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("]")])]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token key attr-name"}},[e._v("WantedBy")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("=")]),t("span",{pre:!0,attrs:{class:"token value attr-value"}},[e._v("multi-user.target")]),e._v("\n")])])]),t("p",[t("code",[e._v(".env")]),e._v(" ("),t("code",[e._v("$BTCPAY_ENV_FILE")]),e._v(") contains environment variables passed to the containers managed by your docker-compose:")]),e._v(" "),t("div",{staticClass:"language-ini extra-class"},[t("pre",{pre:!0,attrs:{class:"language-ini"}},[t("code",[t("span",{pre:!0,attrs:{class:"token key attr-name"}},[e._v("BTCPAY_HOST")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("=")]),t("span",{pre:!0,attrs:{class:"token value attr-value"}},[e._v("btcpay.EXAMPLE.com")]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token key attr-name"}},[e._v("ACME_CA_URI")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("=")]),t("span",{pre:!0,attrs:{class:"token value attr-value"}},[e._v("production")]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token key attr-name"}},[e._v("NBITCOIN_NETWORK")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("=")]),t("span",{pre:!0,attrs:{class:"token value attr-value"}},[e._v("mainnet")]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token key attr-name"}},[e._v("LETSENCRYPT_EMAIL")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("=")]),t("span",{pre:!0,attrs:{class:"token value attr-value"}},[e._v("me@EXAMPLE.com")]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token key attr-name"}},[e._v("BTCPAY_SSHTRUSTEDFINGERPRINTS")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("=")]),t("span",{pre:!0,attrs:{class:"token value attr-value"}},[e._v("SHA256:eSCD7NtQ/Q6IBl2iRB9caAQ3lDZd8s8iUL6SdeNnhpA")]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token key attr-name"}},[e._v("BTCPAY_SSHKEYFILE")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("=")]),t("span",{pre:!0,attrs:{class:"token value attr-value"}},[e._v("/datadir/id_rsa")]),e._v("\n")])])]),t("h1",{attrs:{id:"how-can-i-add-an-altcoin-to-btcpayserver"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#how-can-i-add-an-altcoin-to-btcpayserver"}},[e._v("#")]),e._v(" How can I add an altcoin to BTCPayServer?")]),e._v(" "),t("ol",[t("li",[e._v("Add support for your crypto to "),t("a",{attrs:{href:"https://github.com/MetacoSA/NBitcoin/tree/master/NBitcoin.Altcoins",target:"_blank",rel:"noopener noreferrer"}},[e._v("NBitcoin"),t("OutboundLink")],1),e._v(", "),t("a",{attrs:{href:"https://github.com/dgarage/NBXplorer",target:"_blank",rel:"noopener noreferrer"}},[e._v("NBxplorer"),t("OutboundLink")],1),e._v(", and "),t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver",target:"_blank",rel:"noopener noreferrer"}},[e._v("BTCPayServer"),t("OutboundLink")],1),e._v(". (Use examples from other coins)")]),e._v(" "),t("li",[e._v("Create your own docker image ("),t("a",{attrs:{href:"https://hub.docker.com/r/nicolasdorier/docker-bitcoin/",target:"_blank",rel:"noopener noreferrer"}},[e._v("Example for BTC"),t("OutboundLink")],1),e._v(")")]),e._v(" "),t("li",[e._v("Create a docker-compose fragment ("),t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver-docker/blob/master/docker-compose-generator/docker-fragments/bitcoin.yml",target:"_blank",rel:"noopener noreferrer"}},[e._v("Example for BTC"),t("OutboundLink")],1),e._v(")")]),e._v(" "),t("li",[e._v("Add your "),t("code",[e._v("CryptoDefinition")]),e._v(" ("),t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver-docker/blob/master/docker-compose-generator/src/CryptoDefinition.cs",target:"_blank",rel:"noopener noreferrer"}},[e._v("Example for BTC"),t("OutboundLink")],1),e._v(")")])]),e._v(" "),t("p",[t("code",[e._v("build.sh")]),e._v(" is using a pre-built image of the "),t("code",[e._v("docker-compose generator")]),e._v(" on "),t("a",{attrs:{href:"https://hub.docker.com/r/btcpayserver/docker-compose-generator/",target:"_blank",rel:"noopener noreferrer"}},[e._v("docker hub"),t("OutboundLink")],1),e._v(".\nIf you modify the code source of "),t("code",[e._v("docker-compose generator")]),e._v(" (for example, the "),t("code",[e._v("CryptoDefinition")]),e._v(" "),t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver-docker/blob/master/docker-compose-generator/src/CryptoDefinition.cs",target:"_blank",rel:"noopener noreferrer"}},[e._v("Example for BTC"),t("OutboundLink")],1),e._v("), you need to configure "),t("code",[e._v("build.sh")]),e._v(" to use your own image by setting the environment variable "),t("code",[e._v("BTCPAYGEN_DOCKER_IMAGE")]),e._v(" to "),t("code",[e._v("btcpayserver/docker-compose-generator:local")]),e._v(".")]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("cd")]),e._v(" docker-compose-generator\n"),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[e._v("BTCPAYGEN_DOCKER_IMAGE")]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"btcpayserver/docker-compose-generator:local"')]),e._v("\n")])])]),t("p",[e._v("Or on powershell:")]),e._v(" "),t("div",{staticClass:"language-powershell extra-class"},[t("pre",{pre:!0,attrs:{class:"language-powershell"}},[t("code",[e._v("cd docker-compose-generator\n"),t("span",{pre:!0,attrs:{class:"token variable"}},[e._v("$BTCPAYGEN_DOCKER_IMAGE")]),e._v("="),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"btcpayserver/docker-compose-generator:local"')]),e._v("\n")])])]),t("p",[e._v("Then run "),t("code",[e._v("./build.sh")]),e._v(" or "),t("code",[e._v(". .\\build.ps1")]),e._v(".\nThis will generate your docker-compose in the "),t("code",[e._v("Generated")]),e._v(" folder, which you can then run and test.")]),e._v(" "),t("p",[e._v("Note that BTCPayServer developers will not spend excessive time testing your image, so make sure it works.")]),e._v(" "),t("h1",{attrs:{id:"support"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#support"}},[e._v("#")]),e._v(" Support")]),e._v(" "),t("table",[t("thead",[t("tr",[t("th",[e._v("Image")]),e._v(" "),t("th",[e._v("Version")]),e._v(" "),t("th",{staticStyle:{"text-align":"center"}},[e._v("x64")]),e._v(" "),t("th",{staticStyle:{"text-align":"center"}},[e._v("arm32v7")]),e._v(" "),t("th",{staticStyle:{"text-align":"center"}},[e._v("arm64v8")]),e._v(" "),t("th",{staticStyle:{"text-align":"center"}},[e._v("links")])])]),e._v(" "),t("tbody",[t("tr",[t("td",[e._v("btcpayserver/docker-compose-generator")]),e._v(" "),t("td",[e._v("latest")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/btcpayserver/btcpayserver-docker/dcg-latest/docker-compose-generator/linuxamd64.Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[e._v("✔️"),t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/btcpayserver/btcpayserver-docker/dcg-latest/docker-compose-generator/linuxarm32v7.Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[e._v("✔️"),t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/btcpayserver/btcpayserver-docker/dcg-latest/docker-compose-generator/linuxarm64v8.Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[e._v("✔️"),t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver-docker",target:"_blank",rel:"noopener noreferrer"}},[e._v("Github"),t("OutboundLink")],1),e._v(" - "),t("a",{attrs:{href:"https://hub.docker.com/r/btcpayserver/docker-compose-generator",target:"_blank",rel:"noopener noreferrer"}},[e._v("DockerHub"),t("OutboundLink")],1)])]),e._v(" "),t("tr",[t("td",[e._v("btcpayserver/docker-compose")]),e._v(" "),t("td",[e._v("1.28.6")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/btcpayserver/dockerfile-deps/docker-compose/1.28.6/docker-compose/1.28.6/linuxamd64.Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[e._v("✔️"),t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/btcpayserver/dockerfile-deps/docker-compose/1.28.6/docker-compose/1.28.6/linuxarm32v7.Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[e._v("✔️"),t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/btcpayserver/dockerfile-deps/docker-compose/1.28.6/docker-compose/1.28.6/linuxarm64v8.Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[e._v("✔️"),t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://github.com/btcpayserver/dockerfile-deps",target:"_blank",rel:"noopener noreferrer"}},[e._v("Github"),t("OutboundLink")],1),e._v(" - "),t("a",{attrs:{href:"https://hub.docker.com/r/btcpayserver/docker-compose",target:"_blank",rel:"noopener noreferrer"}},[e._v("DockerHub"),t("OutboundLink")],1)])]),e._v(" "),t("tr",[t("td",[e._v("btcpayserver/lightning")]),e._v(" "),t("td",[e._v("v23.08")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/btcpayserver/lightning/basedon-v23.08/Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[e._v("✔️"),t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/btcpayserver/lightning/basedon-v23.08/contrib/docker/linuxarm32v7.Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[e._v("✔️"),t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/btcpayserver/lightning/basedon-v23.08/contrib/docker/linuxarm64v8.Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[e._v("✔️"),t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://github.com/btcpayserver/lightning",target:"_blank",rel:"noopener noreferrer"}},[e._v("Github"),t("OutboundLink")],1),e._v(" - "),t("a",{attrs:{href:"https://hub.docker.com/r/btcpayserver/lightning",target:"_blank",rel:"noopener noreferrer"}},[e._v("DockerHub"),t("OutboundLink")],1)])]),e._v(" "),t("tr",[t("td",[e._v("saubyk/c-lightning-rest")]),e._v(" "),t("td",[e._v("0.10.6")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/Ride-The-Lightning/c-lightning-REST/v0.10.6/amd64.Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[e._v("✔️"),t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/Ride-The-Lightning/c-lightning-REST/v0.10.6/arm32v7.Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[e._v("✔️"),t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/Ride-The-Lightning/c-lightning-REST/v0.10.6/arm64v8.Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[e._v("✔️"),t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://github.com/Ride-The-Lightning/c-lightning-REST",target:"_blank",rel:"noopener noreferrer"}},[e._v("Github"),t("OutboundLink")],1),e._v(" - "),t("a",{attrs:{href:"https://hub.docker.com/r/saubyk/c-lightning-rest",target:"_blank",rel:"noopener noreferrer"}},[e._v("DockerHub"),t("OutboundLink")],1)])]),e._v(" "),t("tr",[t("td",[e._v("shahanafarooqui/rtl")]),e._v(" "),t("td",[e._v("0.14.1")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/Ride-The-Lightning/RTL/v0.14.1/dockerfiles/Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[e._v("✔️"),t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/Ride-The-Lightning/RTL/v0.14.1/dockerfiles/Dockerfile.arm32v7",target:"_blank",rel:"noopener noreferrer"}},[e._v("✔️"),t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/Ride-The-Lightning/RTL/v0.14.1/dockerfiles/Dockerfile.arm64v8",target:"_blank",rel:"noopener noreferrer"}},[e._v("✔️"),t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://github.com/Ride-The-Lightning/RTL",target:"_blank",rel:"noopener noreferrer"}},[e._v("Github"),t("OutboundLink")],1),e._v(" - "),t("a",{attrs:{href:"https://hub.docker.com/r/shahanafarooqui/rtl",target:"_blank",rel:"noopener noreferrer"}},[e._v("DockerHub"),t("OutboundLink")],1)])]),e._v(" "),t("tr",[t("td",[e._v("btcpayserver/lnd")]),e._v(" "),t("td",[e._v("v0.17.2-beta")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/btcpayserver/lnd/basedon-v0.17.2-beta/linuxamd64.Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[e._v("✔️"),t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/btcpayserver/lnd/basedon-v0.17.2-beta/linuxarm32v7.Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[e._v("✔️"),t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/btcpayserver/lnd/basedon-v0.17.2-beta/linuxarm64v8.Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[e._v("✔️"),t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://github.com/btcpayserver/lnd",target:"_blank",rel:"noopener noreferrer"}},[e._v("Github"),t("OutboundLink")],1),e._v(" - "),t("a",{attrs:{href:"https://hub.docker.com/r/btcpayserver/lnd",target:"_blank",rel:"noopener noreferrer"}},[e._v("DockerHub"),t("OutboundLink")],1)])]),e._v(" "),t("tr",[t("td",[e._v("btcpayserver/bitcoin")]),e._v(" "),t("td",[e._v("25.0")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/btcpayserver/dockerfile-deps/Bitcoin/25.0/Bitcoin/25.0/linuxamd64.Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[e._v("✔️"),t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/btcpayserver/dockerfile-deps/Bitcoin/25.0/Bitcoin/25.0/linuxarm32v7.Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[e._v("✔️"),t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/btcpayserver/dockerfile-deps/Bitcoin/25.0/Bitcoin/25.0/linuxarm64v8.Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[e._v("✔️"),t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://github.com/btcpayserver/dockerfile-deps",target:"_blank",rel:"noopener noreferrer"}},[e._v("Github"),t("OutboundLink")],1),e._v(" - "),t("a",{attrs:{href:"https://hub.docker.com/r/btcpayserver/bitcoin",target:"_blank",rel:"noopener noreferrer"}},[e._v("DockerHub"),t("OutboundLink")],1)])]),e._v(" "),t("tr",[t("td",[e._v("btcpayserver/btcpayserver")]),e._v(" "),t("td",[e._v("1.11.7$?")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/btcpayserver/btcpayserver/v1.11.7/amd64.Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[e._v("✔️"),t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/btcpayserver/btcpayserver/v1.11.7/arm32v7.Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[e._v("✔️"),t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/btcpayserver/btcpayserver/v1.11.7/arm64v8.Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[e._v("✔️"),t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver",target:"_blank",rel:"noopener noreferrer"}},[e._v("Github"),t("OutboundLink")],1),e._v(" - "),t("a",{attrs:{href:"https://hub.docker.com/r/btcpayserver/btcpayserver",target:"_blank",rel:"noopener noreferrer"}},[e._v("DockerHub"),t("OutboundLink")],1)])]),e._v(" "),t("tr",[t("td",[e._v("btcpayserver/monero")]),e._v(" "),t("td",[e._v("0.18.3.1")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/btcpayserver/dockerfile-deps/Monero/0.18.3.1/Monero/0.18.3.1/linuxamd64.Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[e._v("✔️"),t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/btcpayserver/dockerfile-deps/Monero/0.18.3.1/Monero/0.18.3.1/linuxarm32v7.Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[e._v("✔️"),t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/btcpayserver/dockerfile-deps/Monero/0.18.3.1/Monero/0.18.3.1/linuxarm64v8.Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[e._v("✔️"),t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://github.com/btcpayserver/dockerfile-deps",target:"_blank",rel:"noopener noreferrer"}},[e._v("Github"),t("OutboundLink")],1),e._v(" - "),t("a",{attrs:{href:"https://hub.docker.com/r/btcpayserver/monero",target:"_blank",rel:"noopener noreferrer"}},[e._v("DockerHub"),t("OutboundLink")],1)])]),e._v(" "),t("tr",[t("td",[e._v("nicolasdorier/nbxplorer")]),e._v(" "),t("td",[e._v("2.4.0")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/dgarage/nbxplorer/v2.4.0/Dockerfile.linuxamd64",target:"_blank",rel:"noopener noreferrer"}},[e._v("✔️"),t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/dgarage/nbxplorer/v2.4.0/Dockerfile.linuxarm32v7",target:"_blank",rel:"noopener noreferrer"}},[e._v("✔️"),t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/dgarage/nbxplorer/v2.4.0/Dockerfile.linuxarm64v8",target:"_blank",rel:"noopener noreferrer"}},[e._v("✔️"),t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://github.com/dgarage/nbxplorer",target:"_blank",rel:"noopener noreferrer"}},[e._v("Github"),t("OutboundLink")],1),e._v(" - "),t("a",{attrs:{href:"https://hub.docker.com/r/nicolasdorier/nbxplorer",target:"_blank",rel:"noopener noreferrer"}},[e._v("DockerHub"),t("OutboundLink")],1)])]),e._v(" "),t("tr",[t("td",[e._v("btcpayserver/letsencrypt-nginx-proxy-companion")]),e._v(" "),t("td",[e._v("1.12.2")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/btcpayserver/docker-letsencrypt-nginx-proxy-companion/v1.12.2/linuxamd64.Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[e._v("✔️"),t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/btcpayserver/docker-letsencrypt-nginx-proxy-companion/v1.12.2/linuxarm32v7.Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[e._v("✔️"),t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/btcpayserver/docker-letsencrypt-nginx-proxy-companion/v1.12.2/linuxarm64v8.Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[e._v("✔️"),t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://github.com/btcpayserver/docker-letsencrypt-nginx-proxy-companion",target:"_blank",rel:"noopener noreferrer"}},[e._v("Github"),t("OutboundLink")],1),e._v(" - "),t("a",{attrs:{href:"https://hub.docker.com/r/btcpayserver/letsencrypt-nginx-proxy-companion",target:"_blank",rel:"noopener noreferrer"}},[e._v("DockerHub"),t("OutboundLink")],1)])]),e._v(" "),t("tr",[t("td",[e._v("nginx")]),e._v(" "),t("td",[e._v("1.23.3")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/nginxinc/docker-nginx/1.23.2/stable/debian/Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[e._v("✔️"),t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/nginxinc/docker-nginx/1.23.2/stable/debian/Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[e._v("✔️"),t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/nginxinc/docker-nginx/1.23.2/stable/debian/Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[e._v("✔️"),t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://github.com/nginxinc/docker-nginx",target:"_blank",rel:"noopener noreferrer"}},[e._v("Github"),t("OutboundLink")],1),e._v(" - "),t("a",{attrs:{href:"https://hub.docker.com/_/nginx",target:"_blank",rel:"noopener noreferrer"}},[e._v("DockerHub"),t("OutboundLink")],1)])]),e._v(" "),t("tr",[t("td",[e._v("btcpayserver/docker-gen")]),e._v(" "),t("td",[e._v("0.7.8")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/btcpayserver/docker-gen/v0.7.8/linuxamd64.Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[e._v("✔️"),t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/btcpayserver/docker-gen/v0.7.8/linuxarm32v7.Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[e._v("✔️"),t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/btcpayserver/docker-gen/v0.7.8/linuxarm64v8.Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[e._v("✔️"),t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://github.com/btcpayserver/docker-gen",target:"_blank",rel:"noopener noreferrer"}},[e._v("Github"),t("OutboundLink")],1),e._v(" - "),t("a",{attrs:{href:"https://hub.docker.com/r/btcpayserver/docker-gen",target:"_blank",rel:"noopener noreferrer"}},[e._v("DockerHub"),t("OutboundLink")],1)])]),e._v(" "),t("tr",[t("td",[e._v("btcpayserver/btctransmuter")]),e._v(" "),t("td",[e._v("0.0.59")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/btcpayserver/btctransmuter/v0.0.59/Dockerfiles/amd64.Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[e._v("✔️"),t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/btcpayserver/btctransmuter/v0.0.59/Dockerfiles/arm32v7.Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[e._v("✔️"),t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/btcpayserver/btctransmuter/v0.0.59/Dockerfiles/arm64v8.Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[e._v("✔️"),t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://github.com/btcpayserver/btctransmuter",target:"_blank",rel:"noopener noreferrer"}},[e._v("Github"),t("OutboundLink")],1),e._v(" - "),t("a",{attrs:{href:"https://hub.docker.com/r/btcpayserver/btctransmuter",target:"_blank",rel:"noopener noreferrer"}},[e._v("DockerHub"),t("OutboundLink")],1)])]),e._v(" "),t("tr",[t("td",[e._v("btcpayserver/cloudflared")]),e._v(" "),t("td",[e._v("2023.7.3")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/btcpayserver/dockerfile-deps/Cloudflared/2023.7.3/Cloudflared/2023.7.3/linuxamd64.Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[e._v("✔️"),t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/btcpayserver/dockerfile-deps/Cloudflared/2023.7.3/Cloudflared/2023.7.3/linuxarm32v7.Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[e._v("✔️"),t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/btcpayserver/dockerfile-deps/Cloudflared/2023.7.3/Cloudflared/2023.7.3/linuxarm64v8.Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[e._v("✔️"),t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://github.com/btcpayserver/dockerfile-deps",target:"_blank",rel:"noopener noreferrer"}},[e._v("Github"),t("OutboundLink")],1),e._v(" - "),t("a",{attrs:{href:"https://hub.docker.com/r/btcpayserver/cloudflared",target:"_blank",rel:"noopener noreferrer"}},[e._v("DockerHub"),t("OutboundLink")],1)])]),e._v(" "),t("tr",[t("td",[e._v("btcpayserver/btcpayserver-configurator")]),e._v(" "),t("td",[e._v("0.0.21")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/btcpayserver/btcpayserver-configurator/v0.0.21/Dockerfiles/amd64.Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[e._v("✔️"),t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/btcpayserver/btcpayserver-configurator/v0.0.21/Dockerfiles/arm32v7.Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[e._v("✔️"),t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/btcpayserver/btcpayserver-configurator/v0.0.21/Dockerfiles/arm64v8.Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[e._v("✔️"),t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver-configurator",target:"_blank",rel:"noopener noreferrer"}},[e._v("Github"),t("OutboundLink")],1),e._v(" - "),t("a",{attrs:{href:"https://hub.docker.com/r/btcpayserver/btcpayserver-configurator",target:"_blank",rel:"noopener noreferrer"}},[e._v("DockerHub"),t("OutboundLink")],1)])]),e._v(" "),t("tr",[t("td",[e._v("btcpayserver/eps")]),e._v(" "),t("td",[e._v("0.2.2")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/btcpayserver/dockerfile-deps/EPS/0.2.2/EPS/0.2.2/linuxamd64.Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[e._v("✔️"),t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/btcpayserver/dockerfile-deps/EPS/0.2.2/EPS/0.2.2/linuxarm32v7.Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[e._v("✔️"),t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/btcpayserver/dockerfile-deps/EPS/0.2.2/EPS/0.2.2/linuxarm64v8.Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[e._v("✔️"),t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://github.com/btcpayserver/dockerfile-deps",target:"_blank",rel:"noopener noreferrer"}},[e._v("Github"),t("OutboundLink")],1),e._v(" - "),t("a",{attrs:{href:"https://hub.docker.com/r/btcpayserver/eps",target:"_blank",rel:"noopener noreferrer"}},[e._v("DockerHub"),t("OutboundLink")],1)])]),e._v(" "),t("tr",[t("td",[e._v("btcpayserver/joinmarket")]),e._v(" "),t("td",[e._v("0.9.5")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/btcpayserver/dockerfile-deps/JoinMarket/0.9.5/JoinMarket/0.9.5/linuxamd64.Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[e._v("✔️"),t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/btcpayserver/dockerfile-deps/JoinMarket/0.9.5/JoinMarket/0.9.5/linuxarm32v7.Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[e._v("✔️"),t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/btcpayserver/dockerfile-deps/JoinMarket/0.9.5/JoinMarket/0.9.5/linuxarm64v8.Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[e._v("✔️"),t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://github.com/btcpayserver/dockerfile-deps",target:"_blank",rel:"noopener noreferrer"}},[e._v("Github"),t("OutboundLink")],1),e._v(" - "),t("a",{attrs:{href:"https://hub.docker.com/r/btcpayserver/joinmarket",target:"_blank",rel:"noopener noreferrer"}},[e._v("DockerHub"),t("OutboundLink")],1)])]),e._v(" "),t("tr",[t("td",[e._v("nicolasdorier/ndlc-cli")]),e._v(" "),t("td",[e._v("1.0.1")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/dgarage/ndlc/releases/1.0.1/amd64.Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[e._v("✔️"),t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/dgarage/ndlc/releases/1.0.1/arm32v7.Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[e._v("✔️"),t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/dgarage/ndlc/releases/1.0.1/arm64v8.Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[e._v("✔️"),t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://github.com/dgarage/ndlc",target:"_blank",rel:"noopener noreferrer"}},[e._v("Github"),t("OutboundLink")],1),e._v(" - "),t("a",{attrs:{href:"https://hub.docker.com/r/nicolasdorier/ndlc-cli",target:"_blank",rel:"noopener noreferrer"}},[e._v("DockerHub"),t("OutboundLink")],1)])]),e._v(" "),t("tr",[t("td",[e._v("pihole/pihole")]),e._v(" "),t("td",[e._v("2023.05.2")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/pi-hole/docker-pi-hole/2023.05.2/src/Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[e._v("✔️"),t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/pi-hole/docker-pi-hole/2023.05.2/src/Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[e._v("✔️"),t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/pi-hole/docker-pi-hole/2023.05.2/src/Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[e._v("✔️"),t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://github.com/pi-hole/docker-pi-hole",target:"_blank",rel:"noopener noreferrer"}},[e._v("Github"),t("OutboundLink")],1),e._v(" - "),t("a",{attrs:{href:"https://hub.docker.com/r/pihole/pihole",target:"_blank",rel:"noopener noreferrer"}},[e._v("DockerHub"),t("OutboundLink")],1)])]),e._v(" "),t("tr",[t("td",[e._v("btcpayserver/tor")]),e._v(" "),t("td",[e._v("0.4.7.10")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/btcpayserver/dockerfile-deps/Tor/0.4.7.10/Tor/0.4.7.10/linuxamd64.Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[e._v("✔️"),t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/btcpayserver/dockerfile-deps/Tor/0.4.7.10/Tor/0.4.7.10/linuxarm32v7.Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[e._v("✔️"),t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/btcpayserver/dockerfile-deps/Tor/0.4.7.10/Tor/0.4.7.10/linuxarm64v8.Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[e._v("✔️"),t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://github.com/btcpayserver/dockerfile-deps",target:"_blank",rel:"noopener noreferrer"}},[e._v("Github"),t("OutboundLink")],1),e._v(" - "),t("a",{attrs:{href:"https://hub.docker.com/r/btcpayserver/tor",target:"_blank",rel:"noopener noreferrer"}},[e._v("DockerHub"),t("OutboundLink")],1)])]),e._v(" "),t("tr",[t("td",[e._v("btcpayserver/woocommerce")]),e._v(" "),t("td",[e._v("3.1.0")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/btcpayserver/dockerfile-deps/WooCommerce/3.1.0/WooCommerce/3.1.0/linuxamd64.Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[e._v("✔️"),t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[e._v("️❌")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/btcpayserver/dockerfile-deps/WooCommerce/3.1.0/WooCommerce/3.1.0/linuxarm64v8.Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[e._v("✔️"),t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://github.com/btcpayserver/dockerfile-deps",target:"_blank",rel:"noopener noreferrer"}},[e._v("Github"),t("OutboundLink")],1),e._v(" - "),t("a",{attrs:{href:"https://hub.docker.com/r/btcpayserver/woocommerce",target:"_blank",rel:"noopener noreferrer"}},[e._v("DockerHub"),t("OutboundLink")],1)])]),e._v(" "),t("tr",[t("td",[e._v("btcpayserver/postgres")]),e._v(" "),t("td",[e._v("13.13")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/btcpayserver/dockerfile-deps/Postgres/13.13/Postgres/13.13/linuxamd64.Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[e._v("✔️"),t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/btcpayserver/dockerfile-deps/Postgres/13.13/Postgres/13.13/linuxarm32v7.Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[e._v("✔️"),t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/btcpayserver/dockerfile-deps/Postgres/13.13/Postgres/13.13/linuxarm64v8.Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[e._v("✔️"),t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://github.com/btcpayserver/dockerfile-deps",target:"_blank",rel:"noopener noreferrer"}},[e._v("Github"),t("OutboundLink")],1),e._v(" - "),t("a",{attrs:{href:"https://hub.docker.com/r/btcpayserver/postgres",target:"_blank",rel:"noopener noreferrer"}},[e._v("DockerHub"),t("OutboundLink")],1)])]),e._v(" "),t("tr",[t("td",[e._v("kamigawabul/btglnd")]),e._v(" "),t("td",[e._v("latest")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/vutov/lnd/master/Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[e._v("✔️"),t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[e._v("️❌")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[e._v("️❌")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://github.com/vutov/lnd",target:"_blank",rel:"noopener noreferrer"}},[e._v("Github"),t("OutboundLink")],1),e._v(" - "),t("a",{attrs:{href:"https://hub.docker.com/r/kamigawabul/btglnd",target:"_blank",rel:"noopener noreferrer"}},[e._v("DockerHub"),t("OutboundLink")],1)])]),e._v(" "),t("tr",[t("td",[e._v("kamigawabul/docker-bitcoingold")]),e._v(" "),t("td",[e._v("0.15.2")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/Vutov/docker-bitcoin/master/bitcoingold/0.15.2/Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[e._v("✔️"),t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[e._v("️❌")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[e._v("️❌")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://github.com/Vutov/docker-bitcoin",target:"_blank",rel:"noopener noreferrer"}},[e._v("Github"),t("OutboundLink")],1),e._v(" - "),t("a",{attrs:{href:"https://hub.docker.com/r/kamigawabul/docker-bitcoingold",target:"_blank",rel:"noopener noreferrer"}},[e._v("DockerHub"),t("OutboundLink")],1)])]),e._v(" "),t("tr",[t("td",[e._v("acinq/eclair")]),e._v(" "),t("td",[e._v("release-0.7.0")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/ACINQ/eclair/v0.7.0/Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[e._v("✔️"),t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[e._v("️❌")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[e._v("️❌")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://github.com/ACINQ/eclair",target:"_blank",rel:"noopener noreferrer"}},[e._v("Github"),t("OutboundLink")],1),e._v(" - "),t("a",{attrs:{href:"https://hub.docker.com/r/acinq/eclair",target:"_blank",rel:"noopener noreferrer"}},[e._v("DockerHub"),t("OutboundLink")],1)])]),e._v(" "),t("tr",[t("td",[e._v("chekaz/docker-bitcoinplus")]),e._v(" "),t("td",[e._v("2.7.0")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/ChekaZ/docker/master/bitcoinplus/2.7.0/Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[e._v("✔️"),t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[e._v("️❌")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[e._v("️❌")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://github.com/ChekaZ/docker",target:"_blank",rel:"noopener noreferrer"}},[e._v("Github"),t("OutboundLink")],1),e._v(" - "),t("a",{attrs:{href:"https://hub.docker.com/r/chekaz/docker-bitcoinplus",target:"_blank",rel:"noopener noreferrer"}},[e._v("DockerHub"),t("OutboundLink")],1)])]),e._v(" "),t("tr",[t("td",[e._v("dalijolijo/docker-bitcore")]),e._v(" "),t("td",[e._v("0.90.9.10")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/dalijolijo/btcpayserver-docker-bitcore/master/docker-bitcored/Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[e._v("✔️"),t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[e._v("️❌")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[e._v("️❌")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://github.com/dalijolijo/btcpayserver-docker-bitcore",target:"_blank",rel:"noopener noreferrer"}},[e._v("Github"),t("OutboundLink")],1),e._v(" - "),t("a",{attrs:{href:"https://hub.docker.com/r/dalijolijo/docker-bitcore",target:"_blank",rel:"noopener noreferrer"}},[e._v("DockerHub"),t("OutboundLink")],1)])]),e._v(" "),t("tr",[t("td",[e._v("btcpayserver/dash")]),e._v(" "),t("td",[e._v("19.2.0")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/btcpayserver/dockerfile-deps/Dash/19.2.0/Dash/19.2.0/linuxamd64.Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[e._v("✔️"),t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[e._v("️❌")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/btcpayserver/dockerfile-deps/Dash/19.2.0/Dash/19.2.0/linuxarm64v8.Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[e._v("✔️"),t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://github.com/btcpayserver/dockerfile-deps",target:"_blank",rel:"noopener noreferrer"}},[e._v("Github"),t("OutboundLink")],1),e._v(" - "),t("a",{attrs:{href:"https://hub.docker.com/r/btcpayserver/dash",target:"_blank",rel:"noopener noreferrer"}},[e._v("DockerHub"),t("OutboundLink")],1)])]),e._v(" "),t("tr",[t("td",[e._v("btcpayserver/dogecoin")]),e._v(" "),t("td",[e._v("1.14.6")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/btcpayserver/dockerfile-deps/Dogecoin/1.14.6/Dogecoin/1.14.6/linuxamd64.Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[e._v("✔️"),t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[e._v("️❌")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[e._v("️❌")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://github.com/btcpayserver/dockerfile-deps",target:"_blank",rel:"noopener noreferrer"}},[e._v("Github"),t("OutboundLink")],1),e._v(" - "),t("a",{attrs:{href:"https://hub.docker.com/r/btcpayserver/dogecoin",target:"_blank",rel:"noopener noreferrer"}},[e._v("DockerHub"),t("OutboundLink")],1)])]),e._v(" "),t("tr",[t("td",[e._v("chekaz/docker-feathercoin")]),e._v(" "),t("td",[e._v("0.16.3")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/ChekaZ/docker/master/feathercoin/0.16.3/Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[e._v("✔️"),t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[e._v("️❌")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[e._v("️❌")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://github.com/ChekaZ/docker",target:"_blank",rel:"noopener noreferrer"}},[e._v("Github"),t("OutboundLink")],1),e._v(" - "),t("a",{attrs:{href:"https://hub.docker.com/r/chekaz/docker-feathercoin",target:"_blank",rel:"noopener noreferrer"}},[e._v("DockerHub"),t("OutboundLink")],1)])]),e._v(" "),t("tr",[t("td",[e._v("groestlcoin/lightning")]),e._v(" "),t("td",[e._v("v23.05")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/Groestlcoin/lightning/v23.05/Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[e._v("✔️"),t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[e._v("️❌")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[e._v("️❌")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://github.com/Groestlcoin/lightning",target:"_blank",rel:"noopener noreferrer"}},[e._v("Github"),t("OutboundLink")],1),e._v(" - "),t("a",{attrs:{href:"https://hub.docker.com/r/groestlcoin/lightning",target:"_blank",rel:"noopener noreferrer"}},[e._v("DockerHub"),t("OutboundLink")],1)])]),e._v(" "),t("tr",[t("td",[e._v("groestlcoin/groestlcoin-lightning-charge")]),e._v(" "),t("td",[e._v("version-0.4.22")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/Groestlcoin/groestlcoin-lightning-charge/v0.4.22/Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[e._v("✔️"),t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[e._v("️❌")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[e._v("️❌")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://github.com/Groestlcoin/groestlcoin-lightning-charge",target:"_blank",rel:"noopener noreferrer"}},[e._v("Github"),t("OutboundLink")],1),e._v(" - "),t("a",{attrs:{href:"https://hub.docker.com/r/groestlcoin/groestlcoin-lightning-charge",target:"_blank",rel:"noopener noreferrer"}},[e._v("DockerHub"),t("OutboundLink")],1)])]),e._v(" "),t("tr",[t("td",[e._v("groestlcoin/groestlcoin-spark")]),e._v(" "),t("td",[e._v("version-0.2.16")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/Groestlcoin/groestlcoin-spark/v0.2.16/Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[e._v("✔️"),t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[e._v("️❌")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[e._v("️❌")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://github.com/Groestlcoin/groestlcoin-spark",target:"_blank",rel:"noopener noreferrer"}},[e._v("Github"),t("OutboundLink")],1),e._v(" - "),t("a",{attrs:{href:"https://hub.docker.com/r/groestlcoin/groestlcoin-spark",target:"_blank",rel:"noopener noreferrer"}},[e._v("DockerHub"),t("OutboundLink")],1)])]),e._v(" "),t("tr",[t("td",[e._v("groestlcoin/eclair")]),e._v(" "),t("td",[e._v("v0.6.0")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/Groestlcoin/eclair/v0.6.0/Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[e._v("✔️"),t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[e._v("️❌")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[e._v("️❌")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://github.com/Groestlcoin/eclair",target:"_blank",rel:"noopener noreferrer"}},[e._v("Github"),t("OutboundLink")],1),e._v(" - "),t("a",{attrs:{href:"https://hub.docker.com/r/groestlcoin/eclair",target:"_blank",rel:"noopener noreferrer"}},[e._v("DockerHub"),t("OutboundLink")],1)])]),e._v(" "),t("tr",[t("td",[e._v("groestlcoin/lnd")]),e._v(" "),t("td",[e._v("v0.10.0-grs")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/Groestlcoin/lnd/v0.10.0-grs/Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[e._v("✔️"),t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[e._v("️❌")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[e._v("️❌")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://github.com/Groestlcoin/lnd",target:"_blank",rel:"noopener noreferrer"}},[e._v("Github"),t("OutboundLink")],1),e._v(" - "),t("a",{attrs:{href:"https://hub.docker.com/r/groestlcoin/lnd",target:"_blank",rel:"noopener noreferrer"}},[e._v("DockerHub"),t("OutboundLink")],1)])]),e._v(" "),t("tr",[t("td",[e._v("btcpayserver/groestlcoin")]),e._v(" "),t("td",[e._v("25.0")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/btcpayserver/dockerfile-deps/Groestlcoin/25.0/Groestlcoin/25.0/linuxamd64.Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[e._v("✔️"),t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/btcpayserver/dockerfile-deps/Groestlcoin/25.0/Groestlcoin/25.0/linuxarm32v7.Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[e._v("✔️"),t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/btcpayserver/dockerfile-deps/Groestlcoin/25.0/Groestlcoin/25.0/linuxarm64v8.Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[e._v("✔️"),t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://github.com/btcpayserver/dockerfile-deps",target:"_blank",rel:"noopener noreferrer"}},[e._v("Github"),t("OutboundLink")],1),e._v(" - "),t("a",{attrs:{href:"https://hub.docker.com/r/btcpayserver/groestlcoin",target:"_blank",rel:"noopener noreferrer"}},[e._v("DockerHub"),t("OutboundLink")],1)])]),e._v(" "),t("tr",[t("td",[e._v("btcpayserver/elements")]),e._v(" "),t("td",[e._v("22.1.1")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/btcpayserver/dockerfile-deps/Elements/22.1.1/Elements/22.1.1/linuxamd64.Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[e._v("✔️"),t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/btcpayserver/dockerfile-deps/Elements/22.1.1/Elements/22.1.1/linuxarm32v7.Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[e._v("✔️"),t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/btcpayserver/dockerfile-deps/Elements/22.1.1/Elements/22.1.1/linuxarm64v8.Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[e._v("✔️"),t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://github.com/btcpayserver/dockerfile-deps",target:"_blank",rel:"noopener noreferrer"}},[e._v("Github"),t("OutboundLink")],1),e._v(" - "),t("a",{attrs:{href:"https://hub.docker.com/r/btcpayserver/elements",target:"_blank",rel:"noopener noreferrer"}},[e._v("DockerHub"),t("OutboundLink")],1)])]),e._v(" "),t("tr",[t("td",[e._v("btcpayserver/litecoin")]),e._v(" "),t("td",[e._v("0.21.2.1-2")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/btcpayserver/dockerfile-deps/Litecoin/0.21.2.1-2/Litecoin/0.21.2.1/linuxamd64.Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[e._v("✔️"),t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/btcpayserver/dockerfile-deps/Litecoin/0.21.2.1-2/Litecoin/0.21.2.1/linuxarm32v7.Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[e._v("✔️"),t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/btcpayserver/dockerfile-deps/Litecoin/0.21.2.1-2/Litecoin/0.21.2.1/linuxarm64v8.Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[e._v("✔️"),t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://github.com/btcpayserver/dockerfile-deps",target:"_blank",rel:"noopener noreferrer"}},[e._v("Github"),t("OutboundLink")],1),e._v(" - "),t("a",{attrs:{href:"https://hub.docker.com/r/btcpayserver/litecoin",target:"_blank",rel:"noopener noreferrer"}},[e._v("DockerHub"),t("OutboundLink")],1)])]),e._v(" "),t("tr",[t("td",[e._v("wakiyamap/docker-monacoin")]),e._v(" "),t("td",[e._v("0.20.2")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/wakiyamap/docker-bitcoin/master/monacoin/0.20.2/Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[e._v("✔️"),t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[e._v("️❌")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[e._v("️❌")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://github.com/wakiyamap/docker-bitcoin",target:"_blank",rel:"noopener noreferrer"}},[e._v("Github"),t("OutboundLink")],1),e._v(" - "),t("a",{attrs:{href:"https://hub.docker.com/r/wakiyamap/docker-monacoin",target:"_blank",rel:"noopener noreferrer"}},[e._v("DockerHub"),t("OutboundLink")],1)])]),e._v(" "),t("tr",[t("td",[e._v("redis")]),e._v(" "),t("td",[e._v("6.2.2-buster")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/docker-library/redis/f1a8498333ae3ab340b5b39fbac1d7e1dc0d628c/5.0/Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[e._v("✔️"),t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[e._v("️❌")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[e._v("️❌")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://github.com/docker-library/redis",target:"_blank",rel:"noopener noreferrer"}},[e._v("Github"),t("OutboundLink")],1),e._v(" - "),t("a",{attrs:{href:"https://hub.docker.com/_/redis",target:"_blank",rel:"noopener noreferrer"}},[e._v("DockerHub"),t("OutboundLink")],1)])]),e._v(" "),t("tr",[t("td",[e._v("bluewalletorganization/lndhub")]),e._v(" "),t("td",[e._v("v1.4.1")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/BlueWallet/LndHub/v1.4.1/Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[e._v("✔️"),t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/BlueWallet/LndHub/v1.4.1/Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[e._v("✔️"),t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/BlueWallet/LndHub/v1.4.1/Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[e._v("✔️"),t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://github.com/BlueWallet/LndHub",target:"_blank",rel:"noopener noreferrer"}},[e._v("Github"),t("OutboundLink")],1),e._v(" - "),t("a",{attrs:{href:"https://hub.docker.com/r/bluewalletorganization/lndhub",target:"_blank",rel:"noopener noreferrer"}},[e._v("DockerHub"),t("OutboundLink")],1)])]),e._v(" "),t("tr",[t("td",[e._v("jvandrew/btcqbo")]),e._v(" "),t("td",[e._v("0.3.36")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/JeffVandrewJr/btcqbo/v0.3.36/Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[e._v("✔️"),t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[e._v("️❌")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[e._v("️❌")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://github.com/JeffVandrewJr/btcqbo",target:"_blank",rel:"noopener noreferrer"}},[e._v("Github"),t("OutboundLink")],1),e._v(" - "),t("a",{attrs:{href:"https://hub.docker.com/r/jvandrew/btcqbo",target:"_blank",rel:"noopener noreferrer"}},[e._v("DockerHub"),t("OutboundLink")],1)])]),e._v(" "),t("tr",[t("td",[e._v("shesek/bwt")]),e._v(" "),t("td",[e._v("0.2.2-electrum")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/bwt-dev/bwt/v0.2.2/docker/Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[e._v("✔️"),t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/bwt-dev/bwt/v0.2.2/docker/arm32v7.Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[e._v("✔️"),t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/bwt-dev/bwt/v0.2.2/docker/arm64v8.Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[e._v("✔️"),t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://github.com/bwt-dev/bwt",target:"_blank",rel:"noopener noreferrer"}},[e._v("Github"),t("OutboundLink")],1),e._v(" - "),t("a",{attrs:{href:"https://hub.docker.com/r/shesek/bwt",target:"_blank",rel:"noopener noreferrer"}},[e._v("DockerHub"),t("OutboundLink")],1)])]),e._v(" "),t("tr",[t("td",[e._v("chatwoot/chatwoot")]),e._v(" "),t("td",[e._v("v1.7.0")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/chatwoot/chatwoot/v1.7.0/docker/Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[e._v("✔️"),t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/chatwoot/chatwoot/v1.7.0/docker/Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[e._v("✔️"),t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/chatwoot/chatwoot/v1.7.0/docker/Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[e._v("✔️"),t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://github.com/chatwoot/chatwoot",target:"_blank",rel:"noopener noreferrer"}},[e._v("Github"),t("OutboundLink")],1),e._v(" - "),t("a",{attrs:{href:"https://hub.docker.com/r/chatwoot/chatwoot",target:"_blank",rel:"noopener noreferrer"}},[e._v("DockerHub"),t("OutboundLink")],1)])]),e._v(" "),t("tr",[t("td",[e._v("lukechilds/electrumx")]),e._v(" "),t("td",[e._v("latest")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/lukechilds/docker-electrumx/master/Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[e._v("✔️"),t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[e._v("️❌")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[e._v("️❌")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://github.com/lukechilds/docker-electrumx",target:"_blank",rel:"noopener noreferrer"}},[e._v("Github"),t("OutboundLink")],1),e._v(" - "),t("a",{attrs:{href:"https://hub.docker.com/r/lukechilds/electrumx",target:"_blank",rel:"noopener noreferrer"}},[e._v("DockerHub"),t("OutboundLink")],1)])]),e._v(" "),t("tr",[t("td",[e._v("fireflyiii/core")]),e._v(" "),t("td",[e._v("latest")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://dev.azure.com/Firefly-III/66fb773b-063e-42d7-b6a5-e7729a22e8b3/_apis/git/repositories/e9c3dcf8-4533-4ef1-83cc-75527cab3377/items?path=%2FDockerfile&versionDescriptor%5BversionOptions%5D=0&versionDescriptor%5BversionType%5D=0&versionDescriptor%5Bversion%5D=main&resolveLfs=true&%24format=octetStream&api-version=5.0&download=true",target:"_blank",rel:"noopener noreferrer"}},[e._v("✔️"),t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://dev.azure.com/Firefly-III/66fb773b-063e-42d7-b6a5-e7729a22e8b3/_apis/git/repositories/e9c3dcf8-4533-4ef1-83cc-75527cab3377/items?path=%2FDockerfile&versionDescriptor%5BversionOptions%5D=0&versionDescriptor%5BversionType%5D=0&versionDescriptor%5Bversion%5D=main&resolveLfs=true&%24format=octetStream&api-version=5.0&download=true",target:"_blank",rel:"noopener noreferrer"}},[e._v("✔️"),t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://dev.azure.com/Firefly-III/66fb773b-063e-42d7-b6a5-e7729a22e8b3/_apis/git/repositories/e9c3dcf8-4533-4ef1-83cc-75527cab3377/items?path=%2FDockerfile&versionDescriptor%5BversionOptions%5D=0&versionDescriptor%5BversionType%5D=0&versionDescriptor%5Bversion%5D=main&resolveLfs=true&%24format=octetStream&api-version=5.0&download=true",target:"_blank",rel:"noopener noreferrer"}},[e._v("✔️"),t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://dev.azure.com/Firefly-III/_git/MainImage",target:"_blank",rel:"noopener noreferrer"}},[e._v("Github"),t("OutboundLink")],1),e._v(" - "),t("a",{attrs:{href:"https://hub.docker.com/r/fireflyiii/core",target:"_blank",rel:"noopener noreferrer"}},[e._v("DockerHub"),t("OutboundLink")],1)])]),e._v(" "),t("tr",[t("td",[e._v("podcastindexorg/podcasting20-helipad")]),e._v(" "),t("td",[e._v("v0.1.10")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/Podcastindex-org/helipad/v0.1.10/umbrel/Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[e._v("✔️"),t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/Podcastindex-org/helipad/v0.1.10/umbrel/Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[e._v("✔️"),t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/Podcastindex-org/helipad/v0.1.10/umbrel/Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[e._v("✔️"),t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://github.com/Podcastindex-org/helipad",target:"_blank",rel:"noopener noreferrer"}},[e._v("Github"),t("OutboundLink")],1),e._v(" - "),t("a",{attrs:{href:"https://hub.docker.com/r/podcastindexorg/podcasting20-helipad",target:"_blank",rel:"noopener noreferrer"}},[e._v("DockerHub"),t("OutboundLink")],1)])]),e._v(" "),t("tr",[t("td",[e._v("jvandrew/librepatron")]),e._v(" "),t("td",[e._v("0.7.39")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/JeffVandrewJr/patron/v0.7.39/Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[e._v("✔️"),t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[e._v("️❌")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[e._v("️❌")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://github.com/JeffVandrewJr/patron",target:"_blank",rel:"noopener noreferrer"}},[e._v("Github"),t("OutboundLink")],1),e._v(" - "),t("a",{attrs:{href:"https://hub.docker.com/r/jvandrew/librepatron",target:"_blank",rel:"noopener noreferrer"}},[e._v("DockerHub"),t("OutboundLink")],1)])]),e._v(" "),t("tr",[t("td",[e._v("jvandrew/isso")]),e._v(" "),t("td",[e._v("atron.22")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/JeffVandrewJr/isso/patron.22/Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[e._v("✔️"),t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[e._v("️❌")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[e._v("️❌")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://github.com/JeffVandrewJr/isso",target:"_blank",rel:"noopener noreferrer"}},[e._v("Github"),t("OutboundLink")],1),e._v(" - "),t("a",{attrs:{href:"https://hub.docker.com/r/jvandrew/isso",target:"_blank",rel:"noopener noreferrer"}},[e._v("DockerHub"),t("OutboundLink")],1)])]),e._v(" "),t("tr",[t("td",[e._v("lightninglabs/lightning-terminal")]),e._v(" "),t("td",[e._v("v0.9.2-alpha-path-prefix")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/lightninglabs/lightning-terminal/v0.9.2-alpha/Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[e._v("✔️"),t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[e._v("️❌")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/lightninglabs/lightning-terminal/v0.9.2-alpha/Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[e._v("✔️"),t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://github.com/lightninglabs/lightning-terminal",target:"_blank",rel:"noopener noreferrer"}},[e._v("Github"),t("OutboundLink")],1),e._v(" - "),t("a",{attrs:{href:"https://hub.docker.com/r/lightninglabs/lightning-terminal",target:"_blank",rel:"noopener noreferrer"}},[e._v("DockerHub"),t("OutboundLink")],1)])]),e._v(" "),t("tr",[t("td",[e._v("mempool/frontend")]),e._v(" "),t("td",[e._v("v2.5.0")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/mempool/mempool/v2.5.0/docker/frontend/Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[e._v("✔️"),t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/mempool/mempool/v2.5.0/docker/frontend/Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[e._v("✔️"),t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/mempool/mempool/v2.5.0/docker/frontend/Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[e._v("✔️"),t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://github.com/mempool/mempool",target:"_blank",rel:"noopener noreferrer"}},[e._v("Github"),t("OutboundLink")],1),e._v(" - "),t("a",{attrs:{href:"https://hub.docker.com/r/mempool/frontend",target:"_blank",rel:"noopener noreferrer"}},[e._v("DockerHub"),t("OutboundLink")],1)])]),e._v(" "),t("tr",[t("td",[e._v("mempool/backend")]),e._v(" "),t("td",[e._v("v2.5.0")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/mempool/mempool/v2.5.0/docker/backend/Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[e._v("✔️"),t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/mempool/mempool/v2.5.0/docker/backend/Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[e._v("✔️"),t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/mempool/mempool/v2.5.0/docker/backend/Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[e._v("✔️"),t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://github.com/mempool/mempool",target:"_blank",rel:"noopener noreferrer"}},[e._v("Github"),t("OutboundLink")],1),e._v(" - "),t("a",{attrs:{href:"https://hub.docker.com/r/mempool/backend",target:"_blank",rel:"noopener noreferrer"}},[e._v("DockerHub"),t("OutboundLink")],1)])]),e._v(" "),t("tr",[t("td",[e._v("mariadb")]),e._v(" "),t("td",[e._v("10.11")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/docker-library/mariadb/master/10.11/Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[e._v("✔️"),t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[e._v("️❌")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[e._v("️❌")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://github.com/docker-library/mariadb",target:"_blank",rel:"noopener noreferrer"}},[e._v("Github"),t("OutboundLink")],1),e._v(" - "),t("a",{attrs:{href:"https://hub.docker.com/_/mariadb",target:"_blank",rel:"noopener noreferrer"}},[e._v("DockerHub"),t("OutboundLink")],1)])]),e._v(" "),t("tr",[t("td",[e._v("kukks/nnostr-relay")]),e._v(" "),t("td",[e._v("v0.0.18")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/kukks/nnostr/Relay/v0.0.18/Relay/Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[e._v("✔️"),t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/kukks/nnostr/Relay/v0.0.18/Relay/Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[e._v("✔️"),t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/kukks/nnostr/Relay/v0.0.18/Relay/Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[e._v("✔️"),t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://github.com/kukks/nnostr",target:"_blank",rel:"noopener noreferrer"}},[e._v("Github"),t("OutboundLink")],1),e._v(" - "),t("a",{attrs:{href:"https://hub.docker.com/r/kukks/nnostr-relay",target:"_blank",rel:"noopener noreferrer"}},[e._v("DockerHub"),t("OutboundLink")],1)])]),e._v(" "),t("tr",[t("td",[e._v("sphinxlightning/sphinx-relay")]),e._v(" "),t("td",[e._v("v2.2.9")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/stakwork/sphinx-relay/v2.2.9/Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[e._v("✔️"),t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/stakwork/sphinx-relay/v2.2.9/Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[e._v("✔️"),t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/stakwork/sphinx-relay/v2.2.9/Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[e._v("✔️"),t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://github.com/stakwork/sphinx-relay",target:"_blank",rel:"noopener noreferrer"}},[e._v("Github"),t("OutboundLink")],1),e._v(" - "),t("a",{attrs:{href:"https://hub.docker.com/r/sphinxlightning/sphinx-relay",target:"_blank",rel:"noopener noreferrer"}},[e._v("DockerHub"),t("OutboundLink")],1)])]),e._v(" "),t("tr",[t("td",[e._v("djbooth007/tallycoin_connect")]),e._v(" "),t("td",[e._v("v1.8.0")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/djbooth007/tallycoin_connect/v1.8.0/Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[e._v("✔️"),t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/djbooth007/tallycoin_connect/v1.8.0/Dockerfile.arm32v7",target:"_blank",rel:"noopener noreferrer"}},[e._v("✔️"),t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/djbooth007/tallycoin_connect/v1.8.0/Dockerfile.arm64v8",target:"_blank",rel:"noopener noreferrer"}},[e._v("✔️"),t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://github.com/djbooth007/tallycoin_connect",target:"_blank",rel:"noopener noreferrer"}},[e._v("Github"),t("OutboundLink")],1),e._v(" - "),t("a",{attrs:{href:"https://hub.docker.com/r/djbooth007/tallycoin_connect",target:"_blank",rel:"noopener noreferrer"}},[e._v("DockerHub"),t("OutboundLink")],1)])]),e._v(" "),t("tr",[t("td",[e._v("talaia/python-teos")]),e._v(" "),t("td",[e._v("latest")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/talaia-labs/python-teos/master/docker/Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[e._v("✔️"),t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/talaia-labs/python-teos/master/docker/arm32v7.Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[e._v("✔️"),t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/talaia-labs/python-teos/master/docker/arm64v8.Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[e._v("✔️"),t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://github.com/talaia-labs/python-teos",target:"_blank",rel:"noopener noreferrer"}},[e._v("Github"),t("OutboundLink")],1),e._v(" - "),t("a",{attrs:{href:"https://hub.docker.com/r/talaia/python-teos",target:"_blank",rel:"noopener noreferrer"}},[e._v("DockerHub"),t("OutboundLink")],1)])]),e._v(" "),t("tr",[t("td",[e._v("apotdevin/thunderhub")]),e._v(" "),t("td",[e._v("base-v0.13.23")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/apotdevin/thunderhub/v0.13.23/Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[e._v("✔️"),t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/apotdevin/thunderhub/v0.13.23/Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[e._v("✔️"),t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/apotdevin/thunderhub/v0.13.23/Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[e._v("✔️"),t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://github.com/apotdevin/thunderhub",target:"_blank",rel:"noopener noreferrer"}},[e._v("Github"),t("OutboundLink")],1),e._v(" - "),t("a",{attrs:{href:"https://hub.docker.com/r/apotdevin/thunderhub",target:"_blank",rel:"noopener noreferrer"}},[e._v("DockerHub"),t("OutboundLink")],1)])]),e._v(" "),t("tr",[t("td",[e._v("lncapital/torq")]),e._v(" "),t("td",[e._v("0.20.3")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/lncapital/torq/master/README.md",target:"_blank",rel:"noopener noreferrer"}},[e._v("✔️"),t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/lncapital/torq/master/README.md",target:"_blank",rel:"noopener noreferrer"}},[e._v("✔️"),t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/lncapital/torq/master/README.md",target:"_blank",rel:"noopener noreferrer"}},[e._v("✔️"),t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://github.com/lncapital/torq",target:"_blank",rel:"noopener noreferrer"}},[e._v("Github"),t("OutboundLink")],1),e._v(" - "),t("a",{attrs:{href:"https://hub.docker.com/r/lncapital/torq",target:"_blank",rel:"noopener noreferrer"}},[e._v("DockerHub"),t("OutboundLink")],1)])]),e._v(" "),t("tr",[t("td",[e._v("timescale/timescaledb")]),e._v(" "),t("td",[e._v("latest-pg14")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/timescale/timescaledb-docker/main/Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[e._v("✔️"),t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/timescale/timescaledb-docker/main/Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[e._v("✔️"),t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/timescale/timescaledb-docker/main/Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[e._v("✔️"),t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://github.com/timescale/timescaledb-docker",target:"_blank",rel:"noopener noreferrer"}},[e._v("Github"),t("OutboundLink")],1),e._v(" - "),t("a",{attrs:{href:"https://hub.docker.com/r/timescale/timescaledb",target:"_blank",rel:"noopener noreferrer"}},[e._v("DockerHub"),t("OutboundLink")],1)])]),e._v(" "),t("tr",[t("td",[e._v("zammad/zammad-docker-compose")]),e._v(" "),t("td",[e._v("zammad-postgresql-3.4.0-4")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/zammad/zammad-docker-compose/ff20084ce2829486076e9781fe27407ca6cc09bb/containers/zammad-postgresql/Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[e._v("✔️"),t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[e._v("️❌")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[e._v("️❌")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://github.com/zammad/zammad-docker-compose",target:"_blank",rel:"noopener noreferrer"}},[e._v("Github"),t("OutboundLink")],1),e._v(" - "),t("a",{attrs:{href:"https://hub.docker.com/r/zammad/zammad-docker-compose",target:"_blank",rel:"noopener noreferrer"}},[e._v("DockerHub"),t("OutboundLink")],1)])]),e._v(" "),t("tr",[t("td",[e._v("memcached")]),e._v(" "),t("td",[e._v("1.5.22-alpine")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/docker-library/memcached/eb38bf28263b8e5bb7367797cb7b181b65d769bd/alpine/Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[e._v("✔️"),t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[e._v("️❌")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[e._v("️❌")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://github.com/docker-library/memcached",target:"_blank",rel:"noopener noreferrer"}},[e._v("Github"),t("OutboundLink")],1),e._v(" - "),t("a",{attrs:{href:"https://hub.docker.com/_/memcached",target:"_blank",rel:"noopener noreferrer"}},[e._v("DockerHub"),t("OutboundLink")],1)])]),e._v(" "),t("tr",[t("td",[e._v("traefik")]),e._v(" "),t("td",[e._v("v2.6")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/containous/traefik-library-image/master/scratch/Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[e._v("✔️"),t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[e._v("️❌")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[e._v("️❌")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://github.com/containous/traefik-library-image",target:"_blank",rel:"noopener noreferrer"}},[e._v("Github"),t("OutboundLink")],1),e._v(" - "),t("a",{attrs:{href:"https://hub.docker.com/_/traefik",target:"_blank",rel:"noopener noreferrer"}},[e._v("DockerHub"),t("OutboundLink")],1)])]),e._v(" "),t("tr",[t("td",[e._v("chekaz/docker-trezarcoin")]),e._v(" "),t("td",[e._v("0.13.0")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/ChekaZ/docker/master/trezarcoin/1.2.0/Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[e._v("✔️"),t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[e._v("️❌")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[e._v("️❌")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://github.com/ChekaZ/docker",target:"_blank",rel:"noopener noreferrer"}},[e._v("Github"),t("OutboundLink")],1),e._v(" - "),t("a",{attrs:{href:"https://hub.docker.com/r/chekaz/docker-trezarcoin",target:"_blank",rel:"noopener noreferrer"}},[e._v("DockerHub"),t("OutboundLink")],1)])]),e._v(" "),t("tr",[t("td",[e._v("romanornr/docker-viacoin")]),e._v(" "),t("td",[e._v("0.15.2")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/viacoin/docker-viacoin/master/viacoin/0.15.2/docker-viacoin",target:"_blank",rel:"noopener noreferrer"}},[e._v("✔️"),t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[e._v("️❌")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[e._v("️❌")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://github.com/viacoin/docker-viacoin",target:"_blank",rel:"noopener noreferrer"}},[e._v("Github"),t("OutboundLink")],1),e._v(" - "),t("a",{attrs:{href:"https://hub.docker.com/r/romanornr/docker-viacoin",target:"_blank",rel:"noopener noreferrer"}},[e._v("DockerHub"),t("OutboundLink")],1)])])])]),e._v(" "),t("h1",{attrs:{id:"faq"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#faq"}},[e._v("#")]),e._v(" FAQ")]),e._v(" "),t("h2",{attrs:{id:"how-can-i-modify-my-environment"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#how-can-i-modify-my-environment"}},[e._v("#")]),e._v(" How can I modify my environment?")]),e._v(" "),t("p",[e._v("As root, run "),t("code",[e._v(". btcpay-setup.sh")]),e._v("; this will show you the environment variable it is expecting.\nFor example, if you support "),t("code",[e._v("btc")]),e._v(" and "),t("code",[e._v("ltc")]),e._v(" already, and want to add "),t("code",[e._v("btg")]),e._v(":")]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("export")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[e._v("BTCPAYGEN_CRYPTO3")]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),t("span",{pre:!0,attrs:{class:"token string"}},[e._v("'btg'")]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v(".")]),e._v(" btcpay-setup.sh "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-i")]),e._v("\n")])])]),t("h2",{attrs:{id:"i-deployed-before-btcpay-setupsh-existed-before-may-17-2018-can-i-migrate-to-this-new-system"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#i-deployed-before-btcpay-setupsh-existed-before-may-17-2018-can-i-migrate-to-this-new-system"}},[e._v("#")]),e._v(" I deployed before "),t("code",[e._v("btcpay-setup.sh")]),e._v(" existed (before May 17, 2018), can I migrate to this new system?")]),e._v(" "),t("p",[e._v("Yes, run the following commands to update:")]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token function"}},[e._v("sudo")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("su")]),e._v(" -\n\n"),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("cd")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token variable"}},[e._v("$DOWNLOAD_ROOT")]),e._v("/btcpayserver-docker\n"),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("git")]),e._v(" checkout master\n"),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("git")]),e._v(" pull\n"),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("git")]),e._v(" checkout 9acb5d8067cb5c46f59858137feb699b41ac9f19\nbtcpay-update.sh\n"),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v(".")]),e._v(" ./btcpay-setup.sh "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-i")]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("git")]),e._v(" checkout master\nbtcpay-update.sh\n\n"),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("exit")]),e._v("\n")])])]),t("h2",{attrs:{id:"im-getting-an-error-on-windows-cannot-create-container-for-service-docker-mount-denied"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#im-getting-an-error-on-windows-cannot-create-container-for-service-docker-mount-denied"}},[e._v("#")]),e._v(" I'm getting an error on Windows: "),t("code",[e._v("Cannot create container for service docker: Mount denied")]),e._v("?")]),e._v(" "),t("p",[e._v("If you see this error:")]),e._v(" "),t("p",[t("code",[e._v("Cannot create container for service docker: b'Mount denied:\\nThe source path \"\\\\\\\\var\\\\\\\\run\\\\\\\\docker.sock:/var/run/docker.sock\"\\nis not a valid Windows path'")]),e._v(".")]),e._v(" "),t("p",[e._v("Run this in "),t("a",{attrs:{href:"https://docs.microsoft.com/en-us/powershell/scripting/windows-powershell/starting-windows-powershell",target:"_blank",rel:"noopener noreferrer"}},[e._v("powershell"),t("OutboundLink")],1),e._v(":")]),e._v(" "),t("div",{staticClass:"language-powershell extra-class"},[t("pre",{pre:!0,attrs:{class:"language-powershell"}},[t("code",[t("span",{pre:!0,attrs:{class:"token variable"}},[e._v("$Env")]),e._v(":COMPOSE_CONVERT_WINDOWS_PATHS=1\n")])])]),t("p",[e._v("Then, run "),t("code",[e._v("docker-compose -f EXAMPLE.yml up")]),e._v(".")]),e._v(" "),t("p",[e._v("This bug comes from Docker for Windows and is "),t("a",{attrs:{href:"https://github.com/docker/for-win/issues/1829",target:"_blank",rel:"noopener noreferrer"}},[e._v("tracked on Github"),t("OutboundLink")],1),e._v(".")]),e._v(" "),t("h2",{attrs:{id:"how-i-can-prune-my-nodes"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#how-i-can-prune-my-nodes"}},[e._v("#")]),e._v(" How I can prune my node(s)?")]),e._v(" "),t("p",[e._v("This will prune your Bitcoin full node to a maximum of 100GB (of blocks):")]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("export")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[e._v("BTCPAYGEN_ADDITIONAL_FRAGMENTS")]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"opt-save-storage"')]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v(".")]),e._v(" ./btcpay-setup.sh "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-i")]),e._v("\n")])])]),t("p",[e._v("Other options are "),t("a",{attrs:{href:"#generated-docker-compose"}},[e._v("documented here")]),e._v(".")]),e._v(" "),t("h2",{attrs:{id:"how-can-i-customize-the-generated-docker-compose-file"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#how-can-i-customize-the-generated-docker-compose-file"}},[e._v("#")]),e._v(" How can I customize the generated docker-compose file?")]),e._v(" "),t("p",[e._v("In some instances, you might want to customize your environment in more detail. While you could modify "),t("code",[e._v("Generated/docker-compose.generated.yml")]),e._v(" manually, your changes would be overwritten the next time you run "),t("code",[e._v("btcpay-update.sh")]),e._v(".")]),e._v(" "),t("p",[e._v("Luckily, you can leverage "),t("code",[e._v("BTCPAYGEN_ADDITIONAL_FRAGMENTS")]),e._v(" for this!")]),e._v(" "),t("p",[e._v("Let's enable "),t("strong",[e._v("pruning to 60 GB")]),e._v(", for example:")]),e._v(" "),t("p",[e._v("First, copy "),t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver-docker/blob/master/docker-compose-generator/docker-fragments/opt-save-storage.yml",target:"_blank",rel:"noopener noreferrer"}},[e._v("opt-save-storage"),t("OutboundLink")],1),e._v(" into the "),t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver-docker/blob/master/docker-compose-generator/docker-fragments",target:"_blank",rel:"noopener noreferrer"}},[e._v("the docker fragment folder"),t("OutboundLink")],1),e._v(" as "),t("code",[e._v("opt-save-storage.custom.yml")]),e._v(". "),t("strong",[e._v("Important:")]),e._v(" the file must end with "),t("code",[e._v(".custom.yml")]),e._v(", or there will be git conflicts whenever you run "),t("code",[e._v("btcpay-update.sh")]),e._v(".")]),e._v(" "),t("p",[e._v("Modify the new "),t("code",[e._v("opt-save-storage.custom.yml")]),e._v(" file to your taste:")]),e._v(" "),t("div",{staticClass:"language-diff extra-class"},[t("pre",{pre:!0,attrs:{class:"language-diff"}},[t("code",[e._v('@@ -14,8 +14,7 @@ version: "3"\n'),t("span",{pre:!0,attrs:{class:"token unchanged"}},[t("span",{pre:!0,attrs:{class:"token prefix unchanged"}},[e._v(" ")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v("services:\n")]),t("span",{pre:!0,attrs:{class:"token prefix unchanged"}},[e._v(" ")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" bitcoind:\n")]),t("span",{pre:!0,attrs:{class:"token prefix unchanged"}},[e._v(" ")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" environment:\n")])]),t("span",{pre:!0,attrs:{class:"token deleted-sign deleted"}},[t("span",{pre:!0,attrs:{class:"token prefix deleted"}},[e._v("-")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" BITCOIN_EXTRA_ARGS: prune=100000\n")])]),t("span",{pre:!0,attrs:{class:"token inserted-sign inserted"}},[t("span",{pre:!0,attrs:{class:"token prefix inserted"}},[e._v("+")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" BITCOIN_EXTRA_ARGS: prune=60000\n")])])])])]),t("p",[e._v("Then set it up:")]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("export")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[e._v("BTCPAYGEN_ADDITIONAL_FRAGMENTS")]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"'),t("span",{pre:!0,attrs:{class:"token variable"}},[e._v("$BTCPAYGEN_ADDITIONAL_FRAGMENTS")]),e._v(';opt-save-storage.custom"')]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v(".")]),e._v(" ./btcpay-setup.sh "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-i")]),e._v("\n")])])]),t("h2",{attrs:{id:"can-i-run-btcpay-server-on-ports-other-than-80-and-443"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#can-i-run-btcpay-server-on-ports-other-than-80-and-443"}},[e._v("#")]),e._v(" Can I run BTCPay Server on ports other than 80 and 443?")]),e._v(" "),t("p",[e._v("You can change the ports for HTTP and HTTPS by setting the environment variables "),t("code",[e._v("REVERSEPROXY_HTTP_PORT")]),e._v(" and "),t("code",[e._v("REVERSEPROXY_HTTPS_PORT")]),e._v(". This is handy when ports 80 and 443 are already in use on your host, or you want to offload SSL termination with an existing web proxy.")]),e._v(" "),t("p",[e._v("When you set "),t("code",[e._v("REVERSEPROXY_HTTP_PORT")]),e._v(" to another value than 80, the built-in Let's Encrypt certificate will not work, as Let's Encrypt will try to validate your SSL certificate request by connecting from the internet to your domain on port 80. This validation request should be able to reach BTCPay Server in order to receive the certificate.")]),e._v(" "),t("p",[e._v("If you need to run on a different port, it's best to terminate SSL using another web proxy and forward your traffic.")]),e._v(" "),t("h2",{attrs:{id:"can-i-offload-https-termination"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#can-i-offload-https-termination"}},[e._v("#")]),e._v(" Can I offload HTTPS termination?")]),e._v(" "),t("p",[e._v("Yes. Please "),t("RouterLink",{attrs:{to:"/FAQ/FAQ-Deployment/#can-i-use-an-existing-nginx-server-as-a-reverse-proxy-with-ssl-termination"}},[e._v("see the documentation")]),e._v(".")],1),e._v(" "),t("h2",{attrs:{id:"how-can-i-back-up-my-btcpay-server"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#how-can-i-back-up-my-btcpay-server"}},[e._v("#")]),e._v(" How can I back up my BTCPay Server?")]),e._v(" "),t("p",[e._v("See the "),t("RouterLink",{attrs:{to:"/Docker/backup-restore/"}},[e._v("Backup & Restore")]),e._v(" guide in our documentation.")],1),e._v(" "),t("details",[t("summary",[e._v("For backwards compatibility: Click here for the description of the old backup.sh process")]),e._v(" "),t("div",{staticClass:"custom-block warning"},[t("p",{staticClass:"custom-block-title"},[e._v("WARNING")]),e._v(" "),t("p",[e._v("Please consider switching to the "),t("RouterLink",{attrs:{to:"/Docker/backup-restore/"}},[e._v("new Backup & Restore process")]),e._v(", because the "),t("code",[e._v("backup.sh")]),e._v(" will not be maintained anymore.")],1)]),e._v(" "),t("p",[e._v("We provide a backup script that dumps the database and saves the important files:")]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("cd")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"'),t("span",{pre:!0,attrs:{class:"token variable"}},[e._v("$BTCPAY_BASE_DIRECTORY")]),e._v('/btcpayserver-docker"')]),e._v("\n./backup.sh\n")])])]),t("p",[e._v("This will save the backup locally as "),t("code",[e._v("/var/lib/docker/volumes/backup_datadir/_data/backup.tar.gz")]),e._v(".\nThese are the options to customize the backup name and location:")]),e._v(" "),t("ul",[t("li",[t("code",[e._v("BACKUP_TIMESTAMP=true")]),e._v(" saves the backup with datetime as part of the file name, so that backups do not get overwritten.")]),e._v(" "),t("li",[t("code",[e._v("BACKUP_PROVIDER=SCP")]),e._v(" saves the backup remotely, requires additional "),t("code",[e._v("SCP_TARGET")]),e._v(" environment variable (see below).")]),e._v(" "),t("li",[t("code",[e._v("BACKUP_PROVIDER=Dropbox")]),e._v(" saves the backup to Dropbox, requires additional "),t("code",[e._v("DROPBOX_TOKEN")]),e._v(" environment variable (see below).")])]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("cd")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"'),t("span",{pre:!0,attrs:{class:"token variable"}},[e._v("$BTCPAY_BASE_DIRECTORY")]),e._v('/btcpayserver-docker"')]),e._v("\n\n"),t("span",{pre:!0,attrs:{class:"token comment"}},[e._v("# Backup with custom file name and timestamp:")]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[e._v("BACKUP_TIMESTAMP")]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),e._v("true ./backup.sh\n\n"),t("span",{pre:!0,attrs:{class:"token comment"}},[e._v("# Backup via SCP:")]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[e._v("BACKUP_PROVIDER")]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),e._v("SCP "),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[e._v("SCP_TARGET")]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),e._v("myhost:backups/btcpay ./backup.sh\n\n"),t("span",{pre:!0,attrs:{class:"token comment"}},[e._v("# Backup to Dropbox:")]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[e._v("BACKUP_PROVIDER")]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),e._v("Dropbox "),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[e._v("DROPBOX_TOKEN")]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),e._v("myDropboxToken ./backup.sh\n")])])]),t("p",[e._v("You can also choose to only dump the database.\nThis option does not need to stop and restart the docker-containers:")]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("cd")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"'),t("span",{pre:!0,attrs:{class:"token variable"}},[e._v("$BTCPAY_BASE_DIRECTORY")]),e._v('/btcpayserver-docker"')]),e._v("\n./backup.sh --only-db\n")])])])]),e._v(" "),t("h2",{attrs:{id:"how-can-i-connect-to-the-database"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#how-can-i-connect-to-the-database"}},[e._v("#")]),e._v(" How can I connect to the database?")]),e._v(" "),t("p",[e._v("On the server you can open a database session by connecting via "),t("code",[e._v("psql")]),e._v(" as the postgres user:")]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token function"}},[e._v("docker")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("exec")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-ti")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token variable"}},[t("span",{pre:!0,attrs:{class:"token variable"}},[e._v("$(")]),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("docker")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("ps")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-a")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-q")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-f")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"name=postgres_1"')]),t("span",{pre:!0,attrs:{class:"token variable"}},[e._v(")")])]),e._v(" psql "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-U")]),e._v(" postgres\n")])])]),t("p",[e._v("Then, inside "),t("code",[e._v("psql")]),e._v(" you can select a database and interact with the tables:")]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token comment"}},[e._v("# list databases")]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("\\")]),e._v("l\n\n"),t("span",{pre:!0,attrs:{class:"token comment"}},[e._v("# connect to database")]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("\\")]),e._v("c btcpayservermainnet\n\n"),t("span",{pre:!0,attrs:{class:"token comment"}},[e._v("# list tables")]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("\\")]),e._v("dt\n\n"),t("span",{pre:!0,attrs:{class:"token comment"}},[e._v("# list users")]),e._v("\nSELECT "),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"Id"')]),e._v(", "),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"Email"')]),e._v(" FROM "),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"AspNetUsers"')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(";")]),e._v("\n\n"),t("span",{pre:!0,attrs:{class:"token comment"}},[e._v("# end session")]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("\\")]),e._v("q\n")])])]),t("p",[e._v("The main BTCPay Server database tables are part of the "),t("code",[e._v("public")]),e._v(" schema.\nPlugins have their own schema, named after the plugin.")]),e._v(" "),t("p",[e._v("By default, only the tables of the "),t("code",[e._v("public")]),e._v(" schema are shown.\nIf you want to also see and select the plugin tables, you need to extend the search path:")]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token comment"}},[e._v("# list plugin schemas")]),e._v("\nSELECT * FROM pg_catalog.pg_namespace WHERE nspname LIKE "),t("span",{pre:!0,attrs:{class:"token string"}},[e._v("'BTCPayServer.%'")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(";")]),e._v("\n\n"),t("span",{pre:!0,attrs:{class:"token comment"}},[e._v("# extend search path")]),e._v("\nSET search_path TO "),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"BTCPayServer.Plugins.MyPlugin"')]),e._v(", public"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(";")]),e._v("\n\n"),t("span",{pre:!0,attrs:{class:"token comment"}},[e._v("# table list now also shows the MyPlugin tables")]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("\\")]),e._v("dt\n")])])]),t("h2",{attrs:{id:"how-do-i-upgrade-my-btcpay-server-docker"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#how-do-i-upgrade-my-btcpay-server-docker"}},[e._v("#")]),e._v(" How do I upgrade my BTCPay Server docker?")]),e._v(" "),t("p",[e._v("Run the script "),t("code",[e._v("./btcpay-update.sh")]),e._v(" and patiently wait for your server to be upgraded.")])])}),[],!1,null,null,null);t.default=n.exports}}]); \ No newline at end of file diff --git a/assets/js/127.6c52b388.js b/assets/js/127.e25f2eac.js similarity index 99% rename from assets/js/127.6c52b388.js rename to assets/js/127.e25f2eac.js index 671b7e4ec2..cd2ac5f016 100644 --- a/assets/js/127.6c52b388.js +++ b/assets/js/127.e25f2eac.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[127],{761:function(e,t,a){"use strict";a.r(t);var s=a(10),r=Object(s.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"backup-restore"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#backup-restore"}},[e._v("#")]),e._v(" Backup & Restore")]),e._v(" "),t("p",[e._v("This guide gets you up to speed with the "),t("RouterLink",{attrs:{to:"/Docker/"}},[e._v("Docker deployment")]),e._v("'s Backup & Restore process.\nYou will learn about what to keep in mind when doing a backup and how to restore a backup.")],1),e._v(" "),t("p"),t("div",{staticClass:"table-of-contents"},[t("ul",[t("li",[t("a",{attrs:{href:"#remarks-and-considerations"}},[e._v("Remarks and Considerations")]),t("ul",[t("li",[t("a",{attrs:{href:"#lightning-channel-backup"}},[e._v("Lightning channel backup")])])])]),t("li",[t("a",{attrs:{href:"#how-does-the-backup-work"}},[e._v("How does the backup work?")]),t("ul",[t("li",[t("a",{attrs:{href:"#set-a-backup-passphrase"}},[e._v("Set a backup passphrase")])]),t("li",[t("a",{attrs:{href:"#automation-by-crontab"}},[e._v("Automation by crontab")])])])]),t("li",[t("a",{attrs:{href:"#how-to-restore"}},[e._v("How to restore?")])])])]),t("p"),e._v(" "),t("h2",{attrs:{id:"remarks-and-considerations"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#remarks-and-considerations"}},[e._v("#")]),e._v(" Remarks and Considerations")]),e._v(" "),t("p",[e._v("The original backups strategy in BTCPay Server still exists and can be found "),t("RouterLink",{attrs:{to:"/Docker/#how-can-i-back-up-my-btcpay-server"}},[e._v("here")]),e._v(".\nWhile this documentation covers the "),t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver-docker/pull/641",target:"_blank",rel:"noopener noreferrer"}},[e._v("new process"),t("OutboundLink")],1),e._v(", the old "),t("code",[e._v("backup.sh")]),e._v(" script still works.")],1),e._v(" "),t("div",{staticClass:"custom-block warning"},[t("p",{staticClass:"custom-block-title"},[e._v("WARNING")]),e._v(" "),t("p",[e._v("BTCPay Server is and will never be responsible for your backup.\nPlease make sure the backup includes the files and data you want to store.\nAlso, test the restore process before starting to rely on it.")])]),e._v(" "),t("h3",{attrs:{id:"lightning-channel-backup"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#lightning-channel-backup"}},[e._v("#")]),e._v(" Lightning channel backup")]),e._v(" "),t("p",[e._v("Please be aware of this important issue:\nOld Lightning channel state is toxic!\nYou can lose all your funds if you close a channel based on an outdated state — and the state changes often!\nIf you publish an old state (say from yesterday's backup), you will most likely lose all your funds in the channel because the counterparty might publish a "),t("a",{attrs:{href:"https://www.d11n.net/lightning-network-payment-channel-lifecycle.html#what-happens-in-case-of-a-false-close%3F",target:"_blank",rel:"noopener noreferrer"}},[e._v("revocation transaction"),t("OutboundLink")],1),e._v("!")]),e._v(" "),t("p",[e._v("There is a high chance of failure in a disaster recovery scenario, where you may do a backup once per night and need to restore that one backup.")]),e._v(" "),t("p",[e._v("The Lightning channel backup from the "),t("code",[e._v("btcpay-backup.sh")]),e._v(" script will be sufficient in a migration case, where the shutdown of the old server happens cleanly.\nThe old server should not be started after the restoration and start of the new server.")]),e._v(" "),t("div",{staticClass:"custom-block tip"},[t("p",{staticClass:"custom-block-title"},[e._v("TIP")]),e._v(" "),t("p",[e._v("The Lightning static channel backup should be watched by a script and copied over to a remote server to ensure you always have the latest state available.\nWe will provide such a script with a future update.\nFor now, keep the above in mind when restoring from the backup!")])]),e._v(" "),t("h2",{attrs:{id:"how-does-the-backup-work"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#how-does-the-backup-work"}},[e._v("#")]),e._v(" How does the backup work?")]),e._v(" "),t("p",[e._v("The backup process is run with the "),t("code",[e._v("btcpay-backup.sh")]),e._v(" script.")]),e._v(" "),t("p",[e._v("Log in to your server, switch to the "),t("code",[e._v("root")]),e._v(" user and type the following:")]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token comment"}},[e._v("# The backup script needs to be run as the root user")]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("sudo")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("su")]),e._v(" -\n\n"),t("span",{pre:!0,attrs:{class:"token comment"}},[e._v("# As the other scripts, it is inside the BTCPay base directory")]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("cd")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token variable"}},[e._v("$BTCPAY_BASE_DIRECTORY")]),e._v("/btcpayserver-docker\n./btcpay-backup.sh\n")])])]),t("p",[e._v("The backup process needs to be run as "),t("code",[e._v("root")]),e._v(".\nIt will check for and let you know if you have to switch users.")]),e._v(" "),t("p",[e._v("The script will do the following steps:")]),e._v(" "),t("ul",[t("li",[e._v("Ensure the database container is running")]),e._v(" "),t("li",[e._v("Make a dump of the database")]),e._v(" "),t("li",[e._v("Stop BTCPay Server")]),e._v(" "),t("li",[e._v("Archive the Docker volumes and database dump\n"),t("ul",[t("li",[e._v("Excluding the blockchains "),t("code",[e._v("blocks")]),e._v(" and "),t("code",[e._v("chainstate")]),e._v(" directories")]),e._v(" "),t("li",[e._v("Optional: "),t("a",{attrs:{href:"#set-a-backup-passphrase"}},[e._v("Encrypt the archive")])])])]),e._v(" "),t("li",[e._v("Restart BTCPay Server")]),e._v(" "),t("li",[e._v("Cleanup: Remove temporary files like the database dump")])]),e._v(" "),t("p",[e._v("If the backup directory doesn't exist yet, the script will create it.\nWith these preparations taken, the backup process is now starting.")]),e._v(" "),t("p",[e._v("The script has checks to ensure it either works or fails with a comprehensive error message at every step of the way.\nIf there are errors, you will be notified like this:")]),e._v(" "),t("div",{staticClass:"language- extra-class"},[t("pre",{pre:!0,attrs:{class:"language-text"}},[t("code",[e._v("🚨 Database container could not be started or found.\n")])])]),t("p",[e._v("If everything works smoothly, you will see multiple completed marks in your console.\nWhenever the backup has completed successfully, it will state:")]),e._v(" "),t("div",{staticClass:"language- extra-class"},[t("pre",{pre:!0,attrs:{class:"language-text"}},[t("code",[e._v("✅ Backup done => /var/lib/docker/volumes/backup_datadir/_data/backup.tar.gz\n")])])]),t("p",[e._v("Your BTCPay Server has now finished the backup process.\nYou must store these backups safely, for instance, by copying them to a remote server.")]),e._v(" "),t("p",[e._v("After making a backup the first time, it is always wise to at least test your backup in a restore scenario.\nWe will go over the extra options you can set with your backup in the next topic.")]),e._v(" "),t("h3",{attrs:{id:"set-a-backup-passphrase"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#set-a-backup-passphrase"}},[e._v("#")]),e._v(" Set a backup passphrase")]),e._v(" "),t("p",[e._v("You can set the "),t("code",[e._v("BTCPAY_BACKUP_PASSPHRASE")]),e._v(" environment variable for encrypting the backup.\nThis passphrase will be used by the backup and restore scripts to encrypt and decrypt the backup file.\nFor the backup script, this would look like the following:")]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token comment"}},[e._v("# Set the passphrase without adding it to the shell history")]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("read")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-s")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-p")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"Enter passphrase: "')]),e._v(" BTCPAY_BACKUP_PASSPHRASE\n"),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("export")]),e._v(" BTCPAY_BACKUP_PASSPHRASE\n\n./btcpay-backup.sh\n")])])]),t("p",[e._v("This "),t("code",[e._v("BTCPAY_BACKUP_PASSPHRASE")]),e._v(" if set, is necessary to be in the "),t("a",{attrs:{href:"#how-to-restore"}},[e._v("restore process")]),e._v(" as well.")]),e._v(" "),t("h3",{attrs:{id:"automation-by-crontab"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#automation-by-crontab"}},[e._v("#")]),e._v(" Automation by crontab")]),e._v(" "),t("p",[e._v("Here is an example of a crontab script that does a nightly backup at 4:15 AM:")]),e._v(" "),t("div",{staticClass:"language- extra-class"},[t("pre",{pre:!0,attrs:{class:"language-text"}},[t("code",[e._v("SHELL=/bin/bash\nPATH=/bin:/usr/sbin:/usr/bin:/usr/local/bin\n15 4 * * * /root/BTCPayServer/btcpayserver-docker/btcpay-backup.sh >/dev/null 2>&1\n")])])]),t("p",[e._v("You need to set the right "),t("code",[e._v("SHELL")]),e._v(" and "),t("code",[e._v("PATH")]),e._v(", so that the script can run with the correct context.\nYou might also want to set the "),t("code",[e._v("BTCPAY_BACKUP_PASSPHRASE")]),e._v(" environment variable.")]),e._v(" "),t("p",[e._v("Also ensure the base path (here "),t("code",[e._v("/root/BTCPayServer")]),e._v(") matches the output of "),t("code",[e._v("echo $BTCPAY_BASE_DIRECTORY")]),e._v(".")]),e._v(" "),t("h2",{attrs:{id:"how-to-restore"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#how-to-restore"}},[e._v("#")]),e._v(" How to restore?")]),e._v(" "),t("p",[e._v("It's very similar to the "),t("code",[e._v("btcpay-backup.sh")]),e._v(" process but in reverse.\nThe "),t("code",[e._v("btcpay-restore.sh")]),e._v(" script needs to be run with the path to your "),t("code",[e._v("backup.tar.gz")]),e._v(" file.")]),e._v(" "),t("p",[e._v("First off, open a terminal and type the following as root.\nRemember that if you set "),t("code",[e._v("BTCPAY_BACKUP_PASSPHRASE")]),e._v(" on the backup, you also need to provide it for decryption :")]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token comment"}},[e._v("# The restore script needs to be run as the root user")]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("sudo")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("su")]),e._v(" -\n\n"),t("span",{pre:!0,attrs:{class:"token comment"}},[e._v("# As the other scripts, it is inside the BTCPay base directory")]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("cd")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token variable"}},[e._v("$BTCPAY_BASE_DIRECTORY")]),e._v("/btcpayserver-docker\n\n"),t("span",{pre:!0,attrs:{class:"token comment"}},[e._v("# Optional: Set the passphrase if you have used one for the backup")]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("read")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-s")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-p")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"Enter passphrase: "')]),e._v(" BTCPAY_BACKUP_PASSPHRASE\n"),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("export")]),e._v(" BTCPAY_BACKUP_PASSPHRASE\n\n"),t("span",{pre:!0,attrs:{class:"token comment"}},[e._v("# Run the restore script with the full path to the backup file")]),e._v("\n./btcpay-restore.sh /var/backups/backup.tar.gz.gpg\n")])])]),t("p",[e._v("The script will do the following steps:")]),e._v(" "),t("ul",[t("li",[e._v("Extract (and decrypt) the backup archive")]),e._v(" "),t("li",[e._v("Stop BTCPay Server")]),e._v(" "),t("li",[e._v("Restore the Docker volumes")]),e._v(" "),t("li",[e._v("Start the database container")]),e._v(" "),t("li",[e._v("Import the database dump")]),e._v(" "),t("li",[e._v("Restart BTCPay Server")]),e._v(" "),t("li",[e._v("Cleanup: Remove the temporary restore directory")])]),e._v(" "),t("p",[e._v("If the backup file cannot be found in the provided path, the script will exit with an error.")]),e._v(" "),t("div",{staticClass:"language- extra-class"},[t("pre",{pre:!0,attrs:{class:"language-text"}},[t("code",[e._v("🚨 /var/backups/backup.tar.gz.gpg does not exist.\n")])])]),t("p",[e._v("Just as the "),t("code",[e._v("btcpay-backup.sh")]),e._v(" script, the restore will stop at ANY error it may encounter.\nIf the backup file was created while the "),t("code",[e._v("BTCPAY_BACKUP_PASSPHRASE")]),e._v(" was set but not used on restoring, the following error would occur:")]),e._v(" "),t("div",{staticClass:"language- extra-class"},[t("pre",{pre:!0,attrs:{class:"language-text"}},[t("code",[e._v("🚨 Decryption failed. Please check the error message above.\n")])])]),t("p",[e._v("When the restore has completed, you get the message:")]),e._v(" "),t("div",{staticClass:"language- extra-class"},[t("pre",{pre:!0,attrs:{class:"language-text"}},[t("code",[e._v("✅ Restore done\n")])])]),t("p",[e._v("Everything should be up and running again when the restore is complete.\nYou've successfully restored your BTCPay Server. Congratulations!")]),e._v(" "),t("div",{staticClass:"custom-block tip"},[t("p",{staticClass:"custom-block-title"},[e._v("TIP")]),e._v(" "),t("p",[e._v("Always make sure your backup strategy is tested and fits your needs.\nNo one solution fits all, and we tried to cover the basic cases.\nFor the latest updates, always feel free to ask on the BTCPay Server community channels.")])])])}),[],!1,null,null,null);t.default=r.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[127],{763:function(e,t,a){"use strict";a.r(t);var s=a(10),r=Object(s.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"backup-restore"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#backup-restore"}},[e._v("#")]),e._v(" Backup & Restore")]),e._v(" "),t("p",[e._v("This guide gets you up to speed with the "),t("RouterLink",{attrs:{to:"/Docker/"}},[e._v("Docker deployment")]),e._v("'s Backup & Restore process.\nYou will learn about what to keep in mind when doing a backup and how to restore a backup.")],1),e._v(" "),t("p"),t("div",{staticClass:"table-of-contents"},[t("ul",[t("li",[t("a",{attrs:{href:"#remarks-and-considerations"}},[e._v("Remarks and Considerations")]),t("ul",[t("li",[t("a",{attrs:{href:"#lightning-channel-backup"}},[e._v("Lightning channel backup")])])])]),t("li",[t("a",{attrs:{href:"#how-does-the-backup-work"}},[e._v("How does the backup work?")]),t("ul",[t("li",[t("a",{attrs:{href:"#set-a-backup-passphrase"}},[e._v("Set a backup passphrase")])]),t("li",[t("a",{attrs:{href:"#automation-by-crontab"}},[e._v("Automation by crontab")])])])]),t("li",[t("a",{attrs:{href:"#how-to-restore"}},[e._v("How to restore?")])])])]),t("p"),e._v(" "),t("h2",{attrs:{id:"remarks-and-considerations"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#remarks-and-considerations"}},[e._v("#")]),e._v(" Remarks and Considerations")]),e._v(" "),t("p",[e._v("The original backups strategy in BTCPay Server still exists and can be found "),t("RouterLink",{attrs:{to:"/Docker/#how-can-i-back-up-my-btcpay-server"}},[e._v("here")]),e._v(".\nWhile this documentation covers the "),t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver-docker/pull/641",target:"_blank",rel:"noopener noreferrer"}},[e._v("new process"),t("OutboundLink")],1),e._v(", the old "),t("code",[e._v("backup.sh")]),e._v(" script still works.")],1),e._v(" "),t("div",{staticClass:"custom-block warning"},[t("p",{staticClass:"custom-block-title"},[e._v("WARNING")]),e._v(" "),t("p",[e._v("BTCPay Server is and will never be responsible for your backup.\nPlease make sure the backup includes the files and data you want to store.\nAlso, test the restore process before starting to rely on it.")])]),e._v(" "),t("h3",{attrs:{id:"lightning-channel-backup"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#lightning-channel-backup"}},[e._v("#")]),e._v(" Lightning channel backup")]),e._v(" "),t("p",[e._v("Please be aware of this important issue:\nOld Lightning channel state is toxic!\nYou can lose all your funds if you close a channel based on an outdated state — and the state changes often!\nIf you publish an old state (say from yesterday's backup), you will most likely lose all your funds in the channel because the counterparty might publish a "),t("a",{attrs:{href:"https://www.d11n.net/lightning-network-payment-channel-lifecycle.html#what-happens-in-case-of-a-false-close%3F",target:"_blank",rel:"noopener noreferrer"}},[e._v("revocation transaction"),t("OutboundLink")],1),e._v("!")]),e._v(" "),t("p",[e._v("There is a high chance of failure in a disaster recovery scenario, where you may do a backup once per night and need to restore that one backup.")]),e._v(" "),t("p",[e._v("The Lightning channel backup from the "),t("code",[e._v("btcpay-backup.sh")]),e._v(" script will be sufficient in a migration case, where the shutdown of the old server happens cleanly.\nThe old server should not be started after the restoration and start of the new server.")]),e._v(" "),t("div",{staticClass:"custom-block tip"},[t("p",{staticClass:"custom-block-title"},[e._v("TIP")]),e._v(" "),t("p",[e._v("The Lightning static channel backup should be watched by a script and copied over to a remote server to ensure you always have the latest state available.\nWe will provide such a script with a future update.\nFor now, keep the above in mind when restoring from the backup!")])]),e._v(" "),t("h2",{attrs:{id:"how-does-the-backup-work"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#how-does-the-backup-work"}},[e._v("#")]),e._v(" How does the backup work?")]),e._v(" "),t("p",[e._v("The backup process is run with the "),t("code",[e._v("btcpay-backup.sh")]),e._v(" script.")]),e._v(" "),t("p",[e._v("Log in to your server, switch to the "),t("code",[e._v("root")]),e._v(" user and type the following:")]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token comment"}},[e._v("# The backup script needs to be run as the root user")]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("sudo")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("su")]),e._v(" -\n\n"),t("span",{pre:!0,attrs:{class:"token comment"}},[e._v("# As the other scripts, it is inside the BTCPay base directory")]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("cd")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token variable"}},[e._v("$BTCPAY_BASE_DIRECTORY")]),e._v("/btcpayserver-docker\n./btcpay-backup.sh\n")])])]),t("p",[e._v("The backup process needs to be run as "),t("code",[e._v("root")]),e._v(".\nIt will check for and let you know if you have to switch users.")]),e._v(" "),t("p",[e._v("The script will do the following steps:")]),e._v(" "),t("ul",[t("li",[e._v("Ensure the database container is running")]),e._v(" "),t("li",[e._v("Make a dump of the database")]),e._v(" "),t("li",[e._v("Stop BTCPay Server")]),e._v(" "),t("li",[e._v("Archive the Docker volumes and database dump\n"),t("ul",[t("li",[e._v("Excluding the blockchains "),t("code",[e._v("blocks")]),e._v(" and "),t("code",[e._v("chainstate")]),e._v(" directories")]),e._v(" "),t("li",[e._v("Optional: "),t("a",{attrs:{href:"#set-a-backup-passphrase"}},[e._v("Encrypt the archive")])])])]),e._v(" "),t("li",[e._v("Restart BTCPay Server")]),e._v(" "),t("li",[e._v("Cleanup: Remove temporary files like the database dump")])]),e._v(" "),t("p",[e._v("If the backup directory doesn't exist yet, the script will create it.\nWith these preparations taken, the backup process is now starting.")]),e._v(" "),t("p",[e._v("The script has checks to ensure it either works or fails with a comprehensive error message at every step of the way.\nIf there are errors, you will be notified like this:")]),e._v(" "),t("div",{staticClass:"language- extra-class"},[t("pre",{pre:!0,attrs:{class:"language-text"}},[t("code",[e._v("🚨 Database container could not be started or found.\n")])])]),t("p",[e._v("If everything works smoothly, you will see multiple completed marks in your console.\nWhenever the backup has completed successfully, it will state:")]),e._v(" "),t("div",{staticClass:"language- extra-class"},[t("pre",{pre:!0,attrs:{class:"language-text"}},[t("code",[e._v("✅ Backup done => /var/lib/docker/volumes/backup_datadir/_data/backup.tar.gz\n")])])]),t("p",[e._v("Your BTCPay Server has now finished the backup process.\nYou must store these backups safely, for instance, by copying them to a remote server.")]),e._v(" "),t("p",[e._v("After making a backup the first time, it is always wise to at least test your backup in a restore scenario.\nWe will go over the extra options you can set with your backup in the next topic.")]),e._v(" "),t("h3",{attrs:{id:"set-a-backup-passphrase"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#set-a-backup-passphrase"}},[e._v("#")]),e._v(" Set a backup passphrase")]),e._v(" "),t("p",[e._v("You can set the "),t("code",[e._v("BTCPAY_BACKUP_PASSPHRASE")]),e._v(" environment variable for encrypting the backup.\nThis passphrase will be used by the backup and restore scripts to encrypt and decrypt the backup file.\nFor the backup script, this would look like the following:")]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token comment"}},[e._v("# Set the passphrase without adding it to the shell history")]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("read")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-s")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-p")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"Enter passphrase: "')]),e._v(" BTCPAY_BACKUP_PASSPHRASE\n"),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("export")]),e._v(" BTCPAY_BACKUP_PASSPHRASE\n\n./btcpay-backup.sh\n")])])]),t("p",[e._v("This "),t("code",[e._v("BTCPAY_BACKUP_PASSPHRASE")]),e._v(" if set, is necessary to be in the "),t("a",{attrs:{href:"#how-to-restore"}},[e._v("restore process")]),e._v(" as well.")]),e._v(" "),t("h3",{attrs:{id:"automation-by-crontab"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#automation-by-crontab"}},[e._v("#")]),e._v(" Automation by crontab")]),e._v(" "),t("p",[e._v("Here is an example of a crontab script that does a nightly backup at 4:15 AM:")]),e._v(" "),t("div",{staticClass:"language- extra-class"},[t("pre",{pre:!0,attrs:{class:"language-text"}},[t("code",[e._v("SHELL=/bin/bash\nPATH=/bin:/usr/sbin:/usr/bin:/usr/local/bin\n15 4 * * * /root/BTCPayServer/btcpayserver-docker/btcpay-backup.sh >/dev/null 2>&1\n")])])]),t("p",[e._v("You need to set the right "),t("code",[e._v("SHELL")]),e._v(" and "),t("code",[e._v("PATH")]),e._v(", so that the script can run with the correct context.\nYou might also want to set the "),t("code",[e._v("BTCPAY_BACKUP_PASSPHRASE")]),e._v(" environment variable.")]),e._v(" "),t("p",[e._v("Also ensure the base path (here "),t("code",[e._v("/root/BTCPayServer")]),e._v(") matches the output of "),t("code",[e._v("echo $BTCPAY_BASE_DIRECTORY")]),e._v(".")]),e._v(" "),t("h2",{attrs:{id:"how-to-restore"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#how-to-restore"}},[e._v("#")]),e._v(" How to restore?")]),e._v(" "),t("p",[e._v("It's very similar to the "),t("code",[e._v("btcpay-backup.sh")]),e._v(" process but in reverse.\nThe "),t("code",[e._v("btcpay-restore.sh")]),e._v(" script needs to be run with the path to your "),t("code",[e._v("backup.tar.gz")]),e._v(" file.")]),e._v(" "),t("p",[e._v("First off, open a terminal and type the following as root.\nRemember that if you set "),t("code",[e._v("BTCPAY_BACKUP_PASSPHRASE")]),e._v(" on the backup, you also need to provide it for decryption :")]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token comment"}},[e._v("# The restore script needs to be run as the root user")]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("sudo")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("su")]),e._v(" -\n\n"),t("span",{pre:!0,attrs:{class:"token comment"}},[e._v("# As the other scripts, it is inside the BTCPay base directory")]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("cd")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token variable"}},[e._v("$BTCPAY_BASE_DIRECTORY")]),e._v("/btcpayserver-docker\n\n"),t("span",{pre:!0,attrs:{class:"token comment"}},[e._v("# Optional: Set the passphrase if you have used one for the backup")]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("read")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-s")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-p")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"Enter passphrase: "')]),e._v(" BTCPAY_BACKUP_PASSPHRASE\n"),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("export")]),e._v(" BTCPAY_BACKUP_PASSPHRASE\n\n"),t("span",{pre:!0,attrs:{class:"token comment"}},[e._v("# Run the restore script with the full path to the backup file")]),e._v("\n./btcpay-restore.sh /var/backups/backup.tar.gz.gpg\n")])])]),t("p",[e._v("The script will do the following steps:")]),e._v(" "),t("ul",[t("li",[e._v("Extract (and decrypt) the backup archive")]),e._v(" "),t("li",[e._v("Stop BTCPay Server")]),e._v(" "),t("li",[e._v("Restore the Docker volumes")]),e._v(" "),t("li",[e._v("Start the database container")]),e._v(" "),t("li",[e._v("Import the database dump")]),e._v(" "),t("li",[e._v("Restart BTCPay Server")]),e._v(" "),t("li",[e._v("Cleanup: Remove the temporary restore directory")])]),e._v(" "),t("p",[e._v("If the backup file cannot be found in the provided path, the script will exit with an error.")]),e._v(" "),t("div",{staticClass:"language- extra-class"},[t("pre",{pre:!0,attrs:{class:"language-text"}},[t("code",[e._v("🚨 /var/backups/backup.tar.gz.gpg does not exist.\n")])])]),t("p",[e._v("Just as the "),t("code",[e._v("btcpay-backup.sh")]),e._v(" script, the restore will stop at ANY error it may encounter.\nIf the backup file was created while the "),t("code",[e._v("BTCPAY_BACKUP_PASSPHRASE")]),e._v(" was set but not used on restoring, the following error would occur:")]),e._v(" "),t("div",{staticClass:"language- extra-class"},[t("pre",{pre:!0,attrs:{class:"language-text"}},[t("code",[e._v("🚨 Decryption failed. Please check the error message above.\n")])])]),t("p",[e._v("When the restore has completed, you get the message:")]),e._v(" "),t("div",{staticClass:"language- extra-class"},[t("pre",{pre:!0,attrs:{class:"language-text"}},[t("code",[e._v("✅ Restore done\n")])])]),t("p",[e._v("Everything should be up and running again when the restore is complete.\nYou've successfully restored your BTCPay Server. Congratulations!")]),e._v(" "),t("div",{staticClass:"custom-block tip"},[t("p",{staticClass:"custom-block-title"},[e._v("TIP")]),e._v(" "),t("p",[e._v("Always make sure your backup strategy is tested and fits your needs.\nNo one solution fits all, and we tried to cover the basic cases.\nFor the latest updates, always feel free to ask on the BTCPay Server community channels.")])])])}),[],!1,null,null,null);t.default=r.exports}}]); \ No newline at end of file diff --git a/assets/js/128.d7eb67c1.js b/assets/js/128.36d7cbf6.js similarity index 98% rename from assets/js/128.d7eb67c1.js rename to assets/js/128.36d7cbf6.js index 5a81a557b9..3e280befaa 100644 --- a/assets/js/128.d7eb67c1.js +++ b/assets/js/128.36d7cbf6.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[128],{759:function(t,a,s){"use strict";s.r(a);var e=s(10),r=Object(e.a)({},(function(){var t=this,a=t._self._c;return a("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[a("h1",{attrs:{id:"chatwoot-support"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#chatwoot-support"}},[t._v("#")]),t._v(" Chatwoot support")]),t._v(" "),a("p",[a("a",{attrs:{href:"https://www.chatwoot.com/",target:"_blank",rel:"noopener noreferrer"}},[t._v("Chatwoot"),a("OutboundLink")],1),t._v(" is a customer support tool for instant messaging channels which can help businesses provide exceptional customer support.")]),t._v(" "),a("h2",{attrs:{id:"how-to-use"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#how-to-use"}},[t._v("#")]),t._v(" How to use")]),t._v(" "),a("ol",[a("li",[t._v("Connect as root to your server")]),t._v(" "),a("li",[t._v("create chatwoot configuration file where "),a("code",[t._v("{CONFIG DATA HERE}")]),t._v(" is replaced by settings from "),a("a",{attrs:{href:"https://www.chatwoot.com/docs/environment-variables",target:"_blank",rel:"noopener noreferrer"}},[t._v("here"),a("OutboundLink")],1)])]),t._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[a("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("su")]),t._v(" -\n"),a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("cd")]),t._v(" btcpayserver-docker\n"),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("cat")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">>")]),t._v(" Generated/chatwoot-config.env "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<<")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v("EOL\n{CONFIG DATA HERE}\n{CONFIG DATA HERE}\nEOL")]),t._v("\n")])])]),a("ol",{attrs:{start:"3"}},[a("li",[t._v("Add chatwoot as an option to your BTCPay deployment and set the host to use (point DNS to server as well)")])]),t._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[a("span",{pre:!0,attrs:{class:"token assign-left variable"}},[t._v("CHATWOOT_HOST")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"chatwoot.xpayserver.com"')]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token assign-left variable"}},[t._v("BTCPAYGEN_ADDITIONAL_FRAGMENTS")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"'),a("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$BTCPAYGEN_ADDITIONAL_FRAGMENTS")]),t._v(';opt-add-chatwoot"')]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v(".")]),t._v(" btcpay-setup.sh "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-i")]),t._v("\n\n")])])]),a("ol",{attrs:{start:"4"}},[a("li",[t._v("Wait for BTPay to be online and then create the database for chatwoot")])]),t._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[a("span",{pre:!0,attrs:{class:"token function"}},[t._v("docker")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("exec")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-ti")]),t._v(" chatwoot "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("sh")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-c")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"export DISABLE_DATABASE_ENVIRONMENT_CHECK=1 && bundle exec rails db:reset"')]),t._v("\n")])])]),a("ol",{attrs:{start:"4"}},[a("li",[t._v("Go to chatwoot website at https://chatwoot.xpayserver.com and set up.")])])])}),[],!1,null,null,null);a.default=r.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[128],{760:function(t,a,s){"use strict";s.r(a);var e=s(10),r=Object(e.a)({},(function(){var t=this,a=t._self._c;return a("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[a("h1",{attrs:{id:"chatwoot-support"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#chatwoot-support"}},[t._v("#")]),t._v(" Chatwoot support")]),t._v(" "),a("p",[a("a",{attrs:{href:"https://www.chatwoot.com/",target:"_blank",rel:"noopener noreferrer"}},[t._v("Chatwoot"),a("OutboundLink")],1),t._v(" is a customer support tool for instant messaging channels which can help businesses provide exceptional customer support.")]),t._v(" "),a("h2",{attrs:{id:"how-to-use"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#how-to-use"}},[t._v("#")]),t._v(" How to use")]),t._v(" "),a("ol",[a("li",[t._v("Connect as root to your server")]),t._v(" "),a("li",[t._v("create chatwoot configuration file where "),a("code",[t._v("{CONFIG DATA HERE}")]),t._v(" is replaced by settings from "),a("a",{attrs:{href:"https://www.chatwoot.com/docs/environment-variables",target:"_blank",rel:"noopener noreferrer"}},[t._v("here"),a("OutboundLink")],1)])]),t._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[a("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("su")]),t._v(" -\n"),a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("cd")]),t._v(" btcpayserver-docker\n"),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("cat")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">>")]),t._v(" Generated/chatwoot-config.env "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<<")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v("EOL\n{CONFIG DATA HERE}\n{CONFIG DATA HERE}\nEOL")]),t._v("\n")])])]),a("ol",{attrs:{start:"3"}},[a("li",[t._v("Add chatwoot as an option to your BTCPay deployment and set the host to use (point DNS to server as well)")])]),t._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[a("span",{pre:!0,attrs:{class:"token assign-left variable"}},[t._v("CHATWOOT_HOST")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"chatwoot.xpayserver.com"')]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token assign-left variable"}},[t._v("BTCPAYGEN_ADDITIONAL_FRAGMENTS")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"'),a("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$BTCPAYGEN_ADDITIONAL_FRAGMENTS")]),t._v(';opt-add-chatwoot"')]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v(".")]),t._v(" btcpay-setup.sh "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-i")]),t._v("\n\n")])])]),a("ol",{attrs:{start:"4"}},[a("li",[t._v("Wait for BTPay to be online and then create the database for chatwoot")])]),t._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[a("span",{pre:!0,attrs:{class:"token function"}},[t._v("docker")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("exec")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-ti")]),t._v(" chatwoot "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("sh")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-c")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"export DISABLE_DATABASE_ENVIRONMENT_CHECK=1 && bundle exec rails db:reset"')]),t._v("\n")])])]),a("ol",{attrs:{start:"4"}},[a("li",[t._v("Go to chatwoot website at https://chatwoot.xpayserver.com and set up.")])])])}),[],!1,null,null,null);a.default=r.exports}}]); \ No newline at end of file diff --git a/assets/js/129.092e6ae5.js b/assets/js/129.d67ce490.js similarity index 97% rename from assets/js/129.092e6ae5.js rename to assets/js/129.d67ce490.js index fd93964ee3..94ef7803cc 100644 --- a/assets/js/129.092e6ae5.js +++ b/assets/js/129.d67ce490.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[129],{764:function(s,e,t){"use strict";t.r(e);var a=t(10),r=Object(a.a)({},(function(){var s=this,e=s._self._c;return e("ContentSlotsDistributor",{attrs:{"slot-key":s.$parent.slotKey}},[e("h1",{attrs:{id:"firefly-iii-support"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#firefly-iii-support"}},[s._v("#")]),s._v(" Firefly III support")]),s._v(" "),e("p",[e("a",{attrs:{href:"https://www.firefly-iii.org/",target:"_blank",rel:"noopener noreferrer"}},[s._v("Firefly III"),e("OutboundLink")],1),s._v(" is a self-hosted financial manager.\nIt can help you keep track of expenses, income, budgets and everything in between. It supports credit cards, shared household accounts and savings accounts. It’s pretty fancy. You should use it to save and organise money.")]),s._v(" "),e("h2",{attrs:{id:"how-to-use"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#how-to-use"}},[s._v("#")]),s._v(" How to use")]),s._v(" "),e("ol",[e("li",[s._v("Connect as root to your server")]),s._v(" "),e("li",[s._v("Configure a domain's DNS to point to your server ip. e.g. "),e("code",[s._v("firefly.yourserver.org")])]),s._v(" "),e("li",[s._v("Add fireflyiii as an option to your docker deployment")])]),s._v(" "),e("div",{staticClass:"language-bash extra-class"},[e("pre",{pre:!0,attrs:{class:"language-bash"}},[e("code",[e("span",{pre:!0,attrs:{class:"token assign-left variable"}},[s._v("BTCPAYGEN_ADDITIONAL_FRAGMENTS")]),e("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),e("span",{pre:!0,attrs:{class:"token string"}},[s._v('"'),e("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$BTCPAYGEN_ADDITIONAL_FRAGMENTS")]),s._v(';opt-add-fireflyiii"')]),s._v("\n"),e("span",{pre:!0,attrs:{class:"token assign-left variable"}},[s._v("FIREFLY_HOST")]),e("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),e("span",{pre:!0,attrs:{class:"token string"}},[s._v('"firefly.yourserver.org"')]),s._v("\n"),e("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v(".")]),s._v(" btcpay-setup.sh "),e("span",{pre:!0,attrs:{class:"token parameter variable"}},[s._v("-i")]),s._v("\n"),e("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v(".")]),s._v(" ./Tools/fireflyiii/init.sh\n")])])]),e("ol",{attrs:{start:"4"}},[e("li",[s._v("Access Firefly III at "),e("code",[s._v("firefly.yourserver.org")]),s._v(" and create your admin account.")])])])}),[],!1,null,null,null);e.default=r.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[129],{766:function(s,e,t){"use strict";t.r(e);var a=t(10),r=Object(a.a)({},(function(){var s=this,e=s._self._c;return e("ContentSlotsDistributor",{attrs:{"slot-key":s.$parent.slotKey}},[e("h1",{attrs:{id:"firefly-iii-support"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#firefly-iii-support"}},[s._v("#")]),s._v(" Firefly III support")]),s._v(" "),e("p",[e("a",{attrs:{href:"https://www.firefly-iii.org/",target:"_blank",rel:"noopener noreferrer"}},[s._v("Firefly III"),e("OutboundLink")],1),s._v(" is a self-hosted financial manager.\nIt can help you keep track of expenses, income, budgets and everything in between. It supports credit cards, shared household accounts and savings accounts. It’s pretty fancy. You should use it to save and organise money.")]),s._v(" "),e("h2",{attrs:{id:"how-to-use"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#how-to-use"}},[s._v("#")]),s._v(" How to use")]),s._v(" "),e("ol",[e("li",[s._v("Connect as root to your server")]),s._v(" "),e("li",[s._v("Configure a domain's DNS to point to your server ip. e.g. "),e("code",[s._v("firefly.yourserver.org")])]),s._v(" "),e("li",[s._v("Add fireflyiii as an option to your docker deployment")])]),s._v(" "),e("div",{staticClass:"language-bash extra-class"},[e("pre",{pre:!0,attrs:{class:"language-bash"}},[e("code",[e("span",{pre:!0,attrs:{class:"token assign-left variable"}},[s._v("BTCPAYGEN_ADDITIONAL_FRAGMENTS")]),e("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),e("span",{pre:!0,attrs:{class:"token string"}},[s._v('"'),e("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$BTCPAYGEN_ADDITIONAL_FRAGMENTS")]),s._v(';opt-add-fireflyiii"')]),s._v("\n"),e("span",{pre:!0,attrs:{class:"token assign-left variable"}},[s._v("FIREFLY_HOST")]),e("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),e("span",{pre:!0,attrs:{class:"token string"}},[s._v('"firefly.yourserver.org"')]),s._v("\n"),e("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v(".")]),s._v(" btcpay-setup.sh "),e("span",{pre:!0,attrs:{class:"token parameter variable"}},[s._v("-i")]),s._v("\n"),e("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v(".")]),s._v(" ./Tools/fireflyiii/init.sh\n")])])]),e("ol",{attrs:{start:"4"}},[e("li",[s._v("Access Firefly III at "),e("code",[s._v("firefly.yourserver.org")]),s._v(" and create your admin account.")])])])}),[],!1,null,null,null);e.default=r.exports}}]); \ No newline at end of file diff --git a/assets/js/13.4d492e31.js b/assets/js/13.1ca29b4c.js similarity index 89% rename from assets/js/13.4d492e31.js rename to assets/js/13.1ca29b4c.js index 9f3ca860ab..e26591aa5c 100644 --- a/assets/js/13.4d492e31.js +++ b/assets/js/13.1ca29b4c.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[13],{293:function(e,t,a){e.exports=a.p+"assets/img/btcpay-vm--19-troubleshoot-403-callback.51193927.png"},612:function(e,t,a){e.exports=a.p+"assets/img/btcpay-vm--01-install-web.4d28e0bd.png"},613:function(e,t,a){e.exports=a.p+"assets/img/btcpay-vm--02-install-upload.8972740d.png"},614:function(e,t,a){e.exports=a.p+"assets/img/btcpay-vm--03-enable-plugin.1b4a6c9f.png"},615:function(e,t,a){e.exports=a.p+"assets/img/btcpay-vm--04-add-new-payment-method.e5a94ee3.png"},616:function(e,t,a){e.exports=a.p+"assets/img/btcpay-vm--05-payment-method-details.adf89c97.png"},617:function(e,t,a){e.exports=a.p+"assets/img/btcpay-vm--06-payment-method-configuration-tab.45617db0.png"},618:function(e,t,a){e.exports=a.p+"assets/img/btcpay-vm--07-account-manage.d477b8b4.png"},619:function(e,t,a){e.exports=a.p+"assets/img/btcpay-vm--08-add-api-key.a58b2941.png"},620:function(e,t,a){e.exports=a.p+"assets/img/btcpay-vm--09-permissions-and-select-store.9ccef388.png"},621:function(e,t,a){e.exports=a.p+"assets/img/btcpay-vm--10-permissions-set.74d76936.png"},622:function(e,t,a){e.exports=a.p+"assets/img/btcpay-vm--11-copy-api-key.94be9878.png"},623:function(e,t,a){e.exports=a.p+"assets/img/btcpay-vm--12-copy-store-id.84c19f9f.png"},624:function(e,t,a){e.exports=a.p+"assets/img/btcpay-vm--13-save-vm-payment-method-form.0a3e52bd.png"},625:function(e,t,a){e.exports=a.p+"assets/img/btcpay-vm--14-create-webhook.1b6e4881.png"},626:function(e,t,a){e.exports=a.p+"assets/img/btcpay-vm--15-webhook-payload-url.37a4f55f.png"},627:function(e,t,a){e.exports=a.p+"assets/img/btcpay-vm--16-webhook-copy-secret.71b0dd07.png"},628:function(e,t,a){e.exports=a.p+"assets/img/btcpay-vm--16-virtuemart-configuration-save.ee549862.png"},629:function(e,t,a){e.exports=a.p+"assets/img/btcpay-vm--17-webhook-save.dfd4fca5.png"},630:function(e,t,a){e.exports=a.p+"assets/img/btcpay-vm--18-troubleshoot-copy-callback-url.70d08e31.png"},828:function(e,t,a){"use strict";a.r(t);var o=a(10),r=Object(o.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"joomla-virtuemart-integration"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#joomla-virtuemart-integration"}},[e._v("#")]),e._v(" Joomla VirtueMart integration")]),e._v(" "),t("p",[e._v("This document explains how to "),t("strong",[e._v("integrate BTCPay Server into your Joomla VirtueMart store")]),e._v(".\nWatch the video below to go along the document |")]),e._v(" "),t("a",{staticClass:"ytEmbed",staticStyle:{"background-image":"url(https://img.youtube.com/vi/k7XfybLAky0/hqdefault.jpg)"},attrs:{href:"https://youtu.be/k7XfybLAky0",title:"BTCPay Server - Joomla VirtueMart","data-id":"k7XfybLAky0"}},[t("iframe",{attrs:{title:"BTCPay Server - Joomla VirtueMart","data-src":"https://www.youtube-nocookie.com/embed/k7XfybLAky0?&autoplay=1&autohide=1&modestbranding=1&color=white&rel=0",frameborder:"0",allow:"autoplay;encrypted-media;picture-in-picture",allowfullscreen:""}})]),e._v(" "),t("h2",{attrs:{id:"requirements"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#requirements"}},[e._v("#")]),e._v(" Requirements")]),e._v(" "),t("p",[e._v("Please ensure that you meet the following requirements before installing this plugin.")]),e._v(" "),t("ul",[t("li",[e._v("PHP version 7.4 or newer")]),e._v(" "),t("li",[e._v("The curl, gd, intl, json, and mbstring PHP extensions are available")]),e._v(" "),t("li",[e._v("A VirtueMart 3 / 4 store ("),t("a",{attrs:{href:"https://www.virtuemart.net/downloads",target:"_blank",rel:"noopener noreferrer"}},[e._v("Download and installation instructions"),t("OutboundLink")],1),e._v(")")]),e._v(" "),t("li",[e._v("You have a BTCPay Server version 1.3.0 or later, either "),t("RouterLink",{attrs:{to:"/Deployment/"}},[e._v("self-hosted")]),e._v(" or "),t("RouterLink",{attrs:{to:"/Deployment/ThirdPartyHosting/"}},[e._v("hosted by a third-party")])],1),e._v(" "),t("li",[t("RouterLink",{attrs:{to:"/RegisterAccount/"}},[e._v("You've a registered account on the instance")])],1),e._v(" "),t("li",[t("RouterLink",{attrs:{to:"/CreateStore/"}},[e._v("You've a BTCPay store on the instance")])],1),e._v(" "),t("li",[t("RouterLink",{attrs:{to:"/WalletSetup/"}},[e._v("You've a wallet connected to your store")])],1)]),e._v(" "),t("h2",{attrs:{id:"1-install-btcpay-plugin"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#1-install-btcpay-plugin"}},[e._v("#")]),e._v(" 1. Install BTCPay Plugin")]),e._v(" "),t("p",[e._v("There are three ways to "),t("strong",[e._v("download BTCPay for VirtueMart plugin")]),e._v(":")]),e._v(" "),t("ul",[t("li",[e._v("Via the Admin Dashboard (recommended, see below)")]),e._v(" "),t("li",[t("a",{attrs:{href:"https://extensions.joomla.org/extension/vm-payment-btcpay-for-virtuemart/",target:"_blank",rel:"noopener noreferrer"}},[e._v("Joomla Extension Directory (JED)"),t("OutboundLink")],1)]),e._v(" "),t("li",[t("a",{attrs:{href:"https://github.com/btcpayserver/joomla-virtuemart/releases",target:"_blank",rel:"noopener noreferrer"}},[e._v("GitHub Repository"),t("OutboundLink")],1)])]),e._v(" "),t("h3",{attrs:{id:"11-install-plugin-from-joomla-admin-dashboard-recommended"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#11-install-plugin-from-joomla-admin-dashboard-recommended"}},[e._v("#")]),e._v(" 1.1 Install plugin from Joomla Admin Dashboard (recommended)")]),e._v(" "),t("ol",[t("li",[e._v("Menu: Extensions > Manage > Install")]),e._v(" "),t("li",[e._v('On "Install from Web" tab search for "btcpay"')]),e._v(" "),t("li",[e._v("Click on BTCPay for VirtueMart and [Install] button")]),e._v(" "),t("li",[e._v("Continue with step 1.3")])]),e._v(" "),t("figure",[t("img",{attrs:{src:a(612),alt:"BTCPay Virtuemart: Plugin installation web",title:"BTCPay Virtuemart: Plugin installation web"}})]),e._v(" "),t("h3",{attrs:{id:"12-download-and-install-plugin-from-jed-or-github"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#12-download-and-install-plugin-from-jed-or-github"}},[e._v("#")]),e._v(" 1.2 Download and install plugin from JED or GitHub")]),e._v(" "),t("ol",[t("li",[e._v("Download the latest BTCPay plugin from "),t("a",{attrs:{href:"https://github.com/btcpayserver/joomla-virtuemart/releases",target:"_blank",rel:"noopener noreferrer"}},[e._v("Github"),t("OutboundLink")],1),e._v(" or "),t("a",{attrs:{href:"https://extensions.joomla.org/extension/vm-payment-btcpay-for-virtuemart/",target:"_blank",rel:"noopener noreferrer"}},[e._v("JED"),t("OutboundLink")],1)]),e._v(" "),t("li",[e._v("Menu: Extensions -> Manage -> Install")]),e._v(" "),t("li",[e._v('On tab "Upload Package File" upload the '),t("code",[e._v("btcpayvm.zip")])])]),e._v(" "),t("figure",[t("img",{attrs:{src:a(613),alt:"BTCPay Virtuemart: Plugin installation upload",title:"BTCPay Virtuemart: Plugin installation upload"}})]),e._v(" "),t("h3",{attrs:{id:"13-enable-the-plugin"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#13-enable-the-plugin"}},[e._v("#")]),e._v(" 1.3 Enable the plugin")]),e._v(" "),t("ol",[t("li",[e._v("Menu: Extensions -> Plugins")]),e._v(" "),t("li",[e._v('Search for "btcpay"')]),e._v(" "),t("li",[e._v('On "Status" column click the red circle to enable the plugin')])]),e._v(" "),t("figure",[t("img",{attrs:{src:a(614),alt:"BTCPay Virtuemart: Enable plugin",title:"BTCPay Virtuemart: Enable plugin"}})]),e._v(" "),t("h2",{attrs:{id:"2-connecting-virtuemart-and-btcpay-server"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#2-connecting-virtuemart-and-btcpay-server"}},[e._v("#")]),e._v(" 2. Connecting VirtueMart and BTCPay Server")]),e._v(" "),t("p",[e._v("BTCPay for Virtuemart plugin is a "),t("strong",[e._v("bridge between your BTCPay Server (payment processor) and your e-commerce store")]),e._v(".\nNo matter if you're using a self-hosted or third-party solution, the connection process is identical.")]),e._v(" "),t("h3",{attrs:{id:"21-add-btcpay-payment-gateway-in-virtuemart"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#21-add-btcpay-payment-gateway-in-virtuemart"}},[e._v("#")]),e._v(" 2.1 Add BTCPay payment gateway in VirtueMart")]),e._v(" "),t("ol",[t("li",[e._v("Menu: VirtueMart -> Payment Methods")]),e._v(" "),t("li",[e._v("Click button "),t("strong",[e._v("[New]")]),e._v(" "),t("img",{attrs:{src:a(615),alt:"BTCPay Virtuemart: Add new payment method",title:"BTCPay Virtuemart: Add new payment method"}})]),e._v(" "),t("li",[e._v('Configure the payment method according to your needs. Make sure on "Payment Method" dropdown you have "BTCPay for VirtueMart" selected and the payment method is published '),t("img",{attrs:{src:a(616),alt:"BTCPay Virtuemart: Payment method details",title:"BTCPay Virtuemart: Payment method details"}})]),e._v(" "),t("li",[e._v("Hit the "),t("strong",[e._v("[Save]")]),e._v(" button (the plugin table will get created)")])]),e._v(" "),t("p",[e._v('Now you can switch to the "Configuration" tab where we can connect to our BTCPay Server instance. First we need to create an API key.')]),e._v(" "),t("figure",[t("img",{attrs:{src:a(617),alt:"BTCPay Virtuemart: Payment method configuration tab",title:"BTCPay Virtuemart: Payment method configuration tab"}})]),e._v(" "),t("h3",{attrs:{id:"22-create-an-api-key-and-configure-permissions"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#22-create-an-api-key-and-configure-permissions"}},[e._v("#")]),e._v(" 2.2 Create an API key and configure permissions")]),e._v(" "),t("p",[e._v("On BTCPay Server instance:")]),e._v(" "),t("ol",[t("li",[e._v("Click on "),t("em",[e._v("[Account]")])]),e._v(" "),t("li",[e._v("Click on "),t("em",[e._v("[Manage Account]")]),e._v(" "),t("img",{attrs:{src:a(618),alt:"BTCPay Joomla VirtueMart: Manage Account",title:"BTCPay Joomla VirtueMart: Manage Account"}})]),e._v(" "),t("li",[e._v("Go to the tab "),t("em",[e._v('"API Keys"')])]),e._v(" "),t("li",[e._v("Click "),t("em",[e._v("[Generate Key]")]),e._v(" to select permissions.\n"),t("img",{attrs:{src:a(619),alt:"BTCPay Joomla VirtueMart: API Keys overview",title:"BTCPay Joomla VirtueMart: API Keys overview"}})]),e._v(" "),t("li",[e._v("Add a label. "),t("strong",[e._v("Important:")]),e._v(" click on the "),t("em",[e._v('"Select specific stores"')]),e._v(" link for the following permissions: "),t("code",[e._v("View invoices")]),e._v(", "),t("code",[e._v("Create invoice")]),e._v(", "),t("code",[e._v("Modify invoices")]),e._v(", "),t("code",[e._v("Modify stores webhooks")]),e._v(", "),t("code",[e._v("View your stores")]),e._v(" and select the specific store you created for your VirtueMart site. It should look like when everything is set:\n"),t("img",{attrs:{src:a(620),alt:"BTCPay Joomla VirtueMart: API Keys Permissions",title:"BTCPay Joomla VirtueMart: API Keys Permissions"}})]),e._v(" "),t("li",[e._v("Click on "),t("em",[e._v("[Generate API Key]")]),e._v(" "),t("img",{attrs:{src:a(621),alt:"BTCPay Joomla VirtueMart: API Keys Save",title:"BTCPay Joomla VirtueMart: API Keys Save"}})]),e._v(" "),t("li",[e._v("Copy the generated API Key to your "),t("em",[e._v("VirtueMart BTCPay Payment Method Settings")]),e._v(" form\n"),t("img",{attrs:{src:a(622),alt:"BTCPay Joomla VirtueMart: Copy API Key",title:"BTCPay Joomla VirtueMart: Copy API Key"}})]),e._v(" "),t("li",[e._v("Go to Settings and copy the store ID to your "),t("em",[e._v("VirtueMart BTCPay Payment Method Settings")]),e._v(" form\n"),t("img",{attrs:{src:a(623),alt:"BTCPay Joomla VirtueMart: Copy Store ID",title:"BTCPay Joomla VirtueMart: Copy Store ID"}})]),e._v(" "),t("li",[e._v("On the "),t("em",[e._v("VirtueMart BTCPay Payment Method Settings")]),e._v(" form make sure "),t("strong",[e._v("BTPCay Server URL")]),e._v(", "),t("strong",[e._v("API Key")]),e._v(" and "),t("strong",[e._v("Store ID")]),e._v(" are set and click "),t("strong",[e._v("[Save]")]),e._v(" "),t("img",{attrs:{src:a(624),alt:"BTCPay Joomla VirtueMart: Save VirtueMart Settings form",title:"BTCPay Joomla VirtueMart: Save VirtueMart Settings form"}})])]),e._v(" "),t("h3",{attrs:{id:"23-create-a-webhook-on-btcpay-server"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#23-create-a-webhook-on-btcpay-server"}},[e._v("#")]),e._v(" 2.3 Create a webhook on BTCPay Server")]),e._v(" "),t("p",[e._v("Setting up a webhook is important that your gets updates on invoice status changes from BTCPay Server.")]),e._v(" "),t("ol",[t("li",[t("p",[e._v("On BTCPay Server instance go to your store settings, tab "),t("strong",[e._v("[Webhooks]")]),e._v(", click "),t("strong",[e._v("[Create Webhook]")]),e._v(" "),t("img",{attrs:{src:a(625),alt:"BTCPay Joomla VirtueMart: Create webhook",title:"BTCPay Joomla VirtueMart: Create webhook"}})])]),e._v(" "),t("li",[t("p",[e._v("From "),t("em",[e._v("VirtueMart BTCPay Payment Method Settings")]),e._v(" copy the "),t("strong",[e._v("Webhook callback URL")]),e._v(" to webhook settings "),t("strong",[e._v("Payload URL")]),e._v(".\n"),t("img",{attrs:{src:a(626),alt:"BTCPay Joomla VirtueMart: Webhook payload URL",title:"BTCPay Joomla VirtueMart: Webhook payload URL"}})])]),e._v(" "),t("li",[t("p",[e._v("On webhook settings click on the eye to reveal webhook secret. Copy that secret to your "),t("em",[e._v("VirtueMart BTCPay Payment Method Settings")]),e._v(" form "),t("strong",[e._v("Webhook Secret")]),e._v(" input and "),t("strong",[e._v("[Save]")]),e._v(" the VirtueMart configuration again.\n"),t("img",{attrs:{src:a(627),alt:"BTCPay Joomla VirtueMart: Webhook payload URL",title:"BTCPay Joomla VirtueMart: Webhook payload URL"}}),e._v(" "),t("img",{attrs:{src:a(628),alt:"BTCPay Joomla VirtueMart: Webhook VM save configuration",title:"BTCPay Joomla VirtueMart: Webhook VM save configuration"}})])]),e._v(" "),t("li",[t("p",[e._v("Back on webhook settings, enable "),t("strong",[e._v("Automatic redelivery")]),e._v(" and click "),t("strong",[e._v("[Add webhook]")]),e._v(" to save the webhook.\n"),t("img",{attrs:{src:a(629),alt:"BTCPay Joomla VirtueMart: Webhook payload URL",title:"BTCPay Joomla VirtueMart: Webhook payload URL"}})])])]),e._v(" "),t("h2",{attrs:{id:"3-test-the-checkout"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#3-test-the-checkout"}},[e._v("#")]),e._v(" 3. Test the checkout")]),e._v(" "),t("p",[e._v("Everything is ready to go now. Do a small test purchase and make sure the order status gets updated according to the BTCPay invoice status. On BTCPay Server invoice details you can see if the webhook events were fired successfully.")]),e._v(" "),t("h2",{attrs:{id:"customizing-virtuemart-btcpay-payment-method-settings"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#customizing-virtuemart-btcpay-payment-method-settings"}},[e._v("#")]),e._v(" Customizing VirtueMart BTCPay payment method settings")]),e._v(" "),t("p",[e._v('Your VirtueMart BTCPay payment method settings can be found in menu: VirtueMart -> Payment Methods. Click on the payment method of type "btcpayvm" you created.')]),e._v(" "),t("h3",{attrs:{id:"section-btcpay-server-connection-settings"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#section-btcpay-server-connection-settings"}},[e._v("#")]),e._v(" Section: BTCPay Server connection settings")]),e._v(" "),t("p",[e._v("This is the most important part of the configuration. The data entered here will connect your VirtueMart shop with your counterparty store configured on BTCPay Server.")]),e._v(" "),t("p",[t("strong",[e._v("BTCPay Server URL")])]),e._v(" "),t("p",[e._v("URL to your BTCPay Server instance, including protocol e.g. "),t("code",[e._v("https://btcpay.yourdomain.com")]),e._v(".")]),e._v(" "),t("p",[t("strong",[e._v("API Key")])]),e._v(" "),t("p",[e._v("Your BTCPay API Key as mentioned "),t("a",{attrs:{href:"#22-create-an-api-key-and-configure-permissions"}},[e._v("here")]),e._v(".")]),e._v(" "),t("p",[t("strong",[e._v("Store ID")])]),e._v(" "),t("p",[e._v("The store ID of your BTCPay Server store. Can be found on the store settings page. See 8. "),t("a",{attrs:{href:"#22-create-an-api-key-and-configure-permissions"}},[e._v("here")])]),e._v(" "),t("p",[t("strong",[e._v("Webhook Secret")])]),e._v(" "),t("p",[e._v("The wehbook secret which was generated on webhook createion, see "),t("a",{attrs:{href:"#23-create-a-webhook-on-btcpay-server"}},[e._v("here")])]),e._v(" "),t("p",[t("strong",[e._v("Webhook callback URL")])]),e._v(" "),t("p",[e._v("This field is auto-generated by the plugin and helps you when creating the webhook on BTCPay Server. It contains the needed payment method id and parameters to allow processing of callbacks.")]),e._v(" "),t("h3",{attrs:{id:"section-order-states-mapping"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#section-order-states-mapping"}},[e._v("#")]),e._v(" Section: Order states mapping")]),e._v(" "),t("p",[e._v("You can adjust the mapping of BTCPay Server invoice status to VirtueMart order states. On the left are the invoice states and on the right the order states. The defaults here should be good to go - but if you need, you can overwrite them.")]),e._v(" "),t("p",[e._v("VirtueMart order statuses are explained "),t("a",{attrs:{href:"https://docs.virtuemart.net/manual/configuration-menu/order-statuses.html",target:"_blank",rel:"noopener noreferrer"}},[e._v("here"),t("OutboundLink")],1)]),e._v(" "),t("p",[e._v("BTCPay server invoice statuses are explained "),t("RouterLink",{attrs:{to:"/Invoices/#invoice-statuses"}},[e._v("here")])],1),e._v(" "),t("h3",{attrs:{id:"section-restrictions"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#section-restrictions"}},[e._v("#")]),e._v(" Section: Restrictions")]),e._v(" "),t("p",[e._v("These are VirtueMart provided restrictions you know from other payment plugins. You can restrict the amount or countries when the payment method will be available.")]),e._v(" "),t("h3",{attrs:{id:"section-discounts-and-fees"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#section-discounts-and-fees"}},[e._v("#")]),e._v(" Section Discounts and fees")]),e._v(" "),t("p",[e._v("These are VirtueMart provided settings. You can set a fee, cashback and apply tax rules or set a custom logo for the payment method.")]),e._v(" "),t("h2",{attrs:{id:"troubleshooting"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#troubleshooting"}},[e._v("#")]),e._v(" Troubleshooting")]),e._v(" "),t("h3",{attrs:{id:"error-on-checkout-there-was-an-error-processing-the-payment-on-btcpay-server-please-try-again-and-contact-us-if-the-problem-persists-"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#error-on-checkout-there-was-an-error-processing-the-payment-on-btcpay-server-please-try-again-and-contact-us-if-the-problem-persists-"}},[e._v("#")]),e._v(' Error on checkout "There was an error processing the payment on BTCPay Server. Please try again and contact us if the problem persists."')]),e._v(" "),t("p",[e._v("This means something went wrong with creating the invoice on BTCPay Server. It could be either wrong api key, store id or another communication error. You can find the error logs of the plugin in the following directory: "),t("code",[e._v("administrator/logs")]),e._v(" there you will have one or more files called "),t("code",[e._v("btcpayvm.X.log.php")]),e._v(" where "),t("code",[e._v("X")]),e._v(" is a number e.g. "),t("code",[e._v("btcpayvm.0.log.php")]),e._v(" you will find timestamped errors there that should give you a hint what the problem is.")]),e._v(" "),t("p",[t("strong",[e._v("Example")]),e._v(":")]),e._v(" "),t("blockquote",[t("p",[e._v('2022-05-24 21:10:50 ERROR Error during POST to https://btcpay.example.com/api/v1/stores/4kD5bvAF5j8DokHqAzxb6MFDV4ikabcdefghijklm/invoices. Got response (401): {"code":"unauthenticated","message":"Authentication is required for accessing this endpoint"}')])]),e._v(" "),t("ul",[t("li",[t("p",[e._v("This means there is some authentication error. Likely your api key does not have permission create invoices for that store. Make sure you gave the api key the right permissions and you give it to the right store and also entered that in VirtueMart payment configuration form.")])]),e._v(" "),t("li",[t("p",[e._v('Another reason could be that you use a legacy api key. The legacy api keys are located in store settings -> Access Tokens. But you need to create an account api key which is located in Account -> Manage Account -> tab "API Keys". See section '),t("a",{attrs:{href:"#22-create-an-api-key-and-configure-permissions"}},[e._v("2.2 Create an API key and configure permissions")]),e._v(".")])])]),e._v(" "),t("h2",{attrs:{id:"the-order-states-do-not-update-although-the-invoice-has-been-paid"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#the-order-states-do-not-update-although-the-invoice-has-been-paid"}},[e._v("#")]),e._v(" The order states do not update although the invoice has been paid")]),e._v(" "),t("p",[e._v('Please check the details of your invoice if there were any errors on sending the webhook request. Some hosting providers, firewall setups or Joomla security plugins may block POST requests to your site which lead to a http status of "403 forbidden".')]),e._v(" "),t("p",[e._v("You can check and verify yourself if there is something blocking requests to your site in one of these two ways:")]),e._v(" "),t("p",[t("strong",[e._v("1. Copy webhook callback URL")]),e._v("\ngo to your "),t("em",[e._v("VirtueMart BTCPay Payment Method Settings")]),e._v(' and copy the "Webhook callback URL". e.g. '),t("code",[e._v("https://EXAMPLE.COM/index.php?option=com_virtuemart&view=pluginresponse&task=pluginnotification&pm=2")])]),e._v(" "),t("figure",[t("img",{attrs:{src:a(630),alt:"BTCPay Joomla VirtueMart: Webhook payload URL",title:"BTCPay Joomla VirtueMart: Webhook payload URL"}})]),e._v(" "),t("p",[t("strong",[e._v("2.1 Check using a command line (Linux or MacOS):")])]),e._v(" "),t("div",{staticClass:"language- extra-class"},[t("pre",{pre:!0,attrs:{class:"language-text"}},[t("code",[e._v('curl -vX POST -H "Content-Type: application/json" \\\n -d \'{"data": "test"}\' WEBHOOK_CALLBACK_URL\n')])])]),t("p",[e._v("(replace "),t("code",[e._v("WEBHOOK_CALLBACK_URL")]),e._v(" with the one copied above)")]),e._v(" "),t("p",[e._v("Result:")]),e._v(" "),t("div",{staticClass:"language- extra-class"},[t("pre",{pre:!0,attrs:{class:"language-text"}},[t("code",[e._v(".... snip ....\n* upload completely sent off: 16 out of 16 bytes\n< HTTP/1.1 403 Forbidden\n< access-control-allow-origin: *\n< Content-Type: application/json; charset=UTF-8\n< X-Cloud-Trace-Context: 4f07d5b2e5c2f05949d04421a8e2dd6a\n< Date: Thu, 17 Feb 2022 10:06:50 GMT\n< Server: Google Frontend\n< Content-Length: 26\n")])])]),t("p",[e._v('If you see that line "HTTP/1.1 403 Forbidden" or "HTTP/2 403" then something is blocking data sent to your VirtueMart site. You should ask your hosting provider or make sure no firewall or plugin is blocking the requests.')]),e._v(" "),t("p",[t("strong",[e._v("2.2 Check using an online service (if you do not have a command line available:")])]),e._v(" "),t("ul",[t("li",[e._v("Go to "),t("a",{attrs:{href:"https://reqbin.com/post-online",target:"_blank",rel:"noopener noreferrer"}},[e._v("https://reqbin.com/post-online"),t("OutboundLink")],1)]),e._v(" "),t("li",[t("ol",[t("li",[e._v("Enter your callback url (copied from step 1 above): "),t("code",[e._v("https://EXAMPLE.COM/index.php?option=com_virtuemart&view=pluginresponse&task=pluginnotification&pm=2")]),e._v("\n(replace this URL with the webhook callback url from step 1)")])])]),e._v(" "),t("li",[e._v('Make sure "POST" is selected')]),e._v(" "),t("li",[t("ol",{attrs:{start:"2"}},[t("li",[e._v("Click [Send]")])])])]),e._v(" "),t("figure",[t("img",{attrs:{src:a(293),alt:"BTCPay Joomla VirtueMart: Webhook payload URL forbidden",title:"BTCPay Joomla VirtueMart: Webhook payload URL forbidden"}})]),e._v(" "),t("p",[e._v('If you see "'),t("strong",[e._v("Status 403 (Forbidden)")]),e._v('" then POST requests to your site are blocked for some reason. You should ask your hosting provider or make sure no firewall or plugin is blocking the requests. If you see any other status code (200, 500, ...) a firewall problem seems to not apply, you probably need to further investigate.')]),e._v(" "),t("h2",{attrs:{id:"i-have-troubles-with-using-the-plugin-or-some-other-related-questions"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#i-have-troubles-with-using-the-plugin-or-some-other-related-questions"}},[e._v("#")]),e._v(" I have troubles with using the plugin or some other related questions")]),e._v(" "),t("p",[e._v("Feel free to join our support channel over at "),t("a",{attrs:{href:"https://chat.btcpayserver.org/",target:"_blank",rel:"noopener noreferrer"}},[e._v("https://chat.btcpayserver.org/"),t("OutboundLink")],1),e._v(" if you need help or have any further questions.")])])}),[],!1,null,null,null);t.default=r.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[13],{293:function(e,t,a){e.exports=a.p+"assets/img/btcpay-vm--19-troubleshoot-403-callback.51193927.png"},619:function(e,t,a){e.exports=a.p+"assets/img/btcpay-vm--01-install-web.4d28e0bd.png"},620:function(e,t,a){e.exports=a.p+"assets/img/btcpay-vm--02-install-upload.8972740d.png"},621:function(e,t,a){e.exports=a.p+"assets/img/btcpay-vm--03-enable-plugin.1b4a6c9f.png"},622:function(e,t,a){e.exports=a.p+"assets/img/btcpay-vm--04-add-new-payment-method.e5a94ee3.png"},623:function(e,t,a){e.exports=a.p+"assets/img/btcpay-vm--05-payment-method-details.adf89c97.png"},624:function(e,t,a){e.exports=a.p+"assets/img/btcpay-vm--06-payment-method-configuration-tab.45617db0.png"},625:function(e,t,a){e.exports=a.p+"assets/img/btcpay-vm--07-account-manage.d477b8b4.png"},626:function(e,t,a){e.exports=a.p+"assets/img/btcpay-vm--08-add-api-key.a58b2941.png"},627:function(e,t,a){e.exports=a.p+"assets/img/btcpay-vm--09-permissions-and-select-store.9ccef388.png"},628:function(e,t,a){e.exports=a.p+"assets/img/btcpay-vm--10-permissions-set.74d76936.png"},629:function(e,t,a){e.exports=a.p+"assets/img/btcpay-vm--11-copy-api-key.94be9878.png"},630:function(e,t,a){e.exports=a.p+"assets/img/btcpay-vm--12-copy-store-id.84c19f9f.png"},631:function(e,t,a){e.exports=a.p+"assets/img/btcpay-vm--13-save-vm-payment-method-form.0a3e52bd.png"},632:function(e,t,a){e.exports=a.p+"assets/img/btcpay-vm--14-create-webhook.1b6e4881.png"},633:function(e,t,a){e.exports=a.p+"assets/img/btcpay-vm--15-webhook-payload-url.37a4f55f.png"},634:function(e,t,a){e.exports=a.p+"assets/img/btcpay-vm--16-webhook-copy-secret.71b0dd07.png"},635:function(e,t,a){e.exports=a.p+"assets/img/btcpay-vm--16-virtuemart-configuration-save.ee549862.png"},636:function(e,t,a){e.exports=a.p+"assets/img/btcpay-vm--17-webhook-save.dfd4fca5.png"},637:function(e,t,a){e.exports=a.p+"assets/img/btcpay-vm--18-troubleshoot-copy-callback-url.70d08e31.png"},829:function(e,t,a){"use strict";a.r(t);var o=a(10),r=Object(o.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"joomla-virtuemart-integration"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#joomla-virtuemart-integration"}},[e._v("#")]),e._v(" Joomla VirtueMart integration")]),e._v(" "),t("p",[e._v("This document explains how to "),t("strong",[e._v("integrate BTCPay Server into your Joomla VirtueMart store")]),e._v(".\nWatch the video below to go along the document |")]),e._v(" "),t("a",{staticClass:"ytEmbed",staticStyle:{"background-image":"url(https://img.youtube.com/vi/k7XfybLAky0/hqdefault.jpg)"},attrs:{href:"https://youtu.be/k7XfybLAky0",title:"BTCPay Server - Joomla VirtueMart","data-id":"k7XfybLAky0"}},[t("iframe",{attrs:{title:"BTCPay Server - Joomla VirtueMart","data-src":"https://www.youtube-nocookie.com/embed/k7XfybLAky0?&autoplay=1&autohide=1&modestbranding=1&color=white&rel=0",frameborder:"0",allow:"autoplay;encrypted-media;picture-in-picture",allowfullscreen:""}})]),e._v(" "),t("h2",{attrs:{id:"requirements"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#requirements"}},[e._v("#")]),e._v(" Requirements")]),e._v(" "),t("p",[e._v("Please ensure that you meet the following requirements before installing this plugin.")]),e._v(" "),t("ul",[t("li",[e._v("PHP version 7.4 or newer")]),e._v(" "),t("li",[e._v("The curl, gd, intl, json, and mbstring PHP extensions are available")]),e._v(" "),t("li",[e._v("A VirtueMart 3 / 4 store ("),t("a",{attrs:{href:"https://www.virtuemart.net/downloads",target:"_blank",rel:"noopener noreferrer"}},[e._v("Download and installation instructions"),t("OutboundLink")],1),e._v(")")]),e._v(" "),t("li",[e._v("You have a BTCPay Server version 1.3.0 or later, either "),t("RouterLink",{attrs:{to:"/Deployment/"}},[e._v("self-hosted")]),e._v(" or "),t("RouterLink",{attrs:{to:"/Deployment/ThirdPartyHosting/"}},[e._v("hosted by a third-party")])],1),e._v(" "),t("li",[t("RouterLink",{attrs:{to:"/RegisterAccount/"}},[e._v("You've a registered account on the instance")])],1),e._v(" "),t("li",[t("RouterLink",{attrs:{to:"/CreateStore/"}},[e._v("You've a BTCPay store on the instance")])],1),e._v(" "),t("li",[t("RouterLink",{attrs:{to:"/WalletSetup/"}},[e._v("You've a wallet connected to your store")])],1)]),e._v(" "),t("h2",{attrs:{id:"1-install-btcpay-plugin"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#1-install-btcpay-plugin"}},[e._v("#")]),e._v(" 1. Install BTCPay Plugin")]),e._v(" "),t("p",[e._v("There are three ways to "),t("strong",[e._v("download BTCPay for VirtueMart plugin")]),e._v(":")]),e._v(" "),t("ul",[t("li",[e._v("Via the Admin Dashboard (recommended, see below)")]),e._v(" "),t("li",[t("a",{attrs:{href:"https://extensions.joomla.org/extension/vm-payment-btcpay-for-virtuemart/",target:"_blank",rel:"noopener noreferrer"}},[e._v("Joomla Extension Directory (JED)"),t("OutboundLink")],1)]),e._v(" "),t("li",[t("a",{attrs:{href:"https://github.com/btcpayserver/joomla-virtuemart/releases",target:"_blank",rel:"noopener noreferrer"}},[e._v("GitHub Repository"),t("OutboundLink")],1)])]),e._v(" "),t("h3",{attrs:{id:"11-install-plugin-from-joomla-admin-dashboard-recommended"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#11-install-plugin-from-joomla-admin-dashboard-recommended"}},[e._v("#")]),e._v(" 1.1 Install plugin from Joomla Admin Dashboard (recommended)")]),e._v(" "),t("ol",[t("li",[e._v("Menu: Extensions > Manage > Install")]),e._v(" "),t("li",[e._v('On "Install from Web" tab search for "btcpay"')]),e._v(" "),t("li",[e._v("Click on BTCPay for VirtueMart and [Install] button")]),e._v(" "),t("li",[e._v("Continue with step 1.3")])]),e._v(" "),t("figure",[t("img",{attrs:{src:a(619),alt:"BTCPay Virtuemart: Plugin installation web",title:"BTCPay Virtuemart: Plugin installation web"}})]),e._v(" "),t("h3",{attrs:{id:"12-download-and-install-plugin-from-jed-or-github"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#12-download-and-install-plugin-from-jed-or-github"}},[e._v("#")]),e._v(" 1.2 Download and install plugin from JED or GitHub")]),e._v(" "),t("ol",[t("li",[e._v("Download the latest BTCPay plugin from "),t("a",{attrs:{href:"https://github.com/btcpayserver/joomla-virtuemart/releases",target:"_blank",rel:"noopener noreferrer"}},[e._v("Github"),t("OutboundLink")],1),e._v(" or "),t("a",{attrs:{href:"https://extensions.joomla.org/extension/vm-payment-btcpay-for-virtuemart/",target:"_blank",rel:"noopener noreferrer"}},[e._v("JED"),t("OutboundLink")],1)]),e._v(" "),t("li",[e._v("Menu: Extensions -> Manage -> Install")]),e._v(" "),t("li",[e._v('On tab "Upload Package File" upload the '),t("code",[e._v("btcpayvm.zip")])])]),e._v(" "),t("figure",[t("img",{attrs:{src:a(620),alt:"BTCPay Virtuemart: Plugin installation upload",title:"BTCPay Virtuemart: Plugin installation upload"}})]),e._v(" "),t("h3",{attrs:{id:"13-enable-the-plugin"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#13-enable-the-plugin"}},[e._v("#")]),e._v(" 1.3 Enable the plugin")]),e._v(" "),t("ol",[t("li",[e._v("Menu: Extensions -> Plugins")]),e._v(" "),t("li",[e._v('Search for "btcpay"')]),e._v(" "),t("li",[e._v('On "Status" column click the red circle to enable the plugin')])]),e._v(" "),t("figure",[t("img",{attrs:{src:a(621),alt:"BTCPay Virtuemart: Enable plugin",title:"BTCPay Virtuemart: Enable plugin"}})]),e._v(" "),t("h2",{attrs:{id:"2-connecting-virtuemart-and-btcpay-server"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#2-connecting-virtuemart-and-btcpay-server"}},[e._v("#")]),e._v(" 2. Connecting VirtueMart and BTCPay Server")]),e._v(" "),t("p",[e._v("BTCPay for Virtuemart plugin is a "),t("strong",[e._v("bridge between your BTCPay Server (payment processor) and your e-commerce store")]),e._v(".\nNo matter if you're using a self-hosted or third-party solution, the connection process is identical.")]),e._v(" "),t("h3",{attrs:{id:"21-add-btcpay-payment-gateway-in-virtuemart"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#21-add-btcpay-payment-gateway-in-virtuemart"}},[e._v("#")]),e._v(" 2.1 Add BTCPay payment gateway in VirtueMart")]),e._v(" "),t("ol",[t("li",[e._v("Menu: VirtueMart -> Payment Methods")]),e._v(" "),t("li",[e._v("Click button "),t("strong",[e._v("[New]")]),e._v(" "),t("img",{attrs:{src:a(622),alt:"BTCPay Virtuemart: Add new payment method",title:"BTCPay Virtuemart: Add new payment method"}})]),e._v(" "),t("li",[e._v('Configure the payment method according to your needs. Make sure on "Payment Method" dropdown you have "BTCPay for VirtueMart" selected and the payment method is published '),t("img",{attrs:{src:a(623),alt:"BTCPay Virtuemart: Payment method details",title:"BTCPay Virtuemart: Payment method details"}})]),e._v(" "),t("li",[e._v("Hit the "),t("strong",[e._v("[Save]")]),e._v(" button (the plugin table will get created)")])]),e._v(" "),t("p",[e._v('Now you can switch to the "Configuration" tab where we can connect to our BTCPay Server instance. First we need to create an API key.')]),e._v(" "),t("figure",[t("img",{attrs:{src:a(624),alt:"BTCPay Virtuemart: Payment method configuration tab",title:"BTCPay Virtuemart: Payment method configuration tab"}})]),e._v(" "),t("h3",{attrs:{id:"22-create-an-api-key-and-configure-permissions"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#22-create-an-api-key-and-configure-permissions"}},[e._v("#")]),e._v(" 2.2 Create an API key and configure permissions")]),e._v(" "),t("p",[e._v("On BTCPay Server instance:")]),e._v(" "),t("ol",[t("li",[e._v("Click on "),t("em",[e._v("[Account]")])]),e._v(" "),t("li",[e._v("Click on "),t("em",[e._v("[Manage Account]")]),e._v(" "),t("img",{attrs:{src:a(625),alt:"BTCPay Joomla VirtueMart: Manage Account",title:"BTCPay Joomla VirtueMart: Manage Account"}})]),e._v(" "),t("li",[e._v("Go to the tab "),t("em",[e._v('"API Keys"')])]),e._v(" "),t("li",[e._v("Click "),t("em",[e._v("[Generate Key]")]),e._v(" to select permissions.\n"),t("img",{attrs:{src:a(626),alt:"BTCPay Joomla VirtueMart: API Keys overview",title:"BTCPay Joomla VirtueMart: API Keys overview"}})]),e._v(" "),t("li",[e._v("Add a label. "),t("strong",[e._v("Important:")]),e._v(" click on the "),t("em",[e._v('"Select specific stores"')]),e._v(" link for the following permissions: "),t("code",[e._v("View invoices")]),e._v(", "),t("code",[e._v("Create invoice")]),e._v(", "),t("code",[e._v("Modify invoices")]),e._v(", "),t("code",[e._v("Modify stores webhooks")]),e._v(", "),t("code",[e._v("View your stores")]),e._v(" and select the specific store you created for your VirtueMart site. It should look like when everything is set:\n"),t("img",{attrs:{src:a(627),alt:"BTCPay Joomla VirtueMart: API Keys Permissions",title:"BTCPay Joomla VirtueMart: API Keys Permissions"}})]),e._v(" "),t("li",[e._v("Click on "),t("em",[e._v("[Generate API Key]")]),e._v(" "),t("img",{attrs:{src:a(628),alt:"BTCPay Joomla VirtueMart: API Keys Save",title:"BTCPay Joomla VirtueMart: API Keys Save"}})]),e._v(" "),t("li",[e._v("Copy the generated API Key to your "),t("em",[e._v("VirtueMart BTCPay Payment Method Settings")]),e._v(" form\n"),t("img",{attrs:{src:a(629),alt:"BTCPay Joomla VirtueMart: Copy API Key",title:"BTCPay Joomla VirtueMart: Copy API Key"}})]),e._v(" "),t("li",[e._v("Go to Settings and copy the store ID to your "),t("em",[e._v("VirtueMart BTCPay Payment Method Settings")]),e._v(" form\n"),t("img",{attrs:{src:a(630),alt:"BTCPay Joomla VirtueMart: Copy Store ID",title:"BTCPay Joomla VirtueMart: Copy Store ID"}})]),e._v(" "),t("li",[e._v("On the "),t("em",[e._v("VirtueMart BTCPay Payment Method Settings")]),e._v(" form make sure "),t("strong",[e._v("BTPCay Server URL")]),e._v(", "),t("strong",[e._v("API Key")]),e._v(" and "),t("strong",[e._v("Store ID")]),e._v(" are set and click "),t("strong",[e._v("[Save]")]),e._v(" "),t("img",{attrs:{src:a(631),alt:"BTCPay Joomla VirtueMart: Save VirtueMart Settings form",title:"BTCPay Joomla VirtueMart: Save VirtueMart Settings form"}})])]),e._v(" "),t("h3",{attrs:{id:"23-create-a-webhook-on-btcpay-server"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#23-create-a-webhook-on-btcpay-server"}},[e._v("#")]),e._v(" 2.3 Create a webhook on BTCPay Server")]),e._v(" "),t("p",[e._v("Setting up a webhook is important that your gets updates on invoice status changes from BTCPay Server.")]),e._v(" "),t("ol",[t("li",[t("p",[e._v("On BTCPay Server instance go to your store settings, tab "),t("strong",[e._v("[Webhooks]")]),e._v(", click "),t("strong",[e._v("[Create Webhook]")]),e._v(" "),t("img",{attrs:{src:a(632),alt:"BTCPay Joomla VirtueMart: Create webhook",title:"BTCPay Joomla VirtueMart: Create webhook"}})])]),e._v(" "),t("li",[t("p",[e._v("From "),t("em",[e._v("VirtueMart BTCPay Payment Method Settings")]),e._v(" copy the "),t("strong",[e._v("Webhook callback URL")]),e._v(" to webhook settings "),t("strong",[e._v("Payload URL")]),e._v(".\n"),t("img",{attrs:{src:a(633),alt:"BTCPay Joomla VirtueMart: Webhook payload URL",title:"BTCPay Joomla VirtueMart: Webhook payload URL"}})])]),e._v(" "),t("li",[t("p",[e._v("On webhook settings click on the eye to reveal webhook secret. Copy that secret to your "),t("em",[e._v("VirtueMart BTCPay Payment Method Settings")]),e._v(" form "),t("strong",[e._v("Webhook Secret")]),e._v(" input and "),t("strong",[e._v("[Save]")]),e._v(" the VirtueMart configuration again.\n"),t("img",{attrs:{src:a(634),alt:"BTCPay Joomla VirtueMart: Webhook payload URL",title:"BTCPay Joomla VirtueMart: Webhook payload URL"}}),e._v(" "),t("img",{attrs:{src:a(635),alt:"BTCPay Joomla VirtueMart: Webhook VM save configuration",title:"BTCPay Joomla VirtueMart: Webhook VM save configuration"}})])]),e._v(" "),t("li",[t("p",[e._v("Back on webhook settings, enable "),t("strong",[e._v("Automatic redelivery")]),e._v(" and click "),t("strong",[e._v("[Add webhook]")]),e._v(" to save the webhook.\n"),t("img",{attrs:{src:a(636),alt:"BTCPay Joomla VirtueMart: Webhook payload URL",title:"BTCPay Joomla VirtueMart: Webhook payload URL"}})])])]),e._v(" "),t("h2",{attrs:{id:"3-test-the-checkout"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#3-test-the-checkout"}},[e._v("#")]),e._v(" 3. Test the checkout")]),e._v(" "),t("p",[e._v("Everything is ready to go now. Do a small test purchase and make sure the order status gets updated according to the BTCPay invoice status. On BTCPay Server invoice details you can see if the webhook events were fired successfully.")]),e._v(" "),t("h2",{attrs:{id:"customizing-virtuemart-btcpay-payment-method-settings"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#customizing-virtuemart-btcpay-payment-method-settings"}},[e._v("#")]),e._v(" Customizing VirtueMart BTCPay payment method settings")]),e._v(" "),t("p",[e._v('Your VirtueMart BTCPay payment method settings can be found in menu: VirtueMart -> Payment Methods. Click on the payment method of type "btcpayvm" you created.')]),e._v(" "),t("h3",{attrs:{id:"section-btcpay-server-connection-settings"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#section-btcpay-server-connection-settings"}},[e._v("#")]),e._v(" Section: BTCPay Server connection settings")]),e._v(" "),t("p",[e._v("This is the most important part of the configuration. The data entered here will connect your VirtueMart shop with your counterparty store configured on BTCPay Server.")]),e._v(" "),t("p",[t("strong",[e._v("BTCPay Server URL")])]),e._v(" "),t("p",[e._v("URL to your BTCPay Server instance, including protocol e.g. "),t("code",[e._v("https://btcpay.yourdomain.com")]),e._v(".")]),e._v(" "),t("p",[t("strong",[e._v("API Key")])]),e._v(" "),t("p",[e._v("Your BTCPay API Key as mentioned "),t("a",{attrs:{href:"#22-create-an-api-key-and-configure-permissions"}},[e._v("here")]),e._v(".")]),e._v(" "),t("p",[t("strong",[e._v("Store ID")])]),e._v(" "),t("p",[e._v("The store ID of your BTCPay Server store. Can be found on the store settings page. See 8. "),t("a",{attrs:{href:"#22-create-an-api-key-and-configure-permissions"}},[e._v("here")])]),e._v(" "),t("p",[t("strong",[e._v("Webhook Secret")])]),e._v(" "),t("p",[e._v("The wehbook secret which was generated on webhook createion, see "),t("a",{attrs:{href:"#23-create-a-webhook-on-btcpay-server"}},[e._v("here")])]),e._v(" "),t("p",[t("strong",[e._v("Webhook callback URL")])]),e._v(" "),t("p",[e._v("This field is auto-generated by the plugin and helps you when creating the webhook on BTCPay Server. It contains the needed payment method id and parameters to allow processing of callbacks.")]),e._v(" "),t("h3",{attrs:{id:"section-order-states-mapping"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#section-order-states-mapping"}},[e._v("#")]),e._v(" Section: Order states mapping")]),e._v(" "),t("p",[e._v("You can adjust the mapping of BTCPay Server invoice status to VirtueMart order states. On the left are the invoice states and on the right the order states. The defaults here should be good to go - but if you need, you can overwrite them.")]),e._v(" "),t("p",[e._v("VirtueMart order statuses are explained "),t("a",{attrs:{href:"https://docs.virtuemart.net/manual/configuration-menu/order-statuses.html",target:"_blank",rel:"noopener noreferrer"}},[e._v("here"),t("OutboundLink")],1)]),e._v(" "),t("p",[e._v("BTCPay server invoice statuses are explained "),t("RouterLink",{attrs:{to:"/Invoices/#invoice-statuses"}},[e._v("here")])],1),e._v(" "),t("h3",{attrs:{id:"section-restrictions"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#section-restrictions"}},[e._v("#")]),e._v(" Section: Restrictions")]),e._v(" "),t("p",[e._v("These are VirtueMart provided restrictions you know from other payment plugins. You can restrict the amount or countries when the payment method will be available.")]),e._v(" "),t("h3",{attrs:{id:"section-discounts-and-fees"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#section-discounts-and-fees"}},[e._v("#")]),e._v(" Section Discounts and fees")]),e._v(" "),t("p",[e._v("These are VirtueMart provided settings. You can set a fee, cashback and apply tax rules or set a custom logo for the payment method.")]),e._v(" "),t("h2",{attrs:{id:"troubleshooting"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#troubleshooting"}},[e._v("#")]),e._v(" Troubleshooting")]),e._v(" "),t("h3",{attrs:{id:"error-on-checkout-there-was-an-error-processing-the-payment-on-btcpay-server-please-try-again-and-contact-us-if-the-problem-persists-"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#error-on-checkout-there-was-an-error-processing-the-payment-on-btcpay-server-please-try-again-and-contact-us-if-the-problem-persists-"}},[e._v("#")]),e._v(' Error on checkout "There was an error processing the payment on BTCPay Server. Please try again and contact us if the problem persists."')]),e._v(" "),t("p",[e._v("This means something went wrong with creating the invoice on BTCPay Server. It could be either wrong api key, store id or another communication error. You can find the error logs of the plugin in the following directory: "),t("code",[e._v("administrator/logs")]),e._v(" there you will have one or more files called "),t("code",[e._v("btcpayvm.X.log.php")]),e._v(" where "),t("code",[e._v("X")]),e._v(" is a number e.g. "),t("code",[e._v("btcpayvm.0.log.php")]),e._v(" you will find timestamped errors there that should give you a hint what the problem is.")]),e._v(" "),t("p",[t("strong",[e._v("Example")]),e._v(":")]),e._v(" "),t("blockquote",[t("p",[e._v('2022-05-24 21:10:50 ERROR Error during POST to https://btcpay.example.com/api/v1/stores/4kD5bvAF5j8DokHqAzxb6MFDV4ikabcdefghijklm/invoices. Got response (401): {"code":"unauthenticated","message":"Authentication is required for accessing this endpoint"}')])]),e._v(" "),t("ul",[t("li",[t("p",[e._v("This means there is some authentication error. Likely your api key does not have permission create invoices for that store. Make sure you gave the api key the right permissions and you give it to the right store and also entered that in VirtueMart payment configuration form.")])]),e._v(" "),t("li",[t("p",[e._v('Another reason could be that you use a legacy api key. The legacy api keys are located in store settings -> Access Tokens. But you need to create an account api key which is located in Account -> Manage Account -> tab "API Keys". See section '),t("a",{attrs:{href:"#22-create-an-api-key-and-configure-permissions"}},[e._v("2.2 Create an API key and configure permissions")]),e._v(".")])])]),e._v(" "),t("h2",{attrs:{id:"the-order-states-do-not-update-although-the-invoice-has-been-paid"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#the-order-states-do-not-update-although-the-invoice-has-been-paid"}},[e._v("#")]),e._v(" The order states do not update although the invoice has been paid")]),e._v(" "),t("p",[e._v('Please check the details of your invoice if there were any errors on sending the webhook request. Some hosting providers, firewall setups or Joomla security plugins may block POST requests to your site which lead to a http status of "403 forbidden".')]),e._v(" "),t("p",[e._v("You can check and verify yourself if there is something blocking requests to your site in one of these two ways:")]),e._v(" "),t("p",[t("strong",[e._v("1. Copy webhook callback URL")]),e._v("\ngo to your "),t("em",[e._v("VirtueMart BTCPay Payment Method Settings")]),e._v(' and copy the "Webhook callback URL". e.g. '),t("code",[e._v("https://EXAMPLE.COM/index.php?option=com_virtuemart&view=pluginresponse&task=pluginnotification&pm=2")])]),e._v(" "),t("figure",[t("img",{attrs:{src:a(637),alt:"BTCPay Joomla VirtueMart: Webhook payload URL",title:"BTCPay Joomla VirtueMart: Webhook payload URL"}})]),e._v(" "),t("p",[t("strong",[e._v("2.1 Check using a command line (Linux or MacOS):")])]),e._v(" "),t("div",{staticClass:"language- extra-class"},[t("pre",{pre:!0,attrs:{class:"language-text"}},[t("code",[e._v('curl -vX POST -H "Content-Type: application/json" \\\n -d \'{"data": "test"}\' WEBHOOK_CALLBACK_URL\n')])])]),t("p",[e._v("(replace "),t("code",[e._v("WEBHOOK_CALLBACK_URL")]),e._v(" with the one copied above)")]),e._v(" "),t("p",[e._v("Result:")]),e._v(" "),t("div",{staticClass:"language- extra-class"},[t("pre",{pre:!0,attrs:{class:"language-text"}},[t("code",[e._v(".... snip ....\n* upload completely sent off: 16 out of 16 bytes\n< HTTP/1.1 403 Forbidden\n< access-control-allow-origin: *\n< Content-Type: application/json; charset=UTF-8\n< X-Cloud-Trace-Context: 4f07d5b2e5c2f05949d04421a8e2dd6a\n< Date: Thu, 17 Feb 2022 10:06:50 GMT\n< Server: Google Frontend\n< Content-Length: 26\n")])])]),t("p",[e._v('If you see that line "HTTP/1.1 403 Forbidden" or "HTTP/2 403" then something is blocking data sent to your VirtueMart site. You should ask your hosting provider or make sure no firewall or plugin is blocking the requests.')]),e._v(" "),t("p",[t("strong",[e._v("2.2 Check using an online service (if you do not have a command line available:")])]),e._v(" "),t("ul",[t("li",[e._v("Go to "),t("a",{attrs:{href:"https://reqbin.com/post-online",target:"_blank",rel:"noopener noreferrer"}},[e._v("https://reqbin.com/post-online"),t("OutboundLink")],1)]),e._v(" "),t("li",[t("ol",[t("li",[e._v("Enter your callback url (copied from step 1 above): "),t("code",[e._v("https://EXAMPLE.COM/index.php?option=com_virtuemart&view=pluginresponse&task=pluginnotification&pm=2")]),e._v("\n(replace this URL with the webhook callback url from step 1)")])])]),e._v(" "),t("li",[e._v('Make sure "POST" is selected')]),e._v(" "),t("li",[t("ol",{attrs:{start:"2"}},[t("li",[e._v("Click [Send]")])])])]),e._v(" "),t("figure",[t("img",{attrs:{src:a(293),alt:"BTCPay Joomla VirtueMart: Webhook payload URL forbidden",title:"BTCPay Joomla VirtueMart: Webhook payload URL forbidden"}})]),e._v(" "),t("p",[e._v('If you see "'),t("strong",[e._v("Status 403 (Forbidden)")]),e._v('" then POST requests to your site are blocked for some reason. You should ask your hosting provider or make sure no firewall or plugin is blocking the requests. If you see any other status code (200, 500, ...) a firewall problem seems to not apply, you probably need to further investigate.')]),e._v(" "),t("h2",{attrs:{id:"i-have-troubles-with-using-the-plugin-or-some-other-related-questions"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#i-have-troubles-with-using-the-plugin-or-some-other-related-questions"}},[e._v("#")]),e._v(" I have troubles with using the plugin or some other related questions")]),e._v(" "),t("p",[e._v("Feel free to join our support channel over at "),t("a",{attrs:{href:"https://chat.btcpayserver.org/",target:"_blank",rel:"noopener noreferrer"}},[e._v("https://chat.btcpayserver.org/"),t("OutboundLink")],1),e._v(" if you need help or have any further questions.")])])}),[],!1,null,null,null);t.default=r.exports}}]); \ No newline at end of file diff --git a/assets/js/130.3d2fe14e.js b/assets/js/130.9e14b7fa.js similarity index 99% rename from assets/js/130.3d2fe14e.js rename to assets/js/130.9e14b7fa.js index d758a5bc19..02e138e271 100644 --- a/assets/js/130.3d2fe14e.js +++ b/assets/js/130.9e14b7fa.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[130],{765:function(a,e,t){"use strict";t.r(e);var s=t(10),r=Object(s.a)({},(function(){var a=this,e=a._self._c;return e("ContentSlotsDistributor",{attrs:{"slot-key":a.$parent.slotKey}},[e("h1",{attrs:{id:"joinmarket-support"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#joinmarket-support"}},[a._v("#")]),a._v(" Joinmarket support")]),a._v(" "),e("p",[a._v("JoinMarket is software to create a special kind of bitcoin transaction called a CoinJoin transaction. Its aim is to improve the confidentiality and privacy of bitcoin transactions.")]),a._v(" "),e("p",[a._v("You will be able to use your bitcoin to help other protect their privacy, while earning a yield for this service.")]),a._v(" "),e("p",[a._v("See "),e("a",{attrs:{href:"https://github.com/JoinMarket-Org/JoinMarket-Docs/blob/master/High-level-design.md",target:"_blank",rel:"noopener noreferrer"}},[a._v("the documentation of the joinmarket project"),e("OutboundLink")],1),a._v(" for more details.")]),a._v(" "),e("p",[a._v("This is a very advanced functionality, and there is no easy way to recover if something goes wrong.")]),a._v(" "),e("p",[a._v("For hardcore bitcoiners only.")]),a._v(" "),e("h2",{attrs:{id:"how-to-use"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#how-to-use"}},[a._v("#")]),a._v(" How to use")]),a._v(" "),e("div",{staticClass:"language-bash extra-class"},[e("pre",{pre:!0,attrs:{class:"language-bash"}},[e("code",[e("span",{pre:!0,attrs:{class:"token assign-left variable"}},[a._v("BTCPAYGEN_ADDITIONAL_FRAGMENTS")]),e("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),e("span",{pre:!0,attrs:{class:"token string"}},[a._v('"'),e("span",{pre:!0,attrs:{class:"token variable"}},[a._v("$BTCPAYGEN_ADDITIONAL_FRAGMENTS")]),a._v(';opt-add-joinmarket"')]),a._v("\n"),e("span",{pre:!0,attrs:{class:"token builtin class-name"}},[a._v(".")]),a._v(" btcpay-setup.sh "),e("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("-i")]),a._v("\n")])])]),e("p",[a._v("Then you need to setup your default joinmarket wallet:")]),a._v(" "),e("div",{staticClass:"language-bash extra-class"},[e("pre",{pre:!0,attrs:{class:"language-bash"}},[e("code",[a._v("jm.sh wallet-tool-generate\njm.sh set-wallet "),e("span",{pre:!0,attrs:{class:"token operator"}},[a._v("<")]),a._v("wallet_file_name"),e("span",{pre:!0,attrs:{class:"token operator"}},[a._v(">")]),a._v(" "),e("span",{pre:!0,attrs:{class:"token operator"}},[a._v("<")]),a._v("password"),e("span",{pre:!0,attrs:{class:"token operator"}},[a._v(">")]),a._v("\n")])])]),e("p",[a._v("Once done, you will need to send some money to the joinmarket wallet:")]),a._v(" "),e("div",{staticClass:"language-bash extra-class"},[e("pre",{pre:!0,attrs:{class:"language-bash"}},[e("code",[a._v("jm.sh wallet-tool\n")])])]),e("h2",{attrs:{id:"how-to-change-joinmarket-configuration"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#how-to-change-joinmarket-configuration"}},[a._v("#")]),a._v(" How to change joinmarket configuration?")]),a._v(" "),e("p",[a._v("Connect to your container, and edit your configuration:")]),a._v(" "),e("div",{staticClass:"language-bash extra-class"},[e("pre",{pre:!0,attrs:{class:"language-bash"}},[e("code",[a._v("jm.sh "),e("span",{pre:!0,attrs:{class:"token function"}},[a._v("bash")]),a._v("\n"),e("span",{pre:!0,attrs:{class:"token function"}},[a._v("vim")]),a._v(" "),e("span",{pre:!0,attrs:{class:"token variable"}},[a._v("$CONFIG")]),a._v("\n")])])]),e("h2",{attrs:{id:"managing-your-wallet"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#managing-your-wallet"}},[a._v("#")]),a._v(" Managing your wallet")]),a._v(" "),e("p",[a._v("By running "),e("code",[a._v("jm.sh")]),a._v(" without parameter, you will get a bunch of command that you can run such as:")]),a._v(" "),e("div",{staticClass:"language- extra-class"},[e("pre",{pre:!0,attrs:{class:"language-text"}},[e("code",[a._v("Usage:\n------\n\nTooling to setup your joinmarket yield generator\n\n wallet-tool: Run wallet-tools.py on the wallet\n wallet-tool-generate: Generate a new wallet\n set-wallet: Set the wallet that the yield generator need to use\n bash: Open an interactive bash session in the joinmarket container\n receive-payjoin: Receive a payjoin payment\n sendpayment: Send a payjoin through coinjoin (password needed)\n\nExample:\n * jm.sh wallet-tool-generate\n * jm.sh set-wallet wallet.jmdat mypassword\n * jm.sh wallet-tool\n * jm.sh receive-payjoin \n * jm.sh sendpayment
    \n * jm.sh wallet-tool history\n * jm.sh bash\n")])])]),e("p",[a._v("Note "),e("code",[a._v("jm.sh")]),a._v(" commands are wrapper around joinmarket scripts. Those are just convenience command, you can always directly connect to the container via "),e("code",[a._v("jm.sh bash")]),a._v(" and achieve the same result with the joinmarket python scripts.")]),a._v(" "),e("h2",{attrs:{id:"getting-command-prompt-into-the-container"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#getting-command-prompt-into-the-container"}},[a._v("#")]),a._v(" Getting command prompt into the container")]),a._v(" "),e("p",[a._v("You can connect to the container and have direct access to joinmarket scripts such as:")]),a._v(" "),e("div",{staticClass:"language-bash extra-class"},[e("pre",{pre:!0,attrs:{class:"language-bash"}},[e("code",[a._v("jm.sh "),e("span",{pre:!0,attrs:{class:"token function"}},[a._v("bash")]),a._v("\nsendpayment.py wallet.jmdat "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("..")]),a._v(".\n")])])]),e("h2",{attrs:{id:"managing-the-services-such-as-yield-generators"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#managing-the-services-such-as-yield-generators"}},[a._v("#")]),a._v(" Managing the services such as yield generators")]),a._v(" "),e("p",[a._v("First connect to the container's bash")]),a._v(" "),e("div",{staticClass:"language-bash extra-class"},[e("pre",{pre:!0,attrs:{class:"language-bash"}},[e("code",[a._v("jm.sh "),e("span",{pre:!0,attrs:{class:"token function"}},[a._v("bash")]),a._v("\n")])])]),e("p",[a._v("You can list available services to run:")]),a._v(" "),e("div",{staticClass:"language-bash extra-class"},[e("pre",{pre:!0,attrs:{class:"language-bash"}},[e("code",[a._v("supervisorctl status\n")])])]),e("p",[a._v("Which might show you")]),a._v(" "),e("div",{staticClass:"language-bash extra-class"},[e("pre",{pre:!0,attrs:{class:"language-bash"}},[e("code",[a._v("root"),e("span",{pre:!0,attrs:{class:"token operator"}},[a._v(">")]),a._v(" supervisorctl status\nob-watcher STOPPED Not started\nyg-privacyenhanced STOPPED Not started\nyield-generator-basic STOPPED Not started\n")])])]),e("p",[a._v("You can start a yield generator with:")]),a._v(" "),e("div",{staticClass:"language-bash extra-class"},[e("pre",{pre:!0,attrs:{class:"language-bash"}},[e("code",[a._v("supervisorctl start yg-privacyenhanced\n")])])]),e("p",[a._v("*** Note that services will NOT be restarted automatically if the container restart. ***")]),a._v(" "),e("p",[a._v("If you want to automatically restart the service when the container restart,")]),a._v(" "),e("div",{staticClass:"language-bash extra-class"},[e("pre",{pre:!0,attrs:{class:"language-bash"}},[e("code",[e("span",{pre:!0,attrs:{class:"token function"}},[a._v("vim")]),a._v(" "),e("span",{pre:!0,attrs:{class:"token variable"}},[a._v("$AUTO_START")]),a._v("\n")])])]),e("p",[a._v("Then remove the comment "),e("code",[a._v("#")]),a._v(" in front of the service name you want to automatically restart.")]),a._v(" "),e("h2",{attrs:{id:"ob-watcher"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#ob-watcher"}},[a._v("#")]),a._v(" OB-Watcher")]),a._v(" "),e("p",[a._v("The "),e("code",[a._v("ob-watcher")]),a._v(" service allows you to "),e("a",{attrs:{href:"https://github.com/JoinMarket-Org/joinmarket-clientserver/blob/master/docs/orderbook.md",target:"_blank",rel:"noopener noreferrer"}},[a._v("see an order book"),e("OutboundLink")],1),a._v(".")]),a._v(" "),e("p",[a._v("You can activate it:")]),a._v(" "),e("div",{staticClass:"language-bash extra-class"},[e("pre",{pre:!0,attrs:{class:"language-bash"}},[e("code",[a._v("supervisorctl start ob-watcher\n")])])]),e("p",[a._v("Then you can browse it by browsing "),e("code",[a._v("https://.com/obwatch/")])]),a._v(" "),e("h2",{attrs:{id:"troubleshooting"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#troubleshooting"}},[a._v("#")]),a._v(" Troubleshooting")]),a._v(" "),e("h3",{attrs:{id:"error-failed-to-load-wallet-you-need-to-remove-the-lock-file"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#error-failed-to-load-wallet-you-need-to-remove-the-lock-file"}},[a._v("#")]),a._v(" Error: Failed to load wallet, you need to remove the lock file")]),a._v(" "),e("p",[a._v("You might sometimes get the following error when running a python script for joinmarket:")]),a._v(" "),e("div",{staticClass:"language- extra-class"},[e("pre",{pre:!0,attrs:{class:"language-text"}},[e("code",[a._v("Failed to load wallet, error message: RetryableStorageError('File is currently in use (locked by pid 12822). If this is a leftover from a crashed instance you need to remove the lock file `/root/.joinmarket/wallets/.wallet.jmdat.lock` manually.')\n")])])]),e("p",[a._v("This is because a service using the wallet is running, so you need to shut it down before running the command.")]),a._v(" "),e("p",[a._v("Check which service is running:")]),a._v(" "),e("div",{staticClass:"language-bash extra-class"},[e("pre",{pre:!0,attrs:{class:"language-bash"}},[e("code",[a._v("supervisorctl status\n")])])]),e("p",[a._v("And stop it")]),a._v(" "),e("div",{staticClass:"language-bash extra-class"},[e("pre",{pre:!0,attrs:{class:"language-bash"}},[e("code",[a._v("supervisorctl stop yg-privacyenhanced\n")])])]),e("h3",{attrs:{id:"read-the-logs-of-services"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#read-the-logs-of-services"}},[a._v("#")]),a._v(" Read the logs of services")]),a._v(" "),e("p",[a._v("You can use the "),e("code",[a._v("supervisorctl tail")]),a._v(" command:")]),a._v(" "),e("div",{staticClass:"language-bash extra-class"},[e("pre",{pre:!0,attrs:{class:"language-bash"}},[e("code",[a._v("supervisorctl "),e("span",{pre:!0,attrs:{class:"token function"}},[a._v("tail")]),a._v(" yg-privacyenhanced\n")])])]),e("p",[a._v("You can also check the logs in the "),e("code",[a._v("$DATADIR/logs")]),a._v(" folder.")])])}),[],!1,null,null,null);e.default=r.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[130],{762:function(a,e,t){"use strict";t.r(e);var s=t(10),r=Object(s.a)({},(function(){var a=this,e=a._self._c;return e("ContentSlotsDistributor",{attrs:{"slot-key":a.$parent.slotKey}},[e("h1",{attrs:{id:"joinmarket-support"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#joinmarket-support"}},[a._v("#")]),a._v(" Joinmarket support")]),a._v(" "),e("p",[a._v("JoinMarket is software to create a special kind of bitcoin transaction called a CoinJoin transaction. Its aim is to improve the confidentiality and privacy of bitcoin transactions.")]),a._v(" "),e("p",[a._v("You will be able to use your bitcoin to help other protect their privacy, while earning a yield for this service.")]),a._v(" "),e("p",[a._v("See "),e("a",{attrs:{href:"https://github.com/JoinMarket-Org/JoinMarket-Docs/blob/master/High-level-design.md",target:"_blank",rel:"noopener noreferrer"}},[a._v("the documentation of the joinmarket project"),e("OutboundLink")],1),a._v(" for more details.")]),a._v(" "),e("p",[a._v("This is a very advanced functionality, and there is no easy way to recover if something goes wrong.")]),a._v(" "),e("p",[a._v("For hardcore bitcoiners only.")]),a._v(" "),e("h2",{attrs:{id:"how-to-use"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#how-to-use"}},[a._v("#")]),a._v(" How to use")]),a._v(" "),e("div",{staticClass:"language-bash extra-class"},[e("pre",{pre:!0,attrs:{class:"language-bash"}},[e("code",[e("span",{pre:!0,attrs:{class:"token assign-left variable"}},[a._v("BTCPAYGEN_ADDITIONAL_FRAGMENTS")]),e("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),e("span",{pre:!0,attrs:{class:"token string"}},[a._v('"'),e("span",{pre:!0,attrs:{class:"token variable"}},[a._v("$BTCPAYGEN_ADDITIONAL_FRAGMENTS")]),a._v(';opt-add-joinmarket"')]),a._v("\n"),e("span",{pre:!0,attrs:{class:"token builtin class-name"}},[a._v(".")]),a._v(" btcpay-setup.sh "),e("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("-i")]),a._v("\n")])])]),e("p",[a._v("Then you need to setup your default joinmarket wallet:")]),a._v(" "),e("div",{staticClass:"language-bash extra-class"},[e("pre",{pre:!0,attrs:{class:"language-bash"}},[e("code",[a._v("jm.sh wallet-tool-generate\njm.sh set-wallet "),e("span",{pre:!0,attrs:{class:"token operator"}},[a._v("<")]),a._v("wallet_file_name"),e("span",{pre:!0,attrs:{class:"token operator"}},[a._v(">")]),a._v(" "),e("span",{pre:!0,attrs:{class:"token operator"}},[a._v("<")]),a._v("password"),e("span",{pre:!0,attrs:{class:"token operator"}},[a._v(">")]),a._v("\n")])])]),e("p",[a._v("Once done, you will need to send some money to the joinmarket wallet:")]),a._v(" "),e("div",{staticClass:"language-bash extra-class"},[e("pre",{pre:!0,attrs:{class:"language-bash"}},[e("code",[a._v("jm.sh wallet-tool\n")])])]),e("h2",{attrs:{id:"how-to-change-joinmarket-configuration"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#how-to-change-joinmarket-configuration"}},[a._v("#")]),a._v(" How to change joinmarket configuration?")]),a._v(" "),e("p",[a._v("Connect to your container, and edit your configuration:")]),a._v(" "),e("div",{staticClass:"language-bash extra-class"},[e("pre",{pre:!0,attrs:{class:"language-bash"}},[e("code",[a._v("jm.sh "),e("span",{pre:!0,attrs:{class:"token function"}},[a._v("bash")]),a._v("\n"),e("span",{pre:!0,attrs:{class:"token function"}},[a._v("vim")]),a._v(" "),e("span",{pre:!0,attrs:{class:"token variable"}},[a._v("$CONFIG")]),a._v("\n")])])]),e("h2",{attrs:{id:"managing-your-wallet"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#managing-your-wallet"}},[a._v("#")]),a._v(" Managing your wallet")]),a._v(" "),e("p",[a._v("By running "),e("code",[a._v("jm.sh")]),a._v(" without parameter, you will get a bunch of command that you can run such as:")]),a._v(" "),e("div",{staticClass:"language- extra-class"},[e("pre",{pre:!0,attrs:{class:"language-text"}},[e("code",[a._v("Usage:\n------\n\nTooling to setup your joinmarket yield generator\n\n wallet-tool: Run wallet-tools.py on the wallet\n wallet-tool-generate: Generate a new wallet\n set-wallet: Set the wallet that the yield generator need to use\n bash: Open an interactive bash session in the joinmarket container\n receive-payjoin: Receive a payjoin payment\n sendpayment: Send a payjoin through coinjoin (password needed)\n\nExample:\n * jm.sh wallet-tool-generate\n * jm.sh set-wallet wallet.jmdat mypassword\n * jm.sh wallet-tool\n * jm.sh receive-payjoin \n * jm.sh sendpayment
    \n * jm.sh wallet-tool history\n * jm.sh bash\n")])])]),e("p",[a._v("Note "),e("code",[a._v("jm.sh")]),a._v(" commands are wrapper around joinmarket scripts. Those are just convenience command, you can always directly connect to the container via "),e("code",[a._v("jm.sh bash")]),a._v(" and achieve the same result with the joinmarket python scripts.")]),a._v(" "),e("h2",{attrs:{id:"getting-command-prompt-into-the-container"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#getting-command-prompt-into-the-container"}},[a._v("#")]),a._v(" Getting command prompt into the container")]),a._v(" "),e("p",[a._v("You can connect to the container and have direct access to joinmarket scripts such as:")]),a._v(" "),e("div",{staticClass:"language-bash extra-class"},[e("pre",{pre:!0,attrs:{class:"language-bash"}},[e("code",[a._v("jm.sh "),e("span",{pre:!0,attrs:{class:"token function"}},[a._v("bash")]),a._v("\nsendpayment.py wallet.jmdat "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("..")]),a._v(".\n")])])]),e("h2",{attrs:{id:"managing-the-services-such-as-yield-generators"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#managing-the-services-such-as-yield-generators"}},[a._v("#")]),a._v(" Managing the services such as yield generators")]),a._v(" "),e("p",[a._v("First connect to the container's bash")]),a._v(" "),e("div",{staticClass:"language-bash extra-class"},[e("pre",{pre:!0,attrs:{class:"language-bash"}},[e("code",[a._v("jm.sh "),e("span",{pre:!0,attrs:{class:"token function"}},[a._v("bash")]),a._v("\n")])])]),e("p",[a._v("You can list available services to run:")]),a._v(" "),e("div",{staticClass:"language-bash extra-class"},[e("pre",{pre:!0,attrs:{class:"language-bash"}},[e("code",[a._v("supervisorctl status\n")])])]),e("p",[a._v("Which might show you")]),a._v(" "),e("div",{staticClass:"language-bash extra-class"},[e("pre",{pre:!0,attrs:{class:"language-bash"}},[e("code",[a._v("root"),e("span",{pre:!0,attrs:{class:"token operator"}},[a._v(">")]),a._v(" supervisorctl status\nob-watcher STOPPED Not started\nyg-privacyenhanced STOPPED Not started\nyield-generator-basic STOPPED Not started\n")])])]),e("p",[a._v("You can start a yield generator with:")]),a._v(" "),e("div",{staticClass:"language-bash extra-class"},[e("pre",{pre:!0,attrs:{class:"language-bash"}},[e("code",[a._v("supervisorctl start yg-privacyenhanced\n")])])]),e("p",[a._v("*** Note that services will NOT be restarted automatically if the container restart. ***")]),a._v(" "),e("p",[a._v("If you want to automatically restart the service when the container restart,")]),a._v(" "),e("div",{staticClass:"language-bash extra-class"},[e("pre",{pre:!0,attrs:{class:"language-bash"}},[e("code",[e("span",{pre:!0,attrs:{class:"token function"}},[a._v("vim")]),a._v(" "),e("span",{pre:!0,attrs:{class:"token variable"}},[a._v("$AUTO_START")]),a._v("\n")])])]),e("p",[a._v("Then remove the comment "),e("code",[a._v("#")]),a._v(" in front of the service name you want to automatically restart.")]),a._v(" "),e("h2",{attrs:{id:"ob-watcher"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#ob-watcher"}},[a._v("#")]),a._v(" OB-Watcher")]),a._v(" "),e("p",[a._v("The "),e("code",[a._v("ob-watcher")]),a._v(" service allows you to "),e("a",{attrs:{href:"https://github.com/JoinMarket-Org/joinmarket-clientserver/blob/master/docs/orderbook.md",target:"_blank",rel:"noopener noreferrer"}},[a._v("see an order book"),e("OutboundLink")],1),a._v(".")]),a._v(" "),e("p",[a._v("You can activate it:")]),a._v(" "),e("div",{staticClass:"language-bash extra-class"},[e("pre",{pre:!0,attrs:{class:"language-bash"}},[e("code",[a._v("supervisorctl start ob-watcher\n")])])]),e("p",[a._v("Then you can browse it by browsing "),e("code",[a._v("https://.com/obwatch/")])]),a._v(" "),e("h2",{attrs:{id:"troubleshooting"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#troubleshooting"}},[a._v("#")]),a._v(" Troubleshooting")]),a._v(" "),e("h3",{attrs:{id:"error-failed-to-load-wallet-you-need-to-remove-the-lock-file"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#error-failed-to-load-wallet-you-need-to-remove-the-lock-file"}},[a._v("#")]),a._v(" Error: Failed to load wallet, you need to remove the lock file")]),a._v(" "),e("p",[a._v("You might sometimes get the following error when running a python script for joinmarket:")]),a._v(" "),e("div",{staticClass:"language- extra-class"},[e("pre",{pre:!0,attrs:{class:"language-text"}},[e("code",[a._v("Failed to load wallet, error message: RetryableStorageError('File is currently in use (locked by pid 12822). If this is a leftover from a crashed instance you need to remove the lock file `/root/.joinmarket/wallets/.wallet.jmdat.lock` manually.')\n")])])]),e("p",[a._v("This is because a service using the wallet is running, so you need to shut it down before running the command.")]),a._v(" "),e("p",[a._v("Check which service is running:")]),a._v(" "),e("div",{staticClass:"language-bash extra-class"},[e("pre",{pre:!0,attrs:{class:"language-bash"}},[e("code",[a._v("supervisorctl status\n")])])]),e("p",[a._v("And stop it")]),a._v(" "),e("div",{staticClass:"language-bash extra-class"},[e("pre",{pre:!0,attrs:{class:"language-bash"}},[e("code",[a._v("supervisorctl stop yg-privacyenhanced\n")])])]),e("h3",{attrs:{id:"read-the-logs-of-services"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#read-the-logs-of-services"}},[a._v("#")]),a._v(" Read the logs of services")]),a._v(" "),e("p",[a._v("You can use the "),e("code",[a._v("supervisorctl tail")]),a._v(" command:")]),a._v(" "),e("div",{staticClass:"language-bash extra-class"},[e("pre",{pre:!0,attrs:{class:"language-bash"}},[e("code",[a._v("supervisorctl "),e("span",{pre:!0,attrs:{class:"token function"}},[a._v("tail")]),a._v(" yg-privacyenhanced\n")])])]),e("p",[a._v("You can also check the logs in the "),e("code",[a._v("$DATADIR/logs")]),a._v(" folder.")])])}),[],!1,null,null,null);e.default=r.exports}}]); \ No newline at end of file diff --git a/assets/js/131.2b34d554.js b/assets/js/131.6a3809ea.js similarity index 97% rename from assets/js/131.2b34d554.js rename to assets/js/131.6a3809ea.js index e813fd75ff..b5a9b95fe5 100644 --- a/assets/js/131.2b34d554.js +++ b/assets/js/131.6a3809ea.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[131],{768:function(a,t,s){"use strict";s.r(t);var e=s(10),n=Object(e.a)({},(function(){var a=this,t=a._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":a.$parent.slotKey}},[t("h1",{attrs:{id:"lightning-terminal-lit"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#lightning-terminal-lit"}},[a._v("#")]),a._v(" Lightning Terminal (LiT)")]),a._v(" "),t("p",[t("a",{attrs:{href:"https://github.com/lightninglabs/lightning-terminal",target:"_blank",rel:"noopener noreferrer"}},[a._v("Lightning Terminal"),t("OutboundLink")],1),a._v(" (LiT) is a browser-based interface for managing channel liquidity.\nIt integrates the Lightning Labs services Loop, Poold and Faraday all in one and offers a web UI to manage them.\nLND required.")]),a._v(" "),t("h2",{attrs:{id:"installation"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#installation"}},[a._v("#")]),a._v(" Installation")]),a._v(" "),t("p",[a._v("To install the Lightning Terminal service, you need to set a password for the login.")]),a._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token comment"}},[a._v("# Set password")]),a._v("\n"),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[a._v("export")]),a._v(" "),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[a._v("LIT_PASSWD")]),t("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),t("span",{pre:!0,attrs:{class:"token string"}},[a._v('"sUpErSeCuRe"')]),a._v("\n\n"),t("span",{pre:!0,attrs:{class:"token comment"}},[a._v("# Add fragment and run setup")]),a._v("\n"),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[a._v("export")]),a._v(" "),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[a._v("BTCPAYGEN_ADDITIONAL_FRAGMENTS")]),t("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),t("span",{pre:!0,attrs:{class:"token string"}},[a._v('"'),t("span",{pre:!0,attrs:{class:"token variable"}},[a._v("$BTCPAYGEN_ADDITIONAL_FRAGMENTS")]),a._v(';opt-add-lightning-terminal"')]),a._v("\n"),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[a._v(".")]),a._v(" btcpay-setup.sh "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("-i")]),a._v("\n")])])]),t("p",[a._v("Afterwards you should see Lightning Terminal appear as a service on the Server Settings > Services page in BTCPay Server.")]),a._v(" "),t("h2",{attrs:{id:"troubleshooting"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#troubleshooting"}},[a._v("#")]),a._v(" Troubleshooting")]),a._v(" "),t("p",[a._v("To see the logs of the Lightning Terminal service, you can run this command:")]),a._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token function"}},[a._v("docker")]),a._v(" logs "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("-f")]),a._v(" generated_lnd_lit_1\n")])])])])}),[],!1,null,null,null);t.default=n.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[131],{765:function(a,t,s){"use strict";s.r(t);var e=s(10),n=Object(e.a)({},(function(){var a=this,t=a._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":a.$parent.slotKey}},[t("h1",{attrs:{id:"lightning-terminal-lit"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#lightning-terminal-lit"}},[a._v("#")]),a._v(" Lightning Terminal (LiT)")]),a._v(" "),t("p",[t("a",{attrs:{href:"https://github.com/lightninglabs/lightning-terminal",target:"_blank",rel:"noopener noreferrer"}},[a._v("Lightning Terminal"),t("OutboundLink")],1),a._v(" (LiT) is a browser-based interface for managing channel liquidity.\nIt integrates the Lightning Labs services Loop, Poold and Faraday all in one and offers a web UI to manage them.\nLND required.")]),a._v(" "),t("h2",{attrs:{id:"installation"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#installation"}},[a._v("#")]),a._v(" Installation")]),a._v(" "),t("p",[a._v("To install the Lightning Terminal service, you need to set a password for the login.")]),a._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token comment"}},[a._v("# Set password")]),a._v("\n"),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[a._v("export")]),a._v(" "),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[a._v("LIT_PASSWD")]),t("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),t("span",{pre:!0,attrs:{class:"token string"}},[a._v('"sUpErSeCuRe"')]),a._v("\n\n"),t("span",{pre:!0,attrs:{class:"token comment"}},[a._v("# Add fragment and run setup")]),a._v("\n"),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[a._v("export")]),a._v(" "),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[a._v("BTCPAYGEN_ADDITIONAL_FRAGMENTS")]),t("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),t("span",{pre:!0,attrs:{class:"token string"}},[a._v('"'),t("span",{pre:!0,attrs:{class:"token variable"}},[a._v("$BTCPAYGEN_ADDITIONAL_FRAGMENTS")]),a._v(';opt-add-lightning-terminal"')]),a._v("\n"),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[a._v(".")]),a._v(" btcpay-setup.sh "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("-i")]),a._v("\n")])])]),t("p",[a._v("Afterwards you should see Lightning Terminal appear as a service on the Server Settings > Services page in BTCPay Server.")]),a._v(" "),t("h2",{attrs:{id:"troubleshooting"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#troubleshooting"}},[a._v("#")]),a._v(" Troubleshooting")]),a._v(" "),t("p",[a._v("To see the logs of the Lightning Terminal service, you can run this command:")]),a._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token function"}},[a._v("docker")]),a._v(" logs "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("-f")]),a._v(" generated_lnd_lit_1\n")])])])])}),[],!1,null,null,null);t.default=n.exports}}]); \ No newline at end of file diff --git a/assets/js/132.acc9436a.js b/assets/js/132.eca2b20d.js similarity index 98% rename from assets/js/132.acc9436a.js rename to assets/js/132.eca2b20d.js index 88f64b4875..5e0fc07fa2 100644 --- a/assets/js/132.acc9436a.js +++ b/assets/js/132.eca2b20d.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[132],{766:function(t,e,a){"use strict";a.r(e);var o=a(10),s=Object(o.a)({},(function(){var t=this,e=t._self._c;return e("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[e("h1",{attrs:{id:"ndlc-support"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#ndlc-support"}},[t._v("#")]),t._v(" NDLC support")]),t._v(" "),e("div",{staticClass:"custom-block danger"},[e("p",{staticClass:"custom-block-title"},[t._v("Disclaimer")]),t._v(" "),e("p",[t._v("This project is experimental and based on a protocol which is still evolving everyday.\nUse with caution.")]),t._v(" "),e("p",[t._v("I will take no attempt at maintaining backwards compatibility at this stage.")])]),t._v(" "),e("h2",{attrs:{id:"introduction"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#introduction"}},[t._v("#")]),t._v(" Introduction")]),t._v(" "),e("p",[t._v("A DLC can be seen as a smart contract involving two "),e("code",[t._v("parties")]),t._v(", a future "),e("code",[t._v("event")]),t._v(", a set of outcomes and a "),e("code",[t._v("payoff function")]),t._v(".\nAn "),e("code",[t._v("outcome")]),t._v(" can be "),e("code",[t._v("attested")]),t._v(" by an "),e("code",[t._v("oracle")]),t._v(". The "),e("code",[t._v("oracle")]),t._v(" does not need to interact with either party, and its only role is to "),e("code",[t._v("attest")]),t._v(" the outcome of the event.")]),t._v(" "),e("p",[t._v("The "),e("code",[t._v("payoff function")]),t._v(" determines the two parties' profit or loss depending on which outcome get "),e("code",[t._v("attested")]),t._v(".")]),t._v(" "),e("p",[t._v("The "),e("code",[t._v("oracle")]),t._v(" roles is to define the "),e("code",[t._v("event")]),t._v(" and "),e("code",[t._v("attest")]),t._v(" a single outcome of the event.")]),t._v(" "),e("p",[t._v("Let's call Alice and Bob the two parties of the contract, and Olivia the oracle.")]),t._v(" "),e("p",[t._v("A DLC will show two transactions on the chain:")]),t._v(" "),e("ul",[e("li",[t._v("The Funding Transaction")]),t._v(" "),e("li",[t._v("The Contract Execution Transaction (CET)")])]),t._v(" "),e("p",[t._v("The "),e("code",[t._v("Funding Transaction")]),t._v(" is a transaction built by the two parties of the contract, locking their collateral for the contract.")]),t._v(" "),e("p",[t._v("The "),e("code",[t._v("Contract Execution Transaction")]),t._v(" (or "),e("code",[t._v("CET")]),t._v(") is the transaction distributing the locked collateral according to the "),e("code",[t._v("payoff function")]),t._v(" for the outcome attested by the oracle.")]),t._v(" "),e("p",[t._v("The following documentation is also explained in this video.")]),t._v(" "),e("a",{staticClass:"ytEmbed",staticStyle:{"background-image":"url(https://img.youtube.com/vi/DakwshnNkho/hqdefault.jpg)"},attrs:{href:"https://www.youtube.com/watch?v=DakwshnNkho",title:"How to make a DLC with NDLC-CLI","data-id":"DakwshnNkho"}},[e("iframe",{attrs:{title:"How to make a DLC with NDLC-CLI","data-src":"https://www.youtube-nocookie.com/embed/DakwshnNkho?&autoplay=1&autohide=1&modestbranding=1&color=white&rel=0",frameborder:"0",allow:"autoplay;encrypted-media;picture-in-picture",allowfullscreen:""}})]),t._v(" "),e("h2",{attrs:{id:"how-to-use"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#how-to-use"}},[t._v("#")]),t._v(" How to use")]),t._v(" "),e("p",[t._v("You need to add ndlc's docker fragment to your install with:")]),t._v(" "),e("div",{staticClass:"language-bash extra-class"},[e("pre",{pre:!0,attrs:{class:"language-bash"}},[e("code",[e("span",{pre:!0,attrs:{class:"token assign-left variable"}},[t._v("BTCPAYGEN_ADDITIONAL_FRAGMENTS")]),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"'),e("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$BTCPAYGEN_ADDITIONAL_FRAGMENTS")]),t._v(';opt-add-ndlc"')]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v(".")]),t._v(" btcpay-setup.sh "),e("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-i")]),t._v("\n")])])]),e("p",[t._v("You can then use "),e("code",[t._v("ndlc-cli.sh")]),t._v(" to run use ndlc-cli, for example:")]),t._v(" "),e("div",{staticClass:"language-bash extra-class"},[e("pre",{pre:!0,attrs:{class:"language-bash"}},[e("code",[t._v("ndlc.sh oracle generate MyOwnOracle\n")])])]),e("p",[t._v("Read our documentation on our "),e("a",{attrs:{href:"https://github.com/dgarage/NDLC/blob/master/docs/Concepts.md",target:"_blank",rel:"noopener noreferrer"}},[t._v("GitHub repository"),e("OutboundLink")],1),t._v(".")])])}),[],!1,null,null,null);e.default=s.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[132],{767:function(t,e,a){"use strict";a.r(e);var o=a(10),s=Object(o.a)({},(function(){var t=this,e=t._self._c;return e("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[e("h1",{attrs:{id:"ndlc-support"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#ndlc-support"}},[t._v("#")]),t._v(" NDLC support")]),t._v(" "),e("div",{staticClass:"custom-block danger"},[e("p",{staticClass:"custom-block-title"},[t._v("Disclaimer")]),t._v(" "),e("p",[t._v("This project is experimental and based on a protocol which is still evolving everyday.\nUse with caution.")]),t._v(" "),e("p",[t._v("I will take no attempt at maintaining backwards compatibility at this stage.")])]),t._v(" "),e("h2",{attrs:{id:"introduction"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#introduction"}},[t._v("#")]),t._v(" Introduction")]),t._v(" "),e("p",[t._v("A DLC can be seen as a smart contract involving two "),e("code",[t._v("parties")]),t._v(", a future "),e("code",[t._v("event")]),t._v(", a set of outcomes and a "),e("code",[t._v("payoff function")]),t._v(".\nAn "),e("code",[t._v("outcome")]),t._v(" can be "),e("code",[t._v("attested")]),t._v(" by an "),e("code",[t._v("oracle")]),t._v(". The "),e("code",[t._v("oracle")]),t._v(" does not need to interact with either party, and its only role is to "),e("code",[t._v("attest")]),t._v(" the outcome of the event.")]),t._v(" "),e("p",[t._v("The "),e("code",[t._v("payoff function")]),t._v(" determines the two parties' profit or loss depending on which outcome get "),e("code",[t._v("attested")]),t._v(".")]),t._v(" "),e("p",[t._v("The "),e("code",[t._v("oracle")]),t._v(" roles is to define the "),e("code",[t._v("event")]),t._v(" and "),e("code",[t._v("attest")]),t._v(" a single outcome of the event.")]),t._v(" "),e("p",[t._v("Let's call Alice and Bob the two parties of the contract, and Olivia the oracle.")]),t._v(" "),e("p",[t._v("A DLC will show two transactions on the chain:")]),t._v(" "),e("ul",[e("li",[t._v("The Funding Transaction")]),t._v(" "),e("li",[t._v("The Contract Execution Transaction (CET)")])]),t._v(" "),e("p",[t._v("The "),e("code",[t._v("Funding Transaction")]),t._v(" is a transaction built by the two parties of the contract, locking their collateral for the contract.")]),t._v(" "),e("p",[t._v("The "),e("code",[t._v("Contract Execution Transaction")]),t._v(" (or "),e("code",[t._v("CET")]),t._v(") is the transaction distributing the locked collateral according to the "),e("code",[t._v("payoff function")]),t._v(" for the outcome attested by the oracle.")]),t._v(" "),e("p",[t._v("The following documentation is also explained in this video.")]),t._v(" "),e("a",{staticClass:"ytEmbed",staticStyle:{"background-image":"url(https://img.youtube.com/vi/DakwshnNkho/hqdefault.jpg)"},attrs:{href:"https://www.youtube.com/watch?v=DakwshnNkho",title:"How to make a DLC with NDLC-CLI","data-id":"DakwshnNkho"}},[e("iframe",{attrs:{title:"How to make a DLC with NDLC-CLI","data-src":"https://www.youtube-nocookie.com/embed/DakwshnNkho?&autoplay=1&autohide=1&modestbranding=1&color=white&rel=0",frameborder:"0",allow:"autoplay;encrypted-media;picture-in-picture",allowfullscreen:""}})]),t._v(" "),e("h2",{attrs:{id:"how-to-use"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#how-to-use"}},[t._v("#")]),t._v(" How to use")]),t._v(" "),e("p",[t._v("You need to add ndlc's docker fragment to your install with:")]),t._v(" "),e("div",{staticClass:"language-bash extra-class"},[e("pre",{pre:!0,attrs:{class:"language-bash"}},[e("code",[e("span",{pre:!0,attrs:{class:"token assign-left variable"}},[t._v("BTCPAYGEN_ADDITIONAL_FRAGMENTS")]),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"'),e("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$BTCPAYGEN_ADDITIONAL_FRAGMENTS")]),t._v(';opt-add-ndlc"')]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v(".")]),t._v(" btcpay-setup.sh "),e("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-i")]),t._v("\n")])])]),e("p",[t._v("You can then use "),e("code",[t._v("ndlc-cli.sh")]),t._v(" to run use ndlc-cli, for example:")]),t._v(" "),e("div",{staticClass:"language-bash extra-class"},[e("pre",{pre:!0,attrs:{class:"language-bash"}},[e("code",[t._v("ndlc.sh oracle generate MyOwnOracle\n")])])]),e("p",[t._v("Read our documentation on our "),e("a",{attrs:{href:"https://github.com/dgarage/NDLC/blob/master/docs/Concepts.md",target:"_blank",rel:"noopener noreferrer"}},[t._v("GitHub repository"),e("OutboundLink")],1),t._v(".")])])}),[],!1,null,null,null);e.default=s.exports}}]); \ No newline at end of file diff --git a/assets/js/133.0955c7dd.js b/assets/js/133.36fba70e.js similarity index 98% rename from assets/js/133.0955c7dd.js rename to assets/js/133.36fba70e.js index bd11962aa3..8fd0d49586 100644 --- a/assets/js/133.0955c7dd.js +++ b/assets/js/133.36fba70e.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[133],{767:function(e,a,t){"use strict";t.r(a);var s=t(10),r=Object(s.a)({},(function(){var e=this,a=e._self._c;return a("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[a("h1",{attrs:{id:"pi-hole-support"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#pi-hole-support"}},[e._v("#")]),e._v(" Pi-Hole support")]),e._v(" "),a("p",[a("a",{attrs:{href:"https://pi-hole.net/",target:"_blank",rel:"noopener noreferrer"}},[e._v("Pi-Hole"),a("OutboundLink")],1),e._v(" is a black hole for internet advertisement.\nIt works as a DNS server which blacklist domains tied to advertisement. If you use it as your main DNS server and it detects your query is trying to resolve a domain belonging to an advertisement company, it will resolve the domain to IP "),a("code",[e._v("0.0.0.0")]),e._v(", preventing the advertisement to load on any computer using this DNS server.")]),e._v(" "),a("p",[e._v("Note that our pi-hole integration is meant to be used in a "),a("strong",[e._v("local network")]),e._v(". Please do not try to use this option on a VPS.")]),e._v(" "),a("h2",{attrs:{id:"how-to-use"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#how-to-use"}},[e._v("#")]),e._v(" How to use")]),e._v(" "),a("p",[e._v("Let's imagine the local IP of your BTCPay Server is "),a("code",[e._v("192.168.1.2")]),e._v(".")]),e._v(" "),a("ol",[a("li",[e._v("Connect as root to your server")]),e._v(" "),a("li",[e._v("Add pihole as an option to your docker deployment")])]),e._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[a("span",{pre:!0,attrs:{class:"token assign-left variable"}},[e._v("BTCPAYGEN_ADDITIONAL_FRAGMENTS")]),a("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),a("span",{pre:!0,attrs:{class:"token string"}},[e._v('"'),a("span",{pre:!0,attrs:{class:"token variable"}},[e._v("$BTCPAYGEN_ADDITIONAL_FRAGMENTS")]),e._v(';opt-add-pihole"')]),e._v("\n"),a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v(".")]),e._v(" btcpay-setup.sh "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-i")]),e._v("\n")])])]),a("ol",{attrs:{start:"3"}},[a("li",[e._v("If your server has a firewall, make sure it allow incoming traffic to port "),a("code",[e._v("53 (UDP)")]),e._v(".")]),e._v(" "),a("li",[e._v("Configure your home router DHCP server to use "),a("code",[e._v("192.168.1.2")]),e._v(" as primary DNS server.")])]),e._v(" "),a("p",[e._v("From now everytime a device will connect to your local network, they will automatically use pi-hole as a DNS server. Advertisements will go to a black hole for all devices.")]),e._v(" "),a("h2",{attrs:{id:"using-the-dashboard"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#using-the-dashboard"}},[e._v("#")]),e._v(" Using the dashboard")]),e._v(" "),a("p",[e._v("Pi-Hole comes with a very nice admin dashboard to monitor its activity.\nIt is disabled by default. To enable it, you need to configure "),a("code",[e._v("PIHOLE_SERVERIP")]),e._v(" to the IP of your server:")]),e._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[a("span",{pre:!0,attrs:{class:"token assign-left variable"}},[e._v("PIHOLE_SERVERIP")]),a("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),a("span",{pre:!0,attrs:{class:"token string"}},[e._v('"192.168.1.2"')]),e._v("\n"),a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v(".")]),e._v(" btcpay-setup.sh "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-i")]),e._v("\n")])])]),a("p",[e._v("If your device is using pi-hole as a DNS server, you should now be able to browse "),a("code",[e._v("http://pi.hole/admin")]),e._v(" to connect to your dashboard.")]),e._v(" "),a("p",[e._v("You can find the admin password in the logs of pihole:")]),e._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[a("span",{pre:!0,attrs:{class:"token function"}},[e._v("docker")]),e._v(" logs pihole "),a("span",{pre:!0,attrs:{class:"token operator"}},[e._v("|")]),e._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[e._v("grep")]),e._v(" random\n")])])]),a("p",[e._v("If the password does not work, you can try to reset the password:")]),e._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[e._v("pihole.sh "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-a")]),e._v(" "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-p")]),e._v("\n"),a("span",{pre:!0,attrs:{class:"token function"}},[e._v("docker")]),e._v(" restart pihole\n")])])]),a("p",[e._v("Then running again")]),e._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[a("span",{pre:!0,attrs:{class:"token function"}},[e._v("docker")]),e._v(" logs pihole "),a("span",{pre:!0,attrs:{class:"token operator"}},[e._v("|")]),e._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[e._v("grep")]),e._v(" random\n")])])])])}),[],!1,null,null,null);a.default=r.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[133],{768:function(e,a,t){"use strict";t.r(a);var s=t(10),r=Object(s.a)({},(function(){var e=this,a=e._self._c;return a("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[a("h1",{attrs:{id:"pi-hole-support"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#pi-hole-support"}},[e._v("#")]),e._v(" Pi-Hole support")]),e._v(" "),a("p",[a("a",{attrs:{href:"https://pi-hole.net/",target:"_blank",rel:"noopener noreferrer"}},[e._v("Pi-Hole"),a("OutboundLink")],1),e._v(" is a black hole for internet advertisement.\nIt works as a DNS server which blacklist domains tied to advertisement. If you use it as your main DNS server and it detects your query is trying to resolve a domain belonging to an advertisement company, it will resolve the domain to IP "),a("code",[e._v("0.0.0.0")]),e._v(", preventing the advertisement to load on any computer using this DNS server.")]),e._v(" "),a("p",[e._v("Note that our pi-hole integration is meant to be used in a "),a("strong",[e._v("local network")]),e._v(". Please do not try to use this option on a VPS.")]),e._v(" "),a("h2",{attrs:{id:"how-to-use"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#how-to-use"}},[e._v("#")]),e._v(" How to use")]),e._v(" "),a("p",[e._v("Let's imagine the local IP of your BTCPay Server is "),a("code",[e._v("192.168.1.2")]),e._v(".")]),e._v(" "),a("ol",[a("li",[e._v("Connect as root to your server")]),e._v(" "),a("li",[e._v("Add pihole as an option to your docker deployment")])]),e._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[a("span",{pre:!0,attrs:{class:"token assign-left variable"}},[e._v("BTCPAYGEN_ADDITIONAL_FRAGMENTS")]),a("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),a("span",{pre:!0,attrs:{class:"token string"}},[e._v('"'),a("span",{pre:!0,attrs:{class:"token variable"}},[e._v("$BTCPAYGEN_ADDITIONAL_FRAGMENTS")]),e._v(';opt-add-pihole"')]),e._v("\n"),a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v(".")]),e._v(" btcpay-setup.sh "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-i")]),e._v("\n")])])]),a("ol",{attrs:{start:"3"}},[a("li",[e._v("If your server has a firewall, make sure it allow incoming traffic to port "),a("code",[e._v("53 (UDP)")]),e._v(".")]),e._v(" "),a("li",[e._v("Configure your home router DHCP server to use "),a("code",[e._v("192.168.1.2")]),e._v(" as primary DNS server.")])]),e._v(" "),a("p",[e._v("From now everytime a device will connect to your local network, they will automatically use pi-hole as a DNS server. Advertisements will go to a black hole for all devices.")]),e._v(" "),a("h2",{attrs:{id:"using-the-dashboard"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#using-the-dashboard"}},[e._v("#")]),e._v(" Using the dashboard")]),e._v(" "),a("p",[e._v("Pi-Hole comes with a very nice admin dashboard to monitor its activity.\nIt is disabled by default. To enable it, you need to configure "),a("code",[e._v("PIHOLE_SERVERIP")]),e._v(" to the IP of your server:")]),e._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[a("span",{pre:!0,attrs:{class:"token assign-left variable"}},[e._v("PIHOLE_SERVERIP")]),a("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),a("span",{pre:!0,attrs:{class:"token string"}},[e._v('"192.168.1.2"')]),e._v("\n"),a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v(".")]),e._v(" btcpay-setup.sh "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-i")]),e._v("\n")])])]),a("p",[e._v("If your device is using pi-hole as a DNS server, you should now be able to browse "),a("code",[e._v("http://pi.hole/admin")]),e._v(" to connect to your dashboard.")]),e._v(" "),a("p",[e._v("You can find the admin password in the logs of pihole:")]),e._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[a("span",{pre:!0,attrs:{class:"token function"}},[e._v("docker")]),e._v(" logs pihole "),a("span",{pre:!0,attrs:{class:"token operator"}},[e._v("|")]),e._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[e._v("grep")]),e._v(" random\n")])])]),a("p",[e._v("If the password does not work, you can try to reset the password:")]),e._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[e._v("pihole.sh "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-a")]),e._v(" "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-p")]),e._v("\n"),a("span",{pre:!0,attrs:{class:"token function"}},[e._v("docker")]),e._v(" restart pihole\n")])])]),a("p",[e._v("Then running again")]),e._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[a("span",{pre:!0,attrs:{class:"token function"}},[e._v("docker")]),e._v(" logs pihole "),a("span",{pre:!0,attrs:{class:"token operator"}},[e._v("|")]),e._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[e._v("grep")]),e._v(" random\n")])])])])}),[],!1,null,null,null);a.default=r.exports}}]); \ No newline at end of file diff --git a/assets/js/135.bb5a906d.js b/assets/js/135.1c2b38fe.js similarity index 98% rename from assets/js/135.bb5a906d.js rename to assets/js/135.1c2b38fe.js index f59b1a3849..30c2d9a3bb 100644 --- a/assets/js/135.bb5a906d.js +++ b/assets/js/135.1c2b38fe.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[135],{770:function(e,t,r){"use strict";r.r(t);var a=r(10),o=Object(a.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"drupal-commerce-2x-integration"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#drupal-commerce-2x-integration"}},[e._v("#")]),e._v(" Drupal Commerce 2.x integration")]),e._v(" "),t("p",[e._v("The project can be found "),t("a",{attrs:{href:"https://drupal.org/project/commerce_btcpay",target:"_blank",rel:"noopener noreferrer"}},[e._v("here"),t("OutboundLink")],1),e._v(" on drupal.org and therefore can be installed using "),t("code",[e._v("composer")]),e._v(" from the drupal.org packagist (no need to add the repo manually to your "),t("code",[e._v("composer.json")]),e._v("). The sources are available on "),t("a",{attrs:{href:"https://github.com/btcpayserver/commerce_btcpay",target:"_blank",rel:"noopener noreferrer"}},[e._v("github"),t("OutboundLink")],1),e._v(".")]),e._v(" "),t("h2",{attrs:{id:"requirements"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#requirements"}},[e._v("#")]),e._v(" Requirements")]),e._v(" "),t("ul",[t("li",[e._v("BTCPay Server ("),t("RouterLink",{attrs:{to:"/Deployment/"}},[e._v("self hosted or 3rd party")]),e._v(" or "),t("RouterLink",{attrs:{to:"/TryItOut/"}},[e._v("quick start with a testserver")]),e._v(")")],1),e._v(" "),t("li",[e._v("Drupal Commerce 2.x installed ("),t("a",{attrs:{href:"https://docs.drupalcommerce.org/commerce2/developer-guide/install-update/installation",target:"_blank",rel:"noopener noreferrer"}},[e._v("installation guide"),t("OutboundLink")],1),e._v(")")]),e._v(" "),t("li",[e._v("Drupal: "),t("a",{attrs:{href:"https://www.drupal.org/docs/8/core/modules/file/overview#content-accessing-private-files",target:"_blank",rel:"noopener noreferrer"}},[e._v("configured private file system"),t("OutboundLink")],1)])]),e._v(" "),t("h2",{attrs:{id:"module-installation-and-configuration"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#module-installation-and-configuration"}},[e._v("#")]),e._v(" Module installation and configuration")]),e._v(" "),t("h3",{attrs:{id:"quick-walkthrough-screencast"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#quick-walkthrough-screencast"}},[e._v("#")]),e._v(" Quick walkthrough screencast")]),e._v(" "),t("a",{staticClass:"ytEmbed",staticStyle:{"background-image":"url(https://img.youtube.com/vi/XBZwyC2v48s/hqdefault.jpg)"},attrs:{href:"https://youtube.com/watch?v=XBZwyC2v48s",title:"BTCPay Server - Drupal Commerce 2.x quick walkthrough","data-id":"XBZwyC2v48s"}},[t("iframe",{attrs:{title:"BTCPay Server - Drupal Commerce 2.x quick walkthrough","data-src":"https://www.youtube-nocookie.com/embed/XBZwyC2v48s?&autoplay=1&autohide=1&modestbranding=1&color=white&rel=0",frameborder:"0",allow:"autoplay;encrypted-media;picture-in-picture",allowfullscreen:""}})]),e._v(" "),t("h3",{attrs:{id:"quick-walkthrough-steps"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#quick-walkthrough-steps"}},[e._v("#")]),e._v(" Quick walkthrough steps")]),e._v(" "),t("h4",{attrs:{id:"generate-pairing-code-on-btcpay-server"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#generate-pairing-code-on-btcpay-server"}},[e._v("#")]),e._v(" Generate pairing code on BTCPay server")]),e._v(" "),t("ol",[t("li",[e._v("BTCPay server: "),t("RouterLink",{attrs:{to:"/CreateStore/#creating-a-store-in-btcpay"}},[e._v("create and configure a store")])],1),e._v(" "),t("li",[e._v('in store settings go to "'),t("strong",[e._v("Access Tokens")]),e._v('"')]),e._v(" "),t("li",[e._v("click on "),t("strong",[e._v("[Create a new token]")])]),e._v(" "),t("li",[t("strong",[e._v("Label:")]),e._v(" enter some label (eg. my store)")]),e._v(" "),t("li",[t("strong",[e._v("Public key:")]),e._v(" this needs to be left "),t("strong",[e._v("empty")])]),e._v(" "),t("li",[t("strong",[e._v("Facade:")]),e._v(' "merchant"')]),e._v(" "),t("li",[e._v("click on "),t("strong",[e._v("[Request pairing]")])]),e._v(" "),t("li",[e._v("on next screen choose your configured store in "),t("strong",[e._v("Pair to")]),e._v(" select dropdown and click on "),t("strong",[e._v("[approve]")])]),e._v(" "),t("li",[e._v('note down the displayed 7-digit code at the top status message, e.g. "d7afaXr"\n(you will need that code below on gateway configuration, see below)')])]),e._v(" "),t("h4",{attrs:{id:"commerce-btcpay-installation-configuration"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#commerce-btcpay-installation-configuration"}},[e._v("#")]),e._v(" Commerce BTCPay: Installation + configuration")]),e._v(" "),t("ol",[t("li",[e._v("install module: "),t("code",[e._v("composer require drupal/commerce_btcpay")])]),e._v(" "),t("li",[e._v("enable the module: "),t("code",[e._v("drush en commerce_btcpay -y")])]),e._v(" "),t("li",[e._v("make sure you have configured "),t("a",{attrs:{href:"https://www.drupal.org/docs/8/core/modules/file/overview#content-accessing-private-files",target:"_blank",rel:"noopener noreferrer"}},[e._v("private file system"),t("OutboundLink")],1),e._v(" (needed to store encrypted public+private key)")]),e._v(" "),t("li",[e._v("Commerce BTCPay configuration ("),t("strong",[e._v("Commerce -> Configuration -> Payment -> Payment gateways")]),e._v("):")]),e._v(" "),t("li",[e._v('add payment method "BTCPay"\n'),t("ul",[t("li",[t("strong",[e._v("Mode")]),e._v(": Test or Live (you can configure both individually)")]),e._v(" "),t("li",[t("strong",[e._v("Test/Live server host")]),e._v(": enter your URL without https:// prefix e.g. btcpay.yourserver.com (note valid SSL certificate needed)")]),e._v(" "),t("li",[t("strong",[e._v("Test/Live Paring code")]),e._v(': enter the 7-digit pairing code from BTCPay "Access tokens" page')]),e._v(" "),t("li",[t("strong",[e._v("Save")]),e._v("\nYou should see a message that the tokens were successfully created.")])])])])])}),[],!1,null,null,null);t.default=o.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[135],{772:function(e,t,r){"use strict";r.r(t);var a=r(10),o=Object(a.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"drupal-commerce-2x-integration"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#drupal-commerce-2x-integration"}},[e._v("#")]),e._v(" Drupal Commerce 2.x integration")]),e._v(" "),t("p",[e._v("The project can be found "),t("a",{attrs:{href:"https://drupal.org/project/commerce_btcpay",target:"_blank",rel:"noopener noreferrer"}},[e._v("here"),t("OutboundLink")],1),e._v(" on drupal.org and therefore can be installed using "),t("code",[e._v("composer")]),e._v(" from the drupal.org packagist (no need to add the repo manually to your "),t("code",[e._v("composer.json")]),e._v("). The sources are available on "),t("a",{attrs:{href:"https://github.com/btcpayserver/commerce_btcpay",target:"_blank",rel:"noopener noreferrer"}},[e._v("github"),t("OutboundLink")],1),e._v(".")]),e._v(" "),t("h2",{attrs:{id:"requirements"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#requirements"}},[e._v("#")]),e._v(" Requirements")]),e._v(" "),t("ul",[t("li",[e._v("BTCPay Server ("),t("RouterLink",{attrs:{to:"/Deployment/"}},[e._v("self hosted or 3rd party")]),e._v(" or "),t("RouterLink",{attrs:{to:"/TryItOut/"}},[e._v("quick start with a testserver")]),e._v(")")],1),e._v(" "),t("li",[e._v("Drupal Commerce 2.x installed ("),t("a",{attrs:{href:"https://docs.drupalcommerce.org/commerce2/developer-guide/install-update/installation",target:"_blank",rel:"noopener noreferrer"}},[e._v("installation guide"),t("OutboundLink")],1),e._v(")")]),e._v(" "),t("li",[e._v("Drupal: "),t("a",{attrs:{href:"https://www.drupal.org/docs/8/core/modules/file/overview#content-accessing-private-files",target:"_blank",rel:"noopener noreferrer"}},[e._v("configured private file system"),t("OutboundLink")],1)])]),e._v(" "),t("h2",{attrs:{id:"module-installation-and-configuration"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#module-installation-and-configuration"}},[e._v("#")]),e._v(" Module installation and configuration")]),e._v(" "),t("h3",{attrs:{id:"quick-walkthrough-screencast"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#quick-walkthrough-screencast"}},[e._v("#")]),e._v(" Quick walkthrough screencast")]),e._v(" "),t("a",{staticClass:"ytEmbed",staticStyle:{"background-image":"url(https://img.youtube.com/vi/XBZwyC2v48s/hqdefault.jpg)"},attrs:{href:"https://youtube.com/watch?v=XBZwyC2v48s",title:"BTCPay Server - Drupal Commerce 2.x quick walkthrough","data-id":"XBZwyC2v48s"}},[t("iframe",{attrs:{title:"BTCPay Server - Drupal Commerce 2.x quick walkthrough","data-src":"https://www.youtube-nocookie.com/embed/XBZwyC2v48s?&autoplay=1&autohide=1&modestbranding=1&color=white&rel=0",frameborder:"0",allow:"autoplay;encrypted-media;picture-in-picture",allowfullscreen:""}})]),e._v(" "),t("h3",{attrs:{id:"quick-walkthrough-steps"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#quick-walkthrough-steps"}},[e._v("#")]),e._v(" Quick walkthrough steps")]),e._v(" "),t("h4",{attrs:{id:"generate-pairing-code-on-btcpay-server"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#generate-pairing-code-on-btcpay-server"}},[e._v("#")]),e._v(" Generate pairing code on BTCPay server")]),e._v(" "),t("ol",[t("li",[e._v("BTCPay server: "),t("RouterLink",{attrs:{to:"/CreateStore/#creating-a-store-in-btcpay"}},[e._v("create and configure a store")])],1),e._v(" "),t("li",[e._v('in store settings go to "'),t("strong",[e._v("Access Tokens")]),e._v('"')]),e._v(" "),t("li",[e._v("click on "),t("strong",[e._v("[Create a new token]")])]),e._v(" "),t("li",[t("strong",[e._v("Label:")]),e._v(" enter some label (eg. my store)")]),e._v(" "),t("li",[t("strong",[e._v("Public key:")]),e._v(" this needs to be left "),t("strong",[e._v("empty")])]),e._v(" "),t("li",[t("strong",[e._v("Facade:")]),e._v(' "merchant"')]),e._v(" "),t("li",[e._v("click on "),t("strong",[e._v("[Request pairing]")])]),e._v(" "),t("li",[e._v("on next screen choose your configured store in "),t("strong",[e._v("Pair to")]),e._v(" select dropdown and click on "),t("strong",[e._v("[approve]")])]),e._v(" "),t("li",[e._v('note down the displayed 7-digit code at the top status message, e.g. "d7afaXr"\n(you will need that code below on gateway configuration, see below)')])]),e._v(" "),t("h4",{attrs:{id:"commerce-btcpay-installation-configuration"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#commerce-btcpay-installation-configuration"}},[e._v("#")]),e._v(" Commerce BTCPay: Installation + configuration")]),e._v(" "),t("ol",[t("li",[e._v("install module: "),t("code",[e._v("composer require drupal/commerce_btcpay")])]),e._v(" "),t("li",[e._v("enable the module: "),t("code",[e._v("drush en commerce_btcpay -y")])]),e._v(" "),t("li",[e._v("make sure you have configured "),t("a",{attrs:{href:"https://www.drupal.org/docs/8/core/modules/file/overview#content-accessing-private-files",target:"_blank",rel:"noopener noreferrer"}},[e._v("private file system"),t("OutboundLink")],1),e._v(" (needed to store encrypted public+private key)")]),e._v(" "),t("li",[e._v("Commerce BTCPay configuration ("),t("strong",[e._v("Commerce -> Configuration -> Payment -> Payment gateways")]),e._v("):")]),e._v(" "),t("li",[e._v('add payment method "BTCPay"\n'),t("ul",[t("li",[t("strong",[e._v("Mode")]),e._v(": Test or Live (you can configure both individually)")]),e._v(" "),t("li",[t("strong",[e._v("Test/Live server host")]),e._v(": enter your URL without https:// prefix e.g. btcpay.yourserver.com (note valid SSL certificate needed)")]),e._v(" "),t("li",[t("strong",[e._v("Test/Live Paring code")]),e._v(': enter the 7-digit pairing code from BTCPay "Access tokens" page')]),e._v(" "),t("li",[t("strong",[e._v("Save")]),e._v("\nYou should see a message that the tokens were successfully created.")])])])])])}),[],!1,null,null,null);t.default=o.exports}}]); \ No newline at end of file diff --git a/assets/js/136.015024c2.js b/assets/js/136.8a41c805.js similarity index 99% rename from assets/js/136.015024c2.js rename to assets/js/136.8a41c805.js index f686db2e6c..e5a5628056 100644 --- a/assets/js/136.015024c2.js +++ b/assets/js/136.8a41c805.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[136],{771:function(e,t,r){"use strict";r.r(t);var o=r(10),n=Object(o.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"electrum-personal-server-eps-integration"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#electrum-personal-server-eps-integration"}},[e._v("#")]),e._v(" Electrum Personal Server (EPS) integration")]),e._v(" "),t("p",[t("a",{attrs:{href:"https://github.com/chris-belcher/electrum-personal-server",target:"_blank",rel:"noopener noreferrer"}},[e._v("Electrum Personal Server or EPS"),t("OutboundLink")],1),e._v(" is a personal version of public Electrum servers like "),t("RouterLink",{attrs:{to:"/ElectrumX/"}},[e._v("ElectrumX")]),e._v(".")],1),e._v(" "),t("p",[t("strong",[e._v("EPS can be integrated into BTCPay Server")]),e._v(" using the optional docker fragment "),t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver-docker/blob/master/docker-compose-generator/docker-fragments/opt-add-electrum-ps.yml",target:"_blank",rel:"noopener noreferrer"}},[e._v("opt-add-electrum-ps.yml"),t("OutboundLink")],1),e._v(". Use EPS when you want to use your own full node (included in BTCPay Server) to verify your own transactions privately when using Electrum Wallet.")]),e._v(" "),t("p",[e._v("The biggest difference with public Electrum servers (eg. ElectrumX), is that "),t("strong",[e._v("EPS is for monitoring only your own wallet(s)")]),e._v('. The "XPUB" (extended public key) of the wallet you use in Electrum must be shared with EPS in order for it to function all all. Other than this, it functions (from an end user perspective) in the same way as ElectrumX etc. It is '),t("strong",[e._v("easy to integrate into BTCPay")]),e._v(" just follow the instructions below.")]),e._v(" "),t("p",[e._v("EPS does not require "),t("code",[e._v("txindex")]),e._v(" and works on a pruned node.")]),e._v(" "),t("h2",{attrs:{id:"about-tor-support"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#about-tor-support"}},[e._v("#")]),e._v(" About Tor support")]),e._v(" "),t("p",[e._v("By default your EPS is accessible over Tor. You can run the following command line via SSH on your server to get your Tor address:")]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token function"}},[e._v("cat")]),e._v(" /var/lib/docker/volumes/generated_tor_servicesdir/_data/btc-electrum-ps/hostname\n")])])]),t("p",[e._v("You can can also go to your BTCPay Server > Server Settings > Services and find the tor link in "),t("code",[e._v("Other TOR hidden services")]),e._v(".")]),e._v(" "),t("p",[e._v("On the Electrum wallet machine, if you want to connect to your server via Tor, we assume in this tutorial that you run the Tor Browser locally, and thus you will use SOCKS5 port "),t("code",[e._v("9150")]),e._v(". If you run Tor through the command line instead, the local SOCKS5 port is "),t("code",[e._v("9050")]),e._v(".")]),e._v(" "),t("h2",{attrs:{id:"how-to-enable-electrum-personal-server-eps-in-btcpay"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#how-to-enable-electrum-personal-server-eps-in-btcpay"}},[e._v("#")]),e._v(" How to enable Electrum Personal Server (EPS) in BTCPay:")]),e._v(" "),t("ol",[t("li",[t("p",[t("strong",[e._v("If you do not use Tor")]),e._v(", EPS is accessible for Electrum Wallets via TCP port 50002. You need to open this port up fully at least to be available within your own network to any PC or Android device running Electrum Wallet, and turn on port forwarding. If you use Tor, you can skip this step.")])]),e._v(" "),t("li",[t("p",[e._v('As EPS is for a single wallet (single user), you must specify the XPUB/YPUB/ZPUB of your wallet as an environment varable before you enable the EPS docker-fragment. In Electrum Wallet go to the "Wallet" menu then select "Information" to copy and paste yours. Set ENV variable for your wallet XPUB and enable the Docker Additional Fragment on your BTCPay node by running the following steps:')])])]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("export")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[e._v("BTCPAYGEN_ADDITIONAL_FRAGMENTS")]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"'),t("span",{pre:!0,attrs:{class:"token variable"}},[e._v("$BTCPAYGEN_ADDITIONAL_FRAGMENTS")]),e._v(';opt-add-electrum-ps"')]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("export")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[e._v("EPS_XPUB")]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"XPUB_ADD_YOUR_XPUB_YPUB_OR_ZPUB_HERE"')]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v(".")]),e._v(" btcpay-setup.sh "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-i")]),e._v("\n")])])]),t("ol",{attrs:{start:"3"}},[t("li",[e._v("WAIT for your Bitcoin full node and EPS server to fully sync:\nYou can check the status of bitcoin core sync by going to your domain for BTCPay server, and it will show you on the front page. Or, you can check from the command line as well, using these commands:\n"),t("code",[e._v("docker logs btcpayserver_bitcoind")]),e._v(" - this will show you the bitcoin core blockchain sync status (and ALL other info about your node, including any errors)\n"),t("code",[e._v("docker logs generated_electrum_ps_1")]),e._v(" - this will show you the EPS sync status. Note: EPS will NOT start syncing until bitcoin full node has finished syncing, you will see errors until that is finished and these can be ignored.")])]),e._v(" "),t("p",[e._v("Once all syncing for both bitcoin and EPS have finished synching, you can proceed to the next step. (Note: Electrum wallets will not connect to an EPS server that has not finished synching)")]),e._v(" "),t("h2",{attrs:{id:"how-to-connect-electrum-wallet-to-eps"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#how-to-connect-electrum-wallet-to-eps"}},[e._v("#")]),e._v(" How to connect Electrum Wallet to EPS")]),e._v(" "),t("p",[e._v("There are three ways to use your server from Electrum Wallet:")]),e._v(" "),t("ol",[t("li",[e._v("By editing the configuration file")]),e._v(" "),t("li",[e._v("By running Electrum by the command line")]),e._v(" "),t("li",[e._v("Via the user interface (not recommended, bad privacy)")])]),e._v(" "),t("h4",{attrs:{id:"option-1-connect-to-your-eps-server-by-directly-editing-electrum-wallet-config-file-before-even-opening-the-electrum-wallet-gui-recommended-for-full-privacy"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#option-1-connect-to-your-eps-server-by-directly-editing-electrum-wallet-config-file-before-even-opening-the-electrum-wallet-gui-recommended-for-full-privacy"}},[e._v("#")]),e._v(" Option 1: Connect to your EPS Server by directly editing Electrum Wallet config file (before even opening the Electrum wallet GUI - recommended for full privacy):")]),e._v(" "),t("p",[e._v("You can "),t("strong",[e._v("setup your Electrum server")]),e._v(" by editing the configuration file.")]),e._v(" "),t("p",[e._v("In the "),t("a",{attrs:{href:"https://electrum.readthedocs.io/en/latest/faq.html#where-is-my-wallet-file-located",target:"_blank",rel:"noopener noreferrer"}},[e._v("Electrum Wallet folder"),t("OutboundLink")],1),e._v(", open and edit the "),t("code",[e._v("config")]),e._v(" file like this:")]),e._v(" "),t("ol",[t("li",[t("p",[e._v("Find line: "),t("code",[e._v('"auto_connect": true,')]),e._v(" and switch it to: "),t("code",[e._v('"auto_connect": false,')]),e._v(" - this will prevent your Electrum Wallet from auto-connecting to other 3rd party Electrum Servers at launch time (to obtain block headers and transaction information).")])]),e._v(" "),t("li",[t("p",[e._v("Find line: "),t("code",[e._v('"oneserver": false,')]),e._v(" and switch it to: "),t("code",[e._v('"oneserver": true,')]),e._v(" - ensures that all data is obtained from just one server.")])]),e._v(" "),t("li",[t("p",[e._v("Find or add line: "),t("code",[e._v('"server": "yourserver:50002:s",')]),e._v("and switch it to your own EPS Server's IP address, in the example above this would be: "),t("code",[e._v('"server": "192.168.1.3:50002:s",')]),e._v("- hard code your IP address as the default upon opening the Wallet.")])])]),e._v(" "),t("p",[e._v("These 3 steps strongly recommended for full privacy by locking down Electrum Wallet to one single connection with your private server only ("),t("a",{attrs:{href:"https://github.com/chris-belcher/electrum-personal-server#how-to",target:"_blank",rel:"noopener noreferrer"}},[e._v("Reference"),t("OutboundLink")],1),e._v(").")]),e._v(" "),t("ol",{attrs:{start:"4"}},[t("li",[e._v("("),t("strong",[e._v("If you use Tor")]),e._v(") If you run Tor Browser, you can use it as SOCK5 proxy by adding "),t("code",[e._v('"proxy": "socks5:127.0.0.1:9150::",')]),e._v(" to the configuration file.")])]),e._v(" "),t("h4",{attrs:{id:"option-3-connect-to-your-eps-server-by-command-line"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#option-3-connect-to-your-eps-server-by-command-line"}},[e._v("#")]),e._v(" Option 3: Connect to your EPS Server by command line")]),e._v(" "),t("p",[e._v("You can run electrum via command line "),t("code",[e._v("electrum --oneserver --server yourserver:50002:s")]),e._v(".")]),e._v(" "),t("p",[e._v("If you use Tor, add "),t("code",[e._v("-p socks5:localhost:9150")]),e._v(".")]),e._v(" "),t("h4",{attrs:{id:"option-4-connect-to-your-eps-server-from-electrum-wallet-gui-not-recommended-as-this-will-momentarily-connects-with-other-random-public-electrum-servers-if-you-are-online"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#option-4-connect-to-your-eps-server-from-electrum-wallet-gui-not-recommended-as-this-will-momentarily-connects-with-other-random-public-electrum-servers-if-you-are-online"}},[e._v("#")]),e._v(" Option 4: Connect to your EPS Server from Electrum Wallet GUI (not recommended as this will momentarily connects with other random public Electrum servers if you are online):")]),e._v(" "),t("ol",[t("li",[e._v("Open Electrum Wallet. When you click the traffic light (green or red) at the bottom of your Electrum Wallet, you will see a screen with a list of all the available Electrum servers that your wallet can connect to, normally with the "),t("code",[e._v("Select Server Automatically")]),e._v(" box already checked:")])]),e._v(" "),t("figure",[t("img",{attrs:{src:"https://user-images.githubusercontent.com/1388507/68437521-8a5eb580-01c1-11ea-9ece-0666353a6742.png",alt:"ElectrumWalletServerList",title:"ElectrumWalletServerList"}})]),e._v(" "),t("ol",{attrs:{start:"2"}},[t("li",[e._v("Now is the time to UNCHECK that "),t("code",[e._v("Select Server Automatically")]),e._v(" setting, which will enable you to enter the IP address or domain or hostname of your EPS Server. In the case below, the EPS server is on the local network at "),t("code",[e._v("192.168.1.3")]),e._v(" so we enter that manually (leave port as 50002) and press "),t("code",[e._v("close")]),e._v(".")])]),e._v(" "),t("figure",[t("img",{attrs:{src:"https://user-images.githubusercontent.com/1388507/68496320-4e276580-0252-11ea-8caf-facc8a246d70.png",alt:"EnterElectrumServerIP",title:"EnterElectrumServerIP"}})]),e._v(" "),t("ol",{attrs:{start:"4"}},[t("li",[t("p",[e._v("("),t("strong",[e._v("If you use Tor")]),e._v(") Go to proxy, then click on "),t("code",[e._v("Use Tor Proxy at port 9150")]),e._v(".")])]),e._v(" "),t("li",[t("p",[e._v("If all of the above worked well, and your node is healthy and synched, you will get a green traffic light down the bottom right of the wallet screen - that means success!")])])]),e._v(" "),t("h3",{attrs:{id:"reflection-on-what-has-been-achieved"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#reflection-on-what-has-been-achieved"}},[e._v("#")]),e._v(" Reflection on what has been achieved:")]),e._v(" "),t("p",[e._v("You are now running your very "),t("strong",[e._v("own private EPS Server")]),e._v(". All Electrum Wallet related data transfer happens directly between your EPS Server and the bitcoin blockchain, without going over any other 3rd party servers. You have attained full bitcoin transaction privacy (at least from the perspective of your blockchain queries and transactions, payment/receive addresses etc - nobody except you and the blockchain can see what you are doing).")]),e._v(" "),t("h3",{attrs:{id:"troubleshooting"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#troubleshooting"}},[e._v("#")]),e._v(" Troubleshooting:")]),e._v(" "),t("p",[e._v("So there is one thing you may encounter, where even after you did everything correctly, you still get a red traffic light (which means not connected to any server) in the steps above. Any other troubleshooting tips that people encounter can be added, I would suggest to make a PR to this document directly.")]),e._v(" "),t("ul",[t("li",[e._v("If you get a red traffic light, shutdown Electrum Wallet completely, then go to your Electrum Wallet folder ("),t("a",{attrs:{href:"https://electrum.readthedocs.io/en/latest/faq.html#where-is-my-wallet-file-located",target:"_blank",rel:"noopener noreferrer"}},[e._v("see here"),t("OutboundLink")],1),e._v(" if you don't know where that is).")])]),e._v(" "),t("p",[e._v("Inside the Electrum Wallet folder (in this case below, it is what it looks like on a Mac) locate the "),t("code",[e._v("certs")]),e._v(" directory and delete the certificate for the server you are trying to connect to, in this case "),t("code",[e._v("192.168.1.3")]),e._v(", by dragging it to the Trash.")]),e._v(" "),t("figure",[t("img",{attrs:{src:"https://user-images.githubusercontent.com/1388507/68497330-9a73a500-0254-11ea-9349-71bdb3bd9511.png",alt:"Certs",title:"Certs"}})]),e._v(" "),t("p",[e._v("Start up Electrum Wallet again, and connect to your "),t("strong",[e._v("EPS server")]),e._v(". If it is fully synched, it will now likely show a green traffic light, and you are good to go.")])])}),[],!1,null,null,null);t.default=n.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[136],{770:function(e,t,r){"use strict";r.r(t);var o=r(10),n=Object(o.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"electrum-personal-server-eps-integration"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#electrum-personal-server-eps-integration"}},[e._v("#")]),e._v(" Electrum Personal Server (EPS) integration")]),e._v(" "),t("p",[t("a",{attrs:{href:"https://github.com/chris-belcher/electrum-personal-server",target:"_blank",rel:"noopener noreferrer"}},[e._v("Electrum Personal Server or EPS"),t("OutboundLink")],1),e._v(" is a personal version of public Electrum servers like "),t("RouterLink",{attrs:{to:"/ElectrumX/"}},[e._v("ElectrumX")]),e._v(".")],1),e._v(" "),t("p",[t("strong",[e._v("EPS can be integrated into BTCPay Server")]),e._v(" using the optional docker fragment "),t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver-docker/blob/master/docker-compose-generator/docker-fragments/opt-add-electrum-ps.yml",target:"_blank",rel:"noopener noreferrer"}},[e._v("opt-add-electrum-ps.yml"),t("OutboundLink")],1),e._v(". Use EPS when you want to use your own full node (included in BTCPay Server) to verify your own transactions privately when using Electrum Wallet.")]),e._v(" "),t("p",[e._v("The biggest difference with public Electrum servers (eg. ElectrumX), is that "),t("strong",[e._v("EPS is for monitoring only your own wallet(s)")]),e._v('. The "XPUB" (extended public key) of the wallet you use in Electrum must be shared with EPS in order for it to function all all. Other than this, it functions (from an end user perspective) in the same way as ElectrumX etc. It is '),t("strong",[e._v("easy to integrate into BTCPay")]),e._v(" just follow the instructions below.")]),e._v(" "),t("p",[e._v("EPS does not require "),t("code",[e._v("txindex")]),e._v(" and works on a pruned node.")]),e._v(" "),t("h2",{attrs:{id:"about-tor-support"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#about-tor-support"}},[e._v("#")]),e._v(" About Tor support")]),e._v(" "),t("p",[e._v("By default your EPS is accessible over Tor. You can run the following command line via SSH on your server to get your Tor address:")]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token function"}},[e._v("cat")]),e._v(" /var/lib/docker/volumes/generated_tor_servicesdir/_data/btc-electrum-ps/hostname\n")])])]),t("p",[e._v("You can can also go to your BTCPay Server > Server Settings > Services and find the tor link in "),t("code",[e._v("Other TOR hidden services")]),e._v(".")]),e._v(" "),t("p",[e._v("On the Electrum wallet machine, if you want to connect to your server via Tor, we assume in this tutorial that you run the Tor Browser locally, and thus you will use SOCKS5 port "),t("code",[e._v("9150")]),e._v(". If you run Tor through the command line instead, the local SOCKS5 port is "),t("code",[e._v("9050")]),e._v(".")]),e._v(" "),t("h2",{attrs:{id:"how-to-enable-electrum-personal-server-eps-in-btcpay"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#how-to-enable-electrum-personal-server-eps-in-btcpay"}},[e._v("#")]),e._v(" How to enable Electrum Personal Server (EPS) in BTCPay:")]),e._v(" "),t("ol",[t("li",[t("p",[t("strong",[e._v("If you do not use Tor")]),e._v(", EPS is accessible for Electrum Wallets via TCP port 50002. You need to open this port up fully at least to be available within your own network to any PC or Android device running Electrum Wallet, and turn on port forwarding. If you use Tor, you can skip this step.")])]),e._v(" "),t("li",[t("p",[e._v('As EPS is for a single wallet (single user), you must specify the XPUB/YPUB/ZPUB of your wallet as an environment varable before you enable the EPS docker-fragment. In Electrum Wallet go to the "Wallet" menu then select "Information" to copy and paste yours. Set ENV variable for your wallet XPUB and enable the Docker Additional Fragment on your BTCPay node by running the following steps:')])])]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("export")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[e._v("BTCPAYGEN_ADDITIONAL_FRAGMENTS")]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"'),t("span",{pre:!0,attrs:{class:"token variable"}},[e._v("$BTCPAYGEN_ADDITIONAL_FRAGMENTS")]),e._v(';opt-add-electrum-ps"')]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("export")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[e._v("EPS_XPUB")]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"XPUB_ADD_YOUR_XPUB_YPUB_OR_ZPUB_HERE"')]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v(".")]),e._v(" btcpay-setup.sh "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-i")]),e._v("\n")])])]),t("ol",{attrs:{start:"3"}},[t("li",[e._v("WAIT for your Bitcoin full node and EPS server to fully sync:\nYou can check the status of bitcoin core sync by going to your domain for BTCPay server, and it will show you on the front page. Or, you can check from the command line as well, using these commands:\n"),t("code",[e._v("docker logs btcpayserver_bitcoind")]),e._v(" - this will show you the bitcoin core blockchain sync status (and ALL other info about your node, including any errors)\n"),t("code",[e._v("docker logs generated_electrum_ps_1")]),e._v(" - this will show you the EPS sync status. Note: EPS will NOT start syncing until bitcoin full node has finished syncing, you will see errors until that is finished and these can be ignored.")])]),e._v(" "),t("p",[e._v("Once all syncing for both bitcoin and EPS have finished synching, you can proceed to the next step. (Note: Electrum wallets will not connect to an EPS server that has not finished synching)")]),e._v(" "),t("h2",{attrs:{id:"how-to-connect-electrum-wallet-to-eps"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#how-to-connect-electrum-wallet-to-eps"}},[e._v("#")]),e._v(" How to connect Electrum Wallet to EPS")]),e._v(" "),t("p",[e._v("There are three ways to use your server from Electrum Wallet:")]),e._v(" "),t("ol",[t("li",[e._v("By editing the configuration file")]),e._v(" "),t("li",[e._v("By running Electrum by the command line")]),e._v(" "),t("li",[e._v("Via the user interface (not recommended, bad privacy)")])]),e._v(" "),t("h4",{attrs:{id:"option-1-connect-to-your-eps-server-by-directly-editing-electrum-wallet-config-file-before-even-opening-the-electrum-wallet-gui-recommended-for-full-privacy"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#option-1-connect-to-your-eps-server-by-directly-editing-electrum-wallet-config-file-before-even-opening-the-electrum-wallet-gui-recommended-for-full-privacy"}},[e._v("#")]),e._v(" Option 1: Connect to your EPS Server by directly editing Electrum Wallet config file (before even opening the Electrum wallet GUI - recommended for full privacy):")]),e._v(" "),t("p",[e._v("You can "),t("strong",[e._v("setup your Electrum server")]),e._v(" by editing the configuration file.")]),e._v(" "),t("p",[e._v("In the "),t("a",{attrs:{href:"https://electrum.readthedocs.io/en/latest/faq.html#where-is-my-wallet-file-located",target:"_blank",rel:"noopener noreferrer"}},[e._v("Electrum Wallet folder"),t("OutboundLink")],1),e._v(", open and edit the "),t("code",[e._v("config")]),e._v(" file like this:")]),e._v(" "),t("ol",[t("li",[t("p",[e._v("Find line: "),t("code",[e._v('"auto_connect": true,')]),e._v(" and switch it to: "),t("code",[e._v('"auto_connect": false,')]),e._v(" - this will prevent your Electrum Wallet from auto-connecting to other 3rd party Electrum Servers at launch time (to obtain block headers and transaction information).")])]),e._v(" "),t("li",[t("p",[e._v("Find line: "),t("code",[e._v('"oneserver": false,')]),e._v(" and switch it to: "),t("code",[e._v('"oneserver": true,')]),e._v(" - ensures that all data is obtained from just one server.")])]),e._v(" "),t("li",[t("p",[e._v("Find or add line: "),t("code",[e._v('"server": "yourserver:50002:s",')]),e._v("and switch it to your own EPS Server's IP address, in the example above this would be: "),t("code",[e._v('"server": "192.168.1.3:50002:s",')]),e._v("- hard code your IP address as the default upon opening the Wallet.")])])]),e._v(" "),t("p",[e._v("These 3 steps strongly recommended for full privacy by locking down Electrum Wallet to one single connection with your private server only ("),t("a",{attrs:{href:"https://github.com/chris-belcher/electrum-personal-server#how-to",target:"_blank",rel:"noopener noreferrer"}},[e._v("Reference"),t("OutboundLink")],1),e._v(").")]),e._v(" "),t("ol",{attrs:{start:"4"}},[t("li",[e._v("("),t("strong",[e._v("If you use Tor")]),e._v(") If you run Tor Browser, you can use it as SOCK5 proxy by adding "),t("code",[e._v('"proxy": "socks5:127.0.0.1:9150::",')]),e._v(" to the configuration file.")])]),e._v(" "),t("h4",{attrs:{id:"option-3-connect-to-your-eps-server-by-command-line"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#option-3-connect-to-your-eps-server-by-command-line"}},[e._v("#")]),e._v(" Option 3: Connect to your EPS Server by command line")]),e._v(" "),t("p",[e._v("You can run electrum via command line "),t("code",[e._v("electrum --oneserver --server yourserver:50002:s")]),e._v(".")]),e._v(" "),t("p",[e._v("If you use Tor, add "),t("code",[e._v("-p socks5:localhost:9150")]),e._v(".")]),e._v(" "),t("h4",{attrs:{id:"option-4-connect-to-your-eps-server-from-electrum-wallet-gui-not-recommended-as-this-will-momentarily-connects-with-other-random-public-electrum-servers-if-you-are-online"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#option-4-connect-to-your-eps-server-from-electrum-wallet-gui-not-recommended-as-this-will-momentarily-connects-with-other-random-public-electrum-servers-if-you-are-online"}},[e._v("#")]),e._v(" Option 4: Connect to your EPS Server from Electrum Wallet GUI (not recommended as this will momentarily connects with other random public Electrum servers if you are online):")]),e._v(" "),t("ol",[t("li",[e._v("Open Electrum Wallet. When you click the traffic light (green or red) at the bottom of your Electrum Wallet, you will see a screen with a list of all the available Electrum servers that your wallet can connect to, normally with the "),t("code",[e._v("Select Server Automatically")]),e._v(" box already checked:")])]),e._v(" "),t("figure",[t("img",{attrs:{src:"https://user-images.githubusercontent.com/1388507/68437521-8a5eb580-01c1-11ea-9ece-0666353a6742.png",alt:"ElectrumWalletServerList",title:"ElectrumWalletServerList"}})]),e._v(" "),t("ol",{attrs:{start:"2"}},[t("li",[e._v("Now is the time to UNCHECK that "),t("code",[e._v("Select Server Automatically")]),e._v(" setting, which will enable you to enter the IP address or domain or hostname of your EPS Server. In the case below, the EPS server is on the local network at "),t("code",[e._v("192.168.1.3")]),e._v(" so we enter that manually (leave port as 50002) and press "),t("code",[e._v("close")]),e._v(".")])]),e._v(" "),t("figure",[t("img",{attrs:{src:"https://user-images.githubusercontent.com/1388507/68496320-4e276580-0252-11ea-8caf-facc8a246d70.png",alt:"EnterElectrumServerIP",title:"EnterElectrumServerIP"}})]),e._v(" "),t("ol",{attrs:{start:"4"}},[t("li",[t("p",[e._v("("),t("strong",[e._v("If you use Tor")]),e._v(") Go to proxy, then click on "),t("code",[e._v("Use Tor Proxy at port 9150")]),e._v(".")])]),e._v(" "),t("li",[t("p",[e._v("If all of the above worked well, and your node is healthy and synched, you will get a green traffic light down the bottom right of the wallet screen - that means success!")])])]),e._v(" "),t("h3",{attrs:{id:"reflection-on-what-has-been-achieved"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#reflection-on-what-has-been-achieved"}},[e._v("#")]),e._v(" Reflection on what has been achieved:")]),e._v(" "),t("p",[e._v("You are now running your very "),t("strong",[e._v("own private EPS Server")]),e._v(". All Electrum Wallet related data transfer happens directly between your EPS Server and the bitcoin blockchain, without going over any other 3rd party servers. You have attained full bitcoin transaction privacy (at least from the perspective of your blockchain queries and transactions, payment/receive addresses etc - nobody except you and the blockchain can see what you are doing).")]),e._v(" "),t("h3",{attrs:{id:"troubleshooting"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#troubleshooting"}},[e._v("#")]),e._v(" Troubleshooting:")]),e._v(" "),t("p",[e._v("So there is one thing you may encounter, where even after you did everything correctly, you still get a red traffic light (which means not connected to any server) in the steps above. Any other troubleshooting tips that people encounter can be added, I would suggest to make a PR to this document directly.")]),e._v(" "),t("ul",[t("li",[e._v("If you get a red traffic light, shutdown Electrum Wallet completely, then go to your Electrum Wallet folder ("),t("a",{attrs:{href:"https://electrum.readthedocs.io/en/latest/faq.html#where-is-my-wallet-file-located",target:"_blank",rel:"noopener noreferrer"}},[e._v("see here"),t("OutboundLink")],1),e._v(" if you don't know where that is).")])]),e._v(" "),t("p",[e._v("Inside the Electrum Wallet folder (in this case below, it is what it looks like on a Mac) locate the "),t("code",[e._v("certs")]),e._v(" directory and delete the certificate for the server you are trying to connect to, in this case "),t("code",[e._v("192.168.1.3")]),e._v(", by dragging it to the Trash.")]),e._v(" "),t("figure",[t("img",{attrs:{src:"https://user-images.githubusercontent.com/1388507/68497330-9a73a500-0254-11ea-9349-71bdb3bd9511.png",alt:"Certs",title:"Certs"}})]),e._v(" "),t("p",[e._v("Start up Electrum Wallet again, and connect to your "),t("strong",[e._v("EPS server")]),e._v(". If it is fully synched, it will now likely show a green traffic light, and you are good to go.")])])}),[],!1,null,null,null);t.default=n.exports}}]); \ No newline at end of file diff --git a/assets/js/137.b5f985d5.js b/assets/js/137.b23c41ce.js similarity index 99% rename from assets/js/137.b5f985d5.js rename to assets/js/137.b23c41ce.js index 7bfd86fea2..a0239dcbdb 100644 --- a/assets/js/137.b5f985d5.js +++ b/assets/js/137.b23c41ce.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[137],{772:function(e,t,r){"use strict";r.r(t);var a=r(10),o=Object(a.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"electrumx"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#electrumx"}},[e._v("#")]),e._v(" ElectrumX")]),e._v(" "),t("p",[e._v("This document explains how to "),t("strong",[e._v("connect Electrum Wallet to an ElectrumX Server")]),e._v(".")]),e._v(" "),t("p",[t("strong",[e._v("Note:")]),e._v(" the "),t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver-docker",target:"_blank",rel:"noopener noreferrer"}},[e._v("docker version of BTCPay Server"),t("OutboundLink")],1),e._v(" (since Nov 7th 2019, version 1.0.3.137) supports full integration with "),t("a",{attrs:{href:"https://electrumx.readthedocs.io/en/latest/features.html",target:"_blank",rel:"noopener noreferrer"}},[e._v("ElectrumX"),t("OutboundLink")],1),e._v(" is the most widely implemented software used for Electrum public servers that your local Electrum wallet relies upon to get all the details of, or broadcast transactions to the bitcoin blockchain. Skip to Section 2 below, to read more on what this all means, and how to set it up on your BTCPay stack.")]),e._v(" "),t("h2",{attrs:{id:"how-to-integrate-electrumx-into-your-btcpay-server-and-connect-your-electrum-wallet-to-it-for-your-complete-privacy"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#how-to-integrate-electrumx-into-your-btcpay-server-and-connect-your-electrum-wallet-to-it-for-your-complete-privacy"}},[e._v("#")]),e._v(" How to integrate ElectrumX into your BTCPay Server and connect your Electrum Wallet to it for your complete privacy")]),e._v(" "),t("h3",{attrs:{id:"only-available-in-btcpay-docker-version"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#only-available-in-btcpay-docker-version"}},[e._v("#")]),e._v(" (only available in BTCPay docker version)")]),e._v(" "),t("p",[e._v("Before we proceed, it is important to understand how your Electrum wallet on your PC/Mac functions so well/fast, without having its own bitcoin full node. In actual fact, Electrum Wallet relies on a community effort to maintain a bunch of servers all around the world with a bitcoin full node that do this job for you! They are called Electrum Servers, and you can be a part of that community to make that network even stronger, lets see how.")]),e._v(" "),t("p",[e._v("When you click the little traffic light at the bottom of your Electrum Wallet here:")]),e._v(" "),t("figure",[t("img",{attrs:{src:"https://user-images.githubusercontent.com/1388507/68437133-5636c500-01c0-11ea-822c-6e72bd6d60ea.png",alt:"ElectrumWalletMainScreenLight",title:"ElectrumWalletMainScreenLight"}})]),e._v(" "),t("p",[e._v('You will see this screen with a list of all the available Electrum servers that your wallet can connect to, normally with "Select Server Automatically" already checked:')]),e._v(" "),t("figure",[t("img",{attrs:{src:"https://user-images.githubusercontent.com/1388507/68437521-8a5eb580-01c1-11ea-9ece-0666353a6742.png",alt:"ElectrumWalletServerList",title:"ElectrumWalletServerList"}})]),e._v(" "),t("p",[e._v('While using Electrum Wallet with "Select Server Automatically" on is the easiest, every transaction that you make/browse/broadcast in your Electrum Wallet will be done via someone else\'s server - this is a privacy risk, that will be mitigated by setting up and using your own ElectrumX Server.')]),e._v(" "),t("h2",{attrs:{id:"section-21-enable-your-own-electrumx-server-fully-integrated-with-your-btcpay-servers-full-bitcoin-node"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#section-21-enable-your-own-electrumx-server-fully-integrated-with-your-btcpay-servers-full-bitcoin-node"}},[e._v("#")]),e._v(" Section 2.1 Enable Your Own ElectrumX Server (fully integrated with your BTCPay Server's full bitcoin node)")]),e._v(" "),t("h3",{attrs:{id:"prerequisites-mandatory"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#prerequisites-mandatory"}},[e._v("#")]),e._v(" Prerequisites (mandatory):")]),e._v(" "),t("ol",[t("li",[e._v("Docker only: Only the "),t("RouterLink",{attrs:{to:"/Docker/"}},[e._v("Docker version of BTCPay Server")]),e._v(" is supported.")],1),e._v(" "),t("li",[e._v("Unpruned BTCPay node: Make sure your BTCPay implementation is NOT "),t("RouterLink",{attrs:{to:"/FAQ/Synchronization/#can-i-skip-the-synchronization"}},[e._v("pruned")]),e._v(" (i.e. you have synched and stored from genesis block. Check that you do NOT use the opt-save-storage "),t("RouterLink",{attrs:{to:"/Docker/#generated-docker-compose"}},[e._v("Environment Variable")]),e._v(")")],1),e._v(" "),t("li",[e._v("Drive space: At least 400GB of drive space on the device where your docker volumes are stored is required (as at the writing of this documentation on 9th Nov 2019, the total hard drive space used is 333GB - with full node and ElectrumX enabled - and of course this will grow further over time).")]),e._v(" "),t("li",[e._v("Additional Fragments: You are familiar with how to use BTCPay's "),t("RouterLink",{attrs:{to:"/Docker/#environment-variables"}},[e._v("Additional Fragment")]),e._v(" feature as part of your environment variable setup.")],1),e._v(" "),t("li",[e._v("Server architecture: The (official) "),t("a",{attrs:{href:"https://github.com/lukechilds/docker-electrumx",target:"_blank",rel:"noopener noreferrer"}},[e._v("ElectrumX docker"),t("OutboundLink")],1),e._v(" used here is only tested on a BTCPay Server running on x86_64 architecture. So far it is tested extensively on Ubuntu 18.04 and Debian Buster. Unless it is overhauled and tested well on Raspberry Pi (and other architectures) it likely will not work.")]),e._v(" "),t("li",[e._v("Basic Linux command line knowledge: is assumed.")])]),e._v(" "),t("h3",{attrs:{id:"how-will-enabling-electrumx-server-affect-an-existing-btcpay-implementation"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#how-will-enabling-electrumx-server-affect-an-existing-btcpay-implementation"}},[e._v("#")]),e._v(" How will enabling ElectrumX Server affect an existing BTCPay implementation?:")]),e._v(" "),t("p",[e._v("Fundamentally, setting up ElectrumX in BTCPay server is simple, and will not affect the rest of your implementation. The only pre-requisites are as above. The "),t("a",{attrs:{href:"https://github.com/lukechilds/docker-electrumx",target:"_blank",rel:"noopener noreferrer"}},[e._v("ElectrumX official docker release"),t("OutboundLink")],1),e._v(" is enabled in BTCPay by activating the "),t("RouterLink",{attrs:{to:"/Docker/#generated-docker-compose"}},[e._v("additional fragment")]),e._v(" called "),t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver-docker/blob/master/docker-compose-generator/docker-fragments/opt-add-electrumx.yml",target:"_blank",rel:"noopener noreferrer"}},[t("code",[e._v("opt-add-electumx")]),t("OutboundLink")],1),e._v(". This fragment will not only enable and start the ElectrumX server, it will also enable "),t("code",[e._v("txindex=1")]),e._v(" in your bitcoin full node. "),t("code",[e._v("txindex=1")]),e._v(" (Transaction Index=ON) is a bitcoin core feature required for ElectrumX to be able to serve your Electrum Wallet detailed transaction data for any transaction, directly from the blockchain, without getting it from any third party server.")],1),e._v(" "),t("p",[e._v("If you have been running your BTCPay Server for a while but haven't had "),t("code",[e._v("txindex=1")]),e._v(" set until now, then it might take a few hours to build the index, this is no issue and it should not involve downtime of more than a few hours - better to set this to run overnight though when nobody will be using your node. Note: If you want to rebuild the index from scratch, launch bitcoind once with the "),t("code",[e._v("reindex=1")]),e._v(" option (warning: this reindex option may take a VERY long time, and is not enabled out of the box as you likely dont need it, and hence is not in scope of this document).")]),e._v(" "),t("h3",{attrs:{id:"steps-to-enable-electrumx-server-in-btcpay"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#steps-to-enable-electrumx-server-in-btcpay"}},[e._v("#")]),e._v(" Steps to enable ElectrumX Server in BTCPay:")]),e._v(" "),t("p",[e._v("Here are all the steps to "),t("strong",[e._v("enable ElectrumX Server in your BTCPay node")]),e._v(' (read carefully as you may need to adjust for your specific setup, especially if you use other custom or conflicting "fragments" (pruning, less-memory etc. To reiterate, you should NOT proceed further here if you run a pruned BTCPay node.')]),e._v(" "),t("ol",[t("li",[t("p",[e._v("ElectrumX Server is accessible for Electrum Wallets via TCP port 50002. You need to open this port up fully at least to be available within your own network to any PC or Android device running Electrum Wallet, and turn on port forwarding (you can also port forward 50002 from your Internet/WAN, to enable other Electrum Wallet users from the Internet to query your server).")])]),e._v(" "),t("li",[t("p",[e._v("Enable the Docker Additional Fragment on your BTCPay node by running the following commands (this is assuming a brand new BTCPay installation with LND and ElectrumX, please tweak accordingly using the "),t("RouterLink",{attrs:{to:"/Docker/#generated-docker-compose"}},[e._v("relevant documentation")]),e._v(":")],1)]),e._v(" "),t("li",[t("p",[e._v("Follow the "),t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver-docker#full-installation-for-technical-users",target:"_blank",rel:"noopener noreferrer"}},[e._v("normal setup and install of BTCPay Server"),t("OutboundLink")],1),e._v(", then after this command "),t("code",[e._v("cd btcpayserver-docker")]),e._v(", follow the below instructions instead of those in the link. If you already have a BTCPay Server running, then just follow from the next step.")])]),e._v(" "),t("li",[t("p",[e._v("Set your environment variables:")])])]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("export")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[e._v("BTCPAY_HOST")]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"YOURHOST.com"')]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("export")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[e._v("NBITCOIN_NETWORK")]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"mainnet"')]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("export")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[e._v("BTCPAYGEN_CRYPTO1")]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"btc"')]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("export")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[e._v("BTCPAYGEN_REVERSEPROXY")]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"nginx"')]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("export")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[e._v("BTCPAYGEN_LIGHTNING")]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"lnd"')]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("export")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[e._v("LIGHTNING_ALIAS")]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"MY_LN"')]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("export")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[e._v("LETSENCRYPT_EMAIL")]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"you@example.com"')]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("export")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[e._v("BTCPAYGEN_ADDITIONAL_FRAGMENTS")]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"opt-add-electrumx;opt-more-memory"')]),e._v("\n")])])]),t("p",[e._v("You can run all of that as one command after you tweak it to your needs. The main part for our purposes in this guide of course is "),t("code",[e._v('BTCPAYGEN_ADDITIONAL_FRAGMENTS="opt-add-electrumx"')]),e._v(". Note: "),t("code",[e._v("opt-more-memory")]),e._v(" can be removed if you like, but I really recommend it if your system has more than 1GB of RAM/memory that you can assign to BTCPay server, it will speed synching your node and the general performance of ElectrumX up drastically.")]),e._v(" "),t("ol",{attrs:{start:"5"}},[t("li",[t("p",[e._v("Set up or reconfigure BTCPay Server with ElectrumX:")]),e._v(" "),t("p",[t("code",[e._v("cd ~/BTCPayServer/btcpayserver-docker && . ./btcpay-setup.sh -i")])]),e._v(" "),t("p",[e._v('This will setup (or re-setup) your server with everything needed including ElectrumX, and it all should "just work". But, it will trigger at least a couple of hours of syncing the '),t("code",[e._v("txindex")]),e._v(", and if it is a new server, could be a couple of days depending on your hardware.")])]),e._v(" "),t("li",[t("p",[e._v("WAIT for your node to fully sync:\nYou can check the status of bitcoin core sync by going to your domain for BTCPay server, and it will show you on the front page. Or, you can check from the command line as well, using these commands:")]),e._v(" "),t("p",[t("code",[e._v("docker logs btcpayserver_bitcoind")]),e._v(" - this will show you the bitcoin core blockchain sync status (and ALL other info about your node, including any errors)")]),e._v(" "),t("p",[t("code",[e._v("docker logs generated_electrumx_1")]),e._v(" - this will show you the ElectrumX sync status. Note: ElectrumX will NOT start syncing until bitcoin full node has finished syncing, you will see errors until that is finished and these can be ignored.")])])]),e._v(" "),t("p",[e._v("Once all syncing for both bitcoin and ElectrumX has finished you can proceed to the next step. (Note: Electrum wallets will not connect to an Electrum server that has not finished synching)")]),e._v(" "),t("h2",{attrs:{id:"section-22-connect-your-electrum-wallet-desktop-or-android-to-your-electrumx-server"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#section-22-connect-your-electrum-wallet-desktop-or-android-to-your-electrumx-server"}},[e._v("#")]),e._v(" Section 2.2 Connect your Electrum Wallet (Desktop or Android) to your ElectrumX Server")]),e._v(" "),t("h3",{attrs:{id:"connect-to-electrumx-from-electrum-wallet-on-your-macpclinux-machine"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#connect-to-electrumx-from-electrum-wallet-on-your-macpclinux-machine"}},[e._v("#")]),e._v(" Connect to ElectrumX from Electrum Wallet on your Mac/PC/Linux Machine:")]),e._v(" "),t("p",[e._v('Read all of this first before proceeding. You may wish to do just the "Protip" below instead of the manual steps in the Electrum Wallet GUI.')]),e._v(" "),t("p",[e._v("Open Electrum Wallet. When you click the traffic light at the bottom of your Electrum Wallet:")]),e._v(" "),t("figure",[t("img",{attrs:{src:"https://user-images.githubusercontent.com/1388507/68437133-5636c500-01c0-11ea-822c-6e72bd6d60ea.png",alt:"ElectrumWalletMainScreenLight",title:"ElectrumWalletMainScreenLight"}})]),e._v(" "),t("p",[e._v("You will see this screen with a list of all the available Electrum servers that your wallet can connect to, normally with "),t("code",[e._v("Select Server Automatically")]),e._v(" already checked:")]),e._v(" "),t("figure",[t("img",{attrs:{src:"https://user-images.githubusercontent.com/1388507/68437521-8a5eb580-01c1-11ea-9ece-0666353a6742.png",alt:"ElectrumWalletServerList",title:"ElectrumWalletServerList"}})]),e._v(" "),t("p",[e._v("Now is the time to UNCHECK that "),t("code",[e._v("Select Server Automatically")]),e._v(" setting, which will enable you to enter the IP address or domain or hostname of your ElectrumX Server. In the case below, the ElectrumX server is on the local network at "),t("code",[e._v("192.168.1.3")]),e._v(" so we enter that manually (leave port as 50002) and press "),t("code",[e._v("close")]),e._v(".")]),e._v(" "),t("figure",[t("img",{attrs:{src:"https://user-images.githubusercontent.com/1388507/68496320-4e276580-0252-11ea-8caf-facc8a246d70.png",alt:"EnterElectrumXServerIP",title:"EnterElectrumXServerIP"}})]),e._v(" "),t("p",[e._v("If all of the above worked well, and your node is healthy, you will get a green traffic light down the bottom right of the wallet interface as pictured here - that means success!:")]),e._v(" "),t("figure",[t("img",{attrs:{src:"https://user-images.githubusercontent.com/1388507/68437133-5636c500-01c0-11ea-822c-6e72bd6d60ea.png",alt:"ElectrumWalletMainScreenLight",title:"ElectrumWalletMainScreenLight"}})]),e._v(" "),t("h4",{attrs:{id:"protip-optionally-perform-the-above-steps-directly-in-electrum-wallet-config-file-before-even-opening-the-wallet-gui"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#protip-optionally-perform-the-above-steps-directly-in-electrum-wallet-config-file-before-even-opening-the-wallet-gui"}},[e._v("#")]),e._v(" Protip - optionally perform the above steps directly in Electrum Wallet config file before even opening the wallet GUI:")]),e._v(" "),t("p",[e._v("If you prefer to avoid connecting to other servers from the outset when you open Electrum Wallet, do the following before you open Electrum Wallet GUI.")]),e._v(" "),t("p",[e._v("In the Electrum Wallet folder ("),t("a",{attrs:{href:"https://electrum.readthedocs.io/en/latest/faq.html#where-is-my-wallet-file-located",target:"_blank",rel:"noopener noreferrer"}},[e._v("see here"),t("OutboundLink")],1),e._v(" if you don't know where that is), open and edit the "),t("code",[e._v("config")]),e._v(" file like this:")]),e._v(" "),t("ol",[t("li",[t("p",[e._v("Find line: "),t("code",[e._v('"auto_connect": true,')]),e._v(" and switch it to: "),t("code",[e._v('"auto_connect": false,')]),e._v(" - this will prevent your Electrum Wallet from auto-connecting to other 3rd party Electrum Servers at launch time (to obtain block headers and transaction information).")])]),e._v(" "),t("li",[t("p",[e._v("Find line: "),t("code",[e._v('"oneserver": false,')]),e._v(" and switch it to: "),t("code",[e._v('"oneserver": true,')]),e._v(" - ensures that all data is obtained from just one server.")])]),e._v(" "),t("li",[t("p",[e._v("Find or add line: "),t("code",[e._v('"server": "SOMEIPADDRESS:50002:s",')]),e._v("and switch it to your own ElectrumX Server's IP address, in the example above this would be: "),t("code",[e._v('"server": "192.168.1.3:50002:s",')]),e._v("- hard code your IP address as the default upon opening the Wallet.")])])]),e._v(" "),t("p",[e._v("These 3 steps optional but recommended for full privacy by locking down Electrum Wallet to one single connection with your private server ("),t("a",{attrs:{href:"https://github.com/chris-belcher/electrum-personal-server#how-to",target:"_blank",rel:"noopener noreferrer"}},[e._v("Reference"),t("OutboundLink")],1),e._v(").")]),e._v(" "),t("h3",{attrs:{id:"reflection-on-what-has-been-achieved"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#reflection-on-what-has-been-achieved"}},[e._v("#")]),e._v(" Reflection on what has been achieved:")]),e._v(" "),t("p",[e._v("You are now running your very "),t("strong",[e._v("own private ElectrumX Server")]),e._v(". All Electrum Wallet related data transfer happens directly between your ElectrumX Server and the bitcoin blockchain, without going over any other 3rd party servers. You have attained full bitcoin transaction privacy (at least from the perspective of your blockchain queries and transactions, payment/receive addresses etc - nobody except you and the blockchain can see what you are doing).")]),e._v(" "),t("h3",{attrs:{id:"troubleshooting"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#troubleshooting"}},[e._v("#")]),e._v(" Troubleshooting:")]),e._v(" "),t("p",[e._v("So there is one thing you may encounter, where even after you did everything correctly, you still get a red traffic light (which means not connected to any server) in the steps above. Any other troubleshooting tips that people encounter can be added, I would suggest to make a PR to this document directly.")]),e._v(" "),t("ul",[t("li",[e._v("If you get a red traffic light, shutdown Electrum Wallet completely, then go to your Electrum Wallet folder ("),t("a",{attrs:{href:"https://electrum.readthedocs.io/en/latest/faq.html#where-is-my-wallet-file-located",target:"_blank",rel:"noopener noreferrer"}},[e._v("see here"),t("OutboundLink")],1),e._v(" if you don't know where that is).")])]),e._v(" "),t("p",[e._v("Inside the Electrum Wallet folder (in this case below, it is what it looks like on a Mac) locate the "),t("code",[e._v("certs")]),e._v(" directory and delete the certificate for the server you are trying to connect to, in this case "),t("code",[e._v("192.168.1.3")]),e._v(", by dragging it to the Trash.")]),e._v(" "),t("figure",[t("img",{attrs:{src:"https://user-images.githubusercontent.com/1388507/68497330-9a73a500-0254-11ea-9349-71bdb3bd9511.png",alt:"Certs",title:"Certs"}})]),e._v(" "),t("p",[e._v("Start up Electrum Wallet again, and connect to your ElectrumX server. If it is fully synched, it will now likely show a green traffic light, and you are good to go.")])])}),[],!1,null,null,null);t.default=o.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[137],{771:function(e,t,r){"use strict";r.r(t);var a=r(10),o=Object(a.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"electrumx"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#electrumx"}},[e._v("#")]),e._v(" ElectrumX")]),e._v(" "),t("p",[e._v("This document explains how to "),t("strong",[e._v("connect Electrum Wallet to an ElectrumX Server")]),e._v(".")]),e._v(" "),t("p",[t("strong",[e._v("Note:")]),e._v(" the "),t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver-docker",target:"_blank",rel:"noopener noreferrer"}},[e._v("docker version of BTCPay Server"),t("OutboundLink")],1),e._v(" (since Nov 7th 2019, version 1.0.3.137) supports full integration with "),t("a",{attrs:{href:"https://electrumx.readthedocs.io/en/latest/features.html",target:"_blank",rel:"noopener noreferrer"}},[e._v("ElectrumX"),t("OutboundLink")],1),e._v(" is the most widely implemented software used for Electrum public servers that your local Electrum wallet relies upon to get all the details of, or broadcast transactions to the bitcoin blockchain. Skip to Section 2 below, to read more on what this all means, and how to set it up on your BTCPay stack.")]),e._v(" "),t("h2",{attrs:{id:"how-to-integrate-electrumx-into-your-btcpay-server-and-connect-your-electrum-wallet-to-it-for-your-complete-privacy"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#how-to-integrate-electrumx-into-your-btcpay-server-and-connect-your-electrum-wallet-to-it-for-your-complete-privacy"}},[e._v("#")]),e._v(" How to integrate ElectrumX into your BTCPay Server and connect your Electrum Wallet to it for your complete privacy")]),e._v(" "),t("h3",{attrs:{id:"only-available-in-btcpay-docker-version"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#only-available-in-btcpay-docker-version"}},[e._v("#")]),e._v(" (only available in BTCPay docker version)")]),e._v(" "),t("p",[e._v("Before we proceed, it is important to understand how your Electrum wallet on your PC/Mac functions so well/fast, without having its own bitcoin full node. In actual fact, Electrum Wallet relies on a community effort to maintain a bunch of servers all around the world with a bitcoin full node that do this job for you! They are called Electrum Servers, and you can be a part of that community to make that network even stronger, lets see how.")]),e._v(" "),t("p",[e._v("When you click the little traffic light at the bottom of your Electrum Wallet here:")]),e._v(" "),t("figure",[t("img",{attrs:{src:"https://user-images.githubusercontent.com/1388507/68437133-5636c500-01c0-11ea-822c-6e72bd6d60ea.png",alt:"ElectrumWalletMainScreenLight",title:"ElectrumWalletMainScreenLight"}})]),e._v(" "),t("p",[e._v('You will see this screen with a list of all the available Electrum servers that your wallet can connect to, normally with "Select Server Automatically" already checked:')]),e._v(" "),t("figure",[t("img",{attrs:{src:"https://user-images.githubusercontent.com/1388507/68437521-8a5eb580-01c1-11ea-9ece-0666353a6742.png",alt:"ElectrumWalletServerList",title:"ElectrumWalletServerList"}})]),e._v(" "),t("p",[e._v('While using Electrum Wallet with "Select Server Automatically" on is the easiest, every transaction that you make/browse/broadcast in your Electrum Wallet will be done via someone else\'s server - this is a privacy risk, that will be mitigated by setting up and using your own ElectrumX Server.')]),e._v(" "),t("h2",{attrs:{id:"section-21-enable-your-own-electrumx-server-fully-integrated-with-your-btcpay-servers-full-bitcoin-node"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#section-21-enable-your-own-electrumx-server-fully-integrated-with-your-btcpay-servers-full-bitcoin-node"}},[e._v("#")]),e._v(" Section 2.1 Enable Your Own ElectrumX Server (fully integrated with your BTCPay Server's full bitcoin node)")]),e._v(" "),t("h3",{attrs:{id:"prerequisites-mandatory"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#prerequisites-mandatory"}},[e._v("#")]),e._v(" Prerequisites (mandatory):")]),e._v(" "),t("ol",[t("li",[e._v("Docker only: Only the "),t("RouterLink",{attrs:{to:"/Docker/"}},[e._v("Docker version of BTCPay Server")]),e._v(" is supported.")],1),e._v(" "),t("li",[e._v("Unpruned BTCPay node: Make sure your BTCPay implementation is NOT "),t("RouterLink",{attrs:{to:"/FAQ/Synchronization/#can-i-skip-the-synchronization"}},[e._v("pruned")]),e._v(" (i.e. you have synched and stored from genesis block. Check that you do NOT use the opt-save-storage "),t("RouterLink",{attrs:{to:"/Docker/#generated-docker-compose"}},[e._v("Environment Variable")]),e._v(")")],1),e._v(" "),t("li",[e._v("Drive space: At least 400GB of drive space on the device where your docker volumes are stored is required (as at the writing of this documentation on 9th Nov 2019, the total hard drive space used is 333GB - with full node and ElectrumX enabled - and of course this will grow further over time).")]),e._v(" "),t("li",[e._v("Additional Fragments: You are familiar with how to use BTCPay's "),t("RouterLink",{attrs:{to:"/Docker/#environment-variables"}},[e._v("Additional Fragment")]),e._v(" feature as part of your environment variable setup.")],1),e._v(" "),t("li",[e._v("Server architecture: The (official) "),t("a",{attrs:{href:"https://github.com/lukechilds/docker-electrumx",target:"_blank",rel:"noopener noreferrer"}},[e._v("ElectrumX docker"),t("OutboundLink")],1),e._v(" used here is only tested on a BTCPay Server running on x86_64 architecture. So far it is tested extensively on Ubuntu 18.04 and Debian Buster. Unless it is overhauled and tested well on Raspberry Pi (and other architectures) it likely will not work.")]),e._v(" "),t("li",[e._v("Basic Linux command line knowledge: is assumed.")])]),e._v(" "),t("h3",{attrs:{id:"how-will-enabling-electrumx-server-affect-an-existing-btcpay-implementation"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#how-will-enabling-electrumx-server-affect-an-existing-btcpay-implementation"}},[e._v("#")]),e._v(" How will enabling ElectrumX Server affect an existing BTCPay implementation?:")]),e._v(" "),t("p",[e._v("Fundamentally, setting up ElectrumX in BTCPay server is simple, and will not affect the rest of your implementation. The only pre-requisites are as above. The "),t("a",{attrs:{href:"https://github.com/lukechilds/docker-electrumx",target:"_blank",rel:"noopener noreferrer"}},[e._v("ElectrumX official docker release"),t("OutboundLink")],1),e._v(" is enabled in BTCPay by activating the "),t("RouterLink",{attrs:{to:"/Docker/#generated-docker-compose"}},[e._v("additional fragment")]),e._v(" called "),t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver-docker/blob/master/docker-compose-generator/docker-fragments/opt-add-electrumx.yml",target:"_blank",rel:"noopener noreferrer"}},[t("code",[e._v("opt-add-electumx")]),t("OutboundLink")],1),e._v(". This fragment will not only enable and start the ElectrumX server, it will also enable "),t("code",[e._v("txindex=1")]),e._v(" in your bitcoin full node. "),t("code",[e._v("txindex=1")]),e._v(" (Transaction Index=ON) is a bitcoin core feature required for ElectrumX to be able to serve your Electrum Wallet detailed transaction data for any transaction, directly from the blockchain, without getting it from any third party server.")],1),e._v(" "),t("p",[e._v("If you have been running your BTCPay Server for a while but haven't had "),t("code",[e._v("txindex=1")]),e._v(" set until now, then it might take a few hours to build the index, this is no issue and it should not involve downtime of more than a few hours - better to set this to run overnight though when nobody will be using your node. Note: If you want to rebuild the index from scratch, launch bitcoind once with the "),t("code",[e._v("reindex=1")]),e._v(" option (warning: this reindex option may take a VERY long time, and is not enabled out of the box as you likely dont need it, and hence is not in scope of this document).")]),e._v(" "),t("h3",{attrs:{id:"steps-to-enable-electrumx-server-in-btcpay"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#steps-to-enable-electrumx-server-in-btcpay"}},[e._v("#")]),e._v(" Steps to enable ElectrumX Server in BTCPay:")]),e._v(" "),t("p",[e._v("Here are all the steps to "),t("strong",[e._v("enable ElectrumX Server in your BTCPay node")]),e._v(' (read carefully as you may need to adjust for your specific setup, especially if you use other custom or conflicting "fragments" (pruning, less-memory etc. To reiterate, you should NOT proceed further here if you run a pruned BTCPay node.')]),e._v(" "),t("ol",[t("li",[t("p",[e._v("ElectrumX Server is accessible for Electrum Wallets via TCP port 50002. You need to open this port up fully at least to be available within your own network to any PC or Android device running Electrum Wallet, and turn on port forwarding (you can also port forward 50002 from your Internet/WAN, to enable other Electrum Wallet users from the Internet to query your server).")])]),e._v(" "),t("li",[t("p",[e._v("Enable the Docker Additional Fragment on your BTCPay node by running the following commands (this is assuming a brand new BTCPay installation with LND and ElectrumX, please tweak accordingly using the "),t("RouterLink",{attrs:{to:"/Docker/#generated-docker-compose"}},[e._v("relevant documentation")]),e._v(":")],1)]),e._v(" "),t("li",[t("p",[e._v("Follow the "),t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver-docker#full-installation-for-technical-users",target:"_blank",rel:"noopener noreferrer"}},[e._v("normal setup and install of BTCPay Server"),t("OutboundLink")],1),e._v(", then after this command "),t("code",[e._v("cd btcpayserver-docker")]),e._v(", follow the below instructions instead of those in the link. If you already have a BTCPay Server running, then just follow from the next step.")])]),e._v(" "),t("li",[t("p",[e._v("Set your environment variables:")])])]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("export")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[e._v("BTCPAY_HOST")]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"YOURHOST.com"')]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("export")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[e._v("NBITCOIN_NETWORK")]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"mainnet"')]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("export")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[e._v("BTCPAYGEN_CRYPTO1")]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"btc"')]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("export")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[e._v("BTCPAYGEN_REVERSEPROXY")]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"nginx"')]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("export")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[e._v("BTCPAYGEN_LIGHTNING")]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"lnd"')]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("export")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[e._v("LIGHTNING_ALIAS")]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"MY_LN"')]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("export")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[e._v("LETSENCRYPT_EMAIL")]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"you@example.com"')]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("export")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[e._v("BTCPAYGEN_ADDITIONAL_FRAGMENTS")]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"opt-add-electrumx;opt-more-memory"')]),e._v("\n")])])]),t("p",[e._v("You can run all of that as one command after you tweak it to your needs. The main part for our purposes in this guide of course is "),t("code",[e._v('BTCPAYGEN_ADDITIONAL_FRAGMENTS="opt-add-electrumx"')]),e._v(". Note: "),t("code",[e._v("opt-more-memory")]),e._v(" can be removed if you like, but I really recommend it if your system has more than 1GB of RAM/memory that you can assign to BTCPay server, it will speed synching your node and the general performance of ElectrumX up drastically.")]),e._v(" "),t("ol",{attrs:{start:"5"}},[t("li",[t("p",[e._v("Set up or reconfigure BTCPay Server with ElectrumX:")]),e._v(" "),t("p",[t("code",[e._v("cd ~/BTCPayServer/btcpayserver-docker && . ./btcpay-setup.sh -i")])]),e._v(" "),t("p",[e._v('This will setup (or re-setup) your server with everything needed including ElectrumX, and it all should "just work". But, it will trigger at least a couple of hours of syncing the '),t("code",[e._v("txindex")]),e._v(", and if it is a new server, could be a couple of days depending on your hardware.")])]),e._v(" "),t("li",[t("p",[e._v("WAIT for your node to fully sync:\nYou can check the status of bitcoin core sync by going to your domain for BTCPay server, and it will show you on the front page. Or, you can check from the command line as well, using these commands:")]),e._v(" "),t("p",[t("code",[e._v("docker logs btcpayserver_bitcoind")]),e._v(" - this will show you the bitcoin core blockchain sync status (and ALL other info about your node, including any errors)")]),e._v(" "),t("p",[t("code",[e._v("docker logs generated_electrumx_1")]),e._v(" - this will show you the ElectrumX sync status. Note: ElectrumX will NOT start syncing until bitcoin full node has finished syncing, you will see errors until that is finished and these can be ignored.")])])]),e._v(" "),t("p",[e._v("Once all syncing for both bitcoin and ElectrumX has finished you can proceed to the next step. (Note: Electrum wallets will not connect to an Electrum server that has not finished synching)")]),e._v(" "),t("h2",{attrs:{id:"section-22-connect-your-electrum-wallet-desktop-or-android-to-your-electrumx-server"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#section-22-connect-your-electrum-wallet-desktop-or-android-to-your-electrumx-server"}},[e._v("#")]),e._v(" Section 2.2 Connect your Electrum Wallet (Desktop or Android) to your ElectrumX Server")]),e._v(" "),t("h3",{attrs:{id:"connect-to-electrumx-from-electrum-wallet-on-your-macpclinux-machine"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#connect-to-electrumx-from-electrum-wallet-on-your-macpclinux-machine"}},[e._v("#")]),e._v(" Connect to ElectrumX from Electrum Wallet on your Mac/PC/Linux Machine:")]),e._v(" "),t("p",[e._v('Read all of this first before proceeding. You may wish to do just the "Protip" below instead of the manual steps in the Electrum Wallet GUI.')]),e._v(" "),t("p",[e._v("Open Electrum Wallet. When you click the traffic light at the bottom of your Electrum Wallet:")]),e._v(" "),t("figure",[t("img",{attrs:{src:"https://user-images.githubusercontent.com/1388507/68437133-5636c500-01c0-11ea-822c-6e72bd6d60ea.png",alt:"ElectrumWalletMainScreenLight",title:"ElectrumWalletMainScreenLight"}})]),e._v(" "),t("p",[e._v("You will see this screen with a list of all the available Electrum servers that your wallet can connect to, normally with "),t("code",[e._v("Select Server Automatically")]),e._v(" already checked:")]),e._v(" "),t("figure",[t("img",{attrs:{src:"https://user-images.githubusercontent.com/1388507/68437521-8a5eb580-01c1-11ea-9ece-0666353a6742.png",alt:"ElectrumWalletServerList",title:"ElectrumWalletServerList"}})]),e._v(" "),t("p",[e._v("Now is the time to UNCHECK that "),t("code",[e._v("Select Server Automatically")]),e._v(" setting, which will enable you to enter the IP address or domain or hostname of your ElectrumX Server. In the case below, the ElectrumX server is on the local network at "),t("code",[e._v("192.168.1.3")]),e._v(" so we enter that manually (leave port as 50002) and press "),t("code",[e._v("close")]),e._v(".")]),e._v(" "),t("figure",[t("img",{attrs:{src:"https://user-images.githubusercontent.com/1388507/68496320-4e276580-0252-11ea-8caf-facc8a246d70.png",alt:"EnterElectrumXServerIP",title:"EnterElectrumXServerIP"}})]),e._v(" "),t("p",[e._v("If all of the above worked well, and your node is healthy, you will get a green traffic light down the bottom right of the wallet interface as pictured here - that means success!:")]),e._v(" "),t("figure",[t("img",{attrs:{src:"https://user-images.githubusercontent.com/1388507/68437133-5636c500-01c0-11ea-822c-6e72bd6d60ea.png",alt:"ElectrumWalletMainScreenLight",title:"ElectrumWalletMainScreenLight"}})]),e._v(" "),t("h4",{attrs:{id:"protip-optionally-perform-the-above-steps-directly-in-electrum-wallet-config-file-before-even-opening-the-wallet-gui"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#protip-optionally-perform-the-above-steps-directly-in-electrum-wallet-config-file-before-even-opening-the-wallet-gui"}},[e._v("#")]),e._v(" Protip - optionally perform the above steps directly in Electrum Wallet config file before even opening the wallet GUI:")]),e._v(" "),t("p",[e._v("If you prefer to avoid connecting to other servers from the outset when you open Electrum Wallet, do the following before you open Electrum Wallet GUI.")]),e._v(" "),t("p",[e._v("In the Electrum Wallet folder ("),t("a",{attrs:{href:"https://electrum.readthedocs.io/en/latest/faq.html#where-is-my-wallet-file-located",target:"_blank",rel:"noopener noreferrer"}},[e._v("see here"),t("OutboundLink")],1),e._v(" if you don't know where that is), open and edit the "),t("code",[e._v("config")]),e._v(" file like this:")]),e._v(" "),t("ol",[t("li",[t("p",[e._v("Find line: "),t("code",[e._v('"auto_connect": true,')]),e._v(" and switch it to: "),t("code",[e._v('"auto_connect": false,')]),e._v(" - this will prevent your Electrum Wallet from auto-connecting to other 3rd party Electrum Servers at launch time (to obtain block headers and transaction information).")])]),e._v(" "),t("li",[t("p",[e._v("Find line: "),t("code",[e._v('"oneserver": false,')]),e._v(" and switch it to: "),t("code",[e._v('"oneserver": true,')]),e._v(" - ensures that all data is obtained from just one server.")])]),e._v(" "),t("li",[t("p",[e._v("Find or add line: "),t("code",[e._v('"server": "SOMEIPADDRESS:50002:s",')]),e._v("and switch it to your own ElectrumX Server's IP address, in the example above this would be: "),t("code",[e._v('"server": "192.168.1.3:50002:s",')]),e._v("- hard code your IP address as the default upon opening the Wallet.")])])]),e._v(" "),t("p",[e._v("These 3 steps optional but recommended for full privacy by locking down Electrum Wallet to one single connection with your private server ("),t("a",{attrs:{href:"https://github.com/chris-belcher/electrum-personal-server#how-to",target:"_blank",rel:"noopener noreferrer"}},[e._v("Reference"),t("OutboundLink")],1),e._v(").")]),e._v(" "),t("h3",{attrs:{id:"reflection-on-what-has-been-achieved"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#reflection-on-what-has-been-achieved"}},[e._v("#")]),e._v(" Reflection on what has been achieved:")]),e._v(" "),t("p",[e._v("You are now running your very "),t("strong",[e._v("own private ElectrumX Server")]),e._v(". All Electrum Wallet related data transfer happens directly between your ElectrumX Server and the bitcoin blockchain, without going over any other 3rd party servers. You have attained full bitcoin transaction privacy (at least from the perspective of your blockchain queries and transactions, payment/receive addresses etc - nobody except you and the blockchain can see what you are doing).")]),e._v(" "),t("h3",{attrs:{id:"troubleshooting"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#troubleshooting"}},[e._v("#")]),e._v(" Troubleshooting:")]),e._v(" "),t("p",[e._v("So there is one thing you may encounter, where even after you did everything correctly, you still get a red traffic light (which means not connected to any server) in the steps above. Any other troubleshooting tips that people encounter can be added, I would suggest to make a PR to this document directly.")]),e._v(" "),t("ul",[t("li",[e._v("If you get a red traffic light, shutdown Electrum Wallet completely, then go to your Electrum Wallet folder ("),t("a",{attrs:{href:"https://electrum.readthedocs.io/en/latest/faq.html#where-is-my-wallet-file-located",target:"_blank",rel:"noopener noreferrer"}},[e._v("see here"),t("OutboundLink")],1),e._v(" if you don't know where that is).")])]),e._v(" "),t("p",[e._v("Inside the Electrum Wallet folder (in this case below, it is what it looks like on a Mac) locate the "),t("code",[e._v("certs")]),e._v(" directory and delete the certificate for the server you are trying to connect to, in this case "),t("code",[e._v("192.168.1.3")]),e._v(", by dragging it to the Trash.")]),e._v(" "),t("figure",[t("img",{attrs:{src:"https://user-images.githubusercontent.com/1388507/68497330-9a73a500-0254-11ea-9349-71bdb3bd9511.png",alt:"Certs",title:"Certs"}})]),e._v(" "),t("p",[e._v("Start up Electrum Wallet again, and connect to your ElectrumX server. If it is fully synched, it will now likely show a green traffic light, and you are good to go.")])])}),[],!1,null,null,null);t.default=o.exports}}]); \ No newline at end of file diff --git a/assets/js/138.9fce8b5f.js b/assets/js/138.004560b0.js similarity index 99% rename from assets/js/138.9fce8b5f.js rename to assets/js/138.004560b0.js index 46d377a7f5..cc8aa42973 100644 --- a/assets/js/138.9fce8b5f.js +++ b/assets/js/138.004560b0.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[138],{775:function(t,a,e){"use strict";e.r(a);var o=e(10),n=Object(o.a)({},(function(){var t=this,a=t._self._c;return a("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[a("h1",{attrs:{id:"altcoins-faq"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#altcoins-faq"}},[t._v("#")]),t._v(" Altcoins FAQ")]),t._v(" "),a("p",[t._v("This page answers some of the common questions about alternative cryptocurrencies - altcoins.")]),t._v(" "),a("p"),a("div",{staticClass:"table-of-contents"},[a("ul",[a("li",[a("a",{attrs:{href:"#which-coins-does-btcpay-server-support"}},[t._v("Which coins does BTCPay Server support?")])]),a("li",[a("a",{attrs:{href:"#can-an-xyz-coin-be-added-in-btcpay"}},[t._v("Can an XYZ coin be added in BTCPay?")])]),a("li",[a("a",{attrs:{href:"#how-to-add-an-altcoin-in-btcpay"}},[t._v("How to add an altcoin in BTCPay?")])]),a("li",[a("a",{attrs:{href:"#how-to-add-an-altcoin-to-an-existing-btcpay-deployment"}},[t._v("How to add an altcoin to an existing BTCPay deployment?")])]),a("li",[a("a",{attrs:{href:"#how-to-remove-a-coin-from-btcpay"}},[t._v("How to remove a coin from BTCPay?")])])])]),a("p"),t._v(" "),a("h2",{attrs:{id:"which-coins-does-btcpay-server-support"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#which-coins-does-btcpay-server-support"}},[t._v("#")]),t._v(" Which coins does BTCPay Server support?")]),t._v(" "),a("p",[t._v("Bitcoin is the only focus of the project and its core developers. However, opt in integrations are present for several altcoins:")]),t._v(" "),a("ul",[a("li",[t._v("BGold (BTG) (also known as Bitcoin Gold)")]),t._v(" "),a("li",[t._v("BPlus (XBC) (also known as Bitcoin Plus)")]),t._v(" "),a("li",[t._v("Bitcore (BTX)")]),t._v(" "),a("li",[t._v("Dash (DASH)")]),t._v(" "),a("li",[t._v("Dogecoin (DOGE)")]),t._v(" "),a("li",[t._v("Feathercoin (FTC)")]),t._v(" "),a("li",[t._v("Groestlcoin (GRS)")]),t._v(" "),a("li",[t._v("Htmlcoin (HTML) (also known as Althash)")]),t._v(" "),a("li",[t._v("Liquid Bitcoin (LBTC) (comes with Liquid Tether support USDt) "),a("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver/issues/1282",target:"_blank",rel:"noopener noreferrer"}},[t._v("(notes on deployment & usage)"),a("OutboundLink")],1)]),t._v(" "),a("li",[t._v("Litecoin (LTC)")]),t._v(" "),a("li",[t._v("Monacoin (MONA)")]),t._v(" "),a("li",[t._v("Monero (XMR) "),a("a",{attrs:{href:"https://sethforprivacy.com/guides/accepting-monero-via-btcpay-server/",target:"_blank",rel:"noopener noreferrer"}},[t._v("(guide on deployment and usage)"),a("OutboundLink")],1)]),t._v(" "),a("li",[t._v("Polis (POLIS)")]),t._v(" "),a("li",[t._v("Viacoin (VIA)")])]),t._v(" "),a("p",[t._v("Altcoins are maintained by their respective communities and are listed here only for convenience. For support regarding Altcoin deployment, functionalities or issues, please contact the Altcoin maintainer or community directly.")]),t._v(" "),a("h2",{attrs:{id:"can-an-xyz-coin-be-added-in-btcpay"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#can-an-xyz-coin-be-added-in-btcpay"}},[t._v("#")]),t._v(" Can an XYZ coin be added in BTCPay?")]),t._v(" "),a("p",[t._v("No. BTCPay developers don't add alternative coins on request. Adding a new coin explicitly depends on the community and developers of those coins. Furthermore, BTCPay developers do not spend excessive time testing nor maintaining the altcoins. If you're submitting a PR for a new coin, make sure that it works. If the altcoin integration is not actively maintained it will be removed from BTCPay.")]),t._v(" "),a("h2",{attrs:{id:"how-to-add-an-altcoin-in-btcpay"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#how-to-add-an-altcoin-in-btcpay"}},[t._v("#")]),t._v(" How to add an altcoin in BTCPay?")]),t._v(" "),a("p",[t._v("To add a new coin to BTCPay, please "),a("RouterLink",{attrs:{to:"/Development/Altcoins/#how-can-i-add-an-altcoin-to-btcpayserver"}},[t._v("follow the instructions here")]),t._v(".")],1),t._v(" "),a("h2",{attrs:{id:"how-to-add-an-altcoin-to-an-existing-btcpay-deployment"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#how-to-add-an-altcoin-to-an-existing-btcpay-deployment"}},[t._v("#")]),t._v(" How to add an altcoin to an existing BTCPay deployment?")]),t._v(" "),a("p",[t._v("If you want to expand the number of coins in your existing BTCPay Server installation, make sure that you have enough storage space on your machine.")]),t._v(" "),a("p",[t._v("In this example, we only have Bitcoin, and we're adding Litecoin to our docker deployment.")]),t._v(" "),a("p",[t._v("The coin structure:")]),t._v(" "),a("div",{staticClass:"language- extra-class"},[a("pre",{pre:!0,attrs:{class:"language-text"}},[a("code",[t._v("BTCPAYGEN_CRYPTO1: First supported cryptocurrency (e.g., BTC, LTC. Default: btc)\nBTCPAYGEN_CRYPTO2: Second supported crypto currency (e.g. btc, ltc. Default: (empty))\nBTCPAYGEN_CRYPTON: N'th supported crypto currency where N is 9 at maximum. (eg. btc, ltc. Default: (empty))\n")])])]),a("p",[t._v("To add Litecoin, as your second coin (CRYPTO2) do this :")]),t._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[a("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("su")]),t._v(" -\n"),a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("export")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token assign-left variable"}},[t._v("BTCPAYGEN_CRYPTO2")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"ltc"')]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v(".")]),t._v(" ./btcpay-setup.sh "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-i")]),t._v("\n")])])]),a("h2",{attrs:{id:"how-to-remove-a-coin-from-btcpay"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#how-to-remove-a-coin-from-btcpay"}},[t._v("#")]),t._v(" How to remove a coin from BTCPay?")]),t._v(" "),a("p",[t._v("In the "),a("a",{attrs:{href:"#how-to-add-an-altcoin-to-an-existing-btcpay-deployment"}},[t._v("example above")]),t._v(" we've added Litecoin as the second coin. To remove a particular coin, use the following command:")]),t._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[a("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("su")]),t._v(" -\n"),a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("export")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token assign-left variable"}},[t._v("BTCPAYGEN_CRYPTO2")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('""')]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v(".")]),t._v(" ./btcpay-setup.sh "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-i")]),t._v("\n")])])]),a("p",[t._v("Where CRYPTO"),a("strong",[t._v("2")]),t._v(" should be replaced with a coin number you wish to remove. If you have an XYZ coin as "),a("code",[t._v("BTCPAYGEN_CRYPTO3")]),t._v(", and you want to remove it, you should use CRYPTO"),a("strong",[t._v("3")]),t._v(".")])])}),[],!1,null,null,null);a.default=n.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[138],{773:function(t,a,e){"use strict";e.r(a);var o=e(10),n=Object(o.a)({},(function(){var t=this,a=t._self._c;return a("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[a("h1",{attrs:{id:"altcoins-faq"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#altcoins-faq"}},[t._v("#")]),t._v(" Altcoins FAQ")]),t._v(" "),a("p",[t._v("This page answers some of the common questions about alternative cryptocurrencies - altcoins.")]),t._v(" "),a("p"),a("div",{staticClass:"table-of-contents"},[a("ul",[a("li",[a("a",{attrs:{href:"#which-coins-does-btcpay-server-support"}},[t._v("Which coins does BTCPay Server support?")])]),a("li",[a("a",{attrs:{href:"#can-an-xyz-coin-be-added-in-btcpay"}},[t._v("Can an XYZ coin be added in BTCPay?")])]),a("li",[a("a",{attrs:{href:"#how-to-add-an-altcoin-in-btcpay"}},[t._v("How to add an altcoin in BTCPay?")])]),a("li",[a("a",{attrs:{href:"#how-to-add-an-altcoin-to-an-existing-btcpay-deployment"}},[t._v("How to add an altcoin to an existing BTCPay deployment?")])]),a("li",[a("a",{attrs:{href:"#how-to-remove-a-coin-from-btcpay"}},[t._v("How to remove a coin from BTCPay?")])])])]),a("p"),t._v(" "),a("h2",{attrs:{id:"which-coins-does-btcpay-server-support"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#which-coins-does-btcpay-server-support"}},[t._v("#")]),t._v(" Which coins does BTCPay Server support?")]),t._v(" "),a("p",[t._v("Bitcoin is the only focus of the project and its core developers. However, opt in integrations are present for several altcoins:")]),t._v(" "),a("ul",[a("li",[t._v("BGold (BTG) (also known as Bitcoin Gold)")]),t._v(" "),a("li",[t._v("BPlus (XBC) (also known as Bitcoin Plus)")]),t._v(" "),a("li",[t._v("Bitcore (BTX)")]),t._v(" "),a("li",[t._v("Dash (DASH)")]),t._v(" "),a("li",[t._v("Dogecoin (DOGE)")]),t._v(" "),a("li",[t._v("Feathercoin (FTC)")]),t._v(" "),a("li",[t._v("Groestlcoin (GRS)")]),t._v(" "),a("li",[t._v("Htmlcoin (HTML) (also known as Althash)")]),t._v(" "),a("li",[t._v("Liquid Bitcoin (LBTC) (comes with Liquid Tether support USDt) "),a("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver/issues/1282",target:"_blank",rel:"noopener noreferrer"}},[t._v("(notes on deployment & usage)"),a("OutboundLink")],1)]),t._v(" "),a("li",[t._v("Litecoin (LTC)")]),t._v(" "),a("li",[t._v("Monacoin (MONA)")]),t._v(" "),a("li",[t._v("Monero (XMR) "),a("a",{attrs:{href:"https://sethforprivacy.com/guides/accepting-monero-via-btcpay-server/",target:"_blank",rel:"noopener noreferrer"}},[t._v("(guide on deployment and usage)"),a("OutboundLink")],1)]),t._v(" "),a("li",[t._v("Polis (POLIS)")]),t._v(" "),a("li",[t._v("Viacoin (VIA)")])]),t._v(" "),a("p",[t._v("Altcoins are maintained by their respective communities and are listed here only for convenience. For support regarding Altcoin deployment, functionalities or issues, please contact the Altcoin maintainer or community directly.")]),t._v(" "),a("h2",{attrs:{id:"can-an-xyz-coin-be-added-in-btcpay"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#can-an-xyz-coin-be-added-in-btcpay"}},[t._v("#")]),t._v(" Can an XYZ coin be added in BTCPay?")]),t._v(" "),a("p",[t._v("No. BTCPay developers don't add alternative coins on request. Adding a new coin explicitly depends on the community and developers of those coins. Furthermore, BTCPay developers do not spend excessive time testing nor maintaining the altcoins. If you're submitting a PR for a new coin, make sure that it works. If the altcoin integration is not actively maintained it will be removed from BTCPay.")]),t._v(" "),a("h2",{attrs:{id:"how-to-add-an-altcoin-in-btcpay"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#how-to-add-an-altcoin-in-btcpay"}},[t._v("#")]),t._v(" How to add an altcoin in BTCPay?")]),t._v(" "),a("p",[t._v("To add a new coin to BTCPay, please "),a("RouterLink",{attrs:{to:"/Development/Altcoins/#how-can-i-add-an-altcoin-to-btcpayserver"}},[t._v("follow the instructions here")]),t._v(".")],1),t._v(" "),a("h2",{attrs:{id:"how-to-add-an-altcoin-to-an-existing-btcpay-deployment"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#how-to-add-an-altcoin-to-an-existing-btcpay-deployment"}},[t._v("#")]),t._v(" How to add an altcoin to an existing BTCPay deployment?")]),t._v(" "),a("p",[t._v("If you want to expand the number of coins in your existing BTCPay Server installation, make sure that you have enough storage space on your machine.")]),t._v(" "),a("p",[t._v("In this example, we only have Bitcoin, and we're adding Litecoin to our docker deployment.")]),t._v(" "),a("p",[t._v("The coin structure:")]),t._v(" "),a("div",{staticClass:"language- extra-class"},[a("pre",{pre:!0,attrs:{class:"language-text"}},[a("code",[t._v("BTCPAYGEN_CRYPTO1: First supported cryptocurrency (e.g., BTC, LTC. Default: btc)\nBTCPAYGEN_CRYPTO2: Second supported crypto currency (e.g. btc, ltc. Default: (empty))\nBTCPAYGEN_CRYPTON: N'th supported crypto currency where N is 9 at maximum. (eg. btc, ltc. Default: (empty))\n")])])]),a("p",[t._v("To add Litecoin, as your second coin (CRYPTO2) do this :")]),t._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[a("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("su")]),t._v(" -\n"),a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("export")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token assign-left variable"}},[t._v("BTCPAYGEN_CRYPTO2")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"ltc"')]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v(".")]),t._v(" ./btcpay-setup.sh "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-i")]),t._v("\n")])])]),a("h2",{attrs:{id:"how-to-remove-a-coin-from-btcpay"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#how-to-remove-a-coin-from-btcpay"}},[t._v("#")]),t._v(" How to remove a coin from BTCPay?")]),t._v(" "),a("p",[t._v("In the "),a("a",{attrs:{href:"#how-to-add-an-altcoin-to-an-existing-btcpay-deployment"}},[t._v("example above")]),t._v(" we've added Litecoin as the second coin. To remove a particular coin, use the following command:")]),t._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[a("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("su")]),t._v(" -\n"),a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("export")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token assign-left variable"}},[t._v("BTCPAYGEN_CRYPTO2")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('""')]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v(".")]),t._v(" ./btcpay-setup.sh "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-i")]),t._v("\n")])])]),a("p",[t._v("Where CRYPTO"),a("strong",[t._v("2")]),t._v(" should be replaced with a coin number you wish to remove. If you have an XYZ coin as "),a("code",[t._v("BTCPAYGEN_CRYPTO3")]),t._v(", and you want to remove it, you should use CRYPTO"),a("strong",[t._v("3")]),t._v(".")])])}),[],!1,null,null,null);a.default=n.exports}}]); \ No newline at end of file diff --git a/assets/js/139.1e518888.js b/assets/js/139.cde76b3d.js similarity index 99% rename from assets/js/139.1e518888.js rename to assets/js/139.cde76b3d.js index 870f855944..d0ace80d68 100644 --- a/assets/js/139.1e518888.js +++ b/assets/js/139.cde76b3d.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[139],{780:function(t,e,o){"use strict";o.r(e);var a=o(10),n=Object(a.a)({},(function(){var t=this,e=t._self._c;return e("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[e("h1",{attrs:{id:"frequently-asked-questions-and-common-issues"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#frequently-asked-questions-and-common-issues"}},[t._v("#")]),t._v(" Frequently Asked Questions and Common Issues")]),t._v(" "),e("p",[t._v("This document contains a Table of contents to all FAQ and common issues.")]),t._v(" "),e("h2",{attrs:{id:"general-faq"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#general-faq"}},[t._v("#")]),t._v(" "),e("RouterLink",{attrs:{to:"/FAQ/General/"}},[t._v("General FAQ")])],1),t._v(" "),e("p",[t._v("General, non-technical questions about BTCPay. What it is, how it works, what are its features, why is it different and who can use it.")]),t._v(" "),e("ul",[e("li",[e("RouterLink",{attrs:{to:"/FAQ/General/#what-is-btcpay-server"}},[t._v("What is BTCPay Server?")])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/FAQ/General/#why-should-i-choose-btcpay-over-other-processors"}},[t._v("Why should I choose BTCPay over other processors?")])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/FAQ/General/#why-is-everyone-so-excited-about-btcpay"}},[t._v("Why is everyone so excited about BTCPay?")])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/FAQ/General/#who-can-use-btcpay"}},[t._v("Who can use BTCPay?")])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/FAQ/General/#how-to-install-btcpay-server"}},[t._v("How to install BTCPay?")])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/FAQ/General/#where-to-find-btcpay-video-tutorials"}},[t._v("Where to find BTCPay video tutorials?")])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/FAQ/General/#do-i-need-to-have-an-online-store-to-use-btcpay-server"}},[t._v("Do I need to have an online store to use BTCPay Server?")])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/FAQ/General/#why-cant-i-just-give-my-bitcoin-address-to-a-buyer"}},[t._v("Why can't I just give my public address to a buyer?")])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/FAQ/General/#how-does-btcpay-create-a-new-address-for-each-invoice"}},[t._v("How does BTCPay create a new address for each invoice?")])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/FAQ/General/#does-btcpay-need-myprivate-key"}},[t._v("Does BTCPay need my private key?")])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/FAQ/General/#does-btcpay-server-support-crypto-to-fiat-conversion"}},[t._v("Does BTCPay Server support crypto to fiat conversion?")])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/FAQ/General/#what-if-i-have-a-problem-paying-an-invoice"}},[t._v("What if I have a problem paying a BTCPay Server invoice?")])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/FAQ/General/#what-if-i-have-a-problem-with-a-paid-invoice"}},[t._v("What if I have a problem with a paid invoice?")])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/FAQ/General/#where-can-i-get-help-and-support"}},[t._v("Where can I get help and support?")])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/FAQ/General/#how-can-i-contribute-to-btcpay"}},[t._v("How can I contribute to BTCPay?")])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/FAQ/General/#how-can-i-use-the-btcpay-server-api"}},[t._v("How can I use the BTCPay Server API?")])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/FAQ/General/#how-can-i-backup-my-btcpay-server"}},[t._v("How can I backup my BTCPay Server?")])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/FAQ/General/#how-can-i-charge-for-using-my-btcpay-server-instance"}},[t._v("How can I charge for using my BTCPay Server instance?")])],1)]),t._v(" "),e("h2",{attrs:{id:"deployment-faq"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#deployment-faq"}},[t._v("#")]),t._v(" "),e("RouterLink",{attrs:{to:"/FAQ/Deployment/"}},[t._v("Deployment FAQ")])],1),t._v(" "),e("p",[t._v("Questions and solutions to BTCPay installation.")]),t._v(" "),e("h3",{attrs:{id:"general-deployment-faq"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#general-deployment-faq"}},[t._v("#")]),t._v(" "),e("RouterLink",{attrs:{to:"/FAQ/Deployment/#general-deployment-faq"}},[t._v("General Deployment FAQ")])],1),t._v(" "),e("ul",[e("li",[e("RouterLink",{attrs:{to:"/FAQ/Deployment/#how-much-does-it-cost-to-run-btcpay-server"}},[t._v("How much does it cost to run BTCPay Server?")])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/FAQ/Deployment/#what-are-the-minimal-requirements-for-btcpay"}},[t._v("What are the minimal requirements for BTCPay?")])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/FAQ/Deployment/#what-is-the-easiest-method-to-deploy-a-self-hosted-btcpay-server"}},[t._v("What is the easiest method to deploy a self-hosted BTCPay Server?")])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/FAQ/Deployment/#how-to-choose-a-proper-deployment-method"}},[t._v("How to choose a proper deployment method?")])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/FAQ/FAQ-Deployment/#can-i-run-btcpay-on-my-home-computer"}},[t._v("Why do I need a VPS? Can't I just run BTCPay on my home computer?")])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/FAQ/Deployment/#can-i-run-btcpay-on-my-own-hardware"}},[t._v("Can I run BTCPay on my hardware?")])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/FAQ/Deployment/#can-i-deploy-btcpay-on-my-existing-vps"}},[t._v("Can I deploy on my existing VPS?")])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/FAQ/Deployment/#are-there-free-hosts-where-i-can-test"}},[t._v("Are there free hosts where I can test?")])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/FAQ/Deployment/#after-initial-deployment-i-can-t-register-and-i-don-t-have-a-login-yet"}},[t._v("After initial deployment, I can't register and I don't have a login yet?")])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/FAQ/Deployment/#how-do-i-activate-tor-on-my-btcpay-server"}},[t._v("How do I activate Tor on my BTCPay Server?")])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/FAQ/Deployment/#how-do-i-disable-tor-on-my-btcpay-server"}},[t._v("How do I disable Tor on my BTCPay Server?")])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/FAQ/Deployment/#why-activate-tor-does-it-mean-that-nobody-knows-who-i-am"}},[t._v("Why activate Tor? Does it mean that nobody knows who I am?")])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/FAQ/Deployment/#how-to-access-the-onion-address-without-clearnet"}},[t._v("How to access the .onion address without clearnet?")])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/FAQ/Deployment/#how-can-i-modify-or-deactivate-environment-variables"}},[t._v("How can I modify or deactivate environment variables?")])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/FAQ/Deployment/#how-can-i-run-btcpay-on-testnet"}},[t._v("How can I run BTCPay on testnet?")])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/FAQ/Deployment/#can-i-start-btcpay-only-when-i-m-expecting-a-payment"}},[t._v("Can I start BTCPay only when I'm expecting a payment?")])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/FAQ/Deployment/#can-i-connect-to-my-btcpay-bitcoin-p2p-on-port-8333"}},[t._v("Can I connect to my BTCPay Bitcoin P2P on port 8333?")])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/FAQ/Deployment/#how-can-i-renew-my-ssl-certificate"}},[t._v("How can I renew my SSL certificate?")])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/FAQ/Deployment/#can-i-use-an-existing-nginx-server-as-a-reverse-proxy-with-ssl-termination"}},[t._v("Can I use an existing Nginx server as a reverse proxy with SSL termination?")])],1)]),t._v(" "),e("h3",{attrs:{id:"web-deployment-faq"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#web-deployment-faq"}},[t._v("#")]),t._v(" "),e("RouterLink",{attrs:{to:"/FAQ/Deployment/#web-deployment-faq"}},[t._v("Web Deployment FAQ")])],1),t._v(" "),e("h4",{attrs:{id:"luna-node-web-deployment-faq"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#luna-node-web-deployment-faq"}},[t._v("#")]),t._v(" "),e("RouterLink",{attrs:{to:"/FAQ/Deployment/#luna-node-web-deployment-faq"}},[t._v("Luna Node Web Deployment FAQ")])],1),t._v(" "),e("ul",[e("li",[e("RouterLink",{attrs:{to:"/FAQ/Deployment/#how-to-change-domain-name-on-my-lunanode-btcpay"}},[t._v("How to change domain name on my LunaNode BTCPay?")])],1)]),t._v(" "),e("h3",{attrs:{id:"manual-deployment-faq"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#manual-deployment-faq"}},[t._v("#")]),t._v(" "),e("RouterLink",{attrs:{to:"/FAQ/Deployment/#manual-deployment"}},[t._v("Manual Deployment FAQ")])],1),t._v(" "),e("ul",[e("li",[e("RouterLink",{attrs:{to:"/FAQ/Deployment/#how-to-manually-install-btcpay-on-ubuntu-18-04"}},[t._v("How to manually install BTCPay on Ubuntu 18.04?")])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/FAQ/Deployment/#how-do-i-completely-uninstall-btcpay-from-a-linux-environment-docker-version"}},[t._v("How do I completely uninstall BTCPay from a linux environment (docker version)")])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/FAQ/Deployment/#how-to-deploy-btcpay-server-alongside-existing-bitcoin-node"}},[t._v("How to deploy BTCPay Server alongside existing Bitcoin full node?")])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/FAQ/Deployment/#with-the-docker-deployment-how-to-use-a-different-volume-for-the-data"}},[t._v("With the docker deployment, how to use a different volume for the data?")])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/FAQ/Deployment/#cause-4-getting-500-nginx-error-on-a-local-server-https-and-for-http-btcpay-is-expecting-you-to-access-this-website-from"}},[t._v("Getting 500 nginx error on a local server https and for http (BTCPay is expecting you to access this website from)")])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/FAQ/Deployment/#cause-3-btcpay-is-expecting-you-to-access-this-website-from"}},[t._v("Error: BTCPay is expecting you to access this website from...")])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/FAQ/Deployment/#cause-3-btcpay-is-expecting-you-to-access-this-website-from"}},[t._v("You access BTCPay Server over an unsecured network")])],1)]),t._v(" "),e("h2",{attrs:{id:"synchronization-faq"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#synchronization-faq"}},[t._v("#")]),t._v(" "),e("RouterLink",{attrs:{to:"/FAQ/Synchronization/"}},[t._v("Synchronization FAQ")])],1),t._v(" "),e("p",[t._v("Common questions and issues that may occur during the initial sync of BTCPay.")]),t._v(" "),e("ul",[e("li",[e("RouterLink",{attrs:{to:"/FAQ/Synchronization/#why-does-btcpay-sync"}},[t._v("Why does BTCPay sync?")])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/FAQ/Synchronization/#can-i-skip-the-synchronization"}},[t._v("Can I skip/speed up the sync?")])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/FAQ/Synchronization/#how-do-i-know-that-btcpay-synced-completely"}},[t._v("How do I know that the sync is finished?")])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/FAQ/Synchronization/#how-can-i-check-the-block-height-of-my-bitcoin-node"}},[t._v("How can I check the block height of my bitcoin node?")])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/FAQ/Synchronization/#btcpay-server-takes-forever-to-synchronize"}},[t._v("BTCPay takes forever to synchronize")])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/FAQ/Synchronization/#btcpay-server-keeps-showing-that-my-node-is-always-starting"}},[t._v("BTCPay Server keeps showing that my node is always starting")])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/FAQ/Synchronization/#im-running-a-full-node-and-have-a-synched-blockchain-can-btcpay-use-it-so-that-it-doesnt-have-to-do-a-full-sync"}},[t._v("I already have a synced full node, can I use it with BTCPay?")])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/FAQ/Synchronization/#how-to-enable-bitcoin-node-pruning"}},[t._v("How to enable Bitcoin node pruning?")])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/FAQ/Synchronization/#how-to-disable-bitcoin-node-pruning"}},[t._v("How to disable Bitcoin node pruning?")])],1)]),t._v(" "),e("h2",{attrs:{id:"integrations-faq"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#integrations-faq"}},[t._v("#")]),t._v(" "),e("RouterLink",{attrs:{to:"/FAQ/Integrations/"}},[t._v("Integrations FAQ")])],1),t._v(" "),e("p",[t._v("Questions about e-commerce and other integrations.")]),t._v(" "),e("h3",{attrs:{id:"integrations-general"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#integrations-general"}},[t._v("#")]),t._v(" "),e("RouterLink",{attrs:{to:"/FAQ/Integrations/#integrations-general-faq"}},[t._v("Integrations General")])],1),t._v(" "),e("ul",[e("li",[e("RouterLink",{attrs:{to:"/FAQ/Integrations/#what-e-commerce-integrations-are-available"}},[t._v("What e-commerce integrations are available?")])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/FAQ/Integrations/#does-btcpay-have-a-shopify-plugin"}},[t._v("Does BTCPay have a Shopify plugin?")])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/FAQ/Integrations/#can-i-use-btcpay-without-an-integration"}},[t._v("Can I use BTCPay without an integration?")])],1)]),t._v(" "),e("h3",{attrs:{id:"woocommerce-faq"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#woocommerce-faq"}},[t._v("#")]),t._v(" "),e("RouterLink",{attrs:{to:"/FAQ/Integrations/#woocommerce-faq-2"}},[t._v("WooCommerce FAQ")])],1),t._v(" "),e("ul",[e("li",[e("RouterLink",{attrs:{to:"/FAQ/Integrations/#how-to-configure-order-status-in-woocommerce"}},[t._v("How to configure order status in WooCommerce?")])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/FAQ/Integrations/#how-to-customize-e-mail-confirmations-in-woocommerce"}},[t._v("How to customize e-mail confirmations in WooCommerce?")])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/FAQ/Integrations/#error-if-you-use-an-alternative-order-numbering-system-please-see-class-wc-gateway-btcpayphp-to-apply-a-search-filter"}},[t._v("Error: If you use an alternative order numbering system, please see class-wc-gateway-btcpay.php to apply a search filter")])],1)]),t._v(" "),e("h2",{attrs:{id:"server-settings-faq"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#server-settings-faq"}},[t._v("#")]),t._v(" "),e("RouterLink",{attrs:{to:"/FAQ/ServerSettings/"}},[t._v("Server Settings FAQ")])],1),t._v(" "),e("p",[t._v("Common problems and questions server admins have.")]),t._v(" "),e("h3",{attrs:{id:"maintenance-faq"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#maintenance-faq"}},[t._v("#")]),t._v(" "),e("RouterLink",{attrs:{to:"/FAQ/ServerSettings/#maintainance"}},[t._v("Maintenance FAQ")])],1),t._v(" "),e("ul",[e("li",[e("RouterLink",{attrs:{to:"/FAQ/ServerSettings/#how-to-update-btcpay-server"}},[t._v("How to update BTCPay Server?")])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/FAQ/ServerSettings/#how-to-restart-btcpay-server"}},[t._v("How to restart BTCPay Server?")])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/FAQ/ServerSettings/#how-to-ssh-into-my-btcpay-running-on-vps"}},[t._v("How to SSH into my BTCPay running on VPS?")])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/FAQ/ServerSettings/#how-can-i-see-my-btcpay-version"}},[t._v("How can I check my BTCPay Server version?")])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/FAQ/ServerSettings/#how-can-i-check-my-btcpay-server-version-via-terminal"}},[t._v("How can I check my BTCPay Server version via terminal?")])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/FAQ/ServerSettings/#what-is-btcpay-ssh-key-file"}},[t._v("What is BTCPay SSH key file")])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/FAQ/ServerSettings/#forgot-btcpay-admin-password"}},[t._v("Forgot BTCPay Admin password")])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/FAQ/ServerSettings/#how-to-add-a-new-user-by-invite"}},[t._v("How to add a new user by invite?")])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/FAQ/ServerSettings/#how-to-disable-u2f-and-2fa-for-a-user"}},[t._v("How to disable U2F and 2FA for a user?")])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/FAQ/ServerSettings/#how-to-configure-smtp-settings-in-btcpay"}},[t._v("How to configure SMTP settings in BTCPay?")])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/FAQ/ServerSettings/#error-maintenance-feature-requires-access-to-SSH-properly-configured-in-btcpayserver-configuration"}},[t._v("Error: Maintenance feature requires access to SSH properly configured in BTCPayServer configuration")])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/FAQ/ServerSettings/#error-your-local-changes-to-the-following-files-would-be-overwritten-by-merge"}},[t._v("Error: Your local changes to the following files would be overwritten by merge")])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/FAQ/ServerSettings/#error-btcpay-sshkeyfile-is-not-set-when-running-the-docker-install-or-unable-to-update-through-server-settings-maintenance"}},[t._v("Error: the BTCPAY_SSHKEYFILE variable is not set/ Unable to update")])],1)]),t._v(" "),e("h3",{attrs:{id:"theme-customization-faq"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#theme-customization-faq"}},[t._v("#")]),t._v(" "),e("RouterLink",{attrs:{to:"/FAQ/ServerSettings/#theme-customization"}},[t._v("Theme / Customization FAQ")])],1),t._v(" "),e("ul",[e("li",[e("RouterLink",{attrs:{to:"/FAQ/ServerSettings/#how-to-customize-my-btcpay-theme-style"}},[t._v("How to customize my BTCPay theme style?")])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/FAQ/ServerSettings/#how-to-modify-the-checkout-page"}},[t._v("How to modify BTCPay the checkout page?")])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/Development/Theme/#2-bootstrap-themes"}},[t._v("How to customize the POS app theme?")])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/FAQ/ServerSettings/#how-to-add-google-analytics-code-to-btcpay"}},[t._v("How to add Google Analytics code to BTCPay?")])],1)]),t._v(" "),e("h3",{attrs:{id:"policies-faq"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#policies-faq"}},[t._v("#")]),t._v(" "),e("RouterLink",{attrs:{to:"/FAQ/ServerSettings/#policies"}},[t._v("Policies FAQ")])],1),t._v(" "),e("ul",[e("li",[e("RouterLink",{attrs:{to:"/FAQ/ServerSettings/#how-to-allow-registration-on-my-btcpay-server"}},[t._v("How to allow registration on my BTCPay Server?")])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/FAQ/ServerSettings/#how-to-hide-my-btcpay-server-from-search-engines"}},[t._v("How to hide my BTCPay Server from Search Engines?")])],1)]),t._v(" "),e("h3",{attrs:{id:"services-faq"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#services-faq"}},[t._v("#")]),t._v(" "),e("RouterLink",{attrs:{to:"/FAQ/ServerSettings/#services"}},[t._v("Services FAQ")])],1),t._v(" "),e("ul",[e("li",[e("RouterLink",{attrs:{to:"/FAQ/ServerSettings/#how-to-remotely-connect-to-my-btcpay-full-node"}},[t._v("How to remotely connect to my BTCPay full node?")])],1)]),t._v(" "),e("h3",{attrs:{id:"files-faq"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#files-faq"}},[t._v("#")]),t._v(" "),e("RouterLink",{attrs:{to:"/FAQ/ServerSettings/#files"}},[t._v("Files FAQ")])],1),t._v(" "),e("ul",[e("li",[e("RouterLink",{attrs:{to:"/FAQ/ServerSettings/#how-to-upload-files-to-btcpay"}},[t._v("How to upload files to BTCPay?")])],1)]),t._v(" "),e("h2",{attrs:{id:"stores-faq"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#stores-faq"}},[t._v("#")]),t._v(" "),e("RouterLink",{attrs:{to:"/FAQ/Stores/"}},[t._v("Stores FAQ")])],1),t._v(" "),e("p",[t._v("Store settings explained.")]),t._v(" "),e("ul",[e("li",[e("RouterLink",{attrs:{to:"/FAQ/Stores/#how-to-create-a-store-in-btcpay"}},[t._v("How to create a store in BTCPay?")])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/FAQ/Stores/#how-many-stores-can-i-create"}},[t._v("How many stores can I create?")])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/FAQ/Stores/#why-are-invoices-without-payment-showing-as-complete"}},[t._v("Why are invoices without payment showing as complete?")])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/FAQ/Stores/#store-general-settings"}},[t._v("Store General Settings")])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/FAQ/Stores/#add-network-fee-to-invoice-vary-with-mining-fees"}},[t._v("Add network fee to invoice (vary with mining fees)?")])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/FAQ/Stores/#allow-anyone-to-create-invoice"}},[t._v("Allow anyone to create invoice?")])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/FAQ/Stores/#invoice-expires-if-the-full-amount-has-not-been-paid-after-minutes"}},[t._v("Invoice expires if the full amount has not been paid after ... minutes?")])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/FAQ/Stores/#payment-invalid-if-transactions-fails-to-confirm-minutes-after-invoice-expiration"}},[t._v("Payment invalid if transactions fails to confirm ... minutes after invoice expiration?")])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/FAQ/Stores/#consider-the-invoice-confirmed-when-the-payment-transaction"}},[t._v("Consider the invoice confirmed when the payment transaction?")])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/FAQ/Stores/#consider-the-invoice-paid-even-if-the-paid-amount-is-less-than-expected"}},[t._v("Consider the invoice paid even if the paid amount is ... % less than expected?")])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/FAQ/Stores/#how-to-disable-email-on-invoices"}},[t._v("How to disable email on invoices?")])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/FAQ/Stores/#how-to-denominate-invoices-in-sats"}},[t._v("How to denominate invoices in sats?")])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/FAQ/Stores/#how-to-collect-additional-buyer-information"}},[t._v("How to collect additional buyer information?")])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/FAQ/Stores/#how-to-redirect-store-invoices-after-payment"}},[t._v("How to redirect store invoices after payment?")])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/FAQ/Stores/#can-i-delete-invoices-from-btcpay"}},[t._v("Can I delete invoices from BTCPay?")])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/FAQ/Stores/#how-to-change-the-exchange-rate-provider-for-invoices"}},[t._v("How to change the exchange rate provider for invoices?")])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/FAQ/Stores/#getting-getratesasync-was-called-on-coinaverage-error"}},[t._v("Getting GetRatesAsync was called on coinaverage error")])],1)]),t._v(" "),e("h2",{attrs:{id:"wallet-faq"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#wallet-faq"}},[t._v("#")]),t._v(" "),e("RouterLink",{attrs:{to:"/FAQ/Wallet/"}},[t._v("Wallet FAQ")])],1),t._v(" "),e("p",[t._v("Here are some of the questions and problems about wallets in BTCPay.")]),t._v(" "),e("ul",[e("li",[e("RouterLink",{attrs:{to:"/FAQ/Wallet/#what-is-btcpay-server-wallet"}},[t._v("What is BTCPay Server wallet?")])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/FAQ/Wallet/#how-to-set-up-my-wallet-with-btcpay-server"}},[t._v("How to set up my wallet with BTCPay Server?")])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/FAQ/Wallet/#can-i-use-a-hardware-wallet-with-btcpay-server"}},[t._v("Can I use a hardware wallet with BTCPay Server?")])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/FAQ/Wallet/#do-i-have-to-use-btcpay-server-wallet"}},[t._v("Do I have to use BTCPay Server wallet?")])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/FAQ/Wallet/#why-is-sending-a-transaction-using-trezor-failing"}},[t._v("Why is sending a transaction using Trezor failing?")])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/FAQ/Wallet/#missing-payments-in-my-software-or-hardware-wallet"}},[t._v("Missing payments in wallet?")])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/FAQ/Wallet/#what-is-a-derivation-scheme"}},[t._v("What is a derivation scheme?")])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/FAQ/Wallet/#what-is-a-replace-by-fee-rbf-transaction"}},[t._v("What is a Replace-By-Fee (RBF) transaction?")])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/FAQ/Wallet/#how-to-add-custom-labels-and-comments-to-transactions"}},[t._v("How to add custom labels and comments to transactions?")])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/FAQ/Wallet/#i-dont-see-lightning-network-payments-in-btcpay-wallet"}},[t._v("I don't see Lightning network payments in BTCPay wallet?")])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/FAQ/Wallet/#is-there-a-mobile-app-for-btcpay-server-wallet"}},[t._v("Is there a mobile app for BTCPay Server wallet?")])],1)]),t._v(" "),e("h2",{attrs:{id:"apps-faq"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#apps-faq"}},[t._v("#")]),t._v(" "),e("RouterLink",{attrs:{to:"/FAQ/Apps/"}},[t._v("Apps FAQ")])],1),t._v(" "),e("p",[t._v("Frequent questions about the applications in BTCPay.")]),t._v(" "),e("ul",[e("li",[e("RouterLink",{attrs:{to:"/FAQ/Apps/#what-are-the-apps-in-btcpay"}},[t._v("What are the Apps in BTCPay?")])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/FAQ/Apps/#is-there-a-limit-on-the-number-of-apps-i-can-create"}},[t._v("Is there a limit on the number of Apps I can create?")])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/FAQ/Apps/#is-there-a-point-of-sale-feature-in-btcpay"}},[t._v("Is there a Point of Sale feature in BTCPay?")])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/FAQ/Apps/#how-can-i-use-btcpay-in-a-physical-store"}},[t._v("How can I use BTCPay in a physical store?")])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/FAQ/Apps/#how-to-customize-the-appearance-of-Point-of-Sale-App-in-BTCPay"}},[t._v("How to customize the appearance of POS in BTCPay?")])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/FAQ/Apps/#what-is-a-payment-button"}},[t._v("What is a Payment Button?")])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/FAQ/Apps/#how-to-create-a-pay-button-with-a-custom-amount"}},[t._v("How to create a Pay Button with a custom amount?")])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/FAQ/Apps/#how-to-map-a-domain-name-to-an-app"}},[t._v("How to map a domain name to an app?")])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/FAQ/Apps/#how-to-redirect-to-another-site-after-payment"}},[t._v("How to redirect to another site after payment?")])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/FAQ/Apps/#how-to-integrate-woocommerce-store-into-a-btcpay-crowdfund-app"}},[t._v("How to integrate WooCommerce Store in BTCPay Crowdfund app?")])],1)]),t._v(" "),e("h2",{attrs:{id:"lightning-network-faq"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#lightning-network-faq"}},[t._v("#")]),t._v(" "),e("RouterLink",{attrs:{to:"/FAQ/LightningNetwork/"}},[t._v("Lightning Network FAQ")])],1),t._v(" "),e("p",[t._v("Lightning Network troubleshooting and common problems.")]),t._v(" "),e("h3",{attrs:{id:"lightning-network-general-faq"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#lightning-network-general-faq"}},[t._v("#")]),t._v(" "),e("RouterLink",{attrs:{to:"/FAQ/LightningNetwork/#lightning-network-general-faq"}},[t._v("Lightning Network General FAQ")])],1),t._v(" "),e("ul",[e("li",[e("RouterLink",{attrs:{to:"/FAQ/LightningNetwork/#how-many-users-can-use-lightning-network-in-btcpay"}},[t._v("How many users can use Lightning Network in BTCPay?")])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/FAQ/LightningNetwork/#how-to-find-node-info-and-open-a-direct-channel-with-a-store-using-btcpay"}},[t._v("How to find node info and open a direct channel with a store using BTCPay?")])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/FAQ/LightningNetwork/#as-a-merchant-do-i-need-to-open-direct-channels"}},[t._v("As a merchant, do I need to open direct channels?")])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/FAQ/LightningNetwork/#how-can-i-get-inbound-capacity-to-my-node"}},[t._v("How can I get inbound capacity to my node?")])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/FAQ/LightningNetwork/#i-previously-installed-btcpayserver-without-lightning-can-i-enable-it"}},[t._v("Previously installed BTCPay without Lightning, can I enable it?")])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/FAQ/LightningNetwork/#can-i-use-a-pruned-node-with-ln-in-btcpay"}},[t._v("Can I use a pruned node with LN in BTCPay?")])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/FAQ/LightningNetwork/#can-i-use-my-existing-ln-node-with-btcpay"}},[t._v("Can I use my existing LN node with BTCPay?")])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/FAQ/LightningNetwork/#how-to-change-from-core-lightning-cln-to-lnd-or-vice-versa"}},[t._v("How to change from Core Lightning (CLN) to LND or vice-versa?")])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/FAQ/LightningNetwork/#i-switched-lightning-network-implementation-but-getting-no-payment-available-error"}},[t._v('Switched Lightning Network implementation, getting "no payment available" error')])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/FAQ/LightningNetwork/#i-get-warning-the-lightning-alias-variable-is-not-set-defaulting-to-a-blank-string-when-starting-container"}},[t._v('WARNING: The LIGHTNING_ALIAS variable is not set. Defaulting to a blank string" when starting container')])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/FAQ/LightningNetwork/#how-to-display-my-lightning-node-information-so-that-others-can-connect-to-me"}},[t._v("How to display my Lightning Node information so that others can connect to me?")])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/FAQ/LightningNetwork/#where-can-i-find-recovery-seed-backup-for-my-lightning-network-wallet-in-btcpay-server"}},[t._v("Where can I find recovery seed backup for my Lightning Network wallet in BTCPay Server?")])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/FAQ/LightningNetwork/#how-to-disable-on-chain-payments-and-use-ln-payments-only"}},[t._v("How to disable on-chain payments and use LN payments only?")])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/FAQ/LightningNetwork/#lightning-network-questions-and-support"}},[t._v("Where can I get Lightning Network Support?")])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/FAQ/LightningNetwork/#how-to-see-my-lightning-network-version"}},[t._v("How to see my Lightning Network version?")])],1)]),t._v(" "),e("h3",{attrs:{id:"lightning-network-lnd-faq"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#lightning-network-lnd-faq"}},[t._v("#")]),t._v(" "),e("RouterLink",{attrs:{to:"/FAQ/LightningNetwork/#lightning-network-lnd-faq"}},[t._v("Lightning Network LND FAQ")])],1),t._v(" "),e("ul",[e("li",[e("RouterLink",{attrs:{to:"/FAQ/LightningNetwork/#how-to-restart-my-lnd"}},[t._v("How to restart my LND?")])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/FAQ/LightningNetwork/#how-to-see-lnd-logs"}},[t._v("How to see LND logs?")])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/FAQ/LightningNetwork/#what-s-the-default-directory-of-lnd-in-btcpay"}},[t._v("What’s the default LND Directory in BTCPay?")])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/FAQ/LightningNetwork/#which-macaroon-needs-to-be-provided-for-external-nodes"}},[t._v("Which macaroon needs to be provided for external nodes?")])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/FAQ/LightningNetwork/#lnd-connection-issues-after-an-update"}},[t._v("LND connection issue - cannot get macaroon: root key with id 0 doesn’t exist")])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/FAQ/LightningNetwork/#how-to-change-my-LND-Node-alias"}},[t._v("How to change LND Node alias")])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/FAQ/LightningNetwork/#how-to-edit-lndconf"}},[t._v("How to edit lnd.conf")])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/FAQ/LightningNetwork/#how-to-install-thunderhub"}},[t._v("How to install ThunderHub")])],1)]),t._v(" "),e("h3",{attrs:{id:"lightning-network-core-lightning-cln-faq"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#lightning-network-core-lightning-cln-faq"}},[t._v("#")]),t._v(" "),e("RouterLink",{attrs:{to:"/FAQ/LightningNetwork/#lightning-network-core-lightning-cln-faq"}},[t._v("Lightning Network Core Lightning (CLN) FAQ")])],1),t._v(" "),e("ul",[e("li",[e("RouterLink",{attrs:{to:"/FAQ/LightningNetwork/#how-to-restart-my-core-lightning-cln"}},[t._v("How to restart my Core Lightning (CLN)?")])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/FAQ/LightningNetwork/#how-to-announce-an-ipv6-address"}},[t._v("How to announce an IPv6 address?")])],1)]),t._v(" "),e("h2",{attrs:{id:"altcoins-faq"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#altcoins-faq"}},[t._v("#")]),t._v(" "),e("RouterLink",{attrs:{to:"/FAQ/Altcoin/"}},[t._v("Altcoins FAQ")])],1),t._v(" "),e("ul",[e("li",[e("RouterLink",{attrs:{to:"/FAQ/Altcoin/#which-coins-does-btcpay-server-support"}},[t._v("Which coins does BTCPay Server support?")])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/FAQ/Altcoin/#can-an-xyz-coin-be-added-in-btcpay"}},[t._v("Can an XYZ coin be added in BTCPay?")])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/FAQ/Altcoin/#how-to-add-an-altcoin-in-btcpay"}},[t._v("How to add an altcoin to BTCPay?")])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/FAQ/Altcoin/#how-to-add-an-altcoin-to-an-existing-btcpay-deployment"}},[t._v("How to add an altcoin to an existing BTCPay deployment?")])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/FAQ/Altcoin/#how-to-remove-a-coin-from-btcpay"}},[t._v("How to remove a coin from BTCPay?")])],1)])])}),[],!1,null,null,null);e.default=n.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[139],{781:function(t,e,o){"use strict";o.r(e);var a=o(10),n=Object(a.a)({},(function(){var t=this,e=t._self._c;return e("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[e("h1",{attrs:{id:"frequently-asked-questions-and-common-issues"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#frequently-asked-questions-and-common-issues"}},[t._v("#")]),t._v(" Frequently Asked Questions and Common Issues")]),t._v(" "),e("p",[t._v("This document contains a Table of contents to all FAQ and common issues.")]),t._v(" "),e("h2",{attrs:{id:"general-faq"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#general-faq"}},[t._v("#")]),t._v(" "),e("RouterLink",{attrs:{to:"/FAQ/General/"}},[t._v("General FAQ")])],1),t._v(" "),e("p",[t._v("General, non-technical questions about BTCPay. What it is, how it works, what are its features, why is it different and who can use it.")]),t._v(" "),e("ul",[e("li",[e("RouterLink",{attrs:{to:"/FAQ/General/#what-is-btcpay-server"}},[t._v("What is BTCPay Server?")])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/FAQ/General/#why-should-i-choose-btcpay-over-other-processors"}},[t._v("Why should I choose BTCPay over other processors?")])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/FAQ/General/#why-is-everyone-so-excited-about-btcpay"}},[t._v("Why is everyone so excited about BTCPay?")])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/FAQ/General/#who-can-use-btcpay"}},[t._v("Who can use BTCPay?")])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/FAQ/General/#how-to-install-btcpay-server"}},[t._v("How to install BTCPay?")])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/FAQ/General/#where-to-find-btcpay-video-tutorials"}},[t._v("Where to find BTCPay video tutorials?")])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/FAQ/General/#do-i-need-to-have-an-online-store-to-use-btcpay-server"}},[t._v("Do I need to have an online store to use BTCPay Server?")])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/FAQ/General/#why-cant-i-just-give-my-bitcoin-address-to-a-buyer"}},[t._v("Why can't I just give my public address to a buyer?")])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/FAQ/General/#how-does-btcpay-create-a-new-address-for-each-invoice"}},[t._v("How does BTCPay create a new address for each invoice?")])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/FAQ/General/#does-btcpay-need-myprivate-key"}},[t._v("Does BTCPay need my private key?")])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/FAQ/General/#does-btcpay-server-support-crypto-to-fiat-conversion"}},[t._v("Does BTCPay Server support crypto to fiat conversion?")])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/FAQ/General/#what-if-i-have-a-problem-paying-an-invoice"}},[t._v("What if I have a problem paying a BTCPay Server invoice?")])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/FAQ/General/#what-if-i-have-a-problem-with-a-paid-invoice"}},[t._v("What if I have a problem with a paid invoice?")])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/FAQ/General/#where-can-i-get-help-and-support"}},[t._v("Where can I get help and support?")])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/FAQ/General/#how-can-i-contribute-to-btcpay"}},[t._v("How can I contribute to BTCPay?")])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/FAQ/General/#how-can-i-use-the-btcpay-server-api"}},[t._v("How can I use the BTCPay Server API?")])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/FAQ/General/#how-can-i-backup-my-btcpay-server"}},[t._v("How can I backup my BTCPay Server?")])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/FAQ/General/#how-can-i-charge-for-using-my-btcpay-server-instance"}},[t._v("How can I charge for using my BTCPay Server instance?")])],1)]),t._v(" "),e("h2",{attrs:{id:"deployment-faq"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#deployment-faq"}},[t._v("#")]),t._v(" "),e("RouterLink",{attrs:{to:"/FAQ/Deployment/"}},[t._v("Deployment FAQ")])],1),t._v(" "),e("p",[t._v("Questions and solutions to BTCPay installation.")]),t._v(" "),e("h3",{attrs:{id:"general-deployment-faq"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#general-deployment-faq"}},[t._v("#")]),t._v(" "),e("RouterLink",{attrs:{to:"/FAQ/Deployment/#general-deployment-faq"}},[t._v("General Deployment FAQ")])],1),t._v(" "),e("ul",[e("li",[e("RouterLink",{attrs:{to:"/FAQ/Deployment/#how-much-does-it-cost-to-run-btcpay-server"}},[t._v("How much does it cost to run BTCPay Server?")])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/FAQ/Deployment/#what-are-the-minimal-requirements-for-btcpay"}},[t._v("What are the minimal requirements for BTCPay?")])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/FAQ/Deployment/#what-is-the-easiest-method-to-deploy-a-self-hosted-btcpay-server"}},[t._v("What is the easiest method to deploy a self-hosted BTCPay Server?")])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/FAQ/Deployment/#how-to-choose-a-proper-deployment-method"}},[t._v("How to choose a proper deployment method?")])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/FAQ/FAQ-Deployment/#can-i-run-btcpay-on-my-home-computer"}},[t._v("Why do I need a VPS? Can't I just run BTCPay on my home computer?")])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/FAQ/Deployment/#can-i-run-btcpay-on-my-own-hardware"}},[t._v("Can I run BTCPay on my hardware?")])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/FAQ/Deployment/#can-i-deploy-btcpay-on-my-existing-vps"}},[t._v("Can I deploy on my existing VPS?")])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/FAQ/Deployment/#are-there-free-hosts-where-i-can-test"}},[t._v("Are there free hosts where I can test?")])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/FAQ/Deployment/#after-initial-deployment-i-can-t-register-and-i-don-t-have-a-login-yet"}},[t._v("After initial deployment, I can't register and I don't have a login yet?")])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/FAQ/Deployment/#how-do-i-activate-tor-on-my-btcpay-server"}},[t._v("How do I activate Tor on my BTCPay Server?")])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/FAQ/Deployment/#how-do-i-disable-tor-on-my-btcpay-server"}},[t._v("How do I disable Tor on my BTCPay Server?")])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/FAQ/Deployment/#why-activate-tor-does-it-mean-that-nobody-knows-who-i-am"}},[t._v("Why activate Tor? Does it mean that nobody knows who I am?")])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/FAQ/Deployment/#how-to-access-the-onion-address-without-clearnet"}},[t._v("How to access the .onion address without clearnet?")])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/FAQ/Deployment/#how-can-i-modify-or-deactivate-environment-variables"}},[t._v("How can I modify or deactivate environment variables?")])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/FAQ/Deployment/#how-can-i-run-btcpay-on-testnet"}},[t._v("How can I run BTCPay on testnet?")])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/FAQ/Deployment/#can-i-start-btcpay-only-when-i-m-expecting-a-payment"}},[t._v("Can I start BTCPay only when I'm expecting a payment?")])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/FAQ/Deployment/#can-i-connect-to-my-btcpay-bitcoin-p2p-on-port-8333"}},[t._v("Can I connect to my BTCPay Bitcoin P2P on port 8333?")])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/FAQ/Deployment/#how-can-i-renew-my-ssl-certificate"}},[t._v("How can I renew my SSL certificate?")])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/FAQ/Deployment/#can-i-use-an-existing-nginx-server-as-a-reverse-proxy-with-ssl-termination"}},[t._v("Can I use an existing Nginx server as a reverse proxy with SSL termination?")])],1)]),t._v(" "),e("h3",{attrs:{id:"web-deployment-faq"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#web-deployment-faq"}},[t._v("#")]),t._v(" "),e("RouterLink",{attrs:{to:"/FAQ/Deployment/#web-deployment-faq"}},[t._v("Web Deployment FAQ")])],1),t._v(" "),e("h4",{attrs:{id:"luna-node-web-deployment-faq"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#luna-node-web-deployment-faq"}},[t._v("#")]),t._v(" "),e("RouterLink",{attrs:{to:"/FAQ/Deployment/#luna-node-web-deployment-faq"}},[t._v("Luna Node Web Deployment FAQ")])],1),t._v(" "),e("ul",[e("li",[e("RouterLink",{attrs:{to:"/FAQ/Deployment/#how-to-change-domain-name-on-my-lunanode-btcpay"}},[t._v("How to change domain name on my LunaNode BTCPay?")])],1)]),t._v(" "),e("h3",{attrs:{id:"manual-deployment-faq"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#manual-deployment-faq"}},[t._v("#")]),t._v(" "),e("RouterLink",{attrs:{to:"/FAQ/Deployment/#manual-deployment"}},[t._v("Manual Deployment FAQ")])],1),t._v(" "),e("ul",[e("li",[e("RouterLink",{attrs:{to:"/FAQ/Deployment/#how-to-manually-install-btcpay-on-ubuntu-18-04"}},[t._v("How to manually install BTCPay on Ubuntu 18.04?")])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/FAQ/Deployment/#how-do-i-completely-uninstall-btcpay-from-a-linux-environment-docker-version"}},[t._v("How do I completely uninstall BTCPay from a linux environment (docker version)")])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/FAQ/Deployment/#how-to-deploy-btcpay-server-alongside-existing-bitcoin-node"}},[t._v("How to deploy BTCPay Server alongside existing Bitcoin full node?")])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/FAQ/Deployment/#with-the-docker-deployment-how-to-use-a-different-volume-for-the-data"}},[t._v("With the docker deployment, how to use a different volume for the data?")])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/FAQ/Deployment/#cause-4-getting-500-nginx-error-on-a-local-server-https-and-for-http-btcpay-is-expecting-you-to-access-this-website-from"}},[t._v("Getting 500 nginx error on a local server https and for http (BTCPay is expecting you to access this website from)")])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/FAQ/Deployment/#cause-3-btcpay-is-expecting-you-to-access-this-website-from"}},[t._v("Error: BTCPay is expecting you to access this website from...")])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/FAQ/Deployment/#cause-3-btcpay-is-expecting-you-to-access-this-website-from"}},[t._v("You access BTCPay Server over an unsecured network")])],1)]),t._v(" "),e("h2",{attrs:{id:"synchronization-faq"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#synchronization-faq"}},[t._v("#")]),t._v(" "),e("RouterLink",{attrs:{to:"/FAQ/Synchronization/"}},[t._v("Synchronization FAQ")])],1),t._v(" "),e("p",[t._v("Common questions and issues that may occur during the initial sync of BTCPay.")]),t._v(" "),e("ul",[e("li",[e("RouterLink",{attrs:{to:"/FAQ/Synchronization/#why-does-btcpay-sync"}},[t._v("Why does BTCPay sync?")])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/FAQ/Synchronization/#can-i-skip-the-synchronization"}},[t._v("Can I skip/speed up the sync?")])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/FAQ/Synchronization/#how-do-i-know-that-btcpay-synced-completely"}},[t._v("How do I know that the sync is finished?")])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/FAQ/Synchronization/#how-can-i-check-the-block-height-of-my-bitcoin-node"}},[t._v("How can I check the block height of my bitcoin node?")])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/FAQ/Synchronization/#btcpay-server-takes-forever-to-synchronize"}},[t._v("BTCPay takes forever to synchronize")])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/FAQ/Synchronization/#btcpay-server-keeps-showing-that-my-node-is-always-starting"}},[t._v("BTCPay Server keeps showing that my node is always starting")])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/FAQ/Synchronization/#im-running-a-full-node-and-have-a-synched-blockchain-can-btcpay-use-it-so-that-it-doesnt-have-to-do-a-full-sync"}},[t._v("I already have a synced full node, can I use it with BTCPay?")])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/FAQ/Synchronization/#how-to-enable-bitcoin-node-pruning"}},[t._v("How to enable Bitcoin node pruning?")])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/FAQ/Synchronization/#how-to-disable-bitcoin-node-pruning"}},[t._v("How to disable Bitcoin node pruning?")])],1)]),t._v(" "),e("h2",{attrs:{id:"integrations-faq"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#integrations-faq"}},[t._v("#")]),t._v(" "),e("RouterLink",{attrs:{to:"/FAQ/Integrations/"}},[t._v("Integrations FAQ")])],1),t._v(" "),e("p",[t._v("Questions about e-commerce and other integrations.")]),t._v(" "),e("h3",{attrs:{id:"integrations-general"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#integrations-general"}},[t._v("#")]),t._v(" "),e("RouterLink",{attrs:{to:"/FAQ/Integrations/#integrations-general-faq"}},[t._v("Integrations General")])],1),t._v(" "),e("ul",[e("li",[e("RouterLink",{attrs:{to:"/FAQ/Integrations/#what-e-commerce-integrations-are-available"}},[t._v("What e-commerce integrations are available?")])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/FAQ/Integrations/#does-btcpay-have-a-shopify-plugin"}},[t._v("Does BTCPay have a Shopify plugin?")])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/FAQ/Integrations/#can-i-use-btcpay-without-an-integration"}},[t._v("Can I use BTCPay without an integration?")])],1)]),t._v(" "),e("h3",{attrs:{id:"woocommerce-faq"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#woocommerce-faq"}},[t._v("#")]),t._v(" "),e("RouterLink",{attrs:{to:"/FAQ/Integrations/#woocommerce-faq-2"}},[t._v("WooCommerce FAQ")])],1),t._v(" "),e("ul",[e("li",[e("RouterLink",{attrs:{to:"/FAQ/Integrations/#how-to-configure-order-status-in-woocommerce"}},[t._v("How to configure order status in WooCommerce?")])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/FAQ/Integrations/#how-to-customize-e-mail-confirmations-in-woocommerce"}},[t._v("How to customize e-mail confirmations in WooCommerce?")])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/FAQ/Integrations/#error-if-you-use-an-alternative-order-numbering-system-please-see-class-wc-gateway-btcpayphp-to-apply-a-search-filter"}},[t._v("Error: If you use an alternative order numbering system, please see class-wc-gateway-btcpay.php to apply a search filter")])],1)]),t._v(" "),e("h2",{attrs:{id:"server-settings-faq"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#server-settings-faq"}},[t._v("#")]),t._v(" "),e("RouterLink",{attrs:{to:"/FAQ/ServerSettings/"}},[t._v("Server Settings FAQ")])],1),t._v(" "),e("p",[t._v("Common problems and questions server admins have.")]),t._v(" "),e("h3",{attrs:{id:"maintenance-faq"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#maintenance-faq"}},[t._v("#")]),t._v(" "),e("RouterLink",{attrs:{to:"/FAQ/ServerSettings/#maintainance"}},[t._v("Maintenance FAQ")])],1),t._v(" "),e("ul",[e("li",[e("RouterLink",{attrs:{to:"/FAQ/ServerSettings/#how-to-update-btcpay-server"}},[t._v("How to update BTCPay Server?")])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/FAQ/ServerSettings/#how-to-restart-btcpay-server"}},[t._v("How to restart BTCPay Server?")])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/FAQ/ServerSettings/#how-to-ssh-into-my-btcpay-running-on-vps"}},[t._v("How to SSH into my BTCPay running on VPS?")])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/FAQ/ServerSettings/#how-can-i-see-my-btcpay-version"}},[t._v("How can I check my BTCPay Server version?")])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/FAQ/ServerSettings/#how-can-i-check-my-btcpay-server-version-via-terminal"}},[t._v("How can I check my BTCPay Server version via terminal?")])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/FAQ/ServerSettings/#what-is-btcpay-ssh-key-file"}},[t._v("What is BTCPay SSH key file")])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/FAQ/ServerSettings/#forgot-btcpay-admin-password"}},[t._v("Forgot BTCPay Admin password")])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/FAQ/ServerSettings/#how-to-add-a-new-user-by-invite"}},[t._v("How to add a new user by invite?")])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/FAQ/ServerSettings/#how-to-disable-u2f-and-2fa-for-a-user"}},[t._v("How to disable U2F and 2FA for a user?")])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/FAQ/ServerSettings/#how-to-configure-smtp-settings-in-btcpay"}},[t._v("How to configure SMTP settings in BTCPay?")])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/FAQ/ServerSettings/#error-maintenance-feature-requires-access-to-SSH-properly-configured-in-btcpayserver-configuration"}},[t._v("Error: Maintenance feature requires access to SSH properly configured in BTCPayServer configuration")])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/FAQ/ServerSettings/#error-your-local-changes-to-the-following-files-would-be-overwritten-by-merge"}},[t._v("Error: Your local changes to the following files would be overwritten by merge")])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/FAQ/ServerSettings/#error-btcpay-sshkeyfile-is-not-set-when-running-the-docker-install-or-unable-to-update-through-server-settings-maintenance"}},[t._v("Error: the BTCPAY_SSHKEYFILE variable is not set/ Unable to update")])],1)]),t._v(" "),e("h3",{attrs:{id:"theme-customization-faq"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#theme-customization-faq"}},[t._v("#")]),t._v(" "),e("RouterLink",{attrs:{to:"/FAQ/ServerSettings/#theme-customization"}},[t._v("Theme / Customization FAQ")])],1),t._v(" "),e("ul",[e("li",[e("RouterLink",{attrs:{to:"/FAQ/ServerSettings/#how-to-customize-my-btcpay-theme-style"}},[t._v("How to customize my BTCPay theme style?")])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/FAQ/ServerSettings/#how-to-modify-the-checkout-page"}},[t._v("How to modify BTCPay the checkout page?")])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/Development/Theme/#2-bootstrap-themes"}},[t._v("How to customize the POS app theme?")])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/FAQ/ServerSettings/#how-to-add-google-analytics-code-to-btcpay"}},[t._v("How to add Google Analytics code to BTCPay?")])],1)]),t._v(" "),e("h3",{attrs:{id:"policies-faq"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#policies-faq"}},[t._v("#")]),t._v(" "),e("RouterLink",{attrs:{to:"/FAQ/ServerSettings/#policies"}},[t._v("Policies FAQ")])],1),t._v(" "),e("ul",[e("li",[e("RouterLink",{attrs:{to:"/FAQ/ServerSettings/#how-to-allow-registration-on-my-btcpay-server"}},[t._v("How to allow registration on my BTCPay Server?")])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/FAQ/ServerSettings/#how-to-hide-my-btcpay-server-from-search-engines"}},[t._v("How to hide my BTCPay Server from Search Engines?")])],1)]),t._v(" "),e("h3",{attrs:{id:"services-faq"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#services-faq"}},[t._v("#")]),t._v(" "),e("RouterLink",{attrs:{to:"/FAQ/ServerSettings/#services"}},[t._v("Services FAQ")])],1),t._v(" "),e("ul",[e("li",[e("RouterLink",{attrs:{to:"/FAQ/ServerSettings/#how-to-remotely-connect-to-my-btcpay-full-node"}},[t._v("How to remotely connect to my BTCPay full node?")])],1)]),t._v(" "),e("h3",{attrs:{id:"files-faq"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#files-faq"}},[t._v("#")]),t._v(" "),e("RouterLink",{attrs:{to:"/FAQ/ServerSettings/#files"}},[t._v("Files FAQ")])],1),t._v(" "),e("ul",[e("li",[e("RouterLink",{attrs:{to:"/FAQ/ServerSettings/#how-to-upload-files-to-btcpay"}},[t._v("How to upload files to BTCPay?")])],1)]),t._v(" "),e("h2",{attrs:{id:"stores-faq"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#stores-faq"}},[t._v("#")]),t._v(" "),e("RouterLink",{attrs:{to:"/FAQ/Stores/"}},[t._v("Stores FAQ")])],1),t._v(" "),e("p",[t._v("Store settings explained.")]),t._v(" "),e("ul",[e("li",[e("RouterLink",{attrs:{to:"/FAQ/Stores/#how-to-create-a-store-in-btcpay"}},[t._v("How to create a store in BTCPay?")])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/FAQ/Stores/#how-many-stores-can-i-create"}},[t._v("How many stores can I create?")])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/FAQ/Stores/#why-are-invoices-without-payment-showing-as-complete"}},[t._v("Why are invoices without payment showing as complete?")])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/FAQ/Stores/#store-general-settings"}},[t._v("Store General Settings")])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/FAQ/Stores/#add-network-fee-to-invoice-vary-with-mining-fees"}},[t._v("Add network fee to invoice (vary with mining fees)?")])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/FAQ/Stores/#allow-anyone-to-create-invoice"}},[t._v("Allow anyone to create invoice?")])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/FAQ/Stores/#invoice-expires-if-the-full-amount-has-not-been-paid-after-minutes"}},[t._v("Invoice expires if the full amount has not been paid after ... minutes?")])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/FAQ/Stores/#payment-invalid-if-transactions-fails-to-confirm-minutes-after-invoice-expiration"}},[t._v("Payment invalid if transactions fails to confirm ... minutes after invoice expiration?")])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/FAQ/Stores/#consider-the-invoice-confirmed-when-the-payment-transaction"}},[t._v("Consider the invoice confirmed when the payment transaction?")])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/FAQ/Stores/#consider-the-invoice-paid-even-if-the-paid-amount-is-less-than-expected"}},[t._v("Consider the invoice paid even if the paid amount is ... % less than expected?")])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/FAQ/Stores/#how-to-disable-email-on-invoices"}},[t._v("How to disable email on invoices?")])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/FAQ/Stores/#how-to-denominate-invoices-in-sats"}},[t._v("How to denominate invoices in sats?")])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/FAQ/Stores/#how-to-collect-additional-buyer-information"}},[t._v("How to collect additional buyer information?")])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/FAQ/Stores/#how-to-redirect-store-invoices-after-payment"}},[t._v("How to redirect store invoices after payment?")])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/FAQ/Stores/#can-i-delete-invoices-from-btcpay"}},[t._v("Can I delete invoices from BTCPay?")])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/FAQ/Stores/#how-to-change-the-exchange-rate-provider-for-invoices"}},[t._v("How to change the exchange rate provider for invoices?")])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/FAQ/Stores/#getting-getratesasync-was-called-on-coinaverage-error"}},[t._v("Getting GetRatesAsync was called on coinaverage error")])],1)]),t._v(" "),e("h2",{attrs:{id:"wallet-faq"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#wallet-faq"}},[t._v("#")]),t._v(" "),e("RouterLink",{attrs:{to:"/FAQ/Wallet/"}},[t._v("Wallet FAQ")])],1),t._v(" "),e("p",[t._v("Here are some of the questions and problems about wallets in BTCPay.")]),t._v(" "),e("ul",[e("li",[e("RouterLink",{attrs:{to:"/FAQ/Wallet/#what-is-btcpay-server-wallet"}},[t._v("What is BTCPay Server wallet?")])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/FAQ/Wallet/#how-to-set-up-my-wallet-with-btcpay-server"}},[t._v("How to set up my wallet with BTCPay Server?")])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/FAQ/Wallet/#can-i-use-a-hardware-wallet-with-btcpay-server"}},[t._v("Can I use a hardware wallet with BTCPay Server?")])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/FAQ/Wallet/#do-i-have-to-use-btcpay-server-wallet"}},[t._v("Do I have to use BTCPay Server wallet?")])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/FAQ/Wallet/#why-is-sending-a-transaction-using-trezor-failing"}},[t._v("Why is sending a transaction using Trezor failing?")])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/FAQ/Wallet/#missing-payments-in-my-software-or-hardware-wallet"}},[t._v("Missing payments in wallet?")])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/FAQ/Wallet/#what-is-a-derivation-scheme"}},[t._v("What is a derivation scheme?")])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/FAQ/Wallet/#what-is-a-replace-by-fee-rbf-transaction"}},[t._v("What is a Replace-By-Fee (RBF) transaction?")])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/FAQ/Wallet/#how-to-add-custom-labels-and-comments-to-transactions"}},[t._v("How to add custom labels and comments to transactions?")])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/FAQ/Wallet/#i-dont-see-lightning-network-payments-in-btcpay-wallet"}},[t._v("I don't see Lightning network payments in BTCPay wallet?")])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/FAQ/Wallet/#is-there-a-mobile-app-for-btcpay-server-wallet"}},[t._v("Is there a mobile app for BTCPay Server wallet?")])],1)]),t._v(" "),e("h2",{attrs:{id:"apps-faq"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#apps-faq"}},[t._v("#")]),t._v(" "),e("RouterLink",{attrs:{to:"/FAQ/Apps/"}},[t._v("Apps FAQ")])],1),t._v(" "),e("p",[t._v("Frequent questions about the applications in BTCPay.")]),t._v(" "),e("ul",[e("li",[e("RouterLink",{attrs:{to:"/FAQ/Apps/#what-are-the-apps-in-btcpay"}},[t._v("What are the Apps in BTCPay?")])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/FAQ/Apps/#is-there-a-limit-on-the-number-of-apps-i-can-create"}},[t._v("Is there a limit on the number of Apps I can create?")])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/FAQ/Apps/#is-there-a-point-of-sale-feature-in-btcpay"}},[t._v("Is there a Point of Sale feature in BTCPay?")])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/FAQ/Apps/#how-can-i-use-btcpay-in-a-physical-store"}},[t._v("How can I use BTCPay in a physical store?")])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/FAQ/Apps/#how-to-customize-the-appearance-of-Point-of-Sale-App-in-BTCPay"}},[t._v("How to customize the appearance of POS in BTCPay?")])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/FAQ/Apps/#what-is-a-payment-button"}},[t._v("What is a Payment Button?")])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/FAQ/Apps/#how-to-create-a-pay-button-with-a-custom-amount"}},[t._v("How to create a Pay Button with a custom amount?")])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/FAQ/Apps/#how-to-map-a-domain-name-to-an-app"}},[t._v("How to map a domain name to an app?")])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/FAQ/Apps/#how-to-redirect-to-another-site-after-payment"}},[t._v("How to redirect to another site after payment?")])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/FAQ/Apps/#how-to-integrate-woocommerce-store-into-a-btcpay-crowdfund-app"}},[t._v("How to integrate WooCommerce Store in BTCPay Crowdfund app?")])],1)]),t._v(" "),e("h2",{attrs:{id:"lightning-network-faq"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#lightning-network-faq"}},[t._v("#")]),t._v(" "),e("RouterLink",{attrs:{to:"/FAQ/LightningNetwork/"}},[t._v("Lightning Network FAQ")])],1),t._v(" "),e("p",[t._v("Lightning Network troubleshooting and common problems.")]),t._v(" "),e("h3",{attrs:{id:"lightning-network-general-faq"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#lightning-network-general-faq"}},[t._v("#")]),t._v(" "),e("RouterLink",{attrs:{to:"/FAQ/LightningNetwork/#lightning-network-general-faq"}},[t._v("Lightning Network General FAQ")])],1),t._v(" "),e("ul",[e("li",[e("RouterLink",{attrs:{to:"/FAQ/LightningNetwork/#how-many-users-can-use-lightning-network-in-btcpay"}},[t._v("How many users can use Lightning Network in BTCPay?")])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/FAQ/LightningNetwork/#how-to-find-node-info-and-open-a-direct-channel-with-a-store-using-btcpay"}},[t._v("How to find node info and open a direct channel with a store using BTCPay?")])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/FAQ/LightningNetwork/#as-a-merchant-do-i-need-to-open-direct-channels"}},[t._v("As a merchant, do I need to open direct channels?")])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/FAQ/LightningNetwork/#how-can-i-get-inbound-capacity-to-my-node"}},[t._v("How can I get inbound capacity to my node?")])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/FAQ/LightningNetwork/#i-previously-installed-btcpayserver-without-lightning-can-i-enable-it"}},[t._v("Previously installed BTCPay without Lightning, can I enable it?")])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/FAQ/LightningNetwork/#can-i-use-a-pruned-node-with-ln-in-btcpay"}},[t._v("Can I use a pruned node with LN in BTCPay?")])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/FAQ/LightningNetwork/#can-i-use-my-existing-ln-node-with-btcpay"}},[t._v("Can I use my existing LN node with BTCPay?")])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/FAQ/LightningNetwork/#how-to-change-from-core-lightning-cln-to-lnd-or-vice-versa"}},[t._v("How to change from Core Lightning (CLN) to LND or vice-versa?")])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/FAQ/LightningNetwork/#i-switched-lightning-network-implementation-but-getting-no-payment-available-error"}},[t._v('Switched Lightning Network implementation, getting "no payment available" error')])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/FAQ/LightningNetwork/#i-get-warning-the-lightning-alias-variable-is-not-set-defaulting-to-a-blank-string-when-starting-container"}},[t._v('WARNING: The LIGHTNING_ALIAS variable is not set. Defaulting to a blank string" when starting container')])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/FAQ/LightningNetwork/#how-to-display-my-lightning-node-information-so-that-others-can-connect-to-me"}},[t._v("How to display my Lightning Node information so that others can connect to me?")])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/FAQ/LightningNetwork/#where-can-i-find-recovery-seed-backup-for-my-lightning-network-wallet-in-btcpay-server"}},[t._v("Where can I find recovery seed backup for my Lightning Network wallet in BTCPay Server?")])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/FAQ/LightningNetwork/#how-to-disable-on-chain-payments-and-use-ln-payments-only"}},[t._v("How to disable on-chain payments and use LN payments only?")])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/FAQ/LightningNetwork/#lightning-network-questions-and-support"}},[t._v("Where can I get Lightning Network Support?")])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/FAQ/LightningNetwork/#how-to-see-my-lightning-network-version"}},[t._v("How to see my Lightning Network version?")])],1)]),t._v(" "),e("h3",{attrs:{id:"lightning-network-lnd-faq"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#lightning-network-lnd-faq"}},[t._v("#")]),t._v(" "),e("RouterLink",{attrs:{to:"/FAQ/LightningNetwork/#lightning-network-lnd-faq"}},[t._v("Lightning Network LND FAQ")])],1),t._v(" "),e("ul",[e("li",[e("RouterLink",{attrs:{to:"/FAQ/LightningNetwork/#how-to-restart-my-lnd"}},[t._v("How to restart my LND?")])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/FAQ/LightningNetwork/#how-to-see-lnd-logs"}},[t._v("How to see LND logs?")])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/FAQ/LightningNetwork/#what-s-the-default-directory-of-lnd-in-btcpay"}},[t._v("What’s the default LND Directory in BTCPay?")])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/FAQ/LightningNetwork/#which-macaroon-needs-to-be-provided-for-external-nodes"}},[t._v("Which macaroon needs to be provided for external nodes?")])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/FAQ/LightningNetwork/#lnd-connection-issues-after-an-update"}},[t._v("LND connection issue - cannot get macaroon: root key with id 0 doesn’t exist")])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/FAQ/LightningNetwork/#how-to-change-my-LND-Node-alias"}},[t._v("How to change LND Node alias")])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/FAQ/LightningNetwork/#how-to-edit-lndconf"}},[t._v("How to edit lnd.conf")])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/FAQ/LightningNetwork/#how-to-install-thunderhub"}},[t._v("How to install ThunderHub")])],1)]),t._v(" "),e("h3",{attrs:{id:"lightning-network-core-lightning-cln-faq"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#lightning-network-core-lightning-cln-faq"}},[t._v("#")]),t._v(" "),e("RouterLink",{attrs:{to:"/FAQ/LightningNetwork/#lightning-network-core-lightning-cln-faq"}},[t._v("Lightning Network Core Lightning (CLN) FAQ")])],1),t._v(" "),e("ul",[e("li",[e("RouterLink",{attrs:{to:"/FAQ/LightningNetwork/#how-to-restart-my-core-lightning-cln"}},[t._v("How to restart my Core Lightning (CLN)?")])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/FAQ/LightningNetwork/#how-to-announce-an-ipv6-address"}},[t._v("How to announce an IPv6 address?")])],1)]),t._v(" "),e("h2",{attrs:{id:"altcoins-faq"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#altcoins-faq"}},[t._v("#")]),t._v(" "),e("RouterLink",{attrs:{to:"/FAQ/Altcoin/"}},[t._v("Altcoins FAQ")])],1),t._v(" "),e("ul",[e("li",[e("RouterLink",{attrs:{to:"/FAQ/Altcoin/#which-coins-does-btcpay-server-support"}},[t._v("Which coins does BTCPay Server support?")])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/FAQ/Altcoin/#can-an-xyz-coin-be-added-in-btcpay"}},[t._v("Can an XYZ coin be added in BTCPay?")])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/FAQ/Altcoin/#how-to-add-an-altcoin-in-btcpay"}},[t._v("How to add an altcoin to BTCPay?")])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/FAQ/Altcoin/#how-to-add-an-altcoin-to-an-existing-btcpay-deployment"}},[t._v("How to add an altcoin to an existing BTCPay deployment?")])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/FAQ/Altcoin/#how-to-remove-a-coin-from-btcpay"}},[t._v("How to remove a coin from BTCPay?")])],1)])])}),[],!1,null,null,null);e.default=n.exports}}]); \ No newline at end of file diff --git a/assets/js/14.4cfcf4b4.js b/assets/js/14.bda0a005.js similarity index 74% rename from assets/js/14.4cfcf4b4.js rename to assets/js/14.bda0a005.js index a23154ca29..7bec3d145e 100644 --- a/assets/js/14.4cfcf4b4.js +++ b/assets/js/14.bda0a005.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[14],{557:function(e,t,s){e.exports=s.p+"assets/img/btcpayshopify1.a961b161.png"},558:function(e,t,s){e.exports=s.p+"assets/img/btcpayshopify2.aea0b1ac.png"},559:function(e,t,s){e.exports=s.p+"assets/img/btcpayshopify3.14ff79a8.png"},560:function(e,t,s){e.exports=s.p+"assets/img/btcpayshopify4.4f0a10ba.png"},561:function(e,t,s){e.exports=s.p+"assets/img/btcpayshopify5.9c789888.png"},562:function(e,t,s){e.exports=s.p+"assets/img/btcpayshopify6.b3df5c96.png"},563:function(e,t,s){e.exports=s.p+"assets/img/btcpayshopify7.74cbdef7.png"},564:function(e,t,s){e.exports=s.p+"assets/img/btcpayshopify8.03fc6a31.png"},565:function(e,t,s){e.exports=s.p+"assets/img/btcpayshopify9.c5dd42ec.png"},566:function(e,t,s){e.exports=s.p+"assets/img/btcpayshopify10.d1cd1d3e.png"},567:function(e,t,s){e.exports=s.p+"assets/img/btcpayshopify11.7825329b.jpg"},568:function(e,t,s){e.exports=s.p+"assets/img/btcpayshopify12.1c03a412.jpg"},569:function(e,t,s){e.exports=s.p+"assets/img/btcpayshopify13.d0551bae.png"},570:function(e,t,s){e.exports=s.p+"assets/img/btcpayshopify14.eb96845f.png"},571:function(e,t,s){e.exports=s.p+"assets/img/btcpayshopify15.dac5277c.png"},572:function(e,t,s){e.exports=s.p+"assets/img/btcpayshopify16.dca8f695.png"},573:function(e,t,s){e.exports=s.p+"assets/img/btcpayshopify17.fa8dddec.png"},574:function(e,t,s){e.exports=s.p+"assets/img/btcpayshopify18.e47c78da.png"},813:function(e,t,s){"use strict";s.r(t);var i=s(10),r=Object(i.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"how-to-accept-bitcoin-in-shopify"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#how-to-accept-bitcoin-in-shopify"}},[e._v("#")]),e._v(" How to accept Bitcoin in Shopify")]),e._v(" "),t("p",[e._v("The following document guides you through "),t("strong",[e._v("setting up BTCPay Server with "),t("a",{attrs:{href:"https://www.shopify.com/",target:"_blank",rel:"noopener noreferrer"}},[e._v("Shopify"),t("OutboundLink")],1)]),e._v(".")]),e._v(" "),t("h2",{attrs:{id:"prerequisites"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#prerequisites"}},[e._v("#")]),e._v(" Prerequisites:")]),e._v(" "),t("ul",[t("li",[e._v("Shopify account")]),e._v(" "),t("li",[e._v("BTCPay Server] - "),t("RouterLink",{attrs:{to:"/Deployment/"}},[e._v("self-hosted")]),e._v(" or run by a "),t("RouterLink",{attrs:{to:"/Deployment/ThirdPartyHosting/"}},[e._v("third-party host")]),e._v(" v1.4.8 or later.")],1),e._v(" "),t("li",[t("RouterLink",{attrs:{to:"/CreateStore/"}},[e._v("Created BTCPay Server store")]),e._v(" with "),t("RouterLink",{attrs:{to:"/WalletSetup/"}},[e._v("wallet set up")])],1)]),e._v(" "),t("a",{staticClass:"ytEmbed",staticStyle:{"background-image":"url(https://img.youtube.com/vi/jJjAyvgWVfk/hqdefault.jpg)"},attrs:{href:"https://www.youtube.com/watch?v=jJjAyvgWVfk",title:"BTCPay Server - Shopify Video","data-id":"jJjAyvgWVfk"}},[t("iframe",{attrs:{title:"BTCPay Server - Shopify Video","data-src":"https://www.youtube-nocookie.com/embed/jJjAyvgWVfk?&autoplay=1&autohide=1&modestbranding=1&color=white&rel=0",frameborder:"0",allow:"autoplay;encrypted-media;picture-in-picture",allowfullscreen:""}})]),e._v(" "),t("div",{staticClass:"custom-block warning"},[t("p",{staticClass:"custom-block-title"},[e._v("WARNING")]),e._v(" "),t("p",[e._v("Shopify might give false flags on deprecated API calls. The most likely answer we could find, due to a change by Shopify to specific fields of the "),t("code",[e._v("Order")]),e._v(" resource and is assumed to get used in BTCPay Server. Find more details "),t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver/issues/4510",target:"_blank",rel:"noopener noreferrer"}},[e._v("here"),t("OutboundLink")],1)])]),e._v(" "),t("h2",{attrs:{id:"setting-up-btcpay-server-with-shopify"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#setting-up-btcpay-server-with-shopify"}},[e._v("#")]),e._v(" Setting up BTCPay Server with Shopify")]),e._v(" "),t("ol",[t("li",[e._v("In Shopify, go to Apps > and at the bottom of the page click on the "),t("code",[e._v("Develop apps for your store")]),e._v(".")]),e._v(" "),t("li",[e._v("If prompted, click on "),t("code",[e._v("Allow custom app development")])]),e._v(" "),t("li",[t("code",[e._v("Create an app")]),e._v(" and name it")]),e._v(" "),t("li",[e._v("On the app page, in "),t("code",[e._v("Overview")]),e._v(" tab, click on the "),t("code",[e._v("Configure Admin API scopes")])]),e._v(" "),t("li",[e._v("In the filter admin access scopes type in "),t("code",[e._v("Orders")])]),e._v(" "),t("li",[e._v("In "),t("code",[e._v("Orders")]),e._v(" enable "),t("code",[e._v("read_orders")]),e._v(" and "),t("code",[e._v("write_orders")]),e._v(" and then click "),t("code",[e._v("Save")])]),e._v(" "),t("li",[e._v("Click on the "),t("code",[e._v("Install App")]),e._v(" in the top right corner and when pop-up window appears click "),t("code",[e._v("Install")])]),e._v(" "),t("li",[e._v("Reveal "),t("code",[e._v("Admin API access token")]),e._v(" and "),t("code",[e._v("copy")]),e._v(" it.")]),e._v(" "),t("li",[e._v("In your BTCPay Server, go to "),t("code",[e._v("Store > Settings > Integrations > Shopify")]),e._v(". and click "),t("code",[e._v("Setup")]),e._v(" button.")]),e._v(" "),t("li",[e._v("In second field, "),t("code",[e._v("API Secret Key")]),e._v(" the paste the "),t("code",[e._v("Admin API access token")])]),e._v(" "),t("li",[e._v("In the first field, "),t("code",[e._v("API key")]),e._v(" paste the "),t("code",[e._v("API key")]),e._v(" from Shopify.")]),e._v(" "),t("li",[e._v("In Shopify's "),t("code",[e._v("Store Settings > Checkout > Order status page > Additional Scripts")]),e._v(" paste the script provided by BTCPay Server on Shopify Integration page (including the opening and closing tag "),t("code",[e._v("<\/script>")]),e._v(".")]),e._v(" "),t("li",[e._v("In Shopify's "),t("code",[e._v("Store Settings > Payments > Manual payment methods")]),e._v(" add "),t("code",[e._v("manual payment method")]),e._v(" then click "),t("code",[e._v("create custom payment method")])]),e._v(" "),t("li",[e._v("In "),t("code",[e._v("Custom payment method name")]),e._v(" fill in "),t("code",[e._v("Bitcoin with BTCPay Server")]),e._v(", optionally you can fill in other fields, but it's not required. Note that the name should exactly "),t("code",[e._v("Bitcoin with BTCPay Server")])]),e._v(" "),t("li",[e._v("Hit "),t("code",[e._v("Activate")]),e._v(" and you've set up Shopify and BTCPay Server successfully.")])]),e._v(" "),t("div",{staticClass:"custom-block tip"},[t("p",{staticClass:"custom-block-title"},[e._v("TIP")]),e._v(" "),t("p",[e._v("Custom Payment method name "),t("strong",[e._v("must")]),e._v(" contain at least one of the following words: "),t("code",[e._v("bitcoin")]),e._v(", "),t("code",[e._v("btcpayserver")]),e._v(", "),t("code",[e._v("btcpay server")]),e._v(" or "),t("code",[e._v("btc")]),e._v(" to work.")])]),e._v(" "),t("p",[e._v("Below are step by step visuals describing the process outlined above.")]),e._v(" "),t("figure",[t("img",{attrs:{src:s(557),alt:"BTCPay Server shopify step 1",title:"BTCPay Server shopify step 1"}})]),e._v(" "),t("figure",[t("img",{attrs:{src:s(558),alt:"BTCPay Server shopify step 2",title:"BTCPay Server shopify step 2"}})]),e._v(" "),t("figure",[t("img",{attrs:{src:s(559),alt:"BTCPay Server shopify step 3",title:"BTCPay Server shopify step 3"}})]),e._v(" "),t("figure",[t("img",{attrs:{src:s(560),alt:"BTCPay Server shopify step 4",title:"BTCPay Server shopify step 4"}})]),e._v(" "),t("figure",[t("img",{attrs:{src:s(561),alt:"BTCPay Server shopify step 5",title:"BTCPay Server shopify step 5"}})]),e._v(" "),t("figure",[t("img",{attrs:{src:s(562),alt:"BTCPay Server shopify step 6",title:"BTCPay Server shopify step 6"}})]),e._v(" "),t("figure",[t("img",{attrs:{src:s(563),alt:"BTCPay Server shopify step 7",title:"BTCPay Server shopify step 7"}})]),e._v(" "),t("figure",[t("img",{attrs:{src:s(564),alt:"BTCPay Server shopify step 8",title:"BTCPay Server shopify step 8"}})]),e._v(" "),t("figure",[t("img",{attrs:{src:s(565),alt:"BTCPay Server shopify step 9",title:"BTCPay Server shopify step 9"}})]),e._v(" "),t("figure",[t("img",{attrs:{src:s(566),alt:"BTCPay Server shopify step 10",title:"BTCPay Server shopify step 10"}})]),e._v(" "),t("figure",[t("img",{attrs:{src:s(567),alt:"BTCPay Server shopify step 11",title:"BTCPay Server shopify step 11"}})]),e._v(" "),t("figure",[t("img",{attrs:{src:s(568),alt:"BTCPay Server shopify step 12",title:"BTCPay Server shopify step 12"}})]),e._v(" "),t("figure",[t("img",{attrs:{src:s(569),alt:"BTCPay Server shopify step 13",title:"BTCPay Server shopify step 13"}})]),e._v(" "),t("figure",[t("img",{attrs:{src:s(570),alt:"BTCPay Server shopify step 14",title:"BTCPay Server shopify step 14"}})]),e._v(" "),t("figure",[t("img",{attrs:{src:s(571),alt:"BTCPay Server shopify step 15",title:"BTCPay Server shopify step 15"}})]),e._v(" "),t("figure",[t("img",{attrs:{src:s(572),alt:"BTCPay Server shopify step 16",title:"BTCPay Server shopify step 16"}})]),e._v(" "),t("figure",[t("img",{attrs:{src:s(573),alt:"BTCPay Server shopify step 17",title:"BTCPay Server shopify step 17"}})]),e._v(" "),t("figure",[t("img",{attrs:{src:s(574),alt:"BTCPay Server shopify step 18",title:"BTCPay Server shopify step 18"}})])])}),[],!1,null,null,null);t.default=r.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[14],{545:function(e,t,s){e.exports=s.p+"assets/img/btcpayshopify1.a961b161.png"},546:function(e,t,s){e.exports=s.p+"assets/img/btcpayshopify2.aea0b1ac.png"},547:function(e,t,s){e.exports=s.p+"assets/img/btcpayshopify3.14ff79a8.png"},548:function(e,t,s){e.exports=s.p+"assets/img/btcpayshopify4.4f0a10ba.png"},549:function(e,t,s){e.exports=s.p+"assets/img/btcpayshopify5.9c789888.png"},550:function(e,t,s){e.exports=s.p+"assets/img/btcpayshopify6.b3df5c96.png"},551:function(e,t,s){e.exports=s.p+"assets/img/btcpayshopify7.74cbdef7.png"},552:function(e,t,s){e.exports=s.p+"assets/img/btcpayshopify8.03fc6a31.png"},553:function(e,t,s){e.exports=s.p+"assets/img/btcpayshopify9.c5dd42ec.png"},554:function(e,t,s){e.exports=s.p+"assets/img/btcpayshopify10.d1cd1d3e.png"},555:function(e,t,s){e.exports=s.p+"assets/img/btcpayshopify11.7825329b.jpg"},556:function(e,t,s){e.exports=s.p+"assets/img/btcpayshopify12.1c03a412.jpg"},557:function(e,t,s){e.exports=s.p+"assets/img/btcpayshopify13.d0551bae.png"},558:function(e,t,s){e.exports=s.p+"assets/img/btcpayshopify14.eb96845f.png"},559:function(e,t,s){e.exports=s.p+"assets/img/btcpayshopify15.dac5277c.png"},560:function(e,t,s){e.exports=s.p+"assets/img/btcpayshopify16.dca8f695.png"},561:function(e,t,s){e.exports=s.p+"assets/img/btcpayshopify17.fa8dddec.png"},562:function(e,t,s){e.exports=s.p+"assets/img/btcpayshopify18.e47c78da.png"},811:function(e,t,s){"use strict";s.r(t);var i=s(10),r=Object(i.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"how-to-accept-bitcoin-in-shopify"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#how-to-accept-bitcoin-in-shopify"}},[e._v("#")]),e._v(" How to accept Bitcoin in Shopify")]),e._v(" "),t("p",[e._v("The following document guides you through "),t("strong",[e._v("setting up BTCPay Server with "),t("a",{attrs:{href:"https://www.shopify.com/",target:"_blank",rel:"noopener noreferrer"}},[e._v("Shopify"),t("OutboundLink")],1)]),e._v(".")]),e._v(" "),t("h2",{attrs:{id:"prerequisites"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#prerequisites"}},[e._v("#")]),e._v(" Prerequisites:")]),e._v(" "),t("ul",[t("li",[e._v("Shopify account")]),e._v(" "),t("li",[e._v("BTCPay Server] - "),t("RouterLink",{attrs:{to:"/Deployment/"}},[e._v("self-hosted")]),e._v(" or run by a "),t("RouterLink",{attrs:{to:"/Deployment/ThirdPartyHosting/"}},[e._v("third-party host")]),e._v(" v1.4.8 or later.")],1),e._v(" "),t("li",[t("RouterLink",{attrs:{to:"/CreateStore/"}},[e._v("Created BTCPay Server store")]),e._v(" with "),t("RouterLink",{attrs:{to:"/WalletSetup/"}},[e._v("wallet set up")])],1)]),e._v(" "),t("a",{staticClass:"ytEmbed",staticStyle:{"background-image":"url(https://img.youtube.com/vi/jJjAyvgWVfk/hqdefault.jpg)"},attrs:{href:"https://www.youtube.com/watch?v=jJjAyvgWVfk",title:"BTCPay Server - Shopify Video","data-id":"jJjAyvgWVfk"}},[t("iframe",{attrs:{title:"BTCPay Server - Shopify Video","data-src":"https://www.youtube-nocookie.com/embed/jJjAyvgWVfk?&autoplay=1&autohide=1&modestbranding=1&color=white&rel=0",frameborder:"0",allow:"autoplay;encrypted-media;picture-in-picture",allowfullscreen:""}})]),e._v(" "),t("div",{staticClass:"custom-block warning"},[t("p",{staticClass:"custom-block-title"},[e._v("WARNING")]),e._v(" "),t("p",[e._v("Shopify might give false flags on deprecated API calls. The most likely answer we could find, due to a change by Shopify to specific fields of the "),t("code",[e._v("Order")]),e._v(" resource and is assumed to get used in BTCPay Server. Find more details "),t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver/issues/4510",target:"_blank",rel:"noopener noreferrer"}},[e._v("here"),t("OutboundLink")],1)])]),e._v(" "),t("h2",{attrs:{id:"setting-up-btcpay-server-with-shopify"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#setting-up-btcpay-server-with-shopify"}},[e._v("#")]),e._v(" Setting up BTCPay Server with Shopify")]),e._v(" "),t("ol",[t("li",[e._v("In Shopify, go to Apps > and at the bottom of the page click on the "),t("code",[e._v("Develop apps for your store")]),e._v(".")]),e._v(" "),t("li",[e._v("If prompted, click on "),t("code",[e._v("Allow custom app development")])]),e._v(" "),t("li",[t("code",[e._v("Create an app")]),e._v(" and name it")]),e._v(" "),t("li",[e._v("On the app page, in "),t("code",[e._v("Overview")]),e._v(" tab, click on the "),t("code",[e._v("Configure Admin API scopes")])]),e._v(" "),t("li",[e._v("In the filter admin access scopes type in "),t("code",[e._v("Orders")])]),e._v(" "),t("li",[e._v("In "),t("code",[e._v("Orders")]),e._v(" enable "),t("code",[e._v("read_orders")]),e._v(" and "),t("code",[e._v("write_orders")]),e._v(" and then click "),t("code",[e._v("Save")])]),e._v(" "),t("li",[e._v("Click on the "),t("code",[e._v("Install App")]),e._v(" in the top right corner and when pop-up window appears click "),t("code",[e._v("Install")])]),e._v(" "),t("li",[e._v("Reveal "),t("code",[e._v("Admin API access token")]),e._v(" and "),t("code",[e._v("copy")]),e._v(" it.")]),e._v(" "),t("li",[e._v("In your BTCPay Server, go to "),t("code",[e._v("Store > Settings > Integrations > Shopify")]),e._v(". and click "),t("code",[e._v("Setup")]),e._v(" button.")]),e._v(" "),t("li",[e._v("In second field, "),t("code",[e._v("API Secret Key")]),e._v(" the paste the "),t("code",[e._v("Admin API access token")])]),e._v(" "),t("li",[e._v("In the first field, "),t("code",[e._v("API key")]),e._v(" paste the "),t("code",[e._v("API key")]),e._v(" from Shopify.")]),e._v(" "),t("li",[e._v("In Shopify's "),t("code",[e._v("Store Settings > Checkout > Order status page > Additional Scripts")]),e._v(" paste the script provided by BTCPay Server on Shopify Integration page (including the opening and closing tag "),t("code",[e._v("<\/script>")]),e._v(".")]),e._v(" "),t("li",[e._v("In Shopify's "),t("code",[e._v("Store Settings > Payments > Manual payment methods")]),e._v(" add "),t("code",[e._v("manual payment method")]),e._v(" then click "),t("code",[e._v("create custom payment method")])]),e._v(" "),t("li",[e._v("In "),t("code",[e._v("Custom payment method name")]),e._v(" fill in "),t("code",[e._v("Bitcoin with BTCPay Server")]),e._v(", optionally you can fill in other fields, but it's not required. Note that the name should exactly "),t("code",[e._v("Bitcoin with BTCPay Server")])]),e._v(" "),t("li",[e._v("Hit "),t("code",[e._v("Activate")]),e._v(" and you've set up Shopify and BTCPay Server successfully.")])]),e._v(" "),t("div",{staticClass:"custom-block tip"},[t("p",{staticClass:"custom-block-title"},[e._v("TIP")]),e._v(" "),t("p",[e._v("Custom Payment method name "),t("strong",[e._v("must")]),e._v(" contain at least one of the following words: "),t("code",[e._v("bitcoin")]),e._v(", "),t("code",[e._v("btcpayserver")]),e._v(", "),t("code",[e._v("btcpay server")]),e._v(" or "),t("code",[e._v("btc")]),e._v(" to work.")])]),e._v(" "),t("p",[e._v("Below are step by step visuals describing the process outlined above.")]),e._v(" "),t("figure",[t("img",{attrs:{src:s(545),alt:"BTCPay Server shopify step 1",title:"BTCPay Server shopify step 1"}})]),e._v(" "),t("figure",[t("img",{attrs:{src:s(546),alt:"BTCPay Server shopify step 2",title:"BTCPay Server shopify step 2"}})]),e._v(" "),t("figure",[t("img",{attrs:{src:s(547),alt:"BTCPay Server shopify step 3",title:"BTCPay Server shopify step 3"}})]),e._v(" "),t("figure",[t("img",{attrs:{src:s(548),alt:"BTCPay Server shopify step 4",title:"BTCPay Server shopify step 4"}})]),e._v(" "),t("figure",[t("img",{attrs:{src:s(549),alt:"BTCPay Server shopify step 5",title:"BTCPay Server shopify step 5"}})]),e._v(" "),t("figure",[t("img",{attrs:{src:s(550),alt:"BTCPay Server shopify step 6",title:"BTCPay Server shopify step 6"}})]),e._v(" "),t("figure",[t("img",{attrs:{src:s(551),alt:"BTCPay Server shopify step 7",title:"BTCPay Server shopify step 7"}})]),e._v(" "),t("figure",[t("img",{attrs:{src:s(552),alt:"BTCPay Server shopify step 8",title:"BTCPay Server shopify step 8"}})]),e._v(" "),t("figure",[t("img",{attrs:{src:s(553),alt:"BTCPay Server shopify step 9",title:"BTCPay Server shopify step 9"}})]),e._v(" "),t("figure",[t("img",{attrs:{src:s(554),alt:"BTCPay Server shopify step 10",title:"BTCPay Server shopify step 10"}})]),e._v(" "),t("figure",[t("img",{attrs:{src:s(555),alt:"BTCPay Server shopify step 11",title:"BTCPay Server shopify step 11"}})]),e._v(" "),t("figure",[t("img",{attrs:{src:s(556),alt:"BTCPay Server shopify step 12",title:"BTCPay Server shopify step 12"}})]),e._v(" "),t("figure",[t("img",{attrs:{src:s(557),alt:"BTCPay Server shopify step 13",title:"BTCPay Server shopify step 13"}})]),e._v(" "),t("figure",[t("img",{attrs:{src:s(558),alt:"BTCPay Server shopify step 14",title:"BTCPay Server shopify step 14"}})]),e._v(" "),t("figure",[t("img",{attrs:{src:s(559),alt:"BTCPay Server shopify step 15",title:"BTCPay Server shopify step 15"}})]),e._v(" "),t("figure",[t("img",{attrs:{src:s(560),alt:"BTCPay Server shopify step 16",title:"BTCPay Server shopify step 16"}})]),e._v(" "),t("figure",[t("img",{attrs:{src:s(561),alt:"BTCPay Server shopify step 17",title:"BTCPay Server shopify step 17"}})]),e._v(" "),t("figure",[t("img",{attrs:{src:s(562),alt:"BTCPay Server shopify step 18",title:"BTCPay Server shopify step 18"}})])])}),[],!1,null,null,null);t.default=r.exports}}]); \ No newline at end of file diff --git a/assets/js/140.f1e3fbc9.js b/assets/js/140.6e3cea09.js similarity index 99% rename from assets/js/140.f1e3fbc9.js rename to assets/js/140.6e3cea09.js index b4ecc2ecc6..8e30a1d2c7 100644 --- a/assets/js/140.f1e3fbc9.js +++ b/assets/js/140.6e3cea09.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[140],{783:function(e,a,t){"use strict";t.r(a);var s=t(10),n=Object(s.a)({},(function(){var e=this,a=e._self._c;return a("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[a("h1",{attrs:{id:"synchronization-faq"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#synchronization-faq"}},[e._v("#")]),e._v(" Synchronization FAQ")]),e._v(" "),a("p",[e._v("This document covers the most common questions and issues that may occur during BTCPay sync.")]),e._v(" "),a("p"),a("div",{staticClass:"table-of-contents"},[a("ul",[a("li",[a("a",{attrs:{href:"#why-does-btcpay-sync"}},[e._v("Why does BTCPay sync?")])]),a("li",[a("a",{attrs:{href:"#can-i-skip-the-synchronization"}},[e._v("Can I skip the synchronization?")])]),a("li",[a("a",{attrs:{href:"#how-do-i-know-that-btcpay-synced-completely"}},[e._v("How do I know that BTCPay synced completely?")])]),a("li",[a("a",{attrs:{href:"#how-can-i-check-the-block-height-of-my-bitcoin-node"}},[e._v("How can I check the block height of my bitcoin node?")])]),a("li",[a("a",{attrs:{href:"#btcpay-server-takes-forever-to-synchronize"}},[e._v("BTCPay Server takes forever to synchronize")]),a("ul",[a("li",[a("a",{attrs:{href:"#cause-1-not-enough-cpu"}},[e._v("Cause 1: Not enough CPU")])]),a("li",[a("a",{attrs:{href:"#cause-2-using-swap-memory"}},[e._v("Cause 2: Using swap memory")])])])]),a("li",[a("a",{attrs:{href:"#btcpay-server-keeps-showing-that-my-node-is-always-starting"}},[e._v("BTCPay Server keeps showing that my node is always starting")]),a("ul",[a("li",[a("a",{attrs:{href:"#cause-1-you-do-not-have-enough-ram"}},[e._v("Cause 1: You do not have enough RAM")])]),a("li",[a("a",{attrs:{href:"#cause-2-you-do-not-have-enough-storage"}},[e._v("Cause 2: You do not have enough storage")])]),a("li",[a("a",{attrs:{href:"#cause-3-you-accidentally-disabled-pruning"}},[e._v("Cause 3: You accidentally disabled pruning")])]),a("li",[a("a",{attrs:{href:"#cause-4-your-bitcoin-data-directory-is-corrupted"}},[e._v("Cause 4: Your bitcoin data directory is corrupted")])]),a("li",[a("a",{attrs:{href:"#cause-5-your-last-wallet-synchronisation-goes-beyond-pruned-data"}},[e._v("Cause 5: Your last wallet synchronisation goes beyond pruned data")])])])]),a("li",[a("a",{attrs:{href:"#im-running-a-full-node-and-have-a-synched-blockchain-can-btcpay-use-it-so-that-it-doesnt-have-to-do-a-full-sync"}},[e._v("I'm running a full node and have a synched blockchain, can BTCPay use it so that it doesn't have to do a full sync?")])]),a("li",[a("a",{attrs:{href:"#how-to-enable-bitcoin-node-pruning"}},[e._v("How to enable Bitcoin node pruning?")])]),a("li",[a("a",{attrs:{href:"#how-to-disable-bitcoin-node-pruning"}},[e._v("How to disable Bitcoin node pruning?")])])])]),a("p"),e._v(" "),a("h2",{attrs:{id:"why-does-btcpay-sync"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#why-does-btcpay-sync"}},[e._v("#")]),e._v(" Why does BTCPay sync?")]),e._v(" "),a("p",[e._v("After deployment, your BTCPay Server needs to sync the entire blockchain and validate all the consensus rules. Depending on your machine specifications, bandwidth and number of altcoins you added, this process may take between 1-5 days.")]),e._v(" "),a("p",[e._v("It may seem tedious, but it's a critical step of running your own full node and not having to trust or rely on anyone. Your node will not only download ~300GB of data (less if you're using a pruned node) but also validate all the rules of the consensus. You can find more information about the importance of blockchain synchronization in "),a("a",{attrs:{href:"https://www.youtube.com/watch?v=OrYDehC-8TU",target:"_blank",rel:"noopener noreferrer"}},[e._v("this video"),a("OutboundLink")],1),e._v(".")]),e._v(" "),a("p",[e._v("If you are only interested in learning about BTCPay Server i.e. simply "),a("RouterLink",{attrs:{to:"/TryItOut/"}},[e._v("trying it out")]),e._v(" without deploying your own instance, you can avoid sync by using a "),a("RouterLink",{attrs:{to:"/Deployment/ThirdPartyHosting/"}},[e._v("Third-Party host")]),e._v(".")],1),e._v(" "),a("h2",{attrs:{id:"can-i-skip-the-synchronization"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#can-i-skip-the-synchronization"}},[e._v("#")]),e._v(" Can I skip the synchronization?")]),e._v(" "),a("p",[e._v("You can't skip synchronization if you are deploying a BTCPay Server, but you can drastically decrease the time it takes. If you're comfortable with using the command line, you can use FastSync to synchronize your node faster. Be sure to "),a("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver-docker/tree/master/contrib/FastSync",target:"_blank",rel:"noopener noreferrer"}},[e._v("read this FastSync document"),a("OutboundLink")],1),e._v(" to understand the potential trust issues involved with this feature.")]),e._v(" "),a("p",[e._v("To use FastSync, make sure your deployment has a "),a("a",{attrs:{href:"#how-to-enable-bitcoin-node-pruning"}},[e._v("pruning option enabled")]),e._v(" by using an "),a("code",[e._v("opt-save-storage")]),e._v(" environment variable, otherwise bitcoind will not be able to sync. First step is to "),a("RouterLink",{attrs:{to:"/FAQ/ServerSettings/#how-to-ssh-into-my-btcpay-running-on-vps"}},[e._v("ssh into")]),e._v(" your BTCPayServer instance and run the following commands:")],1),e._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[a("span",{pre:!0,attrs:{class:"token function"}},[e._v("sudo")]),e._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[e._v("su")]),e._v(" -\n"),a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("cd")]),e._v(" "),a("span",{pre:!0,attrs:{class:"token variable"}},[e._v("$BTCPAY_BASE_DIRECTORY")]),e._v("/btcpayserver-docker/\nbtcpay-down.sh\n"),a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("cd")]),e._v(" contrib/FastSync\n./load-utxo-set.sh\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[e._v("# Once FastSync has completed")]),e._v("\nbtcpay-up.sh\n")])])]),a("p",[e._v("After FastSync is complete and you have brought back up your instance, refresh your BTCPay domain and wait for remaining blockchain synchronization. You can also follow "),a("a",{attrs:{href:"https://youtube.com/watch?v=VNMnd-dX9Q8?t=1730",target:"_blank",rel:"noopener noreferrer"}},[e._v("this video"),a("OutboundLink")],1),e._v(".")]),e._v(" "),a("p",[e._v("If your FastSync returns "),a("code",[e._v("You need to delete your Bitcoin Core wallet")]),e._v(" after you load the uxto set, or you find this error: "),a("code",[e._v("Last wallet synchronisation goes beyond pruned data")]),e._v(", see the cause of "),a("a",{attrs:{href:"#btcpay-server-keeps-showing-that-my-node-is-always-starting"}},[e._v("BTCPay Server keeps showing that my node is always starting")]),e._v(".")]),e._v(" "),a("h2",{attrs:{id:"how-do-i-know-that-btcpay-synced-completely"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#how-do-i-know-that-btcpay-synced-completely"}},[e._v("#")]),e._v(" How do I know that BTCPay synced completely?")]),e._v(" "),a("p",[e._v("When you do not see a pop-up message in the bottom right corner, which shows the sync progress, that means that your server is fully synced and you can "),a("RouterLink",{attrs:{to:"/RegisterAccount/"}},[e._v("begin using it")]),e._v(".")],1),e._v(" "),a("p",[e._v("If you want to check that your BTCPay Server Bitcoin node is synchronized with the most recent block in the Bitcoin blockchain, "),a("a",{attrs:{href:"#how-can-i-check-the-block-height-of-my-bitcoin-node"}},[e._v("check your node height")]),e._v(" matches the current block height using any blockchain explorer.")]),e._v(" "),a("h2",{attrs:{id:"how-can-i-check-the-block-height-of-my-bitcoin-node"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#how-can-i-check-the-block-height-of-my-bitcoin-node"}},[e._v("#")]),e._v(" How can I check the block height of my bitcoin node?")]),e._v(" "),a("p",[e._v("To verify the sync status of your Bitcoin node, you can use bitcoin-cli commands inside your server's Bitcoin container. SSH into your server and navigate to the directory where you "),a("RouterLink",{attrs:{to:"/Troubleshooting/#23-bitcoin-node-logs"}},[e._v("view Bitcoin logs")]),e._v(" run the command: "),a("code",[e._v("bitcoin-cli.sh getblockcount")]),e._v(" to view the current block of your server's Bitcoin node.")],1),e._v(" "),a("h2",{attrs:{id:"btcpay-server-takes-forever-to-synchronize"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#btcpay-server-takes-forever-to-synchronize"}},[e._v("#")]),e._v(" BTCPay Server takes forever to synchronize")]),e._v(" "),a("p",[e._v("Synchronizing a Full Bitcoin node should take between 1 and 5 days. It should sync quickly at first and more slowly at the end.")]),e._v(" "),a("p",[e._v("If the node appears to not be syncing, verify:")]),e._v(" "),a("ul",[a("li",[e._v("Not enough CPU")]),e._v(" "),a("li",[e._v("Using swap memory")])]),e._v(" "),a("h3",{attrs:{id:"cause-1-not-enough-cpu"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#cause-1-not-enough-cpu"}},[e._v("#")]),e._v(" Cause 1: Not enough CPU")]),e._v(" "),a("p",[e._v("We recommend 2 CPU while synchronizing; however some hosting providers throttle your CPU if you use too much.")]),e._v(" "),a("p",[e._v("Check with")]),e._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[a("span",{pre:!0,attrs:{class:"token function"}},[e._v("sudo")]),e._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[e._v("su")]),e._v(" -\n"),a("span",{pre:!0,attrs:{class:"token function"}},[e._v("docker")]),e._v(" stats\n")])])]),a("p",[e._v("If you see more than 100% CPU usage, while being very slow to sync:")]),e._v(" "),a("div",{staticClass:"language- extra-class"},[a("pre",{pre:!0,attrs:{class:"language-text"}},[a("code",[e._v("8e7ac41e6e2a btcpayserver_bitcoind 100% 560.5MiB / 3.853GiB 14.20% 4.17\n")])])]),a("p",[e._v("Then you need to scale up your machine specification.")]),e._v(" "),a("p",[e._v("If you see very low CPU usage (less than 10%) during synchronization:")]),e._v(" "),a("div",{staticClass:"language- extra-class"},[a("pre",{pre:!0,attrs:{class:"language-text"}},[a("code",[e._v("8e7ac41e6e2a btcpayserver_bitcoind 10% 560.5MiB / 3.853GiB 14.20% 4.17\n")])])]),a("p",[e._v("Your hosting provider might throttle your CPU. Please make sure your host supports the high use of CPU for an extended period.")]),e._v(" "),a("p",[e._v("If they don't allow it, shut down your server until they stop throttling you. Then you can limit the CPU via docker, and restart the server:")]),e._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[a("span",{pre:!0,attrs:{class:"token function"}},[e._v("docker")]),e._v(" update btcpayserver_bitcoind "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("--cpus")]),e._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[e._v('".8"')]),e._v("\n")])])]),a("h3",{attrs:{id:"cause-2-using-swap-memory"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#cause-2-using-swap-memory"}},[e._v("#")]),e._v(" Cause 2: Using swap memory")]),e._v(" "),a("p",[e._v("If you are synching and don't have enough memory, your server may use swap memory to continue operating:")]),e._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[a("span",{pre:!0,attrs:{class:"token function"}},[e._v("sudo")]),e._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[e._v("su")]),e._v(" -\n"),a("span",{pre:!0,attrs:{class:"token function"}},[e._v("free")]),e._v(" "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-h")]),e._v("\n")])])]),a("p",[e._v("If you see swap memory usage:")]),e._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[e._v(" total used "),a("span",{pre:!0,attrs:{class:"token function"}},[e._v("free")]),e._v(" shared buff/cache available\nMem: "),a("span",{pre:!0,attrs:{class:"token number"}},[e._v("2")]),e._v(".0G "),a("span",{pre:!0,attrs:{class:"token number"}},[e._v("2")]),e._v(".0G 0M 66M 0G 0M\nSwap: "),a("span",{pre:!0,attrs:{class:"token number"}},[e._v("1")]),e._v(".0G 200M 800M\n")])])]),a("p",[e._v("Then it means you need to scale up your server by adding more memory.")]),e._v(" "),a("h2",{attrs:{id:"btcpay-server-keeps-showing-that-my-node-is-always-starting"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#btcpay-server-keeps-showing-that-my-node-is-always-starting"}},[e._v("#")]),e._v(" BTCPay Server keeps showing that my node is always starting")]),e._v(" "),a("p",[e._v("Possible cause:")]),e._v(" "),a("ul",[a("li",[e._v("You do not have enough RAM")]),e._v(" "),a("li",[e._v("You do not have enough storage")]),e._v(" "),a("li",[e._v("You accidentally disabled pruning")]),e._v(" "),a("li",[e._v("Your bitcoin data directory is corrupted")]),e._v(" "),a("li",[e._v("Your last wallet synchronisation goes beyond pruned data")])]),e._v(" "),a("h3",{attrs:{id:"cause-1-you-do-not-have-enough-ram"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#cause-1-you-do-not-have-enough-ram"}},[e._v("#")]),e._v(" Cause 1: You do not have enough RAM")]),e._v(" "),a("p",[e._v("Check your RAM:")]),e._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[a("span",{pre:!0,attrs:{class:"token function"}},[e._v("sudo")]),e._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[e._v("su")]),e._v(" -\n"),a("span",{pre:!0,attrs:{class:"token function"}},[e._v("free")]),e._v(" "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-h")]),e._v("\n")])])]),a("p",[e._v("If you see that you have no "),a("code",[e._v("free")]),e._v(" or very little "),a("code",[e._v("available")]),e._v(" memory:")]),e._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[e._v(" total used "),a("span",{pre:!0,attrs:{class:"token function"}},[e._v("free")]),e._v(" shared buff/cache available\nMem: "),a("span",{pre:!0,attrs:{class:"token number"}},[e._v("2")]),e._v(".0G "),a("span",{pre:!0,attrs:{class:"token number"}},[e._v("2")]),e._v(".0G 0M 66M 0G 0M\nSwap: 0B 0B 0B\n")])])]),a("p",[e._v("Then you need more memory. If you have already synched your node, you can add some swap memory. If you haven't, your server specs are too limited.")]),e._v(" "),a("p",[e._v("If you have already synched, you can add 2G of swap memory with:")]),e._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[e._v("fallocate "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-l")]),e._v(" 2G /mnt/swapfile\n"),a("span",{pre:!0,attrs:{class:"token function"}},[e._v("chmod")]),e._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[e._v("600")]),e._v(" /mnt/swapfile\n"),a("span",{pre:!0,attrs:{class:"token function"}},[e._v("mkswap")]),e._v(" /mnt/swapfile\n"),a("span",{pre:!0,attrs:{class:"token function"}},[e._v("swapon")]),e._v(" /mnt/swapfile\n"),a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("echo")]),e._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[e._v('"/mnt/swapfile none swap sw 0 0"')]),e._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[e._v(">>")]),e._v(" /etc/fstab\n")])])]),a("h3",{attrs:{id:"cause-2-you-do-not-have-enough-storage"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#cause-2-you-do-not-have-enough-storage"}},[e._v("#")]),e._v(" Cause 2: You do not have enough storage")]),e._v(" "),a("p",[e._v("Check the storage of your machine:")]),e._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[a("span",{pre:!0,attrs:{class:"token function"}},[e._v("sudo")]),e._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[e._v("su")]),e._v(" -\n"),a("span",{pre:!0,attrs:{class:"token function"}},[e._v("df")]),e._v(" "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-h")]),e._v("\n")])])]),a("p",[e._v("If you see you don't have any storage left (/dev/sda1 in my case)")]),e._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[e._v("Filesystem Size Used Avail Use% Mounted on\nudev "),a("span",{pre:!0,attrs:{class:"token number"}},[e._v("2")]),e._v(".0G "),a("span",{pre:!0,attrs:{class:"token number"}},[e._v("0")]),e._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[e._v("2")]),e._v(".0G "),a("span",{pre:!0,attrs:{class:"token number"}},[e._v("0")]),e._v("% /dev\ntmpfs 395M 41M 354M "),a("span",{pre:!0,attrs:{class:"token number"}},[e._v("11")]),e._v("% /run\n/dev/sda1 125G 125G 0G "),a("span",{pre:!0,attrs:{class:"token number"}},[e._v("100")]),e._v("% /\ntmpfs "),a("span",{pre:!0,attrs:{class:"token number"}},[e._v("2")]),e._v(".0G "),a("span",{pre:!0,attrs:{class:"token number"}},[e._v("0")]),e._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[e._v("2")]),e._v(".0G "),a("span",{pre:!0,attrs:{class:"token number"}},[e._v("0")]),e._v("% /dev/shm\ntmpfs "),a("span",{pre:!0,attrs:{class:"token number"}},[e._v("5")]),e._v(".0M "),a("span",{pre:!0,attrs:{class:"token number"}},[e._v("0")]),e._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[e._v("5")]),e._v(".0M "),a("span",{pre:!0,attrs:{class:"token number"}},[e._v("0")]),e._v("% /run/lock\ntmpfs "),a("span",{pre:!0,attrs:{class:"token number"}},[e._v("2")]),e._v(".0G "),a("span",{pre:!0,attrs:{class:"token number"}},[e._v("0")]),e._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[e._v("2")]),e._v(".0G "),a("span",{pre:!0,attrs:{class:"token number"}},[e._v("0")]),e._v("% /sys/fs/cgroup\n/dev/sdb1 "),a("span",{pre:!0,attrs:{class:"token number"}},[e._v("7")]),e._v(".8G 18M "),a("span",{pre:!0,attrs:{class:"token number"}},[e._v("7")]),e._v(".4G "),a("span",{pre:!0,attrs:{class:"token number"}},[e._v("1")]),e._v("% /mnt\n")])])]),a("p",[a("RouterLink",{attrs:{to:"/Docker/#generated-docker-compose"}},[e._v("Choose the docker fragment")]),e._v(" for the amount of storage you aim to keep. Then "),a("RouterLink",{attrs:{to:"/Docker/#how-i-can-prune-my-nodes"}},[e._v("prune your node")]),e._v(".")],1),e._v(" "),a("h3",{attrs:{id:"cause-3-you-accidentally-disabled-pruning"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#cause-3-you-accidentally-disabled-pruning"}},[e._v("#")]),e._v(" Cause 3: You accidentally disabled pruning")]),e._v(" "),a("p",[e._v("If you have recently tried to modify your environment variables using the "),a("code",[e._v('export BTCPAYGEN_ADDITIONAL_FRAGMENTS="xyz"')]),e._v(" command to add an additional fragment, but forgot to include your current ones, you may have disabled pruning.")]),e._v(" "),a("p",[e._v("If you don't have enough memory to store the entire Bitcoin blockchain and you don't have an "),a("code",[e._v("opt-save-storage")]),e._v(" listed when you "),a("RouterLink",{attrs:{to:"/FAQ/Deployment/#how-can-i-modify-or-deactivate-environment-variables"}},[e._v("print the complete list of options")]),e._v(" that you are running, it is very likely you have disabled pruning.")],1),e._v(" "),a("p",[e._v("You can verify by checking your Bitcoind logs:")]),e._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[a("span",{pre:!0,attrs:{class:"token function"}},[e._v("sudo")]),e._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[e._v("su")]),e._v(" -\n"),a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("cd")]),e._v(" btcpayserver-docker\n"),a("span",{pre:!0,attrs:{class:"token function"}},[e._v("docker")]),e._v(" logs "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("--tail")]),e._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[e._v("100")]),e._v(" btcpayserver_bitcoind\n")])])]),a("p",[e._v("If you see:")]),e._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[e._v("Block files have previously been pruned.\nYou need to rebuild the database using "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-reindex")]),e._v(" to go back to unpruned mode.\nThis will redownload the entire blockchain.\nPlease restart with "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-reindex")]),e._v(" or -reindex-chainstate to recover.\n")])])]),a("p",[e._v("You can simply "),a("a",{attrs:{href:"#how-to-enable-bitcoin-node-pruning"}},[e._v("re-enable pruning")]),e._v(" to solve the issue.")]),e._v(" "),a("h3",{attrs:{id:"cause-4-your-bitcoin-data-directory-is-corrupted"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#cause-4-your-bitcoin-data-directory-is-corrupted"}},[e._v("#")]),e._v(" Cause 4: Your bitcoin data directory is corrupted")]),e._v(" "),a("p",[e._v("Check the logs of your node:")]),e._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[a("span",{pre:!0,attrs:{class:"token function"}},[e._v("sudo")]),e._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[e._v("su")]),e._v(" -\n"),a("span",{pre:!0,attrs:{class:"token function"}},[e._v("docker")]),e._v(" logs "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("--tail")]),e._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[e._v("10")]),e._v(" btcpayserver_bitcoind\n")])])]),a("p",[e._v("If you see:")]),e._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[e._v("Please restart with "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-reindex")]),e._v(" or -reindex-chainstate to recover.\n")])])]),a("p",[e._v("Then your bitcoin data directory has been corrupted. It may be physical damage or failure of the hard drive.\nTo reindex your node:")]),e._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[e._v("btcpay-down.sh\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[e._v("# Delete 'blocks' and 'chainstate' folders")]),e._v("\n"),a("span",{pre:!0,attrs:{class:"token function"}},[e._v("rm")]),e._v(" "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-rf")]),e._v(" /var/lib/docker/volumes/generated_bitcoin_datadir/_data/blocks\n"),a("span",{pre:!0,attrs:{class:"token function"}},[e._v("rm")]),e._v(" "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-rf")]),e._v(" /var/lib/docker/volumes/generated_bitcoin_datadir/_data/chainstate\nbtcpay-up.sh\n")])])]),a("h3",{attrs:{id:"cause-5-your-last-wallet-synchronisation-goes-beyond-pruned-data"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#cause-5-your-last-wallet-synchronisation-goes-beyond-pruned-data"}},[e._v("#")]),e._v(" Cause 5: Your last wallet synchronisation goes beyond pruned data")]),e._v(" "),a("p",[e._v("This can happen if you use FastSync or import an already synched blockchain. It means that the bitcoin core wallet needs to be removed because it was created before the utxoset, likely because BTCPay Server started without the utxoset at the first boot. To verify this case, "),a("RouterLink",{attrs:{to:"/Troubleshooting/#21-btcpay-logs"}},[e._v("check the bitcoind log")]),e._v(" for this:")],1),e._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[e._v("Error: Prune: last wallet synchronisation goes beyond pruned data. You need to "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-reindex")]),e._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("(")]),e._v("download the whole blockchain again "),a("span",{pre:!0,attrs:{class:"token keyword"}},[e._v("in")]),e._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[e._v("case")]),e._v(" of pruned "),a("span",{pre:!0,attrs:{class:"token function"}},[e._v("node")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(")")]),e._v("\n")])])]),a("p",[e._v("If you see this error and agree to remove the wallet to finish syncing, use "),a("code",[e._v("docker volume rm generated_bitcoin_wallet_datadir")]),e._v(" after you run "),a("code",[e._v("btcpay-down.sh")]),e._v(" and before you run "),a("code",[e._v("btcpay-up.sh")]),e._v("\nWARNING: Do not delete this wallet if you have any funds on it.")]),e._v(" "),a("h2",{attrs:{id:"im-running-a-full-node-and-have-a-synched-blockchain-can-btcpay-use-it-so-that-it-doesnt-have-to-do-a-full-sync"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#im-running-a-full-node-and-have-a-synched-blockchain-can-btcpay-use-it-so-that-it-doesnt-have-to-do-a-full-sync"}},[e._v("#")]),e._v(" I'm running a full node and have a synched blockchain, can BTCPay use it so that it doesn't have to do a full sync?")]),e._v(" "),a("p",[e._v("Yes you can! However, before you do that, you'll want to stop bitcoind from updating docker's volume for it, as that job will be taken over by BTCPay Server.")]),e._v(" "),a("p",[e._v("If you want to run BTCPay Server inside a docker-compose, and that you have the data directory ("),a("code",[e._v(".bitcoin")]),e._v(") of a fully synched node on your docker host, then you can reuse it easily for BTCPay Server.")]),e._v(" "),a("p",[e._v("To do that, follow the following steps :")]),e._v(" "),a("ul",[a("li",[e._v("Do the normal setup according to "),a("RouterLink",{attrs:{to:"/Docker/"}},[e._v("this instruction")]),e._v(". Note the "),a("code",[e._v("opt-save-storage")]),e._v(" environment variable, which is used to enable various pruning levels. If you do not want to prune your exiting data directory, then omit the following line in your BTCPay docker deployment: "),a("code",[e._v('export BTCPAYGEN_ADDITIONAL_FRAGMENTS="opt-save-storage-s"')]),e._v(".")],1),e._v(" "),a("li",[e._v("Once "),a("code",[e._v("btcpay-setup.sh")]),e._v(" is over, turn down the docker compose with "),a("code",[e._v("btcpay-down.sh")]),e._v(".")]),e._v(" "),a("li",[e._v("Login as root with "),a("code",[e._v("sudo su -")]),e._v(".")]),e._v(" "),a("li",[e._v("Open the docker's volume for bitcoind : "),a("code",[e._v("cd /var/lib/docker/volumes/generated_bitcoin_datadir/")]),e._v(", and check its content with "),a("code",[e._v("ls -la")]),e._v(". You should see only one directory named "),a("code",[e._v("_data")]),e._v(".")]),e._v(" "),a("li",[e._v("Now remove the "),a("code",[e._v("_data")]),e._v("directory : "),a("code",[e._v("rm -r _data")]),e._v(". If for any reason you want to keep this directory and its content you can also rename it instead : "),a("code",[e._v("mv _data/ _data.old/")])]),e._v(" "),a("li",[e._v("Now create a "),a("a",{attrs:{href:"https://www.cyberciti.biz/faq/creating-soft-link-or-symbolic-link/",target:"_blank",rel:"noopener noreferrer"}},[e._v("symbolic link"),a("OutboundLink")],1),e._v(" between "),a("code",[e._v("/var/lib/docker/volumes/generated_bitcoin_datadir/_data")]),e._v(" and your data directory ("),a("code",[e._v(".bitcoin")]),e._v(") on your host: "),a("code",[e._v("ln -s path/to/.bitcoin /var/lib/docker/volumes/generated_bitcoin_datadir/_data")])]),e._v(" "),a("li",[e._v("Check that the link has been done with a "),a("code",[e._v("ls -la")])]),e._v(" "),a("li",[e._v("Start your docker-compose again with "),a("code",[e._v("btcpay-up.sh")])])]),e._v(" "),a("p",[e._v("Your BTCPay Server should now be fully synched.")]),e._v(" "),a("p",[e._v("If after this BTCPay Server keeps showing that your node is always starting, see the cause of "),a("a",{attrs:{href:"#btcpay-server-keeps-showing-that-my-node-is-always-starting"}},[e._v("BTCPay Server keeps showing that my node is always starting")]),e._v(".")]),e._v(" "),a("h2",{attrs:{id:"how-to-enable-bitcoin-node-pruning"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#how-to-enable-bitcoin-node-pruning"}},[e._v("#")]),e._v(" How to enable Bitcoin node pruning?")]),e._v(" "),a("p",[e._v("This will prune your Bitcoin full node to a maximum of 100GB (of blocks):")]),e._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[a("span",{pre:!0,attrs:{class:"token function"}},[e._v("sudo")]),e._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[e._v("su")]),e._v(" -\n"),a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("cd")]),e._v(" btcpayserver-docker\n"),a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("export")]),e._v(" "),a("span",{pre:!0,attrs:{class:"token assign-left variable"}},[e._v("BTCPAYGEN_ADDITIONAL_FRAGMENTS")]),a("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),a("span",{pre:!0,attrs:{class:"token string"}},[e._v('"opt-save-storage"')]),e._v("\n"),a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v(".")]),e._v(" ./btcpay-setup.sh "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-i")]),e._v("\n")])])]),a("p",[e._v("Other pruning options are "),a("RouterLink",{attrs:{to:"/Docker/#generated-docker-compose"}},[e._v("documented here")]),e._v(". See "),a("RouterLink",{attrs:{to:"/FAQ/Deployment/#how-can-i-modify-or-deactivate-environment-variables"}},[e._v("this example")]),e._v(" for use with other additional fragments.")],1),e._v(" "),a("h2",{attrs:{id:"how-to-disable-bitcoin-node-pruning"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#how-to-disable-bitcoin-node-pruning"}},[e._v("#")]),e._v(" How to disable Bitcoin node pruning?")]),e._v(" "),a("p",[e._v("To disable pruning of your Bitcoin node in BTCPay, first ensure you have enough memory to store the entire blockchain and BTCPayServer on your system. Then disable the "),a("code",[e._v("opt-save-storage")]),e._v(" environment variable. See "),a("RouterLink",{attrs:{to:"/FAQ/Deployment/#how-can-i-modify-or-deactivate-environment-variables"}},[e._v("this example")]),e._v(" to view your fragment list and select only one for removal. The following example will remove "),a("strong",[e._v("all")]),e._v(" additional fragments:")],1),e._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("export")]),e._v(" "),a("span",{pre:!0,attrs:{class:"token assign-left variable"}},[e._v("BTCPAYGEN_ADDITIONAL_FRAGMENTS")]),a("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),a("span",{pre:!0,attrs:{class:"token string"}},[e._v('""')]),e._v("\n"),a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v(".")]),e._v(" ./btcpay-setup.sh "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-i")]),e._v("\n")])])]),a("p",[e._v("Then run the following commands to recreate a non-pruned Bitcoin node:")]),e._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[e._v("btcpay-down.sh\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[e._v("# Delete 'blocks' and 'chainstate' folders")]),e._v("\n"),a("span",{pre:!0,attrs:{class:"token function"}},[e._v("rm")]),e._v(" "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-rf")]),e._v(" /var/lib/docker/volumes/generated_bitcoin_datadir/_data/blocks\n"),a("span",{pre:!0,attrs:{class:"token function"}},[e._v("rm")]),e._v(" "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-rf")]),e._v(" /var/lib/docker/volumes/generated_bitcoin_datadir/_data/chainstate\nbtcpay-up.sh\n")])])])])}),[],!1,null,null,null);a.default=n.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[140],{782:function(e,a,t){"use strict";t.r(a);var s=t(10),n=Object(s.a)({},(function(){var e=this,a=e._self._c;return a("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[a("h1",{attrs:{id:"synchronization-faq"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#synchronization-faq"}},[e._v("#")]),e._v(" Synchronization FAQ")]),e._v(" "),a("p",[e._v("This document covers the most common questions and issues that may occur during BTCPay sync.")]),e._v(" "),a("p"),a("div",{staticClass:"table-of-contents"},[a("ul",[a("li",[a("a",{attrs:{href:"#why-does-btcpay-sync"}},[e._v("Why does BTCPay sync?")])]),a("li",[a("a",{attrs:{href:"#can-i-skip-the-synchronization"}},[e._v("Can I skip the synchronization?")])]),a("li",[a("a",{attrs:{href:"#how-do-i-know-that-btcpay-synced-completely"}},[e._v("How do I know that BTCPay synced completely?")])]),a("li",[a("a",{attrs:{href:"#how-can-i-check-the-block-height-of-my-bitcoin-node"}},[e._v("How can I check the block height of my bitcoin node?")])]),a("li",[a("a",{attrs:{href:"#btcpay-server-takes-forever-to-synchronize"}},[e._v("BTCPay Server takes forever to synchronize")]),a("ul",[a("li",[a("a",{attrs:{href:"#cause-1-not-enough-cpu"}},[e._v("Cause 1: Not enough CPU")])]),a("li",[a("a",{attrs:{href:"#cause-2-using-swap-memory"}},[e._v("Cause 2: Using swap memory")])])])]),a("li",[a("a",{attrs:{href:"#btcpay-server-keeps-showing-that-my-node-is-always-starting"}},[e._v("BTCPay Server keeps showing that my node is always starting")]),a("ul",[a("li",[a("a",{attrs:{href:"#cause-1-you-do-not-have-enough-ram"}},[e._v("Cause 1: You do not have enough RAM")])]),a("li",[a("a",{attrs:{href:"#cause-2-you-do-not-have-enough-storage"}},[e._v("Cause 2: You do not have enough storage")])]),a("li",[a("a",{attrs:{href:"#cause-3-you-accidentally-disabled-pruning"}},[e._v("Cause 3: You accidentally disabled pruning")])]),a("li",[a("a",{attrs:{href:"#cause-4-your-bitcoin-data-directory-is-corrupted"}},[e._v("Cause 4: Your bitcoin data directory is corrupted")])]),a("li",[a("a",{attrs:{href:"#cause-5-your-last-wallet-synchronisation-goes-beyond-pruned-data"}},[e._v("Cause 5: Your last wallet synchronisation goes beyond pruned data")])])])]),a("li",[a("a",{attrs:{href:"#im-running-a-full-node-and-have-a-synched-blockchain-can-btcpay-use-it-so-that-it-doesnt-have-to-do-a-full-sync"}},[e._v("I'm running a full node and have a synched blockchain, can BTCPay use it so that it doesn't have to do a full sync?")])]),a("li",[a("a",{attrs:{href:"#how-to-enable-bitcoin-node-pruning"}},[e._v("How to enable Bitcoin node pruning?")])]),a("li",[a("a",{attrs:{href:"#how-to-disable-bitcoin-node-pruning"}},[e._v("How to disable Bitcoin node pruning?")])])])]),a("p"),e._v(" "),a("h2",{attrs:{id:"why-does-btcpay-sync"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#why-does-btcpay-sync"}},[e._v("#")]),e._v(" Why does BTCPay sync?")]),e._v(" "),a("p",[e._v("After deployment, your BTCPay Server needs to sync the entire blockchain and validate all the consensus rules. Depending on your machine specifications, bandwidth and number of altcoins you added, this process may take between 1-5 days.")]),e._v(" "),a("p",[e._v("It may seem tedious, but it's a critical step of running your own full node and not having to trust or rely on anyone. Your node will not only download ~300GB of data (less if you're using a pruned node) but also validate all the rules of the consensus. You can find more information about the importance of blockchain synchronization in "),a("a",{attrs:{href:"https://www.youtube.com/watch?v=OrYDehC-8TU",target:"_blank",rel:"noopener noreferrer"}},[e._v("this video"),a("OutboundLink")],1),e._v(".")]),e._v(" "),a("p",[e._v("If you are only interested in learning about BTCPay Server i.e. simply "),a("RouterLink",{attrs:{to:"/TryItOut/"}},[e._v("trying it out")]),e._v(" without deploying your own instance, you can avoid sync by using a "),a("RouterLink",{attrs:{to:"/Deployment/ThirdPartyHosting/"}},[e._v("Third-Party host")]),e._v(".")],1),e._v(" "),a("h2",{attrs:{id:"can-i-skip-the-synchronization"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#can-i-skip-the-synchronization"}},[e._v("#")]),e._v(" Can I skip the synchronization?")]),e._v(" "),a("p",[e._v("You can't skip synchronization if you are deploying a BTCPay Server, but you can drastically decrease the time it takes. If you're comfortable with using the command line, you can use FastSync to synchronize your node faster. Be sure to "),a("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver-docker/tree/master/contrib/FastSync",target:"_blank",rel:"noopener noreferrer"}},[e._v("read this FastSync document"),a("OutboundLink")],1),e._v(" to understand the potential trust issues involved with this feature.")]),e._v(" "),a("p",[e._v("To use FastSync, make sure your deployment has a "),a("a",{attrs:{href:"#how-to-enable-bitcoin-node-pruning"}},[e._v("pruning option enabled")]),e._v(" by using an "),a("code",[e._v("opt-save-storage")]),e._v(" environment variable, otherwise bitcoind will not be able to sync. First step is to "),a("RouterLink",{attrs:{to:"/FAQ/ServerSettings/#how-to-ssh-into-my-btcpay-running-on-vps"}},[e._v("ssh into")]),e._v(" your BTCPayServer instance and run the following commands:")],1),e._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[a("span",{pre:!0,attrs:{class:"token function"}},[e._v("sudo")]),e._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[e._v("su")]),e._v(" -\n"),a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("cd")]),e._v(" "),a("span",{pre:!0,attrs:{class:"token variable"}},[e._v("$BTCPAY_BASE_DIRECTORY")]),e._v("/btcpayserver-docker/\nbtcpay-down.sh\n"),a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("cd")]),e._v(" contrib/FastSync\n./load-utxo-set.sh\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[e._v("# Once FastSync has completed")]),e._v("\nbtcpay-up.sh\n")])])]),a("p",[e._v("After FastSync is complete and you have brought back up your instance, refresh your BTCPay domain and wait for remaining blockchain synchronization. You can also follow "),a("a",{attrs:{href:"https://youtube.com/watch?v=VNMnd-dX9Q8?t=1730",target:"_blank",rel:"noopener noreferrer"}},[e._v("this video"),a("OutboundLink")],1),e._v(".")]),e._v(" "),a("p",[e._v("If your FastSync returns "),a("code",[e._v("You need to delete your Bitcoin Core wallet")]),e._v(" after you load the uxto set, or you find this error: "),a("code",[e._v("Last wallet synchronisation goes beyond pruned data")]),e._v(", see the cause of "),a("a",{attrs:{href:"#btcpay-server-keeps-showing-that-my-node-is-always-starting"}},[e._v("BTCPay Server keeps showing that my node is always starting")]),e._v(".")]),e._v(" "),a("h2",{attrs:{id:"how-do-i-know-that-btcpay-synced-completely"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#how-do-i-know-that-btcpay-synced-completely"}},[e._v("#")]),e._v(" How do I know that BTCPay synced completely?")]),e._v(" "),a("p",[e._v("When you do not see a pop-up message in the bottom right corner, which shows the sync progress, that means that your server is fully synced and you can "),a("RouterLink",{attrs:{to:"/RegisterAccount/"}},[e._v("begin using it")]),e._v(".")],1),e._v(" "),a("p",[e._v("If you want to check that your BTCPay Server Bitcoin node is synchronized with the most recent block in the Bitcoin blockchain, "),a("a",{attrs:{href:"#how-can-i-check-the-block-height-of-my-bitcoin-node"}},[e._v("check your node height")]),e._v(" matches the current block height using any blockchain explorer.")]),e._v(" "),a("h2",{attrs:{id:"how-can-i-check-the-block-height-of-my-bitcoin-node"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#how-can-i-check-the-block-height-of-my-bitcoin-node"}},[e._v("#")]),e._v(" How can I check the block height of my bitcoin node?")]),e._v(" "),a("p",[e._v("To verify the sync status of your Bitcoin node, you can use bitcoin-cli commands inside your server's Bitcoin container. SSH into your server and navigate to the directory where you "),a("RouterLink",{attrs:{to:"/Troubleshooting/#23-bitcoin-node-logs"}},[e._v("view Bitcoin logs")]),e._v(" run the command: "),a("code",[e._v("bitcoin-cli.sh getblockcount")]),e._v(" to view the current block of your server's Bitcoin node.")],1),e._v(" "),a("h2",{attrs:{id:"btcpay-server-takes-forever-to-synchronize"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#btcpay-server-takes-forever-to-synchronize"}},[e._v("#")]),e._v(" BTCPay Server takes forever to synchronize")]),e._v(" "),a("p",[e._v("Synchronizing a Full Bitcoin node should take between 1 and 5 days. It should sync quickly at first and more slowly at the end.")]),e._v(" "),a("p",[e._v("If the node appears to not be syncing, verify:")]),e._v(" "),a("ul",[a("li",[e._v("Not enough CPU")]),e._v(" "),a("li",[e._v("Using swap memory")])]),e._v(" "),a("h3",{attrs:{id:"cause-1-not-enough-cpu"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#cause-1-not-enough-cpu"}},[e._v("#")]),e._v(" Cause 1: Not enough CPU")]),e._v(" "),a("p",[e._v("We recommend 2 CPU while synchronizing; however some hosting providers throttle your CPU if you use too much.")]),e._v(" "),a("p",[e._v("Check with")]),e._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[a("span",{pre:!0,attrs:{class:"token function"}},[e._v("sudo")]),e._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[e._v("su")]),e._v(" -\n"),a("span",{pre:!0,attrs:{class:"token function"}},[e._v("docker")]),e._v(" stats\n")])])]),a("p",[e._v("If you see more than 100% CPU usage, while being very slow to sync:")]),e._v(" "),a("div",{staticClass:"language- extra-class"},[a("pre",{pre:!0,attrs:{class:"language-text"}},[a("code",[e._v("8e7ac41e6e2a btcpayserver_bitcoind 100% 560.5MiB / 3.853GiB 14.20% 4.17\n")])])]),a("p",[e._v("Then you need to scale up your machine specification.")]),e._v(" "),a("p",[e._v("If you see very low CPU usage (less than 10%) during synchronization:")]),e._v(" "),a("div",{staticClass:"language- extra-class"},[a("pre",{pre:!0,attrs:{class:"language-text"}},[a("code",[e._v("8e7ac41e6e2a btcpayserver_bitcoind 10% 560.5MiB / 3.853GiB 14.20% 4.17\n")])])]),a("p",[e._v("Your hosting provider might throttle your CPU. Please make sure your host supports the high use of CPU for an extended period.")]),e._v(" "),a("p",[e._v("If they don't allow it, shut down your server until they stop throttling you. Then you can limit the CPU via docker, and restart the server:")]),e._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[a("span",{pre:!0,attrs:{class:"token function"}},[e._v("docker")]),e._v(" update btcpayserver_bitcoind "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("--cpus")]),e._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[e._v('".8"')]),e._v("\n")])])]),a("h3",{attrs:{id:"cause-2-using-swap-memory"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#cause-2-using-swap-memory"}},[e._v("#")]),e._v(" Cause 2: Using swap memory")]),e._v(" "),a("p",[e._v("If you are synching and don't have enough memory, your server may use swap memory to continue operating:")]),e._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[a("span",{pre:!0,attrs:{class:"token function"}},[e._v("sudo")]),e._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[e._v("su")]),e._v(" -\n"),a("span",{pre:!0,attrs:{class:"token function"}},[e._v("free")]),e._v(" "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-h")]),e._v("\n")])])]),a("p",[e._v("If you see swap memory usage:")]),e._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[e._v(" total used "),a("span",{pre:!0,attrs:{class:"token function"}},[e._v("free")]),e._v(" shared buff/cache available\nMem: "),a("span",{pre:!0,attrs:{class:"token number"}},[e._v("2")]),e._v(".0G "),a("span",{pre:!0,attrs:{class:"token number"}},[e._v("2")]),e._v(".0G 0M 66M 0G 0M\nSwap: "),a("span",{pre:!0,attrs:{class:"token number"}},[e._v("1")]),e._v(".0G 200M 800M\n")])])]),a("p",[e._v("Then it means you need to scale up your server by adding more memory.")]),e._v(" "),a("h2",{attrs:{id:"btcpay-server-keeps-showing-that-my-node-is-always-starting"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#btcpay-server-keeps-showing-that-my-node-is-always-starting"}},[e._v("#")]),e._v(" BTCPay Server keeps showing that my node is always starting")]),e._v(" "),a("p",[e._v("Possible cause:")]),e._v(" "),a("ul",[a("li",[e._v("You do not have enough RAM")]),e._v(" "),a("li",[e._v("You do not have enough storage")]),e._v(" "),a("li",[e._v("You accidentally disabled pruning")]),e._v(" "),a("li",[e._v("Your bitcoin data directory is corrupted")]),e._v(" "),a("li",[e._v("Your last wallet synchronisation goes beyond pruned data")])]),e._v(" "),a("h3",{attrs:{id:"cause-1-you-do-not-have-enough-ram"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#cause-1-you-do-not-have-enough-ram"}},[e._v("#")]),e._v(" Cause 1: You do not have enough RAM")]),e._v(" "),a("p",[e._v("Check your RAM:")]),e._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[a("span",{pre:!0,attrs:{class:"token function"}},[e._v("sudo")]),e._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[e._v("su")]),e._v(" -\n"),a("span",{pre:!0,attrs:{class:"token function"}},[e._v("free")]),e._v(" "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-h")]),e._v("\n")])])]),a("p",[e._v("If you see that you have no "),a("code",[e._v("free")]),e._v(" or very little "),a("code",[e._v("available")]),e._v(" memory:")]),e._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[e._v(" total used "),a("span",{pre:!0,attrs:{class:"token function"}},[e._v("free")]),e._v(" shared buff/cache available\nMem: "),a("span",{pre:!0,attrs:{class:"token number"}},[e._v("2")]),e._v(".0G "),a("span",{pre:!0,attrs:{class:"token number"}},[e._v("2")]),e._v(".0G 0M 66M 0G 0M\nSwap: 0B 0B 0B\n")])])]),a("p",[e._v("Then you need more memory. If you have already synched your node, you can add some swap memory. If you haven't, your server specs are too limited.")]),e._v(" "),a("p",[e._v("If you have already synched, you can add 2G of swap memory with:")]),e._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[e._v("fallocate "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-l")]),e._v(" 2G /mnt/swapfile\n"),a("span",{pre:!0,attrs:{class:"token function"}},[e._v("chmod")]),e._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[e._v("600")]),e._v(" /mnt/swapfile\n"),a("span",{pre:!0,attrs:{class:"token function"}},[e._v("mkswap")]),e._v(" /mnt/swapfile\n"),a("span",{pre:!0,attrs:{class:"token function"}},[e._v("swapon")]),e._v(" /mnt/swapfile\n"),a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("echo")]),e._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[e._v('"/mnt/swapfile none swap sw 0 0"')]),e._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[e._v(">>")]),e._v(" /etc/fstab\n")])])]),a("h3",{attrs:{id:"cause-2-you-do-not-have-enough-storage"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#cause-2-you-do-not-have-enough-storage"}},[e._v("#")]),e._v(" Cause 2: You do not have enough storage")]),e._v(" "),a("p",[e._v("Check the storage of your machine:")]),e._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[a("span",{pre:!0,attrs:{class:"token function"}},[e._v("sudo")]),e._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[e._v("su")]),e._v(" -\n"),a("span",{pre:!0,attrs:{class:"token function"}},[e._v("df")]),e._v(" "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-h")]),e._v("\n")])])]),a("p",[e._v("If you see you don't have any storage left (/dev/sda1 in my case)")]),e._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[e._v("Filesystem Size Used Avail Use% Mounted on\nudev "),a("span",{pre:!0,attrs:{class:"token number"}},[e._v("2")]),e._v(".0G "),a("span",{pre:!0,attrs:{class:"token number"}},[e._v("0")]),e._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[e._v("2")]),e._v(".0G "),a("span",{pre:!0,attrs:{class:"token number"}},[e._v("0")]),e._v("% /dev\ntmpfs 395M 41M 354M "),a("span",{pre:!0,attrs:{class:"token number"}},[e._v("11")]),e._v("% /run\n/dev/sda1 125G 125G 0G "),a("span",{pre:!0,attrs:{class:"token number"}},[e._v("100")]),e._v("% /\ntmpfs "),a("span",{pre:!0,attrs:{class:"token number"}},[e._v("2")]),e._v(".0G "),a("span",{pre:!0,attrs:{class:"token number"}},[e._v("0")]),e._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[e._v("2")]),e._v(".0G "),a("span",{pre:!0,attrs:{class:"token number"}},[e._v("0")]),e._v("% /dev/shm\ntmpfs "),a("span",{pre:!0,attrs:{class:"token number"}},[e._v("5")]),e._v(".0M "),a("span",{pre:!0,attrs:{class:"token number"}},[e._v("0")]),e._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[e._v("5")]),e._v(".0M "),a("span",{pre:!0,attrs:{class:"token number"}},[e._v("0")]),e._v("% /run/lock\ntmpfs "),a("span",{pre:!0,attrs:{class:"token number"}},[e._v("2")]),e._v(".0G "),a("span",{pre:!0,attrs:{class:"token number"}},[e._v("0")]),e._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[e._v("2")]),e._v(".0G "),a("span",{pre:!0,attrs:{class:"token number"}},[e._v("0")]),e._v("% /sys/fs/cgroup\n/dev/sdb1 "),a("span",{pre:!0,attrs:{class:"token number"}},[e._v("7")]),e._v(".8G 18M "),a("span",{pre:!0,attrs:{class:"token number"}},[e._v("7")]),e._v(".4G "),a("span",{pre:!0,attrs:{class:"token number"}},[e._v("1")]),e._v("% /mnt\n")])])]),a("p",[a("RouterLink",{attrs:{to:"/Docker/#generated-docker-compose"}},[e._v("Choose the docker fragment")]),e._v(" for the amount of storage you aim to keep. Then "),a("RouterLink",{attrs:{to:"/Docker/#how-i-can-prune-my-nodes"}},[e._v("prune your node")]),e._v(".")],1),e._v(" "),a("h3",{attrs:{id:"cause-3-you-accidentally-disabled-pruning"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#cause-3-you-accidentally-disabled-pruning"}},[e._v("#")]),e._v(" Cause 3: You accidentally disabled pruning")]),e._v(" "),a("p",[e._v("If you have recently tried to modify your environment variables using the "),a("code",[e._v('export BTCPAYGEN_ADDITIONAL_FRAGMENTS="xyz"')]),e._v(" command to add an additional fragment, but forgot to include your current ones, you may have disabled pruning.")]),e._v(" "),a("p",[e._v("If you don't have enough memory to store the entire Bitcoin blockchain and you don't have an "),a("code",[e._v("opt-save-storage")]),e._v(" listed when you "),a("RouterLink",{attrs:{to:"/FAQ/Deployment/#how-can-i-modify-or-deactivate-environment-variables"}},[e._v("print the complete list of options")]),e._v(" that you are running, it is very likely you have disabled pruning.")],1),e._v(" "),a("p",[e._v("You can verify by checking your Bitcoind logs:")]),e._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[a("span",{pre:!0,attrs:{class:"token function"}},[e._v("sudo")]),e._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[e._v("su")]),e._v(" -\n"),a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("cd")]),e._v(" btcpayserver-docker\n"),a("span",{pre:!0,attrs:{class:"token function"}},[e._v("docker")]),e._v(" logs "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("--tail")]),e._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[e._v("100")]),e._v(" btcpayserver_bitcoind\n")])])]),a("p",[e._v("If you see:")]),e._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[e._v("Block files have previously been pruned.\nYou need to rebuild the database using "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-reindex")]),e._v(" to go back to unpruned mode.\nThis will redownload the entire blockchain.\nPlease restart with "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-reindex")]),e._v(" or -reindex-chainstate to recover.\n")])])]),a("p",[e._v("You can simply "),a("a",{attrs:{href:"#how-to-enable-bitcoin-node-pruning"}},[e._v("re-enable pruning")]),e._v(" to solve the issue.")]),e._v(" "),a("h3",{attrs:{id:"cause-4-your-bitcoin-data-directory-is-corrupted"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#cause-4-your-bitcoin-data-directory-is-corrupted"}},[e._v("#")]),e._v(" Cause 4: Your bitcoin data directory is corrupted")]),e._v(" "),a("p",[e._v("Check the logs of your node:")]),e._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[a("span",{pre:!0,attrs:{class:"token function"}},[e._v("sudo")]),e._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[e._v("su")]),e._v(" -\n"),a("span",{pre:!0,attrs:{class:"token function"}},[e._v("docker")]),e._v(" logs "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("--tail")]),e._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[e._v("10")]),e._v(" btcpayserver_bitcoind\n")])])]),a("p",[e._v("If you see:")]),e._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[e._v("Please restart with "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-reindex")]),e._v(" or -reindex-chainstate to recover.\n")])])]),a("p",[e._v("Then your bitcoin data directory has been corrupted. It may be physical damage or failure of the hard drive.\nTo reindex your node:")]),e._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[e._v("btcpay-down.sh\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[e._v("# Delete 'blocks' and 'chainstate' folders")]),e._v("\n"),a("span",{pre:!0,attrs:{class:"token function"}},[e._v("rm")]),e._v(" "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-rf")]),e._v(" /var/lib/docker/volumes/generated_bitcoin_datadir/_data/blocks\n"),a("span",{pre:!0,attrs:{class:"token function"}},[e._v("rm")]),e._v(" "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-rf")]),e._v(" /var/lib/docker/volumes/generated_bitcoin_datadir/_data/chainstate\nbtcpay-up.sh\n")])])]),a("h3",{attrs:{id:"cause-5-your-last-wallet-synchronisation-goes-beyond-pruned-data"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#cause-5-your-last-wallet-synchronisation-goes-beyond-pruned-data"}},[e._v("#")]),e._v(" Cause 5: Your last wallet synchronisation goes beyond pruned data")]),e._v(" "),a("p",[e._v("This can happen if you use FastSync or import an already synched blockchain. It means that the bitcoin core wallet needs to be removed because it was created before the utxoset, likely because BTCPay Server started without the utxoset at the first boot. To verify this case, "),a("RouterLink",{attrs:{to:"/Troubleshooting/#21-btcpay-logs"}},[e._v("check the bitcoind log")]),e._v(" for this:")],1),e._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[e._v("Error: Prune: last wallet synchronisation goes beyond pruned data. You need to "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-reindex")]),e._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("(")]),e._v("download the whole blockchain again "),a("span",{pre:!0,attrs:{class:"token keyword"}},[e._v("in")]),e._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[e._v("case")]),e._v(" of pruned "),a("span",{pre:!0,attrs:{class:"token function"}},[e._v("node")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(")")]),e._v("\n")])])]),a("p",[e._v("If you see this error and agree to remove the wallet to finish syncing, use "),a("code",[e._v("docker volume rm generated_bitcoin_wallet_datadir")]),e._v(" after you run "),a("code",[e._v("btcpay-down.sh")]),e._v(" and before you run "),a("code",[e._v("btcpay-up.sh")]),e._v("\nWARNING: Do not delete this wallet if you have any funds on it.")]),e._v(" "),a("h2",{attrs:{id:"im-running-a-full-node-and-have-a-synched-blockchain-can-btcpay-use-it-so-that-it-doesnt-have-to-do-a-full-sync"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#im-running-a-full-node-and-have-a-synched-blockchain-can-btcpay-use-it-so-that-it-doesnt-have-to-do-a-full-sync"}},[e._v("#")]),e._v(" I'm running a full node and have a synched blockchain, can BTCPay use it so that it doesn't have to do a full sync?")]),e._v(" "),a("p",[e._v("Yes you can! However, before you do that, you'll want to stop bitcoind from updating docker's volume for it, as that job will be taken over by BTCPay Server.")]),e._v(" "),a("p",[e._v("If you want to run BTCPay Server inside a docker-compose, and that you have the data directory ("),a("code",[e._v(".bitcoin")]),e._v(") of a fully synched node on your docker host, then you can reuse it easily for BTCPay Server.")]),e._v(" "),a("p",[e._v("To do that, follow the following steps :")]),e._v(" "),a("ul",[a("li",[e._v("Do the normal setup according to "),a("RouterLink",{attrs:{to:"/Docker/"}},[e._v("this instruction")]),e._v(". Note the "),a("code",[e._v("opt-save-storage")]),e._v(" environment variable, which is used to enable various pruning levels. If you do not want to prune your exiting data directory, then omit the following line in your BTCPay docker deployment: "),a("code",[e._v('export BTCPAYGEN_ADDITIONAL_FRAGMENTS="opt-save-storage-s"')]),e._v(".")],1),e._v(" "),a("li",[e._v("Once "),a("code",[e._v("btcpay-setup.sh")]),e._v(" is over, turn down the docker compose with "),a("code",[e._v("btcpay-down.sh")]),e._v(".")]),e._v(" "),a("li",[e._v("Login as root with "),a("code",[e._v("sudo su -")]),e._v(".")]),e._v(" "),a("li",[e._v("Open the docker's volume for bitcoind : "),a("code",[e._v("cd /var/lib/docker/volumes/generated_bitcoin_datadir/")]),e._v(", and check its content with "),a("code",[e._v("ls -la")]),e._v(". You should see only one directory named "),a("code",[e._v("_data")]),e._v(".")]),e._v(" "),a("li",[e._v("Now remove the "),a("code",[e._v("_data")]),e._v("directory : "),a("code",[e._v("rm -r _data")]),e._v(". If for any reason you want to keep this directory and its content you can also rename it instead : "),a("code",[e._v("mv _data/ _data.old/")])]),e._v(" "),a("li",[e._v("Now create a "),a("a",{attrs:{href:"https://www.cyberciti.biz/faq/creating-soft-link-or-symbolic-link/",target:"_blank",rel:"noopener noreferrer"}},[e._v("symbolic link"),a("OutboundLink")],1),e._v(" between "),a("code",[e._v("/var/lib/docker/volumes/generated_bitcoin_datadir/_data")]),e._v(" and your data directory ("),a("code",[e._v(".bitcoin")]),e._v(") on your host: "),a("code",[e._v("ln -s path/to/.bitcoin /var/lib/docker/volumes/generated_bitcoin_datadir/_data")])]),e._v(" "),a("li",[e._v("Check that the link has been done with a "),a("code",[e._v("ls -la")])]),e._v(" "),a("li",[e._v("Start your docker-compose again with "),a("code",[e._v("btcpay-up.sh")])])]),e._v(" "),a("p",[e._v("Your BTCPay Server should now be fully synched.")]),e._v(" "),a("p",[e._v("If after this BTCPay Server keeps showing that your node is always starting, see the cause of "),a("a",{attrs:{href:"#btcpay-server-keeps-showing-that-my-node-is-always-starting"}},[e._v("BTCPay Server keeps showing that my node is always starting")]),e._v(".")]),e._v(" "),a("h2",{attrs:{id:"how-to-enable-bitcoin-node-pruning"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#how-to-enable-bitcoin-node-pruning"}},[e._v("#")]),e._v(" How to enable Bitcoin node pruning?")]),e._v(" "),a("p",[e._v("This will prune your Bitcoin full node to a maximum of 100GB (of blocks):")]),e._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[a("span",{pre:!0,attrs:{class:"token function"}},[e._v("sudo")]),e._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[e._v("su")]),e._v(" -\n"),a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("cd")]),e._v(" btcpayserver-docker\n"),a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("export")]),e._v(" "),a("span",{pre:!0,attrs:{class:"token assign-left variable"}},[e._v("BTCPAYGEN_ADDITIONAL_FRAGMENTS")]),a("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),a("span",{pre:!0,attrs:{class:"token string"}},[e._v('"opt-save-storage"')]),e._v("\n"),a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v(".")]),e._v(" ./btcpay-setup.sh "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-i")]),e._v("\n")])])]),a("p",[e._v("Other pruning options are "),a("RouterLink",{attrs:{to:"/Docker/#generated-docker-compose"}},[e._v("documented here")]),e._v(". See "),a("RouterLink",{attrs:{to:"/FAQ/Deployment/#how-can-i-modify-or-deactivate-environment-variables"}},[e._v("this example")]),e._v(" for use with other additional fragments.")],1),e._v(" "),a("h2",{attrs:{id:"how-to-disable-bitcoin-node-pruning"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#how-to-disable-bitcoin-node-pruning"}},[e._v("#")]),e._v(" How to disable Bitcoin node pruning?")]),e._v(" "),a("p",[e._v("To disable pruning of your Bitcoin node in BTCPay, first ensure you have enough memory to store the entire blockchain and BTCPayServer on your system. Then disable the "),a("code",[e._v("opt-save-storage")]),e._v(" environment variable. See "),a("RouterLink",{attrs:{to:"/FAQ/Deployment/#how-can-i-modify-or-deactivate-environment-variables"}},[e._v("this example")]),e._v(" to view your fragment list and select only one for removal. The following example will remove "),a("strong",[e._v("all")]),e._v(" additional fragments:")],1),e._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("export")]),e._v(" "),a("span",{pre:!0,attrs:{class:"token assign-left variable"}},[e._v("BTCPAYGEN_ADDITIONAL_FRAGMENTS")]),a("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),a("span",{pre:!0,attrs:{class:"token string"}},[e._v('""')]),e._v("\n"),a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v(".")]),e._v(" ./btcpay-setup.sh "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-i")]),e._v("\n")])])]),a("p",[e._v("Then run the following commands to recreate a non-pruned Bitcoin node:")]),e._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[e._v("btcpay-down.sh\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[e._v("# Delete 'blocks' and 'chainstate' folders")]),e._v("\n"),a("span",{pre:!0,attrs:{class:"token function"}},[e._v("rm")]),e._v(" "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-rf")]),e._v(" /var/lib/docker/volumes/generated_bitcoin_datadir/_data/blocks\n"),a("span",{pre:!0,attrs:{class:"token function"}},[e._v("rm")]),e._v(" "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-rf")]),e._v(" /var/lib/docker/volumes/generated_bitcoin_datadir/_data/chainstate\nbtcpay-up.sh\n")])])])])}),[],!1,null,null,null);a.default=n.exports}}]); \ No newline at end of file diff --git a/assets/js/141.6bee0182.js b/assets/js/141.6a62f261.js similarity index 98% rename from assets/js/141.6bee0182.js rename to assets/js/141.6a62f261.js index ac3e4135d2..1c6166124b 100644 --- a/assets/js/141.6bee0182.js +++ b/assets/js/141.6a62f261.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[141],{790:function(t,e,a){"use strict";a.r(e);var n=a(10),l=Object(n.a)({},(function(){var t=this,e=t._self._c;return e("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[e("h1",{attrs:{id:"lndhub-compatibility"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#lndhub-compatibility"}},[t._v("#")]),t._v(" LNDhub Compatibility")]),t._v(" "),e("p",[t._v("LNbank offers a LNDhub-compatible API since v1.3.0.\nThis means that LNbank wallets are usable with the following wallet apps:")]),t._v(" "),e("ul",[e("li",[e("a",{attrs:{href:"https://bluewallet.io/",target:"_blank",rel:"noopener noreferrer"}},[t._v("BlueWallet"),e("OutboundLink")],1)]),t._v(" "),e("li",[e("a",{attrs:{href:"https://zeusln.app/",target:"_blank",rel:"noopener noreferrer"}},[t._v("Zeus"),e("OutboundLink")],1)]),t._v(" "),e("li",[e("a",{attrs:{href:"https://getalby.com/",target:"_blank",rel:"noopener noreferrer"}},[t._v("Alby"),e("OutboundLink")],1)])]),t._v(" "),e("p",[t._v("These wallets offer import features, so that you can easily import your LNbank wallets into these apps.")]),t._v(" "),e("div",{staticClass:"custom-block tip"},[e("p",{staticClass:"custom-block-title"},[t._v("NOTE")]),t._v(" "),e("p",[t._v('The prerequisite for a wallet to be accessible like this is having an access key with the admin permission tight to it.\nThe access keys can be managed by wallet admins on the LNbank wallet settings "Access Keys" page.')])]),t._v(" "),e("h2",{attrs:{id:"importing-the-wallet"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#importing-the-wallet"}},[t._v("#")]),t._v(" Importing the wallet")]),t._v(" "),e("p",[t._v('In the wallet settings you will find the "Connect LNDhub-compatible wallet" section.\nIt has a QR code and the account URL, which contain the details (server URL and credentials) to connect the apps.')]),t._v(" "),e("div",{staticClass:"custom-block danger"},[e("p",{staticClass:"custom-block-title"},[t._v("WARNING")]),t._v(" "),e("p",[t._v("The credentials allow unrestricted access to your LNbank wallet.\nTreat the QR code and account URL as confidential information!")])]),t._v(" "),e("h3",{attrs:{id:"bluewallet"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#bluewallet"}},[t._v("#")]),t._v(" BlueWallet")]),t._v(" "),e("p",[t._v("In BlueWallet you can use this path to import the wallet:")]),t._v(" "),e("p",[e("code",[t._v("Add Wallet > Import Wallet > Scan or import file")]),t._v(".")]),t._v(" "),e("p",[t._v("You can then scan the QR code from the LNbank wallet settings.\nOnce the wallet is imported, you can also set a name.")]),t._v(" "),e("h3",{attrs:{id:"zeus"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#zeus"}},[t._v("#")]),t._v(" Zeus")]),t._v(" "),e("p",[t._v("In Zeus you can use this path to import the wallet:")]),t._v(" "),e("ul",[e("li",[t._v("Open the settings by clicking on the node icon in the top left corner.")]),t._v(" "),e("li",[t._v("In the settings click the node (first row) to get to the list of nodes.")]),t._v(" "),e("li",[t._v("Click the plus icon in the top right corner to add a new node/wallet.")])]),t._v(" "),e("p",[t._v("You will land on the following screen and have to …")]),t._v(" "),e("ul",[e("li",[t._v('Choose "LNDHub" as the "Node Interface"')]),t._v(" "),e("li",[t._v('Enable the "Existing account" toggle')]),t._v(" "),e("li",[t._v('Click the "Scan LNDHub QR" button and scan the code')])]),t._v(" "),e("h3",{attrs:{id:"alby"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#alby"}},[t._v("#")]),t._v(" Alby")]),t._v(" "),e("p",[t._v('In the Alby account dropdown, choos "Add a new account".\nOn the "Add a new lightning account" choose "LNDHub (BlueWallet)".')]),t._v(" "),e("p",[t._v('Now you can either copy and paste the account URL from the LNbank wallet settings page or scan the QR code.\nOnce the account is initialized, you should see a "Success!" message.')])])}),[],!1,null,null,null);e.default=l.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[141],{789:function(t,e,a){"use strict";a.r(e);var n=a(10),l=Object(n.a)({},(function(){var t=this,e=t._self._c;return e("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[e("h1",{attrs:{id:"lndhub-compatibility"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#lndhub-compatibility"}},[t._v("#")]),t._v(" LNDhub Compatibility")]),t._v(" "),e("p",[t._v("LNbank offers a LNDhub-compatible API since v1.3.0.\nThis means that LNbank wallets are usable with the following wallet apps:")]),t._v(" "),e("ul",[e("li",[e("a",{attrs:{href:"https://bluewallet.io/",target:"_blank",rel:"noopener noreferrer"}},[t._v("BlueWallet"),e("OutboundLink")],1)]),t._v(" "),e("li",[e("a",{attrs:{href:"https://zeusln.app/",target:"_blank",rel:"noopener noreferrer"}},[t._v("Zeus"),e("OutboundLink")],1)]),t._v(" "),e("li",[e("a",{attrs:{href:"https://getalby.com/",target:"_blank",rel:"noopener noreferrer"}},[t._v("Alby"),e("OutboundLink")],1)])]),t._v(" "),e("p",[t._v("These wallets offer import features, so that you can easily import your LNbank wallets into these apps.")]),t._v(" "),e("div",{staticClass:"custom-block tip"},[e("p",{staticClass:"custom-block-title"},[t._v("NOTE")]),t._v(" "),e("p",[t._v('The prerequisite for a wallet to be accessible like this is having an access key with the admin permission tight to it.\nThe access keys can be managed by wallet admins on the LNbank wallet settings "Access Keys" page.')])]),t._v(" "),e("h2",{attrs:{id:"importing-the-wallet"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#importing-the-wallet"}},[t._v("#")]),t._v(" Importing the wallet")]),t._v(" "),e("p",[t._v('In the wallet settings you will find the "Connect LNDhub-compatible wallet" section.\nIt has a QR code and the account URL, which contain the details (server URL and credentials) to connect the apps.')]),t._v(" "),e("div",{staticClass:"custom-block danger"},[e("p",{staticClass:"custom-block-title"},[t._v("WARNING")]),t._v(" "),e("p",[t._v("The credentials allow unrestricted access to your LNbank wallet.\nTreat the QR code and account URL as confidential information!")])]),t._v(" "),e("h3",{attrs:{id:"bluewallet"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#bluewallet"}},[t._v("#")]),t._v(" BlueWallet")]),t._v(" "),e("p",[t._v("In BlueWallet you can use this path to import the wallet:")]),t._v(" "),e("p",[e("code",[t._v("Add Wallet > Import Wallet > Scan or import file")]),t._v(".")]),t._v(" "),e("p",[t._v("You can then scan the QR code from the LNbank wallet settings.\nOnce the wallet is imported, you can also set a name.")]),t._v(" "),e("h3",{attrs:{id:"zeus"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#zeus"}},[t._v("#")]),t._v(" Zeus")]),t._v(" "),e("p",[t._v("In Zeus you can use this path to import the wallet:")]),t._v(" "),e("ul",[e("li",[t._v("Open the settings by clicking on the node icon in the top left corner.")]),t._v(" "),e("li",[t._v("In the settings click the node (first row) to get to the list of nodes.")]),t._v(" "),e("li",[t._v("Click the plus icon in the top right corner to add a new node/wallet.")])]),t._v(" "),e("p",[t._v("You will land on the following screen and have to …")]),t._v(" "),e("ul",[e("li",[t._v('Choose "LNDHub" as the "Node Interface"')]),t._v(" "),e("li",[t._v('Enable the "Existing account" toggle')]),t._v(" "),e("li",[t._v('Click the "Scan LNDHub QR" button and scan the code')])]),t._v(" "),e("h3",{attrs:{id:"alby"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#alby"}},[t._v("#")]),t._v(" Alby")]),t._v(" "),e("p",[t._v('In the Alby account dropdown, choos "Add a new account".\nOn the "Add a new lightning account" choose "LNDHub (BlueWallet)".')]),t._v(" "),e("p",[t._v('Now you can either copy and paste the account URL from the LNbank wallet settings page or scan the QR code.\nOnce the account is initialized, you should see a "Success!" message.')])])}),[],!1,null,null,null);e.default=l.exports}}]); \ No newline at end of file diff --git a/assets/js/142.ea09220f.js b/assets/js/142.cbda8d1e.js similarity index 99% rename from assets/js/142.ea09220f.js rename to assets/js/142.cbda8d1e.js index f6c3d59d94..70866f3e19 100644 --- a/assets/js/142.ea09220f.js +++ b/assets/js/142.cbda8d1e.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[142],{791:function(e,t,n){"use strict";n.r(t);var a=n(10),s=Object(a.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"troubleshooting"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#troubleshooting"}},[e._v("#")]),e._v(" Troubleshooting")]),e._v(" "),t("h2",{attrs:{id:"debugging-connection-problems"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#debugging-connection-problems"}},[e._v("#")]),e._v(" Debugging connection problems")]),e._v(" "),t("p",[e._v('On the Lightning node connection setting screen, switch to "Use custom node".\nThere you will find the LNbank connection string, which looks like this:')]),e._v(" "),t("div",{staticClass:"language- extra-class"},[t("pre",{pre:!0,attrs:{class:"language-text"}},[t("code",[e._v("type=lnbank;server=https://mybtcpay.com/;api-token=WALLET_ACCESS_KEY\n")])])]),t("p",[e._v('On that view you can also use the "Test connection" functionality.\nIf you encounter problems like "The Lightning node did not reply in a timely manner", it\'s most likely a DNS-related problem.')]),e._v(" "),t("h3",{attrs:{id:"dns-problems"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#dns-problems"}},[e._v("#")]),e._v(" DNS problems")]),e._v(" "),t("p",[e._v("The server that BTCPay is running on might not be able to resolve the domain (in this example "),t("code",[e._v("mybtcpay.com")]),e._v(") correctly.")]),e._v(" "),t("p",[e._v("Use the ping command to debug to the problem.\n"),t("code",[e._v("ping mybtcpay.com")]),e._v(" should point to the IP of your server:")]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[e._v("$ "),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("ping")]),e._v(" mybtcpay.com\nPING mybtcpay.com "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("(")]),e._v("XX.XX.XX.XX"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(")")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token number"}},[e._v("56")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("(")]),t("span",{pre:!0,attrs:{class:"token number"}},[e._v("84")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(")")]),e._v(" bytes of data.\n"),t("span",{pre:!0,attrs:{class:"token number"}},[e._v("64")]),e._v(" bytes from XX.XX.XX.XX "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("(")]),e._v("XX.XX.XX.XX"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(")")]),e._v(": "),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[e._v("icmp_seq")]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),t("span",{pre:!0,attrs:{class:"token number"}},[e._v("1")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[e._v("ttl")]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),t("span",{pre:!0,attrs:{class:"token number"}},[e._v("52")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[e._v("time")]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),t("span",{pre:!0,attrs:{class:"token number"}},[e._v("263")]),e._v(" ms\n")])])]),t("p",[e._v("The "),t("code",[e._v("XX.XX.XX.XX")]),e._v(" should be the external IP of the server.\nIn case you don't know it, run the same command not from your server, but from you local computer — this should give you the public IP of ythe server.\nIt the server's DNS resolves the domain to a local IP, find out where that is defined (most likely in the "),t("code",[e._v("/etc/hosts")]),e._v(" file) and remove that mapping.")]),e._v(" "),t("h3",{attrs:{id:"for-cloudflare-users"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#for-cloudflare-users"}},[e._v("#")]),e._v(" For Cloudflare users")]),e._v(" "),t("p",[e._v("If you are using Cloudflare, check if changing the folowing settings makes a difference:")]),e._v(" "),t("ul",[t("li",[e._v("Disable the "),t("a",{attrs:{href:"https://developers.cloudflare.com/bots/get-started/free/",target:"_blank",rel:"noopener noreferrer"}},[e._v("Bot Fighter Mode"),t("OutboundLink")],1)]),e._v(" "),t("li",[e._v("Switch the "),t("a",{attrs:{href:"https://developers.cloudflare.com/dns/manage-dns-records/reference/proxied-dns-records",target:"_blank",rel:"noopener noreferrer"}},[e._v("Proxy Status"),t("OutboundLink")],1),e._v(' to "Proxied" instead of "DNS only"')])]),e._v(" "),t("h3",{attrs:{id:"using-curl-for-debugging"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#using-curl-for-debugging"}},[e._v("#")]),e._v(" Using cURL for debugging")]),e._v(" "),t("p",[e._v("You can also try to access the LNbank node info via cURL, which gives you a verbose output of possible connection problems:")]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token function"}},[e._v("curl")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-vvv")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("\\")]),e._v("\n "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-H")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"Content-Type: application/json"')]),e._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("\\")]),e._v("\n "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-H")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"Authorization: Bearer WALLET_ACCESS_KEY"')]),e._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("\\")]),e._v("\n https://mybtcpay.com/plugins/lnbank/api/lightning/info\n")])])]),t("p",[e._v("This command should return the connection details as well as a JSON response containing your Lightning node information.")]),e._v(" "),t("h2",{attrs:{id:"manual-deployment"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#manual-deployment"}},[e._v("#")]),e._v(" Manual deployment")]),e._v(" "),t("p",[e._v("If you have deployed BTCPay Server using the "),t("RouterLink",{attrs:{to:"/Deployment/ManualDeploymentExtended/"}},[e._v("manual deployment")]),e._v(', you might encounter the "LNbank requires an internal Lightning node to be configured" message on the LNbank wallets overview page.')],1),e._v(" "),t("p",[e._v('In this case, make sure that you have configured the Lightning node you want to use as "internal node" using the '),t("code",[e._v("BTC.lightning")]),e._v(" setting in your "),t("RouterLink",{attrs:{to:"/Deployment/ManualDeploymentExtended/#3-create-a-configuration-file"}},[e._v("btcpay.config")]),e._v(" file:")],1),e._v(" "),t("div",{staticClass:"language- extra-class"},[t("pre",{pre:!0,attrs:{class:"language-text"}},[t("code",[e._v("BTC.lightning=type=lnd-rest;server=https://127.0.0.1:8080/;macaroonfilepath=/home/admin/.lnd/data/chain/bitcoin/mainnet/admin.macaroon\n")])])]),t("p",[e._v('See the "Use custom node" view on the Lightning node connection setting screen in BTCPay Server for details on the connection string.')]),e._v(" "),t("p",[e._v("You need to restart BTCPay Server for the settings update to take effect.")])])}),[],!1,null,null,null);t.default=s.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[142],{793:function(e,t,n){"use strict";n.r(t);var a=n(10),s=Object(a.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"troubleshooting"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#troubleshooting"}},[e._v("#")]),e._v(" Troubleshooting")]),e._v(" "),t("h2",{attrs:{id:"debugging-connection-problems"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#debugging-connection-problems"}},[e._v("#")]),e._v(" Debugging connection problems")]),e._v(" "),t("p",[e._v('On the Lightning node connection setting screen, switch to "Use custom node".\nThere you will find the LNbank connection string, which looks like this:')]),e._v(" "),t("div",{staticClass:"language- extra-class"},[t("pre",{pre:!0,attrs:{class:"language-text"}},[t("code",[e._v("type=lnbank;server=https://mybtcpay.com/;api-token=WALLET_ACCESS_KEY\n")])])]),t("p",[e._v('On that view you can also use the "Test connection" functionality.\nIf you encounter problems like "The Lightning node did not reply in a timely manner", it\'s most likely a DNS-related problem.')]),e._v(" "),t("h3",{attrs:{id:"dns-problems"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#dns-problems"}},[e._v("#")]),e._v(" DNS problems")]),e._v(" "),t("p",[e._v("The server that BTCPay is running on might not be able to resolve the domain (in this example "),t("code",[e._v("mybtcpay.com")]),e._v(") correctly.")]),e._v(" "),t("p",[e._v("Use the ping command to debug to the problem.\n"),t("code",[e._v("ping mybtcpay.com")]),e._v(" should point to the IP of your server:")]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[e._v("$ "),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("ping")]),e._v(" mybtcpay.com\nPING mybtcpay.com "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("(")]),e._v("XX.XX.XX.XX"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(")")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token number"}},[e._v("56")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("(")]),t("span",{pre:!0,attrs:{class:"token number"}},[e._v("84")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(")")]),e._v(" bytes of data.\n"),t("span",{pre:!0,attrs:{class:"token number"}},[e._v("64")]),e._v(" bytes from XX.XX.XX.XX "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("(")]),e._v("XX.XX.XX.XX"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(")")]),e._v(": "),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[e._v("icmp_seq")]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),t("span",{pre:!0,attrs:{class:"token number"}},[e._v("1")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[e._v("ttl")]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),t("span",{pre:!0,attrs:{class:"token number"}},[e._v("52")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[e._v("time")]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),t("span",{pre:!0,attrs:{class:"token number"}},[e._v("263")]),e._v(" ms\n")])])]),t("p",[e._v("The "),t("code",[e._v("XX.XX.XX.XX")]),e._v(" should be the external IP of the server.\nIn case you don't know it, run the same command not from your server, but from you local computer — this should give you the public IP of ythe server.\nIt the server's DNS resolves the domain to a local IP, find out where that is defined (most likely in the "),t("code",[e._v("/etc/hosts")]),e._v(" file) and remove that mapping.")]),e._v(" "),t("h3",{attrs:{id:"for-cloudflare-users"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#for-cloudflare-users"}},[e._v("#")]),e._v(" For Cloudflare users")]),e._v(" "),t("p",[e._v("If you are using Cloudflare, check if changing the folowing settings makes a difference:")]),e._v(" "),t("ul",[t("li",[e._v("Disable the "),t("a",{attrs:{href:"https://developers.cloudflare.com/bots/get-started/free/",target:"_blank",rel:"noopener noreferrer"}},[e._v("Bot Fighter Mode"),t("OutboundLink")],1)]),e._v(" "),t("li",[e._v("Switch the "),t("a",{attrs:{href:"https://developers.cloudflare.com/dns/manage-dns-records/reference/proxied-dns-records",target:"_blank",rel:"noopener noreferrer"}},[e._v("Proxy Status"),t("OutboundLink")],1),e._v(' to "Proxied" instead of "DNS only"')])]),e._v(" "),t("h3",{attrs:{id:"using-curl-for-debugging"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#using-curl-for-debugging"}},[e._v("#")]),e._v(" Using cURL for debugging")]),e._v(" "),t("p",[e._v("You can also try to access the LNbank node info via cURL, which gives you a verbose output of possible connection problems:")]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token function"}},[e._v("curl")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-vvv")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("\\")]),e._v("\n "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-H")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"Content-Type: application/json"')]),e._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("\\")]),e._v("\n "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-H")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"Authorization: Bearer WALLET_ACCESS_KEY"')]),e._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("\\")]),e._v("\n https://mybtcpay.com/plugins/lnbank/api/lightning/info\n")])])]),t("p",[e._v("This command should return the connection details as well as a JSON response containing your Lightning node information.")]),e._v(" "),t("h2",{attrs:{id:"manual-deployment"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#manual-deployment"}},[e._v("#")]),e._v(" Manual deployment")]),e._v(" "),t("p",[e._v("If you have deployed BTCPay Server using the "),t("RouterLink",{attrs:{to:"/Deployment/ManualDeploymentExtended/"}},[e._v("manual deployment")]),e._v(', you might encounter the "LNbank requires an internal Lightning node to be configured" message on the LNbank wallets overview page.')],1),e._v(" "),t("p",[e._v('In this case, make sure that you have configured the Lightning node you want to use as "internal node" using the '),t("code",[e._v("BTC.lightning")]),e._v(" setting in your "),t("RouterLink",{attrs:{to:"/Deployment/ManualDeploymentExtended/#3-create-a-configuration-file"}},[e._v("btcpay.config")]),e._v(" file:")],1),e._v(" "),t("div",{staticClass:"language- extra-class"},[t("pre",{pre:!0,attrs:{class:"language-text"}},[t("code",[e._v("BTC.lightning=type=lnd-rest;server=https://127.0.0.1:8080/;macaroonfilepath=/home/admin/.lnd/data/chain/bitcoin/mainnet/admin.macaroon\n")])])]),t("p",[e._v('See the "Use custom node" view on the Lightning node connection setting screen in BTCPay Server for details on the connection string.')]),e._v(" "),t("p",[e._v("You need to restart BTCPay Server for the settings update to take effect.")])])}),[],!1,null,null,null);t.default=s.exports}}]); \ No newline at end of file diff --git a/assets/js/143.6c8d56c9.js b/assets/js/143.9872e15c.js similarity index 98% rename from assets/js/143.6c8d56c9.js rename to assets/js/143.9872e15c.js index a430a20917..8f5f0716ed 100644 --- a/assets/js/143.6c8d56c9.js +++ b/assets/js/143.9872e15c.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[143],{795:function(e,n,t){"use strict";t.r(n);var i=t(10),o=Object(i.a)({},(function(){var e=this,n=e._self._c;return n("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[n("h1",{attrs:{id:"opening-and-operating-payment-channels"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#opening-and-operating-payment-channels"}},[e._v("#")]),e._v(" Opening and operating payment channels")]),e._v(" "),n("p",[e._v("Given that the Lightning Network is a relatively new technology under active development, getting your freshly deployed node ready to send and receive payments, still, requires a couple of steps.")]),e._v(" "),n("p",[e._v("Overview:")]),e._v(" "),n("ol",[n("li",[e._v("The lightning node is deployed, enabled and its on-chain wallet is funded")]),e._v(" "),n("li",[e._v("A peer is identified and the first payment channel is opened")]),e._v(" "),n("li",[e._v("Inbound and outbound liquidity is acquired. The node is now able to "),n("strong",[e._v("send")]),e._v(" and "),n("strong",[e._v("receive")])]),e._v(" "),n("li",[e._v("Liquidity management, an ongoing process to maintain the capacity to "),n("strong",[e._v("send")]),e._v(" and "),n("strong",[e._v("receive")])])]),e._v(" "),n("p",[e._v("Key considerations:")]),e._v(" "),n("ul",[n("li",[n("strong",[e._v("Choosing")]),e._v(" the channel partner. Consider opening the first channel to a well connected peer with robust uptime. This will increase the chances for your payments to be routed and settled.")]),e._v(" "),n("li",[n("strong",[e._v("Inbound")]),e._v(" vs "),n("strong",[e._v("outbound")]),e._v(" capacity. Outbound capacity allows nodes to "),n("strong",[e._v("send")]),e._v(" payments whereas inbound capacity allows nodes to "),n("strong",[e._v("receive")]),e._v(" payments. As a merchant using lightning, having inbound capacity is essential for customers to be able to pay you.")]),e._v(" "),n("li",[n("strong",[e._v("Inbound capacity")]),e._v(". A node adds inbound capacity by either spending sats from its local balance or having other nodes in the network open channels to it.")]),e._v(" "),n("li",[n("strong",[e._v("Liquidity management")]),e._v(": maintaining the ability to send and receive is a continous process where a balance between inbound vs outbound capacity has to be maintained across payment channels. This capacity distribution must be adjusted depending upon the use case of the node operator.")]),e._v(" "),n("li",[n("strong",[e._v("Lightning Service Providers")]),e._v(": LSPs offer paid third-party services that improve the ease of operating a lightning network node. Such services can be used to acquire inbound capacity or to automate the rebalancing process.")])]),e._v(" "),n("p",[e._v("Below a set of good resources for a deeper dive into topics such as:")]),e._v(" "),n("ul",[n("li",[n("a",{attrs:{href:"https://docs.lightning.engineering/the-lightning-network/the-gossip-network/identify-good-peers",target:"_blank",rel:"noopener noreferrer"}},[e._v("Good peers on the LN"),n("OutboundLink")],1)]),e._v(" "),n("li",[n("a",{attrs:{href:"https://bitcoin.design/guide/how-it-works/nodes/#lightning-nodes",target:"_blank",rel:"noopener noreferrer"}},[e._v("Lightning node types"),n("OutboundLink")],1)]),e._v(" "),n("li",[n("a",{attrs:{href:"https://bitcoin.design/guide/how-it-works/liquidity/",target:"_blank",rel:"noopener noreferrer"}},[e._v("What is Lightning liquidity?"),n("OutboundLink")],1)]),e._v(" "),n("li",[n("a",{attrs:{href:"https://lightningnetwork.plus/posts/234",target:"_blank",rel:"noopener noreferrer"}},[e._v("How to get inbound capacity?"),n("OutboundLink")],1)]),e._v(" "),n("li",[n("a",{attrs:{href:"https://docs.lightning.engineering/the-lightning-network/liquidity/manage-liquidity#rebalancing-channels",target:"_blank",rel:"noopener noreferrer"}},[e._v("How to manage liquidity?"),n("OutboundLink")],1)]),e._v(" "),n("li",[n("a",{attrs:{href:"https://bitcoin.design/guide/how-it-works/lightning-services/",target:"_blank",rel:"noopener noreferrer"}},[e._v("Lightning service providers (LSP)"),n("OutboundLink")],1)])])])}),[],!1,null,null,null);n.default=o.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[143],{794:function(e,n,t){"use strict";t.r(n);var i=t(10),o=Object(i.a)({},(function(){var e=this,n=e._self._c;return n("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[n("h1",{attrs:{id:"opening-and-operating-payment-channels"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#opening-and-operating-payment-channels"}},[e._v("#")]),e._v(" Opening and operating payment channels")]),e._v(" "),n("p",[e._v("Given that the Lightning Network is a relatively new technology under active development, getting your freshly deployed node ready to send and receive payments, still, requires a couple of steps.")]),e._v(" "),n("p",[e._v("Overview:")]),e._v(" "),n("ol",[n("li",[e._v("The lightning node is deployed, enabled and its on-chain wallet is funded")]),e._v(" "),n("li",[e._v("A peer is identified and the first payment channel is opened")]),e._v(" "),n("li",[e._v("Inbound and outbound liquidity is acquired. The node is now able to "),n("strong",[e._v("send")]),e._v(" and "),n("strong",[e._v("receive")])]),e._v(" "),n("li",[e._v("Liquidity management, an ongoing process to maintain the capacity to "),n("strong",[e._v("send")]),e._v(" and "),n("strong",[e._v("receive")])])]),e._v(" "),n("p",[e._v("Key considerations:")]),e._v(" "),n("ul",[n("li",[n("strong",[e._v("Choosing")]),e._v(" the channel partner. Consider opening the first channel to a well connected peer with robust uptime. This will increase the chances for your payments to be routed and settled.")]),e._v(" "),n("li",[n("strong",[e._v("Inbound")]),e._v(" vs "),n("strong",[e._v("outbound")]),e._v(" capacity. Outbound capacity allows nodes to "),n("strong",[e._v("send")]),e._v(" payments whereas inbound capacity allows nodes to "),n("strong",[e._v("receive")]),e._v(" payments. As a merchant using lightning, having inbound capacity is essential for customers to be able to pay you.")]),e._v(" "),n("li",[n("strong",[e._v("Inbound capacity")]),e._v(". A node adds inbound capacity by either spending sats from its local balance or having other nodes in the network open channels to it.")]),e._v(" "),n("li",[n("strong",[e._v("Liquidity management")]),e._v(": maintaining the ability to send and receive is a continous process where a balance between inbound vs outbound capacity has to be maintained across payment channels. This capacity distribution must be adjusted depending upon the use case of the node operator.")]),e._v(" "),n("li",[n("strong",[e._v("Lightning Service Providers")]),e._v(": LSPs offer paid third-party services that improve the ease of operating a lightning network node. Such services can be used to acquire inbound capacity or to automate the rebalancing process.")])]),e._v(" "),n("p",[e._v("Below a set of good resources for a deeper dive into topics such as:")]),e._v(" "),n("ul",[n("li",[n("a",{attrs:{href:"https://docs.lightning.engineering/the-lightning-network/the-gossip-network/identify-good-peers",target:"_blank",rel:"noopener noreferrer"}},[e._v("Good peers on the LN"),n("OutboundLink")],1)]),e._v(" "),n("li",[n("a",{attrs:{href:"https://bitcoin.design/guide/how-it-works/nodes/#lightning-nodes",target:"_blank",rel:"noopener noreferrer"}},[e._v("Lightning node types"),n("OutboundLink")],1)]),e._v(" "),n("li",[n("a",{attrs:{href:"https://bitcoin.design/guide/how-it-works/liquidity/",target:"_blank",rel:"noopener noreferrer"}},[e._v("What is Lightning liquidity?"),n("OutboundLink")],1)]),e._v(" "),n("li",[n("a",{attrs:{href:"https://lightningnetwork.plus/posts/234",target:"_blank",rel:"noopener noreferrer"}},[e._v("How to get inbound capacity?"),n("OutboundLink")],1)]),e._v(" "),n("li",[n("a",{attrs:{href:"https://docs.lightning.engineering/the-lightning-network/liquidity/manage-liquidity#rebalancing-channels",target:"_blank",rel:"noopener noreferrer"}},[e._v("How to manage liquidity?"),n("OutboundLink")],1)]),e._v(" "),n("li",[n("a",{attrs:{href:"https://bitcoin.design/guide/how-it-works/lightning-services/",target:"_blank",rel:"noopener noreferrer"}},[e._v("Lightning service providers (LSP)"),n("OutboundLink")],1)])])])}),[],!1,null,null,null);n.default=o.exports}}]); \ No newline at end of file diff --git a/assets/js/144.52dd7025.js b/assets/js/144.921035a4.js similarity index 96% rename from assets/js/144.52dd7025.js rename to assets/js/144.921035a4.js index 817938754a..c207e99138 100644 --- a/assets/js/144.52dd7025.js +++ b/assets/js/144.921035a4.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[144],{796:function(e,t,r){"use strict";r.r(t);var a=r(10),n=Object(a.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"btcpay-magento-integration"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#btcpay-magento-integration"}},[e._v("#")]),e._v(" BTCPay Magento Integration")]),e._v(" "),t("p",[e._v("If you're using "),t("strong",[e._v("Magento")]),e._v(", an open-source e-commerce platform written in PHP, you can "),t("strong",[e._v("integrate BTCPay Server and use it as a payment processor")]),e._v(".")]),e._v(" "),t("h2",{attrs:{id:"magento-1"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#magento-1"}},[e._v("#")]),e._v(" Magento 1")]),e._v(" "),t("ol",[t("li",[e._v("Download "),t("a",{attrs:{href:"https://github.com/btcpayserver/magento-plugin",target:"_blank",rel:"noopener noreferrer"}},[e._v("BTCPay Magento Plugin"),t("OutboundLink")],1)]),e._v(" "),t("li",[e._v("Follow the "),t("a",{attrs:{href:"https://github.com/btcpayserver/magento-plugin/blob/master/GUIDE.md",target:"_blank",rel:"noopener noreferrer"}},[e._v("quick-start guide here"),t("OutboundLink")],1)])]),e._v(" "),t("h2",{attrs:{id:"magento-2"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#magento-2"}},[e._v("#")]),e._v(" Magento 2")]),e._v(" "),t("p",[e._v("We recommend using the "),t("strong",[e._v("Magento 2 module")]),e._v(" developed by "),t("a",{attrs:{href:"https://www.storefront.be",target:"_blank",rel:"noopener noreferrer"}},[e._v("Storefront.be"),t("OutboundLink")],1),e._v(", since it is the most feature-complete and robust. Storefront is also committed to maintaining the module as newer Magento versions are released.")]),e._v(" "),t("p",[e._v("The Magento 2 module is available for free at "),t("a",{attrs:{href:"https://github.com/btcpayserver/magento2-plugin",target:"_blank",rel:"noopener noreferrer"}},[e._v("our Github repository"),t("OutboundLink")],1)])])}),[],!1,null,null,null);t.default=n.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[144],{795:function(e,t,r){"use strict";r.r(t);var a=r(10),n=Object(a.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"btcpay-magento-integration"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#btcpay-magento-integration"}},[e._v("#")]),e._v(" BTCPay Magento Integration")]),e._v(" "),t("p",[e._v("If you're using "),t("strong",[e._v("Magento")]),e._v(", an open-source e-commerce platform written in PHP, you can "),t("strong",[e._v("integrate BTCPay Server and use it as a payment processor")]),e._v(".")]),e._v(" "),t("h2",{attrs:{id:"magento-1"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#magento-1"}},[e._v("#")]),e._v(" Magento 1")]),e._v(" "),t("ol",[t("li",[e._v("Download "),t("a",{attrs:{href:"https://github.com/btcpayserver/magento-plugin",target:"_blank",rel:"noopener noreferrer"}},[e._v("BTCPay Magento Plugin"),t("OutboundLink")],1)]),e._v(" "),t("li",[e._v("Follow the "),t("a",{attrs:{href:"https://github.com/btcpayserver/magento-plugin/blob/master/GUIDE.md",target:"_blank",rel:"noopener noreferrer"}},[e._v("quick-start guide here"),t("OutboundLink")],1)])]),e._v(" "),t("h2",{attrs:{id:"magento-2"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#magento-2"}},[e._v("#")]),e._v(" Magento 2")]),e._v(" "),t("p",[e._v("We recommend using the "),t("strong",[e._v("Magento 2 module")]),e._v(" developed by "),t("a",{attrs:{href:"https://www.storefront.be",target:"_blank",rel:"noopener noreferrer"}},[e._v("Storefront.be"),t("OutboundLink")],1),e._v(", since it is the most feature-complete and robust. Storefront is also committed to maintaining the module as newer Magento versions are released.")]),e._v(" "),t("p",[e._v("The Magento 2 module is available for free at "),t("a",{attrs:{href:"https://github.com/btcpayserver/magento2-plugin",target:"_blank",rel:"noopener noreferrer"}},[e._v("our Github repository"),t("OutboundLink")],1)])])}),[],!1,null,null,null);t.default=n.exports}}]); \ No newline at end of file diff --git a/assets/js/146.5958968c.js b/assets/js/146.cefb1a3c.js similarity index 98% rename from assets/js/146.5958968c.js rename to assets/js/146.cefb1a3c.js index f205c6e235..53056376d2 100644 --- a/assets/js/146.5958968c.js +++ b/assets/js/146.cefb1a3c.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[146],{798:function(e,t,a){"use strict";a.r(t);var r=a(10),n=Object(r.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"migration-from-dbtrie-backend-to-postgres-backend"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#migration-from-dbtrie-backend-to-postgres-backend"}},[e._v("#")]),e._v(" Migration from DBTrie backend to Postgres backend")]),e._v(" "),t("p",[e._v("For an extended period, NBXplorer depended on an embedded database dubbed DBTrie. This internal database imposed limitations for various reasons, prompting us to upgrade NBXplorer to employ a Postgres backend rather than DBTrie.")]),e._v(" "),t("p",[e._v("Although we continue to support DBTrie, it is now deemed obsolete. We offer a migration pathway for existing deployments.")]),e._v(" "),t("table",[t("thead",[t("tr",[t("th",[e._v("Command line argument")]),e._v(" "),t("th",[e._v("Environment variable")]),e._v(" "),t("th",[e._v("Description")])])]),e._v(" "),t("tbody",[t("tr",[t("td",[e._v("--deleteaftermigration")]),e._v(" "),t("td",[e._v("NBXPLORER_DELETEAFTERMIGRATION=1")]),e._v(" "),t("td",[e._v("Once migration succeed, delete the original DBTrie database (default: false)")])]),e._v(" "),t("tr",[t("td",[e._v("--postgres")]),e._v(" "),t("td",[e._v('NBXPLORER_POSTGRES="..."')]),e._v(" "),t("td",[e._v("The connection string to postgres")])]),e._v(" "),t("tr",[t("td",[e._v("--automigrate")]),e._v(" "),t("td",[e._v("NBXPLORER_AUTOMIGRATE=1")]),e._v(" "),t("td",[e._v("If DBTrie database exists, migrate it (default: false)")])]),e._v(" "),t("tr",[t("td",[e._v("--nomigrateevts")]),e._v(" "),t("td",[e._v("NBXPLORER_NOMIGRATEEVTS=1")]),e._v(" "),t("td",[e._v("Do not migrate the events table (default: false)")])]),e._v(" "),t("tr",[t("td",[e._v("--nomigraterawtxs")]),e._v(" "),t("td",[e._v("NBXPLORER_NOMIGRATERAWTXS=1")]),e._v(" "),t("td",[e._v("Do not migrate the raw bytes of transactions (default: false)")])])])]),e._v(" "),t("p",[t("code",[e._v("automigrate")]),e._v(": will seamlessly determine if a DBTrie database necessitates migration, disregarding the flag if migration is unnecessary or already executed.")]),e._v(" "),t("p",[t("code",[e._v("nomigrateevts")]),e._v(": may be employed for services reliant on NBXplorer that do not query past events, thereby hastening the migration process. (BTCPay Server, for example, does not utilize past events)")]),e._v(" "),t("p",[t("code",[e._v("nomigraterawtxs")]),e._v(": may be utilized if preserving raw transaction bytes is nonessential, consequently expediting migration. Raw transactions are typically crucial for signing with a non-segwit wallet.")]),e._v(" "),t("p",[e._v("The majority of instances will complete migration in under five minutes.")]),e._v(" "),t("p",[e._v("For larger instances, our BTCPay Server's mainnet demo server with 800,000 addresses and 44,000 transactions and the DBTrie database approximating 5GB took roughly 40 minutes.")]),e._v(" "),t("p",[e._v("If you use BTCPay Server, ensure that its environment variable "),t("code",[e._v("BTCPAY_EXPLORERPOSTGRES")]),e._v(" is assigned the same connection string as NBXplorer.")]),e._v(" "),t("p",[e._v("You can find more information in this "),t("a",{attrs:{href:"https://blog.btcpayserver.org/nbxplorer-postgres/",target:"_blank",rel:"noopener noreferrer"}},[e._v("blog post"),t("OutboundLink")],1),e._v(".")])])}),[],!1,null,null,null);t.default=n.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[146],{796:function(e,t,a){"use strict";a.r(t);var r=a(10),n=Object(r.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"migration-from-dbtrie-backend-to-postgres-backend"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#migration-from-dbtrie-backend-to-postgres-backend"}},[e._v("#")]),e._v(" Migration from DBTrie backend to Postgres backend")]),e._v(" "),t("p",[e._v("For an extended period, NBXplorer depended on an embedded database dubbed DBTrie. This internal database imposed limitations for various reasons, prompting us to upgrade NBXplorer to employ a Postgres backend rather than DBTrie.")]),e._v(" "),t("p",[e._v("Although we continue to support DBTrie, it is now deemed obsolete. We offer a migration pathway for existing deployments.")]),e._v(" "),t("table",[t("thead",[t("tr",[t("th",[e._v("Command line argument")]),e._v(" "),t("th",[e._v("Environment variable")]),e._v(" "),t("th",[e._v("Description")])])]),e._v(" "),t("tbody",[t("tr",[t("td",[e._v("--deleteaftermigration")]),e._v(" "),t("td",[e._v("NBXPLORER_DELETEAFTERMIGRATION=1")]),e._v(" "),t("td",[e._v("Once migration succeed, delete the original DBTrie database (default: false)")])]),e._v(" "),t("tr",[t("td",[e._v("--postgres")]),e._v(" "),t("td",[e._v('NBXPLORER_POSTGRES="..."')]),e._v(" "),t("td",[e._v("The connection string to postgres")])]),e._v(" "),t("tr",[t("td",[e._v("--automigrate")]),e._v(" "),t("td",[e._v("NBXPLORER_AUTOMIGRATE=1")]),e._v(" "),t("td",[e._v("If DBTrie database exists, migrate it (default: false)")])]),e._v(" "),t("tr",[t("td",[e._v("--nomigrateevts")]),e._v(" "),t("td",[e._v("NBXPLORER_NOMIGRATEEVTS=1")]),e._v(" "),t("td",[e._v("Do not migrate the events table (default: false)")])]),e._v(" "),t("tr",[t("td",[e._v("--nomigraterawtxs")]),e._v(" "),t("td",[e._v("NBXPLORER_NOMIGRATERAWTXS=1")]),e._v(" "),t("td",[e._v("Do not migrate the raw bytes of transactions (default: false)")])])])]),e._v(" "),t("p",[t("code",[e._v("automigrate")]),e._v(": will seamlessly determine if a DBTrie database necessitates migration, disregarding the flag if migration is unnecessary or already executed.")]),e._v(" "),t("p",[t("code",[e._v("nomigrateevts")]),e._v(": may be employed for services reliant on NBXplorer that do not query past events, thereby hastening the migration process. (BTCPay Server, for example, does not utilize past events)")]),e._v(" "),t("p",[t("code",[e._v("nomigraterawtxs")]),e._v(": may be utilized if preserving raw transaction bytes is nonessential, consequently expediting migration. Raw transactions are typically crucial for signing with a non-segwit wallet.")]),e._v(" "),t("p",[e._v("The majority of instances will complete migration in under five minutes.")]),e._v(" "),t("p",[e._v("For larger instances, our BTCPay Server's mainnet demo server with 800,000 addresses and 44,000 transactions and the DBTrie database approximating 5GB took roughly 40 minutes.")]),e._v(" "),t("p",[e._v("If you use BTCPay Server, ensure that its environment variable "),t("code",[e._v("BTCPAY_EXPLORERPOSTGRES")]),e._v(" is assigned the same connection string as NBXplorer.")]),e._v(" "),t("p",[e._v("You can find more information in this "),t("a",{attrs:{href:"https://blog.btcpayserver.org/nbxplorer-postgres/",target:"_blank",rel:"noopener noreferrer"}},[e._v("blog post"),t("OutboundLink")],1),e._v(".")])])}),[],!1,null,null,null);t.default=n.exports}}]); \ No newline at end of file diff --git a/assets/js/147.2698896f.js b/assets/js/147.f2419319.js similarity index 99% rename from assets/js/147.2698896f.js rename to assets/js/147.f2419319.js index d83e558b56..ec980d4155 100644 --- a/assets/js/147.2698896f.js +++ b/assets/js/147.f2419319.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[147],{800:function(e,t,a){"use strict";a.r(t);var o=a(10),r=Object(o.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"nbxplorer"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#nbxplorer"}},[e._v("#")]),e._v(" NBXplorer")]),e._v(" "),t("p",[t("a",{attrs:{href:"https://www.nuget.org/packages/NBxplorer.Client",target:"_blank",rel:"noopener noreferrer"}},[t("img",{attrs:{src:"https://img.shields.io/nuget/v/NBxplorer.Client.svg",alt:"NuGet",title:"NuGet"}}),t("OutboundLink")],1),e._v(" "),t("a",{attrs:{href:"https://hub.docker.com/r/nicolasdorier/nbxplorer/",target:"_blank",rel:"noopener noreferrer"}},[t("img",{attrs:{src:"https://img.shields.io/docker/automated/jrottenberg/ffmpeg.svg",alt:"Docker Automated buil",title:"Docker Automated buil"}}),t("OutboundLink")],1),e._v(" "),t("a",{attrs:{href:"https://circleci.com/gh/dgarage/NBXplorer",target:"_blank",rel:"noopener noreferrer"}},[t("img",{attrs:{src:"https://circleci.com/gh/dgarage/NBXplorer.svg?style=svg",alt:"CircleCI",title:"CircleCI"}}),t("OutboundLink")],1)]),e._v(" "),t("p",[e._v("A minimalist UTXO tracker for HD Wallets.\nThe goal is to have a flexible, .NET based UTXO tracker for HD wallets.\nThe explorer supports P2SH,P2PKH,P2WPKH,P2WSH and Multi-sig derivation.")]),e._v(" "),t("p",[e._v("This explorer is not meant to be exposed on internet, but should be used as an internal tool for tracking the UTXOs of your own service.")]),e._v(" "),t("p",[e._v("It has a bunch of features:")]),e._v(" "),t("ul",[t("li",[e._v("Can pass arguments via environment variable, command line or configuration file")]),e._v(" "),t("li",[e._v("Automatically reconnect to your node if the connection goes temporarily down")]),e._v(" "),t("li",[e._v("An easy to use REST API")]),e._v(" "),t("li",[e._v("Persistence (via in-file no-SQL datbase called DBreeze or Postgres)")]),e._v(" "),t("li",[e._v("Connect via RPC to broadcast transaction instead of using the P2P protocol like this example")]),e._v(" "),t("li",[e._v("Connect via RPC to your trusted node to get the proper fee rate.")]),e._v(" "),t("li",[e._v("Altcoin support")]),e._v(" "),t("li",[e._v("Huge test suite")]),e._v(" "),t("li",[e._v("Pruning of transaction data (in practice, we don't need to save the whole transaction, only the spent outpoint and received coin for the wallet)")]),e._v(" "),t("li",[e._v("Multi-wallet")]),e._v(" "),t("li",[e._v("Flexible address generation schemes (multisig, segwit, legacy etc...)")]),e._v(" "),t("li",[e._v("Pruning for big wallets (Removal of tracked transaction which do not impact the resulting UTXO set)")])]),e._v(" "),t("p",[e._v("It currently supports the following altcoins:")]),e._v(" "),t("ul",[t("li",[e._v("Althash")]),e._v(" "),t("li",[e._v("Argoneum")]),e._v(" "),t("li",[e._v("BCash (also known as Bitcoin Cash)")]),e._v(" "),t("li",[e._v("BGold (also known as Bitcoin Gold)")]),e._v(" "),t("li",[e._v("BitCore")]),e._v(" "),t("li",[e._v("Chaincoin")]),e._v(" "),t("li",[e._v("ColossusXT")]),e._v(" "),t("li",[e._v("Dash")]),e._v(" "),t("li",[e._v("Dogecoin")]),e._v(" "),t("li",[e._v("Feathercoin")]),e._v(" "),t("li",[e._v("Gobyte")]),e._v(" "),t("li",[e._v("Groestlcoin")]),e._v(" "),t("li",[e._v("Litecoin")]),e._v(" "),t("li",[e._v("Monacoin")]),e._v(" "),t("li",[e._v("MonetaryUnit")]),e._v(" "),t("li",[e._v("Monoeci")]),e._v(" "),t("li",[e._v("Polis")]),e._v(" "),t("li",[e._v("Qtum")]),e._v(" "),t("li",[e._v("Terracoin")]),e._v(" "),t("li",[e._v("Ufo")]),e._v(" "),t("li",[e._v("Viacoin")])]),e._v(" "),t("p",[e._v("Read our "),t("RouterLink",{attrs:{to:"/NBXplorer/API/"}},[e._v("API Specification")]),e._v(".")],1),e._v(" "),t("h2",{attrs:{id:"prerequisite"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#prerequisite"}},[e._v("#")]),e._v(" Prerequisite")]),e._v(" "),t("ul",[t("li",[e._v("Install "),t("a",{attrs:{href:"https://www.microsoft.com/net/download",target:"_blank",rel:"noopener noreferrer"}},[e._v(".NET Core SDK v8.0 or above"),t("OutboundLink")],1)]),e._v(" "),t("li",[e._v("Bitcoin Core instance synched and running (at least 24.0).")]),e._v(" "),t("li",[e._v("PostgresSQL v13+")])]),e._v(" "),t("p",[e._v("There are two backend available:")]),e._v(" "),t("ul",[t("li",[e._v("DBTrie (with the "),t("code",[e._v("--dbtrie")]),e._v(" flag)")]),e._v(" "),t("li",[t("RouterLink",{attrs:{to:"/NBXplorer/Postgres-Schema/"}},[e._v("Postgres")]),e._v(" (with the "),t("code",[e._v("--postgres")]),e._v(" flags)")],1)]),e._v(" "),t("p",[e._v("However, "),t("code",[e._v("DBTrie")]),e._v(" is now deprecated. We will continue to support it to give more time for our users "),t("RouterLink",{attrs:{to:"/NBXplorer/Postgres-Migration/"}},[e._v("to migrate")]),e._v(".")],1),e._v(" "),t("h2",{attrs:{id:"api-specification"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#api-specification"}},[e._v("#")]),e._v(" API Specification")]),e._v(" "),t("p",[e._v("Read our "),t("RouterLink",{attrs:{to:"/NBXplorer/API/"}},[e._v("API Specification")]),e._v(".")],1),e._v(" "),t("h2",{attrs:{id:"how-to-build-and-run"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#how-to-build-and-run"}},[e._v("#")]),e._v(" How to build and run?")]),e._v(" "),t("p",[e._v("If you are using Bitcoin core default settings:")]),e._v(" "),t("p",[e._v("On Powershell:")]),e._v(" "),t("div",{staticClass:"language-pwsh extra-class"},[t("pre",{pre:!0,attrs:{class:"language-text"}},[t("code",[e._v(".\\build.ps1\n")])])]),t("p",[e._v("On Linux:")]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[e._v("./build.sh\n")])])]),t("p",[e._v("Then to run:")]),e._v(" "),t("p",[e._v("On Powershell:")]),e._v(" "),t("div",{staticClass:"language-pwsh extra-class"},[t("pre",{pre:!0,attrs:{class:"language-text"}},[t("code",[e._v(".\\run.ps1 --help\n")])])]),t("p",[e._v("On Linux:")]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[e._v("./run.sh "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("--help")]),e._v("\n")])])]),t("p",[e._v("Example, if you have ltc node and btc node on regtest (default configuration), and want to connect to them: (see documentation for other options in the "),t("a",{attrs:{href:"https://www.npgsql.org/doc/connection-string-parameters.html",target:"_blank",rel:"noopener noreferrer"}},[e._v("postgres connection string"),t("OutboundLink")],1),e._v(")")]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[e._v("./run.sh "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("--chains")]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),e._v("btc,ltc "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("--network")]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),e._v("regtest "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("--postgres")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"User ID=postgres;Host=127.0.0.1;Port=39382;Database=nbxplorer"')]),e._v("\n")])])]),t("h2",{attrs:{id:"how-to-use-the-api"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#how-to-use-the-api"}},[e._v("#")]),e._v(" How to use the API?")]),e._v(" "),t("p",[e._v("Check "),t("RouterLink",{attrs:{to:"/NBXplorer/API/"}},[e._v("the API documentation")]),e._v(", you can then use any client library:")],1),e._v(" "),t("ul",[t("li",[t("a",{attrs:{href:"https://github.com/junderw/NBXplorer.NodeJS",target:"_blank",rel:"noopener noreferrer"}},[e._v("NBXplorer.NodeJS"),t("OutboundLink")],1),e._v(" for NodeJS clients.")]),e._v(" "),t("li",[t("a",{attrs:{href:"https://www.nuget.org/packages/NBxplorer.Client",target:"_blank",rel:"noopener noreferrer"}},[e._v("NBXplorer.Client"),t("OutboundLink")],1),e._v(" for .NET clients.")])]),e._v(" "),t("p",[e._v("Here is "),t("a",{attrs:{href:"https://github.com/dgarage/NBXplorer/blob/master/Examples/MultiSig/Program.cs",target:"_blank",rel:"noopener noreferrer"}},[e._v("a small C# example"),t("OutboundLink")],1),e._v(" showing a 2-2 multisig with Alice and Bob that you can run on regtest.")]),e._v(" "),t("h2",{attrs:{id:"with-docker"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#with-docker"}},[e._v("#")]),e._v(" With Docker")]),e._v(" "),t("p",[e._v("Use "),t("a",{attrs:{href:"https://hub.docker.com/r/nicolasdorier/nbxplorer/",target:"_blank",rel:"noopener noreferrer"}},[e._v("our image"),t("OutboundLink")],1),e._v(".\nYou can check "),t("a",{attrs:{href:"https://github.com/dgarage/NBXplorer/blob/master/docker-compose.regtest.yml",target:"_blank",rel:"noopener noreferrer"}},[e._v("the sample"),t("OutboundLink")],1),e._v(" for configuring and composing it bitcoin core.")]),e._v(" "),t("h2",{attrs:{id:"how-to-develop-on-it"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#how-to-develop-on-it"}},[e._v("#")]),e._v(" How to develop on it?")]),e._v(" "),t("p",[e._v("If you are on Windows, I recommend Visual Studio 2022 (17.8.0).\nIf you are on other platform and want lightweight environment, use "),t("a",{attrs:{href:"https://code.visualstudio.com/",target:"_blank",rel:"noopener noreferrer"}},[e._v("Visual Studio Code"),t("OutboundLink")],1),e._v(".\nIf you are hardcore, you can code on vim.")]),e._v(" "),t("p",[e._v("I like Visual Studio Code and Visual Studio 2022 as it allows me to debug in step by step.")]),e._v(" "),t("h2",{attrs:{id:"how-to-configure"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#how-to-configure"}},[e._v("#")]),e._v(" How to configure?")]),e._v(" "),t("p",[e._v("NBXplorer supports configuration through command line arguments, configuration file, or environment variables.")]),e._v(" "),t("h3",{attrs:{id:"configuration-file"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#configuration-file"}},[e._v("#")]),e._v(" Configuration file")]),e._v(" "),t("p",[e._v("If you are not using standard install for bitcoind, you will have to change the configuration file:\nIn Windows it is located in")]),e._v(" "),t("div",{staticClass:"language-pwsh extra-class"},[t("pre",{pre:!0,attrs:{class:"language-text"}},[t("code",[e._v("C:\\Users\\\\AppData\\Roaming\\NBXplorer\\\\settings.config\n")])])]),t("p",[e._v("On linux or mac:")]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[e._v("~/.nbxplorer/"),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("<")]),e._v("network"),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v(">")]),e._v("/settings.config\n")])])]),t("p",[e._v("The default configuration assumes "),t("code",[e._v("mainnet")]),e._v(" with only "),t("code",[e._v("btc")]),e._v(" chain supported, and uses the default settings of bitcoind.")]),e._v(" "),t("p",[e._v("You can change the location of the configuration file with the "),t("code",[e._v("--conf=pathToConf")]),e._v(" command line argument.")]),e._v(" "),t("h3",{attrs:{id:"command-line-parameters"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#command-line-parameters"}},[e._v("#")]),e._v(" Command line parameters")]),e._v(" "),t("p",[e._v("Please note that NBXplorer uses cookie authentication by default. If you run your Bitcoin/Litecoin/Dash nodes using their daemon (like "),t("code",[e._v("bitcoind")]),e._v(", "),t("code",[e._v("litecoind")]),e._v(" or "),t("code",[e._v("dashd")]),e._v("), they generate a new cookie every time you start them, and that should work without any extra configuration.\nIf you run the node(s) using the GUI versions, like Bitcoin\\Litecoin\\Dash Core Qt with the "),t("code",[e._v("-server")]),e._v(" parameter while you set the rpcusername and rpcpassword in their "),t("code",[e._v(".conf")]),e._v(" files, you must set those values for every crypto you are planning to support.\nSee samples below.")]),e._v(" "),t("h4",{attrs:{id:"run-from-source-requires-net-core-sdk"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#run-from-source-requires-net-core-sdk"}},[e._v("#")]),e._v(" Run from source (requires .NET Core SDK)")]),e._v(" "),t("p",[e._v("You should use "),t("code",[e._v("run.ps1")]),e._v(" (Windows) or "),t("code",[e._v("run.sh")]),e._v(" (Linux) to execute NBXplorer, but you can also execute it manually with the following command:\n"),t("code",[e._v("dotnet run --no-launch-profile -p .\\NBXplorer\\NBXplorer.csproj -- ")])]),e._v(" "),t("h4",{attrs:{id:"run-using-built-dll-requires-net-core-runtime-only"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#run-using-built-dll-requires-net-core-runtime-only"}},[e._v("#")]),e._v(" Run using built DLL (requires .NET Core Runtime only)")]),e._v(" "),t("p",[e._v("If you already have a compiled DLL, you can run the executable with the following command:\n"),t("code",[e._v("dotnet NBXplorer.dll ")])]),e._v(" "),t("h4",{attrs:{id:"sample-parameters"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#sample-parameters"}},[e._v("#")]),e._v(" Sample parameters")]),e._v(" "),t("p",[e._v("Running NBXplorer HTTP server on port 20300, connecting to the BTC mainnet node locally.\n"),t("code",[e._v("--port=20300 --network=mainnet --btcnodeendpoint=127.0.0.1:32939")])]),e._v(" "),t("p",[e._v("Running NBXplorer on testnet, supporting Bitcoin, Litecoin and Dash, using cookie authentication for BTC and LTC, and RPC username and password for Dash, connecting to all of them locally.\n"),t("code",[e._v("--chains=btc,ltc,dash --network=testnet --dashrpcuser=myuser --dashrpcpassword=mypassword")])]),e._v(" "),t("h3",{attrs:{id:"environment-variables"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#environment-variables"}},[e._v("#")]),e._v(" Environment variables")]),e._v(" "),t("p",[e._v("The same settings as above, for example "),t("code",[e._v("export NBXPLORER_PORT=20300")]),e._v(". This is usefull for configuring docker.")]),e._v(" "),t("h2",{attrs:{id:"how-to-run"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#how-to-run"}},[e._v("#")]),e._v(" How to Run")]),e._v(" "),t("h3",{attrs:{id:"command-line"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#command-line"}},[e._v("#")]),e._v(" Command Line")]),e._v(" "),t("p",[e._v("You can use the "),t("a",{attrs:{href:"https://docs.microsoft.com/en-us/dotnet/core/tools/dotnet",target:"_blank",rel:"noopener noreferrer"}},[e._v("dotnet"),t("OutboundLink")],1),e._v(" command which is part of .NET Core to run NBXplorer. To run from source you must have the .NET Core SDK installed e.g.\n"),t("code",[e._v("dotnet run NBXplorer.dll")]),e._v("\nAs described above you may add configuration parameters if desired.")]),e._v(" "),t("p",[e._v("If you have a compiled version of NBXplorer you should have a file in your build folder named NBXplorer.dll. This cannot itself be directly executed on the command line as it is not an executable file. Instead we can use the "),t("code",[e._v("dotnet")]),e._v(" runtime to execute the dll file.")]),e._v(" "),t("p",[e._v("e.g. "),t("code",[e._v("dotnet NBXplorer.dll")])]),e._v(" "),t("h2",{attrs:{id:"important-note"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#important-note"}},[e._v("#")]),e._v(" Important Note")]),e._v(" "),t("p",[e._v("This tool will only start scanning from the configured "),t("code",[e._v("startheight")]),e._v(". (By default, the height of the blockchain during your first run)\nThis means that you might not see old payments from your HD key.")]),e._v(" "),t("p",[e._v("If you need to see old payments, you need to configure "),t("code",[e._v("--[crypto]startheight")]),e._v(" to a specific height of your choice, then run it again with "),t("code",[e._v("--[crypto]rescan")]),e._v(", e.g.\n"),t("code",[e._v("./run.sh --chains=ltc --ltcrescan --ltcstartheight=101")])]),e._v(" "),t("h2",{attrs:{id:"how-to-query"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#how-to-query"}},[e._v("#")]),e._v(" How to query?")]),e._v(" "),t("h3",{attrs:{id:"using-postman"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#using-postman"}},[e._v("#")]),e._v(" Using Postman")]),e._v(" "),t("p",[t("a",{attrs:{href:"https://www.getpostman.com",target:"_blank",rel:"noopener noreferrer"}},[e._v("Postman"),t("OutboundLink")],1),e._v(" is a useful tool for testing and experimenting with REST API's.")]),e._v(" "),t("p",[e._v("You can test the "),t("RouterLink",{attrs:{to:"/NBXplorer/API/"}},[e._v("NBXplorer API")]),e._v(" quickly and easily using Postman.")],1),e._v(" "),t("p",[e._v("If you use cookie authentication (enabled by default) in your locally run NBXplorer, you need to set that up in Postman:")]),e._v(" "),t("ul",[t("li",[e._v("Run NBXplorer and locate you cookie file (NBXplorer will generate a new Cookie file each time it runs in "),t("RouterLink",{attrs:{to:"/NBXplorer/API/#authentication"}},[e._v("its default data folder")]),e._v(")")],1),e._v(" "),t("li",[e._v("In Postman create a new GET API test")]),e._v(" "),t("li",[e._v("In Authorization select "),t("em",[e._v("Basic Auth")]),e._v(", you should see 2 input boxes for username and password")]),e._v(" "),t("li",[e._v("Open your cookie file with a text editor e.g. Notepad on windows . You should see a cookie string e.g. "),t("code",[e._v("__cookie__:0ff9cd83a5ac7c19a6b56a3d1e7a5c96e113d42dba7720a1f72a3a5e8c4b6c66")])]),e._v(" "),t("li",[e._v("Back in Postman paste the "),t("code",[e._v("__cookie__")]),e._v(" part of your cookie file into username (whatever comes before the 😃")]),e._v(" "),t("li",[e._v("Paste the Hex string (after the : ) into the password box")]),e._v(" "),t("li",[e._v("Click the Update Request button in Postman - this will force Postman to generate the correct HTTP headers based on your cookie details")]),e._v(" "),t("li",[e._v("You should now see a new entry in the Headers section with a Key of "),t("em",[e._v("Authorization")]),e._v(" and Value of "),t("em",[e._v("Basic xxxxxxxxx")]),e._v(" where the string after "),t("code",[e._v("Basic")]),e._v(" will be your Base64 encoded username and password.")]),e._v(" "),t("li",[e._v("Enter the API URL you are going to test")])]),e._v(" "),t("p",[e._v("You can also disable authentication in NBXplorer for testing with the "),t("code",[e._v("--noauth")]),e._v(" parameter. This makes testing quicker:")]),e._v(" "),t("ul",[t("li",[e._v("Run NBXplorer with the "),t("code",[e._v("--noauth")]),e._v(" parameter")]),e._v(" "),t("li",[e._v("In Postman create a new GET API test")]),e._v(" "),t("li",[e._v("In Authorization select "),t("em",[e._v("No Auth")])]),e._v(" "),t("li",[e._v("Enter the API URL you are going to test")])]),e._v(" "),t("p",[e._v("You are now ready to test the API - it is easiest to start with something simple such as the fees endpoint e.g.")]),e._v(" "),t("p",[t("code",[e._v("http://localhost:24444/v1/cryptos/btc/fees/3")])]),e._v(" "),t("p",[e._v("this should return a JSON payload e.g.")]),e._v(" "),t("p",[e._v('{\n"feeRate": 9,\n"blockCount": 3\n}')]),e._v(" "),t("h2",{attrs:{id:"message-brokers"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#message-brokers"}},[e._v("#")]),e._v(" Message Brokers")]),e._v(" "),t("h3",{attrs:{id:"azure-service-bus"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#azure-service-bus"}},[e._v("#")]),e._v(" Azure Service Bus")]),e._v(" "),t("p",[e._v("Support has been added for Azure Service Bus as a message broker. Currently 2 Queues and 2 Topics are supported")]),e._v(" "),t("h3",{attrs:{id:"queues"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#queues"}},[e._v("#")]),e._v(" Queues")]),e._v(" "),t("ul",[t("li",[e._v("New Block")]),e._v(" "),t("li",[e._v("New Transaction")])]),e._v(" "),t("h3",{attrs:{id:"topics"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#topics"}},[e._v("#")]),e._v(" Topics")]),e._v(" "),t("ul",[t("li",[e._v("New Block")]),e._v(" "),t("li",[e._v("New Transaction")])]),e._v(" "),t("p",[e._v("Filters should be applied on the client, if required.")]),e._v(" "),t("p",[e._v("To activate Azure Service Bus Mesages you should add an Azure Service Bus Connection string to your config file or on the command line.")]),e._v(" "),t("ul",[t("li",[e._v("To use queues you should specify the queue names you wish to use")]),e._v(" "),t("li",[e._v("To use topics you should specify the topic names you wish to use")])]),e._v(" "),t("p",[e._v("You can use both queues and topics at the same time.")]),e._v(" "),t("h4",{attrs:{id:"config-settings"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#config-settings"}},[e._v("#")]),e._v(" Config Settings")]),e._v(" "),t("p",[e._v("If you use the Configuration file to setup your NBXplorer options:")]),e._v(" "),t("div",{staticClass:"language-ini extra-class"},[t("pre",{pre:!0,attrs:{class:"language-ini"}},[t("code",[t("span",{pre:!0,attrs:{class:"token key attr-name"}},[e._v("asbcnstr")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("=")]),t("span",{pre:!0,attrs:{class:"token value attr-value"}},[e._v("Your Azure Service Bus Connection string")]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token key attr-name"}},[e._v("asbblockq")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("=")]),t("span",{pre:!0,attrs:{class:"token value attr-value"}},[e._v("Name of queue to send New Block message to")]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token key attr-name"}},[e._v("asbtranq")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("=")]),t("span",{pre:!0,attrs:{class:"token value attr-value"}},[e._v("Name of queue to send New Transaction message to")]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token key attr-name"}},[e._v("asbblockt")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("=")]),t("span",{pre:!0,attrs:{class:"token value attr-value"}},[e._v("Name of topic to send New Block message to")]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token key attr-name"}},[e._v("asbtrant")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("=")]),t("span",{pre:!0,attrs:{class:"token value attr-value"}},[e._v("Name of queue to send New Transaction message to")]),e._v("\n")])])]),t("h3",{attrs:{id:"rabbitmq"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#rabbitmq"}},[e._v("#")]),e._v(" RabbitMq")]),e._v(" "),t("p",[e._v("Support has been added for RabbitMq as a message broker. Currently 2 exchanges supported;")]),e._v(" "),t("ul",[t("li",[e._v("New Block")]),e._v(" "),t("li",[e._v("New Transaction")])]),e._v(" "),t("p",[e._v("Filters can be applied on the client by defining routing keys;")]),e._v(" "),t("p",[e._v("For transactions;")]),e._v(" "),t("ul",[t("li",[t("code",[e._v("transactions.#")]),e._v(" to get all transactions.")]),e._v(" "),t("li",[t("code",[e._v("transactions.[BTC].#")]),e._v(" to get all [Bitcoin] transactions.")]),e._v(" "),t("li",[t("code",[e._v("transactions.[BTC].confirmed")]),e._v(" to get only confirmed [Bitcoin] transactions.")]),e._v(" "),t("li",[t("code",[e._v("transactions.[BTC].unconfirmed")]),e._v(" to get only unconfirmed [Bitcoin] transactions.")]),e._v(" "),t("li",[t("code",[e._v("transactions.*.confirmed")]),e._v(" to get all confirmed transactions.")]),e._v(" "),t("li",[t("code",[e._v("transactions.*.unconfirmed")]),e._v(" to get all unconfirmed transactions.")])]),e._v(" "),t("p",[e._v("For blocks;")]),e._v(" "),t("ul",[t("li",[t("code",[e._v("blocks.#")]),e._v(" to get all blocks.")]),e._v(" "),t("li",[t("code",[e._v("blocks.[BTC]")]),e._v(" to get all [Bitcoin] blocks.")])]),e._v(" "),t("p",[e._v("To activate RabbitMq mesages you should add following settings to your config file or on the command line.")]),e._v(" "),t("ul",[t("li",[e._v("rmqhost, rmquser, rmqpass")])]),e._v(" "),t("h4",{attrs:{id:"config-settings-2"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#config-settings-2"}},[e._v("#")]),e._v(" Config Settings")]),e._v(" "),t("p",[e._v("If you use the Configuration file to setup your NBXplorer options:")]),e._v(" "),t("div",{staticClass:"language-ini extra-class"},[t("pre",{pre:!0,attrs:{class:"language-ini"}},[t("code",[t("span",{pre:!0,attrs:{class:"token key attr-name"}},[e._v("rmqhost")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("=")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token value attr-value"}},[e._v("RabbitMq host name")]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token key attr-name"}},[e._v("rmqvirtual")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("=")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token value attr-value"}},[e._v("RabbitMq virtual host")]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token key attr-name"}},[e._v("rmquser")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("=")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token value attr-value"}},[e._v("RabbitMq username")]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token key attr-name"}},[e._v("rmqpass")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("=")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token value attr-value"}},[e._v("RabbitMq password")]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token key attr-name"}},[e._v("rmqtranex")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("=")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token value attr-value"}},[e._v("Name of exchange to send transaction messages")]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token key attr-name"}},[e._v("rmqblockex")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("=")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token value attr-value"}},[e._v("Name of exchange to send block messages")]),e._v("\n")])])]),t("p",[e._v("Payloads are JSON and map to "),t("code",[e._v("NewBlockEvent")]),e._v(", "),t("code",[e._v("NewTransactionEvent")]),e._v(" in the "),t("code",[e._v("NBXplorer.Models")]),e._v(" namespace. There is no support in NBXplorer client for message borkers at the current time. You will need to use the "),t("code",[e._v("Serializer")]),e._v(" in "),t("code",[e._v("NBXplorer.Client")]),e._v(" to de-serialize the objects or then implement your own JSON de-serializers for the custom types used in the payload.")]),e._v(" "),t("p",[e._v("For configuring serializers you can get crypto code info from "),t("code",[e._v("BasicProperties.Headers[CryptoCode]")]),e._v(" of RabbitMq messages or "),t("code",[e._v("UserProperties[CryptoCode]")]),e._v(" of Azure Service Bus messages.\nExamples can be found in unit tests.")]),e._v(" "),t("h4",{attrs:{id:"troubleshooting"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#troubleshooting"}},[e._v("#")]),e._v(" Troubleshooting")]),e._v(" "),t("p",[e._v("If you receive a 401 Unauthorized then your cookie data is not working. Check you are using the current cookie by opening the cookie file again - also check the date/time of the cookie file to ensure it is the latest cookie (generated when you launched NBXplorer).")]),e._v(" "),t("p",[e._v("If you receive a 404 or timeout then Postman cannot see the endpoint")]),e._v(" "),t("ul",[t("li",[e._v("are you using the correct Port ?")]),e._v(" "),t("li",[e._v("are you running postman on localhost ?")])]),e._v(" "),t("h2",{attrs:{id:"client-api"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#client-api"}},[e._v("#")]),e._v(" Client API")]),e._v(" "),t("p",[e._v("A better documentation is on the way, for now the only documentation is the client API in C# on "),t("a",{attrs:{href:"https://www.nuget.org/packages/NBxplorer.Client",target:"_blank",rel:"noopener noreferrer"}},[e._v("nuget"),t("OutboundLink")],1),e._v(".\nThe "),t("code",[e._v("ExplorerClient")]),e._v(" classes allows you to query unused addresses, and the UTXO of an HD PubKey.\nYou can take a look at "),t("a",{attrs:{href:"https://github.com/dgarage/NBXplorer/blob/master/NBXplorer.Tests/UnitTest1.cs",target:"_blank",rel:"noopener noreferrer"}},[e._v("the tests"),t("OutboundLink")],1),e._v(" to see how it works.")]),e._v(" "),t("p",[e._v("There is a simple use case documented on "),t("a",{attrs:{href:"https://programmingblockchain.gitbooks.io/programmingblockchain/content/wallet/web-api.html",target:"_blank",rel:"noopener noreferrer"}},[e._v("Blockchain Programming in C#"),t("OutboundLink")],1),e._v(".")]),e._v(" "),t("h2",{attrs:{id:"how-to-run-the-tests"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#how-to-run-the-tests"}},[e._v("#")]),e._v(" How to run the tests?")]),e._v(" "),t("p",[e._v("This is easy, from repo directory:")]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("cd")]),e._v(" NBXplorer.Tests\ndotnet "),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("test")]),e._v("\n")])])]),t("p",[e._v("The tests can take long the first time, as it download Bitcoin Core binaries. (Between 5 and 10 minutes)")]),e._v(" "),t("h2",{attrs:{id:"how-to-add-support-to-my-altcoin"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#how-to-add-support-to-my-altcoin"}},[e._v("#")]),e._v(" How to add support to my altcoin")]),e._v(" "),t("p",[e._v("First you need to add support for your altcoin to "),t("code",[e._v("NBitcoin.Altcoins")]),e._v(". (See "),t("a",{attrs:{href:"https://github.com/MetacoSA/NBitcoin/tree/master/NBitcoin.Altcoins",target:"_blank",rel:"noopener noreferrer"}},[e._v("here"),t("OutboundLink")],1),e._v(").")]),e._v(" "),t("p",[e._v("Once this is done and "),t("code",[e._v("NBXplorer")]),e._v(" updated to use the last version of "),t("code",[e._v("NBitcoin.Altcoins")]),e._v(", follow "),t("a",{attrs:{href:"https://github.com/dgarage/NBXplorer/blob/master/NBXplorer.Client/NBXplorerNetworkProvider.Litecoin.cs",target:"_blank",rel:"noopener noreferrer"}},[e._v("Litecoin example"),t("OutboundLink")],1),e._v(".")]),e._v(" "),t("p",[e._v("If you want to test if everything is working, modify "),t("a",{attrs:{href:"https://github.com/dgarage/NBXplorer/blob/master/NBXplorer.Tests/ServerTester.Environment.cs",target:"_blank",rel:"noopener noreferrer"}},[e._v("ServerTester.Environment.cs"),t("OutboundLink")],1),e._v(" to match your altcoin.")]),e._v(" "),t("p",[e._v("Then run the tests.")]),e._v(" "),t("h2",{attrs:{id:"licence"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#licence"}},[e._v("#")]),e._v(" Licence")]),e._v(" "),t("p",[e._v("This project is under MIT License.")]),e._v(" "),t("h2",{attrs:{id:"special-thanks"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#special-thanks"}},[e._v("#")]),e._v(" Special thanks")]),e._v(" "),t("p",[e._v("Special thanks to Digital Garage for allowing me to open source the project, which is based on an internal work I have done on Elements.")]),e._v(" "),t("p",[e._v("Thanks to the DG Lab Blockchain Team who had to fight with lots of bugs. (in particular kallewoof :p)")]),e._v(" "),t("p",[e._v("Thanks to Metaco SA, whose constant challenging projects refine my taste on what a perfect Bitcoin API should be.")])])}),[],!1,null,null,null);t.default=r.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[147],{799:function(e,t,a){"use strict";a.r(t);var o=a(10),r=Object(o.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"nbxplorer"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#nbxplorer"}},[e._v("#")]),e._v(" NBXplorer")]),e._v(" "),t("p",[t("a",{attrs:{href:"https://www.nuget.org/packages/NBxplorer.Client",target:"_blank",rel:"noopener noreferrer"}},[t("img",{attrs:{src:"https://img.shields.io/nuget/v/NBxplorer.Client.svg",alt:"NuGet",title:"NuGet"}}),t("OutboundLink")],1),e._v(" "),t("a",{attrs:{href:"https://hub.docker.com/r/nicolasdorier/nbxplorer/",target:"_blank",rel:"noopener noreferrer"}},[t("img",{attrs:{src:"https://img.shields.io/docker/automated/jrottenberg/ffmpeg.svg",alt:"Docker Automated buil",title:"Docker Automated buil"}}),t("OutboundLink")],1),e._v(" "),t("a",{attrs:{href:"https://circleci.com/gh/dgarage/NBXplorer",target:"_blank",rel:"noopener noreferrer"}},[t("img",{attrs:{src:"https://circleci.com/gh/dgarage/NBXplorer.svg?style=svg",alt:"CircleCI",title:"CircleCI"}}),t("OutboundLink")],1)]),e._v(" "),t("p",[e._v("A minimalist UTXO tracker for HD Wallets.\nThe goal is to have a flexible, .NET based UTXO tracker for HD wallets.\nThe explorer supports P2SH,P2PKH,P2WPKH,P2WSH and Multi-sig derivation.")]),e._v(" "),t("p",[e._v("This explorer is not meant to be exposed on internet, but should be used as an internal tool for tracking the UTXOs of your own service.")]),e._v(" "),t("p",[e._v("It has a bunch of features:")]),e._v(" "),t("ul",[t("li",[e._v("Can pass arguments via environment variable, command line or configuration file")]),e._v(" "),t("li",[e._v("Automatically reconnect to your node if the connection goes temporarily down")]),e._v(" "),t("li",[e._v("An easy to use REST API")]),e._v(" "),t("li",[e._v("Persistence (via in-file no-SQL datbase called DBreeze or Postgres)")]),e._v(" "),t("li",[e._v("Connect via RPC to broadcast transaction instead of using the P2P protocol like this example")]),e._v(" "),t("li",[e._v("Connect via RPC to your trusted node to get the proper fee rate.")]),e._v(" "),t("li",[e._v("Altcoin support")]),e._v(" "),t("li",[e._v("Huge test suite")]),e._v(" "),t("li",[e._v("Pruning of transaction data (in practice, we don't need to save the whole transaction, only the spent outpoint and received coin for the wallet)")]),e._v(" "),t("li",[e._v("Multi-wallet")]),e._v(" "),t("li",[e._v("Flexible address generation schemes (multisig, segwit, legacy etc...)")]),e._v(" "),t("li",[e._v("Pruning for big wallets (Removal of tracked transaction which do not impact the resulting UTXO set)")])]),e._v(" "),t("p",[e._v("It currently supports the following altcoins:")]),e._v(" "),t("ul",[t("li",[e._v("Althash")]),e._v(" "),t("li",[e._v("Argoneum")]),e._v(" "),t("li",[e._v("BCash (also known as Bitcoin Cash)")]),e._v(" "),t("li",[e._v("BGold (also known as Bitcoin Gold)")]),e._v(" "),t("li",[e._v("BitCore")]),e._v(" "),t("li",[e._v("Chaincoin")]),e._v(" "),t("li",[e._v("ColossusXT")]),e._v(" "),t("li",[e._v("Dash")]),e._v(" "),t("li",[e._v("Dogecoin")]),e._v(" "),t("li",[e._v("Feathercoin")]),e._v(" "),t("li",[e._v("Gobyte")]),e._v(" "),t("li",[e._v("Groestlcoin")]),e._v(" "),t("li",[e._v("Litecoin")]),e._v(" "),t("li",[e._v("Monacoin")]),e._v(" "),t("li",[e._v("MonetaryUnit")]),e._v(" "),t("li",[e._v("Monoeci")]),e._v(" "),t("li",[e._v("Polis")]),e._v(" "),t("li",[e._v("Qtum")]),e._v(" "),t("li",[e._v("Terracoin")]),e._v(" "),t("li",[e._v("Ufo")]),e._v(" "),t("li",[e._v("Viacoin")])]),e._v(" "),t("p",[e._v("Read our "),t("RouterLink",{attrs:{to:"/NBXplorer/API/"}},[e._v("API Specification")]),e._v(".")],1),e._v(" "),t("h2",{attrs:{id:"prerequisite"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#prerequisite"}},[e._v("#")]),e._v(" Prerequisite")]),e._v(" "),t("ul",[t("li",[e._v("Install "),t("a",{attrs:{href:"https://www.microsoft.com/net/download",target:"_blank",rel:"noopener noreferrer"}},[e._v(".NET Core SDK v8.0 or above"),t("OutboundLink")],1)]),e._v(" "),t("li",[e._v("Bitcoin Core instance synched and running (at least 24.0).")]),e._v(" "),t("li",[e._v("PostgresSQL v13+")])]),e._v(" "),t("p",[e._v("There are two backend available:")]),e._v(" "),t("ul",[t("li",[e._v("DBTrie (with the "),t("code",[e._v("--dbtrie")]),e._v(" flag)")]),e._v(" "),t("li",[t("RouterLink",{attrs:{to:"/NBXplorer/Postgres-Schema/"}},[e._v("Postgres")]),e._v(" (with the "),t("code",[e._v("--postgres")]),e._v(" flags)")],1)]),e._v(" "),t("p",[e._v("However, "),t("code",[e._v("DBTrie")]),e._v(" is now deprecated. We will continue to support it to give more time for our users "),t("RouterLink",{attrs:{to:"/NBXplorer/Postgres-Migration/"}},[e._v("to migrate")]),e._v(".")],1),e._v(" "),t("h2",{attrs:{id:"api-specification"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#api-specification"}},[e._v("#")]),e._v(" API Specification")]),e._v(" "),t("p",[e._v("Read our "),t("RouterLink",{attrs:{to:"/NBXplorer/API/"}},[e._v("API Specification")]),e._v(".")],1),e._v(" "),t("h2",{attrs:{id:"how-to-build-and-run"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#how-to-build-and-run"}},[e._v("#")]),e._v(" How to build and run?")]),e._v(" "),t("p",[e._v("If you are using Bitcoin core default settings:")]),e._v(" "),t("p",[e._v("On Powershell:")]),e._v(" "),t("div",{staticClass:"language-pwsh extra-class"},[t("pre",{pre:!0,attrs:{class:"language-text"}},[t("code",[e._v(".\\build.ps1\n")])])]),t("p",[e._v("On Linux:")]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[e._v("./build.sh\n")])])]),t("p",[e._v("Then to run:")]),e._v(" "),t("p",[e._v("On Powershell:")]),e._v(" "),t("div",{staticClass:"language-pwsh extra-class"},[t("pre",{pre:!0,attrs:{class:"language-text"}},[t("code",[e._v(".\\run.ps1 --help\n")])])]),t("p",[e._v("On Linux:")]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[e._v("./run.sh "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("--help")]),e._v("\n")])])]),t("p",[e._v("Example, if you have ltc node and btc node on regtest (default configuration), and want to connect to them: (see documentation for other options in the "),t("a",{attrs:{href:"https://www.npgsql.org/doc/connection-string-parameters.html",target:"_blank",rel:"noopener noreferrer"}},[e._v("postgres connection string"),t("OutboundLink")],1),e._v(")")]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[e._v("./run.sh "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("--chains")]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),e._v("btc,ltc "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("--network")]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),e._v("regtest "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("--postgres")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"User ID=postgres;Host=127.0.0.1;Port=39382;Database=nbxplorer"')]),e._v("\n")])])]),t("h2",{attrs:{id:"how-to-use-the-api"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#how-to-use-the-api"}},[e._v("#")]),e._v(" How to use the API?")]),e._v(" "),t("p",[e._v("Check "),t("RouterLink",{attrs:{to:"/NBXplorer/API/"}},[e._v("the API documentation")]),e._v(", you can then use any client library:")],1),e._v(" "),t("ul",[t("li",[t("a",{attrs:{href:"https://github.com/junderw/NBXplorer.NodeJS",target:"_blank",rel:"noopener noreferrer"}},[e._v("NBXplorer.NodeJS"),t("OutboundLink")],1),e._v(" for NodeJS clients.")]),e._v(" "),t("li",[t("a",{attrs:{href:"https://www.nuget.org/packages/NBxplorer.Client",target:"_blank",rel:"noopener noreferrer"}},[e._v("NBXplorer.Client"),t("OutboundLink")],1),e._v(" for .NET clients.")])]),e._v(" "),t("p",[e._v("Here is "),t("a",{attrs:{href:"https://github.com/dgarage/NBXplorer/blob/master/Examples/MultiSig/Program.cs",target:"_blank",rel:"noopener noreferrer"}},[e._v("a small C# example"),t("OutboundLink")],1),e._v(" showing a 2-2 multisig with Alice and Bob that you can run on regtest.")]),e._v(" "),t("h2",{attrs:{id:"with-docker"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#with-docker"}},[e._v("#")]),e._v(" With Docker")]),e._v(" "),t("p",[e._v("Use "),t("a",{attrs:{href:"https://hub.docker.com/r/nicolasdorier/nbxplorer/",target:"_blank",rel:"noopener noreferrer"}},[e._v("our image"),t("OutboundLink")],1),e._v(".\nYou can check "),t("a",{attrs:{href:"https://github.com/dgarage/NBXplorer/blob/master/docker-compose.regtest.yml",target:"_blank",rel:"noopener noreferrer"}},[e._v("the sample"),t("OutboundLink")],1),e._v(" for configuring and composing it bitcoin core.")]),e._v(" "),t("h2",{attrs:{id:"how-to-develop-on-it"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#how-to-develop-on-it"}},[e._v("#")]),e._v(" How to develop on it?")]),e._v(" "),t("p",[e._v("If you are on Windows, I recommend Visual Studio 2022 (17.8.0).\nIf you are on other platform and want lightweight environment, use "),t("a",{attrs:{href:"https://code.visualstudio.com/",target:"_blank",rel:"noopener noreferrer"}},[e._v("Visual Studio Code"),t("OutboundLink")],1),e._v(".\nIf you are hardcore, you can code on vim.")]),e._v(" "),t("p",[e._v("I like Visual Studio Code and Visual Studio 2022 as it allows me to debug in step by step.")]),e._v(" "),t("h2",{attrs:{id:"how-to-configure"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#how-to-configure"}},[e._v("#")]),e._v(" How to configure?")]),e._v(" "),t("p",[e._v("NBXplorer supports configuration through command line arguments, configuration file, or environment variables.")]),e._v(" "),t("h3",{attrs:{id:"configuration-file"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#configuration-file"}},[e._v("#")]),e._v(" Configuration file")]),e._v(" "),t("p",[e._v("If you are not using standard install for bitcoind, you will have to change the configuration file:\nIn Windows it is located in")]),e._v(" "),t("div",{staticClass:"language-pwsh extra-class"},[t("pre",{pre:!0,attrs:{class:"language-text"}},[t("code",[e._v("C:\\Users\\\\AppData\\Roaming\\NBXplorer\\\\settings.config\n")])])]),t("p",[e._v("On linux or mac:")]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[e._v("~/.nbxplorer/"),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("<")]),e._v("network"),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v(">")]),e._v("/settings.config\n")])])]),t("p",[e._v("The default configuration assumes "),t("code",[e._v("mainnet")]),e._v(" with only "),t("code",[e._v("btc")]),e._v(" chain supported, and uses the default settings of bitcoind.")]),e._v(" "),t("p",[e._v("You can change the location of the configuration file with the "),t("code",[e._v("--conf=pathToConf")]),e._v(" command line argument.")]),e._v(" "),t("h3",{attrs:{id:"command-line-parameters"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#command-line-parameters"}},[e._v("#")]),e._v(" Command line parameters")]),e._v(" "),t("p",[e._v("Please note that NBXplorer uses cookie authentication by default. If you run your Bitcoin/Litecoin/Dash nodes using their daemon (like "),t("code",[e._v("bitcoind")]),e._v(", "),t("code",[e._v("litecoind")]),e._v(" or "),t("code",[e._v("dashd")]),e._v("), they generate a new cookie every time you start them, and that should work without any extra configuration.\nIf you run the node(s) using the GUI versions, like Bitcoin\\Litecoin\\Dash Core Qt with the "),t("code",[e._v("-server")]),e._v(" parameter while you set the rpcusername and rpcpassword in their "),t("code",[e._v(".conf")]),e._v(" files, you must set those values for every crypto you are planning to support.\nSee samples below.")]),e._v(" "),t("h4",{attrs:{id:"run-from-source-requires-net-core-sdk"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#run-from-source-requires-net-core-sdk"}},[e._v("#")]),e._v(" Run from source (requires .NET Core SDK)")]),e._v(" "),t("p",[e._v("You should use "),t("code",[e._v("run.ps1")]),e._v(" (Windows) or "),t("code",[e._v("run.sh")]),e._v(" (Linux) to execute NBXplorer, but you can also execute it manually with the following command:\n"),t("code",[e._v("dotnet run --no-launch-profile -p .\\NBXplorer\\NBXplorer.csproj -- ")])]),e._v(" "),t("h4",{attrs:{id:"run-using-built-dll-requires-net-core-runtime-only"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#run-using-built-dll-requires-net-core-runtime-only"}},[e._v("#")]),e._v(" Run using built DLL (requires .NET Core Runtime only)")]),e._v(" "),t("p",[e._v("If you already have a compiled DLL, you can run the executable with the following command:\n"),t("code",[e._v("dotnet NBXplorer.dll ")])]),e._v(" "),t("h4",{attrs:{id:"sample-parameters"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#sample-parameters"}},[e._v("#")]),e._v(" Sample parameters")]),e._v(" "),t("p",[e._v("Running NBXplorer HTTP server on port 20300, connecting to the BTC mainnet node locally.\n"),t("code",[e._v("--port=20300 --network=mainnet --btcnodeendpoint=127.0.0.1:32939")])]),e._v(" "),t("p",[e._v("Running NBXplorer on testnet, supporting Bitcoin, Litecoin and Dash, using cookie authentication for BTC and LTC, and RPC username and password for Dash, connecting to all of them locally.\n"),t("code",[e._v("--chains=btc,ltc,dash --network=testnet --dashrpcuser=myuser --dashrpcpassword=mypassword")])]),e._v(" "),t("h3",{attrs:{id:"environment-variables"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#environment-variables"}},[e._v("#")]),e._v(" Environment variables")]),e._v(" "),t("p",[e._v("The same settings as above, for example "),t("code",[e._v("export NBXPLORER_PORT=20300")]),e._v(". This is usefull for configuring docker.")]),e._v(" "),t("h2",{attrs:{id:"how-to-run"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#how-to-run"}},[e._v("#")]),e._v(" How to Run")]),e._v(" "),t("h3",{attrs:{id:"command-line"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#command-line"}},[e._v("#")]),e._v(" Command Line")]),e._v(" "),t("p",[e._v("You can use the "),t("a",{attrs:{href:"https://docs.microsoft.com/en-us/dotnet/core/tools/dotnet",target:"_blank",rel:"noopener noreferrer"}},[e._v("dotnet"),t("OutboundLink")],1),e._v(" command which is part of .NET Core to run NBXplorer. To run from source you must have the .NET Core SDK installed e.g.\n"),t("code",[e._v("dotnet run NBXplorer.dll")]),e._v("\nAs described above you may add configuration parameters if desired.")]),e._v(" "),t("p",[e._v("If you have a compiled version of NBXplorer you should have a file in your build folder named NBXplorer.dll. This cannot itself be directly executed on the command line as it is not an executable file. Instead we can use the "),t("code",[e._v("dotnet")]),e._v(" runtime to execute the dll file.")]),e._v(" "),t("p",[e._v("e.g. "),t("code",[e._v("dotnet NBXplorer.dll")])]),e._v(" "),t("h2",{attrs:{id:"important-note"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#important-note"}},[e._v("#")]),e._v(" Important Note")]),e._v(" "),t("p",[e._v("This tool will only start scanning from the configured "),t("code",[e._v("startheight")]),e._v(". (By default, the height of the blockchain during your first run)\nThis means that you might not see old payments from your HD key.")]),e._v(" "),t("p",[e._v("If you need to see old payments, you need to configure "),t("code",[e._v("--[crypto]startheight")]),e._v(" to a specific height of your choice, then run it again with "),t("code",[e._v("--[crypto]rescan")]),e._v(", e.g.\n"),t("code",[e._v("./run.sh --chains=ltc --ltcrescan --ltcstartheight=101")])]),e._v(" "),t("h2",{attrs:{id:"how-to-query"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#how-to-query"}},[e._v("#")]),e._v(" How to query?")]),e._v(" "),t("h3",{attrs:{id:"using-postman"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#using-postman"}},[e._v("#")]),e._v(" Using Postman")]),e._v(" "),t("p",[t("a",{attrs:{href:"https://www.getpostman.com",target:"_blank",rel:"noopener noreferrer"}},[e._v("Postman"),t("OutboundLink")],1),e._v(" is a useful tool for testing and experimenting with REST API's.")]),e._v(" "),t("p",[e._v("You can test the "),t("RouterLink",{attrs:{to:"/NBXplorer/API/"}},[e._v("NBXplorer API")]),e._v(" quickly and easily using Postman.")],1),e._v(" "),t("p",[e._v("If you use cookie authentication (enabled by default) in your locally run NBXplorer, you need to set that up in Postman:")]),e._v(" "),t("ul",[t("li",[e._v("Run NBXplorer and locate you cookie file (NBXplorer will generate a new Cookie file each time it runs in "),t("RouterLink",{attrs:{to:"/NBXplorer/API/#authentication"}},[e._v("its default data folder")]),e._v(")")],1),e._v(" "),t("li",[e._v("In Postman create a new GET API test")]),e._v(" "),t("li",[e._v("In Authorization select "),t("em",[e._v("Basic Auth")]),e._v(", you should see 2 input boxes for username and password")]),e._v(" "),t("li",[e._v("Open your cookie file with a text editor e.g. Notepad on windows . You should see a cookie string e.g. "),t("code",[e._v("__cookie__:0ff9cd83a5ac7c19a6b56a3d1e7a5c96e113d42dba7720a1f72a3a5e8c4b6c66")])]),e._v(" "),t("li",[e._v("Back in Postman paste the "),t("code",[e._v("__cookie__")]),e._v(" part of your cookie file into username (whatever comes before the 😃")]),e._v(" "),t("li",[e._v("Paste the Hex string (after the : ) into the password box")]),e._v(" "),t("li",[e._v("Click the Update Request button in Postman - this will force Postman to generate the correct HTTP headers based on your cookie details")]),e._v(" "),t("li",[e._v("You should now see a new entry in the Headers section with a Key of "),t("em",[e._v("Authorization")]),e._v(" and Value of "),t("em",[e._v("Basic xxxxxxxxx")]),e._v(" where the string after "),t("code",[e._v("Basic")]),e._v(" will be your Base64 encoded username and password.")]),e._v(" "),t("li",[e._v("Enter the API URL you are going to test")])]),e._v(" "),t("p",[e._v("You can also disable authentication in NBXplorer for testing with the "),t("code",[e._v("--noauth")]),e._v(" parameter. This makes testing quicker:")]),e._v(" "),t("ul",[t("li",[e._v("Run NBXplorer with the "),t("code",[e._v("--noauth")]),e._v(" parameter")]),e._v(" "),t("li",[e._v("In Postman create a new GET API test")]),e._v(" "),t("li",[e._v("In Authorization select "),t("em",[e._v("No Auth")])]),e._v(" "),t("li",[e._v("Enter the API URL you are going to test")])]),e._v(" "),t("p",[e._v("You are now ready to test the API - it is easiest to start with something simple such as the fees endpoint e.g.")]),e._v(" "),t("p",[t("code",[e._v("http://localhost:24444/v1/cryptos/btc/fees/3")])]),e._v(" "),t("p",[e._v("this should return a JSON payload e.g.")]),e._v(" "),t("p",[e._v('{\n"feeRate": 9,\n"blockCount": 3\n}')]),e._v(" "),t("h2",{attrs:{id:"message-brokers"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#message-brokers"}},[e._v("#")]),e._v(" Message Brokers")]),e._v(" "),t("h3",{attrs:{id:"azure-service-bus"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#azure-service-bus"}},[e._v("#")]),e._v(" Azure Service Bus")]),e._v(" "),t("p",[e._v("Support has been added for Azure Service Bus as a message broker. Currently 2 Queues and 2 Topics are supported")]),e._v(" "),t("h3",{attrs:{id:"queues"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#queues"}},[e._v("#")]),e._v(" Queues")]),e._v(" "),t("ul",[t("li",[e._v("New Block")]),e._v(" "),t("li",[e._v("New Transaction")])]),e._v(" "),t("h3",{attrs:{id:"topics"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#topics"}},[e._v("#")]),e._v(" Topics")]),e._v(" "),t("ul",[t("li",[e._v("New Block")]),e._v(" "),t("li",[e._v("New Transaction")])]),e._v(" "),t("p",[e._v("Filters should be applied on the client, if required.")]),e._v(" "),t("p",[e._v("To activate Azure Service Bus Mesages you should add an Azure Service Bus Connection string to your config file or on the command line.")]),e._v(" "),t("ul",[t("li",[e._v("To use queues you should specify the queue names you wish to use")]),e._v(" "),t("li",[e._v("To use topics you should specify the topic names you wish to use")])]),e._v(" "),t("p",[e._v("You can use both queues and topics at the same time.")]),e._v(" "),t("h4",{attrs:{id:"config-settings"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#config-settings"}},[e._v("#")]),e._v(" Config Settings")]),e._v(" "),t("p",[e._v("If you use the Configuration file to setup your NBXplorer options:")]),e._v(" "),t("div",{staticClass:"language-ini extra-class"},[t("pre",{pre:!0,attrs:{class:"language-ini"}},[t("code",[t("span",{pre:!0,attrs:{class:"token key attr-name"}},[e._v("asbcnstr")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("=")]),t("span",{pre:!0,attrs:{class:"token value attr-value"}},[e._v("Your Azure Service Bus Connection string")]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token key attr-name"}},[e._v("asbblockq")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("=")]),t("span",{pre:!0,attrs:{class:"token value attr-value"}},[e._v("Name of queue to send New Block message to")]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token key attr-name"}},[e._v("asbtranq")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("=")]),t("span",{pre:!0,attrs:{class:"token value attr-value"}},[e._v("Name of queue to send New Transaction message to")]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token key attr-name"}},[e._v("asbblockt")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("=")]),t("span",{pre:!0,attrs:{class:"token value attr-value"}},[e._v("Name of topic to send New Block message to")]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token key attr-name"}},[e._v("asbtrant")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("=")]),t("span",{pre:!0,attrs:{class:"token value attr-value"}},[e._v("Name of queue to send New Transaction message to")]),e._v("\n")])])]),t("h3",{attrs:{id:"rabbitmq"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#rabbitmq"}},[e._v("#")]),e._v(" RabbitMq")]),e._v(" "),t("p",[e._v("Support has been added for RabbitMq as a message broker. Currently 2 exchanges supported;")]),e._v(" "),t("ul",[t("li",[e._v("New Block")]),e._v(" "),t("li",[e._v("New Transaction")])]),e._v(" "),t("p",[e._v("Filters can be applied on the client by defining routing keys;")]),e._v(" "),t("p",[e._v("For transactions;")]),e._v(" "),t("ul",[t("li",[t("code",[e._v("transactions.#")]),e._v(" to get all transactions.")]),e._v(" "),t("li",[t("code",[e._v("transactions.[BTC].#")]),e._v(" to get all [Bitcoin] transactions.")]),e._v(" "),t("li",[t("code",[e._v("transactions.[BTC].confirmed")]),e._v(" to get only confirmed [Bitcoin] transactions.")]),e._v(" "),t("li",[t("code",[e._v("transactions.[BTC].unconfirmed")]),e._v(" to get only unconfirmed [Bitcoin] transactions.")]),e._v(" "),t("li",[t("code",[e._v("transactions.*.confirmed")]),e._v(" to get all confirmed transactions.")]),e._v(" "),t("li",[t("code",[e._v("transactions.*.unconfirmed")]),e._v(" to get all unconfirmed transactions.")])]),e._v(" "),t("p",[e._v("For blocks;")]),e._v(" "),t("ul",[t("li",[t("code",[e._v("blocks.#")]),e._v(" to get all blocks.")]),e._v(" "),t("li",[t("code",[e._v("blocks.[BTC]")]),e._v(" to get all [Bitcoin] blocks.")])]),e._v(" "),t("p",[e._v("To activate RabbitMq mesages you should add following settings to your config file or on the command line.")]),e._v(" "),t("ul",[t("li",[e._v("rmqhost, rmquser, rmqpass")])]),e._v(" "),t("h4",{attrs:{id:"config-settings-2"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#config-settings-2"}},[e._v("#")]),e._v(" Config Settings")]),e._v(" "),t("p",[e._v("If you use the Configuration file to setup your NBXplorer options:")]),e._v(" "),t("div",{staticClass:"language-ini extra-class"},[t("pre",{pre:!0,attrs:{class:"language-ini"}},[t("code",[t("span",{pre:!0,attrs:{class:"token key attr-name"}},[e._v("rmqhost")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("=")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token value attr-value"}},[e._v("RabbitMq host name")]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token key attr-name"}},[e._v("rmqvirtual")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("=")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token value attr-value"}},[e._v("RabbitMq virtual host")]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token key attr-name"}},[e._v("rmquser")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("=")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token value attr-value"}},[e._v("RabbitMq username")]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token key attr-name"}},[e._v("rmqpass")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("=")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token value attr-value"}},[e._v("RabbitMq password")]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token key attr-name"}},[e._v("rmqtranex")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("=")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token value attr-value"}},[e._v("Name of exchange to send transaction messages")]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token key attr-name"}},[e._v("rmqblockex")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("=")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token value attr-value"}},[e._v("Name of exchange to send block messages")]),e._v("\n")])])]),t("p",[e._v("Payloads are JSON and map to "),t("code",[e._v("NewBlockEvent")]),e._v(", "),t("code",[e._v("NewTransactionEvent")]),e._v(" in the "),t("code",[e._v("NBXplorer.Models")]),e._v(" namespace. There is no support in NBXplorer client for message borkers at the current time. You will need to use the "),t("code",[e._v("Serializer")]),e._v(" in "),t("code",[e._v("NBXplorer.Client")]),e._v(" to de-serialize the objects or then implement your own JSON de-serializers for the custom types used in the payload.")]),e._v(" "),t("p",[e._v("For configuring serializers you can get crypto code info from "),t("code",[e._v("BasicProperties.Headers[CryptoCode]")]),e._v(" of RabbitMq messages or "),t("code",[e._v("UserProperties[CryptoCode]")]),e._v(" of Azure Service Bus messages.\nExamples can be found in unit tests.")]),e._v(" "),t("h4",{attrs:{id:"troubleshooting"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#troubleshooting"}},[e._v("#")]),e._v(" Troubleshooting")]),e._v(" "),t("p",[e._v("If you receive a 401 Unauthorized then your cookie data is not working. Check you are using the current cookie by opening the cookie file again - also check the date/time of the cookie file to ensure it is the latest cookie (generated when you launched NBXplorer).")]),e._v(" "),t("p",[e._v("If you receive a 404 or timeout then Postman cannot see the endpoint")]),e._v(" "),t("ul",[t("li",[e._v("are you using the correct Port ?")]),e._v(" "),t("li",[e._v("are you running postman on localhost ?")])]),e._v(" "),t("h2",{attrs:{id:"client-api"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#client-api"}},[e._v("#")]),e._v(" Client API")]),e._v(" "),t("p",[e._v("A better documentation is on the way, for now the only documentation is the client API in C# on "),t("a",{attrs:{href:"https://www.nuget.org/packages/NBxplorer.Client",target:"_blank",rel:"noopener noreferrer"}},[e._v("nuget"),t("OutboundLink")],1),e._v(".\nThe "),t("code",[e._v("ExplorerClient")]),e._v(" classes allows you to query unused addresses, and the UTXO of an HD PubKey.\nYou can take a look at "),t("a",{attrs:{href:"https://github.com/dgarage/NBXplorer/blob/master/NBXplorer.Tests/UnitTest1.cs",target:"_blank",rel:"noopener noreferrer"}},[e._v("the tests"),t("OutboundLink")],1),e._v(" to see how it works.")]),e._v(" "),t("p",[e._v("There is a simple use case documented on "),t("a",{attrs:{href:"https://programmingblockchain.gitbooks.io/programmingblockchain/content/wallet/web-api.html",target:"_blank",rel:"noopener noreferrer"}},[e._v("Blockchain Programming in C#"),t("OutboundLink")],1),e._v(".")]),e._v(" "),t("h2",{attrs:{id:"how-to-run-the-tests"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#how-to-run-the-tests"}},[e._v("#")]),e._v(" How to run the tests?")]),e._v(" "),t("p",[e._v("This is easy, from repo directory:")]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("cd")]),e._v(" NBXplorer.Tests\ndotnet "),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("test")]),e._v("\n")])])]),t("p",[e._v("The tests can take long the first time, as it download Bitcoin Core binaries. (Between 5 and 10 minutes)")]),e._v(" "),t("h2",{attrs:{id:"how-to-add-support-to-my-altcoin"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#how-to-add-support-to-my-altcoin"}},[e._v("#")]),e._v(" How to add support to my altcoin")]),e._v(" "),t("p",[e._v("First you need to add support for your altcoin to "),t("code",[e._v("NBitcoin.Altcoins")]),e._v(". (See "),t("a",{attrs:{href:"https://github.com/MetacoSA/NBitcoin/tree/master/NBitcoin.Altcoins",target:"_blank",rel:"noopener noreferrer"}},[e._v("here"),t("OutboundLink")],1),e._v(").")]),e._v(" "),t("p",[e._v("Once this is done and "),t("code",[e._v("NBXplorer")]),e._v(" updated to use the last version of "),t("code",[e._v("NBitcoin.Altcoins")]),e._v(", follow "),t("a",{attrs:{href:"https://github.com/dgarage/NBXplorer/blob/master/NBXplorer.Client/NBXplorerNetworkProvider.Litecoin.cs",target:"_blank",rel:"noopener noreferrer"}},[e._v("Litecoin example"),t("OutboundLink")],1),e._v(".")]),e._v(" "),t("p",[e._v("If you want to test if everything is working, modify "),t("a",{attrs:{href:"https://github.com/dgarage/NBXplorer/blob/master/NBXplorer.Tests/ServerTester.Environment.cs",target:"_blank",rel:"noopener noreferrer"}},[e._v("ServerTester.Environment.cs"),t("OutboundLink")],1),e._v(" to match your altcoin.")]),e._v(" "),t("p",[e._v("Then run the tests.")]),e._v(" "),t("h2",{attrs:{id:"licence"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#licence"}},[e._v("#")]),e._v(" Licence")]),e._v(" "),t("p",[e._v("This project is under MIT License.")]),e._v(" "),t("h2",{attrs:{id:"special-thanks"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#special-thanks"}},[e._v("#")]),e._v(" Special thanks")]),e._v(" "),t("p",[e._v("Special thanks to Digital Garage for allowing me to open source the project, which is based on an internal work I have done on Elements.")]),e._v(" "),t("p",[e._v("Thanks to the DG Lab Blockchain Team who had to fight with lots of bugs. (in particular kallewoof :p)")]),e._v(" "),t("p",[e._v("Thanks to Metaco SA, whose constant challenging projects refine my taste on what a perfect Bitcoin API should be.")])])}),[],!1,null,null,null);t.default=r.exports}}]); \ No newline at end of file diff --git a/assets/js/149.8cea802c.js b/assets/js/149.1dfa97ad.js similarity index 99% rename from assets/js/149.8cea802c.js rename to assets/js/149.1dfa97ad.js index 0f8101373e..3c566e440e 100644 --- a/assets/js/149.8cea802c.js +++ b/assets/js/149.1dfa97ad.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[149],{811:function(t,r,a){"use strict";a.r(r);var e=a(10),l=Object(e.a)({},(function(){var t=this,r=t._self._c;return r("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[r("div",{staticClass:"topics"},[r("h3",[t._v("Explore by topic")]),t._v(" "),r("ul",[r("li",[r("RouterLink",{attrs:{to:"/Guide/"}},[t._v("What is BTCPay Server")])],1),t._v(" "),r("li",[r("RouterLink",{attrs:{to:"/UseCase/"}},[t._v("Why BTCPay Server")])],1),t._v(" "),r("li",[r("RouterLink",{attrs:{to:"/TryItOut/"}},[t._v("How to deploy BTCPay Server")])],1),t._v(" "),r("li",[r("RouterLink",{attrs:{to:"/WalletSetup/"}},[t._v("Wallet Setup")])],1),t._v(" "),r("li",[r("RouterLink",{attrs:{to:"/LightningNetwork/"}},[t._v("Lightning Network")])],1),t._v(" "),r("li",[r("RouterLink",{attrs:{to:"/Apps/#point-of-sale-app"}},[t._v("How to setup POS")])],1),t._v(" "),r("li",[r("RouterLink",{attrs:{to:"/Development/GreenFieldExample/"}},[t._v("Greenfield API")])],1),t._v(" "),r("li",[r("RouterLink",{attrs:{to:"/FAQ/"}},[t._v("Frequently Asked Questions"),r("br"),t._v("and Common Issues")])],1),t._v(" "),r("li",[r("RouterLink",{attrs:{to:"/Contribute/"}},[t._v("How to contribute to BTCPay Server")])],1)])]),t._v(" "),r("svg",{attrs:{width:"0",height:"0",xmlns:"http://www.w3.org/2000/svg"}},[r("defs",[r("linearGradient",{attrs:{id:"spiral-gradient",x1:"81.36",y1:"311.35",x2:"541.35",y2:"311.35",gradientUnits:"userSpaceOnUse"}},[r("stop",{attrs:{offset:".18","stop-color":"#00f"}}),r("stop",{attrs:{offset:"1","stop-color":"#f0f"}})],1),t._v(" "),r("radialGradient",{attrs:{id:"acinq-a",cx:"47.833",cy:"51.834",r:"56.832"}},[r("stop",{attrs:{offset:"0","stop-color":"#fff"}}),r("stop",{attrs:{offset:"1","stop-color":"#fff","stop-opacity":"0"}})],1)],1),t._v(" "),r("symbol",{attrs:{id:"supporter-spiral",viewBox:"0 0 629 629"}},[r("path",{attrs:{d:"M326.4 572.09C201.2 572.09 141 503 112.48 445c-28.22-57.53-30.59-114.56-30.79-122.69-4.85-77 41-231.78 249.58-271.2a28.05 28.05 0 0 1 10.41 55.13c-213.12 40.28-204.44 206-204 213 0 .53.06 1.06.07 1.6.15 7.9 5.1 195.16 188.65 195.16 68.34 0 116.6-29.4 143.6-87.37 24.48-52.74 19.29-112.45-13.52-155.83-22.89-30.27-52.46-45-90.38-45-34.46 0-63.47 9.88-86.21 29.37A91.5 91.5 0 0 0 248 322.3c-1.41 25.4 7.14 49.36 24.07 67.49C287.27 406 305 413.9 326.4 413.9c27.46 0 45.52-9 53.66-26.81 8.38-18.3 3.61-38.93-.19-43.33-9.11-10-18.69-13.68-22.48-13-2.53.43-5.78 4.61-8.48 10.92a28 28 0 0 1-51.58-22c14.28-33.44 37.94-42 50.76-44.2 24.78-4.18 52.17 7.3 73.34 30.65s25.51 68.55 10.15 103.22C421.54 432 394.52 470 326.4 470c-36.72 0-69.67-14.49-95.29-41.92-27.47-29.4-41.34-68.08-39.11-108.89a149.1 149.1 0 0 1 51.31-104.6c33.19-28.45 74.48-42.87 122.71-42.87 55.12 0 101.85 23.25 135.12 67.23 45.36 60 52.9 141.71 19.66 213.3-25.35 54.67-79.68 119.84-194.4 119.84Z",fill:"url(#spiral-gradient)"}})]),t._v(" "),r("symbol",{attrs:{id:"supporter-bailliegifford",viewBox:"0 0 252.875 70.249"}},[r("path",{staticStyle:{fill:"var(--btcpay-body-text)","fill-opacity":"1",stroke:"var(--btcpay-body-text)","stroke-opacity":"1"},attrs:{d:"M366.764 291.907h4.554l-5.046 12.789h-4.553zM377.541 302.546h4.675l-.849 2.15h-9.229l5.046-12.789h4.554zM389.988 302.546h4.676l-.849 2.15h-9.229l5.045-12.789h4.554zM403.079 291.907h4.554l-5.046 12.789h-4.553zM418.795 302.487l-.871 2.209h-9.471l5.046-12.789h9.397l-.871 2.209h-4.844l-1.139 2.887h4.457l-.826 2.093h-4.457l-1.338 3.391zM445.115 294.349a6.207 6.207 0 0 0-2.213-.407c-3.344 0-4.898 3.391-5.35 4.535-.682 1.725-1.15 3.469.277 4.147.49.232 1.135.252 1.402.252l1.186-3.004h-1.648l.795-2.015h5.766l-2.4 6.084c-1.66.523-3.16.95-5.268.95-4.748 0-6.602-2.732-5.109-6.511 1.566-3.973 5.77-6.647 10.566-6.647 1.842 0 2.971.33 3.777.62l-1.781 1.996zM453.309 291.907h4.554l-5.045 12.789h-4.554zM458.684 304.696l5.045-12.789h9.398l-.871 2.209h-4.844l-1.269 3.217h4.457l-.871 2.209h-4.458l-2.033 5.154zM472.639 304.696l5.047-12.789h9.398l-.871 2.209h-4.846l-1.269 3.217h4.459l-.873 2.209h-4.457l-2.034 5.154z",transform:"translate(-293.5 -262.775)"}}),r("path",{staticStyle:{fill:"var(--btcpay-body-text)","fill-opacity":"1","fill-rule":"evenodd",stroke:"var(--btcpay-body-text)","stroke-opacity":"1"},attrs:{d:"M335.139 302.643c.557 0 1.187 0 1.747-.252.576-.232 1.106-.717 1.489-1.686.336-.854.189-1.279-.211-1.492-.376-.213-1.006-.213-1.612-.213h-.63l-1.438 3.643h.655zm2.154-5.523c.46 0 .993 0 1.521-.232.496-.213.986-.659 1.33-1.531.283-.717.162-1.085-.181-1.259-.319-.175-.852-.175-1.409-.175h-.63l-1.262 3.198h.631v-.001zm2.832-5.213c1.187 0 2.578.097 3.531.504.954.407 1.47 1.124.966 2.403-.727 1.841-2.749 2.732-4.501 3.12.502.077 1.378.252 2.05.698.647.445 1.06 1.182.578 2.403-.443 1.124-1.742 2.636-4.352 3.294-.995.252-2.107.368-4.481.368h-4.651l5.045-12.79h5.815zM350.689 300.201h2.833l.017-3.605-2.85 3.605zm6.664-8.294.792 12.79h-4.651l-.017-2.597h-4.288l-2.066 2.597h-3.149l10.714-12.79h2.665zM492.998 302.875c.922 0 2.209-.504 3.793-4.515 1.451-3.682 1.238-4.612-.047-4.612-1.283 0-2.363.775-3.955 4.806-1.07 2.713-1.316 4.321.209 4.321zm4.59-11.143c3.561 0 6.08 1.841 4.299 6.356-1.482 3.759-4.936 6.802-9.707 6.802-4.555 0-5.779-2.791-4.295-6.55 1.65-4.185 5.635-6.608 9.703-6.608zM512.328 293.922l-1.469 3.721h.484c1.502 0 2.234-.445 2.793-1.86.582-1.473.25-1.86-1.324-1.86h-.484v-.001zm1.254-2.015c2.398 0 3.312.078 4.168.426.814.33 1.785 1.124 1.166 2.694-.58 1.473-2.047 2.732-4.277 3.353l1.916 6.317h-4.893l-.965-5.29h-.533l-2.088 5.29h-4.408l5.047-12.79h4.867zM528.418 293.961l-3.424 8.682h.387c1.115 0 2.955.368 4.906-4.573 1.619-4.108.264-4.108-1.385-4.108h-.484v-.001zm.811-2.054c2.254 0 4.336 0 5.549 1.163 1.461 1.396.748 3.818.334 4.864-.727 1.841-2.406 4.748-6.227 6.143-1.24.446-2.498.62-5.09.62h-4.166l5.047-12.79h4.553z","clip-rule":"evenodd",transform:"translate(-293.5 -262.775)"}}),r("path",{staticStyle:{fill:"var(--btcpay-body-text)","fill-opacity":"1",stroke:"var(--btcpay-body-text)","stroke-opacity":"1"},attrs:{d:"M294 297.4c0-19.399 57.138-35.125 127.624-35.125 62.064 0 113.781 12.192 125.251 28.35-13.078-12.792-58.92-22.238-113.465-22.238-64.731 0-117.206 13.303-117.206 29.714 0 16.411 52.474 29.715 117.206 29.715 47.799 0 88.914-7.254 107.154-17.656-18.555 13.09-64.812 22.364-118.941 22.364C351.138 332.524 294 316.799 294 297.4z",transform:"translate(-293.5 -262.775)"}})]),t._v(" "),r("symbol",{attrs:{id:"supporter-coincards",viewBox:"0 0 64 32"}},[r("g",{attrs:{fill:"none"}},[r("path",{attrs:{d:"M32.7 5.9c-.2-1-1.3-1.7-2.3-1.4L7.7 9.9c-1 .2-1.7 1.3-1.4 2.3l3.1 12.9c.2 1 1.3 1.7 2.3 1.4l22.7-5.4c1-.2 1.7-1.3 1.4-2.3L32.7 5.9Z",fill:"#EF8022"}}),r("path",{attrs:{d:"M12.6 30.3c-.2.2-.5.3-.7.3l.8.5c.9.6 2.1.4 2.7-.5l3.1-4.4-5.9 4.1ZM2.3 19.5l-1 1.4c-.6.9-.4 2.1.5 2.7L8.1 28l-5.8-8.5ZM12.9 8.1l7.2-5-2.7-1.9c-.9-.6-2.1-.4-2.7.5l-5 7.2 3.2-.8Z",fill:"#F9F185"}}),r("path",{attrs:{d:"M9.7 29.4c.6.9 1.8 1.1 2.7.5l6.7-4.6-7.4 1.8c-1.3.3-2.6-.5-2.9-1.8L6 13.5l-3.3 2.3c-.9.6-1.1 1.8-.5 2.7l7.5 10.9Zm4.5-21.6L25.9 5l-1.3-2c-.6-.9-1.8-1.1-2.7-.5l-7.7 5.3Z",fill:"#FFC214"}}),r("path",{attrs:{d:"M11.9 24.8c-.7 0-1.4-.5-1.7-1.1l-1.5-3.2 1.1 4.6c.2.6.7 1.1 1.4 1.1h.3l17-4.1-16.2 2.7h-.4Z",fill:"#FFC214"}}),r("path",{attrs:{d:"M16 17.5s-1.1 1.2-2.5 1.2c-1.7 0-2.6-1.4-2.6-2.8 0-1.3.9-2.7 2.6-2.7 1.3 0 2.3 1 2.3 1l1.1-1.7s-.6-.7-1.9-1.1v-1.2h-1.1v1h-.6v-1h-1.1v1.1c-2.2.5-3.7 2.4-3.7 4.7 0 2.4 1.5 4.2 3.7 4.7v1.2h1.1v-1h.6V22H15v-1.3c1.4-.4 2.1-1.3 2.1-1.3L16 17.5ZM21 13.7c2.1 0 3.8 1.4 3.8 3.6 0 2.1-1.7 3.5-3.8 3.5-2.1 0-3.8-1.4-3.8-3.5s1.7-3.6 3.8-3.6Zm0 5.2c.8 0 1.5-.6 1.5-1.6s-.7-1.7-1.5-1.7-1.5.6-1.5 1.7c0 1 .7 1.6 1.5 1.6Zm4.3-5h2.3v6.7h-2.3v-6.7Zm0-2.6h2.2v1.8h-2.2v-1.8Zm3.2 2.6h2.2v1c.3-.5 1-1.2 2.1-1.2 1.4 0 2.4.6 2.4 2.5v4.4h-2.3v-4c0-.6-.2-.9-.7-.9-.7 0-1.1.4-1.3 1-.1.3-.1.6-.1.9v3h-2.3v-6.7Z",fill:"#FFF"}}),r("path",{attrs:{d:"M39.3 13.9c1.7 0 2.5 1 2.5 1l-.6.9s-.7-.8-1.8-.8c-1.3 0-2.3 1-2.3 2.4 0 1.3 1 2.4 2.3 2.4 1.2 0 2-.9 2-.9l.5.9s-.9 1.1-2.6 1.1c-2.1 0-3.5-1.5-3.5-3.5-.1-2 1.4-3.5 3.5-3.5Zm6.8 2.6h.3v-.1c0-1.1-.6-1.5-1.5-1.5-1 0-1.8.6-1.8.6l-.5-.9s1-.8 2.5-.8c1.7 0 2.6.9 2.6 2.6v4.2h-1.2v-1.1s-.5 1.3-2.1 1.3c-1.1 0-2.3-.7-2.3-2 0-2.2 2.9-2.3 4-2.3Zm-1.4 3.3c1.1 0 1.8-1.1 1.8-2.1v-.2h-.3c-1 0-2.7.1-2.7 1.3-.1.5.3 1 1.2 1Zm3.8-5.8h1.2v1.7c.3-1 1.1-1.7 2.1-1.7h.3v1.3h-.4c-.8 0-1.6.6-1.9 1.6-.1.4-.2.8-.2 1.2v2.7h-1.3V14h.2Zm6.8-.1c1.5 0 2 1 2 1v-3.5h1.3v9.2h-1.2v-1s-.5 1.2-2.2 1.2c-1.8 0-2.9-1.4-2.9-3.5s1.3-3.4 3-3.4Zm.2 5.8c1 0 1.9-.7 1.9-2.4 0-1.2-.6-2.4-1.9-2.4-1 0-1.9.9-1.9 2.4s.8 2.4 1.9 2.4Zm4.2-.8s.7.8 1.9.8c.5 0 1.1-.3 1.1-.8 0-1.2-3.4-1-3.4-3.1 0-1.2 1.1-1.9 2.4-1.9 1.5 0 2.1.7 2.1.7l-.5 1s-.6-.6-1.6-.6c-.5 0-1.1.2-1.1.8 0 1.2 3.4.9 3.4 3.1 0 1.1-.9 1.9-2.4 1.9-1.6 0-2.5-1-2.5-1l.6-.9Z",fill:"#EF8022"}})])]),t._v(" "),r("symbol",{attrs:{id:"supporter-acinq",viewBox:"0 0 103 107"}},[r("circle",{attrs:{fill:"url(#acinq-a)",cx:"47.833",cy:"51.833",r:"56.832"}}),r("g",[r("g",{attrs:{fill:"none","stroke-width":"6","stroke-linejoin":"round"}},[r("path",{attrs:{stroke:"#47BF94",d:"M4.493 79.67c-6.778-11.574 21.882-35.135 41.646-39.636 16.598-3.78 55.176 4.066 53.752 17.433"}}),r("path",{attrs:{stroke:"#359F7E",d:"M10.125 18.133c8.624-9.988 41.797 13.701 51.001 30.018 9.723 17.237 12.87 55.271-1.103 55.351"}}),r("path",{attrs:{stroke:"#49DAAA",d:"M69.826 4.107c12.025 5.964 3.838 38.632-11.184 57.28C47.846 74.79 11.659 91.904 4.493 79.67"}}),r("path",{attrs:{stroke:"#49DAAA",d:"M99.891 57.467C98.471 70.799 62.529 72.9 43.83 64.781c-17.92-7.783-42.47-36.5-33.706-46.648"}}),r("path",{attrs:{stroke:"#AAF0D3",d:"M60.023 103.502c-14.291.08-24.609-29.721-23.918-51.916.758-24.377 20.678-53.948 33.721-47.479"}})])])]),t._v(" "),r("symbol",{attrs:{id:"supporter-lunanode",viewBox:"0 0 194.219 193.977"}},[r("path",{staticStyle:{fill:"#004581","fill-opacity":"1","fill-rule":"evenodd",stroke:"none"},attrs:{d:"M3185.89 2995.8c-1.77 21.49-2.76 43.2-2.76 65.16 0 411.03 319.09 747.36 723.13 774.95l-618.54-641.7c-54.62-56.68-88.55-126.08-101.83-198.41M3960 2284.09c-270.37 0-508.4 138.15-647.57 347.65l23.25-22.42c76.82-74.06 176.93-109.95 276.2-108.13 99 1.77 197.53 41.2 271.5 117.59l-177.95 171.52c-26.66-27.31-62.22-41.38-98.02-42.14-36.12-.65-72.43 12.41-100.16 39.15l-37.98 36.6c-27.69 26.66-42.04 62.45-42.7 98.57-.65 36.07 12.36 72.48 39.11 100.21l745.68 773.56c305.71-104.45 525.52-394.17 525.52-735.29 0-29.89-1.73-59.34-5.04-88.32-19.44 54.57-51.41 105.56-95.79 148.35l-37.93 36.58c-76.86 74.07-176.93 110.05-276.16 108.18-99.32-1.77-198.13-41.38-272.19-118.25l-290.74-301.59 177.95-171.53 290.74 301.61c26.71 27.73 62.64 42.04 98.72 42.74 36.12.69 72.38-12.35 100.16-39.1l37.89-36.59c27.69-26.66 42.09-62.45 42.74-98.58.61-36.03-12.4-72.48-39.1-100.21l-440.73-457.23c-22.23-1.9-44.69-2.93-67.4-2.93",transform:"matrix(.125 0 0 -.125 -397.891 479.489)"}}),r("path",{staticStyle:{fill:"#3384b9","fill-opacity":"1","fill-rule":"evenodd",stroke:"none"},attrs:{d:"M4376.22 2292.8h360.66v433.41c-17.35-55.88-47.59-108.64-90.81-153.48l-269.85-279.93",transform:"matrix(.125 0 0 -.125 -397.891 479.489)"}})]),t._v(" "),r("symbol",{attrs:{id:"supporter-walletofsatoshi",viewBox:"0 0 313.1 76.32"}},[r("path",{attrs:{d:"M110.47 44.8H121c.84 0 1.22-.64.9-1.48l-17.6-42A2 2 0 0 0 102.22 0H87.63a2 2 0 0 0-2 1.34L66 48.11c-.32.84.06 1.48.83 1.48h13.7a1.42 1.42 0 0 1 1.32 1.93l-9.7 24.8 30.55-32.63A1 1 0 0 0 102 42H84.73a1.42 1.42 0 0 1-1.32-2l5.06-12.91 6.86-17.47 6.78 17.51h-7.54a1.42 1.42 0 0 0-1.32.9l-2.83 7.22a1.42 1.42 0 0 0 1.32 1.93H105a1.42 1.42 0 0 1 1.33.91l2.08 5.36a1.92 1.92 0 0 0 2.06 1.35Zm62.65 0h37.42a1.3 1.3 0 0 0 1.46-1.41V35.9a1.3 1.3 0 0 0-1.47-1.41h-26V1.41A1.35 1.35 0 0 0 183 0h-9.92a1.3 1.3 0 0 0-1.47 1.41v42a1.3 1.3 0 0 0 1.51 1.39Zm45.36 0h42a1.3 1.3 0 0 0 1.52-1.41V35.9a1.31 1.31 0 0 0-1.47-1.41h-30.59v-7.36h25.59a1.33 1.33 0 0 0 1.48-1.4v-7a1.33 1.33 0 0 0-1.48-1.41h-25.59v-7h30.59A1.3 1.3 0 0 0 262 8.89V1.41A1.3 1.3 0 0 0 260.53 0h-42A1.3 1.3 0 0 0 217 1.41v42a1.3 1.3 0 0 0 1.48 1.39ZM71.79 0H61.61a1.71 1.71 0 0 0-1.85 1.41L52.08 34.3 44.91 1.41A1.65 1.65 0 0 0 43.12 0H30.38a1.71 1.71 0 0 0-1.85 1.41L21.36 34.3 13.68 1.41A1.65 1.65 0 0 0 11.89 0H1.14C.24 0-.14.51.05 1.41l10.88 42a1.68 1.68 0 0 0 1.79 1.41H28.4a1.65 1.65 0 0 0 1.79-1.41l6.27-28.31 6.34 28.29a1.65 1.65 0 0 0 1.79 1.41H60.2a1.66 1.66 0 0 0 1.8-1.41l10.87-42C73.07.51 72.68 0 71.79 0Zm239.84 0h-43.52a1.3 1.3 0 0 0-1.47 1.41v7.48a1.3 1.3 0 0 0 1.47 1.41h15.29v33.09a1.3 1.3 0 0 0 1.48 1.41h10a1.33 1.33 0 0 0 1.47-1.41V10.3h15.3a1.3 1.3 0 0 0 1.47-1.41V1.41A1.3 1.3 0 0 0 311.63 0ZM127.76 44.8h37.42a1.3 1.3 0 0 0 1.47-1.41V35.9a1.3 1.3 0 0 0-1.47-1.41h-26V1.41a1.35 1.35 0 0 0-1.5-1.41h-9.92a1.3 1.3 0 0 0-1.47 1.41v42a1.3 1.3 0 0 0 1.47 1.39Zm-3.84 9.6h-11.53c-3.13 0-4.53 1.31-4.53 4.36v10.37c0 3.05 1.4 4.36 4.53 4.36h11.53c3.16 0 4.51-1.31 4.51-4.36V58.76c0-3.05-1.35-4.36-4.51-4.36Zm-1 12.95c0 1.48-.29 1.75-2.07 1.75h-5.51c-1.76 0-2.08-.27-2.08-1.75v-6.81c0-1.47.32-1.75 2.08-1.75h5.51c1.78 0 2.07.28 2.07 1.75Zm51.87-5.59h-8.75c-.89 0-1.16-.27-1.16-.95v-1.06c0-.68.27-1 1.16-1h6.7c.65 0 .89.28.89.85v.16a.55.55 0 0 0 .62.6h4a.55.55 0 0 0 .62-.6v-1.08c0-3.21-1.11-4.28-4.4-4.28H164c-3.19 0-4.51 1.31-4.51 4.36v2.84c0 3.06 1.32 4.36 4.51 4.36h8.74c.9 0 1.17.28 1.17 1v1.23c0 .68-.27.95-1.17.95h-7.34c-.62 0-.86-.27-.86-.85v-.16a.56.56 0 0 0-.62-.6h-4a.55.55 0 0 0-.62.6v1.12c0 3.22 1.08 4.28 4.4 4.28h11.2c3.19 0 4.51-1.31 4.51-4.36v-3c-.06-3.1-1.41-4.41-4.57-4.41Zm85.43 0h-8.75c-.89 0-1.16-.27-1.16-.95v-1.06c0-.68.27-1 1.16-1h6.7c.64 0 .89.28.89.85v.16a.55.55 0 0 0 .62.6h4a.55.55 0 0 0 .62-.6v-1.08c0-3.21-1.11-4.28-4.4-4.28h-10.48c-3.19 0-4.51 1.31-4.51 4.36v2.84c0 3.06 1.32 4.36 4.51 4.36h8.74c.89 0 1.16.28 1.16 1v1.23c0 .68-.27.95-1.16.95h-7.34c-.62 0-.86-.27-.86-.85v-.16a.57.57 0 0 0-.62-.6h-4.05a.55.55 0 0 0-.62.6v1.12c0 3.22 1.08 4.28 4.4 4.28h11.2c3.18 0 4.51-1.31 4.51-4.36v-3c0-3.1-1.33-4.41-4.51-4.41Zm26.65-7.36h-4.21a.56.56 0 0 0-.63.6v6.66h-9.2V55a.57.57 0 0 0-.65-.6H268a.55.55 0 0 0-.62.6v17.89a.55.55 0 0 0 .62.6h4.18a.57.57 0 0 0 .65-.6v-6.84h9.2v6.84a.56.56 0 0 0 .63.6h4.21a.55.55 0 0 0 .62-.6V55a.55.55 0 0 0-.57-.6Zm-137.62 0h-17.07a.55.55 0 0 0-.62.6v17.89a.55.55 0 0 0 .62.6h4.19a.58.58 0 0 0 .65-.6v-6.52h10.15a.57.57 0 0 0 .64-.6v-3.19a.57.57 0 0 0-.64-.6H137v-3.19h12.3a.55.55 0 0 0 .62-.6V55a.55.55 0 0 0-.62-.6Zm146.47 0h-4.18a.55.55 0 0 0-.62.6v17.89a.55.55 0 0 0 .62.6h4.18a.57.57 0 0 0 .65-.6V55a.57.57 0 0 0-.6-.6Zm-100.28.6a.83.83 0 0 0-.86-.57h-6.16a.83.83 0 0 0-.89.57l-7.42 17.89c-.14.36 0 .63.38.63h4.45a.8.8 0 0 0 .86-.57l1-2.68h9.1l1 2.68a.8.8 0 0 0 .87.57h4.69c.33 0 .49-.27.35-.63Zm-7 11 2.89-7.52 2.92 7.52Zm30.9-11.6H201a.55.55 0 0 0-.62.6v3.19a.55.55 0 0 0 .62.6h6.45v14.1a.55.55 0 0 0 .62.6h4.21a.56.56 0 0 0 .62-.6v-14.1h6.46a.55.55 0 0 0 .62-.6V55a.55.55 0 0 0-.64-.6Zm18.46 0h-11.52c-3.13 0-4.54 1.31-4.54 4.36v10.37c0 3.05 1.41 4.36 4.54 4.36h11.52c3.16 0 4.51-1.31 4.51-4.36V58.76c0-3.05-1.31-4.36-4.51-4.36Zm-.94 12.95c0 1.48-.3 1.75-2.08 1.75h-5.51c-1.75 0-2.07-.27-2.07-1.75v-6.81c0-1.47.32-1.75 2.07-1.75h5.51c1.78 0 2.08.28 2.08 1.75Z",fill:"#fad228",stroke:"#1e2127","stroke-width":"2"}})]),t._v(" "),r("symbol",{attrs:{id:"supporter-nomics",viewBox:"0 0 600 600"}},[r("path",{attrs:{d:"M273.56 133A136.81 136.81 0 0 0 0 136.86v326.28a136.8 136.8 0 0 0 233.57 96.75L326.44 467A136.81 136.81 0 0 0 600 463.14V136.86a136.8 136.8 0 0 0-233.57-96.75L273.56 133",fill:"#a0f"}}),r("ellipse",{attrs:{cx:"302.18",cy:"300.04",rx:"136.81",ry:"136.86",fill:"#fff"}})]),t._v(" "),r("symbol",{attrs:{id:"supporter-ivpn",viewBox:"0 0 84 29"}},[r("path",{attrs:{"fill-rule":"evenodd","clip-rule":"evenodd",d:"M6.75 0h6.03c.07 0 .15.03.2.1.04.05.06.13.05.2L8.6 27.43a.26.26 0 0 1-.24.22l-6.63.38H1.7a.25.25 0 0 1-.19-.08.26.26 0 0 1-.06-.22L5.2 5.05C5.12 1.67 1 .85.49.73-.06.59 0 0 0 0h6.75Zm32.32.12a.25.25 0 0 0-.22-.12h-6.5c-.1 0-.18.05-.23.14l-8.98 17.4L20.08.2a.25.25 0 0 0-.24-.21h-6.55a.25.25 0 0 0-.2.1.26.26 0 0 0-.05.2l4.85 26.05a.25.25 0 0 0 .26.2l7.57-.43c.08 0 .16-.06.2-.14L39.08.38a.26.26 0 0 0-.01-.26Zm20.27 5.5a6.8 6.8 0 0 0-.53-2.08c-.27-.6-.61-1.1-1.01-1.5-.4-.41-.8-.75-1.23-1A8.23 8.23 0 0 0 52.9 0H40.47a.25.25 0 0 0-.25.2l-4.01 24.6c-.01.07.01.14.06.2.05.05.11.08.18.08h.02l6.25-.36c.11 0 .2-.1.22-.21l.75-4.63h6.08c1.39-.09 2.7-.43 3.89-1.03a9.75 9.75 0 0 0 2.99-2.46 9.9 9.9 0 0 0 2-4.76l.56-3.3c.17-1.02.21-1.93.13-2.71Zm-7.21 5.87a2.53 2.53 0 0 1-1.1 1.66c-.27.18-.64.27-1.1.27H44.7l1.1-7h5.3c.45 0 .78.09.97.27.22.2.38.41.47.65.1.27.13.6.1.95l-.52 3.2ZM83.75 0h-6.32c-.12 0-.23.1-.25.22l-2.25 14.34L70.04.17a.25.25 0 0 0-.23-.17H63.5c-.12 0-.23.1-.25.22l-3.86 24.56c-.01.07.01.16.06.22.05.05.12.08.19.08l6.43-.39c.12 0 .21-.1.23-.22l1.62-10.36 3.4 10.08c.04.1.14.17.25.17l8.58-.52c.11 0 .2-.1.23-.22L84 .3a.27.27 0 0 0-.06-.22.24.24 0 0 0-.19-.09Z",fill:"#F34"}})]),t._v(" "),r("symbol",{attrs:{id:"supporter-strike",viewBox:"0 0 155 120"}},[r("path",{staticStyle:{fill:"var(--btcpay-body-text)"},attrs:{"fill-rule":"evenodd","clip-rule":"evenodd",d:"M7.06565 43.2477C1.90963 41.2685 -0.665684 35.4843 1.31353 30.3283C3.29274 25.1722 9.07699 22.5969 14.233 24.5761L51.4526 38.8634C51.4937 38.8798 51.535 38.896 51.5765 38.9119L70.2481 46.0792C75.4041 48.0584 81.1883 45.4831 83.1675 40.3271C85.1468 35.1711 82.5714 29.3868 77.4154 27.4076L77.4132 27.4068C77.4139 27.4064 77.4145 27.406 77.4151 27.4056L58.7436 20.2383C53.5876 18.2591 51.0123 12.4749 52.9915 7.31885C54.9707 2.16283 60.755 -0.412485 65.911 1.56673L120.828 22.6473C120.959 22.6977 121.089 22.7506 121.217 22.8059C121.453 22.8928 121.69 22.9815 121.926 23.0721C147.706 32.9681 160.583 61.8894 150.686 87.6695C140.79 113.45 111.869 126.326 86.089 116.43C85.5927 116.24 85.1011 116.042 84.6144 115.838C84.3783 115.766 84.1431 115.686 83.9091 115.596L30.0742 94.9308C24.9182 92.9516 22.3428 87.1673 24.3221 82.0113C26.3013 76.8553 32.0855 74.2799 37.2415 76.2592L55.9106 83.4256C55.9103 83.4242 55.9099 83.4229 55.9095 83.4215L55.9133 83.423C61.0694 85.4022 66.8536 82.8269 68.8328 77.6709C70.812 72.5148 68.2367 66.7306 63.0807 64.7514L54.6786 61.5261C54.6787 61.5257 54.6788 61.5252 54.6789 61.5247L7.06565 43.2477Z"}})]),t._v(" "),r("symbol",{attrs:{id:"supporter-hrf",viewBox:"0 0 3000 987.6"}},[r("path",{attrs:{d:"M1137.09 103.9v773.45h-51.44V515.96h-953.6v361.38H80.62V103.9h51.44v361.2h953.6V103.9h51.43zm-102.77 0h-51.44v258.19H234.94V103.9H183.5v309.05h850.82V103.9zm-696.29 0h-50.87v205.84h50.87V103.9zm593.05 0h-51.44v205.84h51.44V103.9zM183.5 877.34h51.44V619.16h747.94v258.19h51.44V567.72H183.5v309.62zm695.72 0h51.44V670.93h-51.44v206.41zm-592.47 0h51.44V670.93h-51.44v206.41z",fill:"#e12991"}}),r("path",{staticStyle:{fill:"var(--btcpay-body-text)"},attrs:{d:"M1422.94 103.88V331.3h-44.51v-94.22h-92.2v94.22h-44.83V103.88h44.83v90.32h92.2v-90.32h44.51zM1605.81 168.85V331.3h-41.91v-18.19c-9.75 14.62-26.64 22.74-48.41 22.74-34.44 0-61.4-24.04-61.4-67.25v-99.74H1496v94.54c0 22.1 13.32 33.47 32.16 33.47 20.47 0 35.74-12.02 35.74-40.29v-87.72h41.91zM1885.19 231.23V331.3h-41.91v-97.14c0-19.17-9.75-30.86-27.29-30.86-18.52 0-30.22 12.35-30.22 36.71v91.29h-41.91v-97.14c0-19.17-9.75-30.86-27.29-30.86-17.87 0-30.54 12.35-30.54 36.71v91.29h-41.91V168.85h41.91v17.22c9.1-13.64 24.37-21.77 45.16-21.77 20.14 0 35.09 8.45 44.18 23.39 10.07-14.62 26.32-23.39 48.41-23.39 37.04.01 61.41 26.32 61.41 66.93zM2086.24 168.85V331.3h-41.91v-19.17c-11.7 14.62-29.24 23.72-52.96 23.72-43.21 0-78.95-37.36-78.95-85.77s35.74-85.77 78.95-85.77c23.72 0 41.26 9.1 52.96 23.72v-19.17h41.91zm-41.91 81.23c0-27.29-19.17-45.81-45.16-45.81-25.66 0-44.83 18.52-44.83 45.81 0 27.29 19.17 45.81 44.83 45.81 25.99 0 45.16-18.52 45.16-45.81zM2275.93 231.56v99.74h-41.91v-94.54c0-22.09-13.32-33.46-32.16-33.46-20.47 0-35.74 12.02-35.74 40.29v87.72h-41.91V168.85h41.91v18.19c9.75-14.62 26.64-22.74 48.41-22.74 34.44.01 61.4 24.05 61.4 67.26zM1316.47 525.36h-30.25v78.95h-44.83V376.89h94.84c41.91 0 75.7 33.79 75.7 75.37 0 28.59-17.87 54.26-43.86 66.28l50.36 85.77h-48.41l-53.55-78.95zm-30.25-39.31h50c16.89 0 30.86-14.95 30.86-33.79s-13.97-33.46-30.86-33.46h-50v67.25zM1437.88 396.71c0-13.97 15.57-25.99 29.54-25.99 14.29 0 22.12 12.02 22.12 25.99s-11.7 25.67-25.99 25.67c-13.97 0-25.67-11.7-25.67-25.67zm4.88 45.16h41.91v162.45h-41.91V441.87zM1681.86 441.87v154.65c0 53.28-41.91 77.33-84.8 77.33-34.77 0-62.7-13.32-77-39.64l35.74-20.47c6.82 12.67 17.54 22.74 42.56 22.74 26.31 0 42.56-14.29 42.56-39.96v-17.54c-11.37 15.27-28.92 24.69-51.98 24.69-46.14 0-80.9-37.36-80.9-83.17 0-45.48 34.76-83.17 80.9-83.17 23.07 0 40.61 9.42 51.98 24.69v-20.14h40.94zm-40.94 78.62c0-25.67-19.17-44.18-45.49-44.18-26.31 0-45.48 18.52-45.48 44.18 0 25.99 19.17 44.51 45.48 44.51 26.32 0 45.49-18.52 45.49-44.51zM1871.55 504.57v99.74h-41.91v-94.54c0-22.09-13.32-33.46-32.16-33.46-20.47 0-35.74 12.02-35.74 40.29v87.72h-41.91V376.89h41.91v83.17c9.75-14.62 26.64-22.74 48.41-22.74 34.44 0 61.4 24.04 61.4 67.25zM1963.46 482.15v67.58c0 17.54 12.67 17.87 36.71 16.57v38.01c-58.81 6.5-78.62-10.72-78.62-54.58v-67.58h-28.27v-40.29h28.27v-32.81l41.91-12.67v45.48h36.71v40.29h-36.71zM2148.63 556.88c0 35.09-30.54 51.98-65.31 51.98-32.49 0-56.53-13.64-68.22-38.66l36.39-20.47c4.55 13.32 15.6 21.12 31.84 21.12 13.32 0 22.42-4.55 22.42-13.97 0-23.72-83.82-10.72-83.82-67.9 0-33.14 28.27-51.66 61.73-51.66 26.32 0 49.06 12.02 61.73 34.44l-35.74 19.49c-4.88-10.4-13.97-16.57-25.99-16.57-10.4 0-18.84 4.55-18.84 13.32-.01 24.04 83.81 9.1 83.81 68.88zM1286.22 692.79v53.93h96.11v42.89h-96.11v87.72h-44.83V649.9h143.54v42.88h-98.71zM1400.82 796.1c0-48.41 38.01-85.77 85.77-85.77s86.1 37.36 86.1 85.77-38.34 85.77-86.1 85.77c-47.76 0-85.77-37.36-85.77-85.77zm129.96 0c0-26.31-19.17-44.83-44.19-44.83-24.69 0-43.86 18.52-43.86 44.83 0 26.32 19.17 44.83 43.86 44.83 25.02.01 44.19-18.51 44.19-44.83zM1744.84 714.88v162.45h-41.91v-18.19c-9.75 14.62-26.64 22.74-48.41 22.74-34.44 0-61.4-24.04-61.4-67.25v-99.74h41.91v94.54c0 22.1 13.32 33.47 32.16 33.47 20.47 0 35.74-12.02 35.74-40.29v-87.72h41.91zM1934.86 777.58v99.74h-41.91v-94.54c0-22.09-13.32-33.46-32.16-33.46-20.47 0-35.74 12.02-35.74 40.29v87.72h-41.91V714.88h41.91v18.19c9.75-14.62 26.64-22.74 48.41-22.74 34.44 0 61.4 24.04 61.4 67.25zM2135.61 649.9v227.42h-41.91v-19.17c-11.7 14.95-28.92 23.72-52.63 23.72-43.54 0-79.27-37.36-79.27-85.77s35.74-85.77 79.27-85.77c23.72 0 40.94 8.77 52.63 23.72V649.9h41.91zm-41.91 146.2c0-27.29-19.17-45.81-44.84-45.81-25.99 0-45.16 18.52-45.16 45.81 0 27.29 19.17 45.81 45.16 45.81 25.67.01 44.84-18.51 44.84-45.81zM2337.35 714.88v162.45h-41.91v-19.17c-11.7 14.62-29.24 23.72-52.96 23.72-43.21 0-78.95-37.36-78.95-85.77s35.74-85.77 78.95-85.77c23.72 0 41.26 9.1 52.96 23.72v-19.17h41.91zm-41.91 81.22c0-27.29-19.17-45.81-45.16-45.81-25.66 0-44.83 18.52-44.83 45.81 0 27.29 19.17 45.81 44.83 45.81 25.99.01 45.16-18.51 45.16-45.81zM2433.46 755.17v67.58c0 17.54 12.67 17.87 36.71 16.57v38.01c-58.81 6.5-78.62-10.72-78.62-54.58v-67.58h-28.26v-40.29h28.26v-32.81l41.91-12.67v45.48h36.71v40.29h-36.71zM2494.84 669.72c0-13.97 11.7-25.99 25.67-25.99 14.29 0 25.99 12.02 25.99 25.99s-11.7 25.66-25.99 25.66c-13.97.01-25.67-11.69-25.67-25.66zm4.87 45.16h41.91v162.45h-41.91V714.88zM2565 796.1c0-48.41 38.01-85.77 85.77-85.77s86.1 37.36 86.1 85.77-38.34 85.77-86.1 85.77c-47.76 0-85.77-37.36-85.77-85.77zm129.96 0c0-26.31-19.17-44.83-44.19-44.83-24.69 0-43.86 18.52-43.86 44.83 0 26.32 19.17 44.83 43.86 44.83 25.02.01 44.19-18.51 44.19-44.83zM2911.62 777.58v99.74h-41.91v-94.54c0-22.09-13.32-33.46-32.16-33.46-20.47 0-35.74 12.02-35.74 40.29v87.72h-41.91V714.88h41.91v18.19c9.75-14.62 26.64-22.74 48.41-22.74 34.44 0 61.4 24.04 61.4 67.25z"}})]),t._v(" "),r("symbol",{attrs:{id:"supporter-esc",viewBox:"0 0 74.222 74.044"}},[r("g",{staticStyle:{fill:"var(--btcpay-body-text)"}},[r("path",{staticStyle:{"stroke-width":"1.91694"},attrs:{d:"M625.227 7403.82c-287.542-92.014-494.572-337.383-538.662-640.26-21.087-157.19-21.087-5869.689 0-6026.878 46.007-308.628 260.704-557.832 555.914-646.01C736.41 63.833 1046.955 60 3769.018 60s3032.608 3.834 3126.539 30.671c295.21 88.18 509.907 337.383 555.914 646.01 21.086 157.19 21.086 5869.69 0 6026.879-46.007 308.628-260.705 557.83-555.914 646.01-93.93 26.838-404.476 30.672-3134.207 28.755-2842.83 0-3036.442-1.917-3136.123-34.505zm6208.987-299.044c120.768-42.173 187.861-97.764 251.12-207.03l57.509-99.681V702.177l-57.509-99.681c-63.259-109.266-130.352-164.858-251.12-207.03-120.767-44.09-6009.625-44.09-6130.393 0-120.767 42.172-187.86 97.764-251.12 207.03l-57.508 99.68v6095.889l57.509 99.68c61.342 105.433 130.352 164.858 243.452 207.031 113.1 40.256 6021.127 42.173 6138.06 0z",transform:"matrix(.0098 0 0 .0098 .182 .285)"}}),r("path",{staticStyle:{"stroke-width":"1.91694"},attrs:{d:"M1934.5 4967.381c-272.206-55.591-492.654-249.203-582.75-511.824-32.59-97.764-36.423-162.94-36.423-705.436 0-542.496 3.834-607.672 36.422-705.436 74.761-216.615 241.535-391.057 456.233-475.403 103.515-42.173 139.937-44.09 529.077-46.007h419.811l46.007 53.675c59.425 69.01 59.425 136.103-1.917 195.528-46.007 47.924-49.84 47.924-398.725 47.924-433.23 0-513.741 19.17-646.01 151.439-113.1 113.1-134.186 180.193-134.186 425.562v185.944l59.425 11.501c32.588 5.751 291.376 11.502 575.084 11.502h513.741l38.339 49.84c51.758 65.177 51.758 122.685 0 187.861l-38.339 49.84h-513.741c-283.708 0-542.496 5.752-577.001 11.502l-61.342 13.419 5.75 224.283c7.668 207.03 11.502 230.033 61.343 302.877 69.01 107.35 185.943 187.86 302.877 212.781 51.758 11.502 247.286 21.087 431.313 21.087 329.715 0 335.465 0 381.472 47.923 61.342 59.425 61.342 126.519 1.917 195.529l-46.007 53.674-371.887 3.834c-203.196 1.917-406.393-5.75-450.482-13.419zM3677.004 2553.947c-208.947 55.59-368.053 189.777-461.984 389.14-42.172 92.013-49.84 134.186-49.84 279.874 0 157.19 5.75 185.943 63.259 300.96 70.927 143.771 184.027 254.954 325.88 323.964 67.094 32.588 145.689 46.007 312.463 57.508 251.12 17.253 289.459 28.755 379.555 105.432 228.117 191.695 147.605 565.5-139.937 649.845-70.927 21.086-197.445 28.754-481.153 28.754-379.555 0-387.223 0-427.48 44.09-57.507 61.342-55.59 147.605 7.669 207.03 49.84 46.007 49.84 46.007 492.655 46.007 412.143-1.917 452.4-3.834 550.163-44.09 153.356-61.342 293.293-191.694 368.054-345.05 57.508-115.017 63.26-143.771 63.26-300.96 0-157.19-5.752-185.944-63.26-300.961-69.01-143.771-184.027-254.954-325.88-323.964-69.011-32.588-141.855-46.007-312.463-57.508-164.857-11.502-243.452-24.92-300.96-53.675-237.702-120.767-283.709-415.977-93.931-611.506 97.764-101.598 195.529-118.85 638.343-118.85h389.14l38.339-49.84c59.425-74.762 51.758-147.606-19.17-207.031l-59.425-49.84-394.89 1.916c-279.875 0-427.48 9.585-498.407 28.755zM5630.372 4965.465c-299.043-57.509-546.33-297.127-613.423-594.254-26.837-109.266-26.837-1132.915 0-1242.18 69.01-302.878 314.38-538.663 621.091-594.254 174.442-32.588 745.692-26.837 812.785 7.668 84.346 42.173 107.35 153.356 47.924 230.033-26.837 36.422-57.509 38.34-435.147 47.924-392.974 9.585-410.226 13.419-504.157 61.342-113.1 59.426-193.611 157.19-230.033 279.874-38.34 124.602-38.34 1054.32 0 1178.922 36.422 120.768 122.684 226.2 235.784 281.791 88.18 46.007 111.183 47.924 484.987 53.675 368.054 5.75 394.891 9.584 437.064 47.923 23.003 21.087 42.173 61.343 42.173 92.014 0 153.355-49.84 170.608-473.486 168.691-187.86-1.917-379.555-9.585-425.562-19.17z",transform:"matrix(.0098 0 0 .0098 .182 .285)"}})])]),t._v(" "),r("symbol",{attrs:{id:"supporter-opensats",viewBox:"0 0 5220 720"}},[r("path",{attrs:{d:"M0 435.197L229.609 291.597V288.121L0 144.259V29.0508L334.901 245.894V333.824L0 550.798V435.197Z",fill:"#FF3300"}}),r("path",{attrs:{d:"M486.969 623.844H902.627V719.643H486.969V623.844Z",fill:"#FF3300"}}),r("path",{attrs:{d:"M993.879 291.2C993.879 106.422 1084.61 0 1214.37 0C1344.13 0 1434.86 106.422 1434.86 291.2C1434.86 479.061 1344.13 587.581 1214.37 587.581C1084.61 587.581 993.879 479.061 993.879 291.2ZM1345.12 291.2C1345.12 155.01 1293.16 75.9967 1214.37 75.9967C1135.58 75.9967 1083.62 155.01 1083.62 291.2C1083.62 430.473 1135.58 511.584 1214.37 511.584C1293.16 511.584 1344.85 430.473 1344.85 291.2H1345.12Z",fill:"#FF3300"}}),r("path",{attrs:{d:"M1593.29 154.29H1663.81L1670.37 205.37H1673.13C1711.31 169.634 1764.71 144.258 1814.44 144.258C1925.96 144.258 1988.02 228.713 1988.02 359.855C1988.02 504.111 1897.95 587.911 1797.77 587.911C1759.13 587.911 1713.54 568.829 1677.39 535.454H1675.29L1679.43 612.237V749.936H1593.29V154.29ZM1899.65 359.855C1899.65 271.269 1867.44 215.599 1791.21 215.599C1756.57 215.599 1717.93 232.713 1679.69 272.121V472.112C1714.79 503.914 1754.61 515.455 1781.57 515.455C1848.75 515.717 1899.65 459.851 1899.65 359.855Z",fill:"#FF3300"}}),r("path",{attrs:{d:"M2118.96 365.035C2118.96 227.336 2222.75 143.93 2335.98 143.93C2460.16 143.93 2530.82 225.434 2530.82 343.527C2530.67 359.209 2529.35 374.858 2526.88 390.345H2178.73V327.2H2473.22L2454.52 348.249C2454.52 256.449 2410.17 210.55 2338.47 210.55C2264.41 210.55 2203.66 265.17 2203.66 364.904C2203.66 468.833 2268.8 520.044 2359.79 520.044C2407.09 520.044 2445.08 505.75 2483.39 482.8L2513.56 537.29C2464.7 569.886 2407.32 587.378 2348.57 587.582C2220.39 587.582 2118.96 505.947 2118.96 365.035Z",fill:"#FF3300"}}),r("path",{attrs:{d:"M2658.41 154.29H2729.07L2735.63 221.697H2739.04C2781.55 178.289 2829.83 144.258 2895.17 144.258C2994.1 144.258 3039.17 205.042 3039.17 315.201V577.026H2952.9V326.152C2952.9 252.319 2928.11 218.222 2865.39 218.222C2819.47 218.222 2788.31 240.844 2744.68 285.563V577.026H2658.41V154.29Z",fill:"#FF3300"}}),r("path",{staticStyle:{fill:"var(--btcpay-body-text)"},attrs:{d:"M3208.36 504.308L3259.46 444.376C3303 486.486 3360.93 510.468 3421.5 511.455C3493.27 511.455 3533.03 478.669 3533.03 432.77C3533.03 377.362 3491.63 361.953 3435.41 338.217L3355.57 303.333C3297.64 280.514 3234.21 238.614 3234.21 155.143C3234.21 66.8186 3313.65 0.001814 3425.64 0.001814C3492.01 -0.442962 3555.93 25.0654 3603.75 71.0807L3558.87 126.554C3521.22 93.051 3472.3 74.9951 3421.9 75.9985C3362.2 75.9985 3322.11 103.604 3322.11 150.028C3322.11 199.206 3371.05 217.173 3420.98 236.516L3497.93 270.416C3569.04 298.087 3622.18 339.528 3622.18 422.344C3622.18 513.356 3545.36 587.583 3416.78 587.583C3339.11 587.998 3264.34 558.123 3208.36 504.308V504.308Z"}}),r("path",{staticStyle:{fill:"var(--btcpay-body-text)"},attrs:{d:"M3762.96 465.557C3762.96 370.741 3849.04 324.055 4062.7 308.186C4059.62 255.73 4031.54 213.896 3956.3 213.896C3905.13 213.896 3854.68 237.304 3813.28 261.5L3780.48 203.994C3827.98 174.684 3898.57 144.062 3971.78 144.062C4088.42 144.062 4148.91 210.945 4148.91 322.678V577.027H4077.73L4070.84 522.144H4068.08C4022.82 557.553 3963.97 587.715 3906.04 587.715C3825.16 587.584 3762.96 540.045 3762.96 465.557ZM4062.7 462.278V363.266C3896.79 375.134 3847.26 408.576 3847.26 459C3847.26 501.489 3885.38 519.063 3930.65 519.063C3975.91 519.063 4018.88 497.883 4062.7 462.278Z"}}),r("path",{staticStyle:{fill:"var(--btcpay-body-text)"},attrs:{d:"M4388.81 409.884V222.941H4272.17V158.813L4392.16 154.289L4403.44 20.2617H4475.02V154.289H4674.64V222.941H4475.02V410.146C4475.02 482.864 4500.73 518.076 4577.29 518.076C4610.27 517.981 4642.96 511.847 4673.73 499.979L4691.24 562.992C4648.39 578.951 4603.07 587.274 4557.35 587.581C4430.86 587.581 4388.81 516.043 4388.81 409.884Z"}}),r("path",{staticStyle:{fill:"var(--btcpay-body-text)"},attrs:{d:"M4818.71 521.815L4857.09 466.014C4909.9 502.948 4972.98 522.353 5037.43 521.487C5102.31 521.487 5133.34 495.259 5133.34 463.85C5133.34 433.95 5115.76 415 5009.22 393.034C4897.7 369.887 4845.21 331.2 4845.21 267.203C4845.21 196.518 4908.85 143.93 5025.95 143.93C5093.26 143.93 5157.55 170.158 5199.93 198.878L5159.45 252.646C5117.79 224.668 5068.79 209.592 5018.6 209.304C4955.62 209.304 4931.28 234.155 4931.28 263.138C4931.28 295.923 4965.07 309.037 5048.12 326.938C5185.89 357.101 5220.33 392.509 5220.33 458.736C5220.33 529.487 5151.71 587.582 5026.8 587.582C4952.47 586.641 4880.07 563.76 4818.71 521.815V521.815Z"}})])]),t._v(" "),r("div",{staticClass:"supporters"},[r("h3",[t._v("Our Supporters")]),t._v(" "),r("p",[t._v("\n The BTCPay Server Project is proudly supported by these entities through the\n "),r("a",{attrs:{href:"https://foundation.btcpayserver.org/",target:"_blank",rel:"noopener noreferrer"}},[t._v("BTCPay Server Foundation")]),t._v(".\n ")]),t._v(" "),r("div",{staticClass:"logos"},[r("a",{attrs:{href:"https://spiral.xyz",target:"_blank",rel:"noopener noreferrer"}},[r("svg",{staticStyle:{padding:"5px"},attrs:{role:"img",width:"100",height:"100"}},[r("use",{attrs:{href:"#supporter-spiral"}})]),t._v("\n Spiral\n ")]),t._v(" "),r("a",{attrs:{href:"https://opensats.org",target:"_blank",rel:"noopener noreferrer"}},[r("svg",{attrs:{role:"img",width:"120",height:"100"}},[r("use",{attrs:{href:"#supporter-opensats"}})]),t._v("\n OpenSats\n ")]),t._v(" "),r("a",{attrs:{href:"https://www.bailliegifford.com",target:"_blank",rel:"noopener noreferrer"}},[r("svg",{attrs:{role:"img",width:"110",height:"100"}},[r("use",{attrs:{href:"#supporter-bailliegifford"}})]),t._v("\n Baillie Gifford\n ")]),t._v(" "),r("a",{attrs:{href:"https://strike.me",target:"_blank",rel:"noopener noreferrer"}},[r("svg",{attrs:{role:"img",width:"55",height:"50"}},[r("use",{attrs:{href:"#supporter-strike"}})]),t._v("\n Strike\n ")]),t._v(" "),r("a",{attrs:{href:"https://hrf.org",target:"_blank",rel:"noopener noreferrer"}},[r("svg",{attrs:{role:"img",width:"110",height:"50"}},[r("use",{attrs:{href:"#supporter-hrf"}})]),t._v("\n HRF\n ")]),t._v(" "),r("a",{attrs:{href:"https://escapetoelsalvador.org/",target:"_blank",rel:"noopener noreferrer"}},[r("svg",{attrs:{role:"img",width:"100",height:"90"}},[r("use",{attrs:{href:"#supporter-esc"}})]),t._v("\n ESC\n ")]),t._v(" "),r("a",{attrs:{href:"https://www.lunanode.com/",target:"_blank",rel:"noopener noreferrer"}},[r("svg",{attrs:{role:"img",width:"100",height:"100"}},[r("use",{attrs:{href:"#supporter-lunanode"}})]),t._v("\n LunaNode\n ")]),t._v(" "),r("a",{attrs:{href:"https://walletofsatoshi.com/",target:"_blank",rel:"noopener noreferrer"}},[r("svg",{attrs:{role:"img",width:"100",height:"100"}},[r("use",{attrs:{href:"#supporter-walletofsatoshi"}})]),t._v("\n Wallet of Satoshi\n ")]),t._v(" "),r("a",{attrs:{href:"https://coincards.com/",target:"_blank",rel:"noopener noreferrer"}},[r("svg",{attrs:{role:"img",width:"130",height:"100"}},[r("use",{attrs:{href:"#supporter-coincards"}})]),t._v("\n Coincards\n ")]),t._v(" "),r("a",{attrs:{href:"https://www.ivpn.net/",target:"_blank",rel:"noopener noreferrer"}},[r("svg",{attrs:{role:"img",width:"100",height:"100"}},[r("use",{attrs:{href:"#supporter-ivpn"}})]),t._v("\n IVPN\n ")])]),t._v(" "),r("p",[t._v("If you'd like to support the project, please visit the "),r("a",{attrs:{href:"https://btcpayserver.org/donate/"}},[t._v("donation page")]),t._v(".")])])])}),[],!1,null,null,null);r.default=l.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[149],{814:function(t,r,a){"use strict";a.r(r);var e=a(10),l=Object(e.a)({},(function(){var t=this,r=t._self._c;return r("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[r("div",{staticClass:"topics"},[r("h3",[t._v("Explore by topic")]),t._v(" "),r("ul",[r("li",[r("RouterLink",{attrs:{to:"/Guide/"}},[t._v("What is BTCPay Server")])],1),t._v(" "),r("li",[r("RouterLink",{attrs:{to:"/UseCase/"}},[t._v("Why BTCPay Server")])],1),t._v(" "),r("li",[r("RouterLink",{attrs:{to:"/TryItOut/"}},[t._v("How to deploy BTCPay Server")])],1),t._v(" "),r("li",[r("RouterLink",{attrs:{to:"/WalletSetup/"}},[t._v("Wallet Setup")])],1),t._v(" "),r("li",[r("RouterLink",{attrs:{to:"/LightningNetwork/"}},[t._v("Lightning Network")])],1),t._v(" "),r("li",[r("RouterLink",{attrs:{to:"/Apps/#point-of-sale-app"}},[t._v("How to setup POS")])],1),t._v(" "),r("li",[r("RouterLink",{attrs:{to:"/Development/GreenFieldExample/"}},[t._v("Greenfield API")])],1),t._v(" "),r("li",[r("RouterLink",{attrs:{to:"/FAQ/"}},[t._v("Frequently Asked Questions"),r("br"),t._v("and Common Issues")])],1),t._v(" "),r("li",[r("RouterLink",{attrs:{to:"/Contribute/"}},[t._v("How to contribute to BTCPay Server")])],1)])]),t._v(" "),r("svg",{attrs:{width:"0",height:"0",xmlns:"http://www.w3.org/2000/svg"}},[r("defs",[r("linearGradient",{attrs:{id:"spiral-gradient",x1:"81.36",y1:"311.35",x2:"541.35",y2:"311.35",gradientUnits:"userSpaceOnUse"}},[r("stop",{attrs:{offset:".18","stop-color":"#00f"}}),r("stop",{attrs:{offset:"1","stop-color":"#f0f"}})],1),t._v(" "),r("radialGradient",{attrs:{id:"acinq-a",cx:"47.833",cy:"51.834",r:"56.832"}},[r("stop",{attrs:{offset:"0","stop-color":"#fff"}}),r("stop",{attrs:{offset:"1","stop-color":"#fff","stop-opacity":"0"}})],1)],1),t._v(" "),r("symbol",{attrs:{id:"supporter-spiral",viewBox:"0 0 629 629"}},[r("path",{attrs:{d:"M326.4 572.09C201.2 572.09 141 503 112.48 445c-28.22-57.53-30.59-114.56-30.79-122.69-4.85-77 41-231.78 249.58-271.2a28.05 28.05 0 0 1 10.41 55.13c-213.12 40.28-204.44 206-204 213 0 .53.06 1.06.07 1.6.15 7.9 5.1 195.16 188.65 195.16 68.34 0 116.6-29.4 143.6-87.37 24.48-52.74 19.29-112.45-13.52-155.83-22.89-30.27-52.46-45-90.38-45-34.46 0-63.47 9.88-86.21 29.37A91.5 91.5 0 0 0 248 322.3c-1.41 25.4 7.14 49.36 24.07 67.49C287.27 406 305 413.9 326.4 413.9c27.46 0 45.52-9 53.66-26.81 8.38-18.3 3.61-38.93-.19-43.33-9.11-10-18.69-13.68-22.48-13-2.53.43-5.78 4.61-8.48 10.92a28 28 0 0 1-51.58-22c14.28-33.44 37.94-42 50.76-44.2 24.78-4.18 52.17 7.3 73.34 30.65s25.51 68.55 10.15 103.22C421.54 432 394.52 470 326.4 470c-36.72 0-69.67-14.49-95.29-41.92-27.47-29.4-41.34-68.08-39.11-108.89a149.1 149.1 0 0 1 51.31-104.6c33.19-28.45 74.48-42.87 122.71-42.87 55.12 0 101.85 23.25 135.12 67.23 45.36 60 52.9 141.71 19.66 213.3-25.35 54.67-79.68 119.84-194.4 119.84Z",fill:"url(#spiral-gradient)"}})]),t._v(" "),r("symbol",{attrs:{id:"supporter-bailliegifford",viewBox:"0 0 252.875 70.249"}},[r("path",{staticStyle:{fill:"var(--btcpay-body-text)","fill-opacity":"1",stroke:"var(--btcpay-body-text)","stroke-opacity":"1"},attrs:{d:"M366.764 291.907h4.554l-5.046 12.789h-4.553zM377.541 302.546h4.675l-.849 2.15h-9.229l5.046-12.789h4.554zM389.988 302.546h4.676l-.849 2.15h-9.229l5.045-12.789h4.554zM403.079 291.907h4.554l-5.046 12.789h-4.553zM418.795 302.487l-.871 2.209h-9.471l5.046-12.789h9.397l-.871 2.209h-4.844l-1.139 2.887h4.457l-.826 2.093h-4.457l-1.338 3.391zM445.115 294.349a6.207 6.207 0 0 0-2.213-.407c-3.344 0-4.898 3.391-5.35 4.535-.682 1.725-1.15 3.469.277 4.147.49.232 1.135.252 1.402.252l1.186-3.004h-1.648l.795-2.015h5.766l-2.4 6.084c-1.66.523-3.16.95-5.268.95-4.748 0-6.602-2.732-5.109-6.511 1.566-3.973 5.77-6.647 10.566-6.647 1.842 0 2.971.33 3.777.62l-1.781 1.996zM453.309 291.907h4.554l-5.045 12.789h-4.554zM458.684 304.696l5.045-12.789h9.398l-.871 2.209h-4.844l-1.269 3.217h4.457l-.871 2.209h-4.458l-2.033 5.154zM472.639 304.696l5.047-12.789h9.398l-.871 2.209h-4.846l-1.269 3.217h4.459l-.873 2.209h-4.457l-2.034 5.154z",transform:"translate(-293.5 -262.775)"}}),r("path",{staticStyle:{fill:"var(--btcpay-body-text)","fill-opacity":"1","fill-rule":"evenodd",stroke:"var(--btcpay-body-text)","stroke-opacity":"1"},attrs:{d:"M335.139 302.643c.557 0 1.187 0 1.747-.252.576-.232 1.106-.717 1.489-1.686.336-.854.189-1.279-.211-1.492-.376-.213-1.006-.213-1.612-.213h-.63l-1.438 3.643h.655zm2.154-5.523c.46 0 .993 0 1.521-.232.496-.213.986-.659 1.33-1.531.283-.717.162-1.085-.181-1.259-.319-.175-.852-.175-1.409-.175h-.63l-1.262 3.198h.631v-.001zm2.832-5.213c1.187 0 2.578.097 3.531.504.954.407 1.47 1.124.966 2.403-.727 1.841-2.749 2.732-4.501 3.12.502.077 1.378.252 2.05.698.647.445 1.06 1.182.578 2.403-.443 1.124-1.742 2.636-4.352 3.294-.995.252-2.107.368-4.481.368h-4.651l5.045-12.79h5.815zM350.689 300.201h2.833l.017-3.605-2.85 3.605zm6.664-8.294.792 12.79h-4.651l-.017-2.597h-4.288l-2.066 2.597h-3.149l10.714-12.79h2.665zM492.998 302.875c.922 0 2.209-.504 3.793-4.515 1.451-3.682 1.238-4.612-.047-4.612-1.283 0-2.363.775-3.955 4.806-1.07 2.713-1.316 4.321.209 4.321zm4.59-11.143c3.561 0 6.08 1.841 4.299 6.356-1.482 3.759-4.936 6.802-9.707 6.802-4.555 0-5.779-2.791-4.295-6.55 1.65-4.185 5.635-6.608 9.703-6.608zM512.328 293.922l-1.469 3.721h.484c1.502 0 2.234-.445 2.793-1.86.582-1.473.25-1.86-1.324-1.86h-.484v-.001zm1.254-2.015c2.398 0 3.312.078 4.168.426.814.33 1.785 1.124 1.166 2.694-.58 1.473-2.047 2.732-4.277 3.353l1.916 6.317h-4.893l-.965-5.29h-.533l-2.088 5.29h-4.408l5.047-12.79h4.867zM528.418 293.961l-3.424 8.682h.387c1.115 0 2.955.368 4.906-4.573 1.619-4.108.264-4.108-1.385-4.108h-.484v-.001zm.811-2.054c2.254 0 4.336 0 5.549 1.163 1.461 1.396.748 3.818.334 4.864-.727 1.841-2.406 4.748-6.227 6.143-1.24.446-2.498.62-5.09.62h-4.166l5.047-12.79h4.553z","clip-rule":"evenodd",transform:"translate(-293.5 -262.775)"}}),r("path",{staticStyle:{fill:"var(--btcpay-body-text)","fill-opacity":"1",stroke:"var(--btcpay-body-text)","stroke-opacity":"1"},attrs:{d:"M294 297.4c0-19.399 57.138-35.125 127.624-35.125 62.064 0 113.781 12.192 125.251 28.35-13.078-12.792-58.92-22.238-113.465-22.238-64.731 0-117.206 13.303-117.206 29.714 0 16.411 52.474 29.715 117.206 29.715 47.799 0 88.914-7.254 107.154-17.656-18.555 13.09-64.812 22.364-118.941 22.364C351.138 332.524 294 316.799 294 297.4z",transform:"translate(-293.5 -262.775)"}})]),t._v(" "),r("symbol",{attrs:{id:"supporter-coincards",viewBox:"0 0 64 32"}},[r("g",{attrs:{fill:"none"}},[r("path",{attrs:{d:"M32.7 5.9c-.2-1-1.3-1.7-2.3-1.4L7.7 9.9c-1 .2-1.7 1.3-1.4 2.3l3.1 12.9c.2 1 1.3 1.7 2.3 1.4l22.7-5.4c1-.2 1.7-1.3 1.4-2.3L32.7 5.9Z",fill:"#EF8022"}}),r("path",{attrs:{d:"M12.6 30.3c-.2.2-.5.3-.7.3l.8.5c.9.6 2.1.4 2.7-.5l3.1-4.4-5.9 4.1ZM2.3 19.5l-1 1.4c-.6.9-.4 2.1.5 2.7L8.1 28l-5.8-8.5ZM12.9 8.1l7.2-5-2.7-1.9c-.9-.6-2.1-.4-2.7.5l-5 7.2 3.2-.8Z",fill:"#F9F185"}}),r("path",{attrs:{d:"M9.7 29.4c.6.9 1.8 1.1 2.7.5l6.7-4.6-7.4 1.8c-1.3.3-2.6-.5-2.9-1.8L6 13.5l-3.3 2.3c-.9.6-1.1 1.8-.5 2.7l7.5 10.9Zm4.5-21.6L25.9 5l-1.3-2c-.6-.9-1.8-1.1-2.7-.5l-7.7 5.3Z",fill:"#FFC214"}}),r("path",{attrs:{d:"M11.9 24.8c-.7 0-1.4-.5-1.7-1.1l-1.5-3.2 1.1 4.6c.2.6.7 1.1 1.4 1.1h.3l17-4.1-16.2 2.7h-.4Z",fill:"#FFC214"}}),r("path",{attrs:{d:"M16 17.5s-1.1 1.2-2.5 1.2c-1.7 0-2.6-1.4-2.6-2.8 0-1.3.9-2.7 2.6-2.7 1.3 0 2.3 1 2.3 1l1.1-1.7s-.6-.7-1.9-1.1v-1.2h-1.1v1h-.6v-1h-1.1v1.1c-2.2.5-3.7 2.4-3.7 4.7 0 2.4 1.5 4.2 3.7 4.7v1.2h1.1v-1h.6V22H15v-1.3c1.4-.4 2.1-1.3 2.1-1.3L16 17.5ZM21 13.7c2.1 0 3.8 1.4 3.8 3.6 0 2.1-1.7 3.5-3.8 3.5-2.1 0-3.8-1.4-3.8-3.5s1.7-3.6 3.8-3.6Zm0 5.2c.8 0 1.5-.6 1.5-1.6s-.7-1.7-1.5-1.7-1.5.6-1.5 1.7c0 1 .7 1.6 1.5 1.6Zm4.3-5h2.3v6.7h-2.3v-6.7Zm0-2.6h2.2v1.8h-2.2v-1.8Zm3.2 2.6h2.2v1c.3-.5 1-1.2 2.1-1.2 1.4 0 2.4.6 2.4 2.5v4.4h-2.3v-4c0-.6-.2-.9-.7-.9-.7 0-1.1.4-1.3 1-.1.3-.1.6-.1.9v3h-2.3v-6.7Z",fill:"#FFF"}}),r("path",{attrs:{d:"M39.3 13.9c1.7 0 2.5 1 2.5 1l-.6.9s-.7-.8-1.8-.8c-1.3 0-2.3 1-2.3 2.4 0 1.3 1 2.4 2.3 2.4 1.2 0 2-.9 2-.9l.5.9s-.9 1.1-2.6 1.1c-2.1 0-3.5-1.5-3.5-3.5-.1-2 1.4-3.5 3.5-3.5Zm6.8 2.6h.3v-.1c0-1.1-.6-1.5-1.5-1.5-1 0-1.8.6-1.8.6l-.5-.9s1-.8 2.5-.8c1.7 0 2.6.9 2.6 2.6v4.2h-1.2v-1.1s-.5 1.3-2.1 1.3c-1.1 0-2.3-.7-2.3-2 0-2.2 2.9-2.3 4-2.3Zm-1.4 3.3c1.1 0 1.8-1.1 1.8-2.1v-.2h-.3c-1 0-2.7.1-2.7 1.3-.1.5.3 1 1.2 1Zm3.8-5.8h1.2v1.7c.3-1 1.1-1.7 2.1-1.7h.3v1.3h-.4c-.8 0-1.6.6-1.9 1.6-.1.4-.2.8-.2 1.2v2.7h-1.3V14h.2Zm6.8-.1c1.5 0 2 1 2 1v-3.5h1.3v9.2h-1.2v-1s-.5 1.2-2.2 1.2c-1.8 0-2.9-1.4-2.9-3.5s1.3-3.4 3-3.4Zm.2 5.8c1 0 1.9-.7 1.9-2.4 0-1.2-.6-2.4-1.9-2.4-1 0-1.9.9-1.9 2.4s.8 2.4 1.9 2.4Zm4.2-.8s.7.8 1.9.8c.5 0 1.1-.3 1.1-.8 0-1.2-3.4-1-3.4-3.1 0-1.2 1.1-1.9 2.4-1.9 1.5 0 2.1.7 2.1.7l-.5 1s-.6-.6-1.6-.6c-.5 0-1.1.2-1.1.8 0 1.2 3.4.9 3.4 3.1 0 1.1-.9 1.9-2.4 1.9-1.6 0-2.5-1-2.5-1l.6-.9Z",fill:"#EF8022"}})])]),t._v(" "),r("symbol",{attrs:{id:"supporter-acinq",viewBox:"0 0 103 107"}},[r("circle",{attrs:{fill:"url(#acinq-a)",cx:"47.833",cy:"51.833",r:"56.832"}}),r("g",[r("g",{attrs:{fill:"none","stroke-width":"6","stroke-linejoin":"round"}},[r("path",{attrs:{stroke:"#47BF94",d:"M4.493 79.67c-6.778-11.574 21.882-35.135 41.646-39.636 16.598-3.78 55.176 4.066 53.752 17.433"}}),r("path",{attrs:{stroke:"#359F7E",d:"M10.125 18.133c8.624-9.988 41.797 13.701 51.001 30.018 9.723 17.237 12.87 55.271-1.103 55.351"}}),r("path",{attrs:{stroke:"#49DAAA",d:"M69.826 4.107c12.025 5.964 3.838 38.632-11.184 57.28C47.846 74.79 11.659 91.904 4.493 79.67"}}),r("path",{attrs:{stroke:"#49DAAA",d:"M99.891 57.467C98.471 70.799 62.529 72.9 43.83 64.781c-17.92-7.783-42.47-36.5-33.706-46.648"}}),r("path",{attrs:{stroke:"#AAF0D3",d:"M60.023 103.502c-14.291.08-24.609-29.721-23.918-51.916.758-24.377 20.678-53.948 33.721-47.479"}})])])]),t._v(" "),r("symbol",{attrs:{id:"supporter-lunanode",viewBox:"0 0 194.219 193.977"}},[r("path",{staticStyle:{fill:"#004581","fill-opacity":"1","fill-rule":"evenodd",stroke:"none"},attrs:{d:"M3185.89 2995.8c-1.77 21.49-2.76 43.2-2.76 65.16 0 411.03 319.09 747.36 723.13 774.95l-618.54-641.7c-54.62-56.68-88.55-126.08-101.83-198.41M3960 2284.09c-270.37 0-508.4 138.15-647.57 347.65l23.25-22.42c76.82-74.06 176.93-109.95 276.2-108.13 99 1.77 197.53 41.2 271.5 117.59l-177.95 171.52c-26.66-27.31-62.22-41.38-98.02-42.14-36.12-.65-72.43 12.41-100.16 39.15l-37.98 36.6c-27.69 26.66-42.04 62.45-42.7 98.57-.65 36.07 12.36 72.48 39.11 100.21l745.68 773.56c305.71-104.45 525.52-394.17 525.52-735.29 0-29.89-1.73-59.34-5.04-88.32-19.44 54.57-51.41 105.56-95.79 148.35l-37.93 36.58c-76.86 74.07-176.93 110.05-276.16 108.18-99.32-1.77-198.13-41.38-272.19-118.25l-290.74-301.59 177.95-171.53 290.74 301.61c26.71 27.73 62.64 42.04 98.72 42.74 36.12.69 72.38-12.35 100.16-39.1l37.89-36.59c27.69-26.66 42.09-62.45 42.74-98.58.61-36.03-12.4-72.48-39.1-100.21l-440.73-457.23c-22.23-1.9-44.69-2.93-67.4-2.93",transform:"matrix(.125 0 0 -.125 -397.891 479.489)"}}),r("path",{staticStyle:{fill:"#3384b9","fill-opacity":"1","fill-rule":"evenodd",stroke:"none"},attrs:{d:"M4376.22 2292.8h360.66v433.41c-17.35-55.88-47.59-108.64-90.81-153.48l-269.85-279.93",transform:"matrix(.125 0 0 -.125 -397.891 479.489)"}})]),t._v(" "),r("symbol",{attrs:{id:"supporter-walletofsatoshi",viewBox:"0 0 313.1 76.32"}},[r("path",{attrs:{d:"M110.47 44.8H121c.84 0 1.22-.64.9-1.48l-17.6-42A2 2 0 0 0 102.22 0H87.63a2 2 0 0 0-2 1.34L66 48.11c-.32.84.06 1.48.83 1.48h13.7a1.42 1.42 0 0 1 1.32 1.93l-9.7 24.8 30.55-32.63A1 1 0 0 0 102 42H84.73a1.42 1.42 0 0 1-1.32-2l5.06-12.91 6.86-17.47 6.78 17.51h-7.54a1.42 1.42 0 0 0-1.32.9l-2.83 7.22a1.42 1.42 0 0 0 1.32 1.93H105a1.42 1.42 0 0 1 1.33.91l2.08 5.36a1.92 1.92 0 0 0 2.06 1.35Zm62.65 0h37.42a1.3 1.3 0 0 0 1.46-1.41V35.9a1.3 1.3 0 0 0-1.47-1.41h-26V1.41A1.35 1.35 0 0 0 183 0h-9.92a1.3 1.3 0 0 0-1.47 1.41v42a1.3 1.3 0 0 0 1.51 1.39Zm45.36 0h42a1.3 1.3 0 0 0 1.52-1.41V35.9a1.31 1.31 0 0 0-1.47-1.41h-30.59v-7.36h25.59a1.33 1.33 0 0 0 1.48-1.4v-7a1.33 1.33 0 0 0-1.48-1.41h-25.59v-7h30.59A1.3 1.3 0 0 0 262 8.89V1.41A1.3 1.3 0 0 0 260.53 0h-42A1.3 1.3 0 0 0 217 1.41v42a1.3 1.3 0 0 0 1.48 1.39ZM71.79 0H61.61a1.71 1.71 0 0 0-1.85 1.41L52.08 34.3 44.91 1.41A1.65 1.65 0 0 0 43.12 0H30.38a1.71 1.71 0 0 0-1.85 1.41L21.36 34.3 13.68 1.41A1.65 1.65 0 0 0 11.89 0H1.14C.24 0-.14.51.05 1.41l10.88 42a1.68 1.68 0 0 0 1.79 1.41H28.4a1.65 1.65 0 0 0 1.79-1.41l6.27-28.31 6.34 28.29a1.65 1.65 0 0 0 1.79 1.41H60.2a1.66 1.66 0 0 0 1.8-1.41l10.87-42C73.07.51 72.68 0 71.79 0Zm239.84 0h-43.52a1.3 1.3 0 0 0-1.47 1.41v7.48a1.3 1.3 0 0 0 1.47 1.41h15.29v33.09a1.3 1.3 0 0 0 1.48 1.41h10a1.33 1.33 0 0 0 1.47-1.41V10.3h15.3a1.3 1.3 0 0 0 1.47-1.41V1.41A1.3 1.3 0 0 0 311.63 0ZM127.76 44.8h37.42a1.3 1.3 0 0 0 1.47-1.41V35.9a1.3 1.3 0 0 0-1.47-1.41h-26V1.41a1.35 1.35 0 0 0-1.5-1.41h-9.92a1.3 1.3 0 0 0-1.47 1.41v42a1.3 1.3 0 0 0 1.47 1.39Zm-3.84 9.6h-11.53c-3.13 0-4.53 1.31-4.53 4.36v10.37c0 3.05 1.4 4.36 4.53 4.36h11.53c3.16 0 4.51-1.31 4.51-4.36V58.76c0-3.05-1.35-4.36-4.51-4.36Zm-1 12.95c0 1.48-.29 1.75-2.07 1.75h-5.51c-1.76 0-2.08-.27-2.08-1.75v-6.81c0-1.47.32-1.75 2.08-1.75h5.51c1.78 0 2.07.28 2.07 1.75Zm51.87-5.59h-8.75c-.89 0-1.16-.27-1.16-.95v-1.06c0-.68.27-1 1.16-1h6.7c.65 0 .89.28.89.85v.16a.55.55 0 0 0 .62.6h4a.55.55 0 0 0 .62-.6v-1.08c0-3.21-1.11-4.28-4.4-4.28H164c-3.19 0-4.51 1.31-4.51 4.36v2.84c0 3.06 1.32 4.36 4.51 4.36h8.74c.9 0 1.17.28 1.17 1v1.23c0 .68-.27.95-1.17.95h-7.34c-.62 0-.86-.27-.86-.85v-.16a.56.56 0 0 0-.62-.6h-4a.55.55 0 0 0-.62.6v1.12c0 3.22 1.08 4.28 4.4 4.28h11.2c3.19 0 4.51-1.31 4.51-4.36v-3c-.06-3.1-1.41-4.41-4.57-4.41Zm85.43 0h-8.75c-.89 0-1.16-.27-1.16-.95v-1.06c0-.68.27-1 1.16-1h6.7c.64 0 .89.28.89.85v.16a.55.55 0 0 0 .62.6h4a.55.55 0 0 0 .62-.6v-1.08c0-3.21-1.11-4.28-4.4-4.28h-10.48c-3.19 0-4.51 1.31-4.51 4.36v2.84c0 3.06 1.32 4.36 4.51 4.36h8.74c.89 0 1.16.28 1.16 1v1.23c0 .68-.27.95-1.16.95h-7.34c-.62 0-.86-.27-.86-.85v-.16a.57.57 0 0 0-.62-.6h-4.05a.55.55 0 0 0-.62.6v1.12c0 3.22 1.08 4.28 4.4 4.28h11.2c3.18 0 4.51-1.31 4.51-4.36v-3c0-3.1-1.33-4.41-4.51-4.41Zm26.65-7.36h-4.21a.56.56 0 0 0-.63.6v6.66h-9.2V55a.57.57 0 0 0-.65-.6H268a.55.55 0 0 0-.62.6v17.89a.55.55 0 0 0 .62.6h4.18a.57.57 0 0 0 .65-.6v-6.84h9.2v6.84a.56.56 0 0 0 .63.6h4.21a.55.55 0 0 0 .62-.6V55a.55.55 0 0 0-.57-.6Zm-137.62 0h-17.07a.55.55 0 0 0-.62.6v17.89a.55.55 0 0 0 .62.6h4.19a.58.58 0 0 0 .65-.6v-6.52h10.15a.57.57 0 0 0 .64-.6v-3.19a.57.57 0 0 0-.64-.6H137v-3.19h12.3a.55.55 0 0 0 .62-.6V55a.55.55 0 0 0-.62-.6Zm146.47 0h-4.18a.55.55 0 0 0-.62.6v17.89a.55.55 0 0 0 .62.6h4.18a.57.57 0 0 0 .65-.6V55a.57.57 0 0 0-.6-.6Zm-100.28.6a.83.83 0 0 0-.86-.57h-6.16a.83.83 0 0 0-.89.57l-7.42 17.89c-.14.36 0 .63.38.63h4.45a.8.8 0 0 0 .86-.57l1-2.68h9.1l1 2.68a.8.8 0 0 0 .87.57h4.69c.33 0 .49-.27.35-.63Zm-7 11 2.89-7.52 2.92 7.52Zm30.9-11.6H201a.55.55 0 0 0-.62.6v3.19a.55.55 0 0 0 .62.6h6.45v14.1a.55.55 0 0 0 .62.6h4.21a.56.56 0 0 0 .62-.6v-14.1h6.46a.55.55 0 0 0 .62-.6V55a.55.55 0 0 0-.64-.6Zm18.46 0h-11.52c-3.13 0-4.54 1.31-4.54 4.36v10.37c0 3.05 1.41 4.36 4.54 4.36h11.52c3.16 0 4.51-1.31 4.51-4.36V58.76c0-3.05-1.31-4.36-4.51-4.36Zm-.94 12.95c0 1.48-.3 1.75-2.08 1.75h-5.51c-1.75 0-2.07-.27-2.07-1.75v-6.81c0-1.47.32-1.75 2.07-1.75h5.51c1.78 0 2.08.28 2.08 1.75Z",fill:"#fad228",stroke:"#1e2127","stroke-width":"2"}})]),t._v(" "),r("symbol",{attrs:{id:"supporter-nomics",viewBox:"0 0 600 600"}},[r("path",{attrs:{d:"M273.56 133A136.81 136.81 0 0 0 0 136.86v326.28a136.8 136.8 0 0 0 233.57 96.75L326.44 467A136.81 136.81 0 0 0 600 463.14V136.86a136.8 136.8 0 0 0-233.57-96.75L273.56 133",fill:"#a0f"}}),r("ellipse",{attrs:{cx:"302.18",cy:"300.04",rx:"136.81",ry:"136.86",fill:"#fff"}})]),t._v(" "),r("symbol",{attrs:{id:"supporter-ivpn",viewBox:"0 0 84 29"}},[r("path",{attrs:{"fill-rule":"evenodd","clip-rule":"evenodd",d:"M6.75 0h6.03c.07 0 .15.03.2.1.04.05.06.13.05.2L8.6 27.43a.26.26 0 0 1-.24.22l-6.63.38H1.7a.25.25 0 0 1-.19-.08.26.26 0 0 1-.06-.22L5.2 5.05C5.12 1.67 1 .85.49.73-.06.59 0 0 0 0h6.75Zm32.32.12a.25.25 0 0 0-.22-.12h-6.5c-.1 0-.18.05-.23.14l-8.98 17.4L20.08.2a.25.25 0 0 0-.24-.21h-6.55a.25.25 0 0 0-.2.1.26.26 0 0 0-.05.2l4.85 26.05a.25.25 0 0 0 .26.2l7.57-.43c.08 0 .16-.06.2-.14L39.08.38a.26.26 0 0 0-.01-.26Zm20.27 5.5a6.8 6.8 0 0 0-.53-2.08c-.27-.6-.61-1.1-1.01-1.5-.4-.41-.8-.75-1.23-1A8.23 8.23 0 0 0 52.9 0H40.47a.25.25 0 0 0-.25.2l-4.01 24.6c-.01.07.01.14.06.2.05.05.11.08.18.08h.02l6.25-.36c.11 0 .2-.1.22-.21l.75-4.63h6.08c1.39-.09 2.7-.43 3.89-1.03a9.75 9.75 0 0 0 2.99-2.46 9.9 9.9 0 0 0 2-4.76l.56-3.3c.17-1.02.21-1.93.13-2.71Zm-7.21 5.87a2.53 2.53 0 0 1-1.1 1.66c-.27.18-.64.27-1.1.27H44.7l1.1-7h5.3c.45 0 .78.09.97.27.22.2.38.41.47.65.1.27.13.6.1.95l-.52 3.2ZM83.75 0h-6.32c-.12 0-.23.1-.25.22l-2.25 14.34L70.04.17a.25.25 0 0 0-.23-.17H63.5c-.12 0-.23.1-.25.22l-3.86 24.56c-.01.07.01.16.06.22.05.05.12.08.19.08l6.43-.39c.12 0 .21-.1.23-.22l1.62-10.36 3.4 10.08c.04.1.14.17.25.17l8.58-.52c.11 0 .2-.1.23-.22L84 .3a.27.27 0 0 0-.06-.22.24.24 0 0 0-.19-.09Z",fill:"#F34"}})]),t._v(" "),r("symbol",{attrs:{id:"supporter-strike",viewBox:"0 0 155 120"}},[r("path",{staticStyle:{fill:"var(--btcpay-body-text)"},attrs:{"fill-rule":"evenodd","clip-rule":"evenodd",d:"M7.06565 43.2477C1.90963 41.2685 -0.665684 35.4843 1.31353 30.3283C3.29274 25.1722 9.07699 22.5969 14.233 24.5761L51.4526 38.8634C51.4937 38.8798 51.535 38.896 51.5765 38.9119L70.2481 46.0792C75.4041 48.0584 81.1883 45.4831 83.1675 40.3271C85.1468 35.1711 82.5714 29.3868 77.4154 27.4076L77.4132 27.4068C77.4139 27.4064 77.4145 27.406 77.4151 27.4056L58.7436 20.2383C53.5876 18.2591 51.0123 12.4749 52.9915 7.31885C54.9707 2.16283 60.755 -0.412485 65.911 1.56673L120.828 22.6473C120.959 22.6977 121.089 22.7506 121.217 22.8059C121.453 22.8928 121.69 22.9815 121.926 23.0721C147.706 32.9681 160.583 61.8894 150.686 87.6695C140.79 113.45 111.869 126.326 86.089 116.43C85.5927 116.24 85.1011 116.042 84.6144 115.838C84.3783 115.766 84.1431 115.686 83.9091 115.596L30.0742 94.9308C24.9182 92.9516 22.3428 87.1673 24.3221 82.0113C26.3013 76.8553 32.0855 74.2799 37.2415 76.2592L55.9106 83.4256C55.9103 83.4242 55.9099 83.4229 55.9095 83.4215L55.9133 83.423C61.0694 85.4022 66.8536 82.8269 68.8328 77.6709C70.812 72.5148 68.2367 66.7306 63.0807 64.7514L54.6786 61.5261C54.6787 61.5257 54.6788 61.5252 54.6789 61.5247L7.06565 43.2477Z"}})]),t._v(" "),r("symbol",{attrs:{id:"supporter-hrf",viewBox:"0 0 3000 987.6"}},[r("path",{attrs:{d:"M1137.09 103.9v773.45h-51.44V515.96h-953.6v361.38H80.62V103.9h51.44v361.2h953.6V103.9h51.43zm-102.77 0h-51.44v258.19H234.94V103.9H183.5v309.05h850.82V103.9zm-696.29 0h-50.87v205.84h50.87V103.9zm593.05 0h-51.44v205.84h51.44V103.9zM183.5 877.34h51.44V619.16h747.94v258.19h51.44V567.72H183.5v309.62zm695.72 0h51.44V670.93h-51.44v206.41zm-592.47 0h51.44V670.93h-51.44v206.41z",fill:"#e12991"}}),r("path",{staticStyle:{fill:"var(--btcpay-body-text)"},attrs:{d:"M1422.94 103.88V331.3h-44.51v-94.22h-92.2v94.22h-44.83V103.88h44.83v90.32h92.2v-90.32h44.51zM1605.81 168.85V331.3h-41.91v-18.19c-9.75 14.62-26.64 22.74-48.41 22.74-34.44 0-61.4-24.04-61.4-67.25v-99.74H1496v94.54c0 22.1 13.32 33.47 32.16 33.47 20.47 0 35.74-12.02 35.74-40.29v-87.72h41.91zM1885.19 231.23V331.3h-41.91v-97.14c0-19.17-9.75-30.86-27.29-30.86-18.52 0-30.22 12.35-30.22 36.71v91.29h-41.91v-97.14c0-19.17-9.75-30.86-27.29-30.86-17.87 0-30.54 12.35-30.54 36.71v91.29h-41.91V168.85h41.91v17.22c9.1-13.64 24.37-21.77 45.16-21.77 20.14 0 35.09 8.45 44.18 23.39 10.07-14.62 26.32-23.39 48.41-23.39 37.04.01 61.41 26.32 61.41 66.93zM2086.24 168.85V331.3h-41.91v-19.17c-11.7 14.62-29.24 23.72-52.96 23.72-43.21 0-78.95-37.36-78.95-85.77s35.74-85.77 78.95-85.77c23.72 0 41.26 9.1 52.96 23.72v-19.17h41.91zm-41.91 81.23c0-27.29-19.17-45.81-45.16-45.81-25.66 0-44.83 18.52-44.83 45.81 0 27.29 19.17 45.81 44.83 45.81 25.99 0 45.16-18.52 45.16-45.81zM2275.93 231.56v99.74h-41.91v-94.54c0-22.09-13.32-33.46-32.16-33.46-20.47 0-35.74 12.02-35.74 40.29v87.72h-41.91V168.85h41.91v18.19c9.75-14.62 26.64-22.74 48.41-22.74 34.44.01 61.4 24.05 61.4 67.26zM1316.47 525.36h-30.25v78.95h-44.83V376.89h94.84c41.91 0 75.7 33.79 75.7 75.37 0 28.59-17.87 54.26-43.86 66.28l50.36 85.77h-48.41l-53.55-78.95zm-30.25-39.31h50c16.89 0 30.86-14.95 30.86-33.79s-13.97-33.46-30.86-33.46h-50v67.25zM1437.88 396.71c0-13.97 15.57-25.99 29.54-25.99 14.29 0 22.12 12.02 22.12 25.99s-11.7 25.67-25.99 25.67c-13.97 0-25.67-11.7-25.67-25.67zm4.88 45.16h41.91v162.45h-41.91V441.87zM1681.86 441.87v154.65c0 53.28-41.91 77.33-84.8 77.33-34.77 0-62.7-13.32-77-39.64l35.74-20.47c6.82 12.67 17.54 22.74 42.56 22.74 26.31 0 42.56-14.29 42.56-39.96v-17.54c-11.37 15.27-28.92 24.69-51.98 24.69-46.14 0-80.9-37.36-80.9-83.17 0-45.48 34.76-83.17 80.9-83.17 23.07 0 40.61 9.42 51.98 24.69v-20.14h40.94zm-40.94 78.62c0-25.67-19.17-44.18-45.49-44.18-26.31 0-45.48 18.52-45.48 44.18 0 25.99 19.17 44.51 45.48 44.51 26.32 0 45.49-18.52 45.49-44.51zM1871.55 504.57v99.74h-41.91v-94.54c0-22.09-13.32-33.46-32.16-33.46-20.47 0-35.74 12.02-35.74 40.29v87.72h-41.91V376.89h41.91v83.17c9.75-14.62 26.64-22.74 48.41-22.74 34.44 0 61.4 24.04 61.4 67.25zM1963.46 482.15v67.58c0 17.54 12.67 17.87 36.71 16.57v38.01c-58.81 6.5-78.62-10.72-78.62-54.58v-67.58h-28.27v-40.29h28.27v-32.81l41.91-12.67v45.48h36.71v40.29h-36.71zM2148.63 556.88c0 35.09-30.54 51.98-65.31 51.98-32.49 0-56.53-13.64-68.22-38.66l36.39-20.47c4.55 13.32 15.6 21.12 31.84 21.12 13.32 0 22.42-4.55 22.42-13.97 0-23.72-83.82-10.72-83.82-67.9 0-33.14 28.27-51.66 61.73-51.66 26.32 0 49.06 12.02 61.73 34.44l-35.74 19.49c-4.88-10.4-13.97-16.57-25.99-16.57-10.4 0-18.84 4.55-18.84 13.32-.01 24.04 83.81 9.1 83.81 68.88zM1286.22 692.79v53.93h96.11v42.89h-96.11v87.72h-44.83V649.9h143.54v42.88h-98.71zM1400.82 796.1c0-48.41 38.01-85.77 85.77-85.77s86.1 37.36 86.1 85.77-38.34 85.77-86.1 85.77c-47.76 0-85.77-37.36-85.77-85.77zm129.96 0c0-26.31-19.17-44.83-44.19-44.83-24.69 0-43.86 18.52-43.86 44.83 0 26.32 19.17 44.83 43.86 44.83 25.02.01 44.19-18.51 44.19-44.83zM1744.84 714.88v162.45h-41.91v-18.19c-9.75 14.62-26.64 22.74-48.41 22.74-34.44 0-61.4-24.04-61.4-67.25v-99.74h41.91v94.54c0 22.1 13.32 33.47 32.16 33.47 20.47 0 35.74-12.02 35.74-40.29v-87.72h41.91zM1934.86 777.58v99.74h-41.91v-94.54c0-22.09-13.32-33.46-32.16-33.46-20.47 0-35.74 12.02-35.74 40.29v87.72h-41.91V714.88h41.91v18.19c9.75-14.62 26.64-22.74 48.41-22.74 34.44 0 61.4 24.04 61.4 67.25zM2135.61 649.9v227.42h-41.91v-19.17c-11.7 14.95-28.92 23.72-52.63 23.72-43.54 0-79.27-37.36-79.27-85.77s35.74-85.77 79.27-85.77c23.72 0 40.94 8.77 52.63 23.72V649.9h41.91zm-41.91 146.2c0-27.29-19.17-45.81-44.84-45.81-25.99 0-45.16 18.52-45.16 45.81 0 27.29 19.17 45.81 45.16 45.81 25.67.01 44.84-18.51 44.84-45.81zM2337.35 714.88v162.45h-41.91v-19.17c-11.7 14.62-29.24 23.72-52.96 23.72-43.21 0-78.95-37.36-78.95-85.77s35.74-85.77 78.95-85.77c23.72 0 41.26 9.1 52.96 23.72v-19.17h41.91zm-41.91 81.22c0-27.29-19.17-45.81-45.16-45.81-25.66 0-44.83 18.52-44.83 45.81 0 27.29 19.17 45.81 44.83 45.81 25.99.01 45.16-18.51 45.16-45.81zM2433.46 755.17v67.58c0 17.54 12.67 17.87 36.71 16.57v38.01c-58.81 6.5-78.62-10.72-78.62-54.58v-67.58h-28.26v-40.29h28.26v-32.81l41.91-12.67v45.48h36.71v40.29h-36.71zM2494.84 669.72c0-13.97 11.7-25.99 25.67-25.99 14.29 0 25.99 12.02 25.99 25.99s-11.7 25.66-25.99 25.66c-13.97.01-25.67-11.69-25.67-25.66zm4.87 45.16h41.91v162.45h-41.91V714.88zM2565 796.1c0-48.41 38.01-85.77 85.77-85.77s86.1 37.36 86.1 85.77-38.34 85.77-86.1 85.77c-47.76 0-85.77-37.36-85.77-85.77zm129.96 0c0-26.31-19.17-44.83-44.19-44.83-24.69 0-43.86 18.52-43.86 44.83 0 26.32 19.17 44.83 43.86 44.83 25.02.01 44.19-18.51 44.19-44.83zM2911.62 777.58v99.74h-41.91v-94.54c0-22.09-13.32-33.46-32.16-33.46-20.47 0-35.74 12.02-35.74 40.29v87.72h-41.91V714.88h41.91v18.19c9.75-14.62 26.64-22.74 48.41-22.74 34.44 0 61.4 24.04 61.4 67.25z"}})]),t._v(" "),r("symbol",{attrs:{id:"supporter-esc",viewBox:"0 0 74.222 74.044"}},[r("g",{staticStyle:{fill:"var(--btcpay-body-text)"}},[r("path",{staticStyle:{"stroke-width":"1.91694"},attrs:{d:"M625.227 7403.82c-287.542-92.014-494.572-337.383-538.662-640.26-21.087-157.19-21.087-5869.689 0-6026.878 46.007-308.628 260.704-557.832 555.914-646.01C736.41 63.833 1046.955 60 3769.018 60s3032.608 3.834 3126.539 30.671c295.21 88.18 509.907 337.383 555.914 646.01 21.086 157.19 21.086 5869.69 0 6026.879-46.007 308.628-260.705 557.83-555.914 646.01-93.93 26.838-404.476 30.672-3134.207 28.755-2842.83 0-3036.442-1.917-3136.123-34.505zm6208.987-299.044c120.768-42.173 187.861-97.764 251.12-207.03l57.509-99.681V702.177l-57.509-99.681c-63.259-109.266-130.352-164.858-251.12-207.03-120.767-44.09-6009.625-44.09-6130.393 0-120.767 42.172-187.86 97.764-251.12 207.03l-57.508 99.68v6095.889l57.509 99.68c61.342 105.433 130.352 164.858 243.452 207.031 113.1 40.256 6021.127 42.173 6138.06 0z",transform:"matrix(.0098 0 0 .0098 .182 .285)"}}),r("path",{staticStyle:{"stroke-width":"1.91694"},attrs:{d:"M1934.5 4967.381c-272.206-55.591-492.654-249.203-582.75-511.824-32.59-97.764-36.423-162.94-36.423-705.436 0-542.496 3.834-607.672 36.422-705.436 74.761-216.615 241.535-391.057 456.233-475.403 103.515-42.173 139.937-44.09 529.077-46.007h419.811l46.007 53.675c59.425 69.01 59.425 136.103-1.917 195.528-46.007 47.924-49.84 47.924-398.725 47.924-433.23 0-513.741 19.17-646.01 151.439-113.1 113.1-134.186 180.193-134.186 425.562v185.944l59.425 11.501c32.588 5.751 291.376 11.502 575.084 11.502h513.741l38.339 49.84c51.758 65.177 51.758 122.685 0 187.861l-38.339 49.84h-513.741c-283.708 0-542.496 5.752-577.001 11.502l-61.342 13.419 5.75 224.283c7.668 207.03 11.502 230.033 61.343 302.877 69.01 107.35 185.943 187.86 302.877 212.781 51.758 11.502 247.286 21.087 431.313 21.087 329.715 0 335.465 0 381.472 47.923 61.342 59.425 61.342 126.519 1.917 195.529l-46.007 53.674-371.887 3.834c-203.196 1.917-406.393-5.75-450.482-13.419zM3677.004 2553.947c-208.947 55.59-368.053 189.777-461.984 389.14-42.172 92.013-49.84 134.186-49.84 279.874 0 157.19 5.75 185.943 63.259 300.96 70.927 143.771 184.027 254.954 325.88 323.964 67.094 32.588 145.689 46.007 312.463 57.508 251.12 17.253 289.459 28.755 379.555 105.432 228.117 191.695 147.605 565.5-139.937 649.845-70.927 21.086-197.445 28.754-481.153 28.754-379.555 0-387.223 0-427.48 44.09-57.507 61.342-55.59 147.605 7.669 207.03 49.84 46.007 49.84 46.007 492.655 46.007 412.143-1.917 452.4-3.834 550.163-44.09 153.356-61.342 293.293-191.694 368.054-345.05 57.508-115.017 63.26-143.771 63.26-300.96 0-157.19-5.752-185.944-63.26-300.961-69.01-143.771-184.027-254.954-325.88-323.964-69.011-32.588-141.855-46.007-312.463-57.508-164.857-11.502-243.452-24.92-300.96-53.675-237.702-120.767-283.709-415.977-93.931-611.506 97.764-101.598 195.529-118.85 638.343-118.85h389.14l38.339-49.84c59.425-74.762 51.758-147.606-19.17-207.031l-59.425-49.84-394.89 1.916c-279.875 0-427.48 9.585-498.407 28.755zM5630.372 4965.465c-299.043-57.509-546.33-297.127-613.423-594.254-26.837-109.266-26.837-1132.915 0-1242.18 69.01-302.878 314.38-538.663 621.091-594.254 174.442-32.588 745.692-26.837 812.785 7.668 84.346 42.173 107.35 153.356 47.924 230.033-26.837 36.422-57.509 38.34-435.147 47.924-392.974 9.585-410.226 13.419-504.157 61.342-113.1 59.426-193.611 157.19-230.033 279.874-38.34 124.602-38.34 1054.32 0 1178.922 36.422 120.768 122.684 226.2 235.784 281.791 88.18 46.007 111.183 47.924 484.987 53.675 368.054 5.75 394.891 9.584 437.064 47.923 23.003 21.087 42.173 61.343 42.173 92.014 0 153.355-49.84 170.608-473.486 168.691-187.86-1.917-379.555-9.585-425.562-19.17z",transform:"matrix(.0098 0 0 .0098 .182 .285)"}})])]),t._v(" "),r("symbol",{attrs:{id:"supporter-opensats",viewBox:"0 0 5220 720"}},[r("path",{attrs:{d:"M0 435.197L229.609 291.597V288.121L0 144.259V29.0508L334.901 245.894V333.824L0 550.798V435.197Z",fill:"#FF3300"}}),r("path",{attrs:{d:"M486.969 623.844H902.627V719.643H486.969V623.844Z",fill:"#FF3300"}}),r("path",{attrs:{d:"M993.879 291.2C993.879 106.422 1084.61 0 1214.37 0C1344.13 0 1434.86 106.422 1434.86 291.2C1434.86 479.061 1344.13 587.581 1214.37 587.581C1084.61 587.581 993.879 479.061 993.879 291.2ZM1345.12 291.2C1345.12 155.01 1293.16 75.9967 1214.37 75.9967C1135.58 75.9967 1083.62 155.01 1083.62 291.2C1083.62 430.473 1135.58 511.584 1214.37 511.584C1293.16 511.584 1344.85 430.473 1344.85 291.2H1345.12Z",fill:"#FF3300"}}),r("path",{attrs:{d:"M1593.29 154.29H1663.81L1670.37 205.37H1673.13C1711.31 169.634 1764.71 144.258 1814.44 144.258C1925.96 144.258 1988.02 228.713 1988.02 359.855C1988.02 504.111 1897.95 587.911 1797.77 587.911C1759.13 587.911 1713.54 568.829 1677.39 535.454H1675.29L1679.43 612.237V749.936H1593.29V154.29ZM1899.65 359.855C1899.65 271.269 1867.44 215.599 1791.21 215.599C1756.57 215.599 1717.93 232.713 1679.69 272.121V472.112C1714.79 503.914 1754.61 515.455 1781.57 515.455C1848.75 515.717 1899.65 459.851 1899.65 359.855Z",fill:"#FF3300"}}),r("path",{attrs:{d:"M2118.96 365.035C2118.96 227.336 2222.75 143.93 2335.98 143.93C2460.16 143.93 2530.82 225.434 2530.82 343.527C2530.67 359.209 2529.35 374.858 2526.88 390.345H2178.73V327.2H2473.22L2454.52 348.249C2454.52 256.449 2410.17 210.55 2338.47 210.55C2264.41 210.55 2203.66 265.17 2203.66 364.904C2203.66 468.833 2268.8 520.044 2359.79 520.044C2407.09 520.044 2445.08 505.75 2483.39 482.8L2513.56 537.29C2464.7 569.886 2407.32 587.378 2348.57 587.582C2220.39 587.582 2118.96 505.947 2118.96 365.035Z",fill:"#FF3300"}}),r("path",{attrs:{d:"M2658.41 154.29H2729.07L2735.63 221.697H2739.04C2781.55 178.289 2829.83 144.258 2895.17 144.258C2994.1 144.258 3039.17 205.042 3039.17 315.201V577.026H2952.9V326.152C2952.9 252.319 2928.11 218.222 2865.39 218.222C2819.47 218.222 2788.31 240.844 2744.68 285.563V577.026H2658.41V154.29Z",fill:"#FF3300"}}),r("path",{staticStyle:{fill:"var(--btcpay-body-text)"},attrs:{d:"M3208.36 504.308L3259.46 444.376C3303 486.486 3360.93 510.468 3421.5 511.455C3493.27 511.455 3533.03 478.669 3533.03 432.77C3533.03 377.362 3491.63 361.953 3435.41 338.217L3355.57 303.333C3297.64 280.514 3234.21 238.614 3234.21 155.143C3234.21 66.8186 3313.65 0.001814 3425.64 0.001814C3492.01 -0.442962 3555.93 25.0654 3603.75 71.0807L3558.87 126.554C3521.22 93.051 3472.3 74.9951 3421.9 75.9985C3362.2 75.9985 3322.11 103.604 3322.11 150.028C3322.11 199.206 3371.05 217.173 3420.98 236.516L3497.93 270.416C3569.04 298.087 3622.18 339.528 3622.18 422.344C3622.18 513.356 3545.36 587.583 3416.78 587.583C3339.11 587.998 3264.34 558.123 3208.36 504.308V504.308Z"}}),r("path",{staticStyle:{fill:"var(--btcpay-body-text)"},attrs:{d:"M3762.96 465.557C3762.96 370.741 3849.04 324.055 4062.7 308.186C4059.62 255.73 4031.54 213.896 3956.3 213.896C3905.13 213.896 3854.68 237.304 3813.28 261.5L3780.48 203.994C3827.98 174.684 3898.57 144.062 3971.78 144.062C4088.42 144.062 4148.91 210.945 4148.91 322.678V577.027H4077.73L4070.84 522.144H4068.08C4022.82 557.553 3963.97 587.715 3906.04 587.715C3825.16 587.584 3762.96 540.045 3762.96 465.557ZM4062.7 462.278V363.266C3896.79 375.134 3847.26 408.576 3847.26 459C3847.26 501.489 3885.38 519.063 3930.65 519.063C3975.91 519.063 4018.88 497.883 4062.7 462.278Z"}}),r("path",{staticStyle:{fill:"var(--btcpay-body-text)"},attrs:{d:"M4388.81 409.884V222.941H4272.17V158.813L4392.16 154.289L4403.44 20.2617H4475.02V154.289H4674.64V222.941H4475.02V410.146C4475.02 482.864 4500.73 518.076 4577.29 518.076C4610.27 517.981 4642.96 511.847 4673.73 499.979L4691.24 562.992C4648.39 578.951 4603.07 587.274 4557.35 587.581C4430.86 587.581 4388.81 516.043 4388.81 409.884Z"}}),r("path",{staticStyle:{fill:"var(--btcpay-body-text)"},attrs:{d:"M4818.71 521.815L4857.09 466.014C4909.9 502.948 4972.98 522.353 5037.43 521.487C5102.31 521.487 5133.34 495.259 5133.34 463.85C5133.34 433.95 5115.76 415 5009.22 393.034C4897.7 369.887 4845.21 331.2 4845.21 267.203C4845.21 196.518 4908.85 143.93 5025.95 143.93C5093.26 143.93 5157.55 170.158 5199.93 198.878L5159.45 252.646C5117.79 224.668 5068.79 209.592 5018.6 209.304C4955.62 209.304 4931.28 234.155 4931.28 263.138C4931.28 295.923 4965.07 309.037 5048.12 326.938C5185.89 357.101 5220.33 392.509 5220.33 458.736C5220.33 529.487 5151.71 587.582 5026.8 587.582C4952.47 586.641 4880.07 563.76 4818.71 521.815V521.815Z"}})])]),t._v(" "),r("div",{staticClass:"supporters"},[r("h3",[t._v("Our Supporters")]),t._v(" "),r("p",[t._v("\n The BTCPay Server Project is proudly supported by these entities through the\n "),r("a",{attrs:{href:"https://foundation.btcpayserver.org/",target:"_blank",rel:"noopener noreferrer"}},[t._v("BTCPay Server Foundation")]),t._v(".\n ")]),t._v(" "),r("div",{staticClass:"logos"},[r("a",{attrs:{href:"https://spiral.xyz",target:"_blank",rel:"noopener noreferrer"}},[r("svg",{staticStyle:{padding:"5px"},attrs:{role:"img",width:"100",height:"100"}},[r("use",{attrs:{href:"#supporter-spiral"}})]),t._v("\n Spiral\n ")]),t._v(" "),r("a",{attrs:{href:"https://opensats.org",target:"_blank",rel:"noopener noreferrer"}},[r("svg",{attrs:{role:"img",width:"120",height:"100"}},[r("use",{attrs:{href:"#supporter-opensats"}})]),t._v("\n OpenSats\n ")]),t._v(" "),r("a",{attrs:{href:"https://www.bailliegifford.com",target:"_blank",rel:"noopener noreferrer"}},[r("svg",{attrs:{role:"img",width:"110",height:"100"}},[r("use",{attrs:{href:"#supporter-bailliegifford"}})]),t._v("\n Baillie Gifford\n ")]),t._v(" "),r("a",{attrs:{href:"https://strike.me",target:"_blank",rel:"noopener noreferrer"}},[r("svg",{attrs:{role:"img",width:"55",height:"50"}},[r("use",{attrs:{href:"#supporter-strike"}})]),t._v("\n Strike\n ")]),t._v(" "),r("a",{attrs:{href:"https://hrf.org",target:"_blank",rel:"noopener noreferrer"}},[r("svg",{attrs:{role:"img",width:"110",height:"50"}},[r("use",{attrs:{href:"#supporter-hrf"}})]),t._v("\n HRF\n ")]),t._v(" "),r("a",{attrs:{href:"https://escapetoelsalvador.org/",target:"_blank",rel:"noopener noreferrer"}},[r("svg",{attrs:{role:"img",width:"100",height:"90"}},[r("use",{attrs:{href:"#supporter-esc"}})]),t._v("\n ESC\n ")]),t._v(" "),r("a",{attrs:{href:"https://www.lunanode.com/",target:"_blank",rel:"noopener noreferrer"}},[r("svg",{attrs:{role:"img",width:"100",height:"100"}},[r("use",{attrs:{href:"#supporter-lunanode"}})]),t._v("\n LunaNode\n ")]),t._v(" "),r("a",{attrs:{href:"https://walletofsatoshi.com/",target:"_blank",rel:"noopener noreferrer"}},[r("svg",{attrs:{role:"img",width:"100",height:"100"}},[r("use",{attrs:{href:"#supporter-walletofsatoshi"}})]),t._v("\n Wallet of Satoshi\n ")]),t._v(" "),r("a",{attrs:{href:"https://coincards.com/",target:"_blank",rel:"noopener noreferrer"}},[r("svg",{attrs:{role:"img",width:"130",height:"100"}},[r("use",{attrs:{href:"#supporter-coincards"}})]),t._v("\n Coincards\n ")]),t._v(" "),r("a",{attrs:{href:"https://www.ivpn.net/",target:"_blank",rel:"noopener noreferrer"}},[r("svg",{attrs:{role:"img",width:"100",height:"100"}},[r("use",{attrs:{href:"#supporter-ivpn"}})]),t._v("\n IVPN\n ")])]),t._v(" "),r("p",[t._v("If you'd like to support the project, please visit the "),r("a",{attrs:{href:"https://btcpayserver.org/donate/"}},[t._v("donation page")]),t._v(".")])])])}),[],!1,null,null,null);r.default=l.exports}}]); \ No newline at end of file diff --git a/assets/js/15.69f656a6.js b/assets/js/15.da83a3d0.js similarity index 93% rename from assets/js/15.69f656a6.js rename to assets/js/15.da83a3d0.js index 62cb56ae42..1a6c1a9fd5 100644 --- a/assets/js/15.69f656a6.js +++ b/assets/js/15.da83a3d0.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[15],{673:function(e,t,o){e.exports=o.p+"assets/img/BTCPayInfographic.93db91b4.png"},674:function(e,t,o){e.exports=o.p+"assets/img/btcpay-wc-2--01-plugin-search.d542b753.png"},675:function(e,t,o){e.exports=o.p+"assets/img/btcpay-wc-2--02-activated-configure.3054c6da.png"},676:function(e,t,o){e.exports=o.p+"assets/img/btcpay-wc-2--03-settings--api-key-redirect.dee3eb63.png"},677:function(e,t,o){e.exports=o.p+"assets/img/btcpayWooLmode1.30c2a467.jpg"},678:function(e,t,o){e.exports=o.p+"assets/img/btcpay-wc-2--05-api-auth-select-store.8765a27a.png"},679:function(e,t,o){e.exports=o.p+"assets/img/btcpay-wc-2--06-api-auth-authorize-button.7ba04186.png"},680:function(e,t,o){e.exports=o.p+"assets/img/btcpay-wc-2--07-api-auth-after-redirect-prefilled.70d8472c.png"},681:function(e,t,o){e.exports=o.p+"assets/img/btcpay-wc-2--08-api-auth-save-webhook-created.53d476f0.png"},682:function(e,t,o){e.exports=o.p+"assets/img/btcpayWooLmode2.6ceb841e.jpg"},683:function(e,t,o){e.exports=o.p+"assets/img/btcpayWooLmode3.967e4347.jpg"},684:function(e,t,o){e.exports=o.p+"assets/img/btcpayWooLmode4.4cb74b80.jpg"},685:function(e,t,o){e.exports=o.p+"assets/img/btcpayWooLmode5.a35ab95d.jpg"},686:function(e,t,o){e.exports=o.p+"assets/img/btcpayWooLmode6.fa94aa2e.jpg"},687:function(e,t,o){e.exports=o.p+"assets/img/btcpay-wc-2--7-man-api--copy-store-id.6c1943ea.png"},688:function(e,t,o){e.exports=o.p+"assets/img/btcpay-wc-2--15-man-api--btcpay-settings-fill.298e9de1.png"},689:function(e,t,o){e.exports=o.p+"assets/img/btcpay-wc-2--15-man-api--btcpay-settings-save.1f329e19.png"},690:function(e,t,o){e.exports=o.p+"assets/img/btcpay-wc-2--reqbin-403-test.62547f5f.png"},834:function(e,t,o){"use strict";o.r(t);var a=o(10),r=Object(a.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"woocommerce-integration"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#woocommerce-integration"}},[e._v("#")]),e._v(" WooCommerce integration")]),e._v(" "),t("p",[e._v("This document explains how to "),t("strong",[e._v("integrate BTCPay Server into your WooCommerce store")]),e._v(".\nIf you do not have a store yet, follow "),t("a",{attrs:{href:"https://web.archive.org/web/20221003083329/https://bitcoinshirt.co/how-to-create-store-accept-bitcoin/5/",target:"_blank",rel:"noopener noreferrer"}},[e._v("this step by step article"),t("OutboundLink")],1),e._v(" to create one from scratch.")]),e._v(" "),t("div",{staticClass:"custom-block tip"},[t("p",{staticClass:"custom-block-title"},[e._v("Note")]),e._v(" "),t("p",[e._v("This guide refers to the BTCPay for WooCommerce V2 plugin. You can find instructions for the now unmaintained legacy plugin (based on BitPay API) "),t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver-doc/blob/cba96292ceea9483711ab53c479a98357383f857/docs/WooCommerce.md",target:"_blank",rel:"noopener noreferrer"}},[e._v("here"),t("OutboundLink")],1),e._v(".")])]),e._v(" "),t("p"),t("div",{staticClass:"table-of-contents"},[t("ul",[t("li",[t("a",{attrs:{href:"#requirements"}},[e._v("Requirements")])]),t("li",[t("a",{attrs:{href:"#1-install-btcpay-plugin"}},[e._v("1. Install BTCPay Plugin")]),t("ul",[t("li",[t("a",{attrs:{href:"#11-install-plugin-from-wordpress-admin-dashboard-recommended"}},[e._v("1.1 Install plugin from WordPress Admin Dashboard (recommended)")])]),t("li",[t("a",{attrs:{href:"#12-download-and-install-plugin-from-github"}},[e._v("1.2 Download and install plugin from GitHub")])])])]),t("li",[t("a",{attrs:{href:"#2-connecting-woocommerce-and-btcpay-server"}},[e._v("2. Connecting WooCommerce and BTCPay Server")]),t("ul",[t("li",[t("a",{attrs:{href:"#21-connect-using-the-api-key-wizard-recommended"}},[e._v("2.1 Connect using the API key wizard (recommended)")])]),t("li",[t("a",{attrs:{href:"#22-connect-by-manually-creating-the-api-key-and-permissions"}},[e._v("2.2 Connect by manually creating the API key and permissions")])])])]),t("li",[t("a",{attrs:{href:"#3-testing-the-checkout"}},[e._v("3. Testing the checkout")])]),t("li",[t("a",{attrs:{href:"#4-customizing-btcpay-woocommerce-v2"}},[e._v("4. Customizing BTCPay WooCommerce V2")]),t("ul",[t("li",[t("a",{attrs:{href:"#41-global-settings"}},[e._v("4.1 Global Settings")])]),t("li",[t("a",{attrs:{href:"#42-payment-gateway-specific"}},[e._v("4.2 Payment Gateway specific")])])])]),t("li",[t("a",{attrs:{href:"#troubleshooting"}},[e._v("Troubleshooting")]),t("ul",[t("li",[t("a",{attrs:{href:"#error-call-to-undefined-function-btcpayserver-http-curl-init"}},[e._v("Error: Call to undefined function BTCPayServer\\Http\\curl_init()")])]),t("li",[t("a",{attrs:{href:"#the-order-states-do-not-update-although-the-invoice-has-been-paid"}},[e._v("The order states do not update although the invoice has been paid")])]),t("li",[t("a",{attrs:{href:"#i-get-an-error-during-checkout-but-not-sure-what-the-problem-is"}},[e._v("I get an error during checkout but not sure what the problem is.")])]),t("li",[t("a",{attrs:{href:"#i-have-troubles-with-using-the-plugin-or-some-other-related-questions"}},[e._v("I have troubles with using the plugin or some other related questions")])]),t("li",[t("a",{attrs:{href:"#create-a-new-api-key"}},[e._v("Create a new API key")])]),t("li",[t("a",{attrs:{href:"#i-messed-around-with-the-webhook-how-to-fix"}},[e._v("I messed around with the webhook, how to fix")])])])]),t("li",[t("a",{attrs:{href:"#deploying-woocommerce-from-btcpay-server"}},[e._v("Deploying WooCommerce from BTCPay Server")])])])]),t("p"),e._v(" "),t("figure",[t("img",{attrs:{src:o(673),alt:"BTCPay - WooCommerce Infographic",title:"BTCPay - WooCommerce Infographic"}})]),e._v(" "),t("p",[e._v("To integrate BTCPay Server into an existing WooCommerce store, follow the steps below and/or watch this video:")]),e._v(" "),t("a",{staticClass:"ytEmbed",staticStyle:{"background-image":"url(https://img.youtube.com/vi/ULcocDKZ1Mw/hqdefault.jpg)"},attrs:{href:"https://www.youtube.com/watch?v=ULcocDKZ1Mw",title:"BTCPay - WooCommerce","data-id":"ULcocDKZ1Mw"}},[t("iframe",{attrs:{title:"BTCPay - WooCommerce","data-src":"https://www.youtube-nocookie.com/embed/ULcocDKZ1Mw?&autoplay=1&autohide=1&modestbranding=1&color=white&rel=0",frameborder:"0",allow:"autoplay;encrypted-media;picture-in-picture",allowfullscreen:""}})]),e._v(" "),t("h2",{attrs:{id:"requirements"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#requirements"}},[e._v("#")]),e._v(" Requirements")]),e._v(" "),t("p",[e._v("Please ensure that you meet the following requirements before installing this plugin.")]),e._v(" "),t("ul",[t("li",[e._v("PHP version 7.4 or newer")]),e._v(" "),t("li",[e._v("The cURL, gd, intl, json, and mbstring PHP extensions are available")]),e._v(" "),t("li",[e._v("A WooCommerce website ("),t("a",{attrs:{href:"https://woocommerce.com/document/installing-uninstalling-woocommerce/",target:"_blank",rel:"noopener noreferrer"}},[e._v("Installation instructions"),t("OutboundLink")],1),e._v(" or "),t("a",{attrs:{href:"#deploying-woocommerce-from-btcpay-server"}},[e._v("directly on BTCPay Server")]),e._v(")")]),e._v(" "),t("li",[e._v("You have a BTCPay Server version 1.3.0 or later, either "),t("RouterLink",{attrs:{to:"/Deployment/"}},[e._v("self-hosted")]),e._v(" or "),t("RouterLink",{attrs:{to:"/Deployment/ThirdPartyHosting/"}},[e._v("hosted by a third-party")])],1),e._v(" "),t("li",[t("RouterLink",{attrs:{to:"/RegisterAccount/"}},[e._v("You've a registered account on the instance")])],1),e._v(" "),t("li",[t("RouterLink",{attrs:{to:"/CreateStore/"}},[e._v("You've a BTCPay store on the instance")])],1),e._v(" "),t("li",[t("RouterLink",{attrs:{to:"/WalletSetup/"}},[e._v("You've a wallet connected to your store")])],1)]),e._v(" "),t("h2",{attrs:{id:"1-install-btcpay-plugin"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#1-install-btcpay-plugin"}},[e._v("#")]),e._v(" 1. Install BTCPay Plugin")]),e._v(" "),t("p",[e._v("There are three ways to "),t("strong",[e._v("download BTCPay for WooCommerce V2 plugin")]),e._v(":")]),e._v(" "),t("ul",[t("li",[e._v("From within WordPress via the Admin Dashboard (recommended, see below)")]),e._v(" "),t("li",[t("a",{attrs:{href:"https://wordpress.org/plugins/btcpay-greenfield-for-woocommerce/",target:"_blank",rel:"noopener noreferrer"}},[e._v("WordPress Repository"),t("OutboundLink")],1)]),e._v(" "),t("li",[t("a",{attrs:{href:"https://github.com/btcpayserver/woocommerce-greenfield-plugin/releases",target:"_blank",rel:"noopener noreferrer"}},[e._v("GitHub Repository"),t("OutboundLink")],1)])]),e._v(" "),t("h3",{attrs:{id:"11-install-plugin-from-wordpress-admin-dashboard-recommended"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#11-install-plugin-from-wordpress-admin-dashboard-recommended"}},[e._v("#")]),e._v(" 1.1 Install plugin from WordPress Admin Dashboard (recommended)")]),e._v(" "),t("ol",[t("li",[e._v("WordPress > Plugins > Add New.")]),e._v(" "),t("li",[e._v('In Search, type "BTCPay V2".')]),e._v(" "),t("li",[e._v("Install and activate.")])]),e._v(" "),t("figure",[t("img",{attrs:{src:o(674),alt:"BTCPay WordPress V2: Plugin installation",title:"BTCPay WordPress V2: Plugin installation"}})]),e._v(" "),t("h3",{attrs:{id:"12-download-and-install-plugin-from-github"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#12-download-and-install-plugin-from-github"}},[e._v("#")]),e._v(" 1.2 Download and install plugin from GitHub")]),e._v(" "),t("p",[t("a",{attrs:{href:"https://github.com/btcpayserver/woocommerce-greenfield-plugin/releases",target:"_blank",rel:"noopener noreferrer"}},[e._v("Download the latest BTCPay plugin"),t("OutboundLink")],1),e._v(", upload it in .zip format to your WordPress site and activate it.")]),e._v(" "),t("a",{staticClass:"ytEmbed",staticStyle:{"background-image":"url(https://img.youtube.com/vi/6QcTWHRKZag/hqdefault.jpg)"},attrs:{href:"https://www.youtube.com/watch?v=6QcTWHRKZag",title:"BTCPay Server Woo Plugin","data-id":"6QcTWHRKZag"}},[t("iframe",{attrs:{title:"BTCPay Server Woo Plugin","data-src":"https://www.youtube-nocookie.com/embed/6QcTWHRKZag?&autoplay=1&autohide=1&modestbranding=1&color=white&rel=0",frameborder:"0",allow:"autoplay;encrypted-media;picture-in-picture",allowfullscreen:""}})]),e._v(" "),t("h2",{attrs:{id:"2-connecting-woocommerce-and-btcpay-server"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#2-connecting-woocommerce-and-btcpay-server"}},[e._v("#")]),e._v(" 2. Connecting WooCommerce and BTCPay Server")]),e._v(" "),t("p",[e._v("BTCPay for WooCommerce V2 plugin is a "),t("strong",[e._v("bridge between your BTCPay Server (payment processor) and your e-commerce store")]),e._v(".\nNo matter if you're using a self-hosted or third-party solution, the connection process is identical.")]),e._v(" "),t("p",[e._v('You can either click on the notifications link saying "'),t("strong",[e._v("please configure the plugin here")]),e._v('" (see screenshot below), or:')]),e._v(" "),t("ul",[t("li",[e._v("Go to your store dashboard.")]),e._v(" "),t("li",[e._v("WooCommerce > Settings.")]),e._v(" "),t("li",[e._v("Click [BTCPay Settings] tab.")])]),e._v(" "),t("figure",[t("img",{attrs:{src:o(675),alt:"BTCPay WordPress V2: Link to BTCPay Settings",title:"BTCPay WordPress V2: Link to BTCPay Settings"}})]),e._v(" "),t("h3",{attrs:{id:"21-connect-using-the-api-key-wizard-recommended"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#21-connect-using-the-api-key-wizard-recommended"}},[e._v("#")]),e._v(" 2.1 Connect using the API key wizard (recommended)")]),e._v(" "),t("ol",[t("li",[t("p",[e._v('In the field "'),t("strong",[e._v("BTCPay Server URL")]),e._v('", enter the full URL of your host (including the https) – https://btcpay.mydomain.com')])]),e._v(" "),t("li",[t("p",[e._v('Click on the button [Generate API key] (you will be redirected to BTCPay Server "Authorization request" page.\n'),t("img",{attrs:{src:o(676),alt:"BTCPay WordPress V2: Link to BTCPay Settings",title:"BTCPay WordPress V2: Link to BTCPay Settings"}})])]),e._v(" "),t("li",[t("p",[e._v("If you are not logged in to your BTCPay Server instance, do so now. (optional)\n"),t("img",{attrs:{src:o(677),alt:"BTCPay WordPress V2: Login to BTCPay Server",title:"BTCPay WordPress V2: Login to BTCPay Server"}})])]),e._v(" "),t("li",[t("p",[e._v("Select the store you want to connect to (if you only have one store it will get autoselected).\n"),t("img",{attrs:{src:o(678),alt:"BTCPay WordPress V2: Select store",title:"BTCPay WordPress V2: Select store"}})])]),e._v(" "),t("li",[t("p",[e._v("All required permissions are prefilled already, you just need to click [Authorize app]\n"),t("img",{attrs:{src:o(679),alt:"BTCPay WordPress V2: Click on authorize app",title:"BTCPay WordPress V2: Click on authorize app"}})])]),e._v(" "),t("li",[t("p",[e._v('You will get redirected back to your WooCommerce store and the API key and Store ID will be prefilled. Additionally, the webhook will have been created automatically for you. Check the "Webhook status" field to show "Webhook setup automatically." followed by an ID.\n'),t("img",{attrs:{src:o(680),alt:"BTCPay WordPress V2: Redirected back to plugin settings",title:"BTCPay WordPress V2: Redirected back to plugin settings"}})])]),e._v(" "),t("li",[t("p",[e._v("Before doing any further configuration click on "),t("strong",[e._v("[Save]")]),e._v(" to be sure all is set.\n"),t("img",{attrs:{src:o(681),alt:"BTCPay WordPress V2: Webhook created",title:"BTCPay WordPress V2: Webhook created"}})])])]),e._v(" "),t("p",[e._v('Congratulations, you are almost set. To make the Bitcoin payment gateway show up on your checkout. In the sidebar go to "WooCommerce" -> "Settings", click on the "Payments" tab and enable the "BTCPay (default)" payment gateway.')]),e._v(" "),t("p",[e._v('Continue with "3. Testing the checkout" below to make sure all works as expected.')]),e._v(" "),t("h3",{attrs:{id:"22-connect-by-manually-creating-the-api-key-and-permissions"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#22-connect-by-manually-creating-the-api-key-and-permissions"}},[e._v("#")]),e._v(" 2.2 Connect by manually creating the API key and permissions")]),e._v(" "),t("p",[e._v("If you can't use the wizard mentioned in the previous section you can also generate the API key manually.")]),e._v(" "),t("ol",[t("li",[e._v("Click on "),t("em",[e._v("[Account]")]),e._v(" -> "),t("em",[e._v("Manage Account")]),e._v(" on the bottom left\n"),t("img",{attrs:{src:o(682),alt:"BTCPay WordPress V2: Manage Account",title:"BTCPay WordPress V2: Manage Account"}})]),e._v(" "),t("li",[e._v("Go to the tab "),t("em",[e._v('"API Keys"')])]),e._v(" "),t("li",[e._v("Click "),t("em",[e._v("[Generate Key]")]),e._v(" to select permissions.\n"),t("img",{attrs:{src:o(683),alt:"BTCPay WordPress V2: API Keys overview",title:"BTCPay WordPress V2: API Keys overview"}})]),e._v(" "),t("li",[e._v("Click on the "),t("em",[e._v('"Select specific stores"')]),e._v(" link for the following permissions: "),t("code",[e._v("View invoices")]),e._v(", "),t("code",[e._v("Create invoice")]),e._v(", "),t("code",[e._v("Modify invoices")]),e._v(", "),t("code",[e._v("Modify stores webhooks")]),e._v(", "),t("code",[e._v("View your stores")]),e._v(", "),t("code",[e._v("Create non-approved pull payments")]),e._v(" (used for refunds)\n"),t("img",{attrs:{src:o(684),alt:"BTCPay WordPress V2: API Keys Permissions",title:"BTCPay WordPress V2: API Keys Permissions"}})]),e._v(" "),t("li",[e._v("Click on "),t("em",[e._v("[Generate API Key]")]),e._v(" "),t("img",{attrs:{src:o(685),alt:"BTCPay WordPress V2: API Keys Save",title:"BTCPay WordPress V2: API Keys Save"}})]),e._v(" "),t("li",[e._v("Copy the generated API Key to your WordPress "),t("em",[e._v("BTCPay Settings")]),e._v(" form (Advanced settings)\n"),t("img",{attrs:{src:o(686),alt:"BTCPay WordPress V2: Copy API Key",title:"BTCPay WordPress V2: Copy API Key"}})]),e._v(" "),t("li",[e._v("Copy the store ID to your WordPress "),t("em",[e._v("BTCPay Settings")]),e._v(" form (Advanced settings)\n"),t("img",{attrs:{src:o(687),alt:"BTCPay WordPress V2: Copy Store ID",title:"BTCPay WordPress V2: Copy Store ID"}})]),e._v(" "),t("li",[e._v("On the BTCPay Settings form:")])]),e._v(" "),t("ul",[t("li",[e._v("Enter "),t("em",[e._v("BTCPay Server URL")]),e._v(" (URL of your BTCPay Server instance, where you just created the API key)")]),e._v(" "),t("li",[e._v('Click the "Advanced settings" checkbox to enter '),t("em",[e._v("BTCPay Server API Key")]),e._v(" and "),t("em",[e._v("Store ID")]),e._v(" (leave "),t("em",[e._v("Webhook secret")]),e._v(" empty)")]),e._v(" "),t("li",[e._v("Click on "),t("em",[e._v("[Save]")]),e._v(" at the bottom of the page\n"),t("img",{attrs:{src:o(688),alt:"BTCPay WordPress V2: Save BTCPay Settings form",title:"BTCPay WordPress V2: Save BTCPay Settings form"}})])]),e._v(" "),t("ol",{attrs:{start:"9"}},[t("li",[e._v('Make sure you see the notification "'),t("em",[e._v("BTCPay Server: Successfully registered a new webhook on BTCPay Server")]),e._v('" and '),t("em",[e._v("Setup status")]),e._v(" and "),t("em",[e._v("Webhook status")]),e._v(" are green.\n"),t("img",{attrs:{src:o(689),alt:"BTCPay WordPress V2: Save BTCPay Settings form saved",title:"BTCPay WordPress V2: Save BTCPay Settings form saved"}})])]),e._v(" "),t("p",[e._v('Congratulations, you are almost set. To make the Bitcoin payment gateway show up on your checkout. In the sidebar go to "WooCommerce" -> "Settings", click on the "Payments" tab and enable the "BTCPay (default)" payment gateway.')]),e._v(" "),t("p",[e._v('Continue with "3. Testing the checkout" below to make sure all works as expected.')]),e._v(" "),t("h2",{attrs:{id:"3-testing-the-checkout"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#3-testing-the-checkout"}},[e._v("#")]),e._v(" 3. Testing the checkout")]),e._v(" "),t("p",[e._v("Making a small test-purchase from your store will give you peace of mind.\nAlways make sure that everything is set up correctly before going live.\nThe final video guides you through the steps of setting a gap limit in your Electrum wallet and testing the checkout process.")]),e._v(" "),t("a",{staticClass:"ytEmbed",staticStyle:{"background-image":"url(https://img.youtube.com/vi/Fi3pYpzGmmo/hqdefault.jpg)"},attrs:{href:"https://www.youtube.com/watch?v=Fi3pYpzGmmo",title:"BTCPay Server Checkout","data-id":"Fi3pYpzGmmo"}},[t("iframe",{attrs:{title:"BTCPay Server Checkout","data-src":"https://www.youtube-nocookie.com/embed/Fi3pYpzGmmo?&autoplay=1&autohide=1&modestbranding=1&color=white&rel=0",frameborder:"0",allow:"autoplay;encrypted-media;picture-in-picture",allowfullscreen:""}})]),e._v(" "),t("h2",{attrs:{id:"4-customizing-btcpay-woocommerce-v2"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#4-customizing-btcpay-woocommerce-v2"}},[e._v("#")]),e._v(" 4. Customizing BTCPay WooCommerce V2")]),e._v(" "),t("h3",{attrs:{id:"41-global-settings"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#41-global-settings"}},[e._v("#")]),e._v(" 4.1 Global Settings")]),e._v(" "),t("p",[e._v("Can be found at "),t("em",[e._v("WooCommerce -> Settings -> Tab [BTCPay Settings]")])]),e._v(" "),t("p",[t("strong",[e._v("BTCPay Server URL")])]),e._v(" "),t("p",[e._v("URL to your BTCPay Server instance, including protocol e.g. "),t("code",[e._v("https://btcpay.yourdomain.com")]),e._v(".")]),e._v(" "),t("p",[t("strong",[e._v("BTCPay API Key")])]),e._v(" "),t("p",[e._v("Your API Key. (Was auto-generated in the steps before).")]),e._v(" "),t("p",[t("strong",[e._v("Store ID")])]),e._v(" "),t("p",[e._v("The store ID of your BTCPay Server store. Can be found on the store settings page.")]),e._v(" "),t("p",[t("strong",[e._v("Default Customer Message")])]),e._v(" "),t("p",[e._v('Here you can customize the customer message shown after selecting BTCPay payment gateway on checkout. This can be overwritten on the payment gateway settings for each gateway if you use the "Separate payment gateways" option.')]),e._v(" "),t("p",[t("strong",[e._v('Invoice pass to "Settled" state after')])]),e._v(" "),t("p",[e._v("Set after how many confirmations a payment is considered fully paid and settled. Defaults to what is configured on BTCPay store settings.")]),e._v(" "),t("p",[t("strong",[e._v("BTCPay Order Statuses")])]),e._v(" "),t("p",[e._v("Depending on your business model and store settings, you may want to configure your order statuses.\nYou can set BTCPay to trigger certain order status in WooCommerce automatically.")]),e._v(" "),t("ul",[t("li",[t("em",[e._v("New")]),e._v(" - order placed, not paid yet.")]),e._v(" "),t("li",[t("em",[e._v("Paid")]),e._v(" - order paid, not enough confirmations on the blockchain, yet.")]),e._v(" "),t("li",[t("em",[e._v("Settled")]),e._v(" - order paid, confirmed on the blockchain.")]),e._v(" "),t("li",[t("em",[e._v("Settled (paid over)")]),e._v(" - order paid, confirmed on the blockchain but paid over.")]),e._v(" "),t("li",[t("em",[e._v("Invalid")]),e._v(" - order paid, did not get a sufficient number of confirmations in a pre-defined time-frame set in BTCPay store settings, or manually marked invalid.")]),e._v(" "),t("li",[t("em",[e._v("Expired")]),e._v(" - invoice expired, order not paid.")]),e._v(" "),t("li",[t("em",[e._v("Expired with partial payment")]),e._v(" - invoice expired and paid partially")])]),e._v(" "),t("p",[e._v('Take time to think about how you wish to automate these statuses.\nIf you do not wish certain BTCPay status to trigger WooCommerce order status, you can leave it as default "- no mapping / defaults -".')]),e._v(" "),t("p",[e._v('Note: you should keep the "Settled" order status to "- no mapping / defaults-" if you sell digital and physical products. For digital products WooCommerce will automatically skip the "Processing" status and go directly to "Completed" for those orders only containing digital products.')]),e._v(" "),t("p",[e._v('Another example, if a merchant wants to send an email notifying the customer that the payment has been received, but the order will be processed upon confirmation, the merchant would have to set order status for "Paid" to "On hold". Then, the merchant would have to customize and trigger email for "On hold" status of the order in WooCommerce.')]),e._v(" "),t("p",[e._v("It takes some time to find a perfect formula, so users should test things out before going live.")]),e._v(" "),t("p",[t("strong",[e._v("Modal checkout")])]),e._v(" "),t("p",[e._v("Enable this option if you want the BTCPay Server invoice to be shown directly on the checkout page (and do not redirect customers to your BTCPay Server instance).")]),e._v(" "),t("p",[t("strong",[e._v("Separate Payment Gateways")])]),e._v(" "),t("p",[e._v("If this option is enabled the plugin will generate one separate payment gateway per supported payment method on BTCPay Server. E.g. if you have BTC, LightningNetwork and maybe Liquid Assets enabled on your BTCPay Server store, then you will have a separate gateway available for each. This allows many new use cases like discount per gateway or country based restrictions. More details "),t("RouterLink",{attrs:{to:"/FAQ/Integrations/#how-to-configure-additional-token-support"}},[e._v("here")]),e._v(".")],1),e._v(" "),t("p",[t("strong",[e._v("Send customer data to BTCPayServer")])]),e._v(" "),t("p",[e._v("By default "),t("em",[e._v("no")]),e._v(" customer data beside email is sent to BTCPay Server. If you want to send customer address data to BTCPay Server you can enable it here.")]),e._v(" "),t("p",[t("strong",[e._v("Debug Log")])]),e._v(" "),t("p",[e._v("This option is helpful in case you have a problem and need more information on what is going on. The logs can be then found under WooCommerce -> Status -> Log. Make sure you disable this again after debugging as it will fill up your filesystem with logs.")]),e._v(" "),t("h3",{attrs:{id:"42-payment-gateway-specific"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#42-payment-gateway-specific"}},[e._v("#")]),e._v(" 4.2 Payment Gateway specific")]),e._v(" "),t("p",[e._v('Depending on wheter you have above mentioned "Separate Payment Gateways" enabled you will have one or more Payment Gateways available to configure in the payment gateway settings via '),t("em",[e._v("WooCommerce -> Settings -> Tab [Payments]")])]),e._v(" "),t("p",[e._v("On all payment gateways you can set the following options:")]),e._v(" "),t("p",[t("strong",[e._v("Title")]),e._v('\nThe shown payment gateway text on the checkout page. Defaults to "BTCPay (Bitcoin, Lightning Network, ...)".')]),e._v(" "),t("p",[t("strong",[e._v("Customer Message")])]),e._v(" "),t("p",[e._v("Here you can customize message shown after selecting BTCPay payment gateway.")]),e._v(" "),t("p",[t("strong",[e._v("Gateway Icon")])]),e._v(" "),t("p",[e._v("Upload or select a custom icon to be shown next to the payment gateway during checkout. Defaults to BTCPay logo.")]),e._v(" "),t("h4",{attrs:{id:"421-btcpay-default"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#421-btcpay-default"}},[e._v("#")]),e._v(" 4.2.1 BTCPay (default)")]),e._v(" "),t("p",[e._v("Additional options only available for the default payment gateway:")]),e._v(" "),t("p",[t("strong",[e._v("Enforce payment tokens")])]),e._v(" "),t("p",[e._v('With "Separate Payment Gateways" feature enabled in BTCPay Settings you can use this option to enforce only payment tokens. This means that the created invoice will '),t("em",[e._v("only")]),e._v(' include tokens of type "payment" and '),t("em",[e._v("not any")]),e._v(' of type "promotion". See difference of token types '),t("RouterLink",{attrs:{to:"/FAQ/Integrations/#how-to-configure-additional-token-support#token-types"}},[e._v("here")])],1),e._v(" "),t("h4",{attrs:{id:"422-separate-payment-gateways"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#422-separate-payment-gateways"}},[e._v("#")]),e._v(" 4.2.2 Separate Payment Gateways")]),e._v(" "),t("p",[e._v("Additional options only available for the separate payment gateways (if that feature is enabled):")]),e._v(" "),t("p",[t("strong",[e._v("Token Type")])]),e._v(" "),t("p",[e._v('By default type "payment" is selected. But if you have Liquid Assets with your own issued asset/token (e.g. used as voucher) you can select "promotion" here. Those are processed differently than normal payment tokens. Details can be found '),t("RouterLink",{attrs:{to:"/FAQ/Integrations/#how-to-configure-additional-token-support#promotional-tokens-100-discount"}},[e._v("here")])],1),e._v(" "),t("h2",{attrs:{id:"troubleshooting"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#troubleshooting"}},[e._v("#")]),e._v(" Troubleshooting")]),e._v(" "),t("h3",{attrs:{id:"error-call-to-undefined-function-btcpayserver-http-curl-init"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#error-call-to-undefined-function-btcpayserver-http-curl-init"}},[e._v("#")]),e._v(" Error: Call to undefined function BTCPayServer\\Http\\curl_init()")]),e._v(" "),t("p",[e._v("Please make sure your PHP version supports the cURL extension (as written in the requirements above). You can install it on Debian/Ubuntu by running the command "),t("code",[e._v("sudo apt install php-curl")]),e._v(".")]),e._v(" "),t("h3",{attrs:{id:"the-order-states-do-not-update-although-the-invoice-has-been-paid"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#the-order-states-do-not-update-although-the-invoice-has-been-paid"}},[e._v("#")]),e._v(" The order states do not update although the invoice has been paid")]),e._v(" "),t("p",[e._v("Please check first if the webhook is created under the BTCPay Server store settings. If there is no webhook created you can visit on your WooCommerce store BTCPay Settings tab under WooCommerce settings and hit the save button. This will create the webhook.")]),e._v(" "),t("p",[e._v('You may also check the details of your invoice if there were any errors on sending the webhook request. Some hosting providers, firewall setups or WordPress security plugins (like Wordfence) block POST requests to your WordPress site which lead to a http status of "403 Forbidden" or "503 Service Unavailable".')]),e._v(" "),t("p",[e._v("You can check and verify yourself if there is something blocking requests to your site in one of these two ways:")]),e._v(" "),t("p",[t("strong",[e._v("Check using a command line (Linux or MacOS):")]),e._v("\n(replace EXAMPLE.COM with your WordPress site URL)")]),e._v(" "),t("div",{staticClass:"language- extra-class"},[t("pre",{pre:!0,attrs:{class:"language-text"}},[t("code",[e._v('curl -vX POST -H "Content-Type: application/json" \\\n -d \'{"data": "test"}\' https://EXAMPLE.COM/?wc-api=btcpaygf_default\n')])])]),t("p",[e._v('On the response, if you see that line "HTTP/1.1 500" or "HTTP/2 500" and the message "Webhook request validation failed" that means that your site is not blocking the request with a "403 Forbidden".')]),e._v(" "),t("div",{staticClass:"language- extra-class"},[t("pre",{pre:!0,attrs:{class:"language-text"}},[t("code",[e._v('.... snip ....\n* We are completely uploaded and fine\n< HTTP/2 500\n< server: nginx\n< date: Sun, 05 Jun 2022 16:55:08 GMT\n< content-type: application/json; charset=UTF-8\n< x-powered-by: PHP/8.1.6\n< expires: Wed, 11 Jan 1984 05:00:00 GMT\n< cache-control: no-cache, must-revalidate, max-age=0\n<\n* Connection #0 to host example.com left intact\n{"code":"wp_die","message":"Webhook request validation failed.","data":{"status":500},"additional_errors":[]}\n')])])]),t("p",[e._v('On the other side, if you see that line "HTTP/1.1 403 Forbidden" or "HTTP/2 403" then something is blocking data sent to your WordPress site. You should ask your hosting provider or make sure no firewall or plugin is blocking the requests.')]),e._v(" "),t("div",{staticClass:"language- extra-class"},[t("pre",{pre:!0,attrs:{class:"language-text"}},[t("code",[e._v(".... snip ....\n* upload completely sent off: 16 out of 16 bytes\n< HTTP/1.1 403 Forbidden\n< access-control-allow-origin: *\n< Content-Type: application/json; charset=UTF-8\n< X-Cloud-Trace-Context: 4f07d5b2e5c2f05949d04421a8e2dd6a\n< Date: Thu, 17 Feb 2022 10:06:50 GMT\n< Server: Google Frontend\n< Content-Length: 26\n")])])]),t("p",[t("strong",[e._v("Check using an online service (if you do not have a command line available:")])]),e._v(" "),t("ul",[t("li",[e._v("Go to "),t("a",{attrs:{href:"https://reqbin.com/post-online",target:"_blank",rel:"noopener noreferrer"}},[e._v("https://reqbin.com/post-online"),t("OutboundLink")],1)]),e._v(" "),t("li",[e._v("Enter your domain: "),t("code",[e._v("https://EXAMPLE.COM/?wc-api=btcpaygf_default")]),e._v("\n(replace EXAMPLE.COM with your WordPress site URL)")]),e._v(" "),t("li",[e._v('Make sure "POST" is selected')]),e._v(" "),t("li",[e._v("Click [Send]")])]),e._v(" "),t("figure",[t("img",{attrs:{src:o(690),alt:"BTCPay WordPress V2: Debug 403 error with reqbin.com",title:"BTCPay WordPress V2: Debug 403 error with reqbin.com"}})]),e._v(" "),t("p",[e._v('If you see "Status 403 (Forbidden)" then POST requests to your site are blocked for some reason. You should ask your hosting provider or make sure no firewall or plugin is blocking the requests.')]),e._v(" "),t("h3",{attrs:{id:"i-get-an-error-during-checkout-but-not-sure-what-the-problem-is"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#i-get-an-error-during-checkout-but-not-sure-what-the-problem-is"}},[e._v("#")]),e._v(" I get an error during checkout but not sure what the problem is.")]),e._v(" "),t("p",[e._v("In your BTCPay Settings in your admin dashboard: "),t("em",[e._v("WooCommerce -> Settings: Tab [BTCPay Settings]")]),e._v(" you can enable debug mode by setting the checkbox on that option.")]),e._v(" "),t("p",[e._v("You can now find more detailed Logs when you click the [View Logs] button or you go to "),t("em",[e._v("WooCommerce -> Status: Tab [Logs]")]),e._v(" and select the most recent btcpay logs.")]),e._v(" "),t("div",{staticClass:"custom-block warning"},[t("p",{staticClass:"custom-block-title"},[e._v("Warning")]),e._v(" "),t("p",[e._v("Please make sure that you disable the debugging mode again after you finished investigating, otherwise your site performance may be impacted and also write lots of logging data in your filesystem for no reason.")])]),e._v(" "),t("p",[e._v("Additionally you can also look into your webservers error logs if you find any error that is related to BTCPay plugin.")]),e._v(" "),t("h3",{attrs:{id:"i-have-troubles-with-using-the-plugin-or-some-other-related-questions"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#i-have-troubles-with-using-the-plugin-or-some-other-related-questions"}},[e._v("#")]),e._v(" I have troubles with using the plugin or some other related questions")]),e._v(" "),t("p",[e._v("Feel free to join our support channel over at "),t("a",{attrs:{href:"https://chat.btcpayserver.org/",target:"_blank",rel:"noopener noreferrer"}},[e._v("https://chat.btcpayserver.org/"),t("OutboundLink")],1),e._v(" if you need help or have any further questions.")]),e._v(" "),t("h3",{attrs:{id:"create-a-new-api-key"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#create-a-new-api-key"}},[e._v("#")]),e._v(" Create a new API key")]),e._v(" "),t("p",[e._v("If you have been using the WooCommerce V2 plugin prior to version 2.0.0, your API key won't have the required permissions to issue refunds via pull-payments. If you want to use that feature, you can create a new API key (editing an API key is not currently supported). You can use the above described "),t("a",{attrs:{href:"#21-connect-using-the-api-key-wizard--recommended-"}},[e._v("2.1 Connect using API key wizard")]),e._v(" or the "),t("a",{attrs:{href:"#22-connect-by-manually-creating-the-api-key-and-permissions"}},[e._v("manual API key generation")]),e._v(". The configured webhook will continue to work, and no change is needed.")]),e._v(" "),t("h3",{attrs:{id:"i-messed-around-with-the-webhook-how-to-fix"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#i-messed-around-with-the-webhook-how-to-fix"}},[e._v("#")]),e._v(" I messed around with the webhook, how to fix")]),e._v(" "),t("p",[e._v("Suppose you accidentally changed the WooCommerce webhook, and it is not working anymore. In that case, you can quickly force a re-creation of it when you delete the API key on BTCPay Server and then go to the BTCPay Server Settings (on your WordPress site) and hit save again. You should see a message that the webhook was successfully created.")]),e._v(" "),t("h2",{attrs:{id:"deploying-woocommerce-from-btcpay-server"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#deploying-woocommerce-from-btcpay-server"}},[e._v("#")]),e._v(" Deploying WooCommerce from BTCPay Server")]),e._v(" "),t("p",[e._v("If you already have BTCPay Server, you can very easily start WooCommerce from your existing environment.")]),e._v(" "),t("ol",[t("li",[t("p",[e._v("Point the external IP of the virtual machine where your BTCPay is hosted to your store domain, for example store.yourdomain.com.")])]),e._v(" "),t("li",[t("p",[e._v("Log into your BTCPay server as root.")])])]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token function"}},[e._v("sudo")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("su")]),e._v(" -\n")])])]),t("ol",{attrs:{start:"3"}},[t("li",[e._v("Set up WooCommerce variables. You can add "),t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver-docker/blob/master/docker-compose-generator/docker-fragments/opt-add-woocommerce.yml",target:"_blank",rel:"noopener noreferrer"}},[e._v("optional variables"),t("OutboundLink")],1),e._v(" as well.")])]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("export")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[e._v("BTCPAYGEN_ADDITIONAL_FRAGMENTS")]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"'),t("span",{pre:!0,attrs:{class:"token variable"}},[e._v("$BTCPAYGEN_ADDITIONAL_FRAGMENTS")]),e._v(';opt-add-woocommerce"')]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("export")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[e._v("WOOCOMMERCE_HOST")]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"yourstoredomain.com"')]),e._v("\n")])])]),t("ol",{attrs:{start:"4"}},[t("li",[e._v("Lastly, just run BTCPay Setup script which will add the set up variables.")])]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v(".")]),e._v(" ./btcpay-setup.sh "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-i")]),e._v("\n")])])]),t("ol",{attrs:{start:"5"}},[t("li",[e._v("Go to your store's domain name, in our example that's store.yourdomain.com and follow the WordPress installation wizard.")])])])}),[],!1,null,null,null);t.default=r.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[15],{666:function(e,t,o){e.exports=o.p+"assets/img/BTCPayInfographic.93db91b4.png"},667:function(e,t,o){e.exports=o.p+"assets/img/btcpay-wc-2--01-plugin-search.d542b753.png"},668:function(e,t,o){e.exports=o.p+"assets/img/btcpay-wc-2--02-activated-configure.3054c6da.png"},669:function(e,t,o){e.exports=o.p+"assets/img/btcpay-wc-2--03-settings--api-key-redirect.dee3eb63.png"},670:function(e,t,o){e.exports=o.p+"assets/img/btcpayWooLmode1.30c2a467.jpg"},671:function(e,t,o){e.exports=o.p+"assets/img/btcpay-wc-2--05-api-auth-select-store.8765a27a.png"},672:function(e,t,o){e.exports=o.p+"assets/img/btcpay-wc-2--06-api-auth-authorize-button.7ba04186.png"},673:function(e,t,o){e.exports=o.p+"assets/img/btcpay-wc-2--07-api-auth-after-redirect-prefilled.70d8472c.png"},674:function(e,t,o){e.exports=o.p+"assets/img/btcpay-wc-2--08-api-auth-save-webhook-created.53d476f0.png"},675:function(e,t,o){e.exports=o.p+"assets/img/btcpayWooLmode2.6ceb841e.jpg"},676:function(e,t,o){e.exports=o.p+"assets/img/btcpayWooLmode3.967e4347.jpg"},677:function(e,t,o){e.exports=o.p+"assets/img/btcpayWooLmode4.4cb74b80.jpg"},678:function(e,t,o){e.exports=o.p+"assets/img/btcpayWooLmode5.a35ab95d.jpg"},679:function(e,t,o){e.exports=o.p+"assets/img/btcpayWooLmode6.fa94aa2e.jpg"},680:function(e,t,o){e.exports=o.p+"assets/img/btcpay-wc-2--7-man-api--copy-store-id.6c1943ea.png"},681:function(e,t,o){e.exports=o.p+"assets/img/btcpay-wc-2--15-man-api--btcpay-settings-fill.298e9de1.png"},682:function(e,t,o){e.exports=o.p+"assets/img/btcpay-wc-2--15-man-api--btcpay-settings-save.1f329e19.png"},683:function(e,t,o){e.exports=o.p+"assets/img/btcpay-wc-2--reqbin-403-test.62547f5f.png"},835:function(e,t,o){"use strict";o.r(t);var a=o(10),r=Object(a.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"woocommerce-integration"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#woocommerce-integration"}},[e._v("#")]),e._v(" WooCommerce integration")]),e._v(" "),t("p",[e._v("This document explains how to "),t("strong",[e._v("integrate BTCPay Server into your WooCommerce store")]),e._v(".\nIf you do not have a store yet, follow "),t("a",{attrs:{href:"https://web.archive.org/web/20221003083329/https://bitcoinshirt.co/how-to-create-store-accept-bitcoin/5/",target:"_blank",rel:"noopener noreferrer"}},[e._v("this step by step article"),t("OutboundLink")],1),e._v(" to create one from scratch.")]),e._v(" "),t("div",{staticClass:"custom-block tip"},[t("p",{staticClass:"custom-block-title"},[e._v("Note")]),e._v(" "),t("p",[e._v("This guide refers to the BTCPay for WooCommerce V2 plugin. You can find instructions for the now unmaintained legacy plugin (based on BitPay API) "),t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver-doc/blob/cba96292ceea9483711ab53c479a98357383f857/docs/WooCommerce.md",target:"_blank",rel:"noopener noreferrer"}},[e._v("here"),t("OutboundLink")],1),e._v(".")])]),e._v(" "),t("p"),t("div",{staticClass:"table-of-contents"},[t("ul",[t("li",[t("a",{attrs:{href:"#requirements"}},[e._v("Requirements")])]),t("li",[t("a",{attrs:{href:"#1-install-btcpay-plugin"}},[e._v("1. Install BTCPay Plugin")]),t("ul",[t("li",[t("a",{attrs:{href:"#11-install-plugin-from-wordpress-admin-dashboard-recommended"}},[e._v("1.1 Install plugin from WordPress Admin Dashboard (recommended)")])]),t("li",[t("a",{attrs:{href:"#12-download-and-install-plugin-from-github"}},[e._v("1.2 Download and install plugin from GitHub")])])])]),t("li",[t("a",{attrs:{href:"#2-connecting-woocommerce-and-btcpay-server"}},[e._v("2. Connecting WooCommerce and BTCPay Server")]),t("ul",[t("li",[t("a",{attrs:{href:"#21-connect-using-the-api-key-wizard-recommended"}},[e._v("2.1 Connect using the API key wizard (recommended)")])]),t("li",[t("a",{attrs:{href:"#22-connect-by-manually-creating-the-api-key-and-permissions"}},[e._v("2.2 Connect by manually creating the API key and permissions")])])])]),t("li",[t("a",{attrs:{href:"#3-testing-the-checkout"}},[e._v("3. Testing the checkout")])]),t("li",[t("a",{attrs:{href:"#4-customizing-btcpay-woocommerce-v2"}},[e._v("4. Customizing BTCPay WooCommerce V2")]),t("ul",[t("li",[t("a",{attrs:{href:"#41-global-settings"}},[e._v("4.1 Global Settings")])]),t("li",[t("a",{attrs:{href:"#42-payment-gateway-specific"}},[e._v("4.2 Payment Gateway specific")])])])]),t("li",[t("a",{attrs:{href:"#troubleshooting"}},[e._v("Troubleshooting")]),t("ul",[t("li",[t("a",{attrs:{href:"#error-call-to-undefined-function-btcpayserver-http-curl-init"}},[e._v("Error: Call to undefined function BTCPayServer\\Http\\curl_init()")])]),t("li",[t("a",{attrs:{href:"#the-order-states-do-not-update-although-the-invoice-has-been-paid"}},[e._v("The order states do not update although the invoice has been paid")])]),t("li",[t("a",{attrs:{href:"#i-get-an-error-during-checkout-but-not-sure-what-the-problem-is"}},[e._v("I get an error during checkout but not sure what the problem is.")])]),t("li",[t("a",{attrs:{href:"#i-have-troubles-with-using-the-plugin-or-some-other-related-questions"}},[e._v("I have troubles with using the plugin or some other related questions")])]),t("li",[t("a",{attrs:{href:"#create-a-new-api-key"}},[e._v("Create a new API key")])]),t("li",[t("a",{attrs:{href:"#i-messed-around-with-the-webhook-how-to-fix"}},[e._v("I messed around with the webhook, how to fix")])])])]),t("li",[t("a",{attrs:{href:"#deploying-woocommerce-from-btcpay-server"}},[e._v("Deploying WooCommerce from BTCPay Server")])])])]),t("p"),e._v(" "),t("figure",[t("img",{attrs:{src:o(666),alt:"BTCPay - WooCommerce Infographic",title:"BTCPay - WooCommerce Infographic"}})]),e._v(" "),t("p",[e._v("To integrate BTCPay Server into an existing WooCommerce store, follow the steps below and/or watch this video:")]),e._v(" "),t("a",{staticClass:"ytEmbed",staticStyle:{"background-image":"url(https://img.youtube.com/vi/ULcocDKZ1Mw/hqdefault.jpg)"},attrs:{href:"https://www.youtube.com/watch?v=ULcocDKZ1Mw",title:"BTCPay - WooCommerce","data-id":"ULcocDKZ1Mw"}},[t("iframe",{attrs:{title:"BTCPay - WooCommerce","data-src":"https://www.youtube-nocookie.com/embed/ULcocDKZ1Mw?&autoplay=1&autohide=1&modestbranding=1&color=white&rel=0",frameborder:"0",allow:"autoplay;encrypted-media;picture-in-picture",allowfullscreen:""}})]),e._v(" "),t("h2",{attrs:{id:"requirements"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#requirements"}},[e._v("#")]),e._v(" Requirements")]),e._v(" "),t("p",[e._v("Please ensure that you meet the following requirements before installing this plugin.")]),e._v(" "),t("ul",[t("li",[e._v("PHP version 7.4 or newer")]),e._v(" "),t("li",[e._v("The cURL, gd, intl, json, and mbstring PHP extensions are available")]),e._v(" "),t("li",[e._v("A WooCommerce website ("),t("a",{attrs:{href:"https://woocommerce.com/document/installing-uninstalling-woocommerce/",target:"_blank",rel:"noopener noreferrer"}},[e._v("Installation instructions"),t("OutboundLink")],1),e._v(" or "),t("a",{attrs:{href:"#deploying-woocommerce-from-btcpay-server"}},[e._v("directly on BTCPay Server")]),e._v(")")]),e._v(" "),t("li",[e._v("You have a BTCPay Server version 1.3.0 or later, either "),t("RouterLink",{attrs:{to:"/Deployment/"}},[e._v("self-hosted")]),e._v(" or "),t("RouterLink",{attrs:{to:"/Deployment/ThirdPartyHosting/"}},[e._v("hosted by a third-party")])],1),e._v(" "),t("li",[t("RouterLink",{attrs:{to:"/RegisterAccount/"}},[e._v("You've a registered account on the instance")])],1),e._v(" "),t("li",[t("RouterLink",{attrs:{to:"/CreateStore/"}},[e._v("You've a BTCPay store on the instance")])],1),e._v(" "),t("li",[t("RouterLink",{attrs:{to:"/WalletSetup/"}},[e._v("You've a wallet connected to your store")])],1)]),e._v(" "),t("h2",{attrs:{id:"1-install-btcpay-plugin"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#1-install-btcpay-plugin"}},[e._v("#")]),e._v(" 1. Install BTCPay Plugin")]),e._v(" "),t("p",[e._v("There are three ways to "),t("strong",[e._v("download BTCPay for WooCommerce V2 plugin")]),e._v(":")]),e._v(" "),t("ul",[t("li",[e._v("From within WordPress via the Admin Dashboard (recommended, see below)")]),e._v(" "),t("li",[t("a",{attrs:{href:"https://wordpress.org/plugins/btcpay-greenfield-for-woocommerce/",target:"_blank",rel:"noopener noreferrer"}},[e._v("WordPress Repository"),t("OutboundLink")],1)]),e._v(" "),t("li",[t("a",{attrs:{href:"https://github.com/btcpayserver/woocommerce-greenfield-plugin/releases",target:"_blank",rel:"noopener noreferrer"}},[e._v("GitHub Repository"),t("OutboundLink")],1)])]),e._v(" "),t("h3",{attrs:{id:"11-install-plugin-from-wordpress-admin-dashboard-recommended"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#11-install-plugin-from-wordpress-admin-dashboard-recommended"}},[e._v("#")]),e._v(" 1.1 Install plugin from WordPress Admin Dashboard (recommended)")]),e._v(" "),t("ol",[t("li",[e._v("WordPress > Plugins > Add New.")]),e._v(" "),t("li",[e._v('In Search, type "BTCPay V2".')]),e._v(" "),t("li",[e._v("Install and activate.")])]),e._v(" "),t("figure",[t("img",{attrs:{src:o(667),alt:"BTCPay WordPress V2: Plugin installation",title:"BTCPay WordPress V2: Plugin installation"}})]),e._v(" "),t("h3",{attrs:{id:"12-download-and-install-plugin-from-github"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#12-download-and-install-plugin-from-github"}},[e._v("#")]),e._v(" 1.2 Download and install plugin from GitHub")]),e._v(" "),t("p",[t("a",{attrs:{href:"https://github.com/btcpayserver/woocommerce-greenfield-plugin/releases",target:"_blank",rel:"noopener noreferrer"}},[e._v("Download the latest BTCPay plugin"),t("OutboundLink")],1),e._v(", upload it in .zip format to your WordPress site and activate it.")]),e._v(" "),t("a",{staticClass:"ytEmbed",staticStyle:{"background-image":"url(https://img.youtube.com/vi/6QcTWHRKZag/hqdefault.jpg)"},attrs:{href:"https://www.youtube.com/watch?v=6QcTWHRKZag",title:"BTCPay Server Woo Plugin","data-id":"6QcTWHRKZag"}},[t("iframe",{attrs:{title:"BTCPay Server Woo Plugin","data-src":"https://www.youtube-nocookie.com/embed/6QcTWHRKZag?&autoplay=1&autohide=1&modestbranding=1&color=white&rel=0",frameborder:"0",allow:"autoplay;encrypted-media;picture-in-picture",allowfullscreen:""}})]),e._v(" "),t("h2",{attrs:{id:"2-connecting-woocommerce-and-btcpay-server"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#2-connecting-woocommerce-and-btcpay-server"}},[e._v("#")]),e._v(" 2. Connecting WooCommerce and BTCPay Server")]),e._v(" "),t("p",[e._v("BTCPay for WooCommerce V2 plugin is a "),t("strong",[e._v("bridge between your BTCPay Server (payment processor) and your e-commerce store")]),e._v(".\nNo matter if you're using a self-hosted or third-party solution, the connection process is identical.")]),e._v(" "),t("p",[e._v('You can either click on the notifications link saying "'),t("strong",[e._v("please configure the plugin here")]),e._v('" (see screenshot below), or:')]),e._v(" "),t("ul",[t("li",[e._v("Go to your store dashboard.")]),e._v(" "),t("li",[e._v("WooCommerce > Settings.")]),e._v(" "),t("li",[e._v("Click [BTCPay Settings] tab.")])]),e._v(" "),t("figure",[t("img",{attrs:{src:o(668),alt:"BTCPay WordPress V2: Link to BTCPay Settings",title:"BTCPay WordPress V2: Link to BTCPay Settings"}})]),e._v(" "),t("h3",{attrs:{id:"21-connect-using-the-api-key-wizard-recommended"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#21-connect-using-the-api-key-wizard-recommended"}},[e._v("#")]),e._v(" 2.1 Connect using the API key wizard (recommended)")]),e._v(" "),t("ol",[t("li",[t("p",[e._v('In the field "'),t("strong",[e._v("BTCPay Server URL")]),e._v('", enter the full URL of your host (including the https) – https://btcpay.mydomain.com')])]),e._v(" "),t("li",[t("p",[e._v('Click on the button [Generate API key] (you will be redirected to BTCPay Server "Authorization request" page.\n'),t("img",{attrs:{src:o(669),alt:"BTCPay WordPress V2: Link to BTCPay Settings",title:"BTCPay WordPress V2: Link to BTCPay Settings"}})])]),e._v(" "),t("li",[t("p",[e._v("If you are not logged in to your BTCPay Server instance, do so now. (optional)\n"),t("img",{attrs:{src:o(670),alt:"BTCPay WordPress V2: Login to BTCPay Server",title:"BTCPay WordPress V2: Login to BTCPay Server"}})])]),e._v(" "),t("li",[t("p",[e._v("Select the store you want to connect to (if you only have one store it will get autoselected).\n"),t("img",{attrs:{src:o(671),alt:"BTCPay WordPress V2: Select store",title:"BTCPay WordPress V2: Select store"}})])]),e._v(" "),t("li",[t("p",[e._v("All required permissions are prefilled already, you just need to click [Authorize app]\n"),t("img",{attrs:{src:o(672),alt:"BTCPay WordPress V2: Click on authorize app",title:"BTCPay WordPress V2: Click on authorize app"}})])]),e._v(" "),t("li",[t("p",[e._v('You will get redirected back to your WooCommerce store and the API key and Store ID will be prefilled. Additionally, the webhook will have been created automatically for you. Check the "Webhook status" field to show "Webhook setup automatically." followed by an ID.\n'),t("img",{attrs:{src:o(673),alt:"BTCPay WordPress V2: Redirected back to plugin settings",title:"BTCPay WordPress V2: Redirected back to plugin settings"}})])]),e._v(" "),t("li",[t("p",[e._v("Before doing any further configuration click on "),t("strong",[e._v("[Save]")]),e._v(" to be sure all is set.\n"),t("img",{attrs:{src:o(674),alt:"BTCPay WordPress V2: Webhook created",title:"BTCPay WordPress V2: Webhook created"}})])])]),e._v(" "),t("p",[e._v('Congratulations, you are almost set. To make the Bitcoin payment gateway show up on your checkout. In the sidebar go to "WooCommerce" -> "Settings", click on the "Payments" tab and enable the "BTCPay (default)" payment gateway.')]),e._v(" "),t("p",[e._v('Continue with "3. Testing the checkout" below to make sure all works as expected.')]),e._v(" "),t("h3",{attrs:{id:"22-connect-by-manually-creating-the-api-key-and-permissions"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#22-connect-by-manually-creating-the-api-key-and-permissions"}},[e._v("#")]),e._v(" 2.2 Connect by manually creating the API key and permissions")]),e._v(" "),t("p",[e._v("If you can't use the wizard mentioned in the previous section you can also generate the API key manually.")]),e._v(" "),t("ol",[t("li",[e._v("Click on "),t("em",[e._v("[Account]")]),e._v(" -> "),t("em",[e._v("Manage Account")]),e._v(" on the bottom left\n"),t("img",{attrs:{src:o(675),alt:"BTCPay WordPress V2: Manage Account",title:"BTCPay WordPress V2: Manage Account"}})]),e._v(" "),t("li",[e._v("Go to the tab "),t("em",[e._v('"API Keys"')])]),e._v(" "),t("li",[e._v("Click "),t("em",[e._v("[Generate Key]")]),e._v(" to select permissions.\n"),t("img",{attrs:{src:o(676),alt:"BTCPay WordPress V2: API Keys overview",title:"BTCPay WordPress V2: API Keys overview"}})]),e._v(" "),t("li",[e._v("Click on the "),t("em",[e._v('"Select specific stores"')]),e._v(" link for the following permissions: "),t("code",[e._v("View invoices")]),e._v(", "),t("code",[e._v("Create invoice")]),e._v(", "),t("code",[e._v("Modify invoices")]),e._v(", "),t("code",[e._v("Modify stores webhooks")]),e._v(", "),t("code",[e._v("View your stores")]),e._v(", "),t("code",[e._v("Create non-approved pull payments")]),e._v(" (used for refunds)\n"),t("img",{attrs:{src:o(677),alt:"BTCPay WordPress V2: API Keys Permissions",title:"BTCPay WordPress V2: API Keys Permissions"}})]),e._v(" "),t("li",[e._v("Click on "),t("em",[e._v("[Generate API Key]")]),e._v(" "),t("img",{attrs:{src:o(678),alt:"BTCPay WordPress V2: API Keys Save",title:"BTCPay WordPress V2: API Keys Save"}})]),e._v(" "),t("li",[e._v("Copy the generated API Key to your WordPress "),t("em",[e._v("BTCPay Settings")]),e._v(" form (Advanced settings)\n"),t("img",{attrs:{src:o(679),alt:"BTCPay WordPress V2: Copy API Key",title:"BTCPay WordPress V2: Copy API Key"}})]),e._v(" "),t("li",[e._v("Copy the store ID to your WordPress "),t("em",[e._v("BTCPay Settings")]),e._v(" form (Advanced settings)\n"),t("img",{attrs:{src:o(680),alt:"BTCPay WordPress V2: Copy Store ID",title:"BTCPay WordPress V2: Copy Store ID"}})]),e._v(" "),t("li",[e._v("On the BTCPay Settings form:")])]),e._v(" "),t("ul",[t("li",[e._v("Enter "),t("em",[e._v("BTCPay Server URL")]),e._v(" (URL of your BTCPay Server instance, where you just created the API key)")]),e._v(" "),t("li",[e._v('Click the "Advanced settings" checkbox to enter '),t("em",[e._v("BTCPay Server API Key")]),e._v(" and "),t("em",[e._v("Store ID")]),e._v(" (leave "),t("em",[e._v("Webhook secret")]),e._v(" empty)")]),e._v(" "),t("li",[e._v("Click on "),t("em",[e._v("[Save]")]),e._v(" at the bottom of the page\n"),t("img",{attrs:{src:o(681),alt:"BTCPay WordPress V2: Save BTCPay Settings form",title:"BTCPay WordPress V2: Save BTCPay Settings form"}})])]),e._v(" "),t("ol",{attrs:{start:"9"}},[t("li",[e._v('Make sure you see the notification "'),t("em",[e._v("BTCPay Server: Successfully registered a new webhook on BTCPay Server")]),e._v('" and '),t("em",[e._v("Setup status")]),e._v(" and "),t("em",[e._v("Webhook status")]),e._v(" are green.\n"),t("img",{attrs:{src:o(682),alt:"BTCPay WordPress V2: Save BTCPay Settings form saved",title:"BTCPay WordPress V2: Save BTCPay Settings form saved"}})])]),e._v(" "),t("p",[e._v('Congratulations, you are almost set. To make the Bitcoin payment gateway show up on your checkout. In the sidebar go to "WooCommerce" -> "Settings", click on the "Payments" tab and enable the "BTCPay (default)" payment gateway.')]),e._v(" "),t("p",[e._v('Continue with "3. Testing the checkout" below to make sure all works as expected.')]),e._v(" "),t("h2",{attrs:{id:"3-testing-the-checkout"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#3-testing-the-checkout"}},[e._v("#")]),e._v(" 3. Testing the checkout")]),e._v(" "),t("p",[e._v("Making a small test-purchase from your store will give you peace of mind.\nAlways make sure that everything is set up correctly before going live.\nThe final video guides you through the steps of setting a gap limit in your Electrum wallet and testing the checkout process.")]),e._v(" "),t("a",{staticClass:"ytEmbed",staticStyle:{"background-image":"url(https://img.youtube.com/vi/Fi3pYpzGmmo/hqdefault.jpg)"},attrs:{href:"https://www.youtube.com/watch?v=Fi3pYpzGmmo",title:"BTCPay Server Checkout","data-id":"Fi3pYpzGmmo"}},[t("iframe",{attrs:{title:"BTCPay Server Checkout","data-src":"https://www.youtube-nocookie.com/embed/Fi3pYpzGmmo?&autoplay=1&autohide=1&modestbranding=1&color=white&rel=0",frameborder:"0",allow:"autoplay;encrypted-media;picture-in-picture",allowfullscreen:""}})]),e._v(" "),t("h2",{attrs:{id:"4-customizing-btcpay-woocommerce-v2"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#4-customizing-btcpay-woocommerce-v2"}},[e._v("#")]),e._v(" 4. Customizing BTCPay WooCommerce V2")]),e._v(" "),t("h3",{attrs:{id:"41-global-settings"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#41-global-settings"}},[e._v("#")]),e._v(" 4.1 Global Settings")]),e._v(" "),t("p",[e._v("Can be found at "),t("em",[e._v("WooCommerce -> Settings -> Tab [BTCPay Settings]")])]),e._v(" "),t("p",[t("strong",[e._v("BTCPay Server URL")])]),e._v(" "),t("p",[e._v("URL to your BTCPay Server instance, including protocol e.g. "),t("code",[e._v("https://btcpay.yourdomain.com")]),e._v(".")]),e._v(" "),t("p",[t("strong",[e._v("BTCPay API Key")])]),e._v(" "),t("p",[e._v("Your API Key. (Was auto-generated in the steps before).")]),e._v(" "),t("p",[t("strong",[e._v("Store ID")])]),e._v(" "),t("p",[e._v("The store ID of your BTCPay Server store. Can be found on the store settings page.")]),e._v(" "),t("p",[t("strong",[e._v("Default Customer Message")])]),e._v(" "),t("p",[e._v('Here you can customize the customer message shown after selecting BTCPay payment gateway on checkout. This can be overwritten on the payment gateway settings for each gateway if you use the "Separate payment gateways" option.')]),e._v(" "),t("p",[t("strong",[e._v('Invoice pass to "Settled" state after')])]),e._v(" "),t("p",[e._v("Set after how many confirmations a payment is considered fully paid and settled. Defaults to what is configured on BTCPay store settings.")]),e._v(" "),t("p",[t("strong",[e._v("BTCPay Order Statuses")])]),e._v(" "),t("p",[e._v("Depending on your business model and store settings, you may want to configure your order statuses.\nYou can set BTCPay to trigger certain order status in WooCommerce automatically.")]),e._v(" "),t("ul",[t("li",[t("em",[e._v("New")]),e._v(" - order placed, not paid yet.")]),e._v(" "),t("li",[t("em",[e._v("Paid")]),e._v(" - order paid, not enough confirmations on the blockchain, yet.")]),e._v(" "),t("li",[t("em",[e._v("Settled")]),e._v(" - order paid, confirmed on the blockchain.")]),e._v(" "),t("li",[t("em",[e._v("Settled (paid over)")]),e._v(" - order paid, confirmed on the blockchain but paid over.")]),e._v(" "),t("li",[t("em",[e._v("Invalid")]),e._v(" - order paid, did not get a sufficient number of confirmations in a pre-defined time-frame set in BTCPay store settings, or manually marked invalid.")]),e._v(" "),t("li",[t("em",[e._v("Expired")]),e._v(" - invoice expired, order not paid.")]),e._v(" "),t("li",[t("em",[e._v("Expired with partial payment")]),e._v(" - invoice expired and paid partially")])]),e._v(" "),t("p",[e._v('Take time to think about how you wish to automate these statuses.\nIf you do not wish certain BTCPay status to trigger WooCommerce order status, you can leave it as default "- no mapping / defaults -".')]),e._v(" "),t("p",[e._v('Note: you should keep the "Settled" order status to "- no mapping / defaults-" if you sell digital and physical products. For digital products WooCommerce will automatically skip the "Processing" status and go directly to "Completed" for those orders only containing digital products.')]),e._v(" "),t("p",[e._v('Another example, if a merchant wants to send an email notifying the customer that the payment has been received, but the order will be processed upon confirmation, the merchant would have to set order status for "Paid" to "On hold". Then, the merchant would have to customize and trigger email for "On hold" status of the order in WooCommerce.')]),e._v(" "),t("p",[e._v("It takes some time to find a perfect formula, so users should test things out before going live.")]),e._v(" "),t("p",[t("strong",[e._v("Modal checkout")])]),e._v(" "),t("p",[e._v("Enable this option if you want the BTCPay Server invoice to be shown directly on the checkout page (and do not redirect customers to your BTCPay Server instance).")]),e._v(" "),t("p",[t("strong",[e._v("Separate Payment Gateways")])]),e._v(" "),t("p",[e._v("If this option is enabled the plugin will generate one separate payment gateway per supported payment method on BTCPay Server. E.g. if you have BTC, LightningNetwork and maybe Liquid Assets enabled on your BTCPay Server store, then you will have a separate gateway available for each. This allows many new use cases like discount per gateway or country based restrictions. More details "),t("RouterLink",{attrs:{to:"/FAQ/Integrations/#how-to-configure-additional-token-support"}},[e._v("here")]),e._v(".")],1),e._v(" "),t("p",[t("strong",[e._v("Send customer data to BTCPayServer")])]),e._v(" "),t("p",[e._v("By default "),t("em",[e._v("no")]),e._v(" customer data beside email is sent to BTCPay Server. If you want to send customer address data to BTCPay Server you can enable it here.")]),e._v(" "),t("p",[t("strong",[e._v("Debug Log")])]),e._v(" "),t("p",[e._v("This option is helpful in case you have a problem and need more information on what is going on. The logs can be then found under WooCommerce -> Status -> Log. Make sure you disable this again after debugging as it will fill up your filesystem with logs.")]),e._v(" "),t("h3",{attrs:{id:"42-payment-gateway-specific"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#42-payment-gateway-specific"}},[e._v("#")]),e._v(" 4.2 Payment Gateway specific")]),e._v(" "),t("p",[e._v('Depending on wheter you have above mentioned "Separate Payment Gateways" enabled you will have one or more Payment Gateways available to configure in the payment gateway settings via '),t("em",[e._v("WooCommerce -> Settings -> Tab [Payments]")])]),e._v(" "),t("p",[e._v("On all payment gateways you can set the following options:")]),e._v(" "),t("p",[t("strong",[e._v("Title")]),e._v('\nThe shown payment gateway text on the checkout page. Defaults to "BTCPay (Bitcoin, Lightning Network, ...)".')]),e._v(" "),t("p",[t("strong",[e._v("Customer Message")])]),e._v(" "),t("p",[e._v("Here you can customize message shown after selecting BTCPay payment gateway.")]),e._v(" "),t("p",[t("strong",[e._v("Gateway Icon")])]),e._v(" "),t("p",[e._v("Upload or select a custom icon to be shown next to the payment gateway during checkout. Defaults to BTCPay logo.")]),e._v(" "),t("h4",{attrs:{id:"421-btcpay-default"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#421-btcpay-default"}},[e._v("#")]),e._v(" 4.2.1 BTCPay (default)")]),e._v(" "),t("p",[e._v("Additional options only available for the default payment gateway:")]),e._v(" "),t("p",[t("strong",[e._v("Enforce payment tokens")])]),e._v(" "),t("p",[e._v('With "Separate Payment Gateways" feature enabled in BTCPay Settings you can use this option to enforce only payment tokens. This means that the created invoice will '),t("em",[e._v("only")]),e._v(' include tokens of type "payment" and '),t("em",[e._v("not any")]),e._v(' of type "promotion". See difference of token types '),t("RouterLink",{attrs:{to:"/FAQ/Integrations/#how-to-configure-additional-token-support#token-types"}},[e._v("here")])],1),e._v(" "),t("h4",{attrs:{id:"422-separate-payment-gateways"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#422-separate-payment-gateways"}},[e._v("#")]),e._v(" 4.2.2 Separate Payment Gateways")]),e._v(" "),t("p",[e._v("Additional options only available for the separate payment gateways (if that feature is enabled):")]),e._v(" "),t("p",[t("strong",[e._v("Token Type")])]),e._v(" "),t("p",[e._v('By default type "payment" is selected. But if you have Liquid Assets with your own issued asset/token (e.g. used as voucher) you can select "promotion" here. Those are processed differently than normal payment tokens. Details can be found '),t("RouterLink",{attrs:{to:"/FAQ/Integrations/#how-to-configure-additional-token-support#promotional-tokens-100-discount"}},[e._v("here")])],1),e._v(" "),t("h2",{attrs:{id:"troubleshooting"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#troubleshooting"}},[e._v("#")]),e._v(" Troubleshooting")]),e._v(" "),t("h3",{attrs:{id:"error-call-to-undefined-function-btcpayserver-http-curl-init"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#error-call-to-undefined-function-btcpayserver-http-curl-init"}},[e._v("#")]),e._v(" Error: Call to undefined function BTCPayServer\\Http\\curl_init()")]),e._v(" "),t("p",[e._v("Please make sure your PHP version supports the cURL extension (as written in the requirements above). You can install it on Debian/Ubuntu by running the command "),t("code",[e._v("sudo apt install php-curl")]),e._v(".")]),e._v(" "),t("h3",{attrs:{id:"the-order-states-do-not-update-although-the-invoice-has-been-paid"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#the-order-states-do-not-update-although-the-invoice-has-been-paid"}},[e._v("#")]),e._v(" The order states do not update although the invoice has been paid")]),e._v(" "),t("p",[e._v("Please check first if the webhook is created under the BTCPay Server store settings. If there is no webhook created you can visit on your WooCommerce store BTCPay Settings tab under WooCommerce settings and hit the save button. This will create the webhook.")]),e._v(" "),t("p",[e._v('You may also check the details of your invoice if there were any errors on sending the webhook request. Some hosting providers, firewall setups or WordPress security plugins (like Wordfence) block POST requests to your WordPress site which lead to a http status of "403 Forbidden" or "503 Service Unavailable".')]),e._v(" "),t("p",[e._v("You can check and verify yourself if there is something blocking requests to your site in one of these two ways:")]),e._v(" "),t("p",[t("strong",[e._v("Check using a command line (Linux or MacOS):")]),e._v("\n(replace EXAMPLE.COM with your WordPress site URL)")]),e._v(" "),t("div",{staticClass:"language- extra-class"},[t("pre",{pre:!0,attrs:{class:"language-text"}},[t("code",[e._v('curl -vX POST -H "Content-Type: application/json" \\\n -d \'{"data": "test"}\' https://EXAMPLE.COM/?wc-api=btcpaygf_default\n')])])]),t("p",[e._v('On the response, if you see that line "HTTP/1.1 500" or "HTTP/2 500" and the message "Webhook request validation failed" that means that your site is not blocking the request with a "403 Forbidden".')]),e._v(" "),t("div",{staticClass:"language- extra-class"},[t("pre",{pre:!0,attrs:{class:"language-text"}},[t("code",[e._v('.... snip ....\n* We are completely uploaded and fine\n< HTTP/2 500\n< server: nginx\n< date: Sun, 05 Jun 2022 16:55:08 GMT\n< content-type: application/json; charset=UTF-8\n< x-powered-by: PHP/8.1.6\n< expires: Wed, 11 Jan 1984 05:00:00 GMT\n< cache-control: no-cache, must-revalidate, max-age=0\n<\n* Connection #0 to host example.com left intact\n{"code":"wp_die","message":"Webhook request validation failed.","data":{"status":500},"additional_errors":[]}\n')])])]),t("p",[e._v('On the other side, if you see that line "HTTP/1.1 403 Forbidden" or "HTTP/2 403" then something is blocking data sent to your WordPress site. You should ask your hosting provider or make sure no firewall or plugin is blocking the requests.')]),e._v(" "),t("div",{staticClass:"language- extra-class"},[t("pre",{pre:!0,attrs:{class:"language-text"}},[t("code",[e._v(".... snip ....\n* upload completely sent off: 16 out of 16 bytes\n< HTTP/1.1 403 Forbidden\n< access-control-allow-origin: *\n< Content-Type: application/json; charset=UTF-8\n< X-Cloud-Trace-Context: 4f07d5b2e5c2f05949d04421a8e2dd6a\n< Date: Thu, 17 Feb 2022 10:06:50 GMT\n< Server: Google Frontend\n< Content-Length: 26\n")])])]),t("p",[t("strong",[e._v("Check using an online service (if you do not have a command line available:")])]),e._v(" "),t("ul",[t("li",[e._v("Go to "),t("a",{attrs:{href:"https://reqbin.com/post-online",target:"_blank",rel:"noopener noreferrer"}},[e._v("https://reqbin.com/post-online"),t("OutboundLink")],1)]),e._v(" "),t("li",[e._v("Enter your domain: "),t("code",[e._v("https://EXAMPLE.COM/?wc-api=btcpaygf_default")]),e._v("\n(replace EXAMPLE.COM with your WordPress site URL)")]),e._v(" "),t("li",[e._v('Make sure "POST" is selected')]),e._v(" "),t("li",[e._v("Click [Send]")])]),e._v(" "),t("figure",[t("img",{attrs:{src:o(683),alt:"BTCPay WordPress V2: Debug 403 error with reqbin.com",title:"BTCPay WordPress V2: Debug 403 error with reqbin.com"}})]),e._v(" "),t("p",[e._v('If you see "Status 403 (Forbidden)" then POST requests to your site are blocked for some reason. You should ask your hosting provider or make sure no firewall or plugin is blocking the requests.')]),e._v(" "),t("h3",{attrs:{id:"i-get-an-error-during-checkout-but-not-sure-what-the-problem-is"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#i-get-an-error-during-checkout-but-not-sure-what-the-problem-is"}},[e._v("#")]),e._v(" I get an error during checkout but not sure what the problem is.")]),e._v(" "),t("p",[e._v("In your BTCPay Settings in your admin dashboard: "),t("em",[e._v("WooCommerce -> Settings: Tab [BTCPay Settings]")]),e._v(" you can enable debug mode by setting the checkbox on that option.")]),e._v(" "),t("p",[e._v("You can now find more detailed Logs when you click the [View Logs] button or you go to "),t("em",[e._v("WooCommerce -> Status: Tab [Logs]")]),e._v(" and select the most recent btcpay logs.")]),e._v(" "),t("div",{staticClass:"custom-block warning"},[t("p",{staticClass:"custom-block-title"},[e._v("Warning")]),e._v(" "),t("p",[e._v("Please make sure that you disable the debugging mode again after you finished investigating, otherwise your site performance may be impacted and also write lots of logging data in your filesystem for no reason.")])]),e._v(" "),t("p",[e._v("Additionally you can also look into your webservers error logs if you find any error that is related to BTCPay plugin.")]),e._v(" "),t("h3",{attrs:{id:"i-have-troubles-with-using-the-plugin-or-some-other-related-questions"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#i-have-troubles-with-using-the-plugin-or-some-other-related-questions"}},[e._v("#")]),e._v(" I have troubles with using the plugin or some other related questions")]),e._v(" "),t("p",[e._v("Feel free to join our support channel over at "),t("a",{attrs:{href:"https://chat.btcpayserver.org/",target:"_blank",rel:"noopener noreferrer"}},[e._v("https://chat.btcpayserver.org/"),t("OutboundLink")],1),e._v(" if you need help or have any further questions.")]),e._v(" "),t("h3",{attrs:{id:"create-a-new-api-key"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#create-a-new-api-key"}},[e._v("#")]),e._v(" Create a new API key")]),e._v(" "),t("p",[e._v("If you have been using the WooCommerce V2 plugin prior to version 2.0.0, your API key won't have the required permissions to issue refunds via pull-payments. If you want to use that feature, you can create a new API key (editing an API key is not currently supported). You can use the above described "),t("a",{attrs:{href:"#21-connect-using-the-api-key-wizard--recommended-"}},[e._v("2.1 Connect using API key wizard")]),e._v(" or the "),t("a",{attrs:{href:"#22-connect-by-manually-creating-the-api-key-and-permissions"}},[e._v("manual API key generation")]),e._v(". The configured webhook will continue to work, and no change is needed.")]),e._v(" "),t("h3",{attrs:{id:"i-messed-around-with-the-webhook-how-to-fix"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#i-messed-around-with-the-webhook-how-to-fix"}},[e._v("#")]),e._v(" I messed around with the webhook, how to fix")]),e._v(" "),t("p",[e._v("Suppose you accidentally changed the WooCommerce webhook, and it is not working anymore. In that case, you can quickly force a re-creation of it when you delete the API key on BTCPay Server and then go to the BTCPay Server Settings (on your WordPress site) and hit save again. You should see a message that the webhook was successfully created.")]),e._v(" "),t("h2",{attrs:{id:"deploying-woocommerce-from-btcpay-server"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#deploying-woocommerce-from-btcpay-server"}},[e._v("#")]),e._v(" Deploying WooCommerce from BTCPay Server")]),e._v(" "),t("p",[e._v("If you already have BTCPay Server, you can very easily start WooCommerce from your existing environment.")]),e._v(" "),t("ol",[t("li",[t("p",[e._v("Point the external IP of the virtual machine where your BTCPay is hosted to your store domain, for example store.yourdomain.com.")])]),e._v(" "),t("li",[t("p",[e._v("Log into your BTCPay server as root.")])])]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token function"}},[e._v("sudo")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("su")]),e._v(" -\n")])])]),t("ol",{attrs:{start:"3"}},[t("li",[e._v("Set up WooCommerce variables. You can add "),t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver-docker/blob/master/docker-compose-generator/docker-fragments/opt-add-woocommerce.yml",target:"_blank",rel:"noopener noreferrer"}},[e._v("optional variables"),t("OutboundLink")],1),e._v(" as well.")])]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("export")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[e._v("BTCPAYGEN_ADDITIONAL_FRAGMENTS")]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"'),t("span",{pre:!0,attrs:{class:"token variable"}},[e._v("$BTCPAYGEN_ADDITIONAL_FRAGMENTS")]),e._v(';opt-add-woocommerce"')]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("export")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[e._v("WOOCOMMERCE_HOST")]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"yourstoredomain.com"')]),e._v("\n")])])]),t("ol",{attrs:{start:"4"}},[t("li",[e._v("Lastly, just run BTCPay Setup script which will add the set up variables.")])]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v(".")]),e._v(" ./btcpay-setup.sh "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-i")]),e._v("\n")])])]),t("ol",{attrs:{start:"5"}},[t("li",[e._v("Go to your store's domain name, in our example that's store.yourdomain.com and follow the WordPress installation wizard.")])])])}),[],!1,null,null,null);t.default=r.exports}}]); \ No newline at end of file diff --git a/assets/js/150.ad767002.js b/assets/js/150.bf1b20f8.js similarity index 94% rename from assets/js/150.ad767002.js rename to assets/js/150.bf1b20f8.js index f56c041bed..f3f994b9c5 100644 --- a/assets/js/150.ad767002.js +++ b/assets/js/150.bf1b20f8.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[150],{816:function(t,e,o){"use strict";o.r(e);var a=o(10),n=Object(a.a)({},(function(){var t=this,e=t._self._c;return e("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[e("h1",{attrs:{id:"reporting-in-btcpay"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#reporting-in-btcpay"}},[t._v("#")]),t._v(" Reporting in BTCPay")]),t._v(" "),e("p",[t._v("BTCPay Server offers several tools that make "),e("strong",[t._v("cryptocurrency bookkeeping")]),t._v(" easier.\nReporting will allow you to visualize and export CSV data of your store.")]),t._v(" "),e("p",[t._v("A report consist of table of tabular data along with some useful aggregates.")]),t._v(" "),e("p",[t._v("You can find the following reports:")]),t._v(" "),e("ul",[e("li",[t._v("On-Chain Wallets: Each line show you the on-chain transactions affecting your wallet.")]),t._v(" "),e("li",[t._v("Products Sold: Each line represents a quantity of item sold. This is useful if you are using Point of Sale or Crowdfunding.")]),t._v(" "),e("li",[t._v("Payments: Each line represents an accounted payment to an invoice.")])])])}),[],!1,null,null,null);e.default=n.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[150],{809:function(t,e,o){"use strict";o.r(e);var a=o(10),n=Object(a.a)({},(function(){var t=this,e=t._self._c;return e("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[e("h1",{attrs:{id:"reporting-in-btcpay"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#reporting-in-btcpay"}},[t._v("#")]),t._v(" Reporting in BTCPay")]),t._v(" "),e("p",[t._v("BTCPay Server offers several tools that make "),e("strong",[t._v("cryptocurrency bookkeeping")]),t._v(" easier.\nReporting will allow you to visualize and export CSV data of your store.")]),t._v(" "),e("p",[t._v("A report consist of table of tabular data along with some useful aggregates.")]),t._v(" "),e("p",[t._v("You can find the following reports:")]),t._v(" "),e("ul",[e("li",[t._v("On-Chain Wallets: Each line show you the on-chain transactions affecting your wallet.")]),t._v(" "),e("li",[t._v("Products Sold: Each line represents a quantity of item sold. This is useful if you are using Point of Sale or Crowdfunding.")]),t._v(" "),e("li",[t._v("Payments: Each line represents an accounted payment to an invoice.")])])])}),[],!1,null,null,null);e.default=n.exports}}]); \ No newline at end of file diff --git a/assets/js/151.958964df.js b/assets/js/151.029cf3a4.js similarity index 96% rename from assets/js/151.958964df.js rename to assets/js/151.029cf3a4.js index 71c69adc4a..2582d2897b 100644 --- a/assets/js/151.958964df.js +++ b/assets/js/151.029cf3a4.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[151],{814:function(t,e,a){"use strict";a.r(e);var r=a(10),o=Object(r.a)({},(function(){var t=this,e=t._self._c;return e("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[e("h1",{attrs:{id:"shopware-integration"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#shopware-integration"}},[t._v("#")]),t._v(" Shopware integration")]),t._v(" "),e("div",{staticClass:"custom-block warning"},[e("p",{staticClass:"custom-block-title"},[t._v("WARNING")]),t._v(" "),e("p",[t._v("Please be aware that those two integrations are not maintained by the BTCPay Server team. If you have any questions, please go to their GitHub issues and contact them directly.")])]),t._v(" "),e("h2",{attrs:{id:"plugin-for-shopware-6"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#plugin-for-shopware-6"}},[t._v("#")]),t._v(" Plugin for Shopware 6")]),t._v(" "),e("p",[t._v("Find it on the "),e("a",{attrs:{href:"https://store.shopware.com/en/coinc71249255720f/accept-bitcoin-and-lightning-payments-via-btcpay-server.html",target:"_blank",rel:"noopener noreferrer"}},[t._v("Shopware store"),e("OutboundLink")],1),t._v(" or download it on "),e("a",{attrs:{href:"https://github.com/coincharge-io/CoinchargeBTCPayShopware",target:"_blank",rel:"noopener noreferrer"}},[t._v("GitHub"),e("OutboundLink")],1)]),t._v(" "),e("h2",{attrs:{id:"plugin-for-shopware-5"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#plugin-for-shopware-5"}},[t._v("#")]),t._v(" Plugin for Shopware 5")]),t._v(" "),e("p",[t._v("Download it on "),e("a",{attrs:{href:"https://github.com/lampsolutions/LampSBtcPayShopware",target:"_blank",rel:"noopener noreferrer"}},[t._v("GitHub"),e("OutboundLink")],1)])])}),[],!1,null,null,null);e.default=o.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[151],{812:function(t,e,a){"use strict";a.r(e);var r=a(10),o=Object(r.a)({},(function(){var t=this,e=t._self._c;return e("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[e("h1",{attrs:{id:"shopware-integration"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#shopware-integration"}},[t._v("#")]),t._v(" Shopware integration")]),t._v(" "),e("div",{staticClass:"custom-block warning"},[e("p",{staticClass:"custom-block-title"},[t._v("WARNING")]),t._v(" "),e("p",[t._v("Please be aware that those two integrations are not maintained by the BTCPay Server team. If you have any questions, please go to their GitHub issues and contact them directly.")])]),t._v(" "),e("h2",{attrs:{id:"plugin-for-shopware-6"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#plugin-for-shopware-6"}},[t._v("#")]),t._v(" Plugin for Shopware 6")]),t._v(" "),e("p",[t._v("Find it on the "),e("a",{attrs:{href:"https://store.shopware.com/en/coinc71249255720f/accept-bitcoin-and-lightning-payments-via-btcpay-server.html",target:"_blank",rel:"noopener noreferrer"}},[t._v("Shopware store"),e("OutboundLink")],1),t._v(" or download it on "),e("a",{attrs:{href:"https://github.com/coincharge-io/CoinchargeBTCPayShopware",target:"_blank",rel:"noopener noreferrer"}},[t._v("GitHub"),e("OutboundLink")],1)]),t._v(" "),e("h2",{attrs:{id:"plugin-for-shopware-5"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#plugin-for-shopware-5"}},[t._v("#")]),t._v(" Plugin for Shopware 5")]),t._v(" "),e("p",[t._v("Download it on "),e("a",{attrs:{href:"https://github.com/lampsolutions/LampSBtcPayShopware",target:"_blank",rel:"noopener noreferrer"}},[t._v("GitHub"),e("OutboundLink")],1)])])}),[],!1,null,null,null);e.default=o.exports}}]); \ No newline at end of file diff --git a/assets/js/152.34fe673d.js b/assets/js/152.0c137c64.js similarity index 97% rename from assets/js/152.34fe673d.js rename to assets/js/152.0c137c64.js index 21e6a002f3..f68e10bc04 100644 --- a/assets/js/152.34fe673d.js +++ b/assets/js/152.0c137c64.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[152],{817:function(e,t,r){"use strict";r.r(t);var o=r(10),a=Object(o.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"support"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#support"}},[e._v("#")]),e._v(" Support")]),e._v(" "),t("p",[e._v("This project is open source and is not a company. Instead "),t("strong",[e._v("we rely on a network of contributors and users to provide support")]),e._v(".")]),e._v(" "),t("h2",{attrs:{id:"free-support"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#free-support"}},[e._v("#")]),e._v(" Free support")]),e._v(" "),t("p",[e._v("Problem? Don't worry. Someone else has probably been through that before you.")]),e._v(" "),t("ul",[t("li",[t("p",[e._v("First have a look at our "),t("RouterLink",{attrs:{to:"/"}},[e._v("user documentation")]),e._v(" and "),t("RouterLink",{attrs:{to:"/FAQ/"}},[e._v("Frequently Asked Questions")]),e._v(".")],1)]),e._v(" "),t("li",[t("p",[e._v("If your issue is not referenced there, or you want to request a new feature, please open a "),t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver/issues",target:"_blank",rel:"noopener noreferrer"}},[e._v("github issue"),t("OutboundLink")],1),e._v(".")])]),e._v(" "),t("li",[t("p",[e._v("If you have more general questions about BTCPay, the way it works and why you should use it, you're welcome on our "),t("a",{attrs:{href:"https://chat.btcpayserver.org/",target:"_blank",rel:"noopener noreferrer"}},[e._v("Mattermost Chat"),t("OutboundLink")],1),e._v(" or "),t("a",{attrs:{href:"https://t.me/btcpayserver",target:"_blank",rel:"noopener noreferrer"}},[e._v("Telegram"),t("OutboundLink")],1)])])]),e._v(" "),t("p",[e._v("Getting proper support also depends on how you formulate your questions. Read our "),t("RouterLink",{attrs:{to:"/Troubleshooting/"}},[e._v("troubleshooting guidelines")]),e._v(".")],1),e._v(" "),t("h2",{attrs:{id:"paid-support"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#paid-support"}},[e._v("#")]),e._v(" Paid support")]),e._v(" "),t("p",[e._v("As we are an Open Source project, someone in the community might want to help.\nTherefore we've facilitated a channel on our Mattermost to find these talents.")]),e._v(" "),t("p",[e._v("Check out our "),t("code",[e._v("Freelance")]),e._v(" channel on Mattermost.\n"),t("a",{attrs:{href:"https://chat.btcpayserver.org/btcpayserver/channels/freelance-jobs",target:"_blank",rel:"noopener noreferrer"}},[e._v("Mattermost Chat"),t("OutboundLink")],1)]),e._v(" "),t("div",{staticClass:"custom-block danger"},[t("p",{staticClass:"custom-block-title"},[e._v("DANGER")]),e._v(" "),t("p",[t("strong",[e._v("BTCPay Server is and will not guarantee or vouch for any support.")])])])])}),[],!1,null,null,null);t.default=a.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[152],{813:function(e,t,r){"use strict";r.r(t);var o=r(10),a=Object(o.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"support"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#support"}},[e._v("#")]),e._v(" Support")]),e._v(" "),t("p",[e._v("This project is open source and is not a company. Instead "),t("strong",[e._v("we rely on a network of contributors and users to provide support")]),e._v(".")]),e._v(" "),t("h2",{attrs:{id:"free-support"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#free-support"}},[e._v("#")]),e._v(" Free support")]),e._v(" "),t("p",[e._v("Problem? Don't worry. Someone else has probably been through that before you.")]),e._v(" "),t("ul",[t("li",[t("p",[e._v("First have a look at our "),t("RouterLink",{attrs:{to:"/"}},[e._v("user documentation")]),e._v(" and "),t("RouterLink",{attrs:{to:"/FAQ/"}},[e._v("Frequently Asked Questions")]),e._v(".")],1)]),e._v(" "),t("li",[t("p",[e._v("If your issue is not referenced there, or you want to request a new feature, please open a "),t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver/issues",target:"_blank",rel:"noopener noreferrer"}},[e._v("github issue"),t("OutboundLink")],1),e._v(".")])]),e._v(" "),t("li",[t("p",[e._v("If you have more general questions about BTCPay, the way it works and why you should use it, you're welcome on our "),t("a",{attrs:{href:"https://chat.btcpayserver.org/",target:"_blank",rel:"noopener noreferrer"}},[e._v("Mattermost Chat"),t("OutboundLink")],1),e._v(" or "),t("a",{attrs:{href:"https://t.me/btcpayserver",target:"_blank",rel:"noopener noreferrer"}},[e._v("Telegram"),t("OutboundLink")],1)])])]),e._v(" "),t("p",[e._v("Getting proper support also depends on how you formulate your questions. Read our "),t("RouterLink",{attrs:{to:"/Troubleshooting/"}},[e._v("troubleshooting guidelines")]),e._v(".")],1),e._v(" "),t("h2",{attrs:{id:"paid-support"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#paid-support"}},[e._v("#")]),e._v(" Paid support")]),e._v(" "),t("p",[e._v("As we are an Open Source project, someone in the community might want to help.\nTherefore we've facilitated a channel on our Mattermost to find these talents.")]),e._v(" "),t("p",[e._v("Check out our "),t("code",[e._v("Freelance")]),e._v(" channel on Mattermost.\n"),t("a",{attrs:{href:"https://chat.btcpayserver.org/btcpayserver/channels/freelance-jobs",target:"_blank",rel:"noopener noreferrer"}},[e._v("Mattermost Chat"),t("OutboundLink")],1)]),e._v(" "),t("div",{staticClass:"custom-block danger"},[t("p",{staticClass:"custom-block-title"},[e._v("DANGER")]),e._v(" "),t("p",[t("strong",[e._v("BTCPay Server is and will not guarantee or vouch for any support.")])])])])}),[],!1,null,null,null);t.default=a.exports}}]); \ No newline at end of file diff --git a/assets/js/153.26cfb61a.js b/assets/js/153.4ba8b4de.js similarity index 98% rename from assets/js/153.26cfb61a.js rename to assets/js/153.4ba8b4de.js index 90b2e76d7f..9165391115 100644 --- a/assets/js/153.26cfb61a.js +++ b/assets/js/153.4ba8b4de.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[153],{819:function(e,t,a){"use strict";a.r(t);var r=a(10),i=Object(r.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"tickettailor-plugin-for-btcpayserver"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#tickettailor-plugin-for-btcpayserver"}},[e._v("#")]),e._v(" TicketTailor plugin for BTCPayServer")]),e._v(" "),t("p",[e._v("This plugin allows you to integrate "),t("a",{attrs:{href:"https://www.tickettailor.com/",target:"_blank",rel:"noopener noreferrer"}},[e._v("TicketTailor"),t("OutboundLink")],1),e._v(" with BTCPay Server.\nIt allows you to sell tickets for your events and accept payments in Bitcoin.")]),e._v(" "),t("h2",{attrs:{id:"installation"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#installation"}},[e._v("#")]),e._v(" Installation")]),e._v(" "),t("ol",[t("li",[e._v("Install the plugin from Plugins=>Add New=> TicketTailor")]),e._v(" "),t("li",[e._v("Restart BTCPay Server")]),e._v(" "),t("li",[e._v("Go to your Ticket Tailor account and add a "),t("a",{attrs:{href:"https://app.tickettailor.com/box-office/api#dpop=/box-office/api-key/add",target:"_blank",rel:"noopener noreferrer"}},[e._v("new API key"),t("OutboundLink")],1),e._v(" with "),t("code",[e._v("Admin")]),e._v(' role and "hide personal data from responses" unchecked.')]),e._v(" "),t("li",[e._v("Go back to your BTCPay Server, choose the store to integrate with and click on Ticket Tailor in the navigation.")]),e._v(" "),t("li",[e._v("Enter the API Key and save.")]),e._v(" "),t("li",[e._v("Now you should be able to select your Ticket tailor events in the dropdown. One selected, click save.")]),e._v(" "),t("li",[e._v('You should now have a "ticket purchase" button on your store\'s page. Clicking it will take you to the btcpayserver event purchase page.')])]),e._v(" "),t("h2",{attrs:{id:"flow"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#flow"}},[e._v("#")]),e._v(" Flow")]),e._v(" "),t("p",[e._v("When a customer goes to the ticket purchase page, they can enter a name and must enter an email. Ticket Tailor requires a full name, so we generate one if not specified.\nAfter the tickets are selected, the customer is redirected to the BTCPay Server checkout page, and a hold for the selected tickets is created to reserve the tickets for this customer. After the payment is sent, the customer is redirected to a custom receipt page where they can see their tickets. Tickets are only issued AFTER an invoice is settled. If an invoice is set to invalid or expired, the hold is deleted and the tickets are released for sale again.")]),e._v(" "),t("h2",{attrs:{id:"additional-configuration"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#additional-configuration"}},[e._v("#")]),e._v(" Additional Configuration")]),e._v(" "),t("p",[e._v("You should configure the "),t("RouterLink",{attrs:{to:"/Notifications/#store-emails"}},[e._v("SMTP email settings in the store")]),e._v(" so that users receive the ticket link by email after an invoice is settled.\nYou're also able to override ticket names, prices and description on the BTCPay Server side.")],1),e._v(" "),t("h2",{attrs:{id:"secret-tickets"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#secret-tickets"}},[e._v("#")]),e._v(" Secret Tickets")]),e._v(" "),t("p",[e._v("You can configure a ticket on ticket tailor to require an access code. BTCPay Server allows you to add "),t("code",[e._v("?accessCode=XXXX")]),e._v(" to the ticket purchase page url to allow customers to view and purchase these secret tickets.")])])}),[],!1,null,null,null);t.default=i.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[153],{815:function(e,t,a){"use strict";a.r(t);var r=a(10),i=Object(r.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"tickettailor-plugin-for-btcpayserver"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#tickettailor-plugin-for-btcpayserver"}},[e._v("#")]),e._v(" TicketTailor plugin for BTCPayServer")]),e._v(" "),t("p",[e._v("This plugin allows you to integrate "),t("a",{attrs:{href:"https://www.tickettailor.com/",target:"_blank",rel:"noopener noreferrer"}},[e._v("TicketTailor"),t("OutboundLink")],1),e._v(" with BTCPay Server.\nIt allows you to sell tickets for your events and accept payments in Bitcoin.")]),e._v(" "),t("h2",{attrs:{id:"installation"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#installation"}},[e._v("#")]),e._v(" Installation")]),e._v(" "),t("ol",[t("li",[e._v("Install the plugin from Plugins=>Add New=> TicketTailor")]),e._v(" "),t("li",[e._v("Restart BTCPay Server")]),e._v(" "),t("li",[e._v("Go to your Ticket Tailor account and add a "),t("a",{attrs:{href:"https://app.tickettailor.com/box-office/api#dpop=/box-office/api-key/add",target:"_blank",rel:"noopener noreferrer"}},[e._v("new API key"),t("OutboundLink")],1),e._v(" with "),t("code",[e._v("Admin")]),e._v(' role and "hide personal data from responses" unchecked.')]),e._v(" "),t("li",[e._v("Go back to your BTCPay Server, choose the store to integrate with and click on Ticket Tailor in the navigation.")]),e._v(" "),t("li",[e._v("Enter the API Key and save.")]),e._v(" "),t("li",[e._v("Now you should be able to select your Ticket tailor events in the dropdown. One selected, click save.")]),e._v(" "),t("li",[e._v('You should now have a "ticket purchase" button on your store\'s page. Clicking it will take you to the btcpayserver event purchase page.')])]),e._v(" "),t("h2",{attrs:{id:"flow"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#flow"}},[e._v("#")]),e._v(" Flow")]),e._v(" "),t("p",[e._v("When a customer goes to the ticket purchase page, they can enter a name and must enter an email. Ticket Tailor requires a full name, so we generate one if not specified.\nAfter the tickets are selected, the customer is redirected to the BTCPay Server checkout page, and a hold for the selected tickets is created to reserve the tickets for this customer. After the payment is sent, the customer is redirected to a custom receipt page where they can see their tickets. Tickets are only issued AFTER an invoice is settled. If an invoice is set to invalid or expired, the hold is deleted and the tickets are released for sale again.")]),e._v(" "),t("h2",{attrs:{id:"additional-configuration"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#additional-configuration"}},[e._v("#")]),e._v(" Additional Configuration")]),e._v(" "),t("p",[e._v("You should configure the "),t("RouterLink",{attrs:{to:"/Notifications/#store-emails"}},[e._v("SMTP email settings in the store")]),e._v(" so that users receive the ticket link by email after an invoice is settled.\nYou're also able to override ticket names, prices and description on the BTCPay Server side.")],1),e._v(" "),t("h2",{attrs:{id:"secret-tickets"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#secret-tickets"}},[e._v("#")]),e._v(" Secret Tickets")]),e._v(" "),t("p",[e._v("You can configure a ticket on ticket tailor to require an access code. BTCPay Server allows you to add "),t("code",[e._v("?accessCode=XXXX")]),e._v(" to the ticket purchase page url to allow customers to view and purchase these secret tickets.")])])}),[],!1,null,null,null);t.default=i.exports}}]); \ No newline at end of file diff --git a/assets/js/154.fb40fffe.js b/assets/js/154.ef49082a.js similarity index 99% rename from assets/js/154.fb40fffe.js rename to assets/js/154.ef49082a.js index 8e7e6f37fc..217e4b2f82 100644 --- a/assets/js/154.fb40fffe.js +++ b/assets/js/154.ef49082a.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[154],{820:function(e,t,a){"use strict";a.r(t);var r=a(10),i=Object(r.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"btctransmuter-docs"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#btctransmuter-docs"}},[e._v("#")]),e._v(" BtcTransmuter Docs")]),e._v(" "),t("h2",{attrs:{id:"introduction-what-is-btctransmuter"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#introduction-what-is-btctransmuter"}},[e._v("#")]),e._v(" Introduction - What is BtcTransmuter?")]),e._v(" "),t("p",[e._v("BtcTransmuter is a free, open-source & self-hosted tool that allows you to configure actions that execute automatically upon specified conditions. Its primary focus is the integration of cryptocurrency services to help users manage their funds and business workflow.")]),e._v(" "),t("h2",{attrs:{id:"how-does-it-work"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#how-does-it-work"}},[e._v("#")]),e._v(" How does it work?")]),e._v(" "),t("p",[e._v("There are 3 main components in BtcTransmuter - External Services, Recipes and Extensions.")]),e._v(" "),t("ul",[t("li",[e._v("External services integrated with third parties, such as a BTCPayServer instance or a Cryptocurrency Exchange.")]),e._v(" "),t("li",[e._v("Recipes is a set of instructions created by the user: What to execute and when. The execution part is called a Recipe Action while the condition is called a Recipe Trigger. An action could be "),t("code",[e._v("Send an Email using the SMTP External Service")]),e._v(" and the trigger being "),t("code",[e._v("If a new invoice was created on my BtcPay External Service")])]),e._v(" "),t("li",[e._v("Extensions provide a way to add more external service types, actions and triggers without needing to modify the original code.")])]),e._v(" "),t("h2",{attrs:{id:"can-i-use-this-in-production"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#can-i-use-this-in-production"}},[e._v("#")]),e._v(" Can I use this in production")]),e._v(" "),t("p",[e._v("This project is still in early development and most likely has some bugs and quirks that need to be ironed out. The project is considered to be in ALPHA state, meaning not all desired functionality has been implemented and there can be breaking changes.")]),e._v(" "),t("h2",{attrs:{id:"how-do-i-deploy"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#how-do-i-deploy"}},[e._v("#")]),e._v(" How do I deploy?")]),e._v(" "),t("p",[e._v("If you set up BTCPay using any "),t("RouterLink",{attrs:{to:"/Docker/"}},[e._v("dockerized install method")]),e._v(", you can enable BTC Transmuter easily.")],1),e._v(" "),t("p",[e._v("First, "),t("a",{attrs:{href:"https://github.com/JeffVandrewJr/patron/blob/master/SSH.md",target:"_blank",rel:"noopener noreferrer"}},[e._v("SSH"),t("OutboundLink")],1),e._v(" into your server.\nThen run the following commands:")]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token function"}},[e._v("sudo")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("su")]),e._v(" -\n"),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("cd")]),e._v(" btcpayserver-docker\n"),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("export")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[e._v("BTCPAYGEN_ADDITIONAL_FRAGMENTS")]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"'),t("span",{pre:!0,attrs:{class:"token variable"}},[e._v("$BTCPAYGEN_ADDITIONAL_FRAGMENTS")]),e._v(';opt-add-btctransmuter"')]),e._v("\n\n"),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v(".")]),e._v(" ./btcpay-setup.sh "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-i")]),e._v("\n")])])]),t("p",[e._v("If you have trouble starting your server after running the setup command, verify you have "),t("RouterLink",{attrs:{to:"/FAQ/FAQ-Deployment/#how-can-i-modify-or-deactivate-environment-variables"}},[e._v("added the environment variable")]),e._v(" correctly to enable Transmuter.")],1),e._v(" "),t("p",[e._v("Once completed, your Transmuter will be available at your configured BTCPay website under "),t("code",[e._v("/btctransmuter/")]),e._v(", where the first account to register becomes the Transmuter admin. Open that link in your browser and you’ll see the homepage.")]),e._v(" "),t("h2",{attrs:{id:"what-extensions-are-provided"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#what-extensions-are-provided"}},[e._v("#")]),e._v(" What extensions are provided?")]),e._v(" "),t("p",[e._v("You can see a list of built-in extensions once you log into your transmuter application under "),t("code",[e._v("/extensions")]),e._v(".")]),e._v(" "),t("p",[e._v("Currently there are 12 extensions that come bundled with the main application:")]),e._v(" "),t("ul",[t("li",[e._v("Tor - Provides TOR access to your Transmuter app")]),e._v(" "),t("li",[e._v("Presets - Provides one page wizards for quick setups of common scenarios")]),e._v(" "),t("li",[e._v("BtcPayServer - Provides you a way to interact with BTCPayServer stores")]),e._v(" "),t("li",[e._v("Email - Provides you with a way to check a POP3 for incoming emails and a way to send Email via SMTP")]),e._v(" "),t("li",[e._v("Exchange - Provides you a way to connect to a variety of exchanges and place orders on them")]),e._v(" "),t("li",[e._v("Lightning - Provides you interoperability with lightning nodes to be able to do basic channel and invoice management")]),e._v(" "),t("li",[e._v("NBXplorer - Provides you ways to detect incoming funds, send funds, and generate addresses.")]),e._v(" "),t("li",[e._v("Operators - Lets you create conditional workflows")]),e._v(" "),t("li",[e._v("Recipe - Lets you manage existing or create recipes with your workflows")]),e._v(" "),t("li",[e._v("Timer - Run X every Y")]),e._v(" "),t("li",[e._v("WebHook - Trigger Recipes with an http call or execute external web hooks with a recipe")])]),e._v(" "),t("h2",{attrs:{id:"what-preset-recipes-are-provided"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#what-preset-recipes-are-provided"}},[e._v("#")]),e._v(" What preset recipes are provided?")]),e._v(" "),t("p",[e._v("Currently there are three preset recipes that you can enable easily. In addition to the list below, you can create your own recipes for automating other tasks.")]),e._v(" "),t("ol",[t("li",[e._v("On-chain Forwarder - Forward funds from a wallet elsewhere")]),e._v(" "),t("li",[t("RouterLink",{attrs:{to:"/Transmuter/EmailReceiptsPreset/"}},[e._v("BTCPay Email Receipts")]),e._v(" - Send an email when a BTCPay invoice gets paid")],1),e._v(" "),t("li",[e._v("Fiat Conversion - Convert incoming money to fiat on an exchange by market selling when BTCPay invoice statuses change.")]),e._v(" "),t("li",[t("RouterLink",{attrs:{to:"/Transmuter/DCA/"}},[e._v("Dollar Cost Average")]),e._v(" - Schedule daily purchases of Bitcoin")],1)]),e._v(" "),t("h2",{attrs:{id:"how-do-i-write-an-extension"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#how-do-i-write-an-extension"}},[e._v("#")]),e._v(" How do I write an extension?")]),e._v(" "),t("p",[e._v("An extension must be its own .net core class library project that references "),t("code",[e._v("BtcTransmuter.Abstractions")]),e._v("\nThere must be a class implementing "),t("code",[e._v("BtcTransmuterExtension")]),e._v(" in this library. This file bootstraps the plugin name and adds all the services to system on startup.")]),e._v(" "),t("h3",{attrs:{id:"adding-a-trigger"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#adding-a-trigger"}},[e._v("#")]),e._v(" Adding a Trigger")]),e._v(" "),t("ul",[t("li",[t("p",[e._v("Implement "),t("code",[e._v("BaseTrigger")]),e._v(" This class will be used to transport the event data")])]),e._v(" "),t("li",[t("p",[e._v("Implement "),t("code",[e._v("BaseTriggerHandler")]),e._v(" This handles:")]),e._v(" "),t("ul",[t("li",[e._v("Describing the trigger to the main system.")]),e._v(" "),t("li",[e._v("Telling the main UI how to create/edit a recipe trigger using it.")]),e._v(" "),t("li",[e._v("The logic needed to see if a trigger is...triggered.")])]),e._v(" "),t("p",[e._v("You will see that "),t("code",[e._v("BaseTriggerHandler")]),e._v(" has 2 generic arguments, a "),t("code",[e._v("Data")]),e._v(" and "),t("code",[e._v("Parameters")]),e._v(" "),t("code",[e._v("Data")]),e._v(" is the trigger that that was detected, while "),t("code",[e._v("Parameters")]),e._v(" is the data from a Recipe to see if it triggers its actions.")])]),e._v(" "),t("li",[t("p",[e._v("Implement a Partial View (named as the same value as the property "),t("code",[e._v("ViewPartial")]),e._v(" in the "),t("code",[e._v("BaseTriggerHandler")]),e._v(" implementation)\nThis handles displaying the trigger settings in a recipe")])]),e._v(" "),t("li",[t("p",[e._v("Implement a Controller that allows a user to create/edit the necessary data to set the trigger on a recipe.")])])]),e._v(" "),t("h3",{attrs:{id:"adding-an-action"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#adding-an-action"}},[e._v("#")]),e._v(" Adding an Action")]),e._v(" "),t("ul",[t("li",[t("p",[e._v("Implement "),t("code",[e._v("BaseActionHandler")]),e._v(" This handles:")]),e._v(" "),t("ul",[t("li",[e._v("Describing the action to the main system.")]),e._v(" "),t("li",[e._v("Telling the main UI how to create/edit a recipe action using it.")]),e._v(" "),t("li",[e._v("The logic needed to execute the action")])]),e._v(" "),t("p",[e._v("You will see that "),t("code",[e._v("BaseActionHandler")]),e._v(" has a generic argument, "),t("code",[e._v("Data")]),e._v(" "),t("code",[e._v("Data")]),e._v(" is the type of the action that holds the payload needed to exeucte the action through the instructions of recipe action")])]),e._v(" "),t("li",[t("p",[e._v("Implement a Partial View (named as the same value as the property "),t("code",[e._v("ViewPartial")]),e._v(" in the "),t("code",[e._v("BaseActionHandler")]),e._v(" implementation)\nThis handles displaying the action settings in a recipe")])]),e._v(" "),t("li",[t("p",[e._v("Implement a Controller that allows a user to create/edit the necessary data to set the action on a recipe.")])])]),e._v(" "),t("h3",{attrs:{id:"adding-an-external-service"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#adding-an-external-service"}},[e._v("#")]),e._v(" Adding an External Service")]),e._v(" "),t("ul",[t("li",[e._v("Implement "),t("code",[e._v("BaseExternalService")]),e._v(" & "),t("code",[e._v("IExternalServiceDescriptor")])]),e._v(" "),t("li",[e._v("Implement a Partial View (named as the same value as the property "),t("code",[e._v("ViewPartial")]),e._v(" in the "),t("code",[e._v("IExternalServiceDescriptor")]),e._v(" implementation)")]),e._v(" "),t("li",[e._v("Implement a Controller that allows a user to create/edit the necessary data for an external service.")])])])}),[],!1,null,null,null);t.default=i.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[154],{818:function(e,t,a){"use strict";a.r(t);var r=a(10),i=Object(r.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"btctransmuter-docs"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#btctransmuter-docs"}},[e._v("#")]),e._v(" BtcTransmuter Docs")]),e._v(" "),t("h2",{attrs:{id:"introduction-what-is-btctransmuter"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#introduction-what-is-btctransmuter"}},[e._v("#")]),e._v(" Introduction - What is BtcTransmuter?")]),e._v(" "),t("p",[e._v("BtcTransmuter is a free, open-source & self-hosted tool that allows you to configure actions that execute automatically upon specified conditions. Its primary focus is the integration of cryptocurrency services to help users manage their funds and business workflow.")]),e._v(" "),t("h2",{attrs:{id:"how-does-it-work"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#how-does-it-work"}},[e._v("#")]),e._v(" How does it work?")]),e._v(" "),t("p",[e._v("There are 3 main components in BtcTransmuter - External Services, Recipes and Extensions.")]),e._v(" "),t("ul",[t("li",[e._v("External services integrated with third parties, such as a BTCPayServer instance or a Cryptocurrency Exchange.")]),e._v(" "),t("li",[e._v("Recipes is a set of instructions created by the user: What to execute and when. The execution part is called a Recipe Action while the condition is called a Recipe Trigger. An action could be "),t("code",[e._v("Send an Email using the SMTP External Service")]),e._v(" and the trigger being "),t("code",[e._v("If a new invoice was created on my BtcPay External Service")])]),e._v(" "),t("li",[e._v("Extensions provide a way to add more external service types, actions and triggers without needing to modify the original code.")])]),e._v(" "),t("h2",{attrs:{id:"can-i-use-this-in-production"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#can-i-use-this-in-production"}},[e._v("#")]),e._v(" Can I use this in production")]),e._v(" "),t("p",[e._v("This project is still in early development and most likely has some bugs and quirks that need to be ironed out. The project is considered to be in ALPHA state, meaning not all desired functionality has been implemented and there can be breaking changes.")]),e._v(" "),t("h2",{attrs:{id:"how-do-i-deploy"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#how-do-i-deploy"}},[e._v("#")]),e._v(" How do I deploy?")]),e._v(" "),t("p",[e._v("If you set up BTCPay using any "),t("RouterLink",{attrs:{to:"/Docker/"}},[e._v("dockerized install method")]),e._v(", you can enable BTC Transmuter easily.")],1),e._v(" "),t("p",[e._v("First, "),t("a",{attrs:{href:"https://github.com/JeffVandrewJr/patron/blob/master/SSH.md",target:"_blank",rel:"noopener noreferrer"}},[e._v("SSH"),t("OutboundLink")],1),e._v(" into your server.\nThen run the following commands:")]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token function"}},[e._v("sudo")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("su")]),e._v(" -\n"),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("cd")]),e._v(" btcpayserver-docker\n"),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("export")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[e._v("BTCPAYGEN_ADDITIONAL_FRAGMENTS")]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"'),t("span",{pre:!0,attrs:{class:"token variable"}},[e._v("$BTCPAYGEN_ADDITIONAL_FRAGMENTS")]),e._v(';opt-add-btctransmuter"')]),e._v("\n\n"),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v(".")]),e._v(" ./btcpay-setup.sh "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-i")]),e._v("\n")])])]),t("p",[e._v("If you have trouble starting your server after running the setup command, verify you have "),t("RouterLink",{attrs:{to:"/FAQ/FAQ-Deployment/#how-can-i-modify-or-deactivate-environment-variables"}},[e._v("added the environment variable")]),e._v(" correctly to enable Transmuter.")],1),e._v(" "),t("p",[e._v("Once completed, your Transmuter will be available at your configured BTCPay website under "),t("code",[e._v("/btctransmuter/")]),e._v(", where the first account to register becomes the Transmuter admin. Open that link in your browser and you’ll see the homepage.")]),e._v(" "),t("h2",{attrs:{id:"what-extensions-are-provided"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#what-extensions-are-provided"}},[e._v("#")]),e._v(" What extensions are provided?")]),e._v(" "),t("p",[e._v("You can see a list of built-in extensions once you log into your transmuter application under "),t("code",[e._v("/extensions")]),e._v(".")]),e._v(" "),t("p",[e._v("Currently there are 12 extensions that come bundled with the main application:")]),e._v(" "),t("ul",[t("li",[e._v("Tor - Provides TOR access to your Transmuter app")]),e._v(" "),t("li",[e._v("Presets - Provides one page wizards for quick setups of common scenarios")]),e._v(" "),t("li",[e._v("BtcPayServer - Provides you a way to interact with BTCPayServer stores")]),e._v(" "),t("li",[e._v("Email - Provides you with a way to check a POP3 for incoming emails and a way to send Email via SMTP")]),e._v(" "),t("li",[e._v("Exchange - Provides you a way to connect to a variety of exchanges and place orders on them")]),e._v(" "),t("li",[e._v("Lightning - Provides you interoperability with lightning nodes to be able to do basic channel and invoice management")]),e._v(" "),t("li",[e._v("NBXplorer - Provides you ways to detect incoming funds, send funds, and generate addresses.")]),e._v(" "),t("li",[e._v("Operators - Lets you create conditional workflows")]),e._v(" "),t("li",[e._v("Recipe - Lets you manage existing or create recipes with your workflows")]),e._v(" "),t("li",[e._v("Timer - Run X every Y")]),e._v(" "),t("li",[e._v("WebHook - Trigger Recipes with an http call or execute external web hooks with a recipe")])]),e._v(" "),t("h2",{attrs:{id:"what-preset-recipes-are-provided"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#what-preset-recipes-are-provided"}},[e._v("#")]),e._v(" What preset recipes are provided?")]),e._v(" "),t("p",[e._v("Currently there are three preset recipes that you can enable easily. In addition to the list below, you can create your own recipes for automating other tasks.")]),e._v(" "),t("ol",[t("li",[e._v("On-chain Forwarder - Forward funds from a wallet elsewhere")]),e._v(" "),t("li",[t("RouterLink",{attrs:{to:"/Transmuter/EmailReceiptsPreset/"}},[e._v("BTCPay Email Receipts")]),e._v(" - Send an email when a BTCPay invoice gets paid")],1),e._v(" "),t("li",[e._v("Fiat Conversion - Convert incoming money to fiat on an exchange by market selling when BTCPay invoice statuses change.")]),e._v(" "),t("li",[t("RouterLink",{attrs:{to:"/Transmuter/DCA/"}},[e._v("Dollar Cost Average")]),e._v(" - Schedule daily purchases of Bitcoin")],1)]),e._v(" "),t("h2",{attrs:{id:"how-do-i-write-an-extension"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#how-do-i-write-an-extension"}},[e._v("#")]),e._v(" How do I write an extension?")]),e._v(" "),t("p",[e._v("An extension must be its own .net core class library project that references "),t("code",[e._v("BtcTransmuter.Abstractions")]),e._v("\nThere must be a class implementing "),t("code",[e._v("BtcTransmuterExtension")]),e._v(" in this library. This file bootstraps the plugin name and adds all the services to system on startup.")]),e._v(" "),t("h3",{attrs:{id:"adding-a-trigger"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#adding-a-trigger"}},[e._v("#")]),e._v(" Adding a Trigger")]),e._v(" "),t("ul",[t("li",[t("p",[e._v("Implement "),t("code",[e._v("BaseTrigger")]),e._v(" This class will be used to transport the event data")])]),e._v(" "),t("li",[t("p",[e._v("Implement "),t("code",[e._v("BaseTriggerHandler")]),e._v(" This handles:")]),e._v(" "),t("ul",[t("li",[e._v("Describing the trigger to the main system.")]),e._v(" "),t("li",[e._v("Telling the main UI how to create/edit a recipe trigger using it.")]),e._v(" "),t("li",[e._v("The logic needed to see if a trigger is...triggered.")])]),e._v(" "),t("p",[e._v("You will see that "),t("code",[e._v("BaseTriggerHandler")]),e._v(" has 2 generic arguments, a "),t("code",[e._v("Data")]),e._v(" and "),t("code",[e._v("Parameters")]),e._v(" "),t("code",[e._v("Data")]),e._v(" is the trigger that that was detected, while "),t("code",[e._v("Parameters")]),e._v(" is the data from a Recipe to see if it triggers its actions.")])]),e._v(" "),t("li",[t("p",[e._v("Implement a Partial View (named as the same value as the property "),t("code",[e._v("ViewPartial")]),e._v(" in the "),t("code",[e._v("BaseTriggerHandler")]),e._v(" implementation)\nThis handles displaying the trigger settings in a recipe")])]),e._v(" "),t("li",[t("p",[e._v("Implement a Controller that allows a user to create/edit the necessary data to set the trigger on a recipe.")])])]),e._v(" "),t("h3",{attrs:{id:"adding-an-action"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#adding-an-action"}},[e._v("#")]),e._v(" Adding an Action")]),e._v(" "),t("ul",[t("li",[t("p",[e._v("Implement "),t("code",[e._v("BaseActionHandler")]),e._v(" This handles:")]),e._v(" "),t("ul",[t("li",[e._v("Describing the action to the main system.")]),e._v(" "),t("li",[e._v("Telling the main UI how to create/edit a recipe action using it.")]),e._v(" "),t("li",[e._v("The logic needed to execute the action")])]),e._v(" "),t("p",[e._v("You will see that "),t("code",[e._v("BaseActionHandler")]),e._v(" has a generic argument, "),t("code",[e._v("Data")]),e._v(" "),t("code",[e._v("Data")]),e._v(" is the type of the action that holds the payload needed to exeucte the action through the instructions of recipe action")])]),e._v(" "),t("li",[t("p",[e._v("Implement a Partial View (named as the same value as the property "),t("code",[e._v("ViewPartial")]),e._v(" in the "),t("code",[e._v("BaseActionHandler")]),e._v(" implementation)\nThis handles displaying the action settings in a recipe")])]),e._v(" "),t("li",[t("p",[e._v("Implement a Controller that allows a user to create/edit the necessary data to set the action on a recipe.")])])]),e._v(" "),t("h3",{attrs:{id:"adding-an-external-service"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#adding-an-external-service"}},[e._v("#")]),e._v(" Adding an External Service")]),e._v(" "),t("ul",[t("li",[e._v("Implement "),t("code",[e._v("BaseExternalService")]),e._v(" & "),t("code",[e._v("IExternalServiceDescriptor")])]),e._v(" "),t("li",[e._v("Implement a Partial View (named as the same value as the property "),t("code",[e._v("ViewPartial")]),e._v(" in the "),t("code",[e._v("IExternalServiceDescriptor")]),e._v(" implementation)")]),e._v(" "),t("li",[e._v("Implement a Controller that allows a user to create/edit the necessary data for an external service.")])])])}),[],!1,null,null,null);t.default=i.exports}}]); \ No newline at end of file diff --git a/assets/js/155.88a5fe98.js b/assets/js/155.2d656ec0.js similarity index 97% rename from assets/js/155.88a5fe98.js rename to assets/js/155.2d656ec0.js index 5c59973a6f..8551fbbf7c 100644 --- a/assets/js/155.88a5fe98.js +++ b/assets/js/155.2d656ec0.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[155],{822:function(e,t,a){"use strict";a.r(t);var o=a(10),r=Object(o.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"trocador"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#trocador"}},[e._v("#")]),e._v(" Trocador")]),e._v(" "),t("p",[e._v("A plugin for BTCPay Server for users to pay invoices at checkout using a different cryptocurrency. Trocador is an exchange aggregator that offers excellent rates to users while providing them strong privacy.")]),e._v(" "),t("h2",{attrs:{id:"use-cases-and-features"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#use-cases-and-features"}},[e._v("#")]),e._v(" Use Cases and Features")]),e._v(" "),t("ul",[t("li",[e._v("Allow customers to pay with whichever asset they prefer.")]),e._v(" "),t("li",[e._v("Settle these purchases in your wallet of choice (Bitcoin, Monero, etc).")]),e._v(" "),t("li",[e._v('Choose a custom plugin name that is displayed to the user (default is "Altcoins Trocador").')]),e._v(" "),t("li",[e._v("Choose a default payment currency that is shown to the user (eg: Ethereum), and the user can choose a different one.")]),e._v(" "),t("li",[e._v("Optionally show Trocador to the customer first in the invoice by default.")]),e._v(" "),t("li",[e._v("Optionally provide a referral code to earn a portion of the volume.")])]),e._v(" "),t("h2",{attrs:{id:"caveats"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#caveats"}},[e._v("#")]),e._v(" Caveats")]),e._v(" "),t("p",[t("strong",[e._v("We recommend setting the invoice expiry timer to at least 120 minutes.")]),e._v(' This can be done by clicking on "Settings", and then editing the value in General for "Invoice expires if the full amount has not been paid after …" to 120 or larger. Most exchanges complete in about 10 minutes but the slowest may take up to a day, depending on network congestion and/or exchange delays.')]),e._v(" "),t("p",[e._v("We recommend not selecting lightning network as the default wallet to receive payments from Trocador, as this may worsen conversion rates and reduce the number of coins accepted.")]),e._v(" "),t("h2",{attrs:{id:"compatibility"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#compatibility"}},[e._v("#")]),e._v(" Compatibility")]),e._v(" "),t("p",[e._v("We recommend only enabling one checkout plugin (eg: only enabling Trocador, not also enabling SideShift and/or FixedFloat).")]),e._v(" "),t("h2",{attrs:{id:"how-to-activate"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#how-to-activate"}},[e._v("#")]),e._v(" How to activate")]),e._v(" "),t("p",[e._v('In the server dashboard, click on "Manage Plugins", then click the "Install" button after Trocador.')])])}),[],!1,null,null,null);t.default=r.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[155],{821:function(e,t,a){"use strict";a.r(t);var o=a(10),r=Object(o.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"trocador"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#trocador"}},[e._v("#")]),e._v(" Trocador")]),e._v(" "),t("p",[e._v("A plugin for BTCPay Server for users to pay invoices at checkout using a different cryptocurrency. Trocador is an exchange aggregator that offers excellent rates to users while providing them strong privacy.")]),e._v(" "),t("h2",{attrs:{id:"use-cases-and-features"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#use-cases-and-features"}},[e._v("#")]),e._v(" Use Cases and Features")]),e._v(" "),t("ul",[t("li",[e._v("Allow customers to pay with whichever asset they prefer.")]),e._v(" "),t("li",[e._v("Settle these purchases in your wallet of choice (Bitcoin, Monero, etc).")]),e._v(" "),t("li",[e._v('Choose a custom plugin name that is displayed to the user (default is "Altcoins Trocador").')]),e._v(" "),t("li",[e._v("Choose a default payment currency that is shown to the user (eg: Ethereum), and the user can choose a different one.")]),e._v(" "),t("li",[e._v("Optionally show Trocador to the customer first in the invoice by default.")]),e._v(" "),t("li",[e._v("Optionally provide a referral code to earn a portion of the volume.")])]),e._v(" "),t("h2",{attrs:{id:"caveats"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#caveats"}},[e._v("#")]),e._v(" Caveats")]),e._v(" "),t("p",[t("strong",[e._v("We recommend setting the invoice expiry timer to at least 120 minutes.")]),e._v(' This can be done by clicking on "Settings", and then editing the value in General for "Invoice expires if the full amount has not been paid after …" to 120 or larger. Most exchanges complete in about 10 minutes but the slowest may take up to a day, depending on network congestion and/or exchange delays.')]),e._v(" "),t("p",[e._v("We recommend not selecting lightning network as the default wallet to receive payments from Trocador, as this may worsen conversion rates and reduce the number of coins accepted.")]),e._v(" "),t("h2",{attrs:{id:"compatibility"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#compatibility"}},[e._v("#")]),e._v(" Compatibility")]),e._v(" "),t("p",[e._v("We recommend only enabling one checkout plugin (eg: only enabling Trocador, not also enabling SideShift and/or FixedFloat).")]),e._v(" "),t("h2",{attrs:{id:"how-to-activate"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#how-to-activate"}},[e._v("#")]),e._v(" How to activate")]),e._v(" "),t("p",[e._v('In the server dashboard, click on "Manage Plugins", then click the "Install" button after Trocador.')])])}),[],!1,null,null,null);t.default=r.exports}}]); \ No newline at end of file diff --git a/assets/js/156.0c2a40a9.js b/assets/js/156.2e2bda0f.js similarity index 99% rename from assets/js/156.0c2a40a9.js rename to assets/js/156.2e2bda0f.js index ac4ea51033..dce50d5fff 100644 --- a/assets/js/156.0c2a40a9.js +++ b/assets/js/156.2e2bda0f.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[156],{824:function(e,t,r){"use strict";r.r(t);var o=r(10),n=Object(o.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"troubleshooting-an-issue-in-btcpay-server"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#troubleshooting-an-issue-in-btcpay-server"}},[e._v("#")]),e._v(" Troubleshooting an issue in BTCPay Server")]),e._v(" "),t("p",[e._v("Facing a problem is never fun. This document explains the most common workflow and steps you should take to "),t("strong",[e._v("identify the issue")]),e._v(" you're having more easily and hopefully solve it yourself or with community help.")]),e._v(" "),t("p",[e._v("Identifying the problem is crucial.")]),e._v(" "),t("h2",{attrs:{id:"1-replicating-the-issue"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#1-replicating-the-issue"}},[e._v("#")]),e._v(" 1. Replicating the issue")]),e._v(" "),t("p",[e._v("First and foremost, try to determine when the issue happens.\nTry to replicate the problem.\nTry to update and restart your server to verify you can reproduce your issue.\nIf you think it will describe your issue better, take a screenshot.")]),e._v(" "),t("h3",{attrs:{id:"11-updating-the-server"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#11-updating-the-server"}},[e._v("#")]),e._v(" 1.1 Updating the server")]),e._v(" "),t("p",[e._v("Check "),t("RouterLink",{attrs:{to:"/FAQ/ServerSettings/#how-can-i-see-my-btcpay-version"}},[e._v("your version of BTCPay")]),e._v(".\nIf it is much older than the "),t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver/releases",target:"_blank",rel:"noopener noreferrer"}},[e._v("latest version"),t("OutboundLink")],1),e._v(" of BTCPay, "),t("RouterLink",{attrs:{to:"/FAQ/ServerSettings/#how-to-update-btcpay-server"}},[e._v("updating your server")]),e._v(" may resolve the issue.")],1),e._v(" "),t("h3",{attrs:{id:"12-restarting-the-server"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#12-restarting-the-server"}},[e._v("#")]),e._v(" 1.2 Restarting the server")]),e._v(" "),t("p",[e._v("Restarting your server is an easy way to solve many of the most common BTCPay Server issues.\nYou may need to "),t("RouterLink",{attrs:{to:"/FAQ/ServerSettings/#how-to-ssh-into-my-btcpay-running-on-vps"}},[e._v("SSH into your server")]),e._v(" to restart it.")],1),e._v(" "),t("h3",{attrs:{id:"13-restarting-a-service"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#13-restarting-a-service"}},[e._v("#")]),e._v(" 1.3 Restarting a service")]),e._v(" "),t("p",[e._v("Some issues you may only need to restart a particular service in your BTCPay Server deployment.\nSuch as restarting the letsencrypt container to renew the SSL certificate.")]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token function"}},[e._v("sudo")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("su")]),e._v(" -\n"),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("cd")]),e._v(" btcpayserver-docker\n"),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("docker")]),e._v(" restart letsencrypt-nginx-proxy-companion\n")])])]),t("p",[e._v("Use "),t("code",[e._v("docker ps")]),e._v(" to find the name of a different service you would like to restart.")]),e._v(" "),t("h2",{attrs:{id:"2-looking-through-the-logs"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#2-looking-through-the-logs"}},[e._v("#")]),e._v(" 2. Looking through the logs")]),e._v(" "),t("p",[e._v("Logs can provide an essential piece of information.\nIn the next few paragraphs, we will describe how to get the "),t("strong",[e._v("log information for various parts of BTCPay")]),e._v(".")]),e._v(" "),t("h3",{attrs:{id:"21-btcpay-logs"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#21-btcpay-logs"}},[e._v("#")]),e._v(" 2.1 BTCPay Logs")]),e._v(" "),t("p",[e._v("Since the v1.0.3.8, you can easily access BTCPay Server logs from the front-end.\nIf you are a server admin, go to "),t("strong",[e._v("Server Settings > Logs")]),e._v(" and open the logs file.\nIf you don't know what a particular error in the logs means, make sure to mention it when troubleshooting.")]),e._v(" "),t("p",[e._v("If you would like more detailed logs and you're using a Docker deployment, you can view logs of specific Docker containers using the command line.\nSee these "),t("RouterLink",{attrs:{to:"/FAQ/ServerSettings/#how-to-ssh-into-my-btcpay-running-on-vps"}},[e._v("instructions to ssh")]),e._v(" into an instance of BTCPay running on a VPS.")],1),e._v(" "),t("p",[e._v("Below is a general list of the container names used for BTCPay.")]),e._v(" "),t("table",[t("thead",[t("tr",[t("th",[e._v("LOGS FOR")]),e._v(" "),t("th",{staticStyle:{"text-align":"center"}},[e._v("CONTAINER NAME")])])]),e._v(" "),t("tbody",[t("tr",[t("td",[e._v("BTCPayServer")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[e._v("generated_btcpayserver_1")])]),e._v(" "),t("tr",[t("td",[e._v("NBXplorer")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[e._v("generated_nbxplorer_1")])]),e._v(" "),t("tr",[t("td",[e._v("Bitcoind")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[e._v("btcpayserver_bitcoind")])]),e._v(" "),t("tr",[t("td",[e._v("Postgres")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[e._v("generated_postgres_1")])]),e._v(" "),t("tr",[t("td",[e._v("proxy")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[e._v("letsencrypt-nginx-proxy-companion")])]),e._v(" "),t("tr",[t("td",[e._v("Nginx")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[e._v("nginx-gen")])]),e._v(" "),t("tr",[t("td",[e._v("Nginx")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[e._v("nginx")])]),e._v(" "),t("tr",[t("td",[e._v("Core Lightning (CLN)")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[e._v("btcpayserver_clightning_bitcoin")])]),e._v(" "),t("tr",[t("td",[e._v("LND")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[e._v("btcpayserver_lnd_bitcoin")])]),e._v(" "),t("tr",[t("td",[e._v("RTL")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[e._v("generated_lnd_bitcoin_rtl_1")])]),e._v(" "),t("tr",[t("td",[e._v("Thunderhub")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[e._v("generated_bitcoin_thub_1")])]),e._v(" "),t("tr",[t("td",[e._v("LibrePatron")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[e._v("librepatron")])]),e._v(" "),t("tr",[t("td",[e._v("Tor")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[e._v("tor-gen")])]),e._v(" "),t("tr",[t("td",[e._v("Tor")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[e._v("tor")])])])]),e._v(" "),t("p",[e._v("Run the commands below to print logs by container name.\nReplace the container name to view other container logs.")]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token function"}},[e._v("sudo")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("su")]),e._v(" -\n"),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("cd")]),e._v(" btcpayserver-docker\n"),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("docker")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("ps")]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("docker")]),e._v(" logs "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("--tail")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token number"}},[e._v("100")]),e._v(" generated_btcpayserver_1\n")])])]),t("h3",{attrs:{id:"22-lightning-network-logs"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#22-lightning-network-logs"}},[e._v("#")]),e._v(" 2.2 Lightning Network Logs")]),e._v(" "),t("p",[e._v("Use the following if you're having a problem with the Lightning Network.")]),e._v(" "),t("h3",{attrs:{id:"221-lightning-network-lnd-docker"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#221-lightning-network-lnd-docker"}},[e._v("#")]),e._v(" 2.2.1 - Lightning Network LND - Docker")]),e._v(" "),t("p",[e._v("There are a few ways to access your LND logs when using Docker.\nFirst log in as root:")]),e._v(" "),t("p",[t("code",[e._v("sudo su -")])]),e._v(" "),t("p",[e._v("Navigate to the correct directory:")]),e._v(" "),t("p",[t("code",[e._v("cd btcpayserver-docker")])]),e._v(" "),t("p",[e._v("Find container name:")]),e._v(" "),t("p",[t("code",[e._v("docker ps")])]),e._v(" "),t("p",[e._v("Print logs by container name:")]),e._v(" "),t("p",[t("code",[e._v("docker logs --tail 100 btcpayserver_lnd_bitcoin")])]),e._v(" "),t("p",[e._v("Alternatively, you can quickly print logs by using container ID (only the first unique ID characters are needed, such as the two furthest left characters):")]),e._v(" "),t("p",[t("code",[e._v("docker logs 'add your container ID '")])]),e._v(" "),t("p",[e._v("If for any reason you need more logs")]),e._v(" "),t("p",[t("code",[e._v("sudo su -")])]),e._v(" "),t("p",[t("code",[e._v("cd /var/lib/docker/volumes/generated_lnd_bitcoin_datadir/_data/logs/bitcoin/mainnet/")])]),e._v(" "),t("p",[e._v("inside that directory do "),t("code",[e._v("ls")])]),e._v(" "),t("p",[e._v("You will see something like "),t("code",[e._v("lnd.log lnd.log.13 lnd.log.15 lnd.log.16.gz lnd.log.17.gz")])]),e._v(" "),t("p",[e._v("To access uncompressed logs of those logs do "),t("code",[e._v("cat lnd.log")]),e._v(" or if you want another one, use "),t("code",[e._v("cat lnd.log.15")])]),e._v(" "),t("p",[e._v("To access compressed logs in .gzip use "),t("code",[e._v("gzip -d lnd.log.16.gz")]),e._v(" (in this case we're accessing lnd.log.16.gz)")]),e._v(" "),t("p",[e._v("This should give you a new file, where you can do "),t("code",[e._v("cat lnd.log.16")])]),e._v(" "),t("p",[e._v("In case the above does not work, you may need to use install gzip first "),t("code",[e._v("sudo apt-get install gzip")])]),e._v(" "),t("h3",{attrs:{id:"222-lightning-network-core-lightning-cln-docker"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#222-lightning-network-core-lightning-cln-docker"}},[e._v("#")]),e._v(" 2.2.2 - Lightning Network Core Lightning (CLN) - Docker")]),e._v(" "),t("p",[t("code",[e._v("sudo su -")])]),e._v(" "),t("p",[t("code",[e._v("docker ps")])]),e._v(" "),t("p",[e._v("Find the Core Lightning (CLN) container ID.")]),e._v(" "),t("p",[e._v("docker logs 'add your container ID here'")]),e._v(" "),t("p",[e._v("alternatively, use this")]),e._v(" "),t("p",[t("code",[e._v("docker logs --tail 100 btcpayserver_clightning_bitcoin")])]),e._v(" "),t("p",[e._v("You can also get log information with Core Lightning (CLN) cli command.")]),e._v(" "),t("p",[t("code",[e._v("bitcoin-lightning-cli.sh getlog")])]),e._v(" "),t("h2",{attrs:{id:"23-bitcoin-node-logs"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#23-bitcoin-node-logs"}},[e._v("#")]),e._v(" 2.3 - Bitcoin Node Logs")]),e._v(" "),t("p",[e._v("In addition to "),t("a",{attrs:{href:"#2-looking-through-the-logs"}},[e._v("looking at logs")]),e._v(" of your Bitcoind container, you can also use any of the "),t("a",{attrs:{href:"https://developer.bitcoin.org/reference/rpc/index.html",target:"_blank",rel:"noopener noreferrer"}},[e._v("bitcoin-cli commands"),t("OutboundLink")],1),e._v(" to obtain information from your bitcoin node.\nBTCPay includes a script to allow you to communicate with your Bitcoin node easily.")]),e._v(" "),t("p",[e._v("Inside the "),t("code",[e._v("btcpayserver-docker")]),e._v(" folder, get the blockchain information using your node:")]),e._v(" "),t("p",[t("code",[e._v("bitcoin-cli.sh getblockchaininfo")])]),e._v(" "),t("h2",{attrs:{id:"3-finding-a-solution-yourself-google-faq-github-issues"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#3-finding-a-solution-yourself-google-faq-github-issues"}},[e._v("#")]),e._v(" 3. Finding a solution yourself (Google, FAQ, GitHub issues)")]),e._v(" "),t("p",[e._v("Even though setups differ, the chances that someone else experienced the same issue as yours are pretty high.\nTake a few moments, Google around and see if you can solve it yourself.")]),e._v(" "),t("h3",{attrs:{id:"31-btcpay-faq"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#31-btcpay-faq"}},[e._v("#")]),e._v(" 3.1 BTCPay FAQ")]),e._v(" "),t("p",[e._v("We try to document the most common issues on the "),t("RouterLink",{attrs:{to:"/FAQ/"}},[e._v("Frequently Asked Questions page")]),e._v(".\nTake a look there and see if your question is recorded.")],1),e._v(" "),t("h3",{attrs:{id:"32-github"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#32-github"}},[e._v("#")]),e._v(" 3.2 GitHub")]),e._v(" "),t("p",[e._v("When there's an advanced technical issue, users usually open an issue on GitHub.\nTake a look at the BTCPay GitHub repository and browse "),t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver/issues?q=is%3Aissue+is%3Aclosed",target:"_blank",rel:"noopener noreferrer"}},[e._v("search the closed issues"),t("OutboundLink")],1),e._v(".")]),e._v(" "),t("h3",{attrs:{id:"33-mattermost"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#33-mattermost"}},[e._v("#")]),e._v(" 3.3 Mattermost")]),e._v(" "),t("p",[e._v("Mattermost chat platform is great for similar issues, other users experienced before you.\nOn the top right-hand corner, click on the search and enter your query.")]),e._v(" "),t("h2",{attrs:{id:"4-asking-for-help"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#4-asking-for-help"}},[e._v("#")]),e._v(" 4. Asking for help")]),e._v(" "),t("p",[e._v("If you're unable to solve the problem yourself, do not worry.\nThere's an amid community ready to help you.")]),e._v(" "),t("p",[e._v("The better you describe the problem, the higher are the chances of getting a timely fix.\nBe concise and provide as much relevant information as possible.\nBe sure to include the "),t("RouterLink",{attrs:{to:"/FAQ/ServerSettings/#how-can-i-see-my-btcpay-version"}},[e._v("version you're using")]),e._v(" and describe your BTCPay Deployment Setup.\nTry to explain what you're trying to do and what's the issue.\nIf you can provide the logs.\nIf you think it's relevant, feel free to include a screenshot.")],1),e._v(" "),t("p",[e._v("Here's a good example of how to ask a question.")]),e._v(" "),t("blockquote",[t("p",[e._v("I'm having a problem with XYZ. I can replicate the problem. My BTCPay version is 0.100.31, and I deployed my server on Digital Ocean by following Docker deployment guide. I've searched through the FAQ and closed GitHub issues, but there's no solution to my problem. My BTCPay Setup is XYZ, and the issue is occurring when I do XYZ. Here are the logs I was able to get from my BTCPay instance. You can see the error in the image I attached.")])]),e._v(" "),t("div",{staticClass:"custom-block warning"},[t("p",{staticClass:"custom-block-title"},[e._v("Please note:")]),e._v(" "),t("p",[e._v("The community will not provide extensive support for custom deployments.\nI.e. variations of "),t("RouterLink",{attrs:{to:"/Deployment/ManualDeployment/"}},[e._v("Manual Deployments")]),e._v(" are expected to be used only for development purposes and by users with technical literacy with the ability to "),t("strong",[e._v("resolve deployment and maintenance issues on their own")]),e._v(". This includes "),t("RouterLink",{attrs:{to:"/Deployment/HardwareAsAService/"}},[e._v("Hardware-As-A-Service")]),e._v(" products (Nodl, RaspiBlitz, Umbrel, etc ...)")],1)]),e._v(" "),t("h3",{attrs:{id:"41-asking-the-community-general-problems"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#41-asking-the-community-general-problems"}},[e._v("#")]),e._v(" 4.1 Asking the community (general problems)")]),e._v(" "),t("p",[e._v("For quick answers to fundamental problems, it's best to post a question in #support channel on "),t("a",{attrs:{href:"https://chat.btcpayserver.org/btcpayserver/channels/support",target:"_blank",rel:"noopener noreferrer"}},[e._v("BTCPay Mattermost"),t("OutboundLink")],1),e._v(".")]),e._v(" "),t("h3",{attrs:{id:"42-opening-an-issue-on-github-advanced-problems"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#42-opening-an-issue-on-github-advanced-problems"}},[e._v("#")]),e._v(" 4.2 Opening an Issue on GitHub (advanced problems)")]),e._v(" "),t("p",[e._v("If you have a custom build setup and are facing a complex problem, "),t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver/issues",target:"_blank",rel:"noopener noreferrer"}},[e._v("open an issue on GitHub"),t("OutboundLink")],1),e._v(" so that developers can help you out.")]),e._v(" "),t("h3",{attrs:{id:"43-premium-support"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#43-premium-support"}},[e._v("#")]),e._v(" 4.3 Premium Support")]),e._v(" "),t("p",[e._v("Some community members provide paid support.\nIf you want a quicker help, check out the list of "),t("RouterLink",{attrs:{to:"/Support/"}},[e._v("members providing premium support")]),e._v(".")],1),e._v(" "),t("h3",{attrs:{id:"44-lightning-network-support"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#44-lightning-network-support"}},[e._v("#")]),e._v(" 4.4 Lightning Network Support")]),e._v(" "),t("p",[e._v("If you're facing a technical problem with your Lightning Network implementation, you may want to ask questions in their respective communities.")]),e._v(" "),t("h4",{attrs:{id:"441-lnd-support"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#441-lnd-support"}},[e._v("#")]),e._v(" 4.4.1 LND Support")]),e._v(" "),t("ul",[t("li",[t("a",{attrs:{href:"https://github.com/lightningnetwork/lnd/issues",target:"_blank",rel:"noopener noreferrer"}},[e._v("LND GitHub"),t("OutboundLink")],1)]),e._v(" "),t("li",[t("a",{attrs:{href:"https://lightningcommunity.slack.com",target:"_blank",rel:"noopener noreferrer"}},[e._v("Lightning Community on Slack"),t("OutboundLink")],1)])]),e._v(" "),t("h4",{attrs:{id:"442-core-lightning-cln-support"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#442-core-lightning-cln-support"}},[e._v("#")]),e._v(" 4.4.2 Core Lightning (CLN) Support")]),e._v(" "),t("ul",[t("li",[t("a",{attrs:{href:"https://github.com/ElementsProject/lightning/issues",target:"_blank",rel:"noopener noreferrer"}},[e._v("CLN GitHub"),t("OutboundLink")],1)]),e._v(" "),t("li",[t("a",{attrs:{href:"https://t.me/lightningd",target:"_blank",rel:"noopener noreferrer"}},[e._v("CLN Telegram Group"),t("OutboundLink")],1)]),e._v(" "),t("li",[t("a",{attrs:{href:"https://lightning.readthedocs.io/",target:"_blank",rel:"noopener noreferrer"}},[e._v("CLN docs"),t("OutboundLink")],1)])])])}),[],!1,null,null,null);t.default=n.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[156],{820:function(e,t,r){"use strict";r.r(t);var o=r(10),n=Object(o.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"troubleshooting-an-issue-in-btcpay-server"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#troubleshooting-an-issue-in-btcpay-server"}},[e._v("#")]),e._v(" Troubleshooting an issue in BTCPay Server")]),e._v(" "),t("p",[e._v("Facing a problem is never fun. This document explains the most common workflow and steps you should take to "),t("strong",[e._v("identify the issue")]),e._v(" you're having more easily and hopefully solve it yourself or with community help.")]),e._v(" "),t("p",[e._v("Identifying the problem is crucial.")]),e._v(" "),t("h2",{attrs:{id:"1-replicating-the-issue"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#1-replicating-the-issue"}},[e._v("#")]),e._v(" 1. Replicating the issue")]),e._v(" "),t("p",[e._v("First and foremost, try to determine when the issue happens.\nTry to replicate the problem.\nTry to update and restart your server to verify you can reproduce your issue.\nIf you think it will describe your issue better, take a screenshot.")]),e._v(" "),t("h3",{attrs:{id:"11-updating-the-server"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#11-updating-the-server"}},[e._v("#")]),e._v(" 1.1 Updating the server")]),e._v(" "),t("p",[e._v("Check "),t("RouterLink",{attrs:{to:"/FAQ/ServerSettings/#how-can-i-see-my-btcpay-version"}},[e._v("your version of BTCPay")]),e._v(".\nIf it is much older than the "),t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver/releases",target:"_blank",rel:"noopener noreferrer"}},[e._v("latest version"),t("OutboundLink")],1),e._v(" of BTCPay, "),t("RouterLink",{attrs:{to:"/FAQ/ServerSettings/#how-to-update-btcpay-server"}},[e._v("updating your server")]),e._v(" may resolve the issue.")],1),e._v(" "),t("h3",{attrs:{id:"12-restarting-the-server"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#12-restarting-the-server"}},[e._v("#")]),e._v(" 1.2 Restarting the server")]),e._v(" "),t("p",[e._v("Restarting your server is an easy way to solve many of the most common BTCPay Server issues.\nYou may need to "),t("RouterLink",{attrs:{to:"/FAQ/ServerSettings/#how-to-ssh-into-my-btcpay-running-on-vps"}},[e._v("SSH into your server")]),e._v(" to restart it.")],1),e._v(" "),t("h3",{attrs:{id:"13-restarting-a-service"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#13-restarting-a-service"}},[e._v("#")]),e._v(" 1.3 Restarting a service")]),e._v(" "),t("p",[e._v("Some issues you may only need to restart a particular service in your BTCPay Server deployment.\nSuch as restarting the letsencrypt container to renew the SSL certificate.")]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token function"}},[e._v("sudo")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("su")]),e._v(" -\n"),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("cd")]),e._v(" btcpayserver-docker\n"),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("docker")]),e._v(" restart letsencrypt-nginx-proxy-companion\n")])])]),t("p",[e._v("Use "),t("code",[e._v("docker ps")]),e._v(" to find the name of a different service you would like to restart.")]),e._v(" "),t("h2",{attrs:{id:"2-looking-through-the-logs"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#2-looking-through-the-logs"}},[e._v("#")]),e._v(" 2. Looking through the logs")]),e._v(" "),t("p",[e._v("Logs can provide an essential piece of information.\nIn the next few paragraphs, we will describe how to get the "),t("strong",[e._v("log information for various parts of BTCPay")]),e._v(".")]),e._v(" "),t("h3",{attrs:{id:"21-btcpay-logs"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#21-btcpay-logs"}},[e._v("#")]),e._v(" 2.1 BTCPay Logs")]),e._v(" "),t("p",[e._v("Since the v1.0.3.8, you can easily access BTCPay Server logs from the front-end.\nIf you are a server admin, go to "),t("strong",[e._v("Server Settings > Logs")]),e._v(" and open the logs file.\nIf you don't know what a particular error in the logs means, make sure to mention it when troubleshooting.")]),e._v(" "),t("p",[e._v("If you would like more detailed logs and you're using a Docker deployment, you can view logs of specific Docker containers using the command line.\nSee these "),t("RouterLink",{attrs:{to:"/FAQ/ServerSettings/#how-to-ssh-into-my-btcpay-running-on-vps"}},[e._v("instructions to ssh")]),e._v(" into an instance of BTCPay running on a VPS.")],1),e._v(" "),t("p",[e._v("Below is a general list of the container names used for BTCPay.")]),e._v(" "),t("table",[t("thead",[t("tr",[t("th",[e._v("LOGS FOR")]),e._v(" "),t("th",{staticStyle:{"text-align":"center"}},[e._v("CONTAINER NAME")])])]),e._v(" "),t("tbody",[t("tr",[t("td",[e._v("BTCPayServer")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[e._v("generated_btcpayserver_1")])]),e._v(" "),t("tr",[t("td",[e._v("NBXplorer")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[e._v("generated_nbxplorer_1")])]),e._v(" "),t("tr",[t("td",[e._v("Bitcoind")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[e._v("btcpayserver_bitcoind")])]),e._v(" "),t("tr",[t("td",[e._v("Postgres")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[e._v("generated_postgres_1")])]),e._v(" "),t("tr",[t("td",[e._v("proxy")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[e._v("letsencrypt-nginx-proxy-companion")])]),e._v(" "),t("tr",[t("td",[e._v("Nginx")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[e._v("nginx-gen")])]),e._v(" "),t("tr",[t("td",[e._v("Nginx")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[e._v("nginx")])]),e._v(" "),t("tr",[t("td",[e._v("Core Lightning (CLN)")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[e._v("btcpayserver_clightning_bitcoin")])]),e._v(" "),t("tr",[t("td",[e._v("LND")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[e._v("btcpayserver_lnd_bitcoin")])]),e._v(" "),t("tr",[t("td",[e._v("RTL")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[e._v("generated_lnd_bitcoin_rtl_1")])]),e._v(" "),t("tr",[t("td",[e._v("Thunderhub")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[e._v("generated_bitcoin_thub_1")])]),e._v(" "),t("tr",[t("td",[e._v("LibrePatron")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[e._v("librepatron")])]),e._v(" "),t("tr",[t("td",[e._v("Tor")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[e._v("tor-gen")])]),e._v(" "),t("tr",[t("td",[e._v("Tor")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[e._v("tor")])])])]),e._v(" "),t("p",[e._v("Run the commands below to print logs by container name.\nReplace the container name to view other container logs.")]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token function"}},[e._v("sudo")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("su")]),e._v(" -\n"),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("cd")]),e._v(" btcpayserver-docker\n"),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("docker")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("ps")]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("docker")]),e._v(" logs "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("--tail")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token number"}},[e._v("100")]),e._v(" generated_btcpayserver_1\n")])])]),t("h3",{attrs:{id:"22-lightning-network-logs"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#22-lightning-network-logs"}},[e._v("#")]),e._v(" 2.2 Lightning Network Logs")]),e._v(" "),t("p",[e._v("Use the following if you're having a problem with the Lightning Network.")]),e._v(" "),t("h3",{attrs:{id:"221-lightning-network-lnd-docker"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#221-lightning-network-lnd-docker"}},[e._v("#")]),e._v(" 2.2.1 - Lightning Network LND - Docker")]),e._v(" "),t("p",[e._v("There are a few ways to access your LND logs when using Docker.\nFirst log in as root:")]),e._v(" "),t("p",[t("code",[e._v("sudo su -")])]),e._v(" "),t("p",[e._v("Navigate to the correct directory:")]),e._v(" "),t("p",[t("code",[e._v("cd btcpayserver-docker")])]),e._v(" "),t("p",[e._v("Find container name:")]),e._v(" "),t("p",[t("code",[e._v("docker ps")])]),e._v(" "),t("p",[e._v("Print logs by container name:")]),e._v(" "),t("p",[t("code",[e._v("docker logs --tail 100 btcpayserver_lnd_bitcoin")])]),e._v(" "),t("p",[e._v("Alternatively, you can quickly print logs by using container ID (only the first unique ID characters are needed, such as the two furthest left characters):")]),e._v(" "),t("p",[t("code",[e._v("docker logs 'add your container ID '")])]),e._v(" "),t("p",[e._v("If for any reason you need more logs")]),e._v(" "),t("p",[t("code",[e._v("sudo su -")])]),e._v(" "),t("p",[t("code",[e._v("cd /var/lib/docker/volumes/generated_lnd_bitcoin_datadir/_data/logs/bitcoin/mainnet/")])]),e._v(" "),t("p",[e._v("inside that directory do "),t("code",[e._v("ls")])]),e._v(" "),t("p",[e._v("You will see something like "),t("code",[e._v("lnd.log lnd.log.13 lnd.log.15 lnd.log.16.gz lnd.log.17.gz")])]),e._v(" "),t("p",[e._v("To access uncompressed logs of those logs do "),t("code",[e._v("cat lnd.log")]),e._v(" or if you want another one, use "),t("code",[e._v("cat lnd.log.15")])]),e._v(" "),t("p",[e._v("To access compressed logs in .gzip use "),t("code",[e._v("gzip -d lnd.log.16.gz")]),e._v(" (in this case we're accessing lnd.log.16.gz)")]),e._v(" "),t("p",[e._v("This should give you a new file, where you can do "),t("code",[e._v("cat lnd.log.16")])]),e._v(" "),t("p",[e._v("In case the above does not work, you may need to use install gzip first "),t("code",[e._v("sudo apt-get install gzip")])]),e._v(" "),t("h3",{attrs:{id:"222-lightning-network-core-lightning-cln-docker"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#222-lightning-network-core-lightning-cln-docker"}},[e._v("#")]),e._v(" 2.2.2 - Lightning Network Core Lightning (CLN) - Docker")]),e._v(" "),t("p",[t("code",[e._v("sudo su -")])]),e._v(" "),t("p",[t("code",[e._v("docker ps")])]),e._v(" "),t("p",[e._v("Find the Core Lightning (CLN) container ID.")]),e._v(" "),t("p",[e._v("docker logs 'add your container ID here'")]),e._v(" "),t("p",[e._v("alternatively, use this")]),e._v(" "),t("p",[t("code",[e._v("docker logs --tail 100 btcpayserver_clightning_bitcoin")])]),e._v(" "),t("p",[e._v("You can also get log information with Core Lightning (CLN) cli command.")]),e._v(" "),t("p",[t("code",[e._v("bitcoin-lightning-cli.sh getlog")])]),e._v(" "),t("h2",{attrs:{id:"23-bitcoin-node-logs"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#23-bitcoin-node-logs"}},[e._v("#")]),e._v(" 2.3 - Bitcoin Node Logs")]),e._v(" "),t("p",[e._v("In addition to "),t("a",{attrs:{href:"#2-looking-through-the-logs"}},[e._v("looking at logs")]),e._v(" of your Bitcoind container, you can also use any of the "),t("a",{attrs:{href:"https://developer.bitcoin.org/reference/rpc/index.html",target:"_blank",rel:"noopener noreferrer"}},[e._v("bitcoin-cli commands"),t("OutboundLink")],1),e._v(" to obtain information from your bitcoin node.\nBTCPay includes a script to allow you to communicate with your Bitcoin node easily.")]),e._v(" "),t("p",[e._v("Inside the "),t("code",[e._v("btcpayserver-docker")]),e._v(" folder, get the blockchain information using your node:")]),e._v(" "),t("p",[t("code",[e._v("bitcoin-cli.sh getblockchaininfo")])]),e._v(" "),t("h2",{attrs:{id:"3-finding-a-solution-yourself-google-faq-github-issues"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#3-finding-a-solution-yourself-google-faq-github-issues"}},[e._v("#")]),e._v(" 3. Finding a solution yourself (Google, FAQ, GitHub issues)")]),e._v(" "),t("p",[e._v("Even though setups differ, the chances that someone else experienced the same issue as yours are pretty high.\nTake a few moments, Google around and see if you can solve it yourself.")]),e._v(" "),t("h3",{attrs:{id:"31-btcpay-faq"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#31-btcpay-faq"}},[e._v("#")]),e._v(" 3.1 BTCPay FAQ")]),e._v(" "),t("p",[e._v("We try to document the most common issues on the "),t("RouterLink",{attrs:{to:"/FAQ/"}},[e._v("Frequently Asked Questions page")]),e._v(".\nTake a look there and see if your question is recorded.")],1),e._v(" "),t("h3",{attrs:{id:"32-github"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#32-github"}},[e._v("#")]),e._v(" 3.2 GitHub")]),e._v(" "),t("p",[e._v("When there's an advanced technical issue, users usually open an issue on GitHub.\nTake a look at the BTCPay GitHub repository and browse "),t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver/issues?q=is%3Aissue+is%3Aclosed",target:"_blank",rel:"noopener noreferrer"}},[e._v("search the closed issues"),t("OutboundLink")],1),e._v(".")]),e._v(" "),t("h3",{attrs:{id:"33-mattermost"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#33-mattermost"}},[e._v("#")]),e._v(" 3.3 Mattermost")]),e._v(" "),t("p",[e._v("Mattermost chat platform is great for similar issues, other users experienced before you.\nOn the top right-hand corner, click on the search and enter your query.")]),e._v(" "),t("h2",{attrs:{id:"4-asking-for-help"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#4-asking-for-help"}},[e._v("#")]),e._v(" 4. Asking for help")]),e._v(" "),t("p",[e._v("If you're unable to solve the problem yourself, do not worry.\nThere's an amid community ready to help you.")]),e._v(" "),t("p",[e._v("The better you describe the problem, the higher are the chances of getting a timely fix.\nBe concise and provide as much relevant information as possible.\nBe sure to include the "),t("RouterLink",{attrs:{to:"/FAQ/ServerSettings/#how-can-i-see-my-btcpay-version"}},[e._v("version you're using")]),e._v(" and describe your BTCPay Deployment Setup.\nTry to explain what you're trying to do and what's the issue.\nIf you can provide the logs.\nIf you think it's relevant, feel free to include a screenshot.")],1),e._v(" "),t("p",[e._v("Here's a good example of how to ask a question.")]),e._v(" "),t("blockquote",[t("p",[e._v("I'm having a problem with XYZ. I can replicate the problem. My BTCPay version is 0.100.31, and I deployed my server on Digital Ocean by following Docker deployment guide. I've searched through the FAQ and closed GitHub issues, but there's no solution to my problem. My BTCPay Setup is XYZ, and the issue is occurring when I do XYZ. Here are the logs I was able to get from my BTCPay instance. You can see the error in the image I attached.")])]),e._v(" "),t("div",{staticClass:"custom-block warning"},[t("p",{staticClass:"custom-block-title"},[e._v("Please note:")]),e._v(" "),t("p",[e._v("The community will not provide extensive support for custom deployments.\nI.e. variations of "),t("RouterLink",{attrs:{to:"/Deployment/ManualDeployment/"}},[e._v("Manual Deployments")]),e._v(" are expected to be used only for development purposes and by users with technical literacy with the ability to "),t("strong",[e._v("resolve deployment and maintenance issues on their own")]),e._v(". This includes "),t("RouterLink",{attrs:{to:"/Deployment/HardwareAsAService/"}},[e._v("Hardware-As-A-Service")]),e._v(" products (Nodl, RaspiBlitz, Umbrel, etc ...)")],1)]),e._v(" "),t("h3",{attrs:{id:"41-asking-the-community-general-problems"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#41-asking-the-community-general-problems"}},[e._v("#")]),e._v(" 4.1 Asking the community (general problems)")]),e._v(" "),t("p",[e._v("For quick answers to fundamental problems, it's best to post a question in #support channel on "),t("a",{attrs:{href:"https://chat.btcpayserver.org/btcpayserver/channels/support",target:"_blank",rel:"noopener noreferrer"}},[e._v("BTCPay Mattermost"),t("OutboundLink")],1),e._v(".")]),e._v(" "),t("h3",{attrs:{id:"42-opening-an-issue-on-github-advanced-problems"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#42-opening-an-issue-on-github-advanced-problems"}},[e._v("#")]),e._v(" 4.2 Opening an Issue on GitHub (advanced problems)")]),e._v(" "),t("p",[e._v("If you have a custom build setup and are facing a complex problem, "),t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver/issues",target:"_blank",rel:"noopener noreferrer"}},[e._v("open an issue on GitHub"),t("OutboundLink")],1),e._v(" so that developers can help you out.")]),e._v(" "),t("h3",{attrs:{id:"43-premium-support"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#43-premium-support"}},[e._v("#")]),e._v(" 4.3 Premium Support")]),e._v(" "),t("p",[e._v("Some community members provide paid support.\nIf you want a quicker help, check out the list of "),t("RouterLink",{attrs:{to:"/Support/"}},[e._v("members providing premium support")]),e._v(".")],1),e._v(" "),t("h3",{attrs:{id:"44-lightning-network-support"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#44-lightning-network-support"}},[e._v("#")]),e._v(" 4.4 Lightning Network Support")]),e._v(" "),t("p",[e._v("If you're facing a technical problem with your Lightning Network implementation, you may want to ask questions in their respective communities.")]),e._v(" "),t("h4",{attrs:{id:"441-lnd-support"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#441-lnd-support"}},[e._v("#")]),e._v(" 4.4.1 LND Support")]),e._v(" "),t("ul",[t("li",[t("a",{attrs:{href:"https://github.com/lightningnetwork/lnd/issues",target:"_blank",rel:"noopener noreferrer"}},[e._v("LND GitHub"),t("OutboundLink")],1)]),e._v(" "),t("li",[t("a",{attrs:{href:"https://lightningcommunity.slack.com",target:"_blank",rel:"noopener noreferrer"}},[e._v("Lightning Community on Slack"),t("OutboundLink")],1)])]),e._v(" "),t("h4",{attrs:{id:"442-core-lightning-cln-support"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#442-core-lightning-cln-support"}},[e._v("#")]),e._v(" 4.4.2 Core Lightning (CLN) Support")]),e._v(" "),t("ul",[t("li",[t("a",{attrs:{href:"https://github.com/ElementsProject/lightning/issues",target:"_blank",rel:"noopener noreferrer"}},[e._v("CLN GitHub"),t("OutboundLink")],1)]),e._v(" "),t("li",[t("a",{attrs:{href:"https://t.me/lightningd",target:"_blank",rel:"noopener noreferrer"}},[e._v("CLN Telegram Group"),t("OutboundLink")],1)]),e._v(" "),t("li",[t("a",{attrs:{href:"https://lightning.readthedocs.io/",target:"_blank",rel:"noopener noreferrer"}},[e._v("CLN docs"),t("OutboundLink")],1)])])])}),[],!1,null,null,null);t.default=n.exports}}]); \ No newline at end of file diff --git a/assets/js/158.a4d81029.js b/assets/js/158.101a967c.js similarity index 99% rename from assets/js/158.a4d81029.js rename to assets/js/158.101a967c.js index 799e851253..aa9665119e 100644 --- a/assets/js/158.a4d81029.js +++ b/assets/js/158.101a967c.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[158],{826:function(e,a,t){"use strict";t.r(a);var s=t(10),r=Object(s.a)({},(function(){var e=this,a=e._self._c;return a("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[a("h1",{attrs:{id:"how-to-verify-release-signatures"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#how-to-verify-release-signatures"}},[e._v("#")]),e._v(" How to verify release signatures")]),e._v(" "),a("h2",{attrs:{id:"introduction"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#introduction"}},[e._v("#")]),e._v(" Introduction")]),e._v(" "),a("p",[e._v("Downloading binaries from the internet might be dangerous. When you download a release of BTCPayServer Vault on our "),a("a",{attrs:{href:"https://github.com/btcpayserver/BTCPayServer.Vault/releases",target:"_blank",rel:"noopener noreferrer"}},[e._v("GitHub releases page"),a("OutboundLink")],1),e._v(", you only ensure that the uploader had access to our GitHub repository.")]),e._v(" "),a("p",[e._v("This might be fine, but sometimes you download the same binaries from a different source, or you want additional assurance that those binaries are signed by the developers of the project. (In this case, Nicolas Dorier)")]),e._v(" "),a("p",[e._v("If you do not care about who signed the executable and verifying the integrity of the files you downloaded, you don't have to read this document.")]),e._v(" "),a("h2",{attrs:{id:"checking-pgp-signatures"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#checking-pgp-signatures"}},[e._v("#")]),e._v(" Checking PGP signatures"),a("a",{attrs:{name:"pgp"}})]),e._v(" "),a("p",[e._v("For this you need the "),a("code",[e._v("gpg")]),e._v(" tool, make sure it is installed on your machine.")]),e._v(" "),a("p",[e._v("On the "),a("a",{attrs:{href:"https://github.com/btcpayserver/BTCPayServer.Vault/releases/latest",target:"_blank",rel:"noopener noreferrer"}},[e._v("release page"),a("OutboundLink")],1),e._v(", download:")]),e._v(" "),a("ol",[a("li",[e._v("The release binary of your choice.")]),e._v(" "),a("li",[e._v("The "),a("code",[e._v("SHA256SUMS.asc")]),e._v(" file")])]),e._v(" "),a("h3",{attrs:{id:"importing-nicolas-dorier-pgp-keys-only-first-time"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#importing-nicolas-dorier-pgp-keys-only-first-time"}},[e._v("#")]),e._v(" Importing Nicolas Dorier pgp keys (only first time)")]),e._v(" "),a("p",[e._v("This step should be done only one time. It ensures your system knows Nicolas Dorier's PGP keys.")]),e._v(" "),a("p",[e._v("Nicolas Dorier has a "),a("a",{attrs:{href:"https://keybase.io/NicolasDorier",target:"_blank",rel:"noopener noreferrer"}},[e._v("keybase"),a("OutboundLink")],1),e._v(" account that allow you to verify that his identity is linked to several well-known social media accounts.\nAnd as you can see on his profile page, the PGP key "),a("code",[e._v("62FE 8564 7DED DA2E")]),e._v(" is linked to his keybase identity.")]),e._v(" "),a("p",[e._v("You can import this key from keybase:")]),e._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[a("span",{pre:!0,attrs:{class:"token function"}},[e._v("curl")]),e._v(" https://keybase.io/nicolasdorier/pgp_keys.asc "),a("span",{pre:!0,attrs:{class:"token operator"}},[e._v("|")]),e._v(" gpg "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("--import")]),e._v("\n")])])]),a("p",[e._v("or")]),e._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[e._v("keybase pgp pull nicolasdorier\n")])])]),a("p",[e._v("Alternatively, you can just download the file via the browser and run:")]),e._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[e._v("gpg "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("--import")]),e._v(" pgp_keys.asc\n")])])]),a("p",[e._v("This step won't have to be repeated the next time you need to check a signature.")]),e._v(" "),a("h3",{attrs:{id:"checking-the-actual-pgp-signature"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#checking-the-actual-pgp-signature"}},[e._v("#")]),e._v(" Checking the actual PGP signature")]),e._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[e._v("sha256sum "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("--check")]),e._v(" SHA256SUMS.asc --ignore-missing\n")])])]),a("p",[e._v("You should see that the file you downloaded has the right hash:")]),e._v(" "),a("div",{staticClass:"language-text extra-class"},[a("pre",{pre:!0,attrs:{class:"language-text"}},[a("code",[e._v("BTCPayServerVault-1.0.7-setup.exe: OK\n")])])]),a("p",[e._v("If you are on Windows you can check the hashes are identical manually:")]),e._v(" "),a("div",{staticClass:"language-powershell extra-class"},[a("pre",{pre:!0,attrs:{class:"language-powershell"}},[a("code",[e._v("certUtil "),a("span",{pre:!0,attrs:{class:"token operator"}},[e._v("-")]),e._v("hashfile BTCPayServerVault-1"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(".")]),e._v("0"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(".")]),e._v("7-setup"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(".")]),e._v("exe SHA256\n"),a("span",{pre:!0,attrs:{class:"token function"}},[e._v("type")]),e._v(" SHA256SUMS"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(".")]),e._v("asc\n")])])]),a("p",[e._v("If you are on macOS:")]),e._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[e._v("shasum "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-a")]),e._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[e._v("256")]),e._v(" "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("--check")]),e._v(" SHA256SUMS.asc\n")])])]),a("p",[e._v("You should see that the file you downloaded has the right hash:")]),e._v(" "),a("div",{staticClass:"language-text extra-class"},[a("pre",{pre:!0,attrs:{class:"language-text"}},[a("code",[e._v("BTCPayServerVault-osx-x64-1.0.7.dmg: OK\n")])])]),a("p",[e._v("Then check the actual signature:")]),e._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[e._v("gpg "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("--verify")]),e._v(" SHA256SUMS.asc\n")])])]),a("p",[e._v("Which should output something like:")]),e._v(" "),a("div",{staticClass:"language-text extra-class"},[a("pre",{pre:!0,attrs:{class:"language-text"}},[a("code",[e._v('gpg: Signature made Thu Dec 5 20:40:47 2019 JST\ngpg: using RSA key 62FE85647DEDDA2E\ngpg: Good signature from "BTCPayServer Vault <nicolas.dorier@gmail.com>" [unknown]\ngpg: WARNING: This key is not certified with a trusted signature!\ngpg: There is no indication that the signature belongs to the owner.\nPrimary key fingerprint: 7121 BDE3 555D 9BE0 6BDD C681 62FE 8564 7DED DA2E\n')])])])])}),[],!1,null,null,null);a.default=r.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[158],{825:function(e,a,t){"use strict";t.r(a);var s=t(10),r=Object(s.a)({},(function(){var e=this,a=e._self._c;return a("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[a("h1",{attrs:{id:"how-to-verify-release-signatures"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#how-to-verify-release-signatures"}},[e._v("#")]),e._v(" How to verify release signatures")]),e._v(" "),a("h2",{attrs:{id:"introduction"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#introduction"}},[e._v("#")]),e._v(" Introduction")]),e._v(" "),a("p",[e._v("Downloading binaries from the internet might be dangerous. When you download a release of BTCPayServer Vault on our "),a("a",{attrs:{href:"https://github.com/btcpayserver/BTCPayServer.Vault/releases",target:"_blank",rel:"noopener noreferrer"}},[e._v("GitHub releases page"),a("OutboundLink")],1),e._v(", you only ensure that the uploader had access to our GitHub repository.")]),e._v(" "),a("p",[e._v("This might be fine, but sometimes you download the same binaries from a different source, or you want additional assurance that those binaries are signed by the developers of the project. (In this case, Nicolas Dorier)")]),e._v(" "),a("p",[e._v("If you do not care about who signed the executable and verifying the integrity of the files you downloaded, you don't have to read this document.")]),e._v(" "),a("h2",{attrs:{id:"checking-pgp-signatures"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#checking-pgp-signatures"}},[e._v("#")]),e._v(" Checking PGP signatures"),a("a",{attrs:{name:"pgp"}})]),e._v(" "),a("p",[e._v("For this you need the "),a("code",[e._v("gpg")]),e._v(" tool, make sure it is installed on your machine.")]),e._v(" "),a("p",[e._v("On the "),a("a",{attrs:{href:"https://github.com/btcpayserver/BTCPayServer.Vault/releases/latest",target:"_blank",rel:"noopener noreferrer"}},[e._v("release page"),a("OutboundLink")],1),e._v(", download:")]),e._v(" "),a("ol",[a("li",[e._v("The release binary of your choice.")]),e._v(" "),a("li",[e._v("The "),a("code",[e._v("SHA256SUMS.asc")]),e._v(" file")])]),e._v(" "),a("h3",{attrs:{id:"importing-nicolas-dorier-pgp-keys-only-first-time"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#importing-nicolas-dorier-pgp-keys-only-first-time"}},[e._v("#")]),e._v(" Importing Nicolas Dorier pgp keys (only first time)")]),e._v(" "),a("p",[e._v("This step should be done only one time. It ensures your system knows Nicolas Dorier's PGP keys.")]),e._v(" "),a("p",[e._v("Nicolas Dorier has a "),a("a",{attrs:{href:"https://keybase.io/NicolasDorier",target:"_blank",rel:"noopener noreferrer"}},[e._v("keybase"),a("OutboundLink")],1),e._v(" account that allow you to verify that his identity is linked to several well-known social media accounts.\nAnd as you can see on his profile page, the PGP key "),a("code",[e._v("62FE 8564 7DED DA2E")]),e._v(" is linked to his keybase identity.")]),e._v(" "),a("p",[e._v("You can import this key from keybase:")]),e._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[a("span",{pre:!0,attrs:{class:"token function"}},[e._v("curl")]),e._v(" https://keybase.io/nicolasdorier/pgp_keys.asc "),a("span",{pre:!0,attrs:{class:"token operator"}},[e._v("|")]),e._v(" gpg "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("--import")]),e._v("\n")])])]),a("p",[e._v("or")]),e._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[e._v("keybase pgp pull nicolasdorier\n")])])]),a("p",[e._v("Alternatively, you can just download the file via the browser and run:")]),e._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[e._v("gpg "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("--import")]),e._v(" pgp_keys.asc\n")])])]),a("p",[e._v("This step won't have to be repeated the next time you need to check a signature.")]),e._v(" "),a("h3",{attrs:{id:"checking-the-actual-pgp-signature"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#checking-the-actual-pgp-signature"}},[e._v("#")]),e._v(" Checking the actual PGP signature")]),e._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[e._v("sha256sum "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("--check")]),e._v(" SHA256SUMS.asc --ignore-missing\n")])])]),a("p",[e._v("You should see that the file you downloaded has the right hash:")]),e._v(" "),a("div",{staticClass:"language-text extra-class"},[a("pre",{pre:!0,attrs:{class:"language-text"}},[a("code",[e._v("BTCPayServerVault-1.0.7-setup.exe: OK\n")])])]),a("p",[e._v("If you are on Windows you can check the hashes are identical manually:")]),e._v(" "),a("div",{staticClass:"language-powershell extra-class"},[a("pre",{pre:!0,attrs:{class:"language-powershell"}},[a("code",[e._v("certUtil "),a("span",{pre:!0,attrs:{class:"token operator"}},[e._v("-")]),e._v("hashfile BTCPayServerVault-1"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(".")]),e._v("0"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(".")]),e._v("7-setup"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(".")]),e._v("exe SHA256\n"),a("span",{pre:!0,attrs:{class:"token function"}},[e._v("type")]),e._v(" SHA256SUMS"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(".")]),e._v("asc\n")])])]),a("p",[e._v("If you are on macOS:")]),e._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[e._v("shasum "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-a")]),e._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[e._v("256")]),e._v(" "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("--check")]),e._v(" SHA256SUMS.asc\n")])])]),a("p",[e._v("You should see that the file you downloaded has the right hash:")]),e._v(" "),a("div",{staticClass:"language-text extra-class"},[a("pre",{pre:!0,attrs:{class:"language-text"}},[a("code",[e._v("BTCPayServerVault-osx-x64-1.0.7.dmg: OK\n")])])]),a("p",[e._v("Then check the actual signature:")]),e._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[e._v("gpg "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("--verify")]),e._v(" SHA256SUMS.asc\n")])])]),a("p",[e._v("Which should output something like:")]),e._v(" "),a("div",{staticClass:"language-text extra-class"},[a("pre",{pre:!0,attrs:{class:"language-text"}},[a("code",[e._v('gpg: Signature made Thu Dec 5 20:40:47 2019 JST\ngpg: using RSA key 62FE85647DEDDA2E\ngpg: Good signature from "BTCPayServer Vault <nicolas.dorier@gmail.com>" [unknown]\ngpg: WARNING: This key is not certified with a trusted signature!\ngpg: There is no indication that the signature belongs to the owner.\nPrimary key fingerprint: 7121 BDE3 555D 9BE0 6BDD C681 62FE 8564 7DED DA2E\n')])])])])}),[],!1,null,null,null);a.default=r.exports}}]); \ No newline at end of file diff --git a/assets/js/159.c8967001.js b/assets/js/159.df54e869.js similarity index 95% rename from assets/js/159.c8967001.js rename to assets/js/159.df54e869.js index 96c9150291..b0dfc8fdc4 100644 --- a/assets/js/159.c8967001.js +++ b/assets/js/159.df54e869.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[159],{833:function(t,e,a){"use strict";a.r(e);var r=a(10),o=Object(r.a)({},(function(){var t=this,e=t._self._c;return e("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[e("h1",{attrs:{id:"3-wallet-setup"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#3-wallet-setup"}},[t._v("#")]),t._v(" (3) Wallet Setup")]),t._v(" "),e("p",[t._v("After "),e("RouterLink",{attrs:{to:"/RegisterAccount/"}},[t._v("account registration")]),t._v(" and "),e("RouterLink",{attrs:{to:"/CreateStore/"}},[t._v("store creation")]),t._v(", it's time to configure a wallet in your BTCPay Server, so that you can start receiving payments into it.")],1),t._v(" "),e("p",[t._v("There are two ways to set up a wallet in BTCPay Server:")]),t._v(" "),e("ul",[e("li",[e("RouterLink",{attrs:{to:"/ConnectWallet/"}},[t._v("Connect an existing wallet")])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/CreateWallet/"}},[t._v("Create a new wallet")])],1)]),t._v(" "),e("p",[t._v("There are many options on how set up a wallet with your BTCPay Server. It's up to you to decide what works best for your use-case. Once you configure a wallet, you're all set. The next step, is to "),e("RouterLink",{attrs:{to:"/WhatsNext/"}},[t._v("start exploring the features")]),t._v(".")],1),t._v(" "),e("p",[e("strong",[e("em",[t._v("Proceed to the next step - "),e("RouterLink",{attrs:{to:"/WhatsNext/"}},[t._v("What's Next?")]),t._v(".")],1)])])])}),[],!1,null,null,null);e.default=o.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[159],{832:function(t,e,a){"use strict";a.r(e);var r=a(10),o=Object(r.a)({},(function(){var t=this,e=t._self._c;return e("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[e("h1",{attrs:{id:"3-wallet-setup"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#3-wallet-setup"}},[t._v("#")]),t._v(" (3) Wallet Setup")]),t._v(" "),e("p",[t._v("After "),e("RouterLink",{attrs:{to:"/RegisterAccount/"}},[t._v("account registration")]),t._v(" and "),e("RouterLink",{attrs:{to:"/CreateStore/"}},[t._v("store creation")]),t._v(", it's time to configure a wallet in your BTCPay Server, so that you can start receiving payments into it.")],1),t._v(" "),e("p",[t._v("There are two ways to set up a wallet in BTCPay Server:")]),t._v(" "),e("ul",[e("li",[e("RouterLink",{attrs:{to:"/ConnectWallet/"}},[t._v("Connect an existing wallet")])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/CreateWallet/"}},[t._v("Create a new wallet")])],1)]),t._v(" "),e("p",[t._v("There are many options on how set up a wallet with your BTCPay Server. It's up to you to decide what works best for your use-case. Once you configure a wallet, you're all set. The next step, is to "),e("RouterLink",{attrs:{to:"/WhatsNext/"}},[t._v("start exploring the features")]),t._v(".")],1),t._v(" "),e("p",[e("strong",[e("em",[t._v("Proceed to the next step - "),e("RouterLink",{attrs:{to:"/WhatsNext/"}},[t._v("What's Next?")]),t._v(".")],1)])])])}),[],!1,null,null,null);e.default=o.exports}}]); \ No newline at end of file diff --git a/assets/js/160.ad191f48.js b/assets/js/160.55b6149a.js similarity index 99% rename from assets/js/160.ad191f48.js rename to assets/js/160.55b6149a.js index cf17fde28c..d35370cf35 100644 --- a/assets/js/160.ad191f48.js +++ b/assets/js/160.55b6149a.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[160],{835:function(t,e,r){"use strict";r.r(e);var o=r(10),a=Object(o.a)({},(function(){var t=this,e=t._self._c;return e("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[e("h1",{attrs:{id:"4-whats-next"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#4-whats-next"}},[t._v("#")]),t._v(" (4) What's Next?")]),t._v(" "),e("p",[t._v("After you've connected your wallet to your BTCPay, you can explore various built in tools in the software. See the full list of Use Cases "),e("RouterLink",{attrs:{to:"/UseCase/"}},[t._v("here")]),t._v(".")],1),t._v(" "),e("h2",{attrs:{id:"creating-the-point-of-sale-app"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#creating-the-point-of-sale-app"}},[t._v("#")]),t._v(" Creating the Point of Sale App")]),t._v(" "),e("p",[t._v("BTCPay has a PoS app which you can use to receive payments from your customers directly or to receive donations. To "),e("strong",[t._v("create the POS app")]),t._v(", you need to have a store created in BTCPay. View PoS instructions "),e("RouterLink",{attrs:{to:"/Apps/#point-of-sale-app"}},[t._v("here")]),t._v(".")],1),t._v(" "),e("h2",{attrs:{id:"creating-the-crowdfund-app"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#creating-the-crowdfund-app"}},[t._v("#")]),t._v(" Creating the Crowdfund App")]),t._v(" "),e("p",[t._v("Create a "),e("strong",[t._v("crowdfunding campaign using BTCPay")]),t._v(". Unlike traditional crowdfunding platforms, the creator of the campaign is the owner of the platform. Funds go directly to the creator’s wallet without any fees. View Crowdfund instructions "),e("RouterLink",{attrs:{to:"/Apps/#crowdfunding-app"}},[t._v("here")]),t._v(".")],1),t._v(" "),e("h2",{attrs:{id:"creating-the-payment-request"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#creating-the-payment-request"}},[t._v("#")]),t._v(" Creating the Payment Request")]),t._v(" "),e("p",[t._v("Create "),e("strong",[t._v("custom invoices which can be shared with others")]),t._v(", by sending a link to your payment request. Users can pay the request at any time. BTCPay automatically updates the BTC exchange rate at the time of payment. View Payment Request instructions "),e("RouterLink",{attrs:{to:"/PaymentRequests/"}},[t._v("here")]),t._v(".")],1),t._v(" "),e("h2",{attrs:{id:"creating-the-pay-button"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#creating-the-pay-button"}},[t._v("#")]),t._v(" Creating the Pay Button")]),t._v(" "),e("p",[e("strong",[t._v("Pay buttons")]),t._v(" are great when you have a fixed amount for a product or a donation. You can easily embed the button into HTML. When the customer or a visitor clicks on the button, BTCPay displays a checkout page and an invoice for them. View Pay Button instructions "),e("RouterLink",{attrs:{to:"/Apps/#payment-button"}},[t._v("here")]),t._v(".")],1),t._v(" "),e("h2",{attrs:{id:"connecting-your-btcpay-store-to-your-e-commerce-platform"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#connecting-your-btcpay-store-to-your-e-commerce-platform"}},[t._v("#")]),t._v(" Connecting your BTCPay store to your e-commerce platform")]),t._v(" "),e("p",[t._v("Depending on the CMS you're using, you can easily connect BTCPay to your online store. Currently, BTCPay offers following integrations :")]),t._v(" "),e("ul",[e("li",[e("RouterLink",{attrs:{to:"/WooCommerce/"}},[t._v("WooCommerce")])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/Shopify/"}},[t._v("Shopify")])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/Drupal/"}},[t._v("Drupal")])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/Magento/"}},[t._v("Magneto")])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/PrestaShop/"}},[t._v("PrestaShop")])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/CustomIntegration/"}},[t._v("Custom integration")])],1)]),t._v(" "),e("h2",{attrs:{id:"connecting-additional-btcpay-services"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#connecting-additional-btcpay-services"}},[t._v("#")]),t._v(" Connecting Additional BTCPay Services")]),t._v(" "),e("p",[t._v("Additional free, open-source plugins can be used with your BTCPay.")]),t._v(" "),e("ul",[e("li",[e("a",{attrs:{href:"https://github.com/JeffVandrewJr/patron",target:"_blank",rel:"noopener noreferrer"}},[t._v("LibrePatron"),e("OutboundLink")],1)]),t._v(" "),e("li",[e("a",{attrs:{href:"https://github.com/btcpayserver/btcTransmuter/blob/master/README.md",target:"_blank",rel:"noopener noreferrer"}},[t._v("BTC Transmuter"),e("OutboundLink")],1)])]),t._v(" "),e("p",[e("strong",[t._v("LibrePatron is a self-hosted, censorship-free, Patreon alternative")]),t._v(". LibrePatron uses BTCPay Server to receive Bitcoin payments on a recurring basis. Funds go directly to the creator's wallet. View LibrePatron instructions "),e("a",{attrs:{href:"https://blog.btcpayserver.org/librepatron-patreon-alternative/",target:"_blank",rel:"noopener noreferrer"}},[t._v("here"),e("OutboundLink")],1),t._v(".")]),t._v(" "),e("p",[e("strong",[t._v("BTC Transmuter is a self-hosted service that allows you to automate your money and other tasks using BTCPay")]),t._v(". Create custom, automated processes using crypto service triggers based on BTCPay. Common use-cases are fiat integration, payment forwarding and email automation. Open lightning channels, detect payments and more, using blockchain data from your own nodes in BTCPay. View BTC Transmuter documentation "),e("a",{attrs:{href:"https://github.com/btcpayserver/btcTransmuter/blob/master/README.md",target:"_blank",rel:"noopener noreferrer"}},[t._v("here"),e("OutboundLink")],1),t._v(".")]),t._v(" "),e("h2",{attrs:{id:"join-the-btcpay-community"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#join-the-btcpay-community"}},[t._v("#")]),t._v(" Join The BTCPay Community")]),t._v(" "),e("p",[t._v("BTCPay Server is an open-source project, not a company. We rely on a network of diverse contributors and users to provide support for numerous use-cases. Join us in improving, learning, and building BTCPay.")]),t._v(" "),e("p",[t._v("If you have questions, try searching our "),e("RouterLink",{attrs:{to:"/FAQ/"}},[t._v("FAQ Section")]),t._v(" or join the "),e("RouterLink",{attrs:{to:"/Community/"}},[t._v("BTCPay Community")]),t._v(" and share questions and ideas for improvement.")],1),t._v(" "),e("p",[t._v("If you are a developer take a look at the "),e("RouterLink",{attrs:{to:"/Development/LocalDevelopment/"}},[t._v("Local Development")]),t._v(" guide and help us with any "),e("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver/issues",target:"_blank",rel:"noopener noreferrer"}},[t._v("open issues"),e("OutboundLink")],1),t._v(" on Github. If you would like to contribute to BTCPay in other ways, check out the "),e("RouterLink",{attrs:{to:"/Contribute/"}},[t._v("Contribution Guide")]),t._v(" for ideas.")],1)])}),[],!1,null,null,null);e.default=a.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[160],{833:function(t,e,r){"use strict";r.r(e);var o=r(10),a=Object(o.a)({},(function(){var t=this,e=t._self._c;return e("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[e("h1",{attrs:{id:"4-whats-next"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#4-whats-next"}},[t._v("#")]),t._v(" (4) What's Next?")]),t._v(" "),e("p",[t._v("After you've connected your wallet to your BTCPay, you can explore various built in tools in the software. See the full list of Use Cases "),e("RouterLink",{attrs:{to:"/UseCase/"}},[t._v("here")]),t._v(".")],1),t._v(" "),e("h2",{attrs:{id:"creating-the-point-of-sale-app"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#creating-the-point-of-sale-app"}},[t._v("#")]),t._v(" Creating the Point of Sale App")]),t._v(" "),e("p",[t._v("BTCPay has a PoS app which you can use to receive payments from your customers directly or to receive donations. To "),e("strong",[t._v("create the POS app")]),t._v(", you need to have a store created in BTCPay. View PoS instructions "),e("RouterLink",{attrs:{to:"/Apps/#point-of-sale-app"}},[t._v("here")]),t._v(".")],1),t._v(" "),e("h2",{attrs:{id:"creating-the-crowdfund-app"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#creating-the-crowdfund-app"}},[t._v("#")]),t._v(" Creating the Crowdfund App")]),t._v(" "),e("p",[t._v("Create a "),e("strong",[t._v("crowdfunding campaign using BTCPay")]),t._v(". Unlike traditional crowdfunding platforms, the creator of the campaign is the owner of the platform. Funds go directly to the creator’s wallet without any fees. View Crowdfund instructions "),e("RouterLink",{attrs:{to:"/Apps/#crowdfunding-app"}},[t._v("here")]),t._v(".")],1),t._v(" "),e("h2",{attrs:{id:"creating-the-payment-request"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#creating-the-payment-request"}},[t._v("#")]),t._v(" Creating the Payment Request")]),t._v(" "),e("p",[t._v("Create "),e("strong",[t._v("custom invoices which can be shared with others")]),t._v(", by sending a link to your payment request. Users can pay the request at any time. BTCPay automatically updates the BTC exchange rate at the time of payment. View Payment Request instructions "),e("RouterLink",{attrs:{to:"/PaymentRequests/"}},[t._v("here")]),t._v(".")],1),t._v(" "),e("h2",{attrs:{id:"creating-the-pay-button"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#creating-the-pay-button"}},[t._v("#")]),t._v(" Creating the Pay Button")]),t._v(" "),e("p",[e("strong",[t._v("Pay buttons")]),t._v(" are great when you have a fixed amount for a product or a donation. You can easily embed the button into HTML. When the customer or a visitor clicks on the button, BTCPay displays a checkout page and an invoice for them. View Pay Button instructions "),e("RouterLink",{attrs:{to:"/Apps/#payment-button"}},[t._v("here")]),t._v(".")],1),t._v(" "),e("h2",{attrs:{id:"connecting-your-btcpay-store-to-your-e-commerce-platform"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#connecting-your-btcpay-store-to-your-e-commerce-platform"}},[t._v("#")]),t._v(" Connecting your BTCPay store to your e-commerce platform")]),t._v(" "),e("p",[t._v("Depending on the CMS you're using, you can easily connect BTCPay to your online store. Currently, BTCPay offers following integrations :")]),t._v(" "),e("ul",[e("li",[e("RouterLink",{attrs:{to:"/WooCommerce/"}},[t._v("WooCommerce")])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/Shopify/"}},[t._v("Shopify")])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/Drupal/"}},[t._v("Drupal")])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/Magento/"}},[t._v("Magneto")])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/PrestaShop/"}},[t._v("PrestaShop")])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/CustomIntegration/"}},[t._v("Custom integration")])],1)]),t._v(" "),e("h2",{attrs:{id:"connecting-additional-btcpay-services"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#connecting-additional-btcpay-services"}},[t._v("#")]),t._v(" Connecting Additional BTCPay Services")]),t._v(" "),e("p",[t._v("Additional free, open-source plugins can be used with your BTCPay.")]),t._v(" "),e("ul",[e("li",[e("a",{attrs:{href:"https://github.com/JeffVandrewJr/patron",target:"_blank",rel:"noopener noreferrer"}},[t._v("LibrePatron"),e("OutboundLink")],1)]),t._v(" "),e("li",[e("a",{attrs:{href:"https://github.com/btcpayserver/btcTransmuter/blob/master/README.md",target:"_blank",rel:"noopener noreferrer"}},[t._v("BTC Transmuter"),e("OutboundLink")],1)])]),t._v(" "),e("p",[e("strong",[t._v("LibrePatron is a self-hosted, censorship-free, Patreon alternative")]),t._v(". LibrePatron uses BTCPay Server to receive Bitcoin payments on a recurring basis. Funds go directly to the creator's wallet. View LibrePatron instructions "),e("a",{attrs:{href:"https://blog.btcpayserver.org/librepatron-patreon-alternative/",target:"_blank",rel:"noopener noreferrer"}},[t._v("here"),e("OutboundLink")],1),t._v(".")]),t._v(" "),e("p",[e("strong",[t._v("BTC Transmuter is a self-hosted service that allows you to automate your money and other tasks using BTCPay")]),t._v(". Create custom, automated processes using crypto service triggers based on BTCPay. Common use-cases are fiat integration, payment forwarding and email automation. Open lightning channels, detect payments and more, using blockchain data from your own nodes in BTCPay. View BTC Transmuter documentation "),e("a",{attrs:{href:"https://github.com/btcpayserver/btcTransmuter/blob/master/README.md",target:"_blank",rel:"noopener noreferrer"}},[t._v("here"),e("OutboundLink")],1),t._v(".")]),t._v(" "),e("h2",{attrs:{id:"join-the-btcpay-community"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#join-the-btcpay-community"}},[t._v("#")]),t._v(" Join The BTCPay Community")]),t._v(" "),e("p",[t._v("BTCPay Server is an open-source project, not a company. We rely on a network of diverse contributors and users to provide support for numerous use-cases. Join us in improving, learning, and building BTCPay.")]),t._v(" "),e("p",[t._v("If you have questions, try searching our "),e("RouterLink",{attrs:{to:"/FAQ/"}},[t._v("FAQ Section")]),t._v(" or join the "),e("RouterLink",{attrs:{to:"/Community/"}},[t._v("BTCPay Community")]),t._v(" and share questions and ideas for improvement.")],1),t._v(" "),e("p",[t._v("If you are a developer take a look at the "),e("RouterLink",{attrs:{to:"/Development/LocalDevelopment/"}},[t._v("Local Development")]),t._v(" guide and help us with any "),e("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver/issues",target:"_blank",rel:"noopener noreferrer"}},[t._v("open issues"),e("OutboundLink")],1),t._v(" on Github. If you would like to contribute to BTCPay in other ways, check out the "),e("RouterLink",{attrs:{to:"/Contribute/"}},[t._v("Contribution Guide")]),t._v(" for ideas.")],1)])}),[],!1,null,null,null);e.default=a.exports}}]); \ No newline at end of file diff --git a/assets/js/17.80367cb7.js b/assets/js/17.f245dc38.js similarity index 82% rename from assets/js/17.80367cb7.js rename to assets/js/17.f245dc38.js index 7fec1d6c72..5829b55d77 100644 --- a/assets/js/17.80367cb7.js +++ b/assets/js/17.f245dc38.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[17],{656:function(e,t,a){e.exports=a.p+"assets/img/WasabiAddWallet.cf4e2496.png"},657:function(e,t,a){e.exports=a.p+"assets/img/WasabiAddWalletWalletName.30589d48.png"},658:function(e,t,a){e.exports=a.p+"assets/img/WasabiAddWalletRecoveryWords.f6439a9a.png"},659:function(e,t,a){e.exports=a.p+"assets/img/WasabiAddWalletConfirmRecoveryWords.57de256b.png"},660:function(e,t,a){e.exports=a.p+"assets/img/WasabiAddWalletAddPassword.8d118edd.png"},661:function(e,t,a){e.exports=a.p+"assets/img/WasabiCoinjoinStrategy.ff19005a.png"},662:function(e,t,a){e.exports=a.p+"assets/img/WasabiAddWalletSuccess.6d0a141d.png"},663:function(e,t,a){e.exports=a.p+"assets/img/WasabiOpenWallet.89e9b6c6.png"},664:function(e,t,a){e.exports=a.p+"assets/img/WasabiFindWalletInfo.31e473b0.png"},665:function(e,t,a){e.exports=a.p+"assets/img/WasabiExtendedAccountPublicKey.ba483e11.png"},666:function(e,t,a){e.exports=a.p+"assets/img/storedashboard-create.dd17384e.jpg"},667:function(e,t,a){e.exports=a.p+"assets/img/storedashboard-connect.2cb6ddd6.jpg"},668:function(e,t,a){e.exports=a.p+"assets/img/select-xpub.934e885a.jpg"},669:function(e,t,a){e.exports=a.p+"assets/img/xpub-form.bcf062f7.jpg"},670:function(e,t,a){e.exports=a.p+"assets/img/WasabiReceive.8cba4d4a.png"},671:function(e,t,a){e.exports=a.p+"assets/img/compare-address.4fd6e815.jpg"},672:function(e,t,a){e.exports=a.p+"assets/img/wallet-connected.41bdc209.jpg"},832:function(e,t,a){"use strict";a.r(t);var s=a(10),o=Object(s.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"connecting-wasabi-wallet-to-btcpay-server"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#connecting-wasabi-wallet-to-btcpay-server"}},[e._v("#")]),e._v(" Connecting Wasabi Wallet to BTCPay Server")]),e._v(" "),t("p",[e._v("This document shows how to "),t("strong",[e._v("connect "),t("a",{attrs:{href:"https://wasabiwallet.io/",target:"_blank",rel:"noopener noreferrer"}},[e._v("Wasabi Wallet"),t("OutboundLink")],1),e._v(" to BTCPay Server")]),e._v(".")]),e._v(" "),t("ol",[t("li",[e._v("Create a Store in BTCPay Server")]),e._v(" "),t("li",[t("a",{attrs:{href:"https://wasabiwallet.io/#download",target:"_blank",rel:"noopener noreferrer"}},[e._v("Download Wasabi Wallet"),t("OutboundLink")],1)]),e._v(" "),t("li",[t("a",{attrs:{href:"https://docs.wasabiwallet.io/using-wasabi/InstallPackage.html",target:"_blank",rel:"noopener noreferrer"}},[e._v("Install Wasabi Wallet"),t("OutboundLink")],1)])]),e._v(" "),t("h2",{attrs:{id:"wasabi-wallet-setup"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#wasabi-wallet-setup"}},[e._v("#")]),e._v(" Wasabi Wallet Setup")]),e._v(" "),t("p",[e._v("After installation, open the Wasabi Wallet by clicking on the icon on your desktop.")]),e._v(" "),t("h2",{attrs:{id:"quick-setup"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#quick-setup"}},[e._v("#")]),e._v(" Quick Setup")]),e._v(" "),t("ol",[t("li",[e._v("Create a new wallet in Wasabi")]),e._v(" "),t("li",[e._v("In Wasabi, copy the "),t("strong",[e._v("Extended Account Public Key")]),e._v(" at "),t("code",[e._v("Wallet Info")]),e._v(".")]),e._v(" "),t("li",[e._v("In BTCPay Server, Store > Settings > Wallet > Setup > Connect an existing wallet > Enter extended public key")]),e._v(" "),t("li",[e._v("In Wasabi, generate a new address at "),t("code",[e._v("Receive")]),e._v(".")]),e._v(" "),t("li",[e._v("Confirm that the addresses in Wasabi and BTCPay Server match.")])]),e._v(" "),t("h2",{attrs:{id:"step-by-step"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#step-by-step"}},[e._v("#")]),e._v(" Step by Step")]),e._v(" "),t("p",[e._v("At the first launch of Wasabi, the "),t("code",[e._v("Add wallet")]),e._v(" dialog will be opened automatically.\nSelect "),t("code",[e._v("Create new wallet")]),e._v(" to generate a new wallet.")]),e._v(" "),t("figure",[t("img",{attrs:{src:a(656),alt:"Wasabi Add Wallet",title:"Wasabi Add Wallet"}})]),e._v(" "),t("p",[e._v("Give your wallet a name, for example "),t("code",[e._v("BTCPay Server Wallet")]),e._v(".")]),e._v(" "),t("figure",[t("img",{attrs:{src:a(657),alt:"Wasabi Add Wallet Name",title:"Wasabi Add Wallet Name"}})]),e._v(" "),t("p",[e._v("Write down the Recovery Words in the correct order.")]),e._v(" "),t("figure",[t("img",{attrs:{src:a(658),alt:"Wasabi Add Wallet Recovery Words",title:"Wasabi Add Wallet Recovery Words"}})]),e._v(" "),t("p",[e._v("Confirm 3 of the 12 recovery words.\nThis is a quick test to make sure that you have written them down.")]),e._v(" "),t("figure",[t("img",{attrs:{src:a(659),alt:"Wasabi Add Wallet Confirm Recovery Words",title:"Wasabi Add Wallet Confirm Recovery Words"}})]),e._v(" "),t("p",[e._v("Add a password.\nThe password is used as a passphrase and it cannot be changed later on.")]),e._v(" "),t("div",{staticClass:"custom-block danger"},[t("p",{staticClass:"custom-block-title"},[e._v("Both The Recovery words AND the password are needed to recover this wallet")]),e._v(" "),t("p",[e._v("Make sure to have a backup of the recovery words and the password.")])]),e._v(" "),t("figure",[t("img",{attrs:{src:a(660),alt:"Wasabi Add Wallet Add Password",title:"Wasabi Add Wallet Add Password"}})]),e._v(" "),t("p",[t("strong",[e._v("IMPORTANT NOTE:")]),e._v(" Write down your recovery words in the order you see them on the screen. Write them down a piece of paper and store them somewhere secure. Take your time and triple-check each word. Do not store your seed in a digital format (photograph, text document). Whoever has access to your seed and your password can access your funds. Make sure you have a proper backup of the Recovery Words and the Password.")]),e._v(" "),t("p",[e._v("Select a Coinjoin Strategy.\nWasabi automatically coinjoins all your funds.\nIf you don't want to coinjoin your funds, you can disable coinjoin later by disabling "),t("code",[e._v("Automatically start coinjoin")]),e._v(" in the Coinjoin Settings.\nFor more info about coinjoins and the related settings, please refer to the "),t("a",{attrs:{href:"https://docs.wasabiwallet.io/",target:"_blank",rel:"noopener noreferrer"}},[e._v("Wasabi Documentation"),t("OutboundLink")],1),e._v(".")]),e._v(" "),t("figure",[t("img",{attrs:{src:a(661),alt:"Wasabi Coinjoin Strategy",title:"Wasabi Coinjoin Strategy"}})]),e._v(" "),t("p",[e._v("The wallet has been successfully created!")]),e._v(" "),t("figure",[t("img",{attrs:{src:a(662),alt:"Wasabi Add Wallet Success",title:"Wasabi Add Wallet Success"}})]),e._v(" "),t("p",[e._v("Open the new wallet by entering the password.")]),e._v(" "),t("figure",[t("img",{attrs:{src:a(663),alt:"Wasabi Open Wallet",title:"Wasabi Open Wallet"}})]),e._v(" "),t("p",[e._v("The wallet will load (it might take some time).\nAfter the loading is done and the wallet is opened, click on the 3 dots at the top right corner to go to "),t("code",[e._v("Wallet Info")]),e._v(" .")]),e._v(" "),t("figure",[t("img",{attrs:{src:a(664),alt:"Wasabi Find Wallet Info",title:"Wasabi Find Wallet Info"}})]),e._v(" "),t("p",[e._v("Select and "),t("strong",[e._v("copy")]),e._v(" the "),t("code",[e._v("Extended Account Public Key")]),e._v(". This is the "),t("strong",[e._v("public")]),e._v(" key from which BTCPay will derive addresses. This cannot be used to derive private keys and spend the bitcoin.")]),e._v(" "),t("figure",[t("img",{attrs:{src:a(665),alt:"Wasabi Extended Account Public Key",title:"Wasabi Extended Account Public Key"}})]),e._v(" "),t("h2",{attrs:{id:"setup-store-wallet"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#setup-store-wallet"}},[e._v("#")]),e._v(" Setup store wallet")]),e._v(" "),t("ol",[t("li",[e._v("Assuming you created a store and are now in the Dashboard. Click on "),t("code",[e._v("Set up a wallet")])])]),e._v(" "),t("figure",[t("img",{attrs:{src:a(666),alt:"Connect Wasabi Wallet to BTCPay Server",title:"Connect Wasabi Wallet to BTCPay Server"}})]),e._v(" "),t("ol",{attrs:{start:"2"}},[t("li",[e._v("As you did the above steps in wasabi, Click "),t("code",[e._v("Connect an existing wallet")])])]),e._v(" "),t("figure",[t("img",{attrs:{src:a(667),alt:"Connect Wasabi Wallet to BTCPay Server",title:"Connect Wasabi Wallet to BTCPay Server"}})]),e._v(" "),t("ol",{attrs:{start:"3"}},[t("li",[e._v("Choose "),t("code",[e._v("Enter extended public key")])])]),e._v(" "),t("figure",[t("img",{attrs:{src:a(668),alt:"Connect Wasabi Wallet to BTCPay Server",title:"Connect Wasabi Wallet to BTCPay Server"}})]),e._v(" "),t("ol",{attrs:{start:"4"}},[t("li",[e._v("Paste the "),t("code",[e._v("Extended Account Public Key")]),e._v(" into derivation scheme field as it is, without adding anything else and click "),t("code",[e._v("Continue")])])]),e._v(" "),t("figure",[t("img",{attrs:{src:a(669),alt:"Connect Wasabi Wallet to BTCPay Server",title:"Connect Wasabi Wallet to BTCPay Server"}})]),e._v(" "),t("ol",{attrs:{start:"5"}},[t("li",[e._v("Return to the Wasabi Wallet. Click the "),t("code",[e._v("Receive")]),e._v(" button and generate a new address.")])]),e._v(" "),t("figure",[t("img",{attrs:{src:a(670),alt:"Wasabi Receive",title:"Wasabi Receive"}})]),e._v(" "),t("ol",{attrs:{start:"6"}},[t("li",[e._v("Compare the address you see in Wasabi Wallet to addresses shown in BTCPay Server. Find a match, "),t("code",[e._v("continue")]),e._v(".")])]),e._v(" "),t("figure",[t("img",{attrs:{src:a(671),alt:"Connect Wasabi Wallet to BTCPay Server",title:"Connect Wasabi Wallet to BTCPay Server"}})]),e._v(" "),t("ol",{attrs:{start:"7"}},[t("li",[e._v("When you found a match, your wallet is now connected to the store.")])]),e._v(" "),t("figure",[t("img",{attrs:{src:a(672),alt:"Connect Wasabi Wallet to BTCPay Server",title:"Connect Wasabi Wallet to BTCPay Server"}})]),e._v(" "),t("h3",{attrs:{id:"connecting-wasabi-to-btcpay-server-full-node-if-youre-self-hosting-btcpay"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#connecting-wasabi-to-btcpay-server-full-node-if-youre-self-hosting-btcpay"}},[e._v("#")]),e._v(" Connecting Wasabi to BTCPay Server Full Node (If you're self-hosting BTCPay)")]),e._v(" "),t("p",[e._v("After the wallets are connected, it is highly recommended to "),t("strong",[e._v("connect Wasabi Wallet to your full node in BTCPay")]),e._v(". The process is easy but can only be done if you self-host BTCPay and are logged in as "),t("code",[e._v("Admin")]),e._v(". Tor has to be enabled in BTCPay (it is enabled by default). This process enhances privacy even further.")]),e._v(" "),t("p",[e._v("In BTCPay, go Server Settings > Services > "),t("strong",[e._v("Full node P2P > See Information")]),e._v(".\nOn the BTCP-P2P page, click on the "),t("code",[e._v("Show Confidential QR Code")]),e._v(". Bellow the QR Code, there's a link "),t("code",[e._v("See QR Code information by clicking here")]),e._v(", so click on the link to reveal your string. Copy the string but remove "),t("code",[e._v("bitcoin-p2p://")]),e._v(" part.")]),e._v(" "),t("p",[e._v("In Wasabi, go to the Bitcoin tab at "),t("code",[e._v("Settings")]),e._v(" and paste the endpoint in "),t("code",[e._v("Bitcoin P2P Endpoint")]),e._v(".")]),e._v(" "),t("p",[e._v("Restart Wasabi to apply the changes.")]),e._v(" "),t("h3",{attrs:{id:"configuring-the-gap-limit-in-wasabi"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#configuring-the-gap-limit-in-wasabi"}},[e._v("#")]),e._v(" Configuring the Gap Limit in Wasabi")]),e._v(" "),t("p",[e._v("At the search bar on top, click on "),t("code",[e._v("Wallet Folder")]),e._v(". Shortly the "),t("code",[e._v("json")]),e._v(" file will be shown in a sub-folder. Open that file with a text editor like notepad.\nFind the line "),t("code",[e._v('"MinGapLimit": 21,')]),e._v(" and change it to "),t("code",[e._v('"MinGapLimit": 100,')]),e._v(" and save the file.")]),e._v(" "),t("p",[e._v("There's no good answer to how much you should set the gap limit to. Most merchants set 100-200. If you're a big merchant with high transaction volume, you can try with even a higher gap limit.")]),e._v(" "),t("p",[e._v("For more details about the "),t("RouterLink",{attrs:{to:"/FAQ/Wallet/#missing-payments-in-my-software-or-hardware-wallet"}},[e._v("Gap Limit, check the FAQ")]),e._v(".")],1),e._v(" "),t("p",[t("strong",[e._v("Wasabi Wallet and BTCPay Server are now connected")]),e._v(". Any payments received to your BTCPay will be visible in Wasabi, where you can further spend or mix them.")])])}),[],!1,null,null,null);t.default=o.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[17],{647:function(e,t,a){e.exports=a.p+"assets/img/WasabiAddWallet.cf4e2496.png"},648:function(e,t,a){e.exports=a.p+"assets/img/WasabiAddWalletWalletName.30589d48.png"},649:function(e,t,a){e.exports=a.p+"assets/img/WasabiAddWalletRecoveryWords.f6439a9a.png"},650:function(e,t,a){e.exports=a.p+"assets/img/WasabiAddWalletConfirmRecoveryWords.57de256b.png"},651:function(e,t,a){e.exports=a.p+"assets/img/WasabiAddWalletAddPassword.8d118edd.png"},652:function(e,t,a){e.exports=a.p+"assets/img/WasabiCoinjoinStrategy.ff19005a.png"},653:function(e,t,a){e.exports=a.p+"assets/img/WasabiAddWalletSuccess.6d0a141d.png"},654:function(e,t,a){e.exports=a.p+"assets/img/WasabiOpenWallet.89e9b6c6.png"},655:function(e,t,a){e.exports=a.p+"assets/img/WasabiFindWalletInfo.31e473b0.png"},656:function(e,t,a){e.exports=a.p+"assets/img/WasabiExtendedAccountPublicKey.ba483e11.png"},657:function(e,t,a){e.exports=a.p+"assets/img/storedashboard-create.dd17384e.jpg"},658:function(e,t,a){e.exports=a.p+"assets/img/storedashboard-connect.2cb6ddd6.jpg"},659:function(e,t,a){e.exports=a.p+"assets/img/select-xpub.934e885a.jpg"},660:function(e,t,a){e.exports=a.p+"assets/img/xpub-form.bcf062f7.jpg"},661:function(e,t,a){e.exports=a.p+"assets/img/WasabiReceive.8cba4d4a.png"},662:function(e,t,a){e.exports=a.p+"assets/img/compare-address.4fd6e815.jpg"},663:function(e,t,a){e.exports=a.p+"assets/img/wallet-connected.41bdc209.jpg"},831:function(e,t,a){"use strict";a.r(t);var s=a(10),o=Object(s.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"connecting-wasabi-wallet-to-btcpay-server"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#connecting-wasabi-wallet-to-btcpay-server"}},[e._v("#")]),e._v(" Connecting Wasabi Wallet to BTCPay Server")]),e._v(" "),t("p",[e._v("This document shows how to "),t("strong",[e._v("connect "),t("a",{attrs:{href:"https://wasabiwallet.io/",target:"_blank",rel:"noopener noreferrer"}},[e._v("Wasabi Wallet"),t("OutboundLink")],1),e._v(" to BTCPay Server")]),e._v(".")]),e._v(" "),t("ol",[t("li",[e._v("Create a Store in BTCPay Server")]),e._v(" "),t("li",[t("a",{attrs:{href:"https://wasabiwallet.io/#download",target:"_blank",rel:"noopener noreferrer"}},[e._v("Download Wasabi Wallet"),t("OutboundLink")],1)]),e._v(" "),t("li",[t("a",{attrs:{href:"https://docs.wasabiwallet.io/using-wasabi/InstallPackage.html",target:"_blank",rel:"noopener noreferrer"}},[e._v("Install Wasabi Wallet"),t("OutboundLink")],1)])]),e._v(" "),t("h2",{attrs:{id:"wasabi-wallet-setup"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#wasabi-wallet-setup"}},[e._v("#")]),e._v(" Wasabi Wallet Setup")]),e._v(" "),t("p",[e._v("After installation, open the Wasabi Wallet by clicking on the icon on your desktop.")]),e._v(" "),t("h2",{attrs:{id:"quick-setup"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#quick-setup"}},[e._v("#")]),e._v(" Quick Setup")]),e._v(" "),t("ol",[t("li",[e._v("Create a new wallet in Wasabi")]),e._v(" "),t("li",[e._v("In Wasabi, copy the "),t("strong",[e._v("Extended Account Public Key")]),e._v(" at "),t("code",[e._v("Wallet Info")]),e._v(".")]),e._v(" "),t("li",[e._v("In BTCPay Server, Store > Settings > Wallet > Setup > Connect an existing wallet > Enter extended public key")]),e._v(" "),t("li",[e._v("In Wasabi, generate a new address at "),t("code",[e._v("Receive")]),e._v(".")]),e._v(" "),t("li",[e._v("Confirm that the addresses in Wasabi and BTCPay Server match.")])]),e._v(" "),t("h2",{attrs:{id:"step-by-step"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#step-by-step"}},[e._v("#")]),e._v(" Step by Step")]),e._v(" "),t("p",[e._v("At the first launch of Wasabi, the "),t("code",[e._v("Add wallet")]),e._v(" dialog will be opened automatically.\nSelect "),t("code",[e._v("Create new wallet")]),e._v(" to generate a new wallet.")]),e._v(" "),t("figure",[t("img",{attrs:{src:a(647),alt:"Wasabi Add Wallet",title:"Wasabi Add Wallet"}})]),e._v(" "),t("p",[e._v("Give your wallet a name, for example "),t("code",[e._v("BTCPay Server Wallet")]),e._v(".")]),e._v(" "),t("figure",[t("img",{attrs:{src:a(648),alt:"Wasabi Add Wallet Name",title:"Wasabi Add Wallet Name"}})]),e._v(" "),t("p",[e._v("Write down the Recovery Words in the correct order.")]),e._v(" "),t("figure",[t("img",{attrs:{src:a(649),alt:"Wasabi Add Wallet Recovery Words",title:"Wasabi Add Wallet Recovery Words"}})]),e._v(" "),t("p",[e._v("Confirm 3 of the 12 recovery words.\nThis is a quick test to make sure that you have written them down.")]),e._v(" "),t("figure",[t("img",{attrs:{src:a(650),alt:"Wasabi Add Wallet Confirm Recovery Words",title:"Wasabi Add Wallet Confirm Recovery Words"}})]),e._v(" "),t("p",[e._v("Add a password.\nThe password is used as a passphrase and it cannot be changed later on.")]),e._v(" "),t("div",{staticClass:"custom-block danger"},[t("p",{staticClass:"custom-block-title"},[e._v("Both The Recovery words AND the password are needed to recover this wallet")]),e._v(" "),t("p",[e._v("Make sure to have a backup of the recovery words and the password.")])]),e._v(" "),t("figure",[t("img",{attrs:{src:a(651),alt:"Wasabi Add Wallet Add Password",title:"Wasabi Add Wallet Add Password"}})]),e._v(" "),t("p",[t("strong",[e._v("IMPORTANT NOTE:")]),e._v(" Write down your recovery words in the order you see them on the screen. Write them down a piece of paper and store them somewhere secure. Take your time and triple-check each word. Do not store your seed in a digital format (photograph, text document). Whoever has access to your seed and your password can access your funds. Make sure you have a proper backup of the Recovery Words and the Password.")]),e._v(" "),t("p",[e._v("Select a Coinjoin Strategy.\nWasabi automatically coinjoins all your funds.\nIf you don't want to coinjoin your funds, you can disable coinjoin later by disabling "),t("code",[e._v("Automatically start coinjoin")]),e._v(" in the Coinjoin Settings.\nFor more info about coinjoins and the related settings, please refer to the "),t("a",{attrs:{href:"https://docs.wasabiwallet.io/",target:"_blank",rel:"noopener noreferrer"}},[e._v("Wasabi Documentation"),t("OutboundLink")],1),e._v(".")]),e._v(" "),t("figure",[t("img",{attrs:{src:a(652),alt:"Wasabi Coinjoin Strategy",title:"Wasabi Coinjoin Strategy"}})]),e._v(" "),t("p",[e._v("The wallet has been successfully created!")]),e._v(" "),t("figure",[t("img",{attrs:{src:a(653),alt:"Wasabi Add Wallet Success",title:"Wasabi Add Wallet Success"}})]),e._v(" "),t("p",[e._v("Open the new wallet by entering the password.")]),e._v(" "),t("figure",[t("img",{attrs:{src:a(654),alt:"Wasabi Open Wallet",title:"Wasabi Open Wallet"}})]),e._v(" "),t("p",[e._v("The wallet will load (it might take some time).\nAfter the loading is done and the wallet is opened, click on the 3 dots at the top right corner to go to "),t("code",[e._v("Wallet Info")]),e._v(" .")]),e._v(" "),t("figure",[t("img",{attrs:{src:a(655),alt:"Wasabi Find Wallet Info",title:"Wasabi Find Wallet Info"}})]),e._v(" "),t("p",[e._v("Select and "),t("strong",[e._v("copy")]),e._v(" the "),t("code",[e._v("Extended Account Public Key")]),e._v(". This is the "),t("strong",[e._v("public")]),e._v(" key from which BTCPay will derive addresses. This cannot be used to derive private keys and spend the bitcoin.")]),e._v(" "),t("figure",[t("img",{attrs:{src:a(656),alt:"Wasabi Extended Account Public Key",title:"Wasabi Extended Account Public Key"}})]),e._v(" "),t("h2",{attrs:{id:"setup-store-wallet"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#setup-store-wallet"}},[e._v("#")]),e._v(" Setup store wallet")]),e._v(" "),t("ol",[t("li",[e._v("Assuming you created a store and are now in the Dashboard. Click on "),t("code",[e._v("Set up a wallet")])])]),e._v(" "),t("figure",[t("img",{attrs:{src:a(657),alt:"Connect Wasabi Wallet to BTCPay Server",title:"Connect Wasabi Wallet to BTCPay Server"}})]),e._v(" "),t("ol",{attrs:{start:"2"}},[t("li",[e._v("As you did the above steps in wasabi, Click "),t("code",[e._v("Connect an existing wallet")])])]),e._v(" "),t("figure",[t("img",{attrs:{src:a(658),alt:"Connect Wasabi Wallet to BTCPay Server",title:"Connect Wasabi Wallet to BTCPay Server"}})]),e._v(" "),t("ol",{attrs:{start:"3"}},[t("li",[e._v("Choose "),t("code",[e._v("Enter extended public key")])])]),e._v(" "),t("figure",[t("img",{attrs:{src:a(659),alt:"Connect Wasabi Wallet to BTCPay Server",title:"Connect Wasabi Wallet to BTCPay Server"}})]),e._v(" "),t("ol",{attrs:{start:"4"}},[t("li",[e._v("Paste the "),t("code",[e._v("Extended Account Public Key")]),e._v(" into derivation scheme field as it is, without adding anything else and click "),t("code",[e._v("Continue")])])]),e._v(" "),t("figure",[t("img",{attrs:{src:a(660),alt:"Connect Wasabi Wallet to BTCPay Server",title:"Connect Wasabi Wallet to BTCPay Server"}})]),e._v(" "),t("ol",{attrs:{start:"5"}},[t("li",[e._v("Return to the Wasabi Wallet. Click the "),t("code",[e._v("Receive")]),e._v(" button and generate a new address.")])]),e._v(" "),t("figure",[t("img",{attrs:{src:a(661),alt:"Wasabi Receive",title:"Wasabi Receive"}})]),e._v(" "),t("ol",{attrs:{start:"6"}},[t("li",[e._v("Compare the address you see in Wasabi Wallet to addresses shown in BTCPay Server. Find a match, "),t("code",[e._v("continue")]),e._v(".")])]),e._v(" "),t("figure",[t("img",{attrs:{src:a(662),alt:"Connect Wasabi Wallet to BTCPay Server",title:"Connect Wasabi Wallet to BTCPay Server"}})]),e._v(" "),t("ol",{attrs:{start:"7"}},[t("li",[e._v("When you found a match, your wallet is now connected to the store.")])]),e._v(" "),t("figure",[t("img",{attrs:{src:a(663),alt:"Connect Wasabi Wallet to BTCPay Server",title:"Connect Wasabi Wallet to BTCPay Server"}})]),e._v(" "),t("h3",{attrs:{id:"connecting-wasabi-to-btcpay-server-full-node-if-youre-self-hosting-btcpay"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#connecting-wasabi-to-btcpay-server-full-node-if-youre-self-hosting-btcpay"}},[e._v("#")]),e._v(" Connecting Wasabi to BTCPay Server Full Node (If you're self-hosting BTCPay)")]),e._v(" "),t("p",[e._v("After the wallets are connected, it is highly recommended to "),t("strong",[e._v("connect Wasabi Wallet to your full node in BTCPay")]),e._v(". The process is easy but can only be done if you self-host BTCPay and are logged in as "),t("code",[e._v("Admin")]),e._v(". Tor has to be enabled in BTCPay (it is enabled by default). This process enhances privacy even further.")]),e._v(" "),t("p",[e._v("In BTCPay, go Server Settings > Services > "),t("strong",[e._v("Full node P2P > See Information")]),e._v(".\nOn the BTCP-P2P page, click on the "),t("code",[e._v("Show Confidential QR Code")]),e._v(". Bellow the QR Code, there's a link "),t("code",[e._v("See QR Code information by clicking here")]),e._v(", so click on the link to reveal your string. Copy the string but remove "),t("code",[e._v("bitcoin-p2p://")]),e._v(" part.")]),e._v(" "),t("p",[e._v("In Wasabi, go to the Bitcoin tab at "),t("code",[e._v("Settings")]),e._v(" and paste the endpoint in "),t("code",[e._v("Bitcoin P2P Endpoint")]),e._v(".")]),e._v(" "),t("p",[e._v("Restart Wasabi to apply the changes.")]),e._v(" "),t("h3",{attrs:{id:"configuring-the-gap-limit-in-wasabi"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#configuring-the-gap-limit-in-wasabi"}},[e._v("#")]),e._v(" Configuring the Gap Limit in Wasabi")]),e._v(" "),t("p",[e._v("At the search bar on top, click on "),t("code",[e._v("Wallet Folder")]),e._v(". Shortly the "),t("code",[e._v("json")]),e._v(" file will be shown in a sub-folder. Open that file with a text editor like notepad.\nFind the line "),t("code",[e._v('"MinGapLimit": 21,')]),e._v(" and change it to "),t("code",[e._v('"MinGapLimit": 100,')]),e._v(" and save the file.")]),e._v(" "),t("p",[e._v("There's no good answer to how much you should set the gap limit to. Most merchants set 100-200. If you're a big merchant with high transaction volume, you can try with even a higher gap limit.")]),e._v(" "),t("p",[e._v("For more details about the "),t("RouterLink",{attrs:{to:"/FAQ/Wallet/#missing-payments-in-my-software-or-hardware-wallet"}},[e._v("Gap Limit, check the FAQ")]),e._v(".")],1),e._v(" "),t("p",[t("strong",[e._v("Wasabi Wallet and BTCPay Server are now connected")]),e._v(". Any payments received to your BTCPay will be visible in Wasabi, where you can further spend or mix them.")])])}),[],!1,null,null,null);t.default=o.exports}}]); \ No newline at end of file diff --git a/assets/js/18.5c4f9075.js b/assets/js/18.fe87642d.js similarity index 90% rename from assets/js/18.5c4f9075.js rename to assets/js/18.fe87642d.js index 4831e34946..637c1d8d88 100644 --- a/assets/js/18.5c4f9075.js +++ b/assets/js/18.fe87642d.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[18],{293:function(e,t,n){e.exports=n.p+"assets/img/btcpay-vm--19-troubleshoot-403-callback.51193927.png"},299:function(e,t,n){e.exports=n.p+"assets/img/oc3--12--webhook-success.b5638028.png"},508:function(e,t,n){e.exports=n.p+"assets/img/oc3--01--upload-zip.a09f931a.png"},509:function(e,t,n){e.exports=n.p+"assets/img/oc3--02--install-btcpay.045a3912.png"},510:function(e,t,n){e.exports=n.p+"assets/img/oc3--03--configure-btcpay.f4329bcc.png"},511:function(e,t,n){e.exports=n.p+"assets/img/oc3--04--configure-btcpay-page.c7b27789.png"},512:function(e,t,n){e.exports=n.p+"assets/img/oc3--05--btcps-account-manage.d8f9b0b5.png"},513:function(e,t,n){e.exports=n.p+"assets/img/oc3--05--btcps-account-manage-add.f1d58bef.png"},514:function(e,t,n){e.exports=n.p+"assets/img/oc3--06--btcps-generate-api-key-permissions.e6be361e.png"},515:function(e,t,n){e.exports=n.p+"assets/img/oc3--07--btcps-generate-api-key-permissions-store.b5cc47ae.png"},516:function(e,t,n){e.exports=n.p+"assets/img/oc3--08--btcps-generate-api-key-result.3da35e17.png"},517:function(e,t,n){e.exports=n.p+"assets/img/oc3--09--btcps-store-id.59a07f51.png"},518:function(e,t,n){e.exports=n.p+"assets/img/oc3--10--save-settings.b1852b45.png"},519:function(e,t,n){e.exports=n.p+"assets/img/oc3--11--save-settings-success.c7a8ed3c.png"},520:function(e,t,n){e.exports=n.p+"assets/img/oc3--20--debug-mode-enable.952c68c8.png"},521:function(e,t,n){e.exports=n.p+"assets/img/oc3--21--error-logs.a324ae3f.png"},803:function(e,t,n){"use strict";n.r(t);var a=n(10),o=Object(a.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"opencart-integration"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#opencart-integration"}},[e._v("#")]),e._v(" OpenCart integration")]),e._v(" "),t("p",[e._v("This document explains how "),t("strong",[e._v("to integrate BTCPay Server into your OpenCart store")]),e._v(". Supported are OpenCart 3 and 4.")]),e._v(" "),t("h2",{attrs:{id:"requirements"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#requirements"}},[e._v("#")]),e._v(" Requirements")]),e._v(" "),t("p",[e._v("Please ensure that you meet the following requirements before installing this extension.")]),e._v(" "),t("ul",[t("li",[e._v("PHP version >= 7.4 for OpenCart 3; PHP >= 8.1 for OpenCart 4")]),e._v(" "),t("li",[e._v("The curl, gd, intl, json, and mbstring PHP extensions are available")]),e._v(" "),t("li",[e._v("A OpenCart 3/4 store ("),t("a",{attrs:{href:"https://www.opencart.com/index.php?route=cms/download",target:"_blank",rel:"noopener noreferrer"}},[e._v("Download and installation instructions"),t("OutboundLink")],1),e._v(")")]),e._v(" "),t("li",[t("strong",[e._v("IMPORTANT:")]),e._v(" You have a BTCPay Server version 1.3.0 or later, either "),t("RouterLink",{attrs:{to:"/Deployment/"}},[e._v("self-hosted")]),e._v(" or "),t("RouterLink",{attrs:{to:"/Deployment/ThirdPartyHosting/"}},[e._v("hosted by a third-party")])],1),e._v(" "),t("li",[t("RouterLink",{attrs:{to:"/RegisterAccount/"}},[e._v("You've a registered account on the instance")])],1),e._v(" "),t("li",[t("RouterLink",{attrs:{to:"/CreateStore/"}},[e._v("You've got a BTCPay store on the instance")])],1),e._v(" "),t("li",[t("RouterLink",{attrs:{to:"/WalletSetup/"}},[e._v("You've got a wallet connected to your store")])],1)]),e._v(" "),t("div",{staticClass:"custom-block tip"},[t("p",{staticClass:"custom-block-title"},[e._v("TIP")]),e._v(" "),t("p",[e._v("The instructions are based on OpenCart 3, but the UI and steps are almost identical to OpenCart 4. Therefore we have no separate instructions.")])]),e._v(" "),t("h2",{attrs:{id:"1-install-btcpay-extension"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#1-install-btcpay-extension"}},[e._v("#")]),e._v(" 1. Install BTCPay extension")]),e._v(" "),t("p",[e._v("There are three ways to "),t("strong",[e._v("download the BTCPay for OpenCart extension")]),e._v(":")]),e._v(" "),t("ul",[t("li",[e._v("Via the Admin Dashboard (recommended, see below)")]),e._v(" "),t("li",[t("a",{attrs:{href:"https://www.opencart.com/index.php?route=marketplace/extension/info&extension_id=44269",target:"_blank",rel:"noopener noreferrer"}},[e._v("OpenCart Marketplace"),t("OutboundLink")],1)]),e._v(" "),t("li",[t("a",{attrs:{href:"https://github.com/btcpayserver/opencart",target:"_blank",rel:"noopener noreferrer"}},[e._v("GitHub Repository"),t("OutboundLink")],1)])]),e._v(" "),t("h3",{attrs:{id:"11-install-the-extension-from-opencart-admin-dashboard"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#11-install-the-extension-from-opencart-admin-dashboard"}},[e._v("#")]),e._v(" 1.1 Install the extension from OpenCart admin dashboard")]),e._v(" "),t("p",[e._v("Note: work in progress, extension undergoing review atm.")]),e._v(" "),t("h3",{attrs:{id:"12-download-and-install-the-extension-from-marketplace-or-github"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#12-download-and-install-the-extension-from-marketplace-or-github"}},[e._v("#")]),e._v(" 1.2 Download and install the extension from Marketplace or GitHub")]),e._v(" "),t("ol",[t("li",[e._v("Download the latest BTCPay extension from "),t("a",{attrs:{href:"https://github.com/btcpayserver/opencart/releases",target:"_blank",rel:"noopener noreferrer"}},[e._v("Github"),t("OutboundLink")],1),e._v(" or "),t("a",{attrs:{href:"https://www.opencart.com/index.php?route=marketplace/extension/info&extension_id=44269",target:"_blank",rel:"noopener noreferrer"}},[e._v("Marketplace"),t("OutboundLink")],1)]),e._v(" "),t("li",[e._v("Menu: Extensions -> Install")]),e._v(" "),t("li",[e._v("Click the button [Upload] and upload the downloaded "),t("code",[e._v("btcpay.ocmod.zip")]),e._v('\nAfter uploading, you should see a notice "Success: You have modified extensions! "')])]),e._v(" "),t("figure",[t("img",{attrs:{src:n(508),alt:"BTCPay OpenCart: Extension installation upload",title:"BTCPay OpenCart: Extension installation upload"}})]),e._v(" "),t("h3",{attrs:{id:"13-install-the-extension"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#13-install-the-extension"}},[e._v("#")]),e._v(" 1.3 Install the extension")]),e._v(" "),t("ol",[t("li",[e._v("Menu: Extensions -> Extensions")]),e._v(" "),t("li",[e._v('On the "Choose extension type" dropdown, select "Payment".')]),e._v(" "),t("li",[e._v('On the "Action" column, click the green install button.')]),e._v(" "),t("li",[e._v('You will see a notification " Success: You have modified payments!"')])]),e._v(" "),t("figure",[t("img",{attrs:{src:n(509),alt:"BTCPay OpenCart: Install extension",title:"BTCPay OpenCart: Install extension"}})]),e._v(" "),t("h2",{attrs:{id:"2-connecting-opencart-and-btcpay-server"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#2-connecting-opencart-and-btcpay-server"}},[e._v("#")]),e._v(" 2. Connecting OpenCart and BTCPay Server")]),e._v(" "),t("p",[e._v("Please make sure to have a BTCPay Server instance setup as described in the "),t("a",{attrs:{href:"#requirements"}},[e._v("requirements")]),e._v(" above.")]),e._v(" "),t("p",[e._v("BTCPay for OpenCart extension is a "),t("strong",[e._v("bridge between your BTCPay Server (payment processor) and your e-commerce store")]),e._v(".\nNo matter if you're using a self-hosted or third-party solution, the connection process is identical.")]),e._v(" "),t("h3",{attrs:{id:"21-configure-btcpay-server-extension-in-opencart"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#21-configure-btcpay-server-extension-in-opencart"}},[e._v("#")]),e._v(" 2.1 Configure BTCPay Server extension in OpenCart")]),e._v(" "),t("ol",[t("li",[e._v("Menu: Extensions -> Extensions")]),e._v(" "),t("li",[e._v("Click the blue edit button\n"),t("img",{attrs:{src:n(510),alt:"BTCPay OpenCart: Add new payment method",title:"BTCPay OpenCart: Add new payment method"}})]),e._v(" "),t("li",[e._v("Configure BTCPay extension. "),t("img",{attrs:{src:n(511),alt:"BTCPay OpenCart: Payment method details",title:"BTCPay OpenCart: Payment method details"}})]),e._v(" "),t("li",[e._v('On the field "Payment Method Enabled" set it to '),t("code",[e._v("Enabled")])]),e._v(" "),t("li",[e._v('On field "BTCPay Server URL" set it to the URL where your BTCPay Server instance is reachable on the internet e.g. '),t("code",[e._v("https://mainnet.demo.btcpayserver.org/")]),e._v(". You can find information on how to deploy your BTCPay Server instance in the "),t("a",{attrs:{href:"#requirements"}},[e._v("requirements section above")])])]),e._v(" "),t("p",[e._v("Before you can continue, you need to create the API key for your user and store, as described in the next section. Keep this browser tab open, as we will come back shortly.")]),e._v(" "),t("h3",{attrs:{id:"22-create-an-api-key-and-configure-permissions"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#22-create-an-api-key-and-configure-permissions"}},[e._v("#")]),e._v(" 2.2 Create an API key and configure permissions")]),e._v(" "),t("p",[e._v("On your BTCPay Server instance:")]),e._v(" "),t("ol",[t("li",[e._v("Click on "),t("em",[e._v("[Account]")])]),e._v(" "),t("li",[e._v("Click on "),t("em",[e._v("[Manage Account]")]),e._v(" "),t("img",{attrs:{src:n(512),alt:"BTCPay OpenCart: Manage Account",title:"BTCPay OpenCart: Manage Account"}})]),e._v(" "),t("li",[e._v("Go to the tab "),t("em",[e._v('"API Keys"')])]),e._v(" "),t("li",[e._v("Click "),t("em",[e._v("[Generate Key]")]),e._v(" to select permissions."),t("br"),e._v(" "),t("img",{attrs:{src:n(513),alt:"BTCPay OpenCart: API Keys overview",title:"BTCPay OpenCart: API Keys overview"}})]),e._v(" "),t("li",[e._v('"Label": Add a label.')]),e._v(" "),t("li",[e._v('"Permissions": '),t("strong",[e._v("Important:")]),e._v(" click on the "),t("em",[e._v('"Select specific stores"')]),e._v(" link for the following permissions: "),t("code",[e._v("View invoices")]),e._v(", "),t("code",[e._v("Create invoice")]),e._v(", "),t("code",[e._v("Modify invoices")]),e._v(", "),t("code",[e._v("Modify stores webhooks")]),e._v(", "),t("code",[e._v("View your stores")]),e._v(" and select the store you created for your OpenCart site. This makes sure that the API key only has access to that specific store and can't drain any funds even if the key is lost.\n"),t("img",{attrs:{src:n(514),alt:"BTCPay OpenCart: API Keys Permissions",title:"BTCPay OpenCart: API Keys Permissions"}}),t("br"),e._v("\nIt should look like this:\n"),t("img",{attrs:{src:n(515),alt:"BTCPay OpenCart: API Keys Permissions",title:"BTCPay OpenCart: API Keys Permissions"}})]),e._v(" "),t("li",[e._v("Click on "),t("em",[e._v("[Generate API Key]")]),e._v(" at the bottom")]),e._v(" "),t("li",[e._v("Copy the generated API Key to your "),t("em",[e._v("OpenCart BTCPay settings")]),e._v(' form field "BTCPay API Key"\n'),t("img",{attrs:{src:n(516),alt:"BTCPay OpenCart: Copy API Key",title:"BTCPay OpenCart: Copy API Key"}})]),e._v(" "),t("li",[e._v("Back on BTCPay Server instance, go to your store settings and copy the store ID to your "),t("em",[e._v("OpenCart BTCPay Settings")]),e._v(" form"),t("br"),e._v(" "),t("img",{attrs:{src:n(517),alt:"BTCPay OpenCart: Copy Store ID",title:"BTCPay OpenCart: Copy Store ID"}})]),e._v(" "),t("li",[e._v("Back on "),t("em",[e._v("OpenCart BTCPay settings")]),e._v(" form make sure "),t("strong",[e._v("BTPCay Server URL")]),e._v(", "),t("strong",[e._v("API Key")]),e._v(" and "),t("strong",[e._v("Store ID")]),e._v(" are set and click "),t("strong",[e._v("[Save]")]),e._v(" button (on the top right)"),t("br"),e._v(" "),t("img",{attrs:{src:n(518),alt:"BTCPay OpenCart: Save OpenCart Settings form",title:"BTCPay OpenCart: Save OpenCart Settings form"}})])]),e._v(" "),t("p",[e._v('You should get back to the Extensions overview page and see the notification "BTCPay Server Payment details have been successfully updated.". If not, ensure your URL, API Key and Store ID are correct.\n'),t("img",{attrs:{src:n(519),alt:"BTCPay OpenCart: Save OpenCart Settings form",title:"BTCPay OpenCart: Save OpenCart Settings form"}})]),e._v(" "),t("p",[e._v('On successfully saving, the BTCPay extension automatically creates a webhook so OpenCart can get notified when payments settle or fail. To double check it was successful. You can do that by editing the BTCPay extension settings again if you see the "Webhook Data" field filled out like this:\n'),t("img",{attrs:{src:n(299),alt:"BTCPay OpenCart: Save OpenCart Settings form",title:"BTCPay OpenCart: Save OpenCart Settings form"}})]),e._v(" "),t("p",[e._v("As you can see on the BTCPay extension settings, you can customize the order statuses depending on the "),t("RouterLink",{attrs:{to:"/Invoices/#invoice-statuses"}},[e._v("invoice statuses")]),e._v(" and other common settings. The defaults should be a good starting point but feel free to adjust them to your use case.")],1),e._v(" "),t("h2",{attrs:{id:"3-test-the-checkout"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#3-test-the-checkout"}},[e._v("#")]),e._v(" 3. Test the checkout")]),e._v(" "),t("p",[e._v("Everything is ready to go now. Make a small test purchase and make sure the order status gets updated according to the BTCPay invoice status. On the BTCPay Server invoice details, you can see if the webhook events were successful.")]),e._v(" "),t("h2",{attrs:{id:"troubleshooting"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#troubleshooting"}},[e._v("#")]),e._v(" Troubleshooting")]),e._v(" "),t("h3",{attrs:{id:"enable-debug-mode"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#enable-debug-mode"}},[e._v("#")]),e._v(" Enable debug mode")]),e._v(" "),t("p",[e._v('If you have an error during checkout, you can enable the debugging mode on the BTCPay extension settings. Menu: Go to "Extensions -> extensions" select "Payments" on the "Choose Extension Type" dropdown and edit BTCPay Server extension.')]),e._v(" "),t("figure",[t("img",{attrs:{src:n(520),alt:"BTCPay OpenCart: Enable debug mode",title:"BTCPay OpenCart: Enable debug mode"}})]),e._v(" "),t("p",[e._v("You can now find the debug output in the "),t("code",[e._v("error log")]),e._v(' in the menu "System -> Maintenence -> Error Logs".')]),e._v(" "),t("figure",[t("img",{attrs:{src:n(521),alt:"BTCPay OpenCart: Enable debug mode",title:"BTCPay OpenCart: Enable debug mode"}})]),e._v(" "),t("p",[e._v("*Please make sure to disable it after debugging is finished; otherwise, it will fill up your error logs.**")]),e._v(" "),t("p",[t("strong",[e._v("Example Error")]),e._v(":")]),e._v(" "),t("blockquote",[t("p",[e._v('2022-05-24 21:10:50 ERROR Error during POST to https://btcpay.example.com/api/v1/stores/4kD5bvAF5j8DokHqAzxb6MFDV4ikabcdefghijklm/invoices. Got response (401): {"code":"unauthenticated","message":"Authentication is required for accessing this endpoint"}')])]),e._v(" "),t("ul",[t("li",[t("p",[e._v("This means there is some authentication error. Likely your API key does not have permission to create invoices for that store. Make sure you give the API key the correct permissions, give it to the right store, and enter that in the OpenCart payment configuration form.")])]),e._v(" "),t("li",[t("p",[e._v('Another reason could be that you use a legacy API key. The legacy API keys are located in store settings -> Access Tokens. But you need to create an account API key located in Account -> Manage Account -> tab "API Keys". See section '),t("a",{attrs:{href:"#22-create-an-api-key-and-configure-permissions"}},[e._v("2.2 Create an API key and configure permissions")]),e._v(".")])])]),e._v(" "),t("h2",{attrs:{id:"the-order-states-do-not-update-although-the-invoice-has-been-paid"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#the-order-states-do-not-update-although-the-invoice-has-been-paid"}},[e._v("#")]),e._v(" The order states do not update, although the invoice has been paid.")]),e._v(" "),t("p",[e._v('Please check your invoice details to see if there were any errors on sending the webhook request. Some hosting providers, firewall setups, or security extensions may block POST requests to your site, which leads to an HTTP status of "403 forbidden".')]),e._v(" "),t("p",[e._v("You can check and verify yourself if there is something blocking requests to your site in one of these two ways:")]),e._v(" "),t("p",[t("strong",[e._v("1. Copy webhook callback URL")]),t("br"),e._v("\nGo to your "),t("em",[e._v("OpenCart BTCPay extension settings")]),e._v(' and copy the "URL" of the "Webhook Data" field. e.g., '),t("code",[e._v("https://YOURSTOREDOMAIN.TLD/index.php?route=extension/payment/btcpay/callback")])]),e._v(" "),t("figure",[t("img",{attrs:{src:n(299),alt:"BTCPay OpenCart: Save OpenCart Settings form",title:"BTCPay OpenCart: Save OpenCart Settings form"}})]),e._v(" "),t("p",[t("strong",[e._v("2.1 Check using a command line (Linux or MacOS):")])]),e._v(" "),t("div",{staticClass:"language- extra-class"},[t("pre",{pre:!0,attrs:{class:"language-text"}},[t("code",[e._v('curl -vX POST -H "Content-Type: application/json" \\\n -d \'{"data": "test"}\' WEBHOOK_CALLBACK_URL\n')])])]),t("p",[e._v("(replace "),t("code",[e._v("WEBHOOK_CALLBACK_URL")]),e._v(" with the one copied above)")]),e._v(" "),t("p",[e._v("Result:")]),e._v(" "),t("div",{staticClass:"language- extra-class"},[t("pre",{pre:!0,attrs:{class:"language-text"}},[t("code",[e._v(".... snip ....\n* upload completely sent off: 16 out of 16 bytes\n< HTTP/1.1 403 Forbidden\n< access-control-allow-origin: *\n< Content-Type: application/json; charset=UTF-8\n< X-Cloud-Trace-Context: 4f07d5b2e5c2f05949d04421a8e2dd6a\n< Date: Thu, 17 Feb 2022 10:06:50 GMT\n< Server: Google Frontend\n< Content-Length: 26\n")])])]),t("p",[e._v('If you see that line "HTTP/1.1 403 Forbidden" or "HTTP/2 403" something is blocking data sent to your OpenCart site. It would be best to ask your hosting provider or make sure no firewall or security extension is blocking the requests.')]),e._v(" "),t("p",[t("strong",[e._v("2.2 Check using an online service (if you do not have a command line available:")])]),e._v(" "),t("ul",[t("li",[e._v("Go to "),t("a",{attrs:{href:"https://reqbin.com/post-online",target:"_blank",rel:"noopener noreferrer"}},[e._v("https://reqbin.com/post-online"),t("OutboundLink")],1)]),e._v(" "),t("li",[t("ol",[t("li",[e._v("Enter your callback url (copied from step 1 above): "),t("code",[e._v("https://YOURSTOREDOMAIN.TLD/index.php?route=extension/payment/btcpay/callback")]),e._v("\n(replace this URL with the webhook callback url from step 1)")])])]),e._v(" "),t("li",[e._v('Make sure "POST" is selected')]),e._v(" "),t("li",[t("ol",{attrs:{start:"2"}},[t("li",[e._v("Click [Send]")])])])]),e._v(" "),t("figure",[t("img",{attrs:{src:n(293),alt:"BTCPay OpenCart: Webhook payload URL forbidden",title:"BTCPay OpenCart: Webhook payload URL forbidden"}})]),e._v(" "),t("p",[e._v('If you see "'),t("strong",[e._v("Status 403 (Forbidden)")]),e._v('" then POST requests to your site are blocked for some reason. You should ask your hosting provider or ensure no firewall or security extension is blocking the requests. If you see any other status code (200, 500, ...) a firewall problem seems not to apply. You probably need to investigate further.')]),e._v(" "),t("h2",{attrs:{id:"i-have-trouble-with-using-the-extension-or-some-other-related-questions"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#i-have-trouble-with-using-the-extension-or-some-other-related-questions"}},[e._v("#")]),e._v(" I have trouble with using the extension or some other related questions.")]),e._v(" "),t("p",[e._v("Feel free to join our support channel over at "),t("a",{attrs:{href:"https://chat.btcpayserver.org/",target:"_blank",rel:"noopener noreferrer"}},[e._v("https://chat.btcpayserver.org/"),t("OutboundLink")],1),e._v(" or "),t("a",{attrs:{href:"https://t.me/btcpayserver",target:"_blank",rel:"noopener noreferrer"}},[e._v("https://t.me/btcpayserver"),t("OutboundLink")],1),e._v(" if you need help or have any further questions.")])])}),[],!1,null,null,null);t.default=o.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[18],{293:function(e,t,n){e.exports=n.p+"assets/img/btcpay-vm--19-troubleshoot-403-callback.51193927.png"},299:function(e,t,n){e.exports=n.p+"assets/img/oc3--12--webhook-success.b5638028.png"},505:function(e,t,n){e.exports=n.p+"assets/img/oc3--01--upload-zip.a09f931a.png"},506:function(e,t,n){e.exports=n.p+"assets/img/oc3--02--install-btcpay.045a3912.png"},507:function(e,t,n){e.exports=n.p+"assets/img/oc3--03--configure-btcpay.f4329bcc.png"},508:function(e,t,n){e.exports=n.p+"assets/img/oc3--04--configure-btcpay-page.c7b27789.png"},509:function(e,t,n){e.exports=n.p+"assets/img/oc3--05--btcps-account-manage.d8f9b0b5.png"},510:function(e,t,n){e.exports=n.p+"assets/img/oc3--05--btcps-account-manage-add.f1d58bef.png"},511:function(e,t,n){e.exports=n.p+"assets/img/oc3--06--btcps-generate-api-key-permissions.e6be361e.png"},512:function(e,t,n){e.exports=n.p+"assets/img/oc3--07--btcps-generate-api-key-permissions-store.b5cc47ae.png"},513:function(e,t,n){e.exports=n.p+"assets/img/oc3--08--btcps-generate-api-key-result.3da35e17.png"},514:function(e,t,n){e.exports=n.p+"assets/img/oc3--09--btcps-store-id.59a07f51.png"},515:function(e,t,n){e.exports=n.p+"assets/img/oc3--10--save-settings.b1852b45.png"},516:function(e,t,n){e.exports=n.p+"assets/img/oc3--11--save-settings-success.c7a8ed3c.png"},517:function(e,t,n){e.exports=n.p+"assets/img/oc3--20--debug-mode-enable.952c68c8.png"},518:function(e,t,n){e.exports=n.p+"assets/img/oc3--21--error-logs.a324ae3f.png"},802:function(e,t,n){"use strict";n.r(t);var a=n(10),o=Object(a.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"opencart-integration"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#opencart-integration"}},[e._v("#")]),e._v(" OpenCart integration")]),e._v(" "),t("p",[e._v("This document explains how "),t("strong",[e._v("to integrate BTCPay Server into your OpenCart store")]),e._v(". Supported are OpenCart 3 and 4.")]),e._v(" "),t("h2",{attrs:{id:"requirements"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#requirements"}},[e._v("#")]),e._v(" Requirements")]),e._v(" "),t("p",[e._v("Please ensure that you meet the following requirements before installing this extension.")]),e._v(" "),t("ul",[t("li",[e._v("PHP version >= 7.4 for OpenCart 3; PHP >= 8.1 for OpenCart 4")]),e._v(" "),t("li",[e._v("The curl, gd, intl, json, and mbstring PHP extensions are available")]),e._v(" "),t("li",[e._v("A OpenCart 3/4 store ("),t("a",{attrs:{href:"https://www.opencart.com/index.php?route=cms/download",target:"_blank",rel:"noopener noreferrer"}},[e._v("Download and installation instructions"),t("OutboundLink")],1),e._v(")")]),e._v(" "),t("li",[t("strong",[e._v("IMPORTANT:")]),e._v(" You have a BTCPay Server version 1.3.0 or later, either "),t("RouterLink",{attrs:{to:"/Deployment/"}},[e._v("self-hosted")]),e._v(" or "),t("RouterLink",{attrs:{to:"/Deployment/ThirdPartyHosting/"}},[e._v("hosted by a third-party")])],1),e._v(" "),t("li",[t("RouterLink",{attrs:{to:"/RegisterAccount/"}},[e._v("You've a registered account on the instance")])],1),e._v(" "),t("li",[t("RouterLink",{attrs:{to:"/CreateStore/"}},[e._v("You've got a BTCPay store on the instance")])],1),e._v(" "),t("li",[t("RouterLink",{attrs:{to:"/WalletSetup/"}},[e._v("You've got a wallet connected to your store")])],1)]),e._v(" "),t("div",{staticClass:"custom-block tip"},[t("p",{staticClass:"custom-block-title"},[e._v("TIP")]),e._v(" "),t("p",[e._v("The instructions are based on OpenCart 3, but the UI and steps are almost identical to OpenCart 4. Therefore we have no separate instructions.")])]),e._v(" "),t("h2",{attrs:{id:"1-install-btcpay-extension"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#1-install-btcpay-extension"}},[e._v("#")]),e._v(" 1. Install BTCPay extension")]),e._v(" "),t("p",[e._v("There are three ways to "),t("strong",[e._v("download the BTCPay for OpenCart extension")]),e._v(":")]),e._v(" "),t("ul",[t("li",[e._v("Via the Admin Dashboard (recommended, see below)")]),e._v(" "),t("li",[t("a",{attrs:{href:"https://www.opencart.com/index.php?route=marketplace/extension/info&extension_id=44269",target:"_blank",rel:"noopener noreferrer"}},[e._v("OpenCart Marketplace"),t("OutboundLink")],1)]),e._v(" "),t("li",[t("a",{attrs:{href:"https://github.com/btcpayserver/opencart",target:"_blank",rel:"noopener noreferrer"}},[e._v("GitHub Repository"),t("OutboundLink")],1)])]),e._v(" "),t("h3",{attrs:{id:"11-install-the-extension-from-opencart-admin-dashboard"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#11-install-the-extension-from-opencart-admin-dashboard"}},[e._v("#")]),e._v(" 1.1 Install the extension from OpenCart admin dashboard")]),e._v(" "),t("p",[e._v("Note: work in progress, extension undergoing review atm.")]),e._v(" "),t("h3",{attrs:{id:"12-download-and-install-the-extension-from-marketplace-or-github"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#12-download-and-install-the-extension-from-marketplace-or-github"}},[e._v("#")]),e._v(" 1.2 Download and install the extension from Marketplace or GitHub")]),e._v(" "),t("ol",[t("li",[e._v("Download the latest BTCPay extension from "),t("a",{attrs:{href:"https://github.com/btcpayserver/opencart/releases",target:"_blank",rel:"noopener noreferrer"}},[e._v("Github"),t("OutboundLink")],1),e._v(" or "),t("a",{attrs:{href:"https://www.opencart.com/index.php?route=marketplace/extension/info&extension_id=44269",target:"_blank",rel:"noopener noreferrer"}},[e._v("Marketplace"),t("OutboundLink")],1)]),e._v(" "),t("li",[e._v("Menu: Extensions -> Install")]),e._v(" "),t("li",[e._v("Click the button [Upload] and upload the downloaded "),t("code",[e._v("btcpay.ocmod.zip")]),e._v('\nAfter uploading, you should see a notice "Success: You have modified extensions! "')])]),e._v(" "),t("figure",[t("img",{attrs:{src:n(505),alt:"BTCPay OpenCart: Extension installation upload",title:"BTCPay OpenCart: Extension installation upload"}})]),e._v(" "),t("h3",{attrs:{id:"13-install-the-extension"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#13-install-the-extension"}},[e._v("#")]),e._v(" 1.3 Install the extension")]),e._v(" "),t("ol",[t("li",[e._v("Menu: Extensions -> Extensions")]),e._v(" "),t("li",[e._v('On the "Choose extension type" dropdown, select "Payment".')]),e._v(" "),t("li",[e._v('On the "Action" column, click the green install button.')]),e._v(" "),t("li",[e._v('You will see a notification " Success: You have modified payments!"')])]),e._v(" "),t("figure",[t("img",{attrs:{src:n(506),alt:"BTCPay OpenCart: Install extension",title:"BTCPay OpenCart: Install extension"}})]),e._v(" "),t("h2",{attrs:{id:"2-connecting-opencart-and-btcpay-server"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#2-connecting-opencart-and-btcpay-server"}},[e._v("#")]),e._v(" 2. Connecting OpenCart and BTCPay Server")]),e._v(" "),t("p",[e._v("Please make sure to have a BTCPay Server instance setup as described in the "),t("a",{attrs:{href:"#requirements"}},[e._v("requirements")]),e._v(" above.")]),e._v(" "),t("p",[e._v("BTCPay for OpenCart extension is a "),t("strong",[e._v("bridge between your BTCPay Server (payment processor) and your e-commerce store")]),e._v(".\nNo matter if you're using a self-hosted or third-party solution, the connection process is identical.")]),e._v(" "),t("h3",{attrs:{id:"21-configure-btcpay-server-extension-in-opencart"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#21-configure-btcpay-server-extension-in-opencart"}},[e._v("#")]),e._v(" 2.1 Configure BTCPay Server extension in OpenCart")]),e._v(" "),t("ol",[t("li",[e._v("Menu: Extensions -> Extensions")]),e._v(" "),t("li",[e._v("Click the blue edit button\n"),t("img",{attrs:{src:n(507),alt:"BTCPay OpenCart: Add new payment method",title:"BTCPay OpenCart: Add new payment method"}})]),e._v(" "),t("li",[e._v("Configure BTCPay extension. "),t("img",{attrs:{src:n(508),alt:"BTCPay OpenCart: Payment method details",title:"BTCPay OpenCart: Payment method details"}})]),e._v(" "),t("li",[e._v('On the field "Payment Method Enabled" set it to '),t("code",[e._v("Enabled")])]),e._v(" "),t("li",[e._v('On field "BTCPay Server URL" set it to the URL where your BTCPay Server instance is reachable on the internet e.g. '),t("code",[e._v("https://mainnet.demo.btcpayserver.org/")]),e._v(". You can find information on how to deploy your BTCPay Server instance in the "),t("a",{attrs:{href:"#requirements"}},[e._v("requirements section above")])])]),e._v(" "),t("p",[e._v("Before you can continue, you need to create the API key for your user and store, as described in the next section. Keep this browser tab open, as we will come back shortly.")]),e._v(" "),t("h3",{attrs:{id:"22-create-an-api-key-and-configure-permissions"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#22-create-an-api-key-and-configure-permissions"}},[e._v("#")]),e._v(" 2.2 Create an API key and configure permissions")]),e._v(" "),t("p",[e._v("On your BTCPay Server instance:")]),e._v(" "),t("ol",[t("li",[e._v("Click on "),t("em",[e._v("[Account]")])]),e._v(" "),t("li",[e._v("Click on "),t("em",[e._v("[Manage Account]")]),e._v(" "),t("img",{attrs:{src:n(509),alt:"BTCPay OpenCart: Manage Account",title:"BTCPay OpenCart: Manage Account"}})]),e._v(" "),t("li",[e._v("Go to the tab "),t("em",[e._v('"API Keys"')])]),e._v(" "),t("li",[e._v("Click "),t("em",[e._v("[Generate Key]")]),e._v(" to select permissions."),t("br"),e._v(" "),t("img",{attrs:{src:n(510),alt:"BTCPay OpenCart: API Keys overview",title:"BTCPay OpenCart: API Keys overview"}})]),e._v(" "),t("li",[e._v('"Label": Add a label.')]),e._v(" "),t("li",[e._v('"Permissions": '),t("strong",[e._v("Important:")]),e._v(" click on the "),t("em",[e._v('"Select specific stores"')]),e._v(" link for the following permissions: "),t("code",[e._v("View invoices")]),e._v(", "),t("code",[e._v("Create invoice")]),e._v(", "),t("code",[e._v("Modify invoices")]),e._v(", "),t("code",[e._v("Modify stores webhooks")]),e._v(", "),t("code",[e._v("View your stores")]),e._v(" and select the store you created for your OpenCart site. This makes sure that the API key only has access to that specific store and can't drain any funds even if the key is lost.\n"),t("img",{attrs:{src:n(511),alt:"BTCPay OpenCart: API Keys Permissions",title:"BTCPay OpenCart: API Keys Permissions"}}),t("br"),e._v("\nIt should look like this:\n"),t("img",{attrs:{src:n(512),alt:"BTCPay OpenCart: API Keys Permissions",title:"BTCPay OpenCart: API Keys Permissions"}})]),e._v(" "),t("li",[e._v("Click on "),t("em",[e._v("[Generate API Key]")]),e._v(" at the bottom")]),e._v(" "),t("li",[e._v("Copy the generated API Key to your "),t("em",[e._v("OpenCart BTCPay settings")]),e._v(' form field "BTCPay API Key"\n'),t("img",{attrs:{src:n(513),alt:"BTCPay OpenCart: Copy API Key",title:"BTCPay OpenCart: Copy API Key"}})]),e._v(" "),t("li",[e._v("Back on BTCPay Server instance, go to your store settings and copy the store ID to your "),t("em",[e._v("OpenCart BTCPay Settings")]),e._v(" form"),t("br"),e._v(" "),t("img",{attrs:{src:n(514),alt:"BTCPay OpenCart: Copy Store ID",title:"BTCPay OpenCart: Copy Store ID"}})]),e._v(" "),t("li",[e._v("Back on "),t("em",[e._v("OpenCart BTCPay settings")]),e._v(" form make sure "),t("strong",[e._v("BTPCay Server URL")]),e._v(", "),t("strong",[e._v("API Key")]),e._v(" and "),t("strong",[e._v("Store ID")]),e._v(" are set and click "),t("strong",[e._v("[Save]")]),e._v(" button (on the top right)"),t("br"),e._v(" "),t("img",{attrs:{src:n(515),alt:"BTCPay OpenCart: Save OpenCart Settings form",title:"BTCPay OpenCart: Save OpenCart Settings form"}})])]),e._v(" "),t("p",[e._v('You should get back to the Extensions overview page and see the notification "BTCPay Server Payment details have been successfully updated.". If not, ensure your URL, API Key and Store ID are correct.\n'),t("img",{attrs:{src:n(516),alt:"BTCPay OpenCart: Save OpenCart Settings form",title:"BTCPay OpenCart: Save OpenCart Settings form"}})]),e._v(" "),t("p",[e._v('On successfully saving, the BTCPay extension automatically creates a webhook so OpenCart can get notified when payments settle or fail. To double check it was successful. You can do that by editing the BTCPay extension settings again if you see the "Webhook Data" field filled out like this:\n'),t("img",{attrs:{src:n(299),alt:"BTCPay OpenCart: Save OpenCart Settings form",title:"BTCPay OpenCart: Save OpenCart Settings form"}})]),e._v(" "),t("p",[e._v("As you can see on the BTCPay extension settings, you can customize the order statuses depending on the "),t("RouterLink",{attrs:{to:"/Invoices/#invoice-statuses"}},[e._v("invoice statuses")]),e._v(" and other common settings. The defaults should be a good starting point but feel free to adjust them to your use case.")],1),e._v(" "),t("h2",{attrs:{id:"3-test-the-checkout"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#3-test-the-checkout"}},[e._v("#")]),e._v(" 3. Test the checkout")]),e._v(" "),t("p",[e._v("Everything is ready to go now. Make a small test purchase and make sure the order status gets updated according to the BTCPay invoice status. On the BTCPay Server invoice details, you can see if the webhook events were successful.")]),e._v(" "),t("h2",{attrs:{id:"troubleshooting"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#troubleshooting"}},[e._v("#")]),e._v(" Troubleshooting")]),e._v(" "),t("h3",{attrs:{id:"enable-debug-mode"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#enable-debug-mode"}},[e._v("#")]),e._v(" Enable debug mode")]),e._v(" "),t("p",[e._v('If you have an error during checkout, you can enable the debugging mode on the BTCPay extension settings. Menu: Go to "Extensions -> extensions" select "Payments" on the "Choose Extension Type" dropdown and edit BTCPay Server extension.')]),e._v(" "),t("figure",[t("img",{attrs:{src:n(517),alt:"BTCPay OpenCart: Enable debug mode",title:"BTCPay OpenCart: Enable debug mode"}})]),e._v(" "),t("p",[e._v("You can now find the debug output in the "),t("code",[e._v("error log")]),e._v(' in the menu "System -> Maintenence -> Error Logs".')]),e._v(" "),t("figure",[t("img",{attrs:{src:n(518),alt:"BTCPay OpenCart: Enable debug mode",title:"BTCPay OpenCart: Enable debug mode"}})]),e._v(" "),t("p",[e._v("*Please make sure to disable it after debugging is finished; otherwise, it will fill up your error logs.**")]),e._v(" "),t("p",[t("strong",[e._v("Example Error")]),e._v(":")]),e._v(" "),t("blockquote",[t("p",[e._v('2022-05-24 21:10:50 ERROR Error during POST to https://btcpay.example.com/api/v1/stores/4kD5bvAF5j8DokHqAzxb6MFDV4ikabcdefghijklm/invoices. Got response (401): {"code":"unauthenticated","message":"Authentication is required for accessing this endpoint"}')])]),e._v(" "),t("ul",[t("li",[t("p",[e._v("This means there is some authentication error. Likely your API key does not have permission to create invoices for that store. Make sure you give the API key the correct permissions, give it to the right store, and enter that in the OpenCart payment configuration form.")])]),e._v(" "),t("li",[t("p",[e._v('Another reason could be that you use a legacy API key. The legacy API keys are located in store settings -> Access Tokens. But you need to create an account API key located in Account -> Manage Account -> tab "API Keys". See section '),t("a",{attrs:{href:"#22-create-an-api-key-and-configure-permissions"}},[e._v("2.2 Create an API key and configure permissions")]),e._v(".")])])]),e._v(" "),t("h2",{attrs:{id:"the-order-states-do-not-update-although-the-invoice-has-been-paid"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#the-order-states-do-not-update-although-the-invoice-has-been-paid"}},[e._v("#")]),e._v(" The order states do not update, although the invoice has been paid.")]),e._v(" "),t("p",[e._v('Please check your invoice details to see if there were any errors on sending the webhook request. Some hosting providers, firewall setups, or security extensions may block POST requests to your site, which leads to an HTTP status of "403 forbidden".')]),e._v(" "),t("p",[e._v("You can check and verify yourself if there is something blocking requests to your site in one of these two ways:")]),e._v(" "),t("p",[t("strong",[e._v("1. Copy webhook callback URL")]),t("br"),e._v("\nGo to your "),t("em",[e._v("OpenCart BTCPay extension settings")]),e._v(' and copy the "URL" of the "Webhook Data" field. e.g., '),t("code",[e._v("https://YOURSTOREDOMAIN.TLD/index.php?route=extension/payment/btcpay/callback")])]),e._v(" "),t("figure",[t("img",{attrs:{src:n(299),alt:"BTCPay OpenCart: Save OpenCart Settings form",title:"BTCPay OpenCart: Save OpenCart Settings form"}})]),e._v(" "),t("p",[t("strong",[e._v("2.1 Check using a command line (Linux or MacOS):")])]),e._v(" "),t("div",{staticClass:"language- extra-class"},[t("pre",{pre:!0,attrs:{class:"language-text"}},[t("code",[e._v('curl -vX POST -H "Content-Type: application/json" \\\n -d \'{"data": "test"}\' WEBHOOK_CALLBACK_URL\n')])])]),t("p",[e._v("(replace "),t("code",[e._v("WEBHOOK_CALLBACK_URL")]),e._v(" with the one copied above)")]),e._v(" "),t("p",[e._v("Result:")]),e._v(" "),t("div",{staticClass:"language- extra-class"},[t("pre",{pre:!0,attrs:{class:"language-text"}},[t("code",[e._v(".... snip ....\n* upload completely sent off: 16 out of 16 bytes\n< HTTP/1.1 403 Forbidden\n< access-control-allow-origin: *\n< Content-Type: application/json; charset=UTF-8\n< X-Cloud-Trace-Context: 4f07d5b2e5c2f05949d04421a8e2dd6a\n< Date: Thu, 17 Feb 2022 10:06:50 GMT\n< Server: Google Frontend\n< Content-Length: 26\n")])])]),t("p",[e._v('If you see that line "HTTP/1.1 403 Forbidden" or "HTTP/2 403" something is blocking data sent to your OpenCart site. It would be best to ask your hosting provider or make sure no firewall or security extension is blocking the requests.')]),e._v(" "),t("p",[t("strong",[e._v("2.2 Check using an online service (if you do not have a command line available:")])]),e._v(" "),t("ul",[t("li",[e._v("Go to "),t("a",{attrs:{href:"https://reqbin.com/post-online",target:"_blank",rel:"noopener noreferrer"}},[e._v("https://reqbin.com/post-online"),t("OutboundLink")],1)]),e._v(" "),t("li",[t("ol",[t("li",[e._v("Enter your callback url (copied from step 1 above): "),t("code",[e._v("https://YOURSTOREDOMAIN.TLD/index.php?route=extension/payment/btcpay/callback")]),e._v("\n(replace this URL with the webhook callback url from step 1)")])])]),e._v(" "),t("li",[e._v('Make sure "POST" is selected')]),e._v(" "),t("li",[t("ol",{attrs:{start:"2"}},[t("li",[e._v("Click [Send]")])])])]),e._v(" "),t("figure",[t("img",{attrs:{src:n(293),alt:"BTCPay OpenCart: Webhook payload URL forbidden",title:"BTCPay OpenCart: Webhook payload URL forbidden"}})]),e._v(" "),t("p",[e._v('If you see "'),t("strong",[e._v("Status 403 (Forbidden)")]),e._v('" then POST requests to your site are blocked for some reason. You should ask your hosting provider or ensure no firewall or security extension is blocking the requests. If you see any other status code (200, 500, ...) a firewall problem seems not to apply. You probably need to investigate further.')]),e._v(" "),t("h2",{attrs:{id:"i-have-trouble-with-using-the-extension-or-some-other-related-questions"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#i-have-trouble-with-using-the-extension-or-some-other-related-questions"}},[e._v("#")]),e._v(" I have trouble with using the extension or some other related questions.")]),e._v(" "),t("p",[e._v("Feel free to join our support channel over at "),t("a",{attrs:{href:"https://chat.btcpayserver.org/",target:"_blank",rel:"noopener noreferrer"}},[e._v("https://chat.btcpayserver.org/"),t("OutboundLink")],1),e._v(" or "),t("a",{attrs:{href:"https://t.me/btcpayserver",target:"_blank",rel:"noopener noreferrer"}},[e._v("https://t.me/btcpayserver"),t("OutboundLink")],1),e._v(" if you need help or have any further questions.")])])}),[],!1,null,null,null);t.default=o.exports}}]); \ No newline at end of file diff --git a/assets/js/19.43004657.js b/assets/js/19.bcb5572c.js similarity index 95% rename from assets/js/19.43004657.js rename to assets/js/19.bcb5572c.js index c72164fd9f..65ed002860 100644 --- a/assets/js/19.43004657.js +++ b/assets/js/19.bcb5572c.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[19],{595:function(A,e,t){A.exports=t.p+"assets/img/FrontPage.616c97f1.png"},596:function(A,e,t){A.exports=t.p+"assets/img/TicketApp.3fcd4bd4.png"},597:function(A,e){A.exports="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAvYAAABHCAMAAABbNvPrAAABJlBMVEX///+Ee/+l6v//6v9Se///1f8Ap////8+FJYrN///NiSkhJSkhic/qrGdhrOuFJWep5/8Ae/+E1f+FJSn/56xhJYr/zIohY6zq//9hY6zZ2tpVWVwAkP/n///G1f9Svv+lkP+l1f/G///Gp/+VkP/nvv8hiaypYykhJYqniSmFzP///+upY2dhJSmprGeFzM8hJWfNrGdhrKxhrM+lvv+EkP+lp/+FY2dhic/qrIqFic+piaxSkP+Evv+FrKzq/+vNiWfN/+upY4qEp/+FY6whY2dhY2dhJWchiYrNzIqFiWeFiYqpzP/NiYqpzKzNrKxSp/+p5+up589hiYrn1f8hY4rqzIqprIrXrGeFrOshJYGKYynN/8/q/8+prOvG6v9hY4qFY4oOC5SBAAAOD0lEQVR4AezBgQAAAACAoP2pF6kCAAAAAAAAAJj9slyMHIaBsJe7duKrU4aFMjMzvv8z3YyjTXKXMkO0SUxjST8+q+53sVI5M6hUZfRcq9XV663R1/StNsEdq6FNuiJ5voUBn7uD/+m/e0FbVdh3NOLsnCs/hn2OZQeLXol9Y8AYEzwH+8EhNg9iT8mrsR8eGf3J2BdWc2WiHz0X+/rrq72w/Czsx0YfwT4vKbAvbHzCTIzn0a5NtirVtnMdJdZlvzRVdZMt//cgwndaJCnLXOLETKc0OVuGswjv9JxzblrN1bv4lpxrQ4qpeixr5Vlm0Qdw4fzC4tKyWlmwamW1f3DNmGWU7nV8tTEbXjpsMKmX0SGj2mwCRwhHtiybxVSyPTAySg/AEn0TIIQgDV9EmiEQeJk5hIZbBXv6wQyDi9x67MM4R351kqTeWWAOsihR6aywr2UTxpgJ6QvvQn+lWk/v712wvKsAKUmeK6uamyb2qUSwJ+fdSM0Q846q7HW4sN9SM3WQXuYaNHVGAfOU3VHCiRDrZgiAgHPj4JAV+wiDxebgGtZIo15Mqn0Pe4AZjowSSajYwEQCNZmG62X2GwN8l33IY8aTvxCDBxaeVk6wIRDs4YelXqo9Z+ADk/EEv9qmSWqkrAOZ9lFlvyrsS5mh3XED6ZaBNTFlfY4qpy35S0BafZfYiyS525fn6t4FRUR77uy0NReJW64Rd/a5R2RSQoPkbm9JCRki3biYD2/3NYetnAqMSRL7OexjORoiTMAz2MthoY59ebNXIsIZniMq9ok/eRhLyGVoyNEwEZ4ASpMk6RN+LuJpiSq5fgsrqn3M9EyUHAbBfq6DFogL9iIRBRcVzgh5hosuf2V/JAR7qoi9g01Slq/2BIZdAsyLwyV+IJtHYpHYc+k+7LnLepCpX/4XexsP/sOe9xc5VFfX+K2iOmMqwd7ANqW40ynXfAlHNisLHI5cJElqyxAX8bSPJPvVd7Hibi9MyzCDPZvSndhnqj0XbvDutbg5U+3ZwVmg3Y19Wu1J5c7JaLhz3SRp2WrPzt3YcxeBo+7xas9Z+QdYbxzjvf3b3lkwOY4kUXh7ed1w1LHMvN5jZmZmxv//Jy6/qs9WlkLh8Iw1fb67fDEGlbJA9lN2dnW+SQKaydt7jjYX6MjRBt853C9S2ts83WznjgIheN/OkdPeDMT20p4Tjy16++hjbA+f3/pqRPbxgO9vNNr7O268h/7LtMelNlLK0+9F0Pz9L0LzFtvD9s0Q24dddNnT/vYHxPaQzThH2kejsX2iPc/RqN//fkT232/zTrE9w020p13a94iK5mmR0v5Zmzmy/3mjYJQedB5o3yJ8ad+2YZa9vZs88Jn37uVESPMdac95dnLeYJd/kfaGErpnfxHt0cIPu7eP47aTI6cxf/dHe9oTosROjmMk2j/U94IS7Z3rkz/WMBjKdAz/kx3tjXiiLboyNSELv9LyGoOwxTMtUtrbzJH9HygKhUKhUCgUCoVCoVAoFAqFQqFQKBQKhULps3r65kFcfPgEOeGx8I+vgyxEwdWK2Fwd2348zIsmOegBo6CeBEFJPHctCZmScUjjHK15WSol7Y+TGr66aLExc/EU2ot7pz05BcpLyKU0T5Pn1TQjZg0dwB3SvmhPIs3DJkv2vLRIxnl9yT3TDA7Q/nHf3iPtdZW3P/3P0f6qJQXBTJ7ILfsZSc0oWf63aF+Jx9IeHkJ7GSu/yTjG5/dc+od3zU0aGD6fR5YbSvs+Iu2v4/x5eYNRYoTo+Cpi9Qt+oHSVYcJGRqji+/nHWkKXcsLATmT4I84DlXxJM7gzIWvZnLRI4gwm0QsD8tA+mMYwCU66kXYJMzv/1aPsRYcxLCfMtERNaFsYKV803x6pVV7kZ5AvMnM8xcm27ADXGIeugSWbY/egUTITSYqWCtq/JROl/WMw+mHT5xPtkcjySHLDRHvsLx7m5TGkhq8zKKKth6NjM+cIoxFPByEnFV+IUol2k5xwJzLMucEQLWkGNZH2TS37pe+H6m9rLygdZ/MYW95Je+48JueRaf+tJjqkkRGlfVMT2qZ8kXZ+Nvzi2X4RLhKxpDPzQksD1xhjuIZYMmfJqH7QKFGhsf2HVZYglpLfEN67Ig7MR77YpQ/70DbRvgf/MD3a6ZW1KnSA8/Gv2+tvVUV9LKg0qfhgV5ITTiJDGcXzTEWiibSn6f1vfzweu17BOFg6jQGgsrE9hJTJE+0JvpiIA35+SPubRuneNglaek8vwkUynDPL/hSJcdQslOveWZBT3h4CZ28vvwl+eAnO6+Z9ybTHMNO+S8wjgqEnQ2PS7gVpz2gtpiL8GYEwRBWfxElywklkaDykwC9rBjWR9k31+sXbLwYv7RXUDmw9mtLp5TUcnHl71mIKPfyGynva04BmcZvki32tXoT3FE/O3G9Vf0ve3dNTSr93z52gYnvYuhDb45h7DPRLzi/SXrlhoj2uHudu/30nac+AtjNhQueeHJf2ySEqMky0n5R8PjTZ0z4OfrSNx81D9pJSaQxdu3Tj7Ty2N1Dh9Dd/helA+/c/+utYsN7eJXijgj6ajPbQAb1GhLjb5O0Z6w5QyN6esN2dHJnaQp1Xv/PwIu2VG460h+0GSG+12P6NnRyd0ZEXSnu7CP7Xjggo+DfRPskJFRkmTz0p+XxosqM9NI7I/pvxsJd74x45jbF99vZG2H0npzORhTz9my9yKO0VONKW5IubFtuHtbjusb0zY+QC2iRItFxDvGBEY+EuaN/DcZ3vWxzJbwKRFz9HZM4p4xX//wMfyg0H2iPM3cX4mBsqNW9/4QbPi79tbQlGEoYd0j7JCRUZJtonJZ8PTaS9pGMvx17BT8Iij5z0d18wtmdemdkjKKMXRYfwdDunPYyfyReVJMZgLpKdHGeOWZ75vafinvsDtq6hsf9jZ7STUzBmORXcJ//NMHZZqx9EP1sU9P1F++ubVXMZzpr2hTfY3yza337sfv5ce+2+aNG+UCgUCoVCoVAoFAqFQqFQOAFkEJwAJSmnQ1XgaSb3s8/4zB9Pl5McuS1pfsLJo2mAzebq+MnOQEl5BoXAXm0JBwvSJ/WFK8DUyDO6bpPel9nlyTOj/fLnI+3vc7JRSWm2h0rKFZVkvj0v2j+8rPhTX7gKyUhYuf3TGdPe9IH/M9onJaX5d2QEqqQ8f9qfnHjMH1AVCDbFn/mRQy1CBIGv9zTND+fCg0gGe5GrpiC0mOHSd2dFQksM8lm0lHUq+1Gl8M9/0cvEt6SoUI3eVMkwCujE41lMlAbulXjmdm2fjscwldUMsyzwWrfGOTPJbjixUfTHCPMxDggbCbme7iV+bpQKajouUnOgzJE7jK87Lx4rP5J3/0oAE+8RKcbwemGOfJb2e5mjKsYjNZVZSckYKykpmefXTUCJzbZpKf/2pNmAfBM+Y8dKHcCyj5jPZaX2WFNmIu0VCOrtVZykWoToTR43wX4qPKhdNJOmGe253mH2nqkioSUGezkdK/tRpZBzOidFhV2j9w37NXEej5skDUxKPF6ehkswcJiqT/KNlF2fUjP19rEcqxi63tkYh4SN18gLsX/i765c09kiNQ9wIjooEZgt3sqJXWzG1IoUW1dpaFui/VQ0kZ7HaSqTkpJhVlFSpmc/hTZ8p32fZfo+GhzAK1BkOcpKpcm6osLH9wLBifZ67Fktwjc+bOHB1NZoz79c73B3CyfB0KwiYVNpfHBWgQqYOaxGb+zng+6TUNAZ6ORjNpWTKAvsQ0Zfhet72oNraT9f7iFhY7DgD1cO7co1HRepudfYZoj554uXkCyInwF4xZ36INXVsi3RfiqaKFEPayqzklJerqOk9PKdgnET7Xur3wd2wPU6fG+YyUrtsb63VyA49/apFiEvcP7hofDgW/Gm0f71phgcSgElukv/dAlo7faVAZdor6gw9xtpr2JqifbjVE6iLFDat8+a44n22En7cdrDwkaDiSyQGU1d5M5c2kMeeLMdF58qJ1p+UZHiFIbEGLZl2ls9Thodo6nM2hqGWUdJyceCVMKVD96+X5HfB3bpVyuHV3ExykrtsX5sb/wi7Y3ts7eH9kHwf8RTLjyIydzbZ9rLhMF9SrQbP73AMu15Sf0Waa8Sb9nbO5WTTLLAZW+P9ZK3x+CAsJHXH1/ZzZWPpi5Sc6+x/5z49l8Zer74ydv/PMIRaZEr6yb15Uh7rupYTWVWUjr6iUpKwYDeSjNv35fMFNrZ4gyDyDLLSu2xHqS9AkFpH1BfmGsRQvs3vhNvpsKDimKRThnbJ9oLYk12cvYVCeXR7T//9ZRR5jLt1ej9zX6LtFeJN2PObConmWSBLQKex/Z0SLH9OMYhYSMsZE5ie1c+mrpIzQG1FaM1TH8Ss4yLnyoncvR0j3hH2hMeXS3R/llVjEdpKgdvz5LcyTlNSak15/wUlOX3HT3e7b4PL8kB+vB/U2Q5ykrtgcmqtFcgCPU7p9UX5lqE0J5SnrnwIFavu5NDzyXaG0P6O7o84sO+8hzfceNCMDHRXo2e/ZZprxJvxpz5VEySZYEUInTDJNHeKoZWKRzGOChsJMSJB/ZbV67pfJGYy72Pt8G97YfFK2KU9vxKrUjRz6ev21hgTntVjEdqKpOSkuvl6HQlJW+4YWKu/im0t09H42brZ9q+D+1AG8DhFVmOslJ6aFK4V92T7D2nRUKjM1A/nudHdugzKugxj2fe2SxSt7syNld34FHuDgSehQw3ELbHywLPa5Hs1K8KVYx3oKS8I2zOv7p1oVAoFAqFQqFQKBQKhUKhUCgUCoVCofBvZQspYm2wM7AAAAAASUVORK5CYII="},598:function(A,e,t){A.exports=t.p+"assets/img/ExternalService_Setup.9c2a74c4.png"},599:function(A,e){A.exports="data:image/png;base64,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"},600:function(A,e,t){A.exports=t.p+"assets/img/SIN_PairingCode.cd005782.jpg"},601:function(A,e,t){A.exports=t.p+"assets/img/ExternalService_Add.f82f2998.png"},602:function(A,e){A.exports="data:image/png;base64,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"},603:function(A,e){A.exports="data:image/png;base64,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"},604:function(A,e){A.exports="data:image/png;base64,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"},605:function(A,e,t){A.exports=t.p+"assets/img/CustomerEmailBody.d9e6d6a4.png"},606:function(A,e,t){A.exports=t.p+"assets/img/EmployeeEmail.f299755f.png"},607:function(A,e,t){A.exports=t.p+"assets/img/FinalRecipeView.863abe31.png"},608:function(A,e,t){A.exports=t.p+"assets/img/ReceivedCustomerEmailBody.7466a15a.png"},609:function(A,e,t){A.exports=t.p+"assets/img/EmployeeEmailBody.ea00b163.jpg"},821:function(A,e,t){"use strict";t.r(e);var i=t(10),a=Object(i.a)({},(function(){var A=this,e=A._self._c;return e("ContentSlotsDistributor",{attrs:{"slot-key":A.$parent.slotKey}},[e("h1",{attrs:{id:"btcpay-email-receipts-ticket-sale-guide"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#btcpay-email-receipts-ticket-sale-guide"}},[A._v("#")]),A._v(" BTCPay Email Receipts - Ticket Sale Guide")]),A._v(" "),e("figure",[e("img",{attrs:{src:t(595),alt:"FrontPage",title:"FrontPage"}})]),A._v(" "),e("p",[A._v("This guide shows how to setup a simple event ticket sale system, using the "),e("strong",[A._v("BTCPay Email Receipts")]),A._v(" preset in Transmuter.")]),A._v(" "),e("p",[A._v("Transmuter is currently in "),e("em",[A._v("alpha state")]),A._v(", but this preset relies mainly on sending emails, so it's fairly easy to use with your BTCPay, even if you are not a developer. What you will need in addition to Transmuter is, a BTCPayServer instance with at least one store and a few email accounts for testing your ticketing setup. This guide is using Gmail for simplicity, although other email clients can be used.")]),A._v(" "),e("h2",{attrs:{id:"how-the-ticket-sale-system-works"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#how-the-ticket-sale-system-works"}},[A._v("#")]),A._v(" How the Ticket Sale System Works")]),A._v(" "),e("p",[A._v("Create a simple BTCPay Point Of Sale App that sells tickets for a future event with limited quantity.\nWhen someone purchases a ticket in the connected BTCPayServer POS App, send the customer an email receipt containing their QR code event ticket and send an email receipt to the event organizer, alerting of the ticket sale and the payment details.")]),A._v(" "),e("h2",{attrs:{id:"btcpay-pos-app-setup"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#btcpay-pos-app-setup"}},[A._v("#")]),A._v(" BTCPay POS App Setup")]),A._v(" "),e("p",[A._v('First create a Point of Sale App in BTCPayServer called "Ticket App" with one product (our event ticket), which has an inventory limit of quantity 30.')]),A._v(" "),e("figure",[e("img",{attrs:{src:t(596),alt:"TicketApp",title:"TicketApp"}})]),A._v(" "),e("h2",{attrs:{id:"transmuter-email-receipts-setup"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#transmuter-email-receipts-setup"}},[A._v("#")]),A._v(" Transmuter Email Receipts Setup")]),A._v(" "),e("p",[A._v("In our Transmuter create a Preset > BTCPay Email Receipts.")]),A._v(" "),e("figure",[e("img",{attrs:{src:t(597),alt:"Presets",title:"Presets"}})]),A._v(" "),e("figure",[e("img",{attrs:{src:t(598),alt:"ExternalService_Setup",title:"ExternalService_Setup"}})]),A._v(" "),e("p",[A._v("Next, connect our BTCPay as an external service to Transmuter.")]),A._v(" "),e("figure",[e("img",{attrs:{src:t(599),alt:"CreateBTCPayService",title:"CreateBTCPayService"}})]),A._v(" "),e("p",[A._v("Next obtain a pairing code from our BTCPay. So Transmuter can send emails when BTCPay POS invoices are paid.")]),A._v(" "),e("figure",[e("img",{attrs:{src:t(600),alt:"SIN_PairingCode",title:"SIN_PairingCode"}})]),A._v(" "),e("p",[A._v("Once pairing is successful shows in your BTCPay, go back to Transmuter press Save to authorize your BTCPay client connection.")]),A._v(" "),e("figure",[e("img",{attrs:{src:t(601),alt:"ExternalService_Add",title:"ExternalService_Add"}})]),A._v(" "),e("p",[A._v("Next create an email sending SMTP service.")]),A._v(" "),e("figure",[e("img",{attrs:{src:t(602),alt:"CreateExternalService_SMTP",title:"CreateExternalService_SMTP"}})]),A._v(" "),e("p",[A._v("See this "),e("RouterLink",{attrs:{to:"/FAQ/FAQ-ServerSettings/#how-to-configure-smtp-settings-in-btcpay"}},[A._v("SMTP settings example")]),A._v(" for setup. Save after data is updated, and return to preset of Email Forwarder.")],1),A._v(" "),e("figure",[e("img",{attrs:{src:t(603),alt:"InvoiceStatusTrigger",title:"InvoiceStatusTrigger"}})]),A._v(" "),e("p",[A._v("Choose the invoice status to send ticket email receipts on. During testing, use the "),e("strong",[A._v("New")]),A._v(" invoice status, so that payment is not required to send emails. Once everything is setup correctly and working properly, choose a status like "),e("RouterLink",{attrs:{to:"/Invoices/"}},[A._v("Paid or Confirmed")]),A._v(".")],1),A._v(" "),e("figure",[e("img",{attrs:{src:t(604),alt:"SendEmailToCustomerEmail",title:"SendEmailToCustomerEmail"}})]),A._v(" "),e("p",[A._v("Select send email to the address registered on the BTCPay Invoice. Be sure that the refund email setting has not been "),e("RouterLink",{attrs:{to:"/FAQ/FAQ-Stores/#how-to-disable-email-on-invoices"}},[A._v("disabled")]),A._v(" in your BTCPay store, in order to prompt customers to provide their email before paying the invoice.")],1),A._v(" "),e("p",[A._v("Next supply the sending email address, email subject and email body. Note the highlighted line in the picture below, it uses http://goqr.me/api to create a QR code of the invoice payment which will be used as the event ticket inside the customer's receipt email.")]),A._v(" "),e("figure",[e("img",{attrs:{src:t(605),alt:"CustomerEmailBody",title:"CustomerEmailBody"}})]),A._v(" "),e("p",[A._v("After saving, there will be a recipe which has been generated by the preset. In the action group, there will be one email for the customer. Next, add a second email to notify the owner of the ticket sale. This is also important in case the customer provides an incorrect email, the event organizer will still receive their payment information.")]),A._v(" "),e("figure",[e("img",{attrs:{src:t(606),alt:"EmployeeEmail",title:"EmployeeEmail"}})]),A._v(" "),e("p",[A._v("Add your second email account details, email subject and HTML email body. Note some of the purchase data you can insert into the event organizer email receipt. Press save.")]),A._v(" "),e("p",[A._v("Be sure to enable your recipe (checkbox).")]),A._v(" "),e("figure",[e("img",{attrs:{src:t(607),alt:"FinalRecipeView",title:"FinalRecipeView"}})]),A._v(" "),e("p",[A._v("Once the recipe is "),e("strong",[A._v("enabled")]),A._v(", start creating invoices in the BTCPay POS Ticket App and see the emails sent. Providing a valid email in the POS invoice creation process will send an event ticket email receipt to the customer and a payment email to the event organizer.")]),A._v(" "),e("p",[A._v("When the QR code contained in the customer email is scanned (with phone camera for example), it will lead to the BTCPay invoice page to verify the ticket at your event.")]),A._v(" "),e("p",[A._v("Below is a basic HTML email template that the customer would receive and a basic HTML email template that the event organizer would receive, with some invoice data from the time of purchase. Feel free to improve these demo "),e("a",{attrs:{href:"https://github.com/btcpayserver/btcTransmuter/tree/master/docs/templates",target:"_blank",rel:"noopener noreferrer"}},[A._v("templates"),e("OutboundLink")],1),A._v(".")]),A._v(" "),e("p",[e("img",{attrs:{src:t(608),alt:"ReceivedCustomerEmailBody",title:"ReceivedCustomerEmailBody"}}),A._v(" "),e("img",{attrs:{src:t(609),alt:"EmployeeEmailBody",title:"EmployeeEmailBody"}})])])}),[],!1,null,null,null);e.default=a.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[19],{563:function(A,e,t){A.exports=t.p+"assets/img/FrontPage.616c97f1.png"},564:function(A,e,t){A.exports=t.p+"assets/img/TicketApp.3fcd4bd4.png"},565:function(A,e){A.exports="data:image/png;base64,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"},566:function(A,e,t){A.exports=t.p+"assets/img/ExternalService_Setup.9c2a74c4.png"},567:function(A,e){A.exports="data:image/png;base64,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"},568:function(A,e,t){A.exports=t.p+"assets/img/SIN_PairingCode.cd005782.jpg"},569:function(A,e,t){A.exports=t.p+"assets/img/ExternalService_Add.f82f2998.png"},570:function(A,e){A.exports="data:image/png;base64,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"},571:function(A,e){A.exports="data:image/png;base64,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"},572:function(A,e){A.exports="data:image/png;base64,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"},573:function(A,e,t){A.exports=t.p+"assets/img/CustomerEmailBody.d9e6d6a4.png"},574:function(A,e,t){A.exports=t.p+"assets/img/EmployeeEmail.f299755f.png"},575:function(A,e,t){A.exports=t.p+"assets/img/FinalRecipeView.863abe31.png"},576:function(A,e,t){A.exports=t.p+"assets/img/ReceivedCustomerEmailBody.7466a15a.png"},577:function(A,e,t){A.exports=t.p+"assets/img/EmployeeEmailBody.ea00b163.jpg"},816:function(A,e,t){"use strict";t.r(e);var i=t(10),a=Object(i.a)({},(function(){var A=this,e=A._self._c;return e("ContentSlotsDistributor",{attrs:{"slot-key":A.$parent.slotKey}},[e("h1",{attrs:{id:"btcpay-email-receipts-ticket-sale-guide"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#btcpay-email-receipts-ticket-sale-guide"}},[A._v("#")]),A._v(" BTCPay Email Receipts - Ticket Sale Guide")]),A._v(" "),e("figure",[e("img",{attrs:{src:t(563),alt:"FrontPage",title:"FrontPage"}})]),A._v(" "),e("p",[A._v("This guide shows how to setup a simple event ticket sale system, using the "),e("strong",[A._v("BTCPay Email Receipts")]),A._v(" preset in Transmuter.")]),A._v(" "),e("p",[A._v("Transmuter is currently in "),e("em",[A._v("alpha state")]),A._v(", but this preset relies mainly on sending emails, so it's fairly easy to use with your BTCPay, even if you are not a developer. What you will need in addition to Transmuter is, a BTCPayServer instance with at least one store and a few email accounts for testing your ticketing setup. This guide is using Gmail for simplicity, although other email clients can be used.")]),A._v(" "),e("h2",{attrs:{id:"how-the-ticket-sale-system-works"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#how-the-ticket-sale-system-works"}},[A._v("#")]),A._v(" How the Ticket Sale System Works")]),A._v(" "),e("p",[A._v("Create a simple BTCPay Point Of Sale App that sells tickets for a future event with limited quantity.\nWhen someone purchases a ticket in the connected BTCPayServer POS App, send the customer an email receipt containing their QR code event ticket and send an email receipt to the event organizer, alerting of the ticket sale and the payment details.")]),A._v(" "),e("h2",{attrs:{id:"btcpay-pos-app-setup"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#btcpay-pos-app-setup"}},[A._v("#")]),A._v(" BTCPay POS App Setup")]),A._v(" "),e("p",[A._v('First create a Point of Sale App in BTCPayServer called "Ticket App" with one product (our event ticket), which has an inventory limit of quantity 30.')]),A._v(" "),e("figure",[e("img",{attrs:{src:t(564),alt:"TicketApp",title:"TicketApp"}})]),A._v(" "),e("h2",{attrs:{id:"transmuter-email-receipts-setup"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#transmuter-email-receipts-setup"}},[A._v("#")]),A._v(" Transmuter Email Receipts Setup")]),A._v(" "),e("p",[A._v("In our Transmuter create a Preset > BTCPay Email Receipts.")]),A._v(" "),e("figure",[e("img",{attrs:{src:t(565),alt:"Presets",title:"Presets"}})]),A._v(" "),e("figure",[e("img",{attrs:{src:t(566),alt:"ExternalService_Setup",title:"ExternalService_Setup"}})]),A._v(" "),e("p",[A._v("Next, connect our BTCPay as an external service to Transmuter.")]),A._v(" "),e("figure",[e("img",{attrs:{src:t(567),alt:"CreateBTCPayService",title:"CreateBTCPayService"}})]),A._v(" "),e("p",[A._v("Next obtain a pairing code from our BTCPay. So Transmuter can send emails when BTCPay POS invoices are paid.")]),A._v(" "),e("figure",[e("img",{attrs:{src:t(568),alt:"SIN_PairingCode",title:"SIN_PairingCode"}})]),A._v(" "),e("p",[A._v("Once pairing is successful shows in your BTCPay, go back to Transmuter press Save to authorize your BTCPay client connection.")]),A._v(" "),e("figure",[e("img",{attrs:{src:t(569),alt:"ExternalService_Add",title:"ExternalService_Add"}})]),A._v(" "),e("p",[A._v("Next create an email sending SMTP service.")]),A._v(" "),e("figure",[e("img",{attrs:{src:t(570),alt:"CreateExternalService_SMTP",title:"CreateExternalService_SMTP"}})]),A._v(" "),e("p",[A._v("See this "),e("RouterLink",{attrs:{to:"/FAQ/FAQ-ServerSettings/#how-to-configure-smtp-settings-in-btcpay"}},[A._v("SMTP settings example")]),A._v(" for setup. Save after data is updated, and return to preset of Email Forwarder.")],1),A._v(" "),e("figure",[e("img",{attrs:{src:t(571),alt:"InvoiceStatusTrigger",title:"InvoiceStatusTrigger"}})]),A._v(" "),e("p",[A._v("Choose the invoice status to send ticket email receipts on. During testing, use the "),e("strong",[A._v("New")]),A._v(" invoice status, so that payment is not required to send emails. Once everything is setup correctly and working properly, choose a status like "),e("RouterLink",{attrs:{to:"/Invoices/"}},[A._v("Paid or Confirmed")]),A._v(".")],1),A._v(" "),e("figure",[e("img",{attrs:{src:t(572),alt:"SendEmailToCustomerEmail",title:"SendEmailToCustomerEmail"}})]),A._v(" "),e("p",[A._v("Select send email to the address registered on the BTCPay Invoice. Be sure that the refund email setting has not been "),e("RouterLink",{attrs:{to:"/FAQ/FAQ-Stores/#how-to-disable-email-on-invoices"}},[A._v("disabled")]),A._v(" in your BTCPay store, in order to prompt customers to provide their email before paying the invoice.")],1),A._v(" "),e("p",[A._v("Next supply the sending email address, email subject and email body. Note the highlighted line in the picture below, it uses http://goqr.me/api to create a QR code of the invoice payment which will be used as the event ticket inside the customer's receipt email.")]),A._v(" "),e("figure",[e("img",{attrs:{src:t(573),alt:"CustomerEmailBody",title:"CustomerEmailBody"}})]),A._v(" "),e("p",[A._v("After saving, there will be a recipe which has been generated by the preset. In the action group, there will be one email for the customer. Next, add a second email to notify the owner of the ticket sale. This is also important in case the customer provides an incorrect email, the event organizer will still receive their payment information.")]),A._v(" "),e("figure",[e("img",{attrs:{src:t(574),alt:"EmployeeEmail",title:"EmployeeEmail"}})]),A._v(" "),e("p",[A._v("Add your second email account details, email subject and HTML email body. Note some of the purchase data you can insert into the event organizer email receipt. Press save.")]),A._v(" "),e("p",[A._v("Be sure to enable your recipe (checkbox).")]),A._v(" "),e("figure",[e("img",{attrs:{src:t(575),alt:"FinalRecipeView",title:"FinalRecipeView"}})]),A._v(" "),e("p",[A._v("Once the recipe is "),e("strong",[A._v("enabled")]),A._v(", start creating invoices in the BTCPay POS Ticket App and see the emails sent. Providing a valid email in the POS invoice creation process will send an event ticket email receipt to the customer and a payment email to the event organizer.")]),A._v(" "),e("p",[A._v("When the QR code contained in the customer email is scanned (with phone camera for example), it will lead to the BTCPay invoice page to verify the ticket at your event.")]),A._v(" "),e("p",[A._v("Below is a basic HTML email template that the customer would receive and a basic HTML email template that the event organizer would receive, with some invoice data from the time of purchase. Feel free to improve these demo "),e("a",{attrs:{href:"https://github.com/btcpayserver/btcTransmuter/tree/master/docs/templates",target:"_blank",rel:"noopener noreferrer"}},[A._v("templates"),e("OutboundLink")],1),A._v(".")]),A._v(" "),e("p",[e("img",{attrs:{src:t(576),alt:"ReceivedCustomerEmailBody",title:"ReceivedCustomerEmailBody"}}),A._v(" "),e("img",{attrs:{src:t(577),alt:"EmployeeEmailBody",title:"EmployeeEmailBody"}})])])}),[],!1,null,null,null);e.default=a.exports}}]); \ No newline at end of file diff --git a/assets/js/20.7acfb628.js b/assets/js/20.17921d3b.js similarity index 86% rename from assets/js/20.7acfb628.js rename to assets/js/20.17921d3b.js index 93ca73845b..49b0087f24 100644 --- a/assets/js/20.7acfb628.js +++ b/assets/js/20.17921d3b.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[20],{431:function(e,t,r){e.exports=r.p+"assets/img/ElectrumWallet1.584fbbe1.png"},432:function(e,t,r){e.exports=r.p+"assets/img/ElectrumWallet2.b93dd22b.png"},433:function(e,t,r){e.exports=r.p+"assets/img/ElectrumWallet3.9838bf5a.png"},434:function(e,t,r){e.exports=r.p+"assets/img/ElectrumWallet4.dec51a41.png"},435:function(e,t,r){e.exports=r.p+"assets/img/ElectrumWallet9.474b2e7a.png"},436:function(e,t,r){e.exports=r.p+"assets/img/ElectrumWallet10.6fd1db5f.png"},437:function(e,t,r){e.exports=r.p+"assets/img/btcpayWalletImport1.6c214d88.jpg"},438:function(e,t,r){e.exports=r.p+"assets/img/btcpayWalletImport2.d39a2fb0.jpg"},439:function(e,t,r){e.exports=r.p+"assets/img/btcpayWalletImport3.4ad4427f.jpg"},440:function(e,t,r){e.exports=r.p+"assets/img/SetupWalletXpub.195df229.png"},441:function(e,t,r){e.exports=r.p+"assets/img/ElectrumWallet11.9ea45c82.png"},442:function(e,t,r){e.exports=r.p+"assets/img/ElectrumWallet11a.05edcf6d.png"},443:function(e,t,r){e.exports=r.p+"assets/img/ElectrumWallet12.139c7796.png"},773:function(e,t,r){"use strict";r.r(t);var a=r(10),l=Object(a.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"connecting-electrum-wallet-to-btcpay-server"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#connecting-electrum-wallet-to-btcpay-server"}},[e._v("#")]),e._v(" Connecting Electrum Wallet to BTCPay Server")]),e._v(" "),t("p",[e._v("This document explains "),t("strong",[e._v("how to connect a desktop "),t("a",{attrs:{href:"https://electrum.org/",target:"_blank",rel:"noopener noreferrer"}},[e._v("Electrum Wallet"),t("OutboundLink")],1),e._v(" to a BTCPay Server")]),e._v(".")]),e._v(" "),t("p",[t("strong",[e._v("Word of caution")]),e._v(" Electrum wallet relies on Electrum servers that are controlled by third-parties. Information, like public addresses, balances and the transacted amount can "),t("em",[e._v("potentially")]),e._v(" be leaked.")]),e._v(" "),t("p",[e._v("To protect yourself against such leaks, set up "),t("RouterLink",{attrs:{to:"/ElectrumX/"}},[e._v("ElectrumX Server")]),e._v(" or "),t("a",{attrs:{href:"https://github.com/chris-belcher/electrum-personal-server",target:"_blank",rel:"noopener noreferrer"}},[e._v("Electrum Personal Server - EPS"),t("OutboundLink")],1),e._v(".")],1),e._v(" "),t("p",[e._v("You can read about the differences between EPS and ElectrumX "),t("a",{attrs:{href:"https://www.reddit.com/r/Electrum/comments/7xb0lz/whats_the_difference_between_electrumx_server_and/",target:"_blank",rel:"noopener noreferrer"}},[e._v("here"),t("OutboundLink")],1),e._v(".")]),e._v(" "),t("ol",[t("li",[e._v("Create a Store in BTCPay Server")]),e._v(" "),t("li",[t("a",{attrs:{href:"https://electrum.org/#download",target:"_blank",rel:"noopener noreferrer"}},[e._v("Download"),t("OutboundLink")],1),e._v(" and install Electrum Wallet")])]),e._v(" "),t("h2",{attrs:{id:"electrum-wallet-setup"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#electrum-wallet-setup"}},[e._v("#")]),e._v(" Electrum Wallet Setup")]),e._v(" "),t("p",[e._v("After the installation, open "),t("strong",[e._v("Electrum Wallet")]),e._v(" by clicking on the icon on your desktop.")]),e._v(" "),t("h3",{attrs:{id:"quick-setup"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#quick-setup"}},[e._v("#")]),e._v(" Quick Setup")]),e._v(" "),t("p",[e._v("The easiest way to setup your Electrum wallet with BTCPay is to import an a wallet file backup to your BTCPay Server.")]),e._v(" "),t("ol",[t("li",[e._v("Create a new Electrum Wallet")]),e._v(" "),t("li",[e._v("In Electrum, File > Save Backup > Save in folder")]),e._v(" "),t("li",[e._v("In BTCPay Server, Store > Settings > Setup > Import Wallet File > Choose File > Continue")]),e._v(" "),t("li",[e._v("Go to Receive tab in Electrum.")]),e._v(" "),t("li",[e._v("Compare the addresses in Electrum and BTCPay Server, they should match.")]),e._v(" "),t("li",[e._v("Confirm the address match in BTCPay.")])]),e._v(" "),t("h2",{attrs:{id:"step-by-step"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#step-by-step"}},[e._v("#")]),e._v(" Step by Step")]),e._v(" "),t("p",[e._v("The following setup guides you through setting up an entirely new Bech32(SegWit) Wallet in Electrum. If you already have a wallet skip to the Extended Public Key copying.")]),e._v(" "),t("p",[e._v("Firstly, give your wallet a name, for example, "),t("code",[e._v("BTCPay Server Wallet")]),e._v(" and click "),t("code",[e._v("Next")]),e._v(".")]),e._v(" "),t("figure",[t("img",{attrs:{src:r(431),alt:"ElectrumWallet",title:"ElectrumWallet"}})]),e._v(" "),t("p",[e._v("Choose "),t("code",[e._v("Standard wallet")]),e._v(" and proceed by clicking the "),t("code",[e._v("Next")]),e._v("button.")]),e._v(" "),t("figure",[t("img",{attrs:{src:r(432),alt:"ElectrumWallet",title:"ElectrumWallet"}})]),e._v(" "),t("p",[e._v("Since we're creating a brand-new wallet,choose "),t("code",[e._v("Create a new seed")]),e._v(" and "),t("code",[e._v("Next")])]),e._v(" "),t("figure",[t("img",{attrs:{src:r(433),alt:"ElectrumWallet",title:"ElectrumWallet"}})]),e._v(" "),t("p",[e._v("From the multiple choice menu, select "),t("code",[e._v("SegWit")]),e._v(" and "),t("code",[e._v("Next")])]),e._v(" "),t("figure",[t("img",{attrs:{src:r(434),alt:"ElectrumWallet",title:"ElectrumWallet"}})]),e._v(" "),t("p",[t("strong",[e._v("IMPORTANT NOTE:")]),e._v(" If you're a merchant, instead of SegWit (Bech32), it's recommended to use SegWit wrapped (P2SH) format. "),t("a",{attrs:{href:"https://www.youtube.com/watch?v=-1DBJWwA2Cw",target:"_blank",rel:"noopener noreferrer"}},[e._v("This guide"),t("OutboundLink")],1),e._v(" explains how to create P2SH wallet in Electrum that's more suited for merchants, due to compatability with legacy wallets customers use.")]),e._v(" "),t("p",[t("strong",[e._v("IMPORTANT NOTE 2:")]),e._v(" Write down your recovery words in the order you see them on the screen. Write them down a piece of paper and store it somewhere secure. Take your time and triple check each word. Do not store your seed in a digital format (photograph, text document). Whoever has the access to your seed can access your funds. Confirm that the seed has been properly backed up by re-entering it in the same order. Once the seed is validated, proceed to the next step.")]),e._v(" "),t("p",[e._v("Copy and paste your seed words to complete your wallet creation in Electrum. Your wallet must be unencrypted to import it into your BTCPay Server. Once you have completed the setup of your wallet in BTCPay you can always add password encryption later in Electrum.")]),e._v(" "),t("p",[e._v("Follow along in the video below on how to import into BTCPay Server.")]),e._v(" "),t("a",{staticClass:"ytEmbed",staticStyle:{"background-image":"url(https://img.youtube.com/vi/kf3BHaQWSAc/hqdefault.jpg)"},attrs:{href:"https://www.youtube.com/watch?v=kf3BHaQWSAc",title:"BTCPay Server - How to import wallet file","data-id":"kf3BHaQWSAc"}},[t("iframe",{attrs:{title:"BTCPay Server - How to import wallet file","data-src":"https://www.youtube-nocookie.com/embed/kf3BHaQWSAc?&autoplay=1&autohide=1&modestbranding=1&color=white&rel=0",frameborder:"0",allow:"autoplay;encrypted-media;picture-in-picture",allowfullscreen:""}})]),e._v(" "),t("h3",{attrs:{id:"alternative-setup"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#alternative-setup"}},[e._v("#")]),e._v(" Alternative Setup")]),e._v(" "),t("p",[e._v("Instead of importing a wallet file you can instead transfer the public key to your BTCPay Server. This can be useful if your wallet is encrypted and you do not want to unencrypt it.")]),e._v(" "),t("ol",[t("li",[e._v("Create a new Electrum Wallet")]),e._v(" "),t("li",[e._v("In Electrum, Wallet > Wallet Information - copy the "),t("strong",[e._v("Master Public Key")]),e._v(".")]),e._v(" "),t("li",[e._v("In BTCPay Server, Store > Settings > Setup > Connect an existing wallet > Enter extended public key")]),e._v(" "),t("li",[e._v("Go to Receive tab in Electrum.")]),e._v(" "),t("li",[e._v("Compare the addresses in Electrum and BTCPay Server, they should match.")]),e._v(" "),t("li",[e._v("Confirm the address match in BTCPay.")])]),e._v(" "),t("p",[e._v("When the wallet loads (it may take few moments), in the top menu, click on the "),t("code",[e._v("Wallet")]),e._v(" and then"),t("code",[e._v("Information")]),e._v(" .")]),e._v(" "),t("figure",[t("img",{attrs:{src:r(435),alt:"ElectrumWallet",title:"ElectrumWallet"}})]),e._v(" "),t("p",[e._v("Select and "),t("strong",[e._v("copy")]),e._v(" the "),t("code",[e._v("Master Public Key")]),e._v(". This is the "),t("strong",[e._v("public")]),e._v(" key from which BTCPay will derive addresses.")]),e._v(" "),t("figure",[t("img",{attrs:{src:r(436),alt:"ElectrumWallet",title:"ElectrumWallet"}})]),e._v(" "),t("p",[e._v("Return to your BTCPay Server. Click on the "),t("code",[e._v("Bitcoin")]),e._v(" in the left menu or "),t("code",[e._v("Set up a wallet")]),e._v(" on your new dashboard.")]),e._v(" "),t("figure",[t("img",{attrs:{src:r(437),alt:"ElectrumWallet",title:"ElectrumWallet"}})]),e._v(" "),t("p",[e._v("Click "),t("code",[e._v("Connect an existing wallet")])]),e._v(" "),t("figure",[t("img",{attrs:{src:r(438),alt:"ElectrumWallet",title:"ElectrumWallet"}})]),e._v(" "),t("p",[e._v("Now click on the "),t("code",[e._v("Enter extended public key")]),e._v(" option to import your key.")]),e._v(" "),t("figure",[t("img",{attrs:{src:r(439),alt:"ElectrumWallet",title:"ElectrumWallet"}})]),e._v(" "),t("p",[e._v("Paste the "),t("code",[e._v("Master Public Key")]),e._v(" into derivation scheme field as it is, without adding anything else. Make sure that "),t("code",[e._v("Enabled")]),e._v(" checkbox is ticked and click "),t("code",[e._v("Continue")]),e._v(".")]),e._v(" "),t("figure",[t("img",{attrs:{src:r(440),alt:"ElectrumWallet",title:"ElectrumWallet"}})]),e._v(" "),t("p",[e._v("Return to the "),t("strong",[e._v("Electrum Wallet")]),e._v(". Go to "),t("code",[e._v("Receive tab")]),e._v(" which shows your wallet receiving address.")]),e._v(" "),t("p",[t("strong",[e._v("Compare the address you see in Electrum Wallet to Addresses shown in BTCPay Server")]),e._v(". If there's a match, "),t("code",[e._v("continue")]),e._v(". If there is no match, double-check that you're actually pasting "),t("code",[e._v("Master Public Key")]),e._v(".")]),e._v(" "),t("figure",[t("img",{attrs:{src:r(441),alt:"ElectrumWallet",title:"ElectrumWallet"}})]),e._v(" "),t("h3",{attrs:{id:"configuring-the-gap-limit-in-electrum"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#configuring-the-gap-limit-in-electrum"}},[e._v("#")]),e._v(" Configuring the Gap Limit in Electrum")]),e._v(" "),t("p",[e._v("In the top menu, click on the "),t("code",[e._v("View")]),e._v(" and then"),t("code",[e._v("Show Console")]),e._v(" .")]),e._v(" "),t("figure",[t("img",{attrs:{src:r(442),alt:"ElectrumWallet",title:"ElectrumWallet"}})]),e._v(" "),t("p",[e._v("Enter following commands in Electrum console and press "),t("code",[e._v("enter")]),e._v("on your keyboard.")]),e._v(" "),t("div",{staticClass:"language- extra-class"},[t("pre",{pre:!0,attrs:{class:"language-text"}},[t("code",[e._v(" wallet.change_gap_limit(100)\n")])])]),t("p",[e._v("If you are running a version older than Electrum 4, also enter the following command and press 'enter'")]),e._v(" "),t("div",{staticClass:"language- extra-class"},[t("pre",{pre:!0,attrs:{class:"language-text"}},[t("code",[e._v("wallet.storage.write()\n")])])]),t("figure",[t("img",{attrs:{src:r(443),alt:"ElectrumWallet",title:"ElectrumWallet"}})]),e._v(" "),t("p",[e._v("Restart your Electrum and verify that the newly set gap limit is correct by entering in the console:")]),e._v(" "),t("div",{staticClass:"language- extra-class"},[t("pre",{pre:!0,attrs:{class:"language-text"}},[t("code",[e._v("wallet.gap_limit\n")])])]),t("p",[e._v("There's no good answer to how much you should set the gap limit to. Most merchants set 100-200. If you're a big merchants with high transaction volume, you can try with even higher gap limit.")]),e._v(" "),t("p",[e._v("For more details about the "),t("RouterLink",{attrs:{to:"/FAQ/Wallet/#missing-payments-in-my-software-or-hardware-wallet"}},[e._v("Gap Limit, check the FAQ")]),e._v(".")],1),e._v(" "),t("p",[t("strong",[e._v("Electrum and BTCPay Server are now connected")]),e._v(". Any payments received to your BTCPay will be visible in Electrum, where you can further spend them.")])])}),[],!1,null,null,null);t.default=l.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[20],{438:function(e,t,r){e.exports=r.p+"assets/img/ElectrumWallet1.584fbbe1.png"},439:function(e,t,r){e.exports=r.p+"assets/img/ElectrumWallet2.b93dd22b.png"},440:function(e,t,r){e.exports=r.p+"assets/img/ElectrumWallet3.9838bf5a.png"},441:function(e,t,r){e.exports=r.p+"assets/img/ElectrumWallet4.dec51a41.png"},442:function(e,t,r){e.exports=r.p+"assets/img/ElectrumWallet9.474b2e7a.png"},443:function(e,t,r){e.exports=r.p+"assets/img/ElectrumWallet10.6fd1db5f.png"},444:function(e,t,r){e.exports=r.p+"assets/img/btcpayWalletImport1.6c214d88.jpg"},445:function(e,t,r){e.exports=r.p+"assets/img/btcpayWalletImport2.d39a2fb0.jpg"},446:function(e,t,r){e.exports=r.p+"assets/img/btcpayWalletImport3.4ad4427f.jpg"},447:function(e,t,r){e.exports=r.p+"assets/img/SetupWalletXpub.195df229.png"},448:function(e,t,r){e.exports=r.p+"assets/img/ElectrumWallet11.9ea45c82.png"},449:function(e,t,r){e.exports=r.p+"assets/img/ElectrumWallet11a.05edcf6d.png"},450:function(e,t,r){e.exports=r.p+"assets/img/ElectrumWallet12.139c7796.png"},775:function(e,t,r){"use strict";r.r(t);var a=r(10),l=Object(a.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"connecting-electrum-wallet-to-btcpay-server"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#connecting-electrum-wallet-to-btcpay-server"}},[e._v("#")]),e._v(" Connecting Electrum Wallet to BTCPay Server")]),e._v(" "),t("p",[e._v("This document explains "),t("strong",[e._v("how to connect a desktop "),t("a",{attrs:{href:"https://electrum.org/",target:"_blank",rel:"noopener noreferrer"}},[e._v("Electrum Wallet"),t("OutboundLink")],1),e._v(" to a BTCPay Server")]),e._v(".")]),e._v(" "),t("p",[t("strong",[e._v("Word of caution")]),e._v(" Electrum wallet relies on Electrum servers that are controlled by third-parties. Information, like public addresses, balances and the transacted amount can "),t("em",[e._v("potentially")]),e._v(" be leaked.")]),e._v(" "),t("p",[e._v("To protect yourself against such leaks, set up "),t("RouterLink",{attrs:{to:"/ElectrumX/"}},[e._v("ElectrumX Server")]),e._v(" or "),t("a",{attrs:{href:"https://github.com/chris-belcher/electrum-personal-server",target:"_blank",rel:"noopener noreferrer"}},[e._v("Electrum Personal Server - EPS"),t("OutboundLink")],1),e._v(".")],1),e._v(" "),t("p",[e._v("You can read about the differences between EPS and ElectrumX "),t("a",{attrs:{href:"https://www.reddit.com/r/Electrum/comments/7xb0lz/whats_the_difference_between_electrumx_server_and/",target:"_blank",rel:"noopener noreferrer"}},[e._v("here"),t("OutboundLink")],1),e._v(".")]),e._v(" "),t("ol",[t("li",[e._v("Create a Store in BTCPay Server")]),e._v(" "),t("li",[t("a",{attrs:{href:"https://electrum.org/#download",target:"_blank",rel:"noopener noreferrer"}},[e._v("Download"),t("OutboundLink")],1),e._v(" and install Electrum Wallet")])]),e._v(" "),t("h2",{attrs:{id:"electrum-wallet-setup"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#electrum-wallet-setup"}},[e._v("#")]),e._v(" Electrum Wallet Setup")]),e._v(" "),t("p",[e._v("After the installation, open "),t("strong",[e._v("Electrum Wallet")]),e._v(" by clicking on the icon on your desktop.")]),e._v(" "),t("h3",{attrs:{id:"quick-setup"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#quick-setup"}},[e._v("#")]),e._v(" Quick Setup")]),e._v(" "),t("p",[e._v("The easiest way to setup your Electrum wallet with BTCPay is to import an a wallet file backup to your BTCPay Server.")]),e._v(" "),t("ol",[t("li",[e._v("Create a new Electrum Wallet")]),e._v(" "),t("li",[e._v("In Electrum, File > Save Backup > Save in folder")]),e._v(" "),t("li",[e._v("In BTCPay Server, Store > Settings > Setup > Import Wallet File > Choose File > Continue")]),e._v(" "),t("li",[e._v("Go to Receive tab in Electrum.")]),e._v(" "),t("li",[e._v("Compare the addresses in Electrum and BTCPay Server, they should match.")]),e._v(" "),t("li",[e._v("Confirm the address match in BTCPay.")])]),e._v(" "),t("h2",{attrs:{id:"step-by-step"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#step-by-step"}},[e._v("#")]),e._v(" Step by Step")]),e._v(" "),t("p",[e._v("The following setup guides you through setting up an entirely new Bech32(SegWit) Wallet in Electrum. If you already have a wallet skip to the Extended Public Key copying.")]),e._v(" "),t("p",[e._v("Firstly, give your wallet a name, for example, "),t("code",[e._v("BTCPay Server Wallet")]),e._v(" and click "),t("code",[e._v("Next")]),e._v(".")]),e._v(" "),t("figure",[t("img",{attrs:{src:r(438),alt:"ElectrumWallet",title:"ElectrumWallet"}})]),e._v(" "),t("p",[e._v("Choose "),t("code",[e._v("Standard wallet")]),e._v(" and proceed by clicking the "),t("code",[e._v("Next")]),e._v("button.")]),e._v(" "),t("figure",[t("img",{attrs:{src:r(439),alt:"ElectrumWallet",title:"ElectrumWallet"}})]),e._v(" "),t("p",[e._v("Since we're creating a brand-new wallet,choose "),t("code",[e._v("Create a new seed")]),e._v(" and "),t("code",[e._v("Next")])]),e._v(" "),t("figure",[t("img",{attrs:{src:r(440),alt:"ElectrumWallet",title:"ElectrumWallet"}})]),e._v(" "),t("p",[e._v("From the multiple choice menu, select "),t("code",[e._v("SegWit")]),e._v(" and "),t("code",[e._v("Next")])]),e._v(" "),t("figure",[t("img",{attrs:{src:r(441),alt:"ElectrumWallet",title:"ElectrumWallet"}})]),e._v(" "),t("p",[t("strong",[e._v("IMPORTANT NOTE:")]),e._v(" If you're a merchant, instead of SegWit (Bech32), it's recommended to use SegWit wrapped (P2SH) format. "),t("a",{attrs:{href:"https://www.youtube.com/watch?v=-1DBJWwA2Cw",target:"_blank",rel:"noopener noreferrer"}},[e._v("This guide"),t("OutboundLink")],1),e._v(" explains how to create P2SH wallet in Electrum that's more suited for merchants, due to compatability with legacy wallets customers use.")]),e._v(" "),t("p",[t("strong",[e._v("IMPORTANT NOTE 2:")]),e._v(" Write down your recovery words in the order you see them on the screen. Write them down a piece of paper and store it somewhere secure. Take your time and triple check each word. Do not store your seed in a digital format (photograph, text document). Whoever has the access to your seed can access your funds. Confirm that the seed has been properly backed up by re-entering it in the same order. Once the seed is validated, proceed to the next step.")]),e._v(" "),t("p",[e._v("Copy and paste your seed words to complete your wallet creation in Electrum. Your wallet must be unencrypted to import it into your BTCPay Server. Once you have completed the setup of your wallet in BTCPay you can always add password encryption later in Electrum.")]),e._v(" "),t("p",[e._v("Follow along in the video below on how to import into BTCPay Server.")]),e._v(" "),t("a",{staticClass:"ytEmbed",staticStyle:{"background-image":"url(https://img.youtube.com/vi/kf3BHaQWSAc/hqdefault.jpg)"},attrs:{href:"https://www.youtube.com/watch?v=kf3BHaQWSAc",title:"BTCPay Server - How to import wallet file","data-id":"kf3BHaQWSAc"}},[t("iframe",{attrs:{title:"BTCPay Server - How to import wallet file","data-src":"https://www.youtube-nocookie.com/embed/kf3BHaQWSAc?&autoplay=1&autohide=1&modestbranding=1&color=white&rel=0",frameborder:"0",allow:"autoplay;encrypted-media;picture-in-picture",allowfullscreen:""}})]),e._v(" "),t("h3",{attrs:{id:"alternative-setup"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#alternative-setup"}},[e._v("#")]),e._v(" Alternative Setup")]),e._v(" "),t("p",[e._v("Instead of importing a wallet file you can instead transfer the public key to your BTCPay Server. This can be useful if your wallet is encrypted and you do not want to unencrypt it.")]),e._v(" "),t("ol",[t("li",[e._v("Create a new Electrum Wallet")]),e._v(" "),t("li",[e._v("In Electrum, Wallet > Wallet Information - copy the "),t("strong",[e._v("Master Public Key")]),e._v(".")]),e._v(" "),t("li",[e._v("In BTCPay Server, Store > Settings > Setup > Connect an existing wallet > Enter extended public key")]),e._v(" "),t("li",[e._v("Go to Receive tab in Electrum.")]),e._v(" "),t("li",[e._v("Compare the addresses in Electrum and BTCPay Server, they should match.")]),e._v(" "),t("li",[e._v("Confirm the address match in BTCPay.")])]),e._v(" "),t("p",[e._v("When the wallet loads (it may take few moments), in the top menu, click on the "),t("code",[e._v("Wallet")]),e._v(" and then"),t("code",[e._v("Information")]),e._v(" .")]),e._v(" "),t("figure",[t("img",{attrs:{src:r(442),alt:"ElectrumWallet",title:"ElectrumWallet"}})]),e._v(" "),t("p",[e._v("Select and "),t("strong",[e._v("copy")]),e._v(" the "),t("code",[e._v("Master Public Key")]),e._v(". This is the "),t("strong",[e._v("public")]),e._v(" key from which BTCPay will derive addresses.")]),e._v(" "),t("figure",[t("img",{attrs:{src:r(443),alt:"ElectrumWallet",title:"ElectrumWallet"}})]),e._v(" "),t("p",[e._v("Return to your BTCPay Server. Click on the "),t("code",[e._v("Bitcoin")]),e._v(" in the left menu or "),t("code",[e._v("Set up a wallet")]),e._v(" on your new dashboard.")]),e._v(" "),t("figure",[t("img",{attrs:{src:r(444),alt:"ElectrumWallet",title:"ElectrumWallet"}})]),e._v(" "),t("p",[e._v("Click "),t("code",[e._v("Connect an existing wallet")])]),e._v(" "),t("figure",[t("img",{attrs:{src:r(445),alt:"ElectrumWallet",title:"ElectrumWallet"}})]),e._v(" "),t("p",[e._v("Now click on the "),t("code",[e._v("Enter extended public key")]),e._v(" option to import your key.")]),e._v(" "),t("figure",[t("img",{attrs:{src:r(446),alt:"ElectrumWallet",title:"ElectrumWallet"}})]),e._v(" "),t("p",[e._v("Paste the "),t("code",[e._v("Master Public Key")]),e._v(" into derivation scheme field as it is, without adding anything else. Make sure that "),t("code",[e._v("Enabled")]),e._v(" checkbox is ticked and click "),t("code",[e._v("Continue")]),e._v(".")]),e._v(" "),t("figure",[t("img",{attrs:{src:r(447),alt:"ElectrumWallet",title:"ElectrumWallet"}})]),e._v(" "),t("p",[e._v("Return to the "),t("strong",[e._v("Electrum Wallet")]),e._v(". Go to "),t("code",[e._v("Receive tab")]),e._v(" which shows your wallet receiving address.")]),e._v(" "),t("p",[t("strong",[e._v("Compare the address you see in Electrum Wallet to Addresses shown in BTCPay Server")]),e._v(". If there's a match, "),t("code",[e._v("continue")]),e._v(". If there is no match, double-check that you're actually pasting "),t("code",[e._v("Master Public Key")]),e._v(".")]),e._v(" "),t("figure",[t("img",{attrs:{src:r(448),alt:"ElectrumWallet",title:"ElectrumWallet"}})]),e._v(" "),t("h3",{attrs:{id:"configuring-the-gap-limit-in-electrum"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#configuring-the-gap-limit-in-electrum"}},[e._v("#")]),e._v(" Configuring the Gap Limit in Electrum")]),e._v(" "),t("p",[e._v("In the top menu, click on the "),t("code",[e._v("View")]),e._v(" and then"),t("code",[e._v("Show Console")]),e._v(" .")]),e._v(" "),t("figure",[t("img",{attrs:{src:r(449),alt:"ElectrumWallet",title:"ElectrumWallet"}})]),e._v(" "),t("p",[e._v("Enter following commands in Electrum console and press "),t("code",[e._v("enter")]),e._v("on your keyboard.")]),e._v(" "),t("div",{staticClass:"language- extra-class"},[t("pre",{pre:!0,attrs:{class:"language-text"}},[t("code",[e._v(" wallet.change_gap_limit(100)\n")])])]),t("p",[e._v("If you are running a version older than Electrum 4, also enter the following command and press 'enter'")]),e._v(" "),t("div",{staticClass:"language- extra-class"},[t("pre",{pre:!0,attrs:{class:"language-text"}},[t("code",[e._v("wallet.storage.write()\n")])])]),t("figure",[t("img",{attrs:{src:r(450),alt:"ElectrumWallet",title:"ElectrumWallet"}})]),e._v(" "),t("p",[e._v("Restart your Electrum and verify that the newly set gap limit is correct by entering in the console:")]),e._v(" "),t("div",{staticClass:"language- extra-class"},[t("pre",{pre:!0,attrs:{class:"language-text"}},[t("code",[e._v("wallet.gap_limit\n")])])]),t("p",[e._v("There's no good answer to how much you should set the gap limit to. Most merchants set 100-200. If you're a big merchants with high transaction volume, you can try with even higher gap limit.")]),e._v(" "),t("p",[e._v("For more details about the "),t("RouterLink",{attrs:{to:"/FAQ/Wallet/#missing-payments-in-my-software-or-hardware-wallet"}},[e._v("Gap Limit, check the FAQ")]),e._v(".")],1),e._v(" "),t("p",[t("strong",[e._v("Electrum and BTCPay Server are now connected")]),e._v(". Any payments received to your BTCPay will be visible in Electrum, where you can further spend them.")])])}),[],!1,null,null,null);t.default=l.exports}}]); \ No newline at end of file diff --git a/assets/js/22.fb2de3e3.js b/assets/js/22.d263e26c.js similarity index 81% rename from assets/js/22.fb2de3e3.js rename to assets/js/22.d263e26c.js index 4eba828e1e..93d9481dec 100644 --- a/assets/js/22.fb2de3e3.js +++ b/assets/js/22.d263e26c.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[22],{292:function(t,e,a){t.exports=a.p+"assets/img/BroadcastConfirm.fde15efd.png"},489:function(t,e,a){t.exports=a.p+"assets/img/1-store-created.617b1965.png"},490:function(t,e,a){t.exports=a.p+"assets/img/2-connect-wallet.1ace2dcb.png"},491:function(t,e,a){t.exports=a.p+"assets/img/3-choose-import-method.d4dbc1cd.png"},492:function(t,e,a){t.exports=a.p+"assets/img/4-vault-notif.2c298f47.png"},493:function(t,e,a){t.exports=a.p+"assets/img/5-address-type.bebe1cf2.png"},494:function(t,e,a){t.exports=a.p+"assets/img/6-pubkey-hww.30a1cab5.png"},495:function(t,e,a){t.exports=a.p+"assets/img/7-confirm-addresses.8735ed56.png"},496:function(t,e,a){t.exports=a.p+"assets/img/8-wallet-setup-complete.d955c440.png"},497:function(t,e,a){t.exports=a.p+"assets/img/9-send-btc.58dad487.png"},498:function(t,e,a){t.exports=a.p+"assets/img/10-choose-signing-method.843569ac.png"},499:function(t,e,a){t.exports=a.p+"assets/img/11-sign-transaction.69390a6b.png"},789:function(t,e,a){"use strict";a.r(e);var r=a(10),i=Object(r.a)({},(function(){var t=this,e=t._self._c;return e("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[e("h1",{attrs:{id:"hardware-wallet-integration"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#hardware-wallet-integration"}},[t._v("#")]),t._v(" Hardware Wallet Integration")]),t._v(" "),e("p",[t._v("For optimal balance between ease of use, security and privacy, it's recommended to use "),e("RouterLink",{attrs:{to:"/Wallet/"}},[t._v("BTCPay Server Wallet")]),t._v(" with a hardware wallet.")],1),t._v(" "),e("p",[t._v("The hardware wallet integration within BTCPay Server allows you to import your hardware wallet and spend the incoming funds with a simple confirmation on your device. Your private keys never leave the device and all funds are being validated against your own full node and no data leakage.")]),t._v(" "),e("h2",{attrs:{id:"getting-started"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#getting-started"}},[t._v("#")]),t._v(" Getting Started")]),t._v(" "),e("a",{staticClass:"ytEmbed",staticStyle:{"background-image":"url(https://img.youtube.com/vi/s4qbGxef43A/hqdefault.jpg)"},attrs:{href:"https://www.youtube.com/watch?v=s4qbGxef43A",title:"BTCPay Server Vault","data-id":"s4qbGxef43A"}},[e("iframe",{attrs:{title:"BTCPay Server Vault","data-src":"https://www.youtube-nocookie.com/embed/s4qbGxef43A?&autoplay=1&autohide=1&modestbranding=1&color=white&rel=0",frameborder:"0",allow:"autoplay;encrypted-media;picture-in-picture",allowfullscreen:""}})]),t._v(" "),e("ol",[e("li",[e("a",{attrs:{href:"https://github.com/btcpayserver/BTCPayServer.Vault/releases",target:"_blank",rel:"noopener noreferrer"}},[t._v("Download the BTCPay Vault app"),e("OutboundLink")],1)]),t._v(" "),e("li",[t._v("Install the Vault on your PC (Windows, MacOS or Linux)")]),t._v(" "),e("li",[t._v("Open the BTCPay Vault app")]),t._v(" "),e("li",[t._v("Plug in the hardware wallet into your PC and make sure it’s in a wake up state")]),t._v(" "),e("li",[t._v("Do you have an existing store? Skip ahead to step 7.")]),t._v(" "),e("li",[t._v("Connect existing wallet and then click on the Connect a hardware wallet.")]),t._v(" "),e("li",[t._v("Now you will see BTCPay Server searching for your hardware wallet, this step requires you to run BTCPay Server Vault.")]),t._v(" "),e("li",[t._v("Click accept on your BTCPay Vault application. Vault is now searching for your device, it will now ask for your pin on the device.")]),t._v(" "),e("li",[t._v("After device was found and accepted, select your address type and click confirm. BTCPay Server will show your public key information from your hardware wallet.")]),t._v(" "),e("li",[t._v("Once you've confirmed the public key is correct, BTCPay Server now shows the address to validate on your device. If they are correct click confirm to complete the setup.")])]),t._v(" "),e("figure",[e("img",{attrs:{src:a(489),alt:"BTCPay Server Vault configuration",title:"BTCPay Server Vault configuration"}})]),t._v(" "),e("figure",[e("img",{attrs:{src:a(490),alt:"BTCPay Server Vault configuration",title:"BTCPay Server Vault configuration"}})]),t._v(" "),e("figure",[e("img",{attrs:{src:a(491),alt:"BTCPay Server Vault configuration",title:"BTCPay Server Vault configuration"}})]),t._v(" "),e("figure",[e("img",{attrs:{src:a(492),alt:"BTCPay Server Vault configuration",title:"BTCPay Server Vault configuration"}})]),t._v(" "),e("figure",[e("img",{attrs:{src:a(493),alt:"BTCPay Server Vault configuration",title:"BTCPay Server Vault configuration"}})]),t._v(" "),e("figure",[e("img",{attrs:{src:a(494),alt:"BTCPay Server Vault configuration",title:"BTCPay Server Vault configuration"}})]),t._v(" "),e("figure",[e("img",{attrs:{src:a(495),alt:"BTCPay Server Vault configuration",title:"BTCPay Server Vault configuration"}})]),t._v(" "),e("figure",[e("img",{attrs:{src:a(496),alt:"BTCPay Server Vault configuration",title:"BTCPay Server Vault configuration"}})]),t._v(" "),e("h3",{attrs:{id:"spending-funds"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#spending-funds"}},[t._v("#")]),t._v(" Spending funds")]),t._v(" "),e("p",[t._v("Once you’ve received funds to your wallet and you decide to spend them, you can sign the transaction with your hardware wallet, all inside BTCPay Server.")]),t._v(" "),e("ol",[e("li",[t._v("Open BTCPay Vault app on your PC")]),t._v(" "),e("li",[t._v("Plug in the hardware wallet and make sure it’s in wake up state")]),t._v(" "),e("li",[t._v("In BTCPay Server, go to your Bitcoin Wallet and click on send")]),t._v(" "),e("li",[t._v("Fill in the Destination address and the Amount")]),t._v(" "),e("li",[t._v("Select Sign with a hardware wallet")]),t._v(" "),e("li",[t._v("Verify the transaction on your hardware wallet and confirm it")]),t._v(" "),e("li",[t._v("Broadcast the transaction")])]),t._v(" "),e("figure",[e("img",{attrs:{src:a(497),alt:"Send Bitcoin via BTCPay Vault",title:"Send Bitcoin via BTCPay Vault"}})]),t._v(" "),e("figure",[e("img",{attrs:{src:a(498),alt:"Send Bitcoin via BTCPay Vault",title:"Send Bitcoin via BTCPay Vault"}})]),t._v(" "),e("figure",[e("img",{attrs:{src:a(499),alt:"Send Bitcoin via BTCPay Vault",title:"Send Bitcoin via BTCPay Vault"}})]),t._v(" "),e("h2",{attrs:{id:"advanced-settings"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#advanced-settings"}},[t._v("#")]),t._v(" Advanced Settings")]),t._v(" "),e("p",[t._v("Additional transaction settings can be found by clicking on the "),e("RouterLink",{attrs:{to:"/Wallet/#advanced-settings"}},[t._v("Advanced Settings")]),t._v(" button. If you are not familiar with these types of settings, you may leave them as is to use the default settings.")],1),t._v(" "),e("p",[t._v("If you are experiencing issues sending transactions from a Trezor wallet, you may need to enable "),e("RouterLink",{attrs:{to:"/FAQ/Wallet/#why-is-sending-a-transaction-using-trezor-failing"}},[t._v("this advanced setting")]),t._v(".")],1),t._v(" "),e("figure",[e("img",{attrs:{src:a(292),alt:"Send Bitcoin via BTCPay Vault",title:"Send Bitcoin via BTCPay Vault"}})]),t._v(" "),e("h2",{attrs:{id:"supported-hardware-wallets"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#supported-hardware-wallets"}},[t._v("#")]),t._v(" Supported Hardware Wallets")]),t._v(" "),e("p",[t._v("The list of supported hardware wallets is available at "),e("a",{attrs:{href:"https://github.com/bitcoin-core/HWI#device-support",target:"_blank",rel:"noopener noreferrer"}},[t._v("this link"),e("OutboundLink")],1),t._v(".")]),t._v(" "),e("div",{staticClass:"custom-block warning"},[e("p",{staticClass:"custom-block-title"},[t._v("WARNING")]),t._v(" "),e("p",[t._v("The hardware wallet integration in BTCPay Server only supports Bitcoin. "),e("RouterLink",{attrs:{to:"/Development/Altcoins/"}},[t._v("Altcoin")]),t._v(" wallets enabled on your server won't work.")],1)])])}),[],!1,null,null,null);e.default=i.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[22],{292:function(t,e,a){t.exports=a.p+"assets/img/BroadcastConfirm.fde15efd.png"},486:function(t,e,a){t.exports=a.p+"assets/img/1-store-created.617b1965.png"},487:function(t,e,a){t.exports=a.p+"assets/img/2-connect-wallet.1ace2dcb.png"},488:function(t,e,a){t.exports=a.p+"assets/img/3-choose-import-method.d4dbc1cd.png"},489:function(t,e,a){t.exports=a.p+"assets/img/4-vault-notif.2c298f47.png"},490:function(t,e,a){t.exports=a.p+"assets/img/5-address-type.bebe1cf2.png"},491:function(t,e,a){t.exports=a.p+"assets/img/6-pubkey-hww.30a1cab5.png"},492:function(t,e,a){t.exports=a.p+"assets/img/7-confirm-addresses.8735ed56.png"},493:function(t,e,a){t.exports=a.p+"assets/img/8-wallet-setup-complete.d955c440.png"},494:function(t,e,a){t.exports=a.p+"assets/img/9-send-btc.58dad487.png"},495:function(t,e,a){t.exports=a.p+"assets/img/10-choose-signing-method.843569ac.png"},496:function(t,e,a){t.exports=a.p+"assets/img/11-sign-transaction.69390a6b.png"},788:function(t,e,a){"use strict";a.r(e);var r=a(10),i=Object(r.a)({},(function(){var t=this,e=t._self._c;return e("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[e("h1",{attrs:{id:"hardware-wallet-integration"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#hardware-wallet-integration"}},[t._v("#")]),t._v(" Hardware Wallet Integration")]),t._v(" "),e("p",[t._v("For optimal balance between ease of use, security and privacy, it's recommended to use "),e("RouterLink",{attrs:{to:"/Wallet/"}},[t._v("BTCPay Server Wallet")]),t._v(" with a hardware wallet.")],1),t._v(" "),e("p",[t._v("The hardware wallet integration within BTCPay Server allows you to import your hardware wallet and spend the incoming funds with a simple confirmation on your device. Your private keys never leave the device and all funds are being validated against your own full node and no data leakage.")]),t._v(" "),e("h2",{attrs:{id:"getting-started"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#getting-started"}},[t._v("#")]),t._v(" Getting Started")]),t._v(" "),e("a",{staticClass:"ytEmbed",staticStyle:{"background-image":"url(https://img.youtube.com/vi/s4qbGxef43A/hqdefault.jpg)"},attrs:{href:"https://www.youtube.com/watch?v=s4qbGxef43A",title:"BTCPay Server Vault","data-id":"s4qbGxef43A"}},[e("iframe",{attrs:{title:"BTCPay Server Vault","data-src":"https://www.youtube-nocookie.com/embed/s4qbGxef43A?&autoplay=1&autohide=1&modestbranding=1&color=white&rel=0",frameborder:"0",allow:"autoplay;encrypted-media;picture-in-picture",allowfullscreen:""}})]),t._v(" "),e("ol",[e("li",[e("a",{attrs:{href:"https://github.com/btcpayserver/BTCPayServer.Vault/releases",target:"_blank",rel:"noopener noreferrer"}},[t._v("Download the BTCPay Vault app"),e("OutboundLink")],1)]),t._v(" "),e("li",[t._v("Install the Vault on your PC (Windows, MacOS or Linux)")]),t._v(" "),e("li",[t._v("Open the BTCPay Vault app")]),t._v(" "),e("li",[t._v("Plug in the hardware wallet into your PC and make sure it’s in a wake up state")]),t._v(" "),e("li",[t._v("Do you have an existing store? Skip ahead to step 7.")]),t._v(" "),e("li",[t._v("Connect existing wallet and then click on the Connect a hardware wallet.")]),t._v(" "),e("li",[t._v("Now you will see BTCPay Server searching for your hardware wallet, this step requires you to run BTCPay Server Vault.")]),t._v(" "),e("li",[t._v("Click accept on your BTCPay Vault application. Vault is now searching for your device, it will now ask for your pin on the device.")]),t._v(" "),e("li",[t._v("After device was found and accepted, select your address type and click confirm. BTCPay Server will show your public key information from your hardware wallet.")]),t._v(" "),e("li",[t._v("Once you've confirmed the public key is correct, BTCPay Server now shows the address to validate on your device. If they are correct click confirm to complete the setup.")])]),t._v(" "),e("figure",[e("img",{attrs:{src:a(486),alt:"BTCPay Server Vault configuration",title:"BTCPay Server Vault configuration"}})]),t._v(" "),e("figure",[e("img",{attrs:{src:a(487),alt:"BTCPay Server Vault configuration",title:"BTCPay Server Vault configuration"}})]),t._v(" "),e("figure",[e("img",{attrs:{src:a(488),alt:"BTCPay Server Vault configuration",title:"BTCPay Server Vault configuration"}})]),t._v(" "),e("figure",[e("img",{attrs:{src:a(489),alt:"BTCPay Server Vault configuration",title:"BTCPay Server Vault configuration"}})]),t._v(" "),e("figure",[e("img",{attrs:{src:a(490),alt:"BTCPay Server Vault configuration",title:"BTCPay Server Vault configuration"}})]),t._v(" "),e("figure",[e("img",{attrs:{src:a(491),alt:"BTCPay Server Vault configuration",title:"BTCPay Server Vault configuration"}})]),t._v(" "),e("figure",[e("img",{attrs:{src:a(492),alt:"BTCPay Server Vault configuration",title:"BTCPay Server Vault configuration"}})]),t._v(" "),e("figure",[e("img",{attrs:{src:a(493),alt:"BTCPay Server Vault configuration",title:"BTCPay Server Vault configuration"}})]),t._v(" "),e("h3",{attrs:{id:"spending-funds"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#spending-funds"}},[t._v("#")]),t._v(" Spending funds")]),t._v(" "),e("p",[t._v("Once you’ve received funds to your wallet and you decide to spend them, you can sign the transaction with your hardware wallet, all inside BTCPay Server.")]),t._v(" "),e("ol",[e("li",[t._v("Open BTCPay Vault app on your PC")]),t._v(" "),e("li",[t._v("Plug in the hardware wallet and make sure it’s in wake up state")]),t._v(" "),e("li",[t._v("In BTCPay Server, go to your Bitcoin Wallet and click on send")]),t._v(" "),e("li",[t._v("Fill in the Destination address and the Amount")]),t._v(" "),e("li",[t._v("Select Sign with a hardware wallet")]),t._v(" "),e("li",[t._v("Verify the transaction on your hardware wallet and confirm it")]),t._v(" "),e("li",[t._v("Broadcast the transaction")])]),t._v(" "),e("figure",[e("img",{attrs:{src:a(494),alt:"Send Bitcoin via BTCPay Vault",title:"Send Bitcoin via BTCPay Vault"}})]),t._v(" "),e("figure",[e("img",{attrs:{src:a(495),alt:"Send Bitcoin via BTCPay Vault",title:"Send Bitcoin via BTCPay Vault"}})]),t._v(" "),e("figure",[e("img",{attrs:{src:a(496),alt:"Send Bitcoin via BTCPay Vault",title:"Send Bitcoin via BTCPay Vault"}})]),t._v(" "),e("h2",{attrs:{id:"advanced-settings"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#advanced-settings"}},[t._v("#")]),t._v(" Advanced Settings")]),t._v(" "),e("p",[t._v("Additional transaction settings can be found by clicking on the "),e("RouterLink",{attrs:{to:"/Wallet/#advanced-settings"}},[t._v("Advanced Settings")]),t._v(" button. If you are not familiar with these types of settings, you may leave them as is to use the default settings.")],1),t._v(" "),e("p",[t._v("If you are experiencing issues sending transactions from a Trezor wallet, you may need to enable "),e("RouterLink",{attrs:{to:"/FAQ/Wallet/#why-is-sending-a-transaction-using-trezor-failing"}},[t._v("this advanced setting")]),t._v(".")],1),t._v(" "),e("figure",[e("img",{attrs:{src:a(292),alt:"Send Bitcoin via BTCPay Vault",title:"Send Bitcoin via BTCPay Vault"}})]),t._v(" "),e("h2",{attrs:{id:"supported-hardware-wallets"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#supported-hardware-wallets"}},[t._v("#")]),t._v(" Supported Hardware Wallets")]),t._v(" "),e("p",[t._v("The list of supported hardware wallets is available at "),e("a",{attrs:{href:"https://github.com/bitcoin-core/HWI#device-support",target:"_blank",rel:"noopener noreferrer"}},[t._v("this link"),e("OutboundLink")],1),t._v(".")]),t._v(" "),e("div",{staticClass:"custom-block warning"},[e("p",{staticClass:"custom-block-title"},[t._v("WARNING")]),t._v(" "),e("p",[t._v("The hardware wallet integration in BTCPay Server only supports Bitcoin. "),e("RouterLink",{attrs:{to:"/Development/Altcoins/"}},[t._v("Altcoin")]),t._v(" wallets enabled on your server won't work.")],1)])])}),[],!1,null,null,null);e.default=i.exports}}]); \ No newline at end of file diff --git a/assets/js/23.40cc99f6.js b/assets/js/23.93886ff7.js similarity index 86% rename from assets/js/23.40cc99f6.js rename to assets/js/23.93886ff7.js index 8c0dbab57d..1e3ab4be6b 100644 --- a/assets/js/23.40cc99f6.js +++ b/assets/js/23.93886ff7.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[23],{583:function(A,t,e){A.exports=e.p+"assets/img/1.1317fcf2.png"},584:function(A,t,e){A.exports=e.p+"assets/img/2.00f4500f.png"},585:function(A,t,e){A.exports=e.p+"assets/img/3.3c4c0b97.png"},586:function(A,t,e){A.exports=e.p+"assets/img/4.21661a93.png"},587:function(A,t,e){A.exports=e.p+"assets/img/5.9bc4d4fd.png"},588:function(A,t,e){A.exports=e.p+"assets/img/6.05eb51af.png"},589:function(A,t,e){A.exports=e.p+"assets/img/7.683a8418.png"},590:function(A,t,e){A.exports=e.p+"assets/img/8.64846216.png"},591:function(A,t){A.exports="data:image/png;base64,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"},592:function(A,t,e){A.exports=e.p+"assets/img/10.60d36a50.png"},593:function(A,t,e){A.exports=e.p+"assets/img/11.746ef9f1.png"},594:function(A,t,e){A.exports=e.p+"assets/img/12.761f7a03.png"},818:function(A,t,e){"use strict";e.r(t);var s=e(10),a=Object(s.a)({},(function(){var A=this,t=A._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":A.$parent.slotKey}},[t("h2",{attrs:{id:"dollar-cost-averaging-automation"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#dollar-cost-averaging-automation"}},[A._v("#")]),A._v(" Dollar Cost Averaging Automation")]),A._v(" "),t("p",[A._v("This guide shows how to setup Transmuter to automate DCA Bitcoin purchases.")]),A._v(" "),t("h2",{attrs:{id:"why-use-transmuter-instead-of-dedicated-dca-services"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#why-use-transmuter-instead-of-dedicated-dca-services"}},[A._v("#")]),A._v(" Why use Transmuter instead of dedicated DCA services?")]),A._v(" "),t("p",[A._v("You get to configure everything specifically to your needs and there is no additional cost beyond the selected exchange's fees, which are usually lower than dedicated DCA providers.")]),A._v(" "),t("h2",{attrs:{id:"setup"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#setup"}},[A._v("#")]),A._v(" Setup")]),A._v(" "),t("ul",[t("li",[A._v('Create a new External Service of type "Exchange External Service"\n'),t("img",{attrs:{src:e(583),alt:"./DCA_assets/1.png",title:"./DCA_assets/1.png"}}),A._v(" "),t("img",{attrs:{src:e(584),alt:"./DCA_assets/1.png",title:"./DCA_assets/1.png"}}),A._v(" "),t("img",{attrs:{src:e(585),alt:"./DCA_assets/1.png",title:"./DCA_assets/1.png"}})]),A._v(" "),t("li",[A._v("Configure it with the API keys from your exchange account.\n"),t("img",{attrs:{src:e(586),alt:"./DCA_assets/1.png",title:"./DCA_assets/1.png"}}),A._v(" "),t("img",{attrs:{src:e(587),alt:"./DCA_assets/1.png",title:"./DCA_assets/1.png"}}),A._v(" "),t("img",{attrs:{src:e(588),alt:"./DCA_assets/1.png",title:"./DCA_assets/1.png"}}),A._v(" "),t("img",{attrs:{src:e(589),alt:"./DCA_assets/1.png",title:"./DCA_assets/1.png"}})]),A._v(" "),t("li",[A._v("In Transmuter, create a Preset > Dollar Cost Average.\n"),t("img",{attrs:{src:e(590),alt:"./DCA_assets/1.png",title:"./DCA_assets/1.png"}})]),A._v(" "),t("li",[A._v("Select the configured exchange account\n"),t("img",{attrs:{src:e(591),alt:"./DCA_assets/1.png",title:"./DCA_assets/1.png"}})]),A._v(" "),t("li",[A._v("Set how often to DCA\n"),t("img",{attrs:{src:e(592),alt:"./DCA_assets/1.png",title:"./DCA_assets/1.png"}})]),A._v(" "),t("li",[A._v("Set the exchange order book and the amount to DCA with on each trade\n"),t("img",{attrs:{src:e(593),alt:"./DCA_assets/1.png",title:"./DCA_assets/1.png"}})]),A._v(" "),t("li",[A._v("Create, confirm and enable the newly generated recipe!\n"),t("img",{attrs:{src:e(594),alt:"./DCA_assets/1.png",title:"./DCA_assets/1.png"}})])])])}),[],!1,null,null,null);t.default=a.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[23],{586:function(A,t,e){A.exports=e.p+"assets/img/1.1317fcf2.png"},587:function(A,t,e){A.exports=e.p+"assets/img/2.00f4500f.png"},588:function(A,t,e){A.exports=e.p+"assets/img/3.3c4c0b97.png"},589:function(A,t,e){A.exports=e.p+"assets/img/4.21661a93.png"},590:function(A,t,e){A.exports=e.p+"assets/img/5.9bc4d4fd.png"},591:function(A,t,e){A.exports=e.p+"assets/img/6.05eb51af.png"},592:function(A,t,e){A.exports=e.p+"assets/img/7.683a8418.png"},593:function(A,t,e){A.exports=e.p+"assets/img/8.64846216.png"},594:function(A,t){A.exports="data:image/png;base64,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"},595:function(A,t,e){A.exports=e.p+"assets/img/10.60d36a50.png"},596:function(A,t,e){A.exports=e.p+"assets/img/11.746ef9f1.png"},597:function(A,t,e){A.exports=e.p+"assets/img/12.761f7a03.png"},819:function(A,t,e){"use strict";e.r(t);var s=e(10),a=Object(s.a)({},(function(){var A=this,t=A._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":A.$parent.slotKey}},[t("h2",{attrs:{id:"dollar-cost-averaging-automation"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#dollar-cost-averaging-automation"}},[A._v("#")]),A._v(" Dollar Cost Averaging Automation")]),A._v(" "),t("p",[A._v("This guide shows how to setup Transmuter to automate DCA Bitcoin purchases.")]),A._v(" "),t("h2",{attrs:{id:"why-use-transmuter-instead-of-dedicated-dca-services"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#why-use-transmuter-instead-of-dedicated-dca-services"}},[A._v("#")]),A._v(" Why use Transmuter instead of dedicated DCA services?")]),A._v(" "),t("p",[A._v("You get to configure everything specifically to your needs and there is no additional cost beyond the selected exchange's fees, which are usually lower than dedicated DCA providers.")]),A._v(" "),t("h2",{attrs:{id:"setup"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#setup"}},[A._v("#")]),A._v(" Setup")]),A._v(" "),t("ul",[t("li",[A._v('Create a new External Service of type "Exchange External Service"\n'),t("img",{attrs:{src:e(586),alt:"./DCA_assets/1.png",title:"./DCA_assets/1.png"}}),A._v(" "),t("img",{attrs:{src:e(587),alt:"./DCA_assets/1.png",title:"./DCA_assets/1.png"}}),A._v(" "),t("img",{attrs:{src:e(588),alt:"./DCA_assets/1.png",title:"./DCA_assets/1.png"}})]),A._v(" "),t("li",[A._v("Configure it with the API keys from your exchange account.\n"),t("img",{attrs:{src:e(589),alt:"./DCA_assets/1.png",title:"./DCA_assets/1.png"}}),A._v(" "),t("img",{attrs:{src:e(590),alt:"./DCA_assets/1.png",title:"./DCA_assets/1.png"}}),A._v(" "),t("img",{attrs:{src:e(591),alt:"./DCA_assets/1.png",title:"./DCA_assets/1.png"}}),A._v(" "),t("img",{attrs:{src:e(592),alt:"./DCA_assets/1.png",title:"./DCA_assets/1.png"}})]),A._v(" "),t("li",[A._v("In Transmuter, create a Preset > Dollar Cost Average.\n"),t("img",{attrs:{src:e(593),alt:"./DCA_assets/1.png",title:"./DCA_assets/1.png"}})]),A._v(" "),t("li",[A._v("Select the configured exchange account\n"),t("img",{attrs:{src:e(594),alt:"./DCA_assets/1.png",title:"./DCA_assets/1.png"}})]),A._v(" "),t("li",[A._v("Set how often to DCA\n"),t("img",{attrs:{src:e(595),alt:"./DCA_assets/1.png",title:"./DCA_assets/1.png"}})]),A._v(" "),t("li",[A._v("Set the exchange order book and the amount to DCA with on each trade\n"),t("img",{attrs:{src:e(596),alt:"./DCA_assets/1.png",title:"./DCA_assets/1.png"}})]),A._v(" "),t("li",[A._v("Create, confirm and enable the newly generated recipe!\n"),t("img",{attrs:{src:e(597),alt:"./DCA_assets/1.png",title:"./DCA_assets/1.png"}})])])])}),[],!1,null,null,null);t.default=a.exports}}]); \ No newline at end of file diff --git a/assets/js/24.21e9d0cd.js b/assets/js/24.7512e4c7.js similarity index 88% rename from assets/js/24.21e9d0cd.js rename to assets/js/24.7512e4c7.js index e4aa460bcd..b569a4ab7e 100644 --- a/assets/js/24.21e9d0cd.js +++ b/assets/js/24.7512e4c7.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[24],{631:function(e,t,o){e.exports=o.p+"assets/img/img_1.6bc7d880.png"},632:function(e,t,o){e.exports=o.p+"assets/img/img_2.9f8b0cc3.png"},633:function(e,t,o){e.exports=o.p+"assets/img/img_3.2595db17.png"},634:function(e,t,o){e.exports=o.p+"assets/img/coinselection.4c853f71.png"},635:function(e,t,o){e.exports=o.p+"assets/img/img.9710314c.png"},636:function(e,t,o){e.exports=o.p+"assets/img/img_4.c8000fea.png"},637:function(e,t,o){e.exports=o.p+"assets/img/scientist_mode.66645705.png"},638:function(e,t,o){e.exports=o.p+"assets/img/img_5.a8ef891b.png"},639:function(e,t,o){e.exports=o.p+"assets/img/img_6.745de6b7.png"},640:function(e,t,o){e.exports=o.p+"assets/img/img_7.0d3fb434.png"},641:function(e,t,o){e.exports=o.p+"assets/img/img_8.34595a5a.png"},642:function(e,t,o){e.exports=o.p+"assets/img/img_9.6da23178.png"},829:function(e,t,o){"use strict";o.r(t);var i=o(10),n=Object(i.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"the-btcpay-server-coinjoin-plugin"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#the-btcpay-server-coinjoin-plugin"}},[e._v("#")]),e._v(" The BTCPay Server Coinjoin plugin")]),e._v(" "),t("p",[e._v("This plugin allows every BTCPay Server instance to integrate with the Wabisabi coinjoin protocol developed by "),t("a",{attrs:{href:"https://zksnacks.com/",target:"_blank",rel:"noopener noreferrer"}},[e._v("zkSNACKS"),t("OutboundLink")],1),e._v(" ("),t("a",{attrs:{href:"https://wasabiwallet.io/",target:"_blank",rel:"noopener noreferrer"}},[e._v("Wasabi Wallet"),t("OutboundLink")],1),e._v(").")]),e._v(" "),t("p",{attrs:{align:"center"}},[t("a",{attrs:{href:"http://www.youtube.com/watch?feature=player_embedded&v=zGVCrwMKKn0\n",target:"_blank"}},[t("img",{attrs:{src:"http://img.youtube.com/vi/zGVCrwMKKn0/0.jpg",border:"10"}})])]),e._v(" "),t("h2",{attrs:{id:"installation"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#installation"}},[e._v("#")]),e._v(" Installation")]),e._v(" "),t("p",[e._v("First ensure that your BTCPay Server instance is at least version 1.8.0 and that NBXplorer is at least 2.3.58. If you are using the recommended Docker deployment method, it is as simple as "),t("RouterLink",{attrs:{to:"/Wabisabi/https://docs.btcpayserver.org/FAQ/ServerSettings/#how-to-update-btcpay-server"}},[e._v("one-click")]),e._v(".")],1),e._v(" "),t("p",[e._v('Then, you will need to log in as an admin, click on "Manage plugins" in the side navigation, and click on "Install" on the "Coinjoin" plugin in the list. BTCPay Server will then ask you to restart in order to load the plugin.')]),e._v(" "),t("p",[e._v('After the restart, there should be a new navigation item in the side navigation, "Coinjoin", and the dashboard should have additional elements related to coinjoins.\n'),t("img",{attrs:{src:o(631),alt:"./img_1.png",title:"./img_1.png"}})]),e._v(" "),t("h2",{attrs:{id:"usage"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#usage"}},[e._v("#")]),e._v(" Usage")]),e._v(" "),t("p",[e._v("Your store needs to have a Bitcoin wallet configured and it needs to be set up as a "),t("RouterLink",{attrs:{to:"/Wabisabi/https://docs.btcpayserver.org/CreateWallet/#hot-wallet"}},[e._v("hot wallet")]),e._v(". Only native segwit (and potentially taproot) wallets will be able to join coinjoin rounds.")],1),e._v(" "),t("p",[e._v('The easiest way to get started is to click on "Coinjoin" in the side navigation, choose the default "zkSNACKS" coordinator and click "save". BTCPay Server will automatically join coinjoin rounds and progress to enhancing the privacy of your wallet.\n'),t("img",{attrs:{src:o(632),alt:"./img_2.png",title:"./img_2.png"}}),e._v('\nCoinjoin transactions will appear in the transactions list in your wallet as they happen, and will have at least 2 labels, "coinjoin", and the name of the coordinator.\n'),t("img",{attrs:{src:o(633),alt:"./img_3.png",title:"./img_3.png"}})]),e._v(" "),t("h2",{attrs:{id:"spending-privately"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#spending-privately"}},[e._v("#")]),e._v(" Spending privately")]),e._v(" "),t("p",[e._v('Coins which have gained some level of privacy will have an "anonset" label when using the BTCPay wallet coin selection feature. If you hover over the label, it will tell you the score it has gained.')]),e._v(" "),t("figure",[t("img",{attrs:{src:o(634),alt:"./coinselection.png",title:"./coinselection.png"}})]),e._v(" "),t("p",[e._v("It is up to you to use the coin selection feature correctly to make the best of your earned privacy on your coins.")]),e._v(" "),t("p",[e._v("Ideally you:")]),e._v(" "),t("ul",[t("li",[e._v("select the least amount of coins possible")]),e._v(" "),t("li",[e._v("select the highest level of privacy coins")]),e._v(" "),t("li",[e._v("ideally use coins from different transactions")]),e._v(" "),t("li",[e._v("spend entire coins to prevent change")])]),e._v(" "),t("p",[e._v("We realize this is a complex selection and are working on an easier UI to help with this. As an initial experiment, we have added an action to let us attempt to select coins based on your sending amounts.\n"),t("img",{attrs:{src:o(635),alt:"./img.png",title:"./img.png"}})]),e._v(" "),t("p",[e._v("But the best way to spend privately is to use our unique "),t("strong",[e._v("payment batching feature")]),e._v(", by utilizing BTCPay Server's "),t("RouterLink",{attrs:{to:"/Wabisabi/https://docs.btcpayserver.org/Payouts/"}},[e._v("Payout")]),e._v(' system. Simply set the destination and amount and click on "Schedule transaction", and the payment will be embedded directly inside the next coinjoin that can fulfill it.\n'),t("img",{attrs:{src:o(636),alt:"./img_4.png",title:"./img_4.png"}})],1),e._v(" "),t("h2",{attrs:{id:"pleb-mode-vs-scientist-mode"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#pleb-mode-vs-scientist-mode"}},[e._v("#")]),e._v(" Pleb mode vs Scientist mode")]),e._v(" "),t("p",[e._v("Pleb mode comes with a curated set of configurations aimed to get you off the ground with coinjoining. Scientist mode is for those who want to experiment with different configurations and fine tune their coinjoin experience.")]),e._v(" "),t("p",[e._v("Scientist mode allows you to configure the following:")]),e._v(" "),t("ul",[t("li",[e._v("Anonscore target: What level of privacy you want to achieve. The higher the number, the more privacy you will gain, but the longer (and more expensive due to mining fees) it will take to achieve it. The pleb mode default is 5.")]),e._v(" "),t("li",[e._v("Coinsolidations: When this is turned on, the plugin will attempt to add many coins in comparison to usual. The maximum number of coins that can be added by this plugin is a random number computed for each round between 10 and 30. When coinsolidation mode is on, the likelihood to keep adding coins to the max number is probabilistic change of 90%, else it is current number of coins divided by the max number of coins. The pleb mode default is off.")]),e._v(" "),t("li",[e._v("Batched payments: When this is turned on, the plugin will attempt to batch BTC on-chain Payouts that are in the "),t("code",[e._v("AwaitingPayment")]),e._v(" state. Please note that if the coordinator you are connected to does not allow creating outputs of the payout's address format ( such as a non segwit or taproot address), these payments will not be processed. The pleb mode default is on.")]),e._v(" "),t("li",[e._v("Cross mixing: Cross mixing allows you to mix your coins across multiple coordinators in parallel, bringing you the privacy benefits of multiple coordinator liquidity pools. The default option is "),t("code",[e._v("When Free")]),e._v(" (pleb mode default), which means it will only remix coins on different coordinators if they are below the free threshold and will not be charged a coordinator fee. The other option is "),t("code",[e._v("Always")]),e._v(", which will mix coins across coordinators regardless of the fee. The last option is "),t("code",[e._v("Never")]),e._v(", which will not mix coins across coordinators.")]),e._v(" "),t("li",[e._v("Continuous coinjoins: When this is turned on, the plugin will attempt to join coinjoins even if all your coins are private. The chance to join is a random chance as defined by the value divided by 100 and then as a percentage. This means that if you enter "),t("code",[e._v("100")]),e._v(", there is a 1% chance of coinjoining every round. The pleb mode default is 0.")]),e._v(" "),t("li",[e._v("Send to other wallet: If you have other stores configured with an onchain wallet, with the same address format type, you can choose to send your coinjoin outputs to that wallet. This is useful if you want to keep your privacy gains separate from your main wallet, and can even send them directly to a hardware wallet! The pleb mode default is off.")]),e._v(" "),t("li",[e._v("Label coin selection: You are able to specify which labels will allow or disallow coins from joining coinjoins. If you exclude labels A,B, and C, then coins with those labels will not be used in coinjoins. If you include labels D, E, and F, then only coins with either of those labels will be used in coinjoins.")])]),e._v(" "),t("figure",[t("img",{attrs:{src:o(637),alt:"./img_4.png",title:"./img_4.png"}})]),e._v(" "),t("h2",{attrs:{id:"additional-coordinators"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#additional-coordinators"}},[e._v("#")]),e._v(" Additional Coordinators")]),e._v(" "),t("p",[e._v("We realize that the weakest link in these coinjoin protocols is the centralized coordinator aspect, and so have opted to support multiple coordinators, in parallel, from the get-go. You can discover additional coordinators over Nostr, or you can add a coordinator manually by using the link at the bottom.\n"),t("img",{attrs:{src:o(638),alt:"./img_5.png",title:"./img_5.png"}})]),e._v(" "),t("p",[e._v('Please be cautious as some coordinators may be malicious in nature. Once a coordinator has been added and a coinjoin round has been discovered, you can click on "Coordinator Config" to see what their fees and round requirements are set to, but be aware that a coordinator can change these at will. The plugin tracks if the minimum inputs per round, the coordination fee or the free threshold has changed and will not join rounds that are worse off than the one visible when you enabled the coordinator. You can accept the new terms by clicking on "Accept new terms" and the plugin will join rounds using the new parameters.')]),e._v(" "),t("figure",[t("img",{attrs:{src:o(639),alt:"./img_6.png",title:"./img_6.png"}})]),e._v(" "),t("p",[e._v("Ideally, the minimum number of inputs is 50 and the fee is below 1% (the default is 0.3%).")]),e._v(" "),t("h2",{attrs:{id:"running-a-coordinator"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#running-a-coordinator"}},[e._v("#")]),e._v(" Running a coordinator")]),e._v(" "),t("p",[e._v('In the spirit of "be the change you want to see in the world", this plugin ships with the ability to run your own coordinator (and publish it over Nostr for discoverability). This feature is still considered experimental, and may have '),t("a",{attrs:{href:"./https://bitcoinmagazine.com/technical/is-bitcoin-next-after-tornado-cash"}},[e._v("legal repercussions for operating a coordinator")]),e._v(".\n"),t("img",{attrs:{src:o(640),alt:"./img_7.png",title:"./img_7.png"}})]),e._v(" "),t("figure",[t("img",{attrs:{src:o(641),alt:"./img_8.png",title:"./img_8.png"}})]),e._v(" "),t("p",[e._v("By default, the coordinator is configured to donate its generated fees to the "),t("a",{attrs:{href:"https://hrf.org/",target:"_blank",rel:"noopener noreferrer"}},[e._v("human rights foundation"),t("OutboundLink")],1),e._v(", and "),t("a",{attrs:{href:"https://opensats.org/",target:"_blank",rel:"noopener noreferrer"}},[e._v("opensats"),t("OutboundLink")],1),e._v(", along with a hardcoded plugin development fee split to continue expanding and maintaining the plugin. You can configure these using the "),t("code",[e._v("CoordinatorSplits")]),e._v(" json key.\nThe format is as follows:")]),e._v(" "),t("div",{staticClass:"language- extra-class"},[t("pre",{pre:!0,attrs:{class:"language-text"}},[t("code",[e._v('[\n {\n "Ratio": 1.0,\n "Type": "hrf"\n },\n {\n "Ratio": 1.0,\n "Type": "opensats",\n "Value": "btcpayserver"\n }\n]\n')])])]),t("ul",[t("li",[e._v("If Type is "),t("code",[e._v("hrf")]),e._v(", the value of the fee equivalent to its ratio will be donated to the human rights foundation.")]),e._v(" "),t("li",[e._v("If Type is "),t("code",[e._v("opensats")]),e._v(", you must specify which project on its website will receive the value of the fee equivalent to its ratio. Available projects values are the file names listed "),t("a",{attrs:{href:"https://github.com/OpenSats/website/tree/master/./projects",target:"_blank",rel:"noopener noreferrer"}},[e._v("here"),t("OutboundLink")],1)]),e._v(" "),t("li",[e._v("If Type is "),t("code",[e._v("btcpaybutton")]),e._v(", you must specify a url to a BTCPay Server instance store's "),t("RouterLink",{attrs:{to:"/Apps/#payment-button"}},[e._v("payment button")]),e._v(". This must be enabled. The value usually looks as follows: "),t("code",[e._v("https://yourbtcpayserver.com/api/v1/invoices?storeId=yourstoreId¤cy=BTC")])],1),e._v(" "),t("li",[e._v("If Type is "),t("code",[e._v("btcpaypos")]),e._v(", you must specify a url to a BTCPay Server instance store's "),t("RouterLink",{attrs:{to:"/Apps/#point-of-sale-app"}},[e._v("point of sale")]),e._v(". The "),t("code",[e._v("Custom payments")]),e._v(" option must be enabled. The value usually looks as follows: "),t("code",[e._v("https://yourbtcpayserver.com/apps/appid/pos")])],1)]),e._v(" "),t("p",[e._v("One enabled, the local coordinator appears in the coinjoin configuration of your store, and, if you configures the nostr settings, published to a relay so that others may discover the coordinator.\n"),t("img",{attrs:{src:o(642),alt:"./img_9.png",title:"./img_9.png"}})])])}),[],!1,null,null,null);t.default=n.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[24],{607:function(e,t,o){e.exports=o.p+"assets/img/img_1.6bc7d880.png"},608:function(e,t,o){e.exports=o.p+"assets/img/img_2.9f8b0cc3.png"},609:function(e,t,o){e.exports=o.p+"assets/img/img_3.2595db17.png"},610:function(e,t,o){e.exports=o.p+"assets/img/coinselection.4c853f71.png"},611:function(e,t,o){e.exports=o.p+"assets/img/img.9710314c.png"},612:function(e,t,o){e.exports=o.p+"assets/img/img_4.c8000fea.png"},613:function(e,t,o){e.exports=o.p+"assets/img/scientist_mode.66645705.png"},614:function(e,t,o){e.exports=o.p+"assets/img/img_5.a8ef891b.png"},615:function(e,t,o){e.exports=o.p+"assets/img/img_6.745de6b7.png"},616:function(e,t,o){e.exports=o.p+"assets/img/img_7.0d3fb434.png"},617:function(e,t,o){e.exports=o.p+"assets/img/img_8.34595a5a.png"},618:function(e,t,o){e.exports=o.p+"assets/img/img_9.6da23178.png"},828:function(e,t,o){"use strict";o.r(t);var i=o(10),n=Object(i.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"the-btcpay-server-coinjoin-plugin"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#the-btcpay-server-coinjoin-plugin"}},[e._v("#")]),e._v(" The BTCPay Server Coinjoin plugin")]),e._v(" "),t("p",[e._v("This plugin allows every BTCPay Server instance to integrate with the Wabisabi coinjoin protocol developed by "),t("a",{attrs:{href:"https://zksnacks.com/",target:"_blank",rel:"noopener noreferrer"}},[e._v("zkSNACKS"),t("OutboundLink")],1),e._v(" ("),t("a",{attrs:{href:"https://wasabiwallet.io/",target:"_blank",rel:"noopener noreferrer"}},[e._v("Wasabi Wallet"),t("OutboundLink")],1),e._v(").")]),e._v(" "),t("p",{attrs:{align:"center"}},[t("a",{attrs:{href:"http://www.youtube.com/watch?feature=player_embedded&v=zGVCrwMKKn0\n",target:"_blank"}},[t("img",{attrs:{src:"http://img.youtube.com/vi/zGVCrwMKKn0/0.jpg",border:"10"}})])]),e._v(" "),t("h2",{attrs:{id:"installation"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#installation"}},[e._v("#")]),e._v(" Installation")]),e._v(" "),t("p",[e._v("First ensure that your BTCPay Server instance is at least version 1.8.0 and that NBXplorer is at least 2.3.58. If you are using the recommended Docker deployment method, it is as simple as "),t("RouterLink",{attrs:{to:"/Wabisabi/https://docs.btcpayserver.org/FAQ/ServerSettings/#how-to-update-btcpay-server"}},[e._v("one-click")]),e._v(".")],1),e._v(" "),t("p",[e._v('Then, you will need to log in as an admin, click on "Manage plugins" in the side navigation, and click on "Install" on the "Coinjoin" plugin in the list. BTCPay Server will then ask you to restart in order to load the plugin.')]),e._v(" "),t("p",[e._v('After the restart, there should be a new navigation item in the side navigation, "Coinjoin", and the dashboard should have additional elements related to coinjoins.\n'),t("img",{attrs:{src:o(607),alt:"./img_1.png",title:"./img_1.png"}})]),e._v(" "),t("h2",{attrs:{id:"usage"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#usage"}},[e._v("#")]),e._v(" Usage")]),e._v(" "),t("p",[e._v("Your store needs to have a Bitcoin wallet configured and it needs to be set up as a "),t("RouterLink",{attrs:{to:"/Wabisabi/https://docs.btcpayserver.org/CreateWallet/#hot-wallet"}},[e._v("hot wallet")]),e._v(". Only native segwit (and potentially taproot) wallets will be able to join coinjoin rounds.")],1),e._v(" "),t("p",[e._v('The easiest way to get started is to click on "Coinjoin" in the side navigation, choose the default "zkSNACKS" coordinator and click "save". BTCPay Server will automatically join coinjoin rounds and progress to enhancing the privacy of your wallet.\n'),t("img",{attrs:{src:o(608),alt:"./img_2.png",title:"./img_2.png"}}),e._v('\nCoinjoin transactions will appear in the transactions list in your wallet as they happen, and will have at least 2 labels, "coinjoin", and the name of the coordinator.\n'),t("img",{attrs:{src:o(609),alt:"./img_3.png",title:"./img_3.png"}})]),e._v(" "),t("h2",{attrs:{id:"spending-privately"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#spending-privately"}},[e._v("#")]),e._v(" Spending privately")]),e._v(" "),t("p",[e._v('Coins which have gained some level of privacy will have an "anonset" label when using the BTCPay wallet coin selection feature. If you hover over the label, it will tell you the score it has gained.')]),e._v(" "),t("figure",[t("img",{attrs:{src:o(610),alt:"./coinselection.png",title:"./coinselection.png"}})]),e._v(" "),t("p",[e._v("It is up to you to use the coin selection feature correctly to make the best of your earned privacy on your coins.")]),e._v(" "),t("p",[e._v("Ideally you:")]),e._v(" "),t("ul",[t("li",[e._v("select the least amount of coins possible")]),e._v(" "),t("li",[e._v("select the highest level of privacy coins")]),e._v(" "),t("li",[e._v("ideally use coins from different transactions")]),e._v(" "),t("li",[e._v("spend entire coins to prevent change")])]),e._v(" "),t("p",[e._v("We realize this is a complex selection and are working on an easier UI to help with this. As an initial experiment, we have added an action to let us attempt to select coins based on your sending amounts.\n"),t("img",{attrs:{src:o(611),alt:"./img.png",title:"./img.png"}})]),e._v(" "),t("p",[e._v("But the best way to spend privately is to use our unique "),t("strong",[e._v("payment batching feature")]),e._v(", by utilizing BTCPay Server's "),t("RouterLink",{attrs:{to:"/Wabisabi/https://docs.btcpayserver.org/Payouts/"}},[e._v("Payout")]),e._v(' system. Simply set the destination and amount and click on "Schedule transaction", and the payment will be embedded directly inside the next coinjoin that can fulfill it.\n'),t("img",{attrs:{src:o(612),alt:"./img_4.png",title:"./img_4.png"}})],1),e._v(" "),t("h2",{attrs:{id:"pleb-mode-vs-scientist-mode"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#pleb-mode-vs-scientist-mode"}},[e._v("#")]),e._v(" Pleb mode vs Scientist mode")]),e._v(" "),t("p",[e._v("Pleb mode comes with a curated set of configurations aimed to get you off the ground with coinjoining. Scientist mode is for those who want to experiment with different configurations and fine tune their coinjoin experience.")]),e._v(" "),t("p",[e._v("Scientist mode allows you to configure the following:")]),e._v(" "),t("ul",[t("li",[e._v("Anonscore target: What level of privacy you want to achieve. The higher the number, the more privacy you will gain, but the longer (and more expensive due to mining fees) it will take to achieve it. The pleb mode default is 5.")]),e._v(" "),t("li",[e._v("Coinsolidations: When this is turned on, the plugin will attempt to add many coins in comparison to usual. The maximum number of coins that can be added by this plugin is a random number computed for each round between 10 and 30. When coinsolidation mode is on, the likelihood to keep adding coins to the max number is probabilistic change of 90%, else it is current number of coins divided by the max number of coins. The pleb mode default is off.")]),e._v(" "),t("li",[e._v("Batched payments: When this is turned on, the plugin will attempt to batch BTC on-chain Payouts that are in the "),t("code",[e._v("AwaitingPayment")]),e._v(" state. Please note that if the coordinator you are connected to does not allow creating outputs of the payout's address format ( such as a non segwit or taproot address), these payments will not be processed. The pleb mode default is on.")]),e._v(" "),t("li",[e._v("Cross mixing: Cross mixing allows you to mix your coins across multiple coordinators in parallel, bringing you the privacy benefits of multiple coordinator liquidity pools. The default option is "),t("code",[e._v("When Free")]),e._v(" (pleb mode default), which means it will only remix coins on different coordinators if they are below the free threshold and will not be charged a coordinator fee. The other option is "),t("code",[e._v("Always")]),e._v(", which will mix coins across coordinators regardless of the fee. The last option is "),t("code",[e._v("Never")]),e._v(", which will not mix coins across coordinators.")]),e._v(" "),t("li",[e._v("Continuous coinjoins: When this is turned on, the plugin will attempt to join coinjoins even if all your coins are private. The chance to join is a random chance as defined by the value divided by 100 and then as a percentage. This means that if you enter "),t("code",[e._v("100")]),e._v(", there is a 1% chance of coinjoining every round. The pleb mode default is 0.")]),e._v(" "),t("li",[e._v("Send to other wallet: If you have other stores configured with an onchain wallet, with the same address format type, you can choose to send your coinjoin outputs to that wallet. This is useful if you want to keep your privacy gains separate from your main wallet, and can even send them directly to a hardware wallet! The pleb mode default is off.")]),e._v(" "),t("li",[e._v("Label coin selection: You are able to specify which labels will allow or disallow coins from joining coinjoins. If you exclude labels A,B, and C, then coins with those labels will not be used in coinjoins. If you include labels D, E, and F, then only coins with either of those labels will be used in coinjoins.")])]),e._v(" "),t("figure",[t("img",{attrs:{src:o(613),alt:"./img_4.png",title:"./img_4.png"}})]),e._v(" "),t("h2",{attrs:{id:"additional-coordinators"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#additional-coordinators"}},[e._v("#")]),e._v(" Additional Coordinators")]),e._v(" "),t("p",[e._v("We realize that the weakest link in these coinjoin protocols is the centralized coordinator aspect, and so have opted to support multiple coordinators, in parallel, from the get-go. You can discover additional coordinators over Nostr, or you can add a coordinator manually by using the link at the bottom.\n"),t("img",{attrs:{src:o(614),alt:"./img_5.png",title:"./img_5.png"}})]),e._v(" "),t("p",[e._v('Please be cautious as some coordinators may be malicious in nature. Once a coordinator has been added and a coinjoin round has been discovered, you can click on "Coordinator Config" to see what their fees and round requirements are set to, but be aware that a coordinator can change these at will. The plugin tracks if the minimum inputs per round, the coordination fee or the free threshold has changed and will not join rounds that are worse off than the one visible when you enabled the coordinator. You can accept the new terms by clicking on "Accept new terms" and the plugin will join rounds using the new parameters.')]),e._v(" "),t("figure",[t("img",{attrs:{src:o(615),alt:"./img_6.png",title:"./img_6.png"}})]),e._v(" "),t("p",[e._v("Ideally, the minimum number of inputs is 50 and the fee is below 1% (the default is 0.3%).")]),e._v(" "),t("h2",{attrs:{id:"running-a-coordinator"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#running-a-coordinator"}},[e._v("#")]),e._v(" Running a coordinator")]),e._v(" "),t("p",[e._v('In the spirit of "be the change you want to see in the world", this plugin ships with the ability to run your own coordinator (and publish it over Nostr for discoverability). This feature is still considered experimental, and may have '),t("a",{attrs:{href:"./https://bitcoinmagazine.com/technical/is-bitcoin-next-after-tornado-cash"}},[e._v("legal repercussions for operating a coordinator")]),e._v(".\n"),t("img",{attrs:{src:o(616),alt:"./img_7.png",title:"./img_7.png"}})]),e._v(" "),t("figure",[t("img",{attrs:{src:o(617),alt:"./img_8.png",title:"./img_8.png"}})]),e._v(" "),t("p",[e._v("By default, the coordinator is configured to donate its generated fees to the "),t("a",{attrs:{href:"https://hrf.org/",target:"_blank",rel:"noopener noreferrer"}},[e._v("human rights foundation"),t("OutboundLink")],1),e._v(", and "),t("a",{attrs:{href:"https://opensats.org/",target:"_blank",rel:"noopener noreferrer"}},[e._v("opensats"),t("OutboundLink")],1),e._v(", along with a hardcoded plugin development fee split to continue expanding and maintaining the plugin. You can configure these using the "),t("code",[e._v("CoordinatorSplits")]),e._v(" json key.\nThe format is as follows:")]),e._v(" "),t("div",{staticClass:"language- extra-class"},[t("pre",{pre:!0,attrs:{class:"language-text"}},[t("code",[e._v('[\n {\n "Ratio": 1.0,\n "Type": "hrf"\n },\n {\n "Ratio": 1.0,\n "Type": "opensats",\n "Value": "btcpayserver"\n }\n]\n')])])]),t("ul",[t("li",[e._v("If Type is "),t("code",[e._v("hrf")]),e._v(", the value of the fee equivalent to its ratio will be donated to the human rights foundation.")]),e._v(" "),t("li",[e._v("If Type is "),t("code",[e._v("opensats")]),e._v(", you must specify which project on its website will receive the value of the fee equivalent to its ratio. Available projects values are the file names listed "),t("a",{attrs:{href:"https://github.com/OpenSats/website/tree/master/./projects",target:"_blank",rel:"noopener noreferrer"}},[e._v("here"),t("OutboundLink")],1)]),e._v(" "),t("li",[e._v("If Type is "),t("code",[e._v("btcpaybutton")]),e._v(", you must specify a url to a BTCPay Server instance store's "),t("RouterLink",{attrs:{to:"/Apps/#payment-button"}},[e._v("payment button")]),e._v(". This must be enabled. The value usually looks as follows: "),t("code",[e._v("https://yourbtcpayserver.com/api/v1/invoices?storeId=yourstoreId¤cy=BTC")])],1),e._v(" "),t("li",[e._v("If Type is "),t("code",[e._v("btcpaypos")]),e._v(", you must specify a url to a BTCPay Server instance store's "),t("RouterLink",{attrs:{to:"/Apps/#point-of-sale-app"}},[e._v("point of sale")]),e._v(". The "),t("code",[e._v("Custom payments")]),e._v(" option must be enabled. The value usually looks as follows: "),t("code",[e._v("https://yourbtcpayserver.com/apps/appid/pos")])],1)]),e._v(" "),t("p",[e._v("One enabled, the local coordinator appears in the coinjoin configuration of your store, and, if you configures the nostr settings, published to a relay so that others may discover the coordinator.\n"),t("img",{attrs:{src:o(618),alt:"./img_9.png",title:"./img_9.png"}})])])}),[],!1,null,null,null);t.default=n.exports}}]); \ No newline at end of file diff --git a/assets/js/28.3a7f20f9.js b/assets/js/28.2964e12d.js similarity index 74% rename from assets/js/28.3a7f20f9.js rename to assets/js/28.2964e12d.js index ac1d5baf2a..aff423357e 100644 --- a/assets/js/28.3a7f20f9.js +++ b/assets/js/28.2964e12d.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[28],{300:function(t,e,a){t.exports=a.p+"assets/img/payouts-status3-options-appr.2f1b2d15.jpg"},535:function(t,e,a){t.exports=a.p+"assets/img/invoices-details.19bfdb69.jpg"},536:function(t,e,a){t.exports=a.p+"assets/img/issue-refund.ad313350.jpg"},537:function(t,e,a){t.exports=a.p+"assets/img/issue-refund-payment-option.ba17b34c.jpg"},538:function(t,e,a){t.exports=a.p+"assets/img/issue-refund-amount.d6751041.jpg"},539:function(t,e,a){t.exports=a.p+"assets/img/claimingside.b4816192.jpg"},540:function(t,e,a){t.exports=a.p+"assets/img/payouts-status4-options-sign3-adv.96d0e967.jpg"},541:function(t,e,a){t.exports=a.p+"assets/img/payout-status-succesfull.7513d4bc.jpg"},542:function(t,e,a){t.exports=a.p+"assets/img/payouts-status5-completed1.b5295c02.jpg"},543:function(t,e,a){t.exports=a.p+"assets/img/claiment-completed1.4e877454.jpg"},808:function(t,e,a){"use strict";a.r(e);var r=a(10),s=Object(r.a)({},(function(){var t=this,e=t._self._c;return e("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[e("h1",{attrs:{id:"refunds"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#refunds"}},[t._v("#")]),t._v(" Refunds")]),t._v(" "),e("div",{staticClass:"custom-block tip"},[e("p",{staticClass:"custom-block-title"},[t._v("TIP")]),t._v(" "),e("p",[t._v("If you are looking for information about requesting a refund from a merchant, please refer to this "),e("RouterLink",{attrs:{to:"/FAQ/General/#what-if-i-have-a-problem-with-a-paid-invoice"}},[t._v("FAQ")])],1)]),t._v(" "),e("p",[e("strong",[t._v("Refunds")]),t._v(" are one of the applications built on top of the "),e("RouterLink",{attrs:{to:"/PullPayments/"}},[t._v("Pull Payments")]),t._v(" feature.")],1),t._v(" "),e("p",[t._v("On this page, we will walk you through the process of issuing a refund.\nThere are a short few steps to create the refund for the customer.")]),t._v(" "),e("h2",{attrs:{id:"create-a-refund"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#create-a-refund"}},[t._v("#")]),t._v(" Create a refund")]),t._v(" "),e("ol",[e("li",[t._v("To refund an invoice, go in the "),e("code",[t._v("Invoices")]),t._v(" page and click "),e("code",[t._v("Details")]),t._v(" on the invoice.")])]),t._v(" "),e("figure",[e("img",{attrs:{src:a(535),alt:"BTCPay Server refund feature",title:"BTCPay Server refund feature"}})]),t._v(" "),e("ol",{attrs:{start:"2"}},[e("li",[t._v("Click "),e("code",[t._v("Issue a refund")])])]),t._v(" "),e("figure",[e("img",{attrs:{src:a(536),alt:"BTCPay Server refund feature",title:"BTCPay Server refund feature"}})]),t._v(" "),e("ol",{attrs:{start:"3"}},[e("li",[t._v("Select refund's payment method")])]),t._v(" "),e("figure",[e("img",{attrs:{src:a(537),alt:"BTCPay Server refund feature",title:"BTCPay Server refund feature"}})]),t._v(" "),e("ol",{attrs:{start:"4"}},[e("li",[t._v("Select the "),e("code",[t._v("amount")]),t._v(" you want to refund")])]),t._v(" "),e("figure",[e("img",{attrs:{src:a(538),alt:"BTCPay Server refund feature",title:"BTCPay Server refund feature"}})]),t._v(" "),e("ol",{attrs:{start:"5"}},[e("li",[t._v("Share the link of this page with your customer")])]),t._v(" "),e("figure",[e("img",{attrs:{src:a(539),alt:"BTCPay Server refund feature",title:"BTCPay Server refund feature"}})]),t._v(" "),e("h2",{attrs:{id:"processing-refund"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#processing-refund"}},[t._v("#")]),t._v(" Processing refund")]),t._v(" "),e("p",[t._v("Once a customer clicks on the link you've provided adds their refund bitcoin address and claims the invoice, the next step is to process a refund.")]),t._v(" "),e("ol",[e("li",[t._v("Go to the "),e("code",[t._v("Payouts")]),t._v(" tab in your sidebar.")])]),t._v(" "),e("figure",[e("img",{attrs:{src:a(300),alt:"BTCPay Server Payouts tab",title:"BTCPay Server Payouts tab"}})]),t._v(" "),e("ol",{attrs:{start:"2"}},[e("li",[t._v("Select the Payouts you want to process, go to actions and select "),e("code",[t._v("Approve and send")])])]),t._v(" "),e("figure",[e("img",{attrs:{src:a(300),alt:"BTCPay Server Payouts tab",title:"BTCPay Server Payouts tab"}})]),t._v(" "),e("ol",{attrs:{start:"3"}},[e("li",[t._v("Sign and broadcast the transactions.")])]),t._v(" "),e("figure",[e("img",{attrs:{src:a(540),alt:"BTCPay Server Payouts tab",title:"BTCPay Server Payouts tab"}})]),t._v(" "),e("ol",{attrs:{start:"4"}},[e("li",[t._v("The payout has now been signed and is in progress, awaiting confirmation on the blockchain. This is reflected to the claimant in their view.")])]),t._v(" "),e("figure",[e("img",{attrs:{src:a(541),alt:"BTCPay Server Payouts tab",title:"BTCPay Server Payouts tab"}})]),t._v(" "),e("ol",{attrs:{start:"5"}},[e("li",[t._v("After the transaction has been confirmed on the blockchain, the status of the payout will be "),e("code",[t._v("completed")]),t._v(".")])]),t._v(" "),e("figure",[e("img",{attrs:{src:a(542),alt:"BTCPay Server Payouts tab",title:"BTCPay Server Payouts tab"}})]),t._v(" "),e("p",[t._v("Customer's view after the refund has been successfully processed.")]),t._v(" "),e("figure",[e("img",{attrs:{src:a(543),alt:"BTCPay Server Payouts tab",title:"BTCPay Server Payouts tab"}})])])}),[],!1,null,null,null);e.default=s.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[28],{300:function(t,e,a){t.exports=a.p+"assets/img/payouts-status3-options-appr.2f1b2d15.jpg"},684:function(t,e,a){t.exports=a.p+"assets/img/invoices-details.19bfdb69.jpg"},685:function(t,e,a){t.exports=a.p+"assets/img/issue-refund.ad313350.jpg"},686:function(t,e,a){t.exports=a.p+"assets/img/issue-refund-payment-option.ba17b34c.jpg"},687:function(t,e,a){t.exports=a.p+"assets/img/issue-refund-amount.d6751041.jpg"},688:function(t,e,a){t.exports=a.p+"assets/img/claimingside.b4816192.jpg"},689:function(t,e,a){t.exports=a.p+"assets/img/payouts-status4-options-sign3-adv.96d0e967.jpg"},690:function(t,e,a){t.exports=a.p+"assets/img/payout-status-succesfull.7513d4bc.jpg"},691:function(t,e,a){t.exports=a.p+"assets/img/payouts-status5-completed1.b5295c02.jpg"},692:function(t,e,a){t.exports=a.p+"assets/img/claiment-completed1.4e877454.jpg"},836:function(t,e,a){"use strict";a.r(e);var r=a(10),s=Object(r.a)({},(function(){var t=this,e=t._self._c;return e("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[e("h1",{attrs:{id:"refunds"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#refunds"}},[t._v("#")]),t._v(" Refunds")]),t._v(" "),e("div",{staticClass:"custom-block tip"},[e("p",{staticClass:"custom-block-title"},[t._v("TIP")]),t._v(" "),e("p",[t._v("If you are looking for information about requesting a refund from a merchant, please refer to this "),e("RouterLink",{attrs:{to:"/FAQ/General/#what-if-i-have-a-problem-with-a-paid-invoice"}},[t._v("FAQ")])],1)]),t._v(" "),e("p",[e("strong",[t._v("Refunds")]),t._v(" are one of the applications built on top of the "),e("RouterLink",{attrs:{to:"/PullPayments/"}},[t._v("Pull Payments")]),t._v(" feature.")],1),t._v(" "),e("p",[t._v("On this page, we will walk you through the process of issuing a refund.\nThere are a short few steps to create the refund for the customer.")]),t._v(" "),e("h2",{attrs:{id:"create-a-refund"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#create-a-refund"}},[t._v("#")]),t._v(" Create a refund")]),t._v(" "),e("ol",[e("li",[t._v("To refund an invoice, go in the "),e("code",[t._v("Invoices")]),t._v(" page and click "),e("code",[t._v("Details")]),t._v(" on the invoice.")])]),t._v(" "),e("figure",[e("img",{attrs:{src:a(684),alt:"BTCPay Server refund feature",title:"BTCPay Server refund feature"}})]),t._v(" "),e("ol",{attrs:{start:"2"}},[e("li",[t._v("Click "),e("code",[t._v("Issue a refund")])])]),t._v(" "),e("figure",[e("img",{attrs:{src:a(685),alt:"BTCPay Server refund feature",title:"BTCPay Server refund feature"}})]),t._v(" "),e("ol",{attrs:{start:"3"}},[e("li",[t._v("Select refund's payment method")])]),t._v(" "),e("figure",[e("img",{attrs:{src:a(686),alt:"BTCPay Server refund feature",title:"BTCPay Server refund feature"}})]),t._v(" "),e("ol",{attrs:{start:"4"}},[e("li",[t._v("Select the "),e("code",[t._v("amount")]),t._v(" you want to refund")])]),t._v(" "),e("figure",[e("img",{attrs:{src:a(687),alt:"BTCPay Server refund feature",title:"BTCPay Server refund feature"}})]),t._v(" "),e("ol",{attrs:{start:"5"}},[e("li",[t._v("Share the link of this page with your customer")])]),t._v(" "),e("figure",[e("img",{attrs:{src:a(688),alt:"BTCPay Server refund feature",title:"BTCPay Server refund feature"}})]),t._v(" "),e("h2",{attrs:{id:"processing-refund"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#processing-refund"}},[t._v("#")]),t._v(" Processing refund")]),t._v(" "),e("p",[t._v("Once a customer clicks on the link you've provided adds their refund bitcoin address and claims the invoice, the next step is to process a refund.")]),t._v(" "),e("ol",[e("li",[t._v("Go to the "),e("code",[t._v("Payouts")]),t._v(" tab in your sidebar.")])]),t._v(" "),e("figure",[e("img",{attrs:{src:a(300),alt:"BTCPay Server Payouts tab",title:"BTCPay Server Payouts tab"}})]),t._v(" "),e("ol",{attrs:{start:"2"}},[e("li",[t._v("Select the Payouts you want to process, go to actions and select "),e("code",[t._v("Approve and send")])])]),t._v(" "),e("figure",[e("img",{attrs:{src:a(300),alt:"BTCPay Server Payouts tab",title:"BTCPay Server Payouts tab"}})]),t._v(" "),e("ol",{attrs:{start:"3"}},[e("li",[t._v("Sign and broadcast the transactions.")])]),t._v(" "),e("figure",[e("img",{attrs:{src:a(689),alt:"BTCPay Server Payouts tab",title:"BTCPay Server Payouts tab"}})]),t._v(" "),e("ol",{attrs:{start:"4"}},[e("li",[t._v("The payout has now been signed and is in progress, awaiting confirmation on the blockchain. This is reflected to the claimant in their view.")])]),t._v(" "),e("figure",[e("img",{attrs:{src:a(690),alt:"BTCPay Server Payouts tab",title:"BTCPay Server Payouts tab"}})]),t._v(" "),e("ol",{attrs:{start:"5"}},[e("li",[t._v("After the transaction has been confirmed on the blockchain, the status of the payout will be "),e("code",[t._v("completed")]),t._v(".")])]),t._v(" "),e("figure",[e("img",{attrs:{src:a(691),alt:"BTCPay Server Payouts tab",title:"BTCPay Server Payouts tab"}})]),t._v(" "),e("p",[t._v("Customer's view after the refund has been successfully processed.")]),t._v(" "),e("figure",[e("img",{attrs:{src:a(692),alt:"BTCPay Server Payouts tab",title:"BTCPay Server Payouts tab"}})])])}),[],!1,null,null,null);e.default=s.exports}}]); \ No newline at end of file diff --git a/assets/js/29.08a89e72.js b/assets/js/29.24564201.js similarity index 76% rename from assets/js/29.08a89e72.js rename to assets/js/29.24564201.js index c5228daef7..eb42be5b0d 100644 --- a/assets/js/29.08a89e72.js +++ b/assets/js/29.24564201.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[29],{357:function(t,e,r){t.exports=r.p+"assets/img/ContributeCloneRepo.4df4c253.jpg"},358:function(t,e,r){t.exports=r.p+"assets/img/ContributeCloneRepo2.70d12ce3.jpg"},359:function(t,e,r){t.exports=r.p+"assets/img/ContributeCreateBranch.7d45e1e5.jpg"},360:function(t,e,r){t.exports=r.p+"assets/img/ContributeCreateBranch2.05759e70.jpg"},361:function(t,e,r){t.exports=r.p+"assets/img/ContributeFindFile.0bdf3b61.jpg"},362:function(t,e,r){t.exports=r.p+"assets/img/ContributeCommit.aadec825.jpg"},363:function(t,e,r){t.exports=r.p+"assets/img/ContributeCommit2.e2985a43.jpg"},364:function(t,e,r){t.exports=r.p+"assets/img/ContributeCreatePR.67d68a78.jpg"},365:function(t,e,r){t.exports=r.p+"assets/img/ContributeOpenPR.bacee510.jpg"},727:function(t,e,r){"use strict";r.r(e);var i=r(10),o=Object(i.a)({},(function(){var t=this,e=t._self._c;return e("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[e("h1",{attrs:{id:"contribute-to-the-software-stack"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#contribute-to-the-software-stack"}},[t._v("#")]),t._v(" Contribute to the software stack")]),t._v(" "),e("div",{staticClass:"custom-block tip"},[e("p",{staticClass:"custom-block-title"},[t._v("TIP")]),t._v(" "),e("p",[t._v("If you have trouble finding a string or contributing to the software stack, ask the "),e("RouterLink",{attrs:{to:"/Community/"}},[t._v("community")])],1),t._v(" "),e("p",[t._v("If your textual change is significant "),e("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver/issues/new/choose",target:"_blank",rel:"noopener noreferrer"}},[t._v("open an issue on GitHub"),e("OutboundLink")],1),t._v(" and explain what you'd like to change and why.")])]),t._v(" "),e("h2",{attrs:{id:"step-1"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#step-1"}},[t._v("#")]),t._v(" "),e("strong",[t._v("Step 1")])]),t._v(" "),e("p",[t._v("Fork/Clone the main repository ("),e("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver/",target:"_blank",rel:"noopener noreferrer"}},[t._v("BTCPay Server"),e("OutboundLink")],1),t._v(") using Github and publish it.")]),t._v(" "),e("figure",[e("img",{attrs:{src:r(357),alt:"ContributeCloneRepo",title:"ContributeCloneRepo"}})]),t._v(" "),e("figure",[e("img",{attrs:{src:r(358),alt:"ContributeCloneRepo2",title:"ContributeCloneRepo2"}})]),t._v(" "),e("h2",{attrs:{id:"step-2"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#step-2"}},[t._v("#")]),t._v(" "),e("strong",[t._v("Step 2")])]),t._v(" "),e("p",[t._v("Create a branch and name it (for example what file you're working on).")]),t._v(" "),e("figure",[e("img",{attrs:{src:r(359),alt:"ContributeCreateBranch",title:"ContributeCreateBranch"}})]),t._v(" "),e("figure",[e("img",{attrs:{src:r(360),alt:"ContributeCreateBranch2",title:"ContributeCreateBranch2"}})]),t._v(" "),e("h2",{attrs:{id:"step-3"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#step-3"}},[t._v("#")]),t._v(" "),e("strong",[t._v("Step 3")])]),t._v(" "),e("p",[t._v("Now open your branch in your file explorer.")]),t._v(" "),e("figure",[e("img",{attrs:{src:r(361),alt:"ContributeFindFile",title:"ContributeFindFile"}})]),t._v(" "),e("p",[t._v("You're all set!\nOpen the file you wish to edit and work on it.\nOnce finished, save it.")]),t._v(" "),e("h2",{attrs:{id:"step-4"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#step-4"}},[t._v("#")]),t._v(" "),e("strong",[t._v("Step 4")])]),t._v(" "),e("p",[t._v("Once your changes are saved, return to Github Desktop.\nSee your changes on the right hand side.")]),t._v(" "),e("p",[t._v("Name your contribution and describe it.\nClick the "),e("code",[t._v("Commit")]),t._v(" button in the bottom left.")]),t._v(" "),e("figure",[e("img",{attrs:{src:r(362),alt:"ContributeCommit",title:"ContributeCommit"}})]),t._v(" "),e("figure",[e("img",{attrs:{src:r(363),alt:"ContributeCommit2",title:"ContributeCommit2"}})]),t._v(" "),e("h2",{attrs:{id:"step-5"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#step-5"}},[t._v("#")]),t._v(" "),e("strong",[t._v("Step 5")])]),t._v(" "),e("p",[t._v("Next, create a "),e("code",[t._v("Pull Request")]),t._v(" by clicking the "),e("code",[t._v("Create Pull Request")]),t._v(" button on the right to open a browser page.")]),t._v(" "),e("figure",[e("img",{attrs:{src:r(364),alt:"ContributeCreatePR",title:"ContributeCreatePR"}})]),t._v(" "),e("p",[t._v("Then describe what your "),e("code",[t._v("Pull Request")]),t._v(" changes, give it a title, and click "),e("code",[t._v("Create Pull Request")]),t._v(".")]),t._v(" "),e("figure",[e("img",{attrs:{src:r(365),alt:"ContributeOpenPR",title:"ContributeOpenPR"}})]),t._v(" "),e("p",[t._v("Once your pull request is submitted, it has to be reviewed by the maintainers and contributors. If it gets accepted - congratulations, you've made your first contribution.")])])}),[],!1,null,null,null);e.default=o.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[29],{352:function(t,e,r){t.exports=r.p+"assets/img/ContributeCloneRepo.4df4c253.jpg"},353:function(t,e,r){t.exports=r.p+"assets/img/ContributeCloneRepo2.70d12ce3.jpg"},354:function(t,e,r){t.exports=r.p+"assets/img/ContributeCreateBranch.7d45e1e5.jpg"},355:function(t,e,r){t.exports=r.p+"assets/img/ContributeCreateBranch2.05759e70.jpg"},356:function(t,e,r){t.exports=r.p+"assets/img/ContributeFindFile.0bdf3b61.jpg"},357:function(t,e,r){t.exports=r.p+"assets/img/ContributeCommit.aadec825.jpg"},358:function(t,e,r){t.exports=r.p+"assets/img/ContributeCommit2.e2985a43.jpg"},359:function(t,e,r){t.exports=r.p+"assets/img/ContributeCreatePR.67d68a78.jpg"},360:function(t,e,r){t.exports=r.p+"assets/img/ContributeOpenPR.bacee510.jpg"},727:function(t,e,r){"use strict";r.r(e);var i=r(10),o=Object(i.a)({},(function(){var t=this,e=t._self._c;return e("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[e("h1",{attrs:{id:"contribute-to-the-software-stack"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#contribute-to-the-software-stack"}},[t._v("#")]),t._v(" Contribute to the software stack")]),t._v(" "),e("div",{staticClass:"custom-block tip"},[e("p",{staticClass:"custom-block-title"},[t._v("TIP")]),t._v(" "),e("p",[t._v("If you have trouble finding a string or contributing to the software stack, ask the "),e("RouterLink",{attrs:{to:"/Community/"}},[t._v("community")])],1),t._v(" "),e("p",[t._v("If your textual change is significant "),e("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver/issues/new/choose",target:"_blank",rel:"noopener noreferrer"}},[t._v("open an issue on GitHub"),e("OutboundLink")],1),t._v(" and explain what you'd like to change and why.")])]),t._v(" "),e("h2",{attrs:{id:"step-1"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#step-1"}},[t._v("#")]),t._v(" "),e("strong",[t._v("Step 1")])]),t._v(" "),e("p",[t._v("Fork/Clone the main repository ("),e("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver/",target:"_blank",rel:"noopener noreferrer"}},[t._v("BTCPay Server"),e("OutboundLink")],1),t._v(") using Github and publish it.")]),t._v(" "),e("figure",[e("img",{attrs:{src:r(352),alt:"ContributeCloneRepo",title:"ContributeCloneRepo"}})]),t._v(" "),e("figure",[e("img",{attrs:{src:r(353),alt:"ContributeCloneRepo2",title:"ContributeCloneRepo2"}})]),t._v(" "),e("h2",{attrs:{id:"step-2"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#step-2"}},[t._v("#")]),t._v(" "),e("strong",[t._v("Step 2")])]),t._v(" "),e("p",[t._v("Create a branch and name it (for example what file you're working on).")]),t._v(" "),e("figure",[e("img",{attrs:{src:r(354),alt:"ContributeCreateBranch",title:"ContributeCreateBranch"}})]),t._v(" "),e("figure",[e("img",{attrs:{src:r(355),alt:"ContributeCreateBranch2",title:"ContributeCreateBranch2"}})]),t._v(" "),e("h2",{attrs:{id:"step-3"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#step-3"}},[t._v("#")]),t._v(" "),e("strong",[t._v("Step 3")])]),t._v(" "),e("p",[t._v("Now open your branch in your file explorer.")]),t._v(" "),e("figure",[e("img",{attrs:{src:r(356),alt:"ContributeFindFile",title:"ContributeFindFile"}})]),t._v(" "),e("p",[t._v("You're all set!\nOpen the file you wish to edit and work on it.\nOnce finished, save it.")]),t._v(" "),e("h2",{attrs:{id:"step-4"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#step-4"}},[t._v("#")]),t._v(" "),e("strong",[t._v("Step 4")])]),t._v(" "),e("p",[t._v("Once your changes are saved, return to Github Desktop.\nSee your changes on the right hand side.")]),t._v(" "),e("p",[t._v("Name your contribution and describe it.\nClick the "),e("code",[t._v("Commit")]),t._v(" button in the bottom left.")]),t._v(" "),e("figure",[e("img",{attrs:{src:r(357),alt:"ContributeCommit",title:"ContributeCommit"}})]),t._v(" "),e("figure",[e("img",{attrs:{src:r(358),alt:"ContributeCommit2",title:"ContributeCommit2"}})]),t._v(" "),e("h2",{attrs:{id:"step-5"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#step-5"}},[t._v("#")]),t._v(" "),e("strong",[t._v("Step 5")])]),t._v(" "),e("p",[t._v("Next, create a "),e("code",[t._v("Pull Request")]),t._v(" by clicking the "),e("code",[t._v("Create Pull Request")]),t._v(" button on the right to open a browser page.")]),t._v(" "),e("figure",[e("img",{attrs:{src:r(359),alt:"ContributeCreatePR",title:"ContributeCreatePR"}})]),t._v(" "),e("p",[t._v("Then describe what your "),e("code",[t._v("Pull Request")]),t._v(" changes, give it a title, and click "),e("code",[t._v("Create Pull Request")]),t._v(".")]),t._v(" "),e("figure",[e("img",{attrs:{src:r(360),alt:"ContributeOpenPR",title:"ContributeOpenPR"}})]),t._v(" "),e("p",[t._v("Once your pull request is submitted, it has to be reviewed by the maintainers and contributors. If it gets accepted - congratulations, you've made your first contribution.")])])}),[],!1,null,null,null);e.default=o.exports}}]); \ No newline at end of file diff --git a/assets/js/30.82427b91.js b/assets/js/30.2b3d11ac.js similarity index 90% rename from assets/js/30.82427b91.js rename to assets/js/30.2b3d11ac.js index 1f9601018d..a4d4a17ce9 100644 --- a/assets/js/30.82427b91.js +++ b/assets/js/30.2b3d11ac.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[30],{292:function(e,t,a){e.exports=a.p+"assets/img/BroadcastConfirm.fde15efd.png"},340:function(e,t,a){e.exports=a.p+"assets/img/MainMenu.c6ee0a71.png"},341:function(e,t,a){e.exports=a.p+"assets/img/CreateNewWallet.b9662283.png"},342:function(e,t,a){e.exports=a.p+"assets/img/HotWallet.3334a95d.png"},343:function(e,t,a){e.exports=a.p+"assets/img/WalletSettings.20aa817c.png"},344:function(e,t,a){e.exports=a.p+"assets/img/AdvancedSettings.46859536.png"},345:function(e,t,a){e.exports=a.p+"assets/img/ServerSettings.6a6d7e35.png"},346:function(e,t,a){e.exports=a.p+"assets/img/WalletSend.b3bed5a9.png"},347:function(e,t,a){e.exports=a.p+"assets/img/SignTransaction.ddb5258c.png"},723:function(e,t,a){"use strict";a.r(t);var r=a(10),n=Object(r.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"create-a-new-wallet"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#create-a-new-wallet"}},[e._v("#")]),e._v(" Create a new wallet")]),e._v(" "),t("ul",[t("li",[t("a",{attrs:{href:"#hot-wallet"}},[e._v("Hot Wallet")])]),e._v(" "),t("li",[t("a",{attrs:{href:"#watch-only-wallet"}},[e._v("Watch-only wallet")])])]),e._v(" "),t("h3",{attrs:{id:"hot-wallet"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#hot-wallet"}},[e._v("#")]),e._v(" Hot Wallet")]),e._v(" "),t("p",[e._v("If you do not have an existing wallet, you can generate a new one within your BTCPay Server. Whether you have an existing wallet or not, the quickest way to get a wallet connected to your store is to create a new wallet. You can always replace it with an alternative wallet after receiving a few small payments to your server, if you just want to get your store ready quickly.")]),e._v(" "),t("p",[e._v("This type of wallet is also necessary to use features such as "),t("RouterLink",{attrs:{to:"/Payjoin/"}},[e._v("Payjoin")]),e._v(" and "),t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver/issues/1282",target:"_blank",rel:"noopener noreferrer"}},[e._v("Liquid"),t("OutboundLink")],1),e._v(".")],1),e._v(" "),t("p",[e._v("After creating a store, you'll be able to attach a wallet by first navigating to the sidebar or slide-out menu and clicking/tapping the "),t("strong",[e._v("Bitcoin")]),e._v(" button under the "),t("strong",[e._v("Wallets")]),e._v(" header. Alternatively, you can find the option to "),t("strong",[e._v("Set up a wallet")]),e._v(" on the Dashboard.")]),e._v(" "),t("figure",[t("img",{attrs:{src:a(340),alt:"Main Menu",title:"Main Menu"}})]),e._v(" "),t("p",[e._v("You'll focus on the "),t("strong",[e._v("I don't have a wallet")]),e._v(" section for a hot wallet and click the "),t("strong",[e._v("Create a new wallet")]),e._v(" button.")]),e._v(" "),t("figure",[t("img",{attrs:{src:a(341),alt:"New Wallet",title:"New Wallet"}})]),e._v(" "),t("p",[e._v("There will be two options on the proceeding page, and in this case, we'll select the "),t("strong",[e._v("Hot wallet")]),e._v(" button.")]),e._v(" "),t("figure",[t("img",{attrs:{src:a(342),alt:"Create Wallet",title:"Create Wallet"}})]),e._v(" "),t("p",[e._v("For most people, the default options, including "),t("strong",[e._v("Address Type")]),e._v(" (Segwit), should work well for most applications, and it's recommended not to change it unless you're sure of what you're doing. The "),t("strong",[e._v("Payjoin")]),e._v(" feature is optional, and you can learn more about it at the link "),t("a",{attrs:{href:"#hot-wallet"}},[e._v("above")]),e._v(".")]),e._v(" "),t("p",[e._v("Find out more about advanced settings "),t("a",{attrs:{href:"#advanced-settings"}},[e._v("here")]),e._v(".")]),e._v(" "),t("figure",[t("img",{attrs:{src:a(343),alt:"Wallet Settings",title:"Wallet Settings"}})]),e._v(" "),t("h4",{attrs:{id:"recovery-seed"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#recovery-seed"}},[e._v("#")]),e._v(" Recovery Seed")]),e._v(" "),t("p",[e._v("The last step to creating a hot wallet is making sure you document your recovery seed. After you've done so, tick the checkbox that says "),t("em",[e._v("I have written down my recovery phrase and stored it in a secure location")]),e._v(" and click the "),t("strong",[e._v("Done")]),e._v(" button.")]),e._v(" "),t("h4",{attrs:{id:"advanced-settings"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#advanced-settings"}},[e._v("#")]),e._v(" Advanced Settings")]),e._v(" "),t("ul",[t("li",[t("p",[e._v("Optional "),t("a",{attrs:{href:"https://github.com/bitcoin/bips/blob/master/bip-0039.mediawiki#from-mnemonic-to-seed",target:"_blank",rel:"noopener noreferrer"}},[e._v("BIP39"),t("OutboundLink")],1),e._v(" passphrase")]),e._v(" "),t("ul",[t("li",[e._v("You can add a passphrase for your hot wallet's mnemonic for an additional layer of security.")])])]),e._v(" "),t("li",[t("p",[e._v("Import keys to RPC")]),e._v(" "),t("ul",[t("li",[e._v("This is for more advanced applications of BTCPay Server. Importing your keys to RPC will allow users to leverage "),t("a",{attrs:{href:"https://developer.bitcoin.org/reference/rpc/index.html#wallet-rpcs",target:"_blank",rel:"noopener noreferrer"}},[e._v("bitcoind Wallet RPCs"),t("OutboundLink")],1),e._v(" on the imported wallet.")])])])]),e._v(" "),t("figure",[t("img",{attrs:{src:a(344),alt:"Advanced Settings",title:"Advanced Settings"}})]),e._v(" "),t("h4",{attrs:{id:"requirements-to-create-wallets"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#requirements-to-create-wallets"}},[e._v("#")]),e._v(" Requirements to create wallets")]),e._v(" "),t("p",[e._v("If are using a "),t("RouterLink",{attrs:{to:"/Deployment/ThirdPartyHosting/"}},[e._v("third-party host")]),e._v(", this option needs to be explicitly enabled by the server admin. Generating a new wallet in an environment you are not sure is trustworthy, is discouraged.")],1),e._v(" "),t("p",[e._v('By default, you need to be a server admin to use the create wallet feature. This is because server admins are able to extract the private key easily. If for some reason (such as allowing individuals that trust you enough with their store), you can enable the hot wallet for non-admins from Server Settings > Policies > "Allow non-admins to create hot wallets for their stores".')]),e._v(" "),t("p",[e._v("Understand that anyone with access to your recovery seed can also access and steal all your funds (current AND future funds!), since a private key is derived from a recovery seed. Securely back up your seed by writing it down and keep it in a safe place. Do not photograph it or store it in a digital format. Do not rely solely on your server for storing your recovery seed, always keep a backup copy.")]),e._v(" "),t("figure",[t("img",{attrs:{src:a(345),alt:"BTCPay Server settings",title:"BTCPay Server settings"}})]),e._v(" "),t("div",{staticClass:"custom-block warning"},[t("p",{staticClass:"custom-block-title"},[e._v("WARNING")]),e._v(" "),t("p",[e._v("When a new wallet is generated, BTCPay Server will show you a twelve word recovery seed. After the initial display, the recovery seed is wiped from the server, unless a the hot wallet option is enabled.")])]),e._v(" "),t("h4",{attrs:{id:"spending-funds-with-btcpay-hot-wallet"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#spending-funds-with-btcpay-hot-wallet"}},[e._v("#")]),e._v(" Spending funds with BTCPay Hot Wallet")]),e._v(" "),t("p",[e._v("Once you've received funds to your wallet and decide to spend them, you can automatically sign the transaction inside BTCPay Server.")]),e._v(" "),t("ol",[t("li",[e._v("In BTCPay Server, go to > Wallets > Bitcoin > Send")]),e._v(" "),t("li",[e._v("Fill in the Destination address and the Amount")]),e._v(" "),t("li",[e._v("Adjust the transaction settings, including fee rate, confirmation time preference, and if you'd like transaction fees to be subtracted from the amount you're sending")]),e._v(" "),t("li",[e._v("Sign the transaction")]),e._v(" "),t("li",[e._v("Review the transaction")]),e._v(" "),t("li",[e._v("Broadcast the transaction")])]),e._v(" "),t("p",[t("img",{attrs:{src:a(346),alt:"BTCPay Server Send page",title:"BTCPay Server Send page"}}),e._v(" "),t("img",{attrs:{src:a(292),alt:"BTCPay Server Transaction Review and Broadcast page",title:"BTCPay Server Transaction Review and Broadcast page"}})]),e._v(" "),t("h4",{attrs:{id:"security-implications"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#security-implications"}},[e._v("#")]),e._v(" Security Implications")]),e._v(" "),t("p",[e._v("Storing private keys on a public server comes with risks. This is similar to the risks of running and using the "),t("RouterLink",{attrs:{to:"/LightningNetwork/"}},[e._v("Lightning Network")]),e._v(" (except that you can recover funds with a backup).\n"),t("strong",[e._v("Please, ALWAYS be sure to back up any seed that is generated by this feature and to never leave money you cannot afford to lose spendable by those private keys")]),e._v(".")],1),e._v(" "),t("h4",{attrs:{id:"reducing-risk"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#reducing-risk"}},[e._v("#")]),e._v(" Reducing risk")]),e._v(" "),t("p",[e._v("As mentioned above, the create wallet functionality includes the risk of funds being stolen if the server or account is compromised. To mitigate this risk, we advise you to:")]),e._v(" "),t("ul",[t("li",[e._v("Enable two factor or U2F authentication")]),e._v(" "),t("li",[e._v("Occasionally move funds to your cold storage either manually or by configuring "),t("a",{attrs:{href:"https://github.com/btcpayserver/btcTransmuter/blob/master/README.md",target:"_blank",rel:"noopener noreferrer"}},[e._v("BTC Transmuter"),t("OutboundLink")],1),e._v(" with automatic payment forwarding.")])]),e._v(" "),t("div",{staticClass:"custom-block danger"},[t("p",{staticClass:"custom-block-title"},[e._v("DANGER")]),e._v(" "),t("p",[e._v("Do not give anyone else access to your server's SSH keys or server account credentials when using a hot wallet. Anyone with access to your account can spend the funds from your hot wallet. If you need to allow account access to employees, developers, etc. use an "),t("RouterLink",{attrs:{to:"/ConnectWallet/#connect-an-existing-wallet"}},[e._v("existing wallet")]),e._v(" instead.")],1)]),e._v(" "),t("h3",{attrs:{id:"watch-only-wallet"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#watch-only-wallet"}},[e._v("#")]),e._v(" Watch-only wallet")]),e._v(" "),t("p",[e._v('Like the hot wallet, the watch-only wallet can instantly get your store connected to a wallet. In contrast, this option does not store the private keys on the server. As a result, the wallet becomes "watch-only" for any received funds.')]),e._v(" "),t("p",[e._v("There are several routes you can take to spend funds with this type of wallet including importing the seed words into a hardware wallet to sign your transactions using the "),t("RouterLink",{attrs:{to:"/Vault/"}},[e._v("BTCPay Server Vault application")]),e._v(", "),t("RouterLink",{attrs:{to:"/Wallet/#psbt"}},[e._v("PSBT")]),e._v(", or the least recommended manually providing your seed words every time.")],1),e._v(" "),t("figure",[t("img",{attrs:{src:a(347),alt:"BTCPay Server Transaction Signing Options",title:"BTCPay Server Transaction Signing Options"}})]),e._v(" "),t("p",[e._v("Alternatively, you can spend funds in another external wallet where you have imported your BTCPay Server-produced seed words. If you import your seed words into an external wallet, you can also use a PSBT to spend the funds, assuming the wallet supports it. This option will be available on the wallet's send page. Be sure to consider the "),t("RouterLink",{attrs:{to:"/FAQ/Wallet/#missing-payments-in-my-software-or-hardware-wallet"}},[e._v("gap limit issue")]),e._v(" if you're using an external wallet with your watch-only wallet.")],1)])}),[],!1,null,null,null);t.default=n.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[30],{292:function(e,t,a){e.exports=a.p+"assets/img/BroadcastConfirm.fde15efd.png"},341:function(e,t,a){e.exports=a.p+"assets/img/MainMenu.c6ee0a71.png"},342:function(e,t,a){e.exports=a.p+"assets/img/CreateNewWallet.b9662283.png"},343:function(e,t,a){e.exports=a.p+"assets/img/HotWallet.3334a95d.png"},344:function(e,t,a){e.exports=a.p+"assets/img/WalletSettings.20aa817c.png"},345:function(e,t,a){e.exports=a.p+"assets/img/AdvancedSettings.46859536.png"},346:function(e,t,a){e.exports=a.p+"assets/img/ServerSettings.6a6d7e35.png"},347:function(e,t,a){e.exports=a.p+"assets/img/WalletSend.b3bed5a9.png"},348:function(e,t,a){e.exports=a.p+"assets/img/SignTransaction.ddb5258c.png"},724:function(e,t,a){"use strict";a.r(t);var r=a(10),n=Object(r.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"create-a-new-wallet"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#create-a-new-wallet"}},[e._v("#")]),e._v(" Create a new wallet")]),e._v(" "),t("ul",[t("li",[t("a",{attrs:{href:"#hot-wallet"}},[e._v("Hot Wallet")])]),e._v(" "),t("li",[t("a",{attrs:{href:"#watch-only-wallet"}},[e._v("Watch-only wallet")])])]),e._v(" "),t("h3",{attrs:{id:"hot-wallet"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#hot-wallet"}},[e._v("#")]),e._v(" Hot Wallet")]),e._v(" "),t("p",[e._v("If you do not have an existing wallet, you can generate a new one within your BTCPay Server. Whether you have an existing wallet or not, the quickest way to get a wallet connected to your store is to create a new wallet. You can always replace it with an alternative wallet after receiving a few small payments to your server, if you just want to get your store ready quickly.")]),e._v(" "),t("p",[e._v("This type of wallet is also necessary to use features such as "),t("RouterLink",{attrs:{to:"/Payjoin/"}},[e._v("Payjoin")]),e._v(" and "),t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver/issues/1282",target:"_blank",rel:"noopener noreferrer"}},[e._v("Liquid"),t("OutboundLink")],1),e._v(".")],1),e._v(" "),t("p",[e._v("After creating a store, you'll be able to attach a wallet by first navigating to the sidebar or slide-out menu and clicking/tapping the "),t("strong",[e._v("Bitcoin")]),e._v(" button under the "),t("strong",[e._v("Wallets")]),e._v(" header. Alternatively, you can find the option to "),t("strong",[e._v("Set up a wallet")]),e._v(" on the Dashboard.")]),e._v(" "),t("figure",[t("img",{attrs:{src:a(341),alt:"Main Menu",title:"Main Menu"}})]),e._v(" "),t("p",[e._v("You'll focus on the "),t("strong",[e._v("I don't have a wallet")]),e._v(" section for a hot wallet and click the "),t("strong",[e._v("Create a new wallet")]),e._v(" button.")]),e._v(" "),t("figure",[t("img",{attrs:{src:a(342),alt:"New Wallet",title:"New Wallet"}})]),e._v(" "),t("p",[e._v("There will be two options on the proceeding page, and in this case, we'll select the "),t("strong",[e._v("Hot wallet")]),e._v(" button.")]),e._v(" "),t("figure",[t("img",{attrs:{src:a(343),alt:"Create Wallet",title:"Create Wallet"}})]),e._v(" "),t("p",[e._v("For most people, the default options, including "),t("strong",[e._v("Address Type")]),e._v(" (Segwit), should work well for most applications, and it's recommended not to change it unless you're sure of what you're doing. The "),t("strong",[e._v("Payjoin")]),e._v(" feature is optional, and you can learn more about it at the link "),t("a",{attrs:{href:"#hot-wallet"}},[e._v("above")]),e._v(".")]),e._v(" "),t("p",[e._v("Find out more about advanced settings "),t("a",{attrs:{href:"#advanced-settings"}},[e._v("here")]),e._v(".")]),e._v(" "),t("figure",[t("img",{attrs:{src:a(344),alt:"Wallet Settings",title:"Wallet Settings"}})]),e._v(" "),t("h4",{attrs:{id:"recovery-seed"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#recovery-seed"}},[e._v("#")]),e._v(" Recovery Seed")]),e._v(" "),t("p",[e._v("The last step to creating a hot wallet is making sure you document your recovery seed. After you've done so, tick the checkbox that says "),t("em",[e._v("I have written down my recovery phrase and stored it in a secure location")]),e._v(" and click the "),t("strong",[e._v("Done")]),e._v(" button.")]),e._v(" "),t("h4",{attrs:{id:"advanced-settings"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#advanced-settings"}},[e._v("#")]),e._v(" Advanced Settings")]),e._v(" "),t("ul",[t("li",[t("p",[e._v("Optional "),t("a",{attrs:{href:"https://github.com/bitcoin/bips/blob/master/bip-0039.mediawiki#from-mnemonic-to-seed",target:"_blank",rel:"noopener noreferrer"}},[e._v("BIP39"),t("OutboundLink")],1),e._v(" passphrase")]),e._v(" "),t("ul",[t("li",[e._v("You can add a passphrase for your hot wallet's mnemonic for an additional layer of security.")])])]),e._v(" "),t("li",[t("p",[e._v("Import keys to RPC")]),e._v(" "),t("ul",[t("li",[e._v("This is for more advanced applications of BTCPay Server. Importing your keys to RPC will allow users to leverage "),t("a",{attrs:{href:"https://developer.bitcoin.org/reference/rpc/index.html#wallet-rpcs",target:"_blank",rel:"noopener noreferrer"}},[e._v("bitcoind Wallet RPCs"),t("OutboundLink")],1),e._v(" on the imported wallet.")])])])]),e._v(" "),t("figure",[t("img",{attrs:{src:a(345),alt:"Advanced Settings",title:"Advanced Settings"}})]),e._v(" "),t("h4",{attrs:{id:"requirements-to-create-wallets"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#requirements-to-create-wallets"}},[e._v("#")]),e._v(" Requirements to create wallets")]),e._v(" "),t("p",[e._v("If are using a "),t("RouterLink",{attrs:{to:"/Deployment/ThirdPartyHosting/"}},[e._v("third-party host")]),e._v(", this option needs to be explicitly enabled by the server admin. Generating a new wallet in an environment you are not sure is trustworthy, is discouraged.")],1),e._v(" "),t("p",[e._v('By default, you need to be a server admin to use the create wallet feature. This is because server admins are able to extract the private key easily. If for some reason (such as allowing individuals that trust you enough with their store), you can enable the hot wallet for non-admins from Server Settings > Policies > "Allow non-admins to create hot wallets for their stores".')]),e._v(" "),t("p",[e._v("Understand that anyone with access to your recovery seed can also access and steal all your funds (current AND future funds!), since a private key is derived from a recovery seed. Securely back up your seed by writing it down and keep it in a safe place. Do not photograph it or store it in a digital format. Do not rely solely on your server for storing your recovery seed, always keep a backup copy.")]),e._v(" "),t("figure",[t("img",{attrs:{src:a(346),alt:"BTCPay Server settings",title:"BTCPay Server settings"}})]),e._v(" "),t("div",{staticClass:"custom-block warning"},[t("p",{staticClass:"custom-block-title"},[e._v("WARNING")]),e._v(" "),t("p",[e._v("When a new wallet is generated, BTCPay Server will show you a twelve word recovery seed. After the initial display, the recovery seed is wiped from the server, unless a the hot wallet option is enabled.")])]),e._v(" "),t("h4",{attrs:{id:"spending-funds-with-btcpay-hot-wallet"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#spending-funds-with-btcpay-hot-wallet"}},[e._v("#")]),e._v(" Spending funds with BTCPay Hot Wallet")]),e._v(" "),t("p",[e._v("Once you've received funds to your wallet and decide to spend them, you can automatically sign the transaction inside BTCPay Server.")]),e._v(" "),t("ol",[t("li",[e._v("In BTCPay Server, go to > Wallets > Bitcoin > Send")]),e._v(" "),t("li",[e._v("Fill in the Destination address and the Amount")]),e._v(" "),t("li",[e._v("Adjust the transaction settings, including fee rate, confirmation time preference, and if you'd like transaction fees to be subtracted from the amount you're sending")]),e._v(" "),t("li",[e._v("Sign the transaction")]),e._v(" "),t("li",[e._v("Review the transaction")]),e._v(" "),t("li",[e._v("Broadcast the transaction")])]),e._v(" "),t("p",[t("img",{attrs:{src:a(347),alt:"BTCPay Server Send page",title:"BTCPay Server Send page"}}),e._v(" "),t("img",{attrs:{src:a(292),alt:"BTCPay Server Transaction Review and Broadcast page",title:"BTCPay Server Transaction Review and Broadcast page"}})]),e._v(" "),t("h4",{attrs:{id:"security-implications"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#security-implications"}},[e._v("#")]),e._v(" Security Implications")]),e._v(" "),t("p",[e._v("Storing private keys on a public server comes with risks. This is similar to the risks of running and using the "),t("RouterLink",{attrs:{to:"/LightningNetwork/"}},[e._v("Lightning Network")]),e._v(" (except that you can recover funds with a backup).\n"),t("strong",[e._v("Please, ALWAYS be sure to back up any seed that is generated by this feature and to never leave money you cannot afford to lose spendable by those private keys")]),e._v(".")],1),e._v(" "),t("h4",{attrs:{id:"reducing-risk"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#reducing-risk"}},[e._v("#")]),e._v(" Reducing risk")]),e._v(" "),t("p",[e._v("As mentioned above, the create wallet functionality includes the risk of funds being stolen if the server or account is compromised. To mitigate this risk, we advise you to:")]),e._v(" "),t("ul",[t("li",[e._v("Enable two factor or U2F authentication")]),e._v(" "),t("li",[e._v("Occasionally move funds to your cold storage either manually or by configuring "),t("a",{attrs:{href:"https://github.com/btcpayserver/btcTransmuter/blob/master/README.md",target:"_blank",rel:"noopener noreferrer"}},[e._v("BTC Transmuter"),t("OutboundLink")],1),e._v(" with automatic payment forwarding.")])]),e._v(" "),t("div",{staticClass:"custom-block danger"},[t("p",{staticClass:"custom-block-title"},[e._v("DANGER")]),e._v(" "),t("p",[e._v("Do not give anyone else access to your server's SSH keys or server account credentials when using a hot wallet. Anyone with access to your account can spend the funds from your hot wallet. If you need to allow account access to employees, developers, etc. use an "),t("RouterLink",{attrs:{to:"/ConnectWallet/#connect-an-existing-wallet"}},[e._v("existing wallet")]),e._v(" instead.")],1)]),e._v(" "),t("h3",{attrs:{id:"watch-only-wallet"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#watch-only-wallet"}},[e._v("#")]),e._v(" Watch-only wallet")]),e._v(" "),t("p",[e._v('Like the hot wallet, the watch-only wallet can instantly get your store connected to a wallet. In contrast, this option does not store the private keys on the server. As a result, the wallet becomes "watch-only" for any received funds.')]),e._v(" "),t("p",[e._v("There are several routes you can take to spend funds with this type of wallet including importing the seed words into a hardware wallet to sign your transactions using the "),t("RouterLink",{attrs:{to:"/Vault/"}},[e._v("BTCPay Server Vault application")]),e._v(", "),t("RouterLink",{attrs:{to:"/Wallet/#psbt"}},[e._v("PSBT")]),e._v(", or the least recommended manually providing your seed words every time.")],1),e._v(" "),t("figure",[t("img",{attrs:{src:a(348),alt:"BTCPay Server Transaction Signing Options",title:"BTCPay Server Transaction Signing Options"}})]),e._v(" "),t("p",[e._v("Alternatively, you can spend funds in another external wallet where you have imported your BTCPay Server-produced seed words. If you import your seed words into an external wallet, you can also use a PSBT to spend the funds, assuming the wallet supports it. This option will be available on the wallet's send page. Be sure to consider the "),t("RouterLink",{attrs:{to:"/FAQ/Wallet/#missing-payments-in-my-software-or-hardware-wallet"}},[e._v("gap limit issue")]),e._v(" if you're using an external wallet with your watch-only wallet.")],1)])}),[],!1,null,null,null);t.default=n.exports}}]); \ No newline at end of file diff --git a/assets/js/31.4c31c3e6.js b/assets/js/31.2e4f291f.js similarity index 94% rename from assets/js/31.4c31c3e6.js rename to assets/js/31.2e4f291f.js index 23989a42a9..06d621a5cd 100644 --- a/assets/js/31.4c31c3e6.js +++ b/assets/js/31.2e4f291f.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[31],{643:function(t,e,a){t.exports=a.p+"assets/img/WalletTransactions.c905309a.jpg"},644:function(t,e,a){t.exports=a.p+"assets/img/WalletSend.f65f1a74.jpg"},645:function(t,e,a){t.exports=a.p+"assets/img/WalletRBF.2dea1e29.jpg"},646:function(t,e,a){t.exports=a.p+"assets/img/CoinSelection.9d40e6ee.jpg"},647:function(t,e,a){t.exports=a.p+"assets/img/ScanWallet.61243593.jpg"},648:function(t,e,a){t.exports=a.p+"assets/img/WalletReceive.cb4b9f39.jpg"},649:function(t,e,a){t.exports=a.p+"assets/img/WalletRescan.1d081027.jpg"},650:function(t,e,a){t.exports=a.p+"assets/img/WalletRescanProgress.05a8b0f7.jpg"},651:function(t,e,a){t.exports=a.p+"assets/img/btcpayserverwalletsettings1.97911174.jpg"},830:function(t,e,a){"use strict";a.r(e);var n=a(10),s=Object(n.a)({},(function(){var t=this,e=t._self._c;return e("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[e("h1",{attrs:{id:"btcpay-server-wallet"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#btcpay-server-wallet"}},[t._v("#")]),t._v(" BTCPay Server Wallet")]),t._v(" "),e("p",[t._v("BTCPay Server has a built in, "),e("strong",[t._v("full-node reliant wallet")]),t._v(" that allows for easy funds management.")]),t._v(" "),e("p",[t._v("Each "),e("RouterLink",{attrs:{to:"/CreateStore/"}},[t._v("store")]),t._v("'s configured cryptocurrency has a separate wallet displayed under Wallets in the menu bar.")],1),t._v(" "),e("h2",{attrs:{id:"wallet-features"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#wallet-features"}},[t._v("#")]),t._v(" Wallet features")]),t._v(" "),e("p",[t._v("The wallet contains the following features:")]),t._v(" "),e("ol",[e("li",[t._v("Transactions")]),t._v(" "),e("li",[t._v("Send")]),t._v(" "),e("li",[t._v("Receive")]),t._v(" "),e("li",[t._v("Rescan")]),t._v(" "),e("li",[t._v("Pull payments")]),t._v(" "),e("li",[t._v("Payouts")]),t._v(" "),e("li",[t._v("PSBT")]),t._v(" "),e("li",[t._v("Settings")])]),t._v(" "),e("h3",{attrs:{id:"transactions"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#transactions"}},[t._v("#")]),t._v(" Transactions")]),t._v(" "),e("p",[t._v("An overview of the incoming (green), outgoing (red) and unconfirmed (grayed out) "),e("strong",[t._v("transactions")]),t._v(" displayed together with timestamps and balances, sorted by date. You can click on the transaction ID to view the transaction details on the block explorer.")]),t._v(" "),e("figure",[e("img",{attrs:{src:a(643),alt:"Individual Wallet",title:"Individual Wallet"}})]),t._v(" "),e("h4",{attrs:{id:"transaction-labels"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#transaction-labels"}},[t._v("#")]),t._v(" Transaction Labels")]),t._v(" "),e("p",[t._v("The table below lists the various "),e("strong",[t._v("transaction labels used by BTCPay")]),t._v(".")]),t._v(" "),e("table",[e("thead",[e("tr",[e("th",[t._v("Transaction Type")]),t._v(" "),e("th",[t._v("Description")])])]),t._v(" "),e("tbody",[e("tr",[e("td",[t._v("app")]),t._v(" "),e("td",[t._v("Payment was received through an app created invoice")])]),t._v(" "),e("tr",[e("td",[t._v("invoice")]),t._v(" "),e("td",[t._v("Payment was received through an invoice")])]),t._v(" "),e("tr",[e("td",[t._v("payjoin")]),t._v(" "),e("td",[t._v("Not paid, invoice timer still has not expired")])]),t._v(" "),e("tr",[e("td",[t._v("payjoin-exposed")]),t._v(" "),e("td",[t._v("UTXO was exposed through an invoice payjoin proposal")])]),t._v(" "),e("tr",[e("td",[t._v("payment-request")]),t._v(" "),e("td",[t._v("Payment was received through a payment request")])]),t._v(" "),e("tr",[e("td",[t._v("payout")]),t._v(" "),e("td",[t._v("Payment was sent through a payout or refund")])])])]),t._v(" "),e("p",[t._v("You can also create your own "),e("RouterLink",{attrs:{to:"/FAQ/Wallet/#how-to-add-custom-labels-and-comments-to-transactions"}},[t._v("custom transaction labels and comments")]),t._v(".")],1),t._v(" "),e("h3",{attrs:{id:"send"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#send"}},[t._v("#")]),t._v(" Send")]),t._v(" "),e("p",[t._v("The Send function allows "),e("strong",[t._v("spending of the funds from the BTCPay wallet")]),t._v(".")]),t._v(" "),e("figure",[e("img",{attrs:{src:a(644),alt:"Send from the Wallet",title:"Send from the Wallet"}})]),t._v(" "),e("h4",{attrs:{id:"signing-a-transaction-spending"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#signing-a-transaction-spending"}},[t._v("#")]),t._v(" Signing a transaction (spending)")]),t._v(" "),e("p",[t._v("To spend the funds, you are required to "),e("strong",[t._v("sign")]),t._v(" the transaction. Transactions can be signed with:")]),t._v(" "),e("ul",[e("li",[t._v("Hardware Wallet")]),t._v(" "),e("li",[t._v("Wallet supporting PSBT")]),t._v(" "),e("li",[t._v("HD private key or recovery seed")]),t._v(" "),e("li",[t._v("Hot Wallet")])]),t._v(" "),e("h5",{attrs:{id:"signing-with-hd-private-key-or-mnemonic-seed"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#signing-with-hd-private-key-or-mnemonic-seed"}},[t._v("#")]),t._v(" Signing with HD Private Key or mnemonic seed")]),t._v(" "),e("p",[t._v("If you set up an "),e("RouterLink",{attrs:{to:"/WalletSetup/#use-an-existing-wallet"}},[t._v("existing wallet with your BTCPay Server")]),t._v(", you can spend the funds by inputting your private key into an appropriate field. Make sure to set a proper "),e("code",[t._v("AccountKeyPath")]),t._v(" in Wallet > Settings otherwise you won't be able to spend.")],1),t._v(" "),e("h5",{attrs:{id:"signing-with-a-wallet-supporting-psbt"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#signing-with-a-wallet-supporting-psbt"}},[t._v("#")]),t._v(" Signing with a wallet supporting PSBT")]),t._v(" "),e("p",[t._v("PSBT ("),e("strong",[t._v("Partially Signed Bitcoin Transactions")]),t._v(") is an interchange format for Bitcoin transactions that are not fully signed yet.\nPSBT is supported in BTCPay Server and can be signed with compatible hardware and software wallets.")]),t._v(" "),e("p",[t._v("The construction of a fully signed Bitcoin transaction goes through the following steps:")]),t._v(" "),e("ul",[e("li",[t._v("A PSBT gets constructed with certain inputs and outputs, but no signatures")]),t._v(" "),e("li",[t._v("The exported PSBT can be imported by a wallet that supports this format")]),t._v(" "),e("li",[t._v("The transaction data can be inspected and signed using the wallet")]),t._v(" "),e("li",[t._v("The signed PSBT file gets exported from the wallet and imported with BTCPay Server")]),t._v(" "),e("li",[t._v("BTCPay Server produces the final Bitcoin transaction")]),t._v(" "),e("li",[t._v("You verify the result and broadcast it to the network")])]),t._v(" "),e("p",[t._v("Tutorials:")]),t._v(" "),e("ul",[e("li",[e("RouterLink",{attrs:{to:"/ColdCardWallet/#spending-from-btcpay-server-wallet-with-coldcard-psbt"}},[t._v("Sign a PSBT transaction with ColdCard Hardware Wallet")]),t._v(" (completely offline/air-gapped)")],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/Sign-PSBT-with-sparrow-wallet/"}},[t._v("Create and sign a PSBT transaction with Sparrow wallet")])],1)]),t._v(" "),e("h5",{attrs:{id:"signing-with-a-hardware-wallet"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#signing-with-a-hardware-wallet"}},[t._v("#")]),t._v(" Signing with a hardware wallet")]),t._v(" "),e("p",[t._v("BTCPay Server has built-in hardware wallet support allowing you to "),e("strong",[t._v("use your hardware wallet with BTCPay")]),t._v(", without leaking information to third-party apps or servers.")]),t._v(" "),e("p",[e("RouterLink",{attrs:{to:"/HardwareWalletIntegration/"}},[t._v("Check instructions")]),t._v(" on how to set up and sign with a "),e("a",{attrs:{href:"https://github.com/bitcoin-core/HWI#device-support",target:"_blank",rel:"noopener noreferrer"}},[t._v("compatible hardware wallet"),e("OutboundLink")],1),t._v(".")],1),t._v(" "),e("h5",{attrs:{id:"signing-with-a-hot-wallet"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#signing-with-a-hot-wallet"}},[t._v("#")]),t._v(" Signing with a hot wallet")]),t._v(" "),e("p",[t._v("If you "),e("RouterLink",{attrs:{to:"/CreateWallet/"}},[t._v("created a new wallet")]),t._v(" when setting up your store and enabled it as a "),e("RouterLink",{attrs:{to:"/CreateWallet/#hot-wallet"}},[t._v("hot wallet")]),t._v(", since version 1.2.0, we've added an option that when a "),e("RouterLink",{attrs:{to:"/CreateWallet/#hot-wallet"}},[t._v("hot wallet")]),t._v(" is created, it'll automatically use the seed stored on a server to sign.")],1),t._v(" "),e("div",{staticClass:"custom-block danger"},[e("p",{staticClass:"custom-block-title"},[t._v("DANGER")]),t._v(" "),e("p",[t._v("Using the hot wallet feature comes with security implications; please be sure to read and understand them over at the "),e("RouterLink",{attrs:{to:"/CreateWallet/#security-implications"}},[t._v("Hot Wallet documentation")])],1)]),t._v(" "),e("h4",{attrs:{id:"advanced-settings"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#advanced-settings"}},[t._v("#")]),t._v(" Advanced Settings")]),t._v(" "),e("p",[t._v("Certain wallet features are available for advanced users. Toggle the "),e("code",[t._v("Advanced Settings")]),t._v(" within the "),e("code",[t._v("Send")]),t._v(" tab to preview them.")]),t._v(" "),e("h5",{attrs:{id:"dont-create-utxo-change"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#dont-create-utxo-change"}},[t._v("#")]),t._v(" Don't create UTXO change")]),t._v(" "),e("p",[t._v("This option is available in the "),e("code",[t._v("Advanced mode")]),t._v(" of the "),e("code",[t._v("Send")]),t._v(" page.")]),t._v(" "),e("p",[t._v("It is a privacy enhancing feature which is useful when you're sending funds to another wallet of yours or to an exchange. It makes sure that no change UTXO is created by "),e("strong",[t._v("rounding up")]),t._v(" the amount sent.")]),t._v(" "),e("p",[t._v("By default this feature is disabled, so if your wallet has a UTXO of "),e("code",[t._v("1.1 BTC")]),t._v(" and you input an amount equal to "),e("code",[t._v("1.0 BTC")]),t._v(", the resulting transaction will have two outputs "),e("code",[t._v("0.1 BTC")]),t._v(" of change, and "),e("code",[t._v("1.0 BTC")]),t._v(" to your destination.")]),t._v(" "),e("p",[t._v("Blockchain analysis will understand that those "),e("code",[t._v("0.1 BTC")]),t._v(" of change belong to the same entity which controlled "),e("code",[t._v("1.1 BTC")]),t._v(" before, and can track the future purchase you make under the same pattern.")]),t._v(" "),e("p",[t._v("By enabling this feature, BTCPay Server wallet will round up the amount sent to "),e("code",[t._v("1.1 BTC")]),t._v(" such that no change output is sent back to you.")]),t._v(" "),e("p",[t._v("Warning: Despite the fact, in this example, that you entered "),e("code",[t._v("1.0")]),t._v(" in the amount field, the amount that will really be sent to your destination will be "),e("code",[t._v("1.1 BTC")]),t._v(".")]),t._v(" "),e("h5",{attrs:{id:"rbf-replace-by-fee"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#rbf-replace-by-fee"}},[t._v("#")]),t._v(" RBF (Replace-By-Fee)")]),t._v(" "),e("p",[t._v("Replace-By-Fee (RBF) is a Bitcoin protocol feature that allows you to replace a previously broadcast transaction (while unconfirmed). This allows randomizing your wallet's transaction fingerprint, or simply for replacing it with a higher fee rate to move the transaction higher in the queue of confirmation (mining) priority. This will effectively replace the original transaction as the higher fee rate will be prioritized and once confirmed, invalidating the original one (double spend).")]),t._v(" "),e("p",[t._v("Press the "),e("code",[t._v("Advanced Settings")]),t._v(" button to view the RBF options:")]),t._v(" "),e("figure",[e("img",{attrs:{src:a(645),alt:"RBF Options",title:"RBF Options"}})]),t._v(" "),e("ul",[e("li",[t._v("Option 1 (Enabled by Default): Allow the transaction to be replaced automatically for randomization of transaction fingerprint (increased privacy)")]),t._v(" "),e("li",[t._v("Option 2: Yes, Allow the transaction to be replaced explicitly (not replaced by default)")]),t._v(" "),e("li",[t._v("Option 3: No, Do not allow the transaction to be replaced (ignore replacement)")])]),t._v(" "),e("h5",{attrs:{id:"coin-selection"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#coin-selection"}},[t._v("#")]),t._v(" Coin Selection")]),t._v(" "),e("p",[t._v("Coin selection is an advanced "),e("strong",[t._v("privacy-enhancing feature")]),t._v(" that allows you to "),e("strong",[t._v("specifically select coins")]),t._v(" that you would like to spend when crafting a transaction. For example, paying with coins that are fresh from a coinjoin mix.")]),t._v(" "),e("p",[t._v("To make the selection easier, coin-selection works natively with the wallet labels feature. This allows you to label any incoming funds for smoother UTXO management and spending.")]),t._v(" "),e("figure",[e("img",{attrs:{src:a(646),alt:"Coin Selection",title:"Coin Selection"}})]),t._v(" "),e("h5",{attrs:{id:"other-features"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#other-features"}},[t._v("#")]),t._v(" Other features")]),t._v(" "),e("h6",{attrs:{id:"camera-qr-scan"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#camera-qr-scan"}},[t._v("#")]),t._v(" Camera QR scan")]),t._v(" "),e("p",[t._v("Scan option in wallet (camera icon in send screen) lets you "),e("strong",[t._v("use your device’s camera to scan a QR code containing an address or BIP21 payment link")]),t._v(". It auto-populates the sending information so that you don’t have to manually copy-paste an address and amount.")]),t._v(" "),e("figure",[e("img",{attrs:{src:a(647),alt:"QR Scan",title:"QR Scan"}})]),t._v(" "),e("h6",{attrs:{id:"paste-bip21-address"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#paste-bip21-address"}},[t._v("#")]),t._v(" Paste BIP21 address")]),t._v(" "),e("p",[t._v("This option "),e("strong",[t._v("decodes a BIP21 payment link")]),t._v(". It's useful when you're trying to pay a "),e("RouterLink",{attrs:{to:"/Payjoin/"}},[t._v("Payjoin")]),t._v(" invoice.")],1),t._v(" "),e("h3",{attrs:{id:"receive"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#receive"}},[t._v("#")]),t._v(" Receive")]),t._v(" "),e("p",[t._v("The Receive tab "),e("strong",[t._v("generates an unused address which can be used to receive payments")]),t._v(". The same can be achieved by generating an invoice (Invoices > Create new invoice).")]),t._v(" "),e("figure",[e("img",{attrs:{src:a(648),alt:"Wallet Receive",title:"Wallet Receive"}})]),t._v(" "),e("h3",{attrs:{id:"pull-payments"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#pull-payments"}},[t._v("#")]),t._v(" Pull Payments")]),t._v(" "),e("p",[t._v("This feature gives you the ability to "),e("strong",[t._v("create a Pull Payment")]),t._v(", so that an outside individual may request to "),e("code",[t._v("pull")]),t._v(" funds from your wallet.")]),t._v(" "),e("p",[t._v("For more information, see "),e("RouterLink",{attrs:{to:"/PullPayments/"}},[t._v("Pull Payments")]),t._v(".")],1),t._v(" "),e("h3",{attrs:{id:"payouts"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#payouts"}},[t._v("#")]),t._v(" Payouts")]),t._v(" "),e("p",[t._v("This section lets you manage Pull Payments and gives you the ability to "),e("strong",[t._v("accept or decline payouts requested by outside individuals")]),t._v(".")]),t._v(" "),e("p",[t._v("For more information, see "),e("RouterLink",{attrs:{to:"/PullPayments/#approve-and-pay-a-payout"}},[t._v("Payouts")]),t._v(".")],1),t._v(" "),e("h3",{attrs:{id:"re-scan"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#re-scan"}},[t._v("#")]),t._v(" Re-scan")]),t._v(" "),e("p",[t._v("The Rescan relies on Bitcoin Core 0.17.0's "),e("code",[t._v("scantxoutset")]),t._v(" to "),e("strong",[t._v("scan the current state of the blockchain")]),t._v(" (called UTXO Set) for coins belonging to the configured derivation scheme.")]),t._v(" "),e("figure",[e("img",{attrs:{src:a(649),alt:"Wallet Rescan",title:"Wallet Rescan"}})]),t._v(" "),e("p",[t._v("Wallet re-scan solves two critical problems for BTCPay users:")]),t._v(" "),e("ol",[e("li",[e("RouterLink",{attrs:{to:"/FAQ/Wallet/#missing-payments-in-my-software-or-hardware-wallet"}},[t._v("Gap limit")])],1),t._v(" "),e("li",[t._v("Importing a previously used wallet")])]),t._v(" "),e("p",[e("strong",[t._v("Gap limit")]),t._v(": Most wallets typically have the address gap limit set to 20. This means that if a merchant receives 21 or more consecutive unpaid invoices, those wallets show the incorrect balance and some transactions may not be visible.")]),t._v(" "),e("p",[e("strong",[t._v("Wallet import")]),t._v(": When users add a derivation scheme of a wallet that had transactions in the past (previously used wallet), BTCPay won't be able to show the balance and transactions from the past.")]),t._v(" "),e("figure",[e("img",{attrs:{src:a(650),alt:"Wallet rescan progress",title:"Wallet rescan progress"}})]),t._v(" "),e("p",[t._v("Re-scan is a feature that solves both of these problems. Once the scan is complete, BTCPay Server will show the correct balance, along with the past transactions of the wallet.")]),t._v(" "),e("p",[t._v("Wallet re-scan requires access to the full node which means that this function is only available for server owners.")]),t._v(" "),e("p",[t._v("Users who use a third-party host should use a newly generated xpub key and also use an external wallet like Electrum which allows them to increase the gap limit.")]),t._v(" "),e("h3",{attrs:{id:"settings"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#settings"}},[t._v("#")]),t._v(" Settings")]),t._v(" "),e("p",[t._v("In the top right corner of your "),e("code",[t._v("wallet")]),t._v(" you will find the "),e("code",[t._v("wallet settings")]),t._v(".\nIn the wallet settings tab you can adjust certain settings. If you've configured your wallet by "),e("RouterLink",{attrs:{to:"/CreateWallet/"}},[t._v("creating a new wallet")]),t._v(" or using an existing wallet via the "),e("RouterLink",{attrs:{to:"/HardwareWalletIntegration/"}},[t._v("hardware wallet integration")]),t._v(" these settings will be pre-configured.")],1),t._v(" "),e("p",[t._v("If you manually added the extended public key from an external wallet, you'd need to adjust "),e("code",[t._v("AccountKeyPath")]),t._v(" that you can find in your external wallet, for example "),e("code",[t._v("m/84'/0'/0'")]),t._v(" to be able to spend from the BTCPay Wallet.")]),t._v(" "),e("p",[t._v("In "),e("code",[t._v("wallet settings")]),t._v(" you will also find the "),e("code",[t._v("speed policy")]),t._v(" for the specific store.\nThere are 2 main settings under "),e("code",[t._v("Payment")]),t._v(", "),e("RouterLink",{attrs:{to:"/FAQ/Stores/#payment-invalid-if-transactions-fails-to-confirm--minutes-after-invoice-expiration"}},[t._v("Payment invalid if transaction fails to confirm in ... after invoice creation")]),t._v(" and "),e("RouterLink",{attrs:{to:"/FAQ/Stores/#consider-the-invoice-confirmed-when-the-payment-transaction"}},[t._v("Consider the invoice confirmed when the payment transaction...")]),t._v(". The latter lets you set the number of confirmations required to be recognized as settled.")],1),t._v(" "),e("figure",[e("img",{attrs:{src:a(651),alt:"Wallet settings",title:"Wallet settings"}})])])}),[],!1,null,null,null);e.default=s.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[31],{638:function(t,e,a){t.exports=a.p+"assets/img/WalletTransactions.c905309a.jpg"},639:function(t,e,a){t.exports=a.p+"assets/img/WalletSend.f65f1a74.jpg"},640:function(t,e,a){t.exports=a.p+"assets/img/WalletRBF.2dea1e29.jpg"},641:function(t,e,a){t.exports=a.p+"assets/img/CoinSelection.9d40e6ee.jpg"},642:function(t,e,a){t.exports=a.p+"assets/img/ScanWallet.61243593.jpg"},643:function(t,e,a){t.exports=a.p+"assets/img/WalletReceive.cb4b9f39.jpg"},644:function(t,e,a){t.exports=a.p+"assets/img/WalletRescan.1d081027.jpg"},645:function(t,e,a){t.exports=a.p+"assets/img/WalletRescanProgress.05a8b0f7.jpg"},646:function(t,e,a){t.exports=a.p+"assets/img/btcpayserverwalletsettings1.97911174.jpg"},830:function(t,e,a){"use strict";a.r(e);var n=a(10),s=Object(n.a)({},(function(){var t=this,e=t._self._c;return e("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[e("h1",{attrs:{id:"btcpay-server-wallet"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#btcpay-server-wallet"}},[t._v("#")]),t._v(" BTCPay Server Wallet")]),t._v(" "),e("p",[t._v("BTCPay Server has a built in, "),e("strong",[t._v("full-node reliant wallet")]),t._v(" that allows for easy funds management.")]),t._v(" "),e("p",[t._v("Each "),e("RouterLink",{attrs:{to:"/CreateStore/"}},[t._v("store")]),t._v("'s configured cryptocurrency has a separate wallet displayed under Wallets in the menu bar.")],1),t._v(" "),e("h2",{attrs:{id:"wallet-features"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#wallet-features"}},[t._v("#")]),t._v(" Wallet features")]),t._v(" "),e("p",[t._v("The wallet contains the following features:")]),t._v(" "),e("ol",[e("li",[t._v("Transactions")]),t._v(" "),e("li",[t._v("Send")]),t._v(" "),e("li",[t._v("Receive")]),t._v(" "),e("li",[t._v("Rescan")]),t._v(" "),e("li",[t._v("Pull payments")]),t._v(" "),e("li",[t._v("Payouts")]),t._v(" "),e("li",[t._v("PSBT")]),t._v(" "),e("li",[t._v("Settings")])]),t._v(" "),e("h3",{attrs:{id:"transactions"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#transactions"}},[t._v("#")]),t._v(" Transactions")]),t._v(" "),e("p",[t._v("An overview of the incoming (green), outgoing (red) and unconfirmed (grayed out) "),e("strong",[t._v("transactions")]),t._v(" displayed together with timestamps and balances, sorted by date. You can click on the transaction ID to view the transaction details on the block explorer.")]),t._v(" "),e("figure",[e("img",{attrs:{src:a(638),alt:"Individual Wallet",title:"Individual Wallet"}})]),t._v(" "),e("h4",{attrs:{id:"transaction-labels"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#transaction-labels"}},[t._v("#")]),t._v(" Transaction Labels")]),t._v(" "),e("p",[t._v("The table below lists the various "),e("strong",[t._v("transaction labels used by BTCPay")]),t._v(".")]),t._v(" "),e("table",[e("thead",[e("tr",[e("th",[t._v("Transaction Type")]),t._v(" "),e("th",[t._v("Description")])])]),t._v(" "),e("tbody",[e("tr",[e("td",[t._v("app")]),t._v(" "),e("td",[t._v("Payment was received through an app created invoice")])]),t._v(" "),e("tr",[e("td",[t._v("invoice")]),t._v(" "),e("td",[t._v("Payment was received through an invoice")])]),t._v(" "),e("tr",[e("td",[t._v("payjoin")]),t._v(" "),e("td",[t._v("Not paid, invoice timer still has not expired")])]),t._v(" "),e("tr",[e("td",[t._v("payjoin-exposed")]),t._v(" "),e("td",[t._v("UTXO was exposed through an invoice payjoin proposal")])]),t._v(" "),e("tr",[e("td",[t._v("payment-request")]),t._v(" "),e("td",[t._v("Payment was received through a payment request")])]),t._v(" "),e("tr",[e("td",[t._v("payout")]),t._v(" "),e("td",[t._v("Payment was sent through a payout or refund")])])])]),t._v(" "),e("p",[t._v("You can also create your own "),e("RouterLink",{attrs:{to:"/FAQ/Wallet/#how-to-add-custom-labels-and-comments-to-transactions"}},[t._v("custom transaction labels and comments")]),t._v(".")],1),t._v(" "),e("h3",{attrs:{id:"send"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#send"}},[t._v("#")]),t._v(" Send")]),t._v(" "),e("p",[t._v("The Send function allows "),e("strong",[t._v("spending of the funds from the BTCPay wallet")]),t._v(".")]),t._v(" "),e("figure",[e("img",{attrs:{src:a(639),alt:"Send from the Wallet",title:"Send from the Wallet"}})]),t._v(" "),e("h4",{attrs:{id:"signing-a-transaction-spending"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#signing-a-transaction-spending"}},[t._v("#")]),t._v(" Signing a transaction (spending)")]),t._v(" "),e("p",[t._v("To spend the funds, you are required to "),e("strong",[t._v("sign")]),t._v(" the transaction. Transactions can be signed with:")]),t._v(" "),e("ul",[e("li",[t._v("Hardware Wallet")]),t._v(" "),e("li",[t._v("Wallet supporting PSBT")]),t._v(" "),e("li",[t._v("HD private key or recovery seed")]),t._v(" "),e("li",[t._v("Hot Wallet")])]),t._v(" "),e("h5",{attrs:{id:"signing-with-hd-private-key-or-mnemonic-seed"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#signing-with-hd-private-key-or-mnemonic-seed"}},[t._v("#")]),t._v(" Signing with HD Private Key or mnemonic seed")]),t._v(" "),e("p",[t._v("If you set up an "),e("RouterLink",{attrs:{to:"/WalletSetup/#use-an-existing-wallet"}},[t._v("existing wallet with your BTCPay Server")]),t._v(", you can spend the funds by inputting your private key into an appropriate field. Make sure to set a proper "),e("code",[t._v("AccountKeyPath")]),t._v(" in Wallet > Settings otherwise you won't be able to spend.")],1),t._v(" "),e("h5",{attrs:{id:"signing-with-a-wallet-supporting-psbt"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#signing-with-a-wallet-supporting-psbt"}},[t._v("#")]),t._v(" Signing with a wallet supporting PSBT")]),t._v(" "),e("p",[t._v("PSBT ("),e("strong",[t._v("Partially Signed Bitcoin Transactions")]),t._v(") is an interchange format for Bitcoin transactions that are not fully signed yet.\nPSBT is supported in BTCPay Server and can be signed with compatible hardware and software wallets.")]),t._v(" "),e("p",[t._v("The construction of a fully signed Bitcoin transaction goes through the following steps:")]),t._v(" "),e("ul",[e("li",[t._v("A PSBT gets constructed with certain inputs and outputs, but no signatures")]),t._v(" "),e("li",[t._v("The exported PSBT can be imported by a wallet that supports this format")]),t._v(" "),e("li",[t._v("The transaction data can be inspected and signed using the wallet")]),t._v(" "),e("li",[t._v("The signed PSBT file gets exported from the wallet and imported with BTCPay Server")]),t._v(" "),e("li",[t._v("BTCPay Server produces the final Bitcoin transaction")]),t._v(" "),e("li",[t._v("You verify the result and broadcast it to the network")])]),t._v(" "),e("p",[t._v("Tutorials:")]),t._v(" "),e("ul",[e("li",[e("RouterLink",{attrs:{to:"/ColdCardWallet/#spending-from-btcpay-server-wallet-with-coldcard-psbt"}},[t._v("Sign a PSBT transaction with ColdCard Hardware Wallet")]),t._v(" (completely offline/air-gapped)")],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/Sign-PSBT-with-sparrow-wallet/"}},[t._v("Create and sign a PSBT transaction with Sparrow wallet")])],1)]),t._v(" "),e("h5",{attrs:{id:"signing-with-a-hardware-wallet"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#signing-with-a-hardware-wallet"}},[t._v("#")]),t._v(" Signing with a hardware wallet")]),t._v(" "),e("p",[t._v("BTCPay Server has built-in hardware wallet support allowing you to "),e("strong",[t._v("use your hardware wallet with BTCPay")]),t._v(", without leaking information to third-party apps or servers.")]),t._v(" "),e("p",[e("RouterLink",{attrs:{to:"/HardwareWalletIntegration/"}},[t._v("Check instructions")]),t._v(" on how to set up and sign with a "),e("a",{attrs:{href:"https://github.com/bitcoin-core/HWI#device-support",target:"_blank",rel:"noopener noreferrer"}},[t._v("compatible hardware wallet"),e("OutboundLink")],1),t._v(".")],1),t._v(" "),e("h5",{attrs:{id:"signing-with-a-hot-wallet"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#signing-with-a-hot-wallet"}},[t._v("#")]),t._v(" Signing with a hot wallet")]),t._v(" "),e("p",[t._v("If you "),e("RouterLink",{attrs:{to:"/CreateWallet/"}},[t._v("created a new wallet")]),t._v(" when setting up your store and enabled it as a "),e("RouterLink",{attrs:{to:"/CreateWallet/#hot-wallet"}},[t._v("hot wallet")]),t._v(", since version 1.2.0, we've added an option that when a "),e("RouterLink",{attrs:{to:"/CreateWallet/#hot-wallet"}},[t._v("hot wallet")]),t._v(" is created, it'll automatically use the seed stored on a server to sign.")],1),t._v(" "),e("div",{staticClass:"custom-block danger"},[e("p",{staticClass:"custom-block-title"},[t._v("DANGER")]),t._v(" "),e("p",[t._v("Using the hot wallet feature comes with security implications; please be sure to read and understand them over at the "),e("RouterLink",{attrs:{to:"/CreateWallet/#security-implications"}},[t._v("Hot Wallet documentation")])],1)]),t._v(" "),e("h4",{attrs:{id:"advanced-settings"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#advanced-settings"}},[t._v("#")]),t._v(" Advanced Settings")]),t._v(" "),e("p",[t._v("Certain wallet features are available for advanced users. Toggle the "),e("code",[t._v("Advanced Settings")]),t._v(" within the "),e("code",[t._v("Send")]),t._v(" tab to preview them.")]),t._v(" "),e("h5",{attrs:{id:"dont-create-utxo-change"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#dont-create-utxo-change"}},[t._v("#")]),t._v(" Don't create UTXO change")]),t._v(" "),e("p",[t._v("This option is available in the "),e("code",[t._v("Advanced mode")]),t._v(" of the "),e("code",[t._v("Send")]),t._v(" page.")]),t._v(" "),e("p",[t._v("It is a privacy enhancing feature which is useful when you're sending funds to another wallet of yours or to an exchange. It makes sure that no change UTXO is created by "),e("strong",[t._v("rounding up")]),t._v(" the amount sent.")]),t._v(" "),e("p",[t._v("By default this feature is disabled, so if your wallet has a UTXO of "),e("code",[t._v("1.1 BTC")]),t._v(" and you input an amount equal to "),e("code",[t._v("1.0 BTC")]),t._v(", the resulting transaction will have two outputs "),e("code",[t._v("0.1 BTC")]),t._v(" of change, and "),e("code",[t._v("1.0 BTC")]),t._v(" to your destination.")]),t._v(" "),e("p",[t._v("Blockchain analysis will understand that those "),e("code",[t._v("0.1 BTC")]),t._v(" of change belong to the same entity which controlled "),e("code",[t._v("1.1 BTC")]),t._v(" before, and can track the future purchase you make under the same pattern.")]),t._v(" "),e("p",[t._v("By enabling this feature, BTCPay Server wallet will round up the amount sent to "),e("code",[t._v("1.1 BTC")]),t._v(" such that no change output is sent back to you.")]),t._v(" "),e("p",[t._v("Warning: Despite the fact, in this example, that you entered "),e("code",[t._v("1.0")]),t._v(" in the amount field, the amount that will really be sent to your destination will be "),e("code",[t._v("1.1 BTC")]),t._v(".")]),t._v(" "),e("h5",{attrs:{id:"rbf-replace-by-fee"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#rbf-replace-by-fee"}},[t._v("#")]),t._v(" RBF (Replace-By-Fee)")]),t._v(" "),e("p",[t._v("Replace-By-Fee (RBF) is a Bitcoin protocol feature that allows you to replace a previously broadcast transaction (while unconfirmed). This allows randomizing your wallet's transaction fingerprint, or simply for replacing it with a higher fee rate to move the transaction higher in the queue of confirmation (mining) priority. This will effectively replace the original transaction as the higher fee rate will be prioritized and once confirmed, invalidating the original one (double spend).")]),t._v(" "),e("p",[t._v("Press the "),e("code",[t._v("Advanced Settings")]),t._v(" button to view the RBF options:")]),t._v(" "),e("figure",[e("img",{attrs:{src:a(640),alt:"RBF Options",title:"RBF Options"}})]),t._v(" "),e("ul",[e("li",[t._v("Option 1 (Enabled by Default): Allow the transaction to be replaced automatically for randomization of transaction fingerprint (increased privacy)")]),t._v(" "),e("li",[t._v("Option 2: Yes, Allow the transaction to be replaced explicitly (not replaced by default)")]),t._v(" "),e("li",[t._v("Option 3: No, Do not allow the transaction to be replaced (ignore replacement)")])]),t._v(" "),e("h5",{attrs:{id:"coin-selection"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#coin-selection"}},[t._v("#")]),t._v(" Coin Selection")]),t._v(" "),e("p",[t._v("Coin selection is an advanced "),e("strong",[t._v("privacy-enhancing feature")]),t._v(" that allows you to "),e("strong",[t._v("specifically select coins")]),t._v(" that you would like to spend when crafting a transaction. For example, paying with coins that are fresh from a coinjoin mix.")]),t._v(" "),e("p",[t._v("To make the selection easier, coin-selection works natively with the wallet labels feature. This allows you to label any incoming funds for smoother UTXO management and spending.")]),t._v(" "),e("figure",[e("img",{attrs:{src:a(641),alt:"Coin Selection",title:"Coin Selection"}})]),t._v(" "),e("h5",{attrs:{id:"other-features"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#other-features"}},[t._v("#")]),t._v(" Other features")]),t._v(" "),e("h6",{attrs:{id:"camera-qr-scan"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#camera-qr-scan"}},[t._v("#")]),t._v(" Camera QR scan")]),t._v(" "),e("p",[t._v("Scan option in wallet (camera icon in send screen) lets you "),e("strong",[t._v("use your device’s camera to scan a QR code containing an address or BIP21 payment link")]),t._v(". It auto-populates the sending information so that you don’t have to manually copy-paste an address and amount.")]),t._v(" "),e("figure",[e("img",{attrs:{src:a(642),alt:"QR Scan",title:"QR Scan"}})]),t._v(" "),e("h6",{attrs:{id:"paste-bip21-address"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#paste-bip21-address"}},[t._v("#")]),t._v(" Paste BIP21 address")]),t._v(" "),e("p",[t._v("This option "),e("strong",[t._v("decodes a BIP21 payment link")]),t._v(". It's useful when you're trying to pay a "),e("RouterLink",{attrs:{to:"/Payjoin/"}},[t._v("Payjoin")]),t._v(" invoice.")],1),t._v(" "),e("h3",{attrs:{id:"receive"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#receive"}},[t._v("#")]),t._v(" Receive")]),t._v(" "),e("p",[t._v("The Receive tab "),e("strong",[t._v("generates an unused address which can be used to receive payments")]),t._v(". The same can be achieved by generating an invoice (Invoices > Create new invoice).")]),t._v(" "),e("figure",[e("img",{attrs:{src:a(643),alt:"Wallet Receive",title:"Wallet Receive"}})]),t._v(" "),e("h3",{attrs:{id:"pull-payments"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#pull-payments"}},[t._v("#")]),t._v(" Pull Payments")]),t._v(" "),e("p",[t._v("This feature gives you the ability to "),e("strong",[t._v("create a Pull Payment")]),t._v(", so that an outside individual may request to "),e("code",[t._v("pull")]),t._v(" funds from your wallet.")]),t._v(" "),e("p",[t._v("For more information, see "),e("RouterLink",{attrs:{to:"/PullPayments/"}},[t._v("Pull Payments")]),t._v(".")],1),t._v(" "),e("h3",{attrs:{id:"payouts"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#payouts"}},[t._v("#")]),t._v(" Payouts")]),t._v(" "),e("p",[t._v("This section lets you manage Pull Payments and gives you the ability to "),e("strong",[t._v("accept or decline payouts requested by outside individuals")]),t._v(".")]),t._v(" "),e("p",[t._v("For more information, see "),e("RouterLink",{attrs:{to:"/PullPayments/#approve-and-pay-a-payout"}},[t._v("Payouts")]),t._v(".")],1),t._v(" "),e("h3",{attrs:{id:"re-scan"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#re-scan"}},[t._v("#")]),t._v(" Re-scan")]),t._v(" "),e("p",[t._v("The Rescan relies on Bitcoin Core 0.17.0's "),e("code",[t._v("scantxoutset")]),t._v(" to "),e("strong",[t._v("scan the current state of the blockchain")]),t._v(" (called UTXO Set) for coins belonging to the configured derivation scheme.")]),t._v(" "),e("figure",[e("img",{attrs:{src:a(644),alt:"Wallet Rescan",title:"Wallet Rescan"}})]),t._v(" "),e("p",[t._v("Wallet re-scan solves two critical problems for BTCPay users:")]),t._v(" "),e("ol",[e("li",[e("RouterLink",{attrs:{to:"/FAQ/Wallet/#missing-payments-in-my-software-or-hardware-wallet"}},[t._v("Gap limit")])],1),t._v(" "),e("li",[t._v("Importing a previously used wallet")])]),t._v(" "),e("p",[e("strong",[t._v("Gap limit")]),t._v(": Most wallets typically have the address gap limit set to 20. This means that if a merchant receives 21 or more consecutive unpaid invoices, those wallets show the incorrect balance and some transactions may not be visible.")]),t._v(" "),e("p",[e("strong",[t._v("Wallet import")]),t._v(": When users add a derivation scheme of a wallet that had transactions in the past (previously used wallet), BTCPay won't be able to show the balance and transactions from the past.")]),t._v(" "),e("figure",[e("img",{attrs:{src:a(645),alt:"Wallet rescan progress",title:"Wallet rescan progress"}})]),t._v(" "),e("p",[t._v("Re-scan is a feature that solves both of these problems. Once the scan is complete, BTCPay Server will show the correct balance, along with the past transactions of the wallet.")]),t._v(" "),e("p",[t._v("Wallet re-scan requires access to the full node which means that this function is only available for server owners.")]),t._v(" "),e("p",[t._v("Users who use a third-party host should use a newly generated xpub key and also use an external wallet like Electrum which allows them to increase the gap limit.")]),t._v(" "),e("h3",{attrs:{id:"settings"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#settings"}},[t._v("#")]),t._v(" Settings")]),t._v(" "),e("p",[t._v("In the top right corner of your "),e("code",[t._v("wallet")]),t._v(" you will find the "),e("code",[t._v("wallet settings")]),t._v(".\nIn the wallet settings tab you can adjust certain settings. If you've configured your wallet by "),e("RouterLink",{attrs:{to:"/CreateWallet/"}},[t._v("creating a new wallet")]),t._v(" or using an existing wallet via the "),e("RouterLink",{attrs:{to:"/HardwareWalletIntegration/"}},[t._v("hardware wallet integration")]),t._v(" these settings will be pre-configured.")],1),t._v(" "),e("p",[t._v("If you manually added the extended public key from an external wallet, you'd need to adjust "),e("code",[t._v("AccountKeyPath")]),t._v(" that you can find in your external wallet, for example "),e("code",[t._v("m/84'/0'/0'")]),t._v(" to be able to spend from the BTCPay Wallet.")]),t._v(" "),e("p",[t._v("In "),e("code",[t._v("wallet settings")]),t._v(" you will also find the "),e("code",[t._v("speed policy")]),t._v(" for the specific store.\nThere are 2 main settings under "),e("code",[t._v("Payment")]),t._v(", "),e("RouterLink",{attrs:{to:"/FAQ/Stores/#payment-invalid-if-transactions-fails-to-confirm--minutes-after-invoice-expiration"}},[t._v("Payment invalid if transaction fails to confirm in ... after invoice creation")]),t._v(" and "),e("RouterLink",{attrs:{to:"/FAQ/Stores/#consider-the-invoice-confirmed-when-the-payment-transaction"}},[t._v("Consider the invoice confirmed when the payment transaction...")]),t._v(". The latter lets you set the number of confirmations required to be recognized as settled.")],1),t._v(" "),e("figure",[e("img",{attrs:{src:a(646),alt:"Wallet settings",title:"Wallet settings"}})])])}),[],!1,null,null,null);e.default=s.exports}}]); \ No newline at end of file diff --git a/assets/js/32.4b5b21a7.js b/assets/js/32.58711810.js similarity index 82% rename from assets/js/32.4b5b21a7.js rename to assets/js/32.58711810.js index badb1ca0d4..1e62d1a750 100644 --- a/assets/js/32.4b5b21a7.js +++ b/assets/js/32.58711810.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[32],{349:function(t,a,e){t.exports=e.p+"assets/img/dashboardgif.e52489e5.gif"},350:function(t,a,e){t.exports=e.p+"assets/img/wallet-view.7dad96c7.jpg"},351:function(t,a,e){t.exports=e.p+"assets/img/tx-activity-view.8254b07e.jpg"},352:function(t,a,e){t.exports=e.p+"assets/img/btcpayLNDashboard3.e08e2f1f.jpg"},353:function(t,a,e){t.exports=e.p+"assets/img/btcpayLNDashboard4.946731bb.jpg"},354:function(t,a,e){t.exports=e.p+"assets/img/recent-tx-view.34d9cd12.jpg"},355:function(t,a,e){t.exports=e.p+"assets/img/recent-invoice-view.d6235bab.jpg"},356:function(t,a,e){t.exports=e.p+"assets/img/fund-full-view.79683f5c.jpg"},726:function(t,a,e){"use strict";e.r(a);var i=e(10),r=Object(i.a)({},(function(){var t=this,a=t._self._c;return a("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[a("h1",{attrs:{id:"dashboard"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#dashboard"}},[t._v("#")]),t._v(" Dashboard")]),t._v(" "),a("p",[t._v("BTCPay Server version 1.5.0 introduced a new dashboard concept that features several tiles that will help with the initial setup, better understand the store's data and manage refunds and payouts with ease.")]),t._v(" "),a("figure",[a("img",{attrs:{src:e(349),alt:"BTCPay Server Navigation",title:"BTCPay Server Navigation"}})]),t._v(" "),a("div",{staticClass:"custom-block tip"},[a("p",{staticClass:"custom-block-title"},[t._v("TIP")]),t._v(" "),a("p",[t._v("Balance graph and recent transactions are available only for an on-chain payment method.\nInformation about Lightning network balances and transactions is on the to-do. As of BTCPay Server Version 1.6.0, basic Lightning Network balances are available.")])]),t._v(" "),a("h2",{attrs:{id:"dashboard-tiles"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#dashboard-tiles"}},[t._v("#")]),t._v(" Dashboard tiles")]),t._v(" "),a("p",[t._v("In the main dashboard view, you'll find a couple of tiles that we think could help you quickly overview your store's performance.")]),t._v(" "),a("h3",{attrs:{id:"wallet-balance"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#wallet-balance"}},[t._v("#")]),t._v(" Wallet Balance")]),t._v(" "),a("p",[t._v("The current store's "),a("RouterLink",{attrs:{to:"/Wallet/"}},[t._v("wallet")]),t._v(" balance, showing a graph by week, month, or year.")],1),t._v(" "),a("figure",[a("img",{attrs:{src:e(350),alt:"BTCPay Server Navigation",title:"BTCPay Server Navigation"}})]),t._v(" "),a("h3",{attrs:{id:"transaction-activity"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#transaction-activity"}},[t._v("#")]),t._v(" Transaction activity")]),t._v(" "),a("p",[t._v("Quickly manage pending payouts, view recent transactions, and overview outstanding "),a("RouterLink",{attrs:{to:"/Refund/"}},[t._v("refunds")])],1),t._v(" "),a("figure",[a("img",{attrs:{src:e(351),alt:"BTCPay Server Navigation",title:"BTCPay Server Navigation"}})]),t._v(" "),a("h3",{attrs:{id:"lightning-balance"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#lightning-balance"}},[t._v("#")]),t._v(" Lightning Balance")]),t._v(" "),a("p",[t._v("This will show the available balances for your Lightning node.\nPlease note that the on-chain balance refers to the wallet of your store's Lightning node, not the store's general on-chain wallet.")]),t._v(" "),a("p",[t._v("The "),a("code",[t._v("Node Info")]),t._v(" will show you a quick overview of your node, it's online status and the address to connect to for peers.\nFor more information on "),a("code",[t._v("Lightning Network")]),t._v(" check our "),a("RouterLink",{attrs:{to:"/LightningNetwork/"}},[t._v("Lightning Network page")]),t._v(".")],1),t._v(" "),a("figure",[a("img",{attrs:{src:e(352),alt:"BTCPay Server Dashboard LN",title:"BTCPay Server Dashboard LN"}})]),t._v(" "),a("h3",{attrs:{id:"lightning-services"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#lightning-services"}},[t._v("#")]),t._v(" Lightning Services")]),t._v(" "),a("p",[t._v("In this tile, you will find quick buttons to "),a("code",[t._v("Lightning Network")]),t._v(" services like:")]),t._v(" "),a("ul",[a("li",[t._v("Core Lightning (REST)")]),t._v(" "),a("li",[t._v("Ride The Lightning")]),t._v(" "),a("li",[t._v("ThunderHub")]),t._v(" "),a("li",[t._v("Lightning Terminal")])]),t._v(" "),a("figure",[a("img",{attrs:{src:e(353),alt:"BTCPay Server Dashboard LN",title:"BTCPay Server Dashboard LN"}})]),t._v(" "),a("h3",{attrs:{id:"recent-transactions"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#recent-transactions"}},[t._v("#")]),t._v(" Recent Transactions")]),t._v(" "),a("p",[t._v("Showcasing the five most recent transactions that arrived to your on-chain wallet.")]),t._v(" "),a("figure",[a("img",{attrs:{src:e(354),alt:"BTCPay Server Navigation",title:"BTCPay Server Navigation"}})]),t._v(" "),a("h3",{attrs:{id:"recent-invoices"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#recent-invoices"}},[t._v("#")]),t._v(" Recent invoices")]),t._v(" "),a("p",[t._v("The five most recent invoices are shown with their corresponding status and value allowing you to quickly access and manage a particular "),a("RouterLink",{attrs:{to:"/Invoices/"}},[t._v("invoice")]),t._v(".")],1),t._v(" "),a("figure",[a("img",{attrs:{src:e(355),alt:"BTCPay Server Navigation",title:"BTCPay Server Navigation"}})]),t._v(" "),a("h3",{attrs:{id:"current-active-crowdfund"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#current-active-crowdfund"}},[t._v("#")]),t._v(" Current active crowdfund")]),t._v(" "),a("p",[t._v("This tile shows the current active crowdfunds, including their top-ranked items/perks. When more than one crowdfunding app is active crowdfund is, the tiles will show below the initial one. That's an easy way to manage your active crowdfund campaigns and see all the perks and how they're performing.")]),t._v(" "),a("figure",[a("img",{attrs:{src:e(356),alt:"BTCPay Server Navigation",title:"BTCPay Server Navigation"}})]),t._v(" "),a("div",{staticClass:"custom-block warning"},[a("p",{staticClass:"custom-block-title"},[t._v("WARNING")]),t._v(" "),a("p",[t._v("This page is subject to change as the software progresses. Features will be updated by release.")])])])}),[],!1,null,null,null);a.default=r.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[32],{361:function(t,a,e){t.exports=e.p+"assets/img/dashboardgif.e52489e5.gif"},362:function(t,a,e){t.exports=e.p+"assets/img/wallet-view.7dad96c7.jpg"},363:function(t,a,e){t.exports=e.p+"assets/img/tx-activity-view.8254b07e.jpg"},364:function(t,a,e){t.exports=e.p+"assets/img/btcpayLNDashboard3.e08e2f1f.jpg"},365:function(t,a,e){t.exports=e.p+"assets/img/btcpayLNDashboard4.946731bb.jpg"},366:function(t,a,e){t.exports=e.p+"assets/img/recent-tx-view.34d9cd12.jpg"},367:function(t,a,e){t.exports=e.p+"assets/img/recent-invoice-view.d6235bab.jpg"},368:function(t,a,e){t.exports=e.p+"assets/img/fund-full-view.79683f5c.jpg"},728:function(t,a,e){"use strict";e.r(a);var i=e(10),r=Object(i.a)({},(function(){var t=this,a=t._self._c;return a("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[a("h1",{attrs:{id:"dashboard"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#dashboard"}},[t._v("#")]),t._v(" Dashboard")]),t._v(" "),a("p",[t._v("BTCPay Server version 1.5.0 introduced a new dashboard concept that features several tiles that will help with the initial setup, better understand the store's data and manage refunds and payouts with ease.")]),t._v(" "),a("figure",[a("img",{attrs:{src:e(361),alt:"BTCPay Server Navigation",title:"BTCPay Server Navigation"}})]),t._v(" "),a("div",{staticClass:"custom-block tip"},[a("p",{staticClass:"custom-block-title"},[t._v("TIP")]),t._v(" "),a("p",[t._v("Balance graph and recent transactions are available only for an on-chain payment method.\nInformation about Lightning network balances and transactions is on the to-do. As of BTCPay Server Version 1.6.0, basic Lightning Network balances are available.")])]),t._v(" "),a("h2",{attrs:{id:"dashboard-tiles"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#dashboard-tiles"}},[t._v("#")]),t._v(" Dashboard tiles")]),t._v(" "),a("p",[t._v("In the main dashboard view, you'll find a couple of tiles that we think could help you quickly overview your store's performance.")]),t._v(" "),a("h3",{attrs:{id:"wallet-balance"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#wallet-balance"}},[t._v("#")]),t._v(" Wallet Balance")]),t._v(" "),a("p",[t._v("The current store's "),a("RouterLink",{attrs:{to:"/Wallet/"}},[t._v("wallet")]),t._v(" balance, showing a graph by week, month, or year.")],1),t._v(" "),a("figure",[a("img",{attrs:{src:e(362),alt:"BTCPay Server Navigation",title:"BTCPay Server Navigation"}})]),t._v(" "),a("h3",{attrs:{id:"transaction-activity"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#transaction-activity"}},[t._v("#")]),t._v(" Transaction activity")]),t._v(" "),a("p",[t._v("Quickly manage pending payouts, view recent transactions, and overview outstanding "),a("RouterLink",{attrs:{to:"/Refund/"}},[t._v("refunds")])],1),t._v(" "),a("figure",[a("img",{attrs:{src:e(363),alt:"BTCPay Server Navigation",title:"BTCPay Server Navigation"}})]),t._v(" "),a("h3",{attrs:{id:"lightning-balance"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#lightning-balance"}},[t._v("#")]),t._v(" Lightning Balance")]),t._v(" "),a("p",[t._v("This will show the available balances for your Lightning node.\nPlease note that the on-chain balance refers to the wallet of your store's Lightning node, not the store's general on-chain wallet.")]),t._v(" "),a("p",[t._v("The "),a("code",[t._v("Node Info")]),t._v(" will show you a quick overview of your node, it's online status and the address to connect to for peers.\nFor more information on "),a("code",[t._v("Lightning Network")]),t._v(" check our "),a("RouterLink",{attrs:{to:"/LightningNetwork/"}},[t._v("Lightning Network page")]),t._v(".")],1),t._v(" "),a("figure",[a("img",{attrs:{src:e(364),alt:"BTCPay Server Dashboard LN",title:"BTCPay Server Dashboard LN"}})]),t._v(" "),a("h3",{attrs:{id:"lightning-services"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#lightning-services"}},[t._v("#")]),t._v(" Lightning Services")]),t._v(" "),a("p",[t._v("In this tile, you will find quick buttons to "),a("code",[t._v("Lightning Network")]),t._v(" services like:")]),t._v(" "),a("ul",[a("li",[t._v("Core Lightning (REST)")]),t._v(" "),a("li",[t._v("Ride The Lightning")]),t._v(" "),a("li",[t._v("ThunderHub")]),t._v(" "),a("li",[t._v("Lightning Terminal")])]),t._v(" "),a("figure",[a("img",{attrs:{src:e(365),alt:"BTCPay Server Dashboard LN",title:"BTCPay Server Dashboard LN"}})]),t._v(" "),a("h3",{attrs:{id:"recent-transactions"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#recent-transactions"}},[t._v("#")]),t._v(" Recent Transactions")]),t._v(" "),a("p",[t._v("Showcasing the five most recent transactions that arrived to your on-chain wallet.")]),t._v(" "),a("figure",[a("img",{attrs:{src:e(366),alt:"BTCPay Server Navigation",title:"BTCPay Server Navigation"}})]),t._v(" "),a("h3",{attrs:{id:"recent-invoices"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#recent-invoices"}},[t._v("#")]),t._v(" Recent invoices")]),t._v(" "),a("p",[t._v("The five most recent invoices are shown with their corresponding status and value allowing you to quickly access and manage a particular "),a("RouterLink",{attrs:{to:"/Invoices/"}},[t._v("invoice")]),t._v(".")],1),t._v(" "),a("figure",[a("img",{attrs:{src:e(367),alt:"BTCPay Server Navigation",title:"BTCPay Server Navigation"}})]),t._v(" "),a("h3",{attrs:{id:"current-active-crowdfund"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#current-active-crowdfund"}},[t._v("#")]),t._v(" Current active crowdfund")]),t._v(" "),a("p",[t._v("This tile shows the current active crowdfunds, including their top-ranked items/perks. When more than one crowdfunding app is active crowdfund is, the tiles will show below the initial one. That's an easy way to manage your active crowdfund campaigns and see all the perks and how they're performing.")]),t._v(" "),a("figure",[a("img",{attrs:{src:e(368),alt:"BTCPay Server Navigation",title:"BTCPay Server Navigation"}})]),t._v(" "),a("div",{staticClass:"custom-block warning"},[a("p",{staticClass:"custom-block-title"},[t._v("WARNING")]),t._v(" "),a("p",[t._v("This page is subject to change as the software progresses. Features will be updated by release.")])])])}),[],!1,null,null,null);a.default=r.exports}}]); \ No newline at end of file diff --git a/assets/js/34.d60c1f95.js b/assets/js/34.882ad6ad.js similarity index 90% rename from assets/js/34.d60c1f95.js rename to assets/js/34.882ad6ad.js index ae67658edc..d72420e75b 100644 --- a/assets/js/34.d60c1f95.js +++ b/assets/js/34.882ad6ad.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[34],{544:function(e,t,a){e.exports=a.p+"assets/img/1.61c3b232.jpg"},545:function(e,t,a){e.exports=a.p+"assets/img/2.4ec63b47.jpg"},546:function(e,t,a){e.exports=a.p+"assets/img/3.0a39c840.jpg"},547:function(e,t,a){e.exports=a.p+"assets/img/4.e37e0402.png"},548:function(e,t,a){e.exports=a.p+"assets/img/5.29be95a6.png"},549:function(e,t,a){e.exports=a.p+"assets/img/6.861ee564.jpg"},550:function(e,t,a){e.exports=a.p+"assets/img/7.56e93cc1.jpg"},551:function(e,t,a){e.exports=a.p+"assets/img/8.e6a2f12e.jpg"},809:function(e,t,a){"use strict";a.r(t);var r=a(10),n=Object(r.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"pull-payments"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#pull-payments"}},[e._v("#")]),e._v(" Pull payments")]),e._v(" "),t("h2",{attrs:{id:"introduction"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#introduction"}},[e._v("#")]),e._v(" Introduction")]),e._v(" "),t("p",[e._v("Traditionally, to make a Bitcoin payment, a receiver shares their bitcoin address and the sender later sends money to this address.\nSuch system is called "),t("code",[e._v("Push payment")]),e._v(" as the sender initiates the payment while the receiver may be unavailable, in effect "),t("code",[e._v("pushing")]),e._v(" the payment to the receiver.")]),e._v(" "),t("p",[e._v("However, what about reversing the role?")]),e._v(" "),t("p",[e._v("What if, instead of a sender "),t("code",[e._v("pushing")]),e._v(" the payment, the sender allows the receiver to "),t("code",[e._v("pull")]),e._v(" the payment at a time the receiver seems fit?\nThis is the concept of "),t("code",[e._v("Pull payment")]),e._v(". This allows several new applications such as:")]),e._v(" "),t("ul",[t("li",[e._v("A subscription service (where the subscriber allows the service to pull money every x amount of time)")]),e._v(" "),t("li",[e._v("Refunds (where the merchant allows the customer to pull the refund money to his wallet when it seems fit)")]),e._v(" "),t("li",[e._v("Time-based billing for freelancers (where the person hiring allows the freelancer to pull money to his wallet as time gets reported)")]),e._v(" "),t("li",[e._v("Patronage (where the patron allows the recipient to pull money every month to continue supporting their work)")]),e._v(" "),t("li",[e._v("Automatic selling (where a customer of an exchange would allow an exchange to pull money from their wallet to automatically sell every month)")]),e._v(" "),t("li",[e._v("Balance withdraw system (where a high-volume service allows users to request withdrawals from their balance, the service can then easily batch all the payouts to many users, at fixed intervals)")])]),e._v(" "),t("p",[e._v("You can also follow this video:")]),e._v(" "),t("a",{staticClass:"ytEmbed",staticStyle:{"background-image":"url(https://img.youtube.com/vi/-e8lPd9NtPs/hqdefault.jpg)"},attrs:{href:"https://www.youtube.com/watch?v=-e8lPd9NtPs",title:"What is a pull payment","data-id":"-e8lPd9NtPs"}},[t("iframe",{attrs:{title:"What is a pull payment","data-src":"https://www.youtube-nocookie.com/embed/-e8lPd9NtPs?&autoplay=1&autohide=1&modestbranding=1&color=white&rel=0",frameborder:"0",allow:"autoplay;encrypted-media;picture-in-picture",allowfullscreen:""}})]),e._v(" "),t("h2",{attrs:{id:"concept"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#concept"}},[e._v("#")]),e._v(" Concept")]),e._v(" "),t("p",[e._v("When a sender configures a "),t("code",[e._v("Pull payment")]),e._v(", they can configure a number of properties:")]),e._v(" "),t("ul",[t("li",[e._v("Start date")]),e._v(" "),t("li",[e._v("End date (optional)")]),e._v(" "),t("li",[e._v("A period (optional)")]),e._v(" "),t("li",[e._v("A limit amount")]),e._v(" "),t("li",[e._v("A unit (such as USD, BTC, Hours)")]),e._v(" "),t("li",[e._v("Available payment methods")])]),e._v(" "),t("p",[e._v("After this, the sender can "),t("strong",[e._v("share the pull payment")]),e._v(" using a link with the receiver, allowing the receiver to "),t("code",[e._v("create a payout")]),e._v(".\nThe receiver will choose for their payout:")]),e._v(" "),t("ul",[t("li",[e._v("Which payment method to use")]),e._v(" "),t("li",[e._v("Where to send the money")])]),e._v(" "),t("p",[e._v("Once a payout is created, it will count toward the "),t("code",[e._v("pull payment's limit")]),e._v(" for the current "),t("code",[e._v("period")]),e._v(".\nThe sender will then approve the payout by setting the "),t("code",[e._v("rate")]),e._v(" in which the payout will be sent, and proceed with payment.")]),e._v(" "),t("p",[e._v("For the sender, we provide an easy to use way to batch the payment of several payouts from the "),t("RouterLink",{attrs:{to:"/Wallet/"}},[e._v("BTCPay Internal Wallet")]),e._v(".")],1),e._v(" "),t("div",{staticClass:"language- extra-class"},[t("pre",{pre:!0,attrs:{class:"language-text"}},[t("code",[e._v("\n +----------+ +-------------------+ +------------+\n | | | | | |\n | Sender | | BTCPay Server | | Receiver |\n | | | | | |\n +----------+ +-------------------+ +------------+\n | | |\n | | |\n | Create | |\n +---------------------------\x3e+ |\n | Pull payment | |\n | | |\n | | |\n | Share | |\n +--------------------------------------------------------\x3e+\n | Pull payment | |\n | | |\n | | Create |\n | +<---------------------------+\n | | Payout |\n | | |\n | Approve | |\n +---------------------------\x3e+ v\n | Payout |\n | |\n | Pay |\n +---------------------------\x3e+\n | Payout |\n | |\n | |\n v v\n")])])]),t("p",[e._v("Note that BTCPay Server does not approve and pay a payout automatically. In future releases, we will look into payouts which are approved to be paid out automatically under the correct conditions.\nInstead, a notification will appear for the sender, giving the sender the choice to approve and pay the payouts.")]),e._v(" "),t("h2",{attrs:{id:"greenfield-api"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#greenfield-api"}},[e._v("#")]),e._v(" Greenfield API")]),e._v(" "),t("p",[e._v("We provide a full API to both the sender and receiver that is documented in the "),t("code",[e._v("/docs")]),e._v(" page of your instance. (or on our "),t("a",{attrs:{href:"https://docs.btcpayserver.org/API/Greenfield/v1/",target:"_blank",rel:"noopener noreferrer"}},[e._v("public link"),t("OutboundLink")],1),e._v(" page)")]),e._v(" "),t("p",[e._v("Since our API exposes the full capability of pull payments, a sender can automate payments for his own need.")]),e._v(" "),t("h2",{attrs:{id:"user-interface"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#user-interface"}},[e._v("#")]),e._v(" User interface")]),e._v(" "),t("p",[e._v("The user interface only allows a subset of what is possible.")]),e._v(" "),t("h3",{attrs:{id:"create-a-pull-payment"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#create-a-pull-payment"}},[e._v("#")]),e._v(" Create a pull payment")]),e._v(" "),t("ol",[t("li",[e._v("Go to your wallet page / pull payments\n"),t("img",{attrs:{src:a(544),alt:"BTCPay Server Pull Payment",title:"BTCPay Server Pull Payment"}})]),e._v(" "),t("li",[e._v("Click on "),t("code",[e._v("Create a new pull payment")]),e._v(" "),t("img",{attrs:{src:a(545),alt:"BTCPay Server Pull Payment",title:"BTCPay Server Pull Payment"}})]),e._v(" "),t("li",[e._v("Fill out the pull payment information, click "),t("code",[e._v("Create")]),e._v(" "),t("img",{attrs:{src:a(546),alt:"BTCPay Server Pull Payment",title:"BTCPay Server Pull Payment"}})]),e._v(" "),t("li",[e._v("Go to the pull payment page by clicking on "),t("code",[e._v("View")])]),e._v(" "),t("li",[e._v("Share this page with the payment receiver\n"),t("img",{attrs:{src:a(547),alt:"BTCPay Server Pull Payment",title:"BTCPay Server Pull Payment"}})]),e._v(" "),t("li",[e._v("As the receiver, fill out how much "),t("code",[e._v("USD")]),e._v(" you claim, and to which address the money should be sent.\n"),t("img",{attrs:{src:a(548),alt:"BTCPay Server Pull Payment",title:"BTCPay Server Pull Payment"}})])]),e._v(" "),t("h3",{attrs:{id:"approve-and-pay-a-payout"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#approve-and-pay-a-payout"}},[e._v("#")]),e._v(" Approve and pay a payout")]),e._v(" "),t("ol",[t("li",[e._v("The sender gets notified when the receiver is pulling money\n"),t("img",{attrs:{src:a(549),alt:"6",title:"6"}})]),e._v(" "),t("li",[e._v("Clicking on the notification brings the sender to a page listing all outstanding payouts\n"),t("img",{attrs:{src:a(550),alt:"7",title:"7"}})]),e._v(" "),t("li",[e._v("Check the payout to approve, pay and confirm\n"),t("img",{attrs:{src:a(551),alt:"8",title:"8"}})]),e._v(" "),t("li",[e._v("You are then brought to the normal wallet user interface of BTCPay Server")])]),e._v(" "),t("div",{staticClass:"custom-block warning"},[t("p",{staticClass:"custom-block-title"},[e._v("WARNING")]),e._v(" "),t("p",[e._v("Clicking on Confirm selected payouts will use the current exchange rate of your wallet's store settings. The rate is then fixed, even if you don't complete the payment. Payments made at a later time will use this previously confirmed rate.")])]),e._v(" "),t("h2",{attrs:{id:"additional-use-cases-for-the-pull-payments-feature"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#additional-use-cases-for-the-pull-payments-feature"}},[e._v("#")]),e._v(" Additional use cases for the Pull Payments feature")]),e._v(" "),t("p",[e._v("The "),t("strong",[e._v("Pull Payment feature")]),e._v(" can be used in multiple applications, the first one being "),t("RouterLink",{attrs:{to:"/Refund/"}},[e._v("Refunds")]),e._v(".")],1)])}),[],!1,null,null,null);t.default=n.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[34],{536:function(e,t,a){e.exports=a.p+"assets/img/1.61c3b232.jpg"},537:function(e,t,a){e.exports=a.p+"assets/img/2.4ec63b47.jpg"},538:function(e,t,a){e.exports=a.p+"assets/img/3.0a39c840.jpg"},539:function(e,t,a){e.exports=a.p+"assets/img/4.e37e0402.png"},540:function(e,t,a){e.exports=a.p+"assets/img/5.29be95a6.png"},541:function(e,t,a){e.exports=a.p+"assets/img/6.861ee564.jpg"},542:function(e,t,a){e.exports=a.p+"assets/img/7.56e93cc1.jpg"},543:function(e,t,a){e.exports=a.p+"assets/img/8.e6a2f12e.jpg"},808:function(e,t,a){"use strict";a.r(t);var r=a(10),n=Object(r.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"pull-payments"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#pull-payments"}},[e._v("#")]),e._v(" Pull payments")]),e._v(" "),t("h2",{attrs:{id:"introduction"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#introduction"}},[e._v("#")]),e._v(" Introduction")]),e._v(" "),t("p",[e._v("Traditionally, to make a Bitcoin payment, a receiver shares their bitcoin address and the sender later sends money to this address.\nSuch system is called "),t("code",[e._v("Push payment")]),e._v(" as the sender initiates the payment while the receiver may be unavailable, in effect "),t("code",[e._v("pushing")]),e._v(" the payment to the receiver.")]),e._v(" "),t("p",[e._v("However, what about reversing the role?")]),e._v(" "),t("p",[e._v("What if, instead of a sender "),t("code",[e._v("pushing")]),e._v(" the payment, the sender allows the receiver to "),t("code",[e._v("pull")]),e._v(" the payment at a time the receiver seems fit?\nThis is the concept of "),t("code",[e._v("Pull payment")]),e._v(". This allows several new applications such as:")]),e._v(" "),t("ul",[t("li",[e._v("A subscription service (where the subscriber allows the service to pull money every x amount of time)")]),e._v(" "),t("li",[e._v("Refunds (where the merchant allows the customer to pull the refund money to his wallet when it seems fit)")]),e._v(" "),t("li",[e._v("Time-based billing for freelancers (where the person hiring allows the freelancer to pull money to his wallet as time gets reported)")]),e._v(" "),t("li",[e._v("Patronage (where the patron allows the recipient to pull money every month to continue supporting their work)")]),e._v(" "),t("li",[e._v("Automatic selling (where a customer of an exchange would allow an exchange to pull money from their wallet to automatically sell every month)")]),e._v(" "),t("li",[e._v("Balance withdraw system (where a high-volume service allows users to request withdrawals from their balance, the service can then easily batch all the payouts to many users, at fixed intervals)")])]),e._v(" "),t("p",[e._v("You can also follow this video:")]),e._v(" "),t("a",{staticClass:"ytEmbed",staticStyle:{"background-image":"url(https://img.youtube.com/vi/-e8lPd9NtPs/hqdefault.jpg)"},attrs:{href:"https://www.youtube.com/watch?v=-e8lPd9NtPs",title:"What is a pull payment","data-id":"-e8lPd9NtPs"}},[t("iframe",{attrs:{title:"What is a pull payment","data-src":"https://www.youtube-nocookie.com/embed/-e8lPd9NtPs?&autoplay=1&autohide=1&modestbranding=1&color=white&rel=0",frameborder:"0",allow:"autoplay;encrypted-media;picture-in-picture",allowfullscreen:""}})]),e._v(" "),t("h2",{attrs:{id:"concept"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#concept"}},[e._v("#")]),e._v(" Concept")]),e._v(" "),t("p",[e._v("When a sender configures a "),t("code",[e._v("Pull payment")]),e._v(", they can configure a number of properties:")]),e._v(" "),t("ul",[t("li",[e._v("Start date")]),e._v(" "),t("li",[e._v("End date (optional)")]),e._v(" "),t("li",[e._v("A period (optional)")]),e._v(" "),t("li",[e._v("A limit amount")]),e._v(" "),t("li",[e._v("A unit (such as USD, BTC, Hours)")]),e._v(" "),t("li",[e._v("Available payment methods")])]),e._v(" "),t("p",[e._v("After this, the sender can "),t("strong",[e._v("share the pull payment")]),e._v(" using a link with the receiver, allowing the receiver to "),t("code",[e._v("create a payout")]),e._v(".\nThe receiver will choose for their payout:")]),e._v(" "),t("ul",[t("li",[e._v("Which payment method to use")]),e._v(" "),t("li",[e._v("Where to send the money")])]),e._v(" "),t("p",[e._v("Once a payout is created, it will count toward the "),t("code",[e._v("pull payment's limit")]),e._v(" for the current "),t("code",[e._v("period")]),e._v(".\nThe sender will then approve the payout by setting the "),t("code",[e._v("rate")]),e._v(" in which the payout will be sent, and proceed with payment.")]),e._v(" "),t("p",[e._v("For the sender, we provide an easy to use way to batch the payment of several payouts from the "),t("RouterLink",{attrs:{to:"/Wallet/"}},[e._v("BTCPay Internal Wallet")]),e._v(".")],1),e._v(" "),t("div",{staticClass:"language- extra-class"},[t("pre",{pre:!0,attrs:{class:"language-text"}},[t("code",[e._v("\n +----------+ +-------------------+ +------------+\n | | | | | |\n | Sender | | BTCPay Server | | Receiver |\n | | | | | |\n +----------+ +-------------------+ +------------+\n | | |\n | | |\n | Create | |\n +---------------------------\x3e+ |\n | Pull payment | |\n | | |\n | | |\n | Share | |\n +--------------------------------------------------------\x3e+\n | Pull payment | |\n | | |\n | | Create |\n | +<---------------------------+\n | | Payout |\n | | |\n | Approve | |\n +---------------------------\x3e+ v\n | Payout |\n | |\n | Pay |\n +---------------------------\x3e+\n | Payout |\n | |\n | |\n v v\n")])])]),t("p",[e._v("Note that BTCPay Server does not approve and pay a payout automatically. In future releases, we will look into payouts which are approved to be paid out automatically under the correct conditions.\nInstead, a notification will appear for the sender, giving the sender the choice to approve and pay the payouts.")]),e._v(" "),t("h2",{attrs:{id:"greenfield-api"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#greenfield-api"}},[e._v("#")]),e._v(" Greenfield API")]),e._v(" "),t("p",[e._v("We provide a full API to both the sender and receiver that is documented in the "),t("code",[e._v("/docs")]),e._v(" page of your instance. (or on our "),t("a",{attrs:{href:"https://docs.btcpayserver.org/API/Greenfield/v1/",target:"_blank",rel:"noopener noreferrer"}},[e._v("public link"),t("OutboundLink")],1),e._v(" page)")]),e._v(" "),t("p",[e._v("Since our API exposes the full capability of pull payments, a sender can automate payments for his own need.")]),e._v(" "),t("h2",{attrs:{id:"user-interface"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#user-interface"}},[e._v("#")]),e._v(" User interface")]),e._v(" "),t("p",[e._v("The user interface only allows a subset of what is possible.")]),e._v(" "),t("h3",{attrs:{id:"create-a-pull-payment"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#create-a-pull-payment"}},[e._v("#")]),e._v(" Create a pull payment")]),e._v(" "),t("ol",[t("li",[e._v("Go to your wallet page / pull payments\n"),t("img",{attrs:{src:a(536),alt:"BTCPay Server Pull Payment",title:"BTCPay Server Pull Payment"}})]),e._v(" "),t("li",[e._v("Click on "),t("code",[e._v("Create a new pull payment")]),e._v(" "),t("img",{attrs:{src:a(537),alt:"BTCPay Server Pull Payment",title:"BTCPay Server Pull Payment"}})]),e._v(" "),t("li",[e._v("Fill out the pull payment information, click "),t("code",[e._v("Create")]),e._v(" "),t("img",{attrs:{src:a(538),alt:"BTCPay Server Pull Payment",title:"BTCPay Server Pull Payment"}})]),e._v(" "),t("li",[e._v("Go to the pull payment page by clicking on "),t("code",[e._v("View")])]),e._v(" "),t("li",[e._v("Share this page with the payment receiver\n"),t("img",{attrs:{src:a(539),alt:"BTCPay Server Pull Payment",title:"BTCPay Server Pull Payment"}})]),e._v(" "),t("li",[e._v("As the receiver, fill out how much "),t("code",[e._v("USD")]),e._v(" you claim, and to which address the money should be sent.\n"),t("img",{attrs:{src:a(540),alt:"BTCPay Server Pull Payment",title:"BTCPay Server Pull Payment"}})])]),e._v(" "),t("h3",{attrs:{id:"approve-and-pay-a-payout"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#approve-and-pay-a-payout"}},[e._v("#")]),e._v(" Approve and pay a payout")]),e._v(" "),t("ol",[t("li",[e._v("The sender gets notified when the receiver is pulling money\n"),t("img",{attrs:{src:a(541),alt:"6",title:"6"}})]),e._v(" "),t("li",[e._v("Clicking on the notification brings the sender to a page listing all outstanding payouts\n"),t("img",{attrs:{src:a(542),alt:"7",title:"7"}})]),e._v(" "),t("li",[e._v("Check the payout to approve, pay and confirm\n"),t("img",{attrs:{src:a(543),alt:"8",title:"8"}})]),e._v(" "),t("li",[e._v("You are then brought to the normal wallet user interface of BTCPay Server")])]),e._v(" "),t("div",{staticClass:"custom-block warning"},[t("p",{staticClass:"custom-block-title"},[e._v("WARNING")]),e._v(" "),t("p",[e._v("Clicking on Confirm selected payouts will use the current exchange rate of your wallet's store settings. The rate is then fixed, even if you don't complete the payment. Payments made at a later time will use this previously confirmed rate.")])]),e._v(" "),t("h2",{attrs:{id:"additional-use-cases-for-the-pull-payments-feature"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#additional-use-cases-for-the-pull-payments-feature"}},[e._v("#")]),e._v(" Additional use cases for the Pull Payments feature")]),e._v(" "),t("p",[e._v("The "),t("strong",[e._v("Pull Payment feature")]),e._v(" can be used in multiple applications, the first one being "),t("RouterLink",{attrs:{to:"/Refund/"}},[e._v("Refunds")]),e._v(".")],1)])}),[],!1,null,null,null);t.default=n.exports}}]); \ No newline at end of file diff --git a/assets/js/35.9b999ef3.js b/assets/js/35.90404826.js similarity index 89% rename from assets/js/35.9b999ef3.js rename to assets/js/35.90404826.js index d66ce99d88..e8975d715d 100644 --- a/assets/js/35.9b999ef3.js +++ b/assets/js/35.90404826.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[35],{575:function(t,e,a){t.exports=a.p+"assets/img/btcpay-1-send.45cbfd83.png"},576:function(t,e,a){t.exports=a.p+"assets/img/btcpay-2-choose-signing-method.6606170c.png"},577:function(t,e,a){t.exports=a.p+"assets/img/btcpay-3-download-psbt.438a81f5.png"},578:function(t,e,a){t.exports=a.p+"assets/img/sparrow-1-loaded-psbt-for-signing.24a6fc3d.png"},579:function(t,e,a){t.exports=a.p+"assets/img/sparrow-2-loaded-psbt-sign.0e112fd5.png"},580:function(t,e,a){t.exports=a.p+"assets/img/sparrow-3-scan-for-hww.4788196d.png"},581:function(t,e,a){t.exports=a.p+"assets/img/sparrow-4-unlocked-hww.0a8fb110.png"},582:function(t,e,a){t.exports=a.p+"assets/img/sparrow-5-broadcast-transaction.5dab7222.png"},815:function(t,e,a){"use strict";a.r(e);var n=a(10),r=Object(n.a)({},(function(){var t=this,e=t._self._c;return e("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[e("h1",{attrs:{id:"creating-a-psbt-with-btcpay-server-and-sparrow-wallet"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#creating-a-psbt-with-btcpay-server-and-sparrow-wallet"}},[t._v("#")]),t._v(" Creating a PSBT with BTCPay Server and Sparrow wallet")]),t._v(" "),e("p",[t._v("This guide explains how you can create a partially signed bitcoin transaction (PSBT) on BTCPay Server and sign and broadcast it with "),e("a",{attrs:{href:"https://www.sparrowwallet.com/",target:"_blank",rel:"noopener noreferrer"}},[t._v("Sparrow wallet"),e("OutboundLink")],1),t._v(". We use "),e("a",{attrs:{href:"https://bitbox.swiss/",target:"_blank",rel:"noopener noreferrer"}},[t._v("BitBox02"),e("OutboundLink")],1),t._v(" hardware wallet in this example, but it will work with any other supported hardware wallet. This can be useful if you have an airgapped setup or persons creating the transaction and signing it are different people.")]),t._v(" "),e("p"),e("div",{staticClass:"table-of-contents"},[e("ul",[e("li",[e("a",{attrs:{href:"#1-creating-a-transaction-on-btcpay-server"}},[t._v("1. Creating a transaction (on BTCPay Server):")]),e("ul",[e("li",[e("a",{attrs:{href:"#on-send-screen"}},[t._v("On send screen:")])]),e("li",[e("a",{attrs:{href:"#on-choosing-signing-method-screen"}},[t._v("On choosing signing method screen:")])]),e("li",[e("a",{attrs:{href:"#on-psbt-screen"}},[t._v("On PSBT screen:")])])])]),e("li",[e("a",{attrs:{href:"#2-signing-and-sending-the-psbt-on-sparrow-wallet"}},[t._v("2. Signing and sending the PSBT (on Sparrow wallet)")]),e("ul",[e("li",[e("a",{attrs:{href:"#on-showing-the-imported-psbt-transaction"}},[t._v("On showing the imported PSBT transaction:")])]),e("li",[e("a",{attrs:{href:"#signing-the-transaction"}},[t._v("Signing the transaction:")])]),e("li",[e("a",{attrs:{href:"#connect-hardware-wallet-popup"}},[t._v("Connect Hardware wallet popup:")])]),e("li",[e("a",{attrs:{href:"#wallet-connected-successfully"}},[t._v("Wallet connected successfully:")])]),e("li",[e("a",{attrs:{href:"#broadcasting-the-transaction"}},[t._v("Broadcasting the transaction:")])])])])])]),e("p"),t._v(" "),e("h2",{attrs:{id:"1-creating-a-transaction-on-btcpay-server"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#1-creating-a-transaction-on-btcpay-server"}},[t._v("#")]),t._v(" 1. Creating a transaction (on BTCPay Server):")]),t._v(" "),e("ul",[e("li",[t._v("Log into your BTCPay Server and select the store you want to send from")]),t._v(" "),e("li",[t._v('Under "Wallets" select "Bitcoin"')]),t._v(" "),e("li",[t._v("Click on button "),e("strong",[t._v("[Send]")])])]),t._v(" "),e("h3",{attrs:{id:"on-send-screen"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#on-send-screen"}},[t._v("#")]),t._v(" On send screen:")]),t._v(" "),e("figure",[e("img",{attrs:{src:a(575),alt:"BTCPay: Create transaction on BTCPay Server",title:"Create a transaction"}})]),t._v(" "),e("ul",[e("li",[t._v("Enter the destination bitcoin address")]),t._v(" "),e("li",[t._v("Enter the amount")]),t._v(" "),e("li",[t._v("Optional: Change fee rate (get the current fee rate on "),e("a",{attrs:{href:"https://mempool.space",target:"_blank",rel:"noopener noreferrer"}},[t._v("mempool.space"),e("OutboundLink")],1),t._v(" depending on how fast you want the transaction to be confirmed)")]),t._v(" "),e("li",[e("strong",[t._v("Important")]),t._v(': click on "Advanced Settings" so it expands and check "'),e("strong",[t._v("Always include non-witness UTXO if available")]),t._v('" (this is needed so hardware wallets like BitBox02 can sign the transaction)')]),t._v(" "),e("li",[t._v('Optional: on "Allow fee increase (RBF)", set to "Yes" (this is useful if you select a too low fee you can bump the fee so your transaction is not stuck and get’s confirmed)')]),t._v(" "),e("li",[t._v("Click "),e("strong",[t._v("[Sign transaction]")]),t._v(" button")])]),t._v(" "),e("h3",{attrs:{id:"on-choosing-signing-method-screen"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#on-choosing-signing-method-screen"}},[t._v("#")]),t._v(" On choosing signing method screen:")]),t._v(" "),e("figure",[e("img",{attrs:{src:a(576),alt:"BTCPay: Choose signing method: Partially Signed Bitcoin Transaction",title:"Select Partially Signed Bitcoin Transaction"}})]),t._v(" "),e("ul",[e("li",[t._v('Select "Partially Signed Bitcoin Transaction"')])]),t._v(" "),e("h3",{attrs:{id:"on-psbt-screen"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#on-psbt-screen"}},[t._v("#")]),t._v(" On PSBT screen:")]),t._v(" "),e("figure",[e("img",{attrs:{src:a(577),alt:"BTCPay: Download the PSBT file",title:"PSBT screen overview, download PSBT"}})]),t._v(" "),e("ul",[e("li",[t._v('Open the accordion of "Export PSBT for signing" click on button '),e("strong",[t._v("[Download PSBT file]")])]),t._v(" "),e("li",[t._v("Store the file on hard-drive (you can use it to sign the PSBT yourself, or you can send it to somebody doing the signing on Sparrow wallet, see below); e.g. psbt-export.psbt")])]),t._v(" "),e("h2",{attrs:{id:"2-signing-and-sending-the-psbt-on-sparrow-wallet"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#2-signing-and-sending-the-psbt-on-sparrow-wallet"}},[t._v("#")]),t._v(" 2. Signing and sending the PSBT (on Sparrow wallet)")]),t._v(" "),e("ul",[e("li",[t._v("Open your Sparrow wallet app and corresponding wallet holding the data for the xPub used in your store")]),t._v(" "),e("li",[t._v("Next, import the PSBT file you created on BTCPay Server")]),t._v(" "),e("li",[t._v("In menu: File -> Open Transaction -> File...")]),t._v(" "),e("li",[t._v("Select the file you stored (or got sent from accounting) e.g. psbt-export.psbt")])]),t._v(" "),e("h3",{attrs:{id:"on-showing-the-imported-psbt-transaction"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#on-showing-the-imported-psbt-transaction"}},[t._v("#")]),t._v(" On showing the imported PSBT transaction:")]),t._v(" "),e("figure",[e("img",{attrs:{src:a(578),alt:"Sparrow wallet: Load the PSBT file",title:"Loaded PSBT for signing"}})]),t._v(" "),e("ul",[e("li",[t._v('Make sure under headline "Signatures:" the "signing wallet" matches the wallet you want to sent from')]),t._v(" "),e("li",[t._v("Click on "),e("strong",[t._v("[Finalize Transaction for Signing]")])])]),t._v(" "),e("h3",{attrs:{id:"signing-the-transaction"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#signing-the-transaction"}},[t._v("#")]),t._v(" Signing the transaction:")]),t._v(" "),e("figure",[e("img",{attrs:{src:a(579),alt:"Sparrow wallet: PSBT loaded, ready for signing",title:"Sparrow wallet: PSBT loaded, ready for signing"}})]),t._v(" "),e("ul",[e("li",[t._v("Click on "),e("strong",[t._v("[Sign]")])])]),t._v(" "),e("h3",{attrs:{id:"connect-hardware-wallet-popup"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#connect-hardware-wallet-popup"}},[t._v("#")]),t._v(" Connect Hardware wallet popup:")]),t._v(" "),e("figure",[e("img",{attrs:{src:a(580),alt:"Sparrow wallet: connect to hardware wallet (e.g. in our case BitBox02)",title:"Connect your hardware wallet"}})]),t._v(" "),e("ul",[e("li",[t._v("Plug-in your hardware wallet (BitBox02 in our case)")]),t._v(" "),e("li",[t._v("Enter your hardware wallet pin (for BitBox02 it shows on screen open BitBox app but you do not need to, wait until you can enter the pin)")]),t._v(" "),e("li",[t._v("After BitBox02 unlocked, click "),e("strong",[t._v("[Scan...]")]),t._v(", your hardware wallet will show up")])]),t._v(" "),e("h3",{attrs:{id:"wallet-connected-successfully"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#wallet-connected-successfully"}},[t._v("#")]),t._v(" Wallet connected successfully:")]),t._v(" "),e("figure",[e("img",{attrs:{src:a(581),alt:"Sparrow wallet: hardware wallet successfully connected",title:"BitBox02 successfully connected"}})]),t._v(" "),e("ul",[e("li",[t._v("Click "),e("strong",[t._v("[Sign]")])]),t._v(" "),e("li",[t._v("A summary of the transaction will be shown on the BitBox02 device, you need to confirm it there")])]),t._v(" "),e("h3",{attrs:{id:"broadcasting-the-transaction"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#broadcasting-the-transaction"}},[t._v("#")]),t._v(" Broadcasting the transaction:")]),t._v(" "),e("figure",[e("img",{attrs:{src:a(582),alt:"Sparrow wallet: broadcast the transaction",title:"Broadcast the transaction"}})]),t._v(" "),e("ul",[e("li",[t._v("After signing was successful you need to broadcast the transaction to the Bitcoin network")]),t._v(" "),e("li",[t._v("Click "),e("strong",[t._v("[Broadcast Transaction]")])])]),t._v(" "),e("div",{staticClass:"custom-block tip"},[e("p",{staticClass:"custom-block-title"},[t._v("TIP")]),t._v(" "),e("p",[t._v("Alternatively, instead of broadcasting the transaction from Sparrow wallet (e.g. if you have an airgapped setup) you could also copy and paste the signed transaction PSBT from the textbox and upload it to your BTCPay Server and let it broadcast the transaction to the network.")])]),t._v(" "),e("p",[e("strong",[t._v("Congrats, done!")])])])}),[],!1,null,null,null);e.default=r.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[35],{578:function(t,e,a){t.exports=a.p+"assets/img/btcpay-1-send.45cbfd83.png"},579:function(t,e,a){t.exports=a.p+"assets/img/btcpay-2-choose-signing-method.6606170c.png"},580:function(t,e,a){t.exports=a.p+"assets/img/btcpay-3-download-psbt.438a81f5.png"},581:function(t,e,a){t.exports=a.p+"assets/img/sparrow-1-loaded-psbt-for-signing.24a6fc3d.png"},582:function(t,e,a){t.exports=a.p+"assets/img/sparrow-2-loaded-psbt-sign.0e112fd5.png"},583:function(t,e,a){t.exports=a.p+"assets/img/sparrow-3-scan-for-hww.4788196d.png"},584:function(t,e,a){t.exports=a.p+"assets/img/sparrow-4-unlocked-hww.0a8fb110.png"},585:function(t,e,a){t.exports=a.p+"assets/img/sparrow-5-broadcast-transaction.5dab7222.png"},817:function(t,e,a){"use strict";a.r(e);var n=a(10),r=Object(n.a)({},(function(){var t=this,e=t._self._c;return e("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[e("h1",{attrs:{id:"creating-a-psbt-with-btcpay-server-and-sparrow-wallet"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#creating-a-psbt-with-btcpay-server-and-sparrow-wallet"}},[t._v("#")]),t._v(" Creating a PSBT with BTCPay Server and Sparrow wallet")]),t._v(" "),e("p",[t._v("This guide explains how you can create a partially signed bitcoin transaction (PSBT) on BTCPay Server and sign and broadcast it with "),e("a",{attrs:{href:"https://www.sparrowwallet.com/",target:"_blank",rel:"noopener noreferrer"}},[t._v("Sparrow wallet"),e("OutboundLink")],1),t._v(". We use "),e("a",{attrs:{href:"https://bitbox.swiss/",target:"_blank",rel:"noopener noreferrer"}},[t._v("BitBox02"),e("OutboundLink")],1),t._v(" hardware wallet in this example, but it will work with any other supported hardware wallet. This can be useful if you have an airgapped setup or persons creating the transaction and signing it are different people.")]),t._v(" "),e("p"),e("div",{staticClass:"table-of-contents"},[e("ul",[e("li",[e("a",{attrs:{href:"#1-creating-a-transaction-on-btcpay-server"}},[t._v("1. Creating a transaction (on BTCPay Server):")]),e("ul",[e("li",[e("a",{attrs:{href:"#on-send-screen"}},[t._v("On send screen:")])]),e("li",[e("a",{attrs:{href:"#on-choosing-signing-method-screen"}},[t._v("On choosing signing method screen:")])]),e("li",[e("a",{attrs:{href:"#on-psbt-screen"}},[t._v("On PSBT screen:")])])])]),e("li",[e("a",{attrs:{href:"#2-signing-and-sending-the-psbt-on-sparrow-wallet"}},[t._v("2. Signing and sending the PSBT (on Sparrow wallet)")]),e("ul",[e("li",[e("a",{attrs:{href:"#on-showing-the-imported-psbt-transaction"}},[t._v("On showing the imported PSBT transaction:")])]),e("li",[e("a",{attrs:{href:"#signing-the-transaction"}},[t._v("Signing the transaction:")])]),e("li",[e("a",{attrs:{href:"#connect-hardware-wallet-popup"}},[t._v("Connect Hardware wallet popup:")])]),e("li",[e("a",{attrs:{href:"#wallet-connected-successfully"}},[t._v("Wallet connected successfully:")])]),e("li",[e("a",{attrs:{href:"#broadcasting-the-transaction"}},[t._v("Broadcasting the transaction:")])])])])])]),e("p"),t._v(" "),e("h2",{attrs:{id:"1-creating-a-transaction-on-btcpay-server"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#1-creating-a-transaction-on-btcpay-server"}},[t._v("#")]),t._v(" 1. Creating a transaction (on BTCPay Server):")]),t._v(" "),e("ul",[e("li",[t._v("Log into your BTCPay Server and select the store you want to send from")]),t._v(" "),e("li",[t._v('Under "Wallets" select "Bitcoin"')]),t._v(" "),e("li",[t._v("Click on button "),e("strong",[t._v("[Send]")])])]),t._v(" "),e("h3",{attrs:{id:"on-send-screen"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#on-send-screen"}},[t._v("#")]),t._v(" On send screen:")]),t._v(" "),e("figure",[e("img",{attrs:{src:a(578),alt:"BTCPay: Create transaction on BTCPay Server",title:"Create a transaction"}})]),t._v(" "),e("ul",[e("li",[t._v("Enter the destination bitcoin address")]),t._v(" "),e("li",[t._v("Enter the amount")]),t._v(" "),e("li",[t._v("Optional: Change fee rate (get the current fee rate on "),e("a",{attrs:{href:"https://mempool.space",target:"_blank",rel:"noopener noreferrer"}},[t._v("mempool.space"),e("OutboundLink")],1),t._v(" depending on how fast you want the transaction to be confirmed)")]),t._v(" "),e("li",[e("strong",[t._v("Important")]),t._v(': click on "Advanced Settings" so it expands and check "'),e("strong",[t._v("Always include non-witness UTXO if available")]),t._v('" (this is needed so hardware wallets like BitBox02 can sign the transaction)')]),t._v(" "),e("li",[t._v('Optional: on "Allow fee increase (RBF)", set to "Yes" (this is useful if you select a too low fee you can bump the fee so your transaction is not stuck and get’s confirmed)')]),t._v(" "),e("li",[t._v("Click "),e("strong",[t._v("[Sign transaction]")]),t._v(" button")])]),t._v(" "),e("h3",{attrs:{id:"on-choosing-signing-method-screen"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#on-choosing-signing-method-screen"}},[t._v("#")]),t._v(" On choosing signing method screen:")]),t._v(" "),e("figure",[e("img",{attrs:{src:a(579),alt:"BTCPay: Choose signing method: Partially Signed Bitcoin Transaction",title:"Select Partially Signed Bitcoin Transaction"}})]),t._v(" "),e("ul",[e("li",[t._v('Select "Partially Signed Bitcoin Transaction"')])]),t._v(" "),e("h3",{attrs:{id:"on-psbt-screen"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#on-psbt-screen"}},[t._v("#")]),t._v(" On PSBT screen:")]),t._v(" "),e("figure",[e("img",{attrs:{src:a(580),alt:"BTCPay: Download the PSBT file",title:"PSBT screen overview, download PSBT"}})]),t._v(" "),e("ul",[e("li",[t._v('Open the accordion of "Export PSBT for signing" click on button '),e("strong",[t._v("[Download PSBT file]")])]),t._v(" "),e("li",[t._v("Store the file on hard-drive (you can use it to sign the PSBT yourself, or you can send it to somebody doing the signing on Sparrow wallet, see below); e.g. psbt-export.psbt")])]),t._v(" "),e("h2",{attrs:{id:"2-signing-and-sending-the-psbt-on-sparrow-wallet"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#2-signing-and-sending-the-psbt-on-sparrow-wallet"}},[t._v("#")]),t._v(" 2. Signing and sending the PSBT (on Sparrow wallet)")]),t._v(" "),e("ul",[e("li",[t._v("Open your Sparrow wallet app and corresponding wallet holding the data for the xPub used in your store")]),t._v(" "),e("li",[t._v("Next, import the PSBT file you created on BTCPay Server")]),t._v(" "),e("li",[t._v("In menu: File -> Open Transaction -> File...")]),t._v(" "),e("li",[t._v("Select the file you stored (or got sent from accounting) e.g. psbt-export.psbt")])]),t._v(" "),e("h3",{attrs:{id:"on-showing-the-imported-psbt-transaction"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#on-showing-the-imported-psbt-transaction"}},[t._v("#")]),t._v(" On showing the imported PSBT transaction:")]),t._v(" "),e("figure",[e("img",{attrs:{src:a(581),alt:"Sparrow wallet: Load the PSBT file",title:"Loaded PSBT for signing"}})]),t._v(" "),e("ul",[e("li",[t._v('Make sure under headline "Signatures:" the "signing wallet" matches the wallet you want to sent from')]),t._v(" "),e("li",[t._v("Click on "),e("strong",[t._v("[Finalize Transaction for Signing]")])])]),t._v(" "),e("h3",{attrs:{id:"signing-the-transaction"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#signing-the-transaction"}},[t._v("#")]),t._v(" Signing the transaction:")]),t._v(" "),e("figure",[e("img",{attrs:{src:a(582),alt:"Sparrow wallet: PSBT loaded, ready for signing",title:"Sparrow wallet: PSBT loaded, ready for signing"}})]),t._v(" "),e("ul",[e("li",[t._v("Click on "),e("strong",[t._v("[Sign]")])])]),t._v(" "),e("h3",{attrs:{id:"connect-hardware-wallet-popup"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#connect-hardware-wallet-popup"}},[t._v("#")]),t._v(" Connect Hardware wallet popup:")]),t._v(" "),e("figure",[e("img",{attrs:{src:a(583),alt:"Sparrow wallet: connect to hardware wallet (e.g. in our case BitBox02)",title:"Connect your hardware wallet"}})]),t._v(" "),e("ul",[e("li",[t._v("Plug-in your hardware wallet (BitBox02 in our case)")]),t._v(" "),e("li",[t._v("Enter your hardware wallet pin (for BitBox02 it shows on screen open BitBox app but you do not need to, wait until you can enter the pin)")]),t._v(" "),e("li",[t._v("After BitBox02 unlocked, click "),e("strong",[t._v("[Scan...]")]),t._v(", your hardware wallet will show up")])]),t._v(" "),e("h3",{attrs:{id:"wallet-connected-successfully"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#wallet-connected-successfully"}},[t._v("#")]),t._v(" Wallet connected successfully:")]),t._v(" "),e("figure",[e("img",{attrs:{src:a(584),alt:"Sparrow wallet: hardware wallet successfully connected",title:"BitBox02 successfully connected"}})]),t._v(" "),e("ul",[e("li",[t._v("Click "),e("strong",[t._v("[Sign]")])]),t._v(" "),e("li",[t._v("A summary of the transaction will be shown on the BitBox02 device, you need to confirm it there")])]),t._v(" "),e("h3",{attrs:{id:"broadcasting-the-transaction"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#broadcasting-the-transaction"}},[t._v("#")]),t._v(" Broadcasting the transaction:")]),t._v(" "),e("figure",[e("img",{attrs:{src:a(585),alt:"Sparrow wallet: broadcast the transaction",title:"Broadcast the transaction"}})]),t._v(" "),e("ul",[e("li",[t._v("After signing was successful you need to broadcast the transaction to the Bitcoin network")]),t._v(" "),e("li",[t._v("Click "),e("strong",[t._v("[Broadcast Transaction]")])])]),t._v(" "),e("div",{staticClass:"custom-block tip"},[e("p",{staticClass:"custom-block-title"},[t._v("TIP")]),t._v(" "),e("p",[t._v("Alternatively, instead of broadcasting the transaction from Sparrow wallet (e.g. if you have an airgapped setup) you could also copy and paste the signed transaction PSBT from the textbox and upload it to your BTCPay Server and let it broadcast the transaction to the network.")])]),t._v(" "),e("p",[e("strong",[t._v("Congrats, done!")])])])}),[],!1,null,null,null);e.default=r.exports}}]); \ No newline at end of file diff --git a/assets/js/38.d39e9f69.js b/assets/js/38.aff3157b.js similarity index 99% rename from assets/js/38.d39e9f69.js rename to assets/js/38.aff3157b.js index 7e11fdcf5d..de47af887c 100644 --- a/assets/js/38.d39e9f69.js +++ b/assets/js/38.aff3157b.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[38],{329:function(e,t,o){e.exports=o.p+"assets/img/docker-compose-up-dev.82514a01.png"},330:function(e,t,o){e.exports=o.p+"assets/img/vs-solution-explorer.71213904.png"},331:function(e,t,o){e.exports=o.p+"assets/img/vs-debug-console.9b8e7386.png"},332:function(e,t,o){e.exports=o.p+"assets/img/dashboard-change.d3ce411b.jpg"},333:function(e,t){e.exports="data:image/png;base64,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"},334:function(e,t,o){e.exports=o.p+"assets/img/DB-Connect.f1650039.png"},335:function(e,t,o){e.exports=o.p+"assets/img/DB-Edit.54e91f2d.png"},714:function(e,t,o){"use strict";o.r(t);var a=o(10),r=Object(a.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"setup-developer-environment"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#setup-developer-environment"}},[e._v("#")]),e._v(" Setup Developer Environment")]),e._v(" "),t("p"),t("div",{staticClass:"table-of-contents"},[t("ul",[t("li",[t("a",{attrs:{href:"#developer-resources"}},[e._v("Developer Resources")])]),t("li",[t("a",{attrs:{href:"#windows-setup-software"}},[e._v("Windows Setup Software")])]),t("li",[t("a",{attrs:{href:"#git-setup"}},[e._v("Git Setup")]),t("ul",[t("li",[t("a",{attrs:{href:"#fork-btcpay-server-repository"}},[e._v("Fork BTCPay Server Repository")])]),t("li",[t("a",{attrs:{href:"#clone-btcpay-server-repository"}},[e._v("Clone BTCPay Server Repository")])]),t("li",[t("a",{attrs:{href:"#create-a-development-feature-branch"}},[e._v("Create a Development Feature Branch")])])])]),t("li",[t("a",{attrs:{href:"#local-btcpay-setup"}},[e._v("Local BTCPay Setup")]),t("ul",[t("li",[t("a",{attrs:{href:"#bitcoin-regtest-network-setup"}},[e._v("Bitcoin Regtest Network Setup")])]),t("li",[t("a",{attrs:{href:"#build-local-btcpay-server-in-browser-mode"}},[e._v("Build Local BTCPay Server in Browser Mode")])]),t("li",[t("a",{attrs:{href:"#visual-studio-setup"}},[e._v("Visual Studio Setup")])]),t("li",[t("a",{attrs:{href:"#build-local-btcpay-server-in-debug-mode"}},[e._v("Build Local BTCPay Server in Debug Mode")])]),t("li",[t("a",{attrs:{href:"#visual-studio-code-changes-in-your-local-btcpay-server"}},[e._v("Visual Studio Code Changes In Your Local BTCPay Server")])])])]),t("li",[t("a",{attrs:{href:"#git-maintenance"}},[e._v("Git Maintenance")]),t("ul",[t("li",[t("a",{attrs:{href:"#sync-forked-btcpay-server-repository"}},[e._v("Sync Forked BTCPay Server Repository")])]),t("li",[t("a",{attrs:{href:"#commit-code-to-make-pull-request"}},[e._v("Commit Code To Make Pull Request")])]),t("li",[t("a",{attrs:{href:"#create-a-branch-of-a-pull-request"}},[e._v("Create a Branch of a Pull Request")])]),t("li",[t("a",{attrs:{href:"#delete-local-branch"}},[e._v("Delete Local Branch")])])])]),t("li",[t("a",{attrs:{href:"#working-with-docker-containers"}},[e._v("Working with Docker Containers")])]),t("li",[t("a",{attrs:{href:"#greenfield-api-development"}},[e._v("Greenfield API Development")])]),t("li",[t("a",{attrs:{href:"#working-with-the-database"}},[e._v("Working with the Database")])]),t("li",[t("a",{attrs:{href:"#questions"}},[e._v("Questions")])])])]),t("p"),e._v(" "),t("p",[e._v("This guide will help you set up your developer environment to prepare you for later contributions to the BTCPay Server repositories. A variety of beginner tools are used in the guide below to help you get started with development. Once you understand the general setup process, feel free to use any tools that you like.")]),e._v(" "),t("p",[e._v("If you are looking for how to make a simple code change such as fixing a typo or copy change, check out the simplified "),t("RouterLink",{attrs:{to:"/Contribute/WriteSoftware/"}},[e._v("Write Software")]),e._v(" tutorial instead. If you are an advanced developer with a local environment already set up for development, you can skip ahead to the "),t("RouterLink",{attrs:{to:"/Development/LocalDevelopment/"}},[e._v("LocalDevelopment")]),e._v(" documentation.")],1),e._v(" "),t("h2",{attrs:{id:"developer-resources"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#developer-resources"}},[e._v("#")]),e._v(" Developer Resources")]),e._v(" "),t("ul",[t("li",[t("a",{attrs:{href:"https://docs.github.com/",target:"_blank",rel:"noopener noreferrer"}},[e._v("Github Docs"),t("OutboundLink")],1)]),e._v(" "),t("li",[t("RouterLink",{attrs:{to:"/Development/LocalDevelopment/"}},[e._v("BTCPay Commands and Concepts")])],1),e._v(" "),t("li",[t("RouterLink",{attrs:{to:"/Development/LocalDevelopment/#videos"}},[e._v("Environment Setup Videos (Linux, Mac, Windows)")])],1)]),e._v(" "),t("h2",{attrs:{id:"windows-setup-software"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#windows-setup-software"}},[e._v("#")]),e._v(" Windows Setup Software")]),e._v(" "),t("p",[e._v("Software to install to follow this guide:")]),e._v(" "),t("ol",[t("li",[t("a",{attrs:{href:"https://visualstudio.microsoft.com/downloads/",target:"_blank",rel:"noopener noreferrer"}},[e._v("Visual Studio Community Edition"),t("OutboundLink")],1)]),e._v(" "),t("li",[t("a",{attrs:{href:"https://dotnet.microsoft.com/en-us/download/dotnet/6.0",target:"_blank",rel:"noopener noreferrer"}},[e._v(".NET Core SDK 6.0+"),t("OutboundLink")],1)]),e._v(" "),t("li",[t("a",{attrs:{href:"https://www.docker.com/products/docker-desktop",target:"_blank",rel:"noopener noreferrer"}},[e._v("Docker Desktop"),t("OutboundLink")],1)]),e._v(" "),t("li",[e._v("PowerShell (included in Windows OS)")]),e._v(" "),t("li",[t("a",{attrs:{href:"https://gitforwindows.org/",target:"_blank",rel:"noopener noreferrer"}},[e._v("GitBash"),t("OutboundLink")],1)]),e._v(" "),t("li",[t("a",{attrs:{href:"https://desktop.github.com/",target:"_blank",rel:"noopener noreferrer"}},[e._v("GitHub Desktop"),t("OutboundLink")],1)]),e._v(" "),t("li",[t("a",{attrs:{href:"https://github.com/",target:"_blank",rel:"noopener noreferrer"}},[e._v("www.Github.com account"),t("OutboundLink")],1),e._v(" (sign up)")])]),e._v(" "),t("p",[e._v("Note: "),t("em",[e._v("This guide assumes installations in default locations. Take note if you have a different file directory structure.")])]),e._v(" "),t("h2",{attrs:{id:"git-setup"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#git-setup"}},[e._v("#")]),e._v(" Git Setup")]),e._v(" "),t("h3",{attrs:{id:"fork-btcpay-server-repository"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#fork-btcpay-server-repository"}},[e._v("#")]),e._v(" Fork BTCPay Server Repository")]),e._v(" "),t("ul",[t("li",[e._v("Open a web browser and login to your www.Github.com account.")]),e._v(" "),t("li",[e._v("Navigate to the "),t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver",target:"_blank",rel:"noopener noreferrer"}},[e._v("BTCPay Server Repository"),t("OutboundLink")],1),e._v(" and press the "),t("code",[e._v("Fork")]),e._v(" button to create your own copy of the BTCPay Server repository on Github.")]),e._v(" "),t("li",[e._v("Next open Github Desktop and login so that Github Desktop knows about your www.Github.com account and connects to it.")])]),e._v(" "),t("h3",{attrs:{id:"clone-btcpay-server-repository"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#clone-btcpay-server-repository"}},[e._v("#")]),e._v(" Clone BTCPay Server Repository")]),e._v(" "),t("ul",[t("li",[e._v("In GitHub Desktop, use the "),t("code",[e._v("Add")]),e._v(" button and see the option clone repository.")]),e._v(" "),t("li",[e._v("If you are using your www.Github.com credentials in GitHub Desktop, you will see your BTCPay Server repository that you just forked on www.Github.com. Select it and take note of the local path shown below. (by default it will be something like "),t("code",[e._v("C:\\Users\\SatoshisComputer\\Documents\\GitHub\\btcpayserver")]),e._v(" for clarity, lets call it our: "),t("em",[e._v("clone local path")]),e._v(") then press clone.")]),e._v(" "),t("li",[e._v("Now you will see the BTCPay Server repository has been cloned in your GitHub Desktop and you will be on the "),t("em",[e._v("master branch")]),e._v(".")])]),e._v(" "),t("h3",{attrs:{id:"create-a-development-feature-branch"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#create-a-development-feature-branch"}},[e._v("#")]),e._v(" Create a Development Feature Branch")]),e._v(" "),t("ul",[t("li",[e._v("Next we will practice working with our BTCPay Server repository that we just cloned to our computer using Github Desktop.")]),e._v(" "),t("li",[e._v("When developing, you may want to work on different features at once. To do that, we typically want to create multiple feature branches instead of making all changes to the master branch.")]),e._v(" "),t("li",[e._v("We're using GitBash and some Git commands, so open GitBash. (If you prefer to only use GitHub desktop instead of GitBash, you can create branches there instead.)")]),e._v(" "),t("li",[e._v("Once you have a GitBash terminal open, we need to change directory to our clone of BTCPay Server repository.")]),e._v(" "),t("li",[e._v("To do this, navigate to our "),t("em",[e._v("clone local path")]),e._v(" with the change directory command: "),t("code",[e._v("$ cd Documents/Github/btcpayserver")])]),e._v(" "),t("li",[e._v("You can see your clone of BTCPay Server is on the branch called "),t("code",[e._v("master")])]),e._v(" "),t("li",[e._v("Make a copy of your master branch to do some development on it, with the command: "),t("code",[e._v("$ git branch OurNewDevelopmentBranch")])]),e._v(" "),t("li",[e._v("Let's view all the branches we have now, with the command: "),t("code",[e._v("$ git branch")]),e._v(" you can see we have master and OurNewDevelopmentBranch")]),e._v(" "),t("li",[e._v("In Git, we now have a copy of our forked BTCPay Server repository (our clone). When we want to switch between branches (copies of our clone), we need to tell Git which branch our development code changes should be assigned to. We do this by checking out our branch, with the command: "),t("code",[e._v("$ git checkout OurNewDevelopmentBranch")])]),e._v(" "),t("li",[e._v("Now you are on OurNewDevelopmentBranch in GitBash.")]),e._v(" "),t("li",[e._v("Open your GitHub Desktop and you can see you are no longer on master and you are now on "),t("code",[e._v("OurNewDevelopmentBranch")])]),e._v(" "),t("li",[e._v("In the top menu in Github Desktop click: "),t("code",[e._v("Repository > Show In Explorer")]),e._v(" to see the location of the files.")])]),e._v(" "),t("h2",{attrs:{id:"local-btcpay-setup"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#local-btcpay-setup"}},[e._v("#")]),e._v(" Local BTCPay Setup")]),e._v(" "),t("h3",{attrs:{id:"bitcoin-regtest-network-setup"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#bitcoin-regtest-network-setup"}},[e._v("#")]),e._v(" Bitcoin Regtest Network Setup")]),e._v(" "),t("ul",[t("li",[e._v("For the next step make sure that you have Docker-Compose installed (included with Docker Desktop). Open a PowerShell terminal and navigate to your "),t("em",[e._v("clone local path")]),e._v(" and into the BTCPayServer.Tests directory with the command: "),t("code",[e._v("$ cd Documents/Github/btcpayserver/BTCPayServer.Tests")])]),e._v(" "),t("li",[e._v("The BTCPay Server.Tests project contains the docker files needed to run our docker commands that will start all the project dependencies and create a local Regtest network.")]),e._v(" "),t("li",[e._v("In Powershell, start the docker services with the command: "),t("code",[e._v("docker-compose up dev")]),e._v("(you must be in the BTCPay Server.Tests to run this command).")]),e._v(" "),t("li",[e._v("In your PowerShell terminal you will first see the necessary docker images being pulled, then containers being built. If the build is successful the containers will all show as done.")])]),e._v(" "),t("figure",[t("img",{attrs:{src:o(329),alt:"BTCPayServer.Tests powershell terminal",title:"BTCPayServer.Tests powershell terminal"}})]),e._v(" "),t("h3",{attrs:{id:"build-local-btcpay-server-in-browser-mode"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#build-local-btcpay-server-in-browser-mode"}},[e._v("#")]),e._v(" Build Local BTCPay Server in Browser Mode")]),e._v(" "),t("p",[e._v("If you don't want to do any coding and you simply want to create a local BTCPay Server for testing features in the interface, you can start a local BTCPay from the command line.")]),e._v(" "),t("p",[e._v("After building your "),t("a",{attrs:{href:"#bitcoin-regtest-network-setup"}},[e._v("regtest network")]),e._v(", navigate to your "),t("code",[e._v("btcpayserver\\BTCPayServer")]),e._v(" directory and run the following command:")]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[e._v("dotnet run --launch-profile Bitcoin\n")])])]),t("p",[e._v("Open a new browser and visit: "),t("a",{attrs:{href:"http://127.0.0.1:14142",target:"_blank",rel:"noopener noreferrer"}},[e._v("http://127.0.0.1:14142"),t("OutboundLink")],1)]),e._v(" "),t("h3",{attrs:{id:"visual-studio-setup"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#visual-studio-setup"}},[e._v("#")]),e._v(" Visual Studio Setup")]),e._v(" "),t("ul",[t("li",[e._v("Open a file explorer to the BTCPay Server repository folder. Without opening any of the folders shown, look for the "),t("code",[e._v("btcpayserver.sln")]),e._v(" item and right click it to "),t("code",[e._v("Open with > Visual Studio")]),e._v(". You may need to choose Open with > Choose another app ... and look for Visual Studio if you have never opened this kind of file before.")]),e._v(" "),t("li",[e._v("To get your Visual Studio set up choose "),t("code",[e._v("View > Solution Explorer")]),e._v(" from the top menu. In this solution explorer you will see all the BTCPay Server files and folders.")]),e._v(" "),t("li",[e._v("The top project is BTCPay Server, make sure it's in bold. If it isn't, right click it and choose Set as StartUp Project.")]),e._v(" "),t("li",[e._v("Your Visual Studio is now set up and ready.")])]),e._v(" "),t("figure",[t("img",{attrs:{src:o(330),alt:"VS Solution Explorer",title:"VS Solution Explorer"}})]),e._v(" "),t("h3",{attrs:{id:"build-local-btcpay-server-in-debug-mode"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#build-local-btcpay-server-in-debug-mode"}},[e._v("#")]),e._v(" Build Local BTCPay Server in Debug Mode")]),e._v(" "),t("ul",[t("li",[e._v("Back in Visual Studio, click: "),t("code",[e._v("Build > Build Solution")])]),e._v(" "),t("li",[e._v("In the output window, a successful build will look something like this: "),t("code",[e._v("========== Build: 6 succeeded, 0 failed, 0 up-to-date, 0 skipped ==========")])]),e._v(" "),t("li",[e._v("Next press "),t("code",[e._v("Debug > Start Debugging")])]),e._v(" "),t("li",[e._v("First a Visual Studio debug console will open which shows information about the status of your local BTCPay Server.")]),e._v(" "),t("li",[e._v("Next a local BTCPay Server will be created in a web browser, showing on the home page that it's in "),t("code",[e._v("REGTEST")]),e._v(" mode.")]),e._v(" "),t("li",[e._v("You now will have three windows to view: BTCPay Server browser session, our Visual Studio debug console and our BTCPay Server.Tests powershell terminal.")]),e._v(" "),t("li",[e._v("Register a new user in your BTCPay Server and see the registration event is shown in your Visual Studio debug console.")])]),e._v(" "),t("figure",[t("img",{attrs:{src:o(331),alt:"VS Debug Console",title:"VS Debug Console"}})]),e._v(" "),t("figure",[t("img",{attrs:{src:o(332),alt:"Local Regtest BTCPay",title:"Local Regtest BTCPay"}})]),e._v(" "),t("h3",{attrs:{id:"visual-studio-code-changes-in-your-local-btcpay-server"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#visual-studio-code-changes-in-your-local-btcpay-server"}},[e._v("#")]),e._v(" Visual Studio Code Changes In Your Local BTCPay Server")]),e._v(" "),t("ul",[t("li",[e._v("Make changes to code in Visual Studio (Ex: modify the "),t("code",[e._v("This store is ready to accept transactions, good job!")]),e._v(" text in the "),t("code",[e._v("~\\BTCPayServer\\Views\\UIStores\\Dashboard.cshtml")]),e._v(" file)")]),e._v(" "),t("li",[e._v("Refresh the page to see your text changes on the home page.")]),e._v(" "),t("li",[e._v("Some code changes require re-start of Debugging for changes to take effect.")]),e._v(" "),t("li",[e._v("Add breakpoints in Visual Studio and see those breakpoints get hit when you try to use a feature in your local BTCPay Server instance.")])]),e._v(" "),t("h2",{attrs:{id:"git-maintenance"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#git-maintenance"}},[e._v("#")]),e._v(" Git Maintenance")]),e._v(" "),t("h3",{attrs:{id:"sync-forked-btcpay-server-repository"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#sync-forked-btcpay-server-repository"}},[e._v("#")]),e._v(" Sync Forked BTCPay Server Repository")]),e._v(" "),t("ul",[t("li",[e._v("With many contributors adding code changes to the Master BTCPay Server Repository, sometimes your forked copy can fall behind, unless you merge new changes into your fork.")]),e._v(" "),t("li",[e._v("If you go to your Fork of BTCPay Server on www.Github.com you will see a message saying that your branch is behind by some commits. Example: "),t("code",[e._v("This branch is 32 commits behind btcpayserver:master")]),e._v(".")]),e._v(" "),t("li",[e._v("To update, you can use GitBash or simply use Github Desktop by clicking through the synchronization prompts.")]),e._v(" "),t("li",[e._v("Open a GitBash terminal and update your BTCPay Server repository with the following commands.")]),e._v(" "),t("li",[e._v("First always navigate to your "),t("em",[e._v("clone local path")]),e._v(" with the command: "),t("code",[e._v("$ cd Documents/Github/btcpayserver")]),e._v(" and make sure you are on "),t("code",[e._v("master")]),e._v(" branch.")])]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[e._v("$ "),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("git")]),e._v(" fetch upstream\n$ "),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("git")]),e._v(" merge upstream/master\n$ "),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("git")]),e._v(" commit "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-m")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("<")]),e._v("SomeCommitMessage"),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v(">")]),e._v("\n\nMessage prompt: "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("..")]),e._v(".your branch is ahead of origin master by "),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"X"')]),e._v(" commits"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("..")]),e._v(". use "),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("git")]),e._v(" push to publish"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("..")]),e._v(".\n\n$ "),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("git")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("add")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v(".")]),e._v("\n$ "),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("git")]),e._v(" push origin master\n")])])]),t("p",[e._v("If you see an error "),t("code",[e._v("fatal: 'upstream' does not appear to be a git repository")]),e._v(" when running "),t("code",[e._v("$ git fetch upstream")]),e._v(", you must first configure a remote that points to the upstream repository in Git. That is needed only once. Just run the following command while you are in your "),t("em",[e._v("clone local path")]),e._v(" .")]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[e._v("$ "),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("git")]),e._v(" remote "),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("add")]),e._v(" upstream https://github.com/btcpayserver/btcpayserver.git\n\n"),t("span",{pre:!0,attrs:{class:"token comment"}},[e._v("# check if the upstream repo is added succesfully")]),e._v("\n$ "),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("git")]),e._v(" remote "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-v")]),e._v("\n\n"),t("span",{pre:!0,attrs:{class:"token comment"}},[e._v("# you should see something like this:")]),e._v("\norigin\tYOUR_FORKED_GITHUB_REPO "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("(")]),e._v("fetch"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(")")]),e._v("\norigin\tYOUR_FORKED_GITHUB_REPO "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("(")]),e._v("push"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(")")]),e._v("\nupstream\thttps://github.com/btcpayserver/btcpayserver.git "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("(")]),e._v("fetch"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(")")]),e._v("\nupstream\thttps://github.com/btcpayserver/btcpayserver.git "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("(")]),e._v("push"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(")")]),e._v("\n")])])]),t("h3",{attrs:{id:"commit-code-to-make-pull-request"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#commit-code-to-make-pull-request"}},[e._v("#")]),e._v(" Commit Code To Make Pull Request")]),e._v(" "),t("ul",[t("li",[e._v("After you have made some code changes on a feature branch (Example: A feature branch called "),t("code",[e._v("Fix/BugBranch")]),e._v(") and you want to make a Pull Request to the BTCPay Server Repository. Open a GitBash terminal and navigate to your "),t("em",[e._v("clone local path")]),e._v(" with the command: "),t("code",[e._v("$ cd Documents/Github/btcpayserver")]),e._v(" and make sure you are on the "),t("strong",[e._v("correct branch")]),e._v(" that you want to commit and use git status to check the files changed are the ones you want to commit.")])]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[e._v("$ "),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("git")]),e._v(" status\n$ "),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("git")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("add")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v(".")]),e._v("\n$ "),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("git")]),e._v(" commit\n\nText Editor appears to "),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("add")]),e._v(" your commit message"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("..")]),e._v(".\nExample Commit Message: Fix bug "),t("span",{pre:!0,attrs:{class:"token keyword"}},[e._v("for")]),e._v(" update button\n\nAccept Changes: Ctrl + x\nSave Changes: Shift + y\nClose Editor with: Enter\n\n$ "),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("git")]),e._v(" push origin Fix/BugBranch\n")])])]),t("p",[e._v("See your new branch has been created on you www.Github.com BTCPay Server Fork, review changes and create Pull Request.")]),e._v(" "),t("h3",{attrs:{id:"create-a-branch-of-a-pull-request"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#create-a-branch-of-a-pull-request"}},[e._v("#")]),e._v(" Create a Branch of a Pull Request")]),e._v(" "),t("p",[e._v("A great way to contribute without having to be an advanced developer is by testing other contributor's pull requests. Manual testing is a great way to help other's and ensure that BTCPay Server code changes are working properly. Here is an example of how to make a branch of someone else's pull request, using this previous PoS Pull Request https://github.com/btcpayserver/btcpayserver/pull/454. Open a GitBash terminal and navigate to your "),t("em",[e._v("clone local path")]),e._v(" with the command: "),t("code",[e._v("$ cd Documents/Github/btcpayserver")]),e._v(" and use "),t("code",[e._v("git status")]),e._v(" to check you don't have any other staged commits (git status is clear).")]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[e._v("$ "),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("git")]),e._v(" status\n$ "),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("git")]),e._v(" fetch upstream pull/454/head:pos-new-design\n$ "),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("git")]),e._v(" branch "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("(")]),e._v("to your new testing branch called pos-new-design"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(")")]),e._v("\n")])])]),t("p",[e._v("Note: Be sure to change the /454/ pull request number to the number of the one you would like to test. You can typically leave /head: as is, and add the name of the pull request branch after it.")]),e._v(" "),t("h3",{attrs:{id:"delete-local-branch"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#delete-local-branch"}},[e._v("#")]),e._v(" Delete Local Branch")]),e._v(" "),t("p",[e._v("If you delete a branch on your forked BTCPay repository on Github.com, your local copy on your machine will still remain, unless you delete it:")]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[e._v("$ "),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("git")]),e._v(" checkout master\n$ "),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("git")]),e._v(" branch "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-D")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("<")]),e._v("branch name"),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v(">")]),e._v("\n")])])]),t("p",[e._v("Note: You can't delete a branch if you have it checked out, so checkout another branch like "),t("code",[e._v("master")]),e._v(" first, as shown in the example above.")]),e._v(" "),t("h2",{attrs:{id:"working-with-docker-containers"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#working-with-docker-containers"}},[e._v("#")]),e._v(" Working with Docker Containers")]),e._v(" "),t("p",[e._v("If you want to use Docker Commands when developing locally, you can run the following commands in the "),t("code",[e._v("BTCPayServer.Tests")]),e._v(" directory.")]),e._v(" "),t("ul",[t("li",[e._v("Show running containers "),t("code",[e._v("docker ps")])]),e._v(" "),t("li",[e._v("Show logs for a container "),t("code",[e._v("docker ps logs ")])]),e._v(" "),t("li",[e._v("Start Docker containers "),t("code",[e._v("docker-compose up dev")])]),e._v(" "),t("li",[e._v("Stop Docker containers "),t("code",[e._v("docker-compose down")])]),e._v(" "),t("li",[e._v("Destroy Docker containers "),t("code",[e._v("docker-compoose down --v")])])]),e._v(" "),t("h2",{attrs:{id:"greenfield-api-development"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#greenfield-api-development"}},[e._v("#")]),e._v(" Greenfield API Development")]),e._v(" "),t("p",[e._v("The BTCPay Greenfield API is "),t("RouterLink",{attrs:{to:"/FAQ/General/#how-can-i-use-the-btcpay-server-api"}},[e._v("currently being developed")]),e._v(". You can find a "),t("RouterLink",{attrs:{to:"/Development/GreenFieldExample/"}},[e._v("usage example here")]),e._v(". The official Greenfield "),t("a",{attrs:{href:"https://docs.btcpayserver.org/API/Greenfield/v1/",target:"_blank",rel:"noopener noreferrer"}},[e._v("API reference documentation"),t("OutboundLink")],1),e._v(" is available for developers who want to develop with the BTCPay REST API.")],1),e._v(" "),t("p",[e._v("Developers who would like to contribute to the Greenfield API should follow the "),t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver/blob/master/docs/greenfield-development.md",target:"_blank",rel:"noopener noreferrer"}},[e._v("developer guidelines"),t("OutboundLink")],1),e._v(" used by the BTCPay project for additions or modifications. If you feel these guidelines are not clear, consider discussing your ideas in the community chat (development channel) or "),t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver/issues/new/choose",target:"_blank",rel:"noopener noreferrer"}},[e._v("open a github issue"),t("OutboundLink")],1),e._v(" to discuss endpoint implementation ideas.")]),e._v(" "),t("h2",{attrs:{id:"working-with-the-database"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#working-with-the-database"}},[e._v("#")]),e._v(" Working with the Database")]),e._v(" "),t("p",[e._v("BTCPay uses a PostgreSQL database by default. During development you can easily connect to it. This is helpful if you want to view how data is saved, modify records or use it to find issues during development. You can use the free tool "),t("a",{attrs:{href:"https://www.pgadmin.org/download/",target:"_blank",rel:"noopener noreferrer"}},[e._v("PgAdmin4"),t("OutboundLink")],1),e._v(" to do this.")]),e._v(" "),t("p",[e._v("Start your BTCPay in your local environment and view your debug console to find your database connection details:")]),e._v(" "),t("figure",[t("img",{attrs:{src:o(333),alt:"PostgreSQL Configuration",title:"PostgreSQL Configuration"}})]),e._v(" "),t("p",[e._v("Next, open your PgAdmin and select: "),t("code",[e._v("Servers > Create > Server...")]),e._v(" to connect to your server. Provide a name for your server and provide your host connection details from your Visual Studio debug console:")]),e._v(" "),t("figure",[t("img",{attrs:{src:o(334),alt:"PgAdmin Connection",title:"PgAdmin Connection"}})]),e._v(" "),t("p",[e._v("Save to connect to your development btcpayserver database. In the btcpayserver database look for:\n"),t("code",[e._v("Schemas > public > Tables")]),e._v(" to see the tables which contain the BTCPay Server data.")]),e._v(" "),t("p",[e._v("As an example, you can see all the users registered to your development BTCPay by viewing the rows of the "),t("code",[e._v("AspNetUsers")]),e._v(" table. Try changing the username of a registered user in the database, then "),t("code",[e._v("Save Changes")]),e._v(" and "),t("code",[e._v("Refresh (F5)")]),e._v(". Now log into your BTCPay using the new username and original password.")]),e._v(" "),t("figure",[t("img",{attrs:{src:o(335),alt:"PgAdmin Edit",title:"PgAdmin Edit"}})]),e._v(" "),t("h2",{attrs:{id:"questions"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#questions"}},[e._v("#")]),e._v(" Questions")]),e._v(" "),t("p",[e._v("If you have questions about the BTCPay Server local development setup, you can join the "),t("a",{attrs:{href:"https://chat.btcpayserver.org/",target:"_blank",rel:"noopener noreferrer"}},[e._v("community chat"),t("OutboundLink")],1),e._v(". If you have questions about any of the other tools or commands, etc. it's likely you can find answers to your questions by doing a search on the internet or on "),t("a",{attrs:{href:"https://stackoverflow.com/",target:"_blank",rel:"noopener noreferrer"}},[e._v("StackOverflow"),t("OutboundLink")],1),e._v(".")])])}),[],!1,null,null,null);t.default=r.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[38],{329:function(e,t,o){e.exports=o.p+"assets/img/docker-compose-up-dev.82514a01.png"},330:function(e,t,o){e.exports=o.p+"assets/img/vs-solution-explorer.71213904.png"},331:function(e,t,o){e.exports=o.p+"assets/img/vs-debug-console.9b8e7386.png"},332:function(e,t,o){e.exports=o.p+"assets/img/dashboard-change.d3ce411b.jpg"},333:function(e,t){e.exports="data:image/png;base64,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"},334:function(e,t,o){e.exports=o.p+"assets/img/DB-Connect.f1650039.png"},335:function(e,t,o){e.exports=o.p+"assets/img/DB-Edit.54e91f2d.png"},715:function(e,t,o){"use strict";o.r(t);var a=o(10),r=Object(a.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"setup-developer-environment"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#setup-developer-environment"}},[e._v("#")]),e._v(" Setup Developer Environment")]),e._v(" "),t("p"),t("div",{staticClass:"table-of-contents"},[t("ul",[t("li",[t("a",{attrs:{href:"#developer-resources"}},[e._v("Developer Resources")])]),t("li",[t("a",{attrs:{href:"#windows-setup-software"}},[e._v("Windows Setup Software")])]),t("li",[t("a",{attrs:{href:"#git-setup"}},[e._v("Git Setup")]),t("ul",[t("li",[t("a",{attrs:{href:"#fork-btcpay-server-repository"}},[e._v("Fork BTCPay Server Repository")])]),t("li",[t("a",{attrs:{href:"#clone-btcpay-server-repository"}},[e._v("Clone BTCPay Server Repository")])]),t("li",[t("a",{attrs:{href:"#create-a-development-feature-branch"}},[e._v("Create a Development Feature Branch")])])])]),t("li",[t("a",{attrs:{href:"#local-btcpay-setup"}},[e._v("Local BTCPay Setup")]),t("ul",[t("li",[t("a",{attrs:{href:"#bitcoin-regtest-network-setup"}},[e._v("Bitcoin Regtest Network Setup")])]),t("li",[t("a",{attrs:{href:"#build-local-btcpay-server-in-browser-mode"}},[e._v("Build Local BTCPay Server in Browser Mode")])]),t("li",[t("a",{attrs:{href:"#visual-studio-setup"}},[e._v("Visual Studio Setup")])]),t("li",[t("a",{attrs:{href:"#build-local-btcpay-server-in-debug-mode"}},[e._v("Build Local BTCPay Server in Debug Mode")])]),t("li",[t("a",{attrs:{href:"#visual-studio-code-changes-in-your-local-btcpay-server"}},[e._v("Visual Studio Code Changes In Your Local BTCPay Server")])])])]),t("li",[t("a",{attrs:{href:"#git-maintenance"}},[e._v("Git Maintenance")]),t("ul",[t("li",[t("a",{attrs:{href:"#sync-forked-btcpay-server-repository"}},[e._v("Sync Forked BTCPay Server Repository")])]),t("li",[t("a",{attrs:{href:"#commit-code-to-make-pull-request"}},[e._v("Commit Code To Make Pull Request")])]),t("li",[t("a",{attrs:{href:"#create-a-branch-of-a-pull-request"}},[e._v("Create a Branch of a Pull Request")])]),t("li",[t("a",{attrs:{href:"#delete-local-branch"}},[e._v("Delete Local Branch")])])])]),t("li",[t("a",{attrs:{href:"#working-with-docker-containers"}},[e._v("Working with Docker Containers")])]),t("li",[t("a",{attrs:{href:"#greenfield-api-development"}},[e._v("Greenfield API Development")])]),t("li",[t("a",{attrs:{href:"#working-with-the-database"}},[e._v("Working with the Database")])]),t("li",[t("a",{attrs:{href:"#questions"}},[e._v("Questions")])])])]),t("p"),e._v(" "),t("p",[e._v("This guide will help you set up your developer environment to prepare you for later contributions to the BTCPay Server repositories. A variety of beginner tools are used in the guide below to help you get started with development. Once you understand the general setup process, feel free to use any tools that you like.")]),e._v(" "),t("p",[e._v("If you are looking for how to make a simple code change such as fixing a typo or copy change, check out the simplified "),t("RouterLink",{attrs:{to:"/Contribute/WriteSoftware/"}},[e._v("Write Software")]),e._v(" tutorial instead. If you are an advanced developer with a local environment already set up for development, you can skip ahead to the "),t("RouterLink",{attrs:{to:"/Development/LocalDevelopment/"}},[e._v("LocalDevelopment")]),e._v(" documentation.")],1),e._v(" "),t("h2",{attrs:{id:"developer-resources"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#developer-resources"}},[e._v("#")]),e._v(" Developer Resources")]),e._v(" "),t("ul",[t("li",[t("a",{attrs:{href:"https://docs.github.com/",target:"_blank",rel:"noopener noreferrer"}},[e._v("Github Docs"),t("OutboundLink")],1)]),e._v(" "),t("li",[t("RouterLink",{attrs:{to:"/Development/LocalDevelopment/"}},[e._v("BTCPay Commands and Concepts")])],1),e._v(" "),t("li",[t("RouterLink",{attrs:{to:"/Development/LocalDevelopment/#videos"}},[e._v("Environment Setup Videos (Linux, Mac, Windows)")])],1)]),e._v(" "),t("h2",{attrs:{id:"windows-setup-software"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#windows-setup-software"}},[e._v("#")]),e._v(" Windows Setup Software")]),e._v(" "),t("p",[e._v("Software to install to follow this guide:")]),e._v(" "),t("ol",[t("li",[t("a",{attrs:{href:"https://visualstudio.microsoft.com/downloads/",target:"_blank",rel:"noopener noreferrer"}},[e._v("Visual Studio Community Edition"),t("OutboundLink")],1)]),e._v(" "),t("li",[t("a",{attrs:{href:"https://dotnet.microsoft.com/en-us/download/dotnet/6.0",target:"_blank",rel:"noopener noreferrer"}},[e._v(".NET Core SDK 6.0+"),t("OutboundLink")],1)]),e._v(" "),t("li",[t("a",{attrs:{href:"https://www.docker.com/products/docker-desktop",target:"_blank",rel:"noopener noreferrer"}},[e._v("Docker Desktop"),t("OutboundLink")],1)]),e._v(" "),t("li",[e._v("PowerShell (included in Windows OS)")]),e._v(" "),t("li",[t("a",{attrs:{href:"https://gitforwindows.org/",target:"_blank",rel:"noopener noreferrer"}},[e._v("GitBash"),t("OutboundLink")],1)]),e._v(" "),t("li",[t("a",{attrs:{href:"https://desktop.github.com/",target:"_blank",rel:"noopener noreferrer"}},[e._v("GitHub Desktop"),t("OutboundLink")],1)]),e._v(" "),t("li",[t("a",{attrs:{href:"https://github.com/",target:"_blank",rel:"noopener noreferrer"}},[e._v("www.Github.com account"),t("OutboundLink")],1),e._v(" (sign up)")])]),e._v(" "),t("p",[e._v("Note: "),t("em",[e._v("This guide assumes installations in default locations. Take note if you have a different file directory structure.")])]),e._v(" "),t("h2",{attrs:{id:"git-setup"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#git-setup"}},[e._v("#")]),e._v(" Git Setup")]),e._v(" "),t("h3",{attrs:{id:"fork-btcpay-server-repository"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#fork-btcpay-server-repository"}},[e._v("#")]),e._v(" Fork BTCPay Server Repository")]),e._v(" "),t("ul",[t("li",[e._v("Open a web browser and login to your www.Github.com account.")]),e._v(" "),t("li",[e._v("Navigate to the "),t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver",target:"_blank",rel:"noopener noreferrer"}},[e._v("BTCPay Server Repository"),t("OutboundLink")],1),e._v(" and press the "),t("code",[e._v("Fork")]),e._v(" button to create your own copy of the BTCPay Server repository on Github.")]),e._v(" "),t("li",[e._v("Next open Github Desktop and login so that Github Desktop knows about your www.Github.com account and connects to it.")])]),e._v(" "),t("h3",{attrs:{id:"clone-btcpay-server-repository"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#clone-btcpay-server-repository"}},[e._v("#")]),e._v(" Clone BTCPay Server Repository")]),e._v(" "),t("ul",[t("li",[e._v("In GitHub Desktop, use the "),t("code",[e._v("Add")]),e._v(" button and see the option clone repository.")]),e._v(" "),t("li",[e._v("If you are using your www.Github.com credentials in GitHub Desktop, you will see your BTCPay Server repository that you just forked on www.Github.com. Select it and take note of the local path shown below. (by default it will be something like "),t("code",[e._v("C:\\Users\\SatoshisComputer\\Documents\\GitHub\\btcpayserver")]),e._v(" for clarity, lets call it our: "),t("em",[e._v("clone local path")]),e._v(") then press clone.")]),e._v(" "),t("li",[e._v("Now you will see the BTCPay Server repository has been cloned in your GitHub Desktop and you will be on the "),t("em",[e._v("master branch")]),e._v(".")])]),e._v(" "),t("h3",{attrs:{id:"create-a-development-feature-branch"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#create-a-development-feature-branch"}},[e._v("#")]),e._v(" Create a Development Feature Branch")]),e._v(" "),t("ul",[t("li",[e._v("Next we will practice working with our BTCPay Server repository that we just cloned to our computer using Github Desktop.")]),e._v(" "),t("li",[e._v("When developing, you may want to work on different features at once. To do that, we typically want to create multiple feature branches instead of making all changes to the master branch.")]),e._v(" "),t("li",[e._v("We're using GitBash and some Git commands, so open GitBash. (If you prefer to only use GitHub desktop instead of GitBash, you can create branches there instead.)")]),e._v(" "),t("li",[e._v("Once you have a GitBash terminal open, we need to change directory to our clone of BTCPay Server repository.")]),e._v(" "),t("li",[e._v("To do this, navigate to our "),t("em",[e._v("clone local path")]),e._v(" with the change directory command: "),t("code",[e._v("$ cd Documents/Github/btcpayserver")])]),e._v(" "),t("li",[e._v("You can see your clone of BTCPay Server is on the branch called "),t("code",[e._v("master")])]),e._v(" "),t("li",[e._v("Make a copy of your master branch to do some development on it, with the command: "),t("code",[e._v("$ git branch OurNewDevelopmentBranch")])]),e._v(" "),t("li",[e._v("Let's view all the branches we have now, with the command: "),t("code",[e._v("$ git branch")]),e._v(" you can see we have master and OurNewDevelopmentBranch")]),e._v(" "),t("li",[e._v("In Git, we now have a copy of our forked BTCPay Server repository (our clone). When we want to switch between branches (copies of our clone), we need to tell Git which branch our development code changes should be assigned to. We do this by checking out our branch, with the command: "),t("code",[e._v("$ git checkout OurNewDevelopmentBranch")])]),e._v(" "),t("li",[e._v("Now you are on OurNewDevelopmentBranch in GitBash.")]),e._v(" "),t("li",[e._v("Open your GitHub Desktop and you can see you are no longer on master and you are now on "),t("code",[e._v("OurNewDevelopmentBranch")])]),e._v(" "),t("li",[e._v("In the top menu in Github Desktop click: "),t("code",[e._v("Repository > Show In Explorer")]),e._v(" to see the location of the files.")])]),e._v(" "),t("h2",{attrs:{id:"local-btcpay-setup"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#local-btcpay-setup"}},[e._v("#")]),e._v(" Local BTCPay Setup")]),e._v(" "),t("h3",{attrs:{id:"bitcoin-regtest-network-setup"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#bitcoin-regtest-network-setup"}},[e._v("#")]),e._v(" Bitcoin Regtest Network Setup")]),e._v(" "),t("ul",[t("li",[e._v("For the next step make sure that you have Docker-Compose installed (included with Docker Desktop). Open a PowerShell terminal and navigate to your "),t("em",[e._v("clone local path")]),e._v(" and into the BTCPayServer.Tests directory with the command: "),t("code",[e._v("$ cd Documents/Github/btcpayserver/BTCPayServer.Tests")])]),e._v(" "),t("li",[e._v("The BTCPay Server.Tests project contains the docker files needed to run our docker commands that will start all the project dependencies and create a local Regtest network.")]),e._v(" "),t("li",[e._v("In Powershell, start the docker services with the command: "),t("code",[e._v("docker-compose up dev")]),e._v("(you must be in the BTCPay Server.Tests to run this command).")]),e._v(" "),t("li",[e._v("In your PowerShell terminal you will first see the necessary docker images being pulled, then containers being built. If the build is successful the containers will all show as done.")])]),e._v(" "),t("figure",[t("img",{attrs:{src:o(329),alt:"BTCPayServer.Tests powershell terminal",title:"BTCPayServer.Tests powershell terminal"}})]),e._v(" "),t("h3",{attrs:{id:"build-local-btcpay-server-in-browser-mode"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#build-local-btcpay-server-in-browser-mode"}},[e._v("#")]),e._v(" Build Local BTCPay Server in Browser Mode")]),e._v(" "),t("p",[e._v("If you don't want to do any coding and you simply want to create a local BTCPay Server for testing features in the interface, you can start a local BTCPay from the command line.")]),e._v(" "),t("p",[e._v("After building your "),t("a",{attrs:{href:"#bitcoin-regtest-network-setup"}},[e._v("regtest network")]),e._v(", navigate to your "),t("code",[e._v("btcpayserver\\BTCPayServer")]),e._v(" directory and run the following command:")]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[e._v("dotnet run --launch-profile Bitcoin\n")])])]),t("p",[e._v("Open a new browser and visit: "),t("a",{attrs:{href:"http://127.0.0.1:14142",target:"_blank",rel:"noopener noreferrer"}},[e._v("http://127.0.0.1:14142"),t("OutboundLink")],1)]),e._v(" "),t("h3",{attrs:{id:"visual-studio-setup"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#visual-studio-setup"}},[e._v("#")]),e._v(" Visual Studio Setup")]),e._v(" "),t("ul",[t("li",[e._v("Open a file explorer to the BTCPay Server repository folder. Without opening any of the folders shown, look for the "),t("code",[e._v("btcpayserver.sln")]),e._v(" item and right click it to "),t("code",[e._v("Open with > Visual Studio")]),e._v(". You may need to choose Open with > Choose another app ... and look for Visual Studio if you have never opened this kind of file before.")]),e._v(" "),t("li",[e._v("To get your Visual Studio set up choose "),t("code",[e._v("View > Solution Explorer")]),e._v(" from the top menu. In this solution explorer you will see all the BTCPay Server files and folders.")]),e._v(" "),t("li",[e._v("The top project is BTCPay Server, make sure it's in bold. If it isn't, right click it and choose Set as StartUp Project.")]),e._v(" "),t("li",[e._v("Your Visual Studio is now set up and ready.")])]),e._v(" "),t("figure",[t("img",{attrs:{src:o(330),alt:"VS Solution Explorer",title:"VS Solution Explorer"}})]),e._v(" "),t("h3",{attrs:{id:"build-local-btcpay-server-in-debug-mode"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#build-local-btcpay-server-in-debug-mode"}},[e._v("#")]),e._v(" Build Local BTCPay Server in Debug Mode")]),e._v(" "),t("ul",[t("li",[e._v("Back in Visual Studio, click: "),t("code",[e._v("Build > Build Solution")])]),e._v(" "),t("li",[e._v("In the output window, a successful build will look something like this: "),t("code",[e._v("========== Build: 6 succeeded, 0 failed, 0 up-to-date, 0 skipped ==========")])]),e._v(" "),t("li",[e._v("Next press "),t("code",[e._v("Debug > Start Debugging")])]),e._v(" "),t("li",[e._v("First a Visual Studio debug console will open which shows information about the status of your local BTCPay Server.")]),e._v(" "),t("li",[e._v("Next a local BTCPay Server will be created in a web browser, showing on the home page that it's in "),t("code",[e._v("REGTEST")]),e._v(" mode.")]),e._v(" "),t("li",[e._v("You now will have three windows to view: BTCPay Server browser session, our Visual Studio debug console and our BTCPay Server.Tests powershell terminal.")]),e._v(" "),t("li",[e._v("Register a new user in your BTCPay Server and see the registration event is shown in your Visual Studio debug console.")])]),e._v(" "),t("figure",[t("img",{attrs:{src:o(331),alt:"VS Debug Console",title:"VS Debug Console"}})]),e._v(" "),t("figure",[t("img",{attrs:{src:o(332),alt:"Local Regtest BTCPay",title:"Local Regtest BTCPay"}})]),e._v(" "),t("h3",{attrs:{id:"visual-studio-code-changes-in-your-local-btcpay-server"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#visual-studio-code-changes-in-your-local-btcpay-server"}},[e._v("#")]),e._v(" Visual Studio Code Changes In Your Local BTCPay Server")]),e._v(" "),t("ul",[t("li",[e._v("Make changes to code in Visual Studio (Ex: modify the "),t("code",[e._v("This store is ready to accept transactions, good job!")]),e._v(" text in the "),t("code",[e._v("~\\BTCPayServer\\Views\\UIStores\\Dashboard.cshtml")]),e._v(" file)")]),e._v(" "),t("li",[e._v("Refresh the page to see your text changes on the home page.")]),e._v(" "),t("li",[e._v("Some code changes require re-start of Debugging for changes to take effect.")]),e._v(" "),t("li",[e._v("Add breakpoints in Visual Studio and see those breakpoints get hit when you try to use a feature in your local BTCPay Server instance.")])]),e._v(" "),t("h2",{attrs:{id:"git-maintenance"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#git-maintenance"}},[e._v("#")]),e._v(" Git Maintenance")]),e._v(" "),t("h3",{attrs:{id:"sync-forked-btcpay-server-repository"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#sync-forked-btcpay-server-repository"}},[e._v("#")]),e._v(" Sync Forked BTCPay Server Repository")]),e._v(" "),t("ul",[t("li",[e._v("With many contributors adding code changes to the Master BTCPay Server Repository, sometimes your forked copy can fall behind, unless you merge new changes into your fork.")]),e._v(" "),t("li",[e._v("If you go to your Fork of BTCPay Server on www.Github.com you will see a message saying that your branch is behind by some commits. Example: "),t("code",[e._v("This branch is 32 commits behind btcpayserver:master")]),e._v(".")]),e._v(" "),t("li",[e._v("To update, you can use GitBash or simply use Github Desktop by clicking through the synchronization prompts.")]),e._v(" "),t("li",[e._v("Open a GitBash terminal and update your BTCPay Server repository with the following commands.")]),e._v(" "),t("li",[e._v("First always navigate to your "),t("em",[e._v("clone local path")]),e._v(" with the command: "),t("code",[e._v("$ cd Documents/Github/btcpayserver")]),e._v(" and make sure you are on "),t("code",[e._v("master")]),e._v(" branch.")])]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[e._v("$ "),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("git")]),e._v(" fetch upstream\n$ "),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("git")]),e._v(" merge upstream/master\n$ "),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("git")]),e._v(" commit "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-m")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("<")]),e._v("SomeCommitMessage"),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v(">")]),e._v("\n\nMessage prompt: "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("..")]),e._v(".your branch is ahead of origin master by "),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"X"')]),e._v(" commits"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("..")]),e._v(". use "),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("git")]),e._v(" push to publish"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("..")]),e._v(".\n\n$ "),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("git")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("add")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v(".")]),e._v("\n$ "),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("git")]),e._v(" push origin master\n")])])]),t("p",[e._v("If you see an error "),t("code",[e._v("fatal: 'upstream' does not appear to be a git repository")]),e._v(" when running "),t("code",[e._v("$ git fetch upstream")]),e._v(", you must first configure a remote that points to the upstream repository in Git. That is needed only once. Just run the following command while you are in your "),t("em",[e._v("clone local path")]),e._v(" .")]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[e._v("$ "),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("git")]),e._v(" remote "),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("add")]),e._v(" upstream https://github.com/btcpayserver/btcpayserver.git\n\n"),t("span",{pre:!0,attrs:{class:"token comment"}},[e._v("# check if the upstream repo is added succesfully")]),e._v("\n$ "),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("git")]),e._v(" remote "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-v")]),e._v("\n\n"),t("span",{pre:!0,attrs:{class:"token comment"}},[e._v("# you should see something like this:")]),e._v("\norigin\tYOUR_FORKED_GITHUB_REPO "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("(")]),e._v("fetch"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(")")]),e._v("\norigin\tYOUR_FORKED_GITHUB_REPO "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("(")]),e._v("push"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(")")]),e._v("\nupstream\thttps://github.com/btcpayserver/btcpayserver.git "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("(")]),e._v("fetch"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(")")]),e._v("\nupstream\thttps://github.com/btcpayserver/btcpayserver.git "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("(")]),e._v("push"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(")")]),e._v("\n")])])]),t("h3",{attrs:{id:"commit-code-to-make-pull-request"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#commit-code-to-make-pull-request"}},[e._v("#")]),e._v(" Commit Code To Make Pull Request")]),e._v(" "),t("ul",[t("li",[e._v("After you have made some code changes on a feature branch (Example: A feature branch called "),t("code",[e._v("Fix/BugBranch")]),e._v(") and you want to make a Pull Request to the BTCPay Server Repository. Open a GitBash terminal and navigate to your "),t("em",[e._v("clone local path")]),e._v(" with the command: "),t("code",[e._v("$ cd Documents/Github/btcpayserver")]),e._v(" and make sure you are on the "),t("strong",[e._v("correct branch")]),e._v(" that you want to commit and use git status to check the files changed are the ones you want to commit.")])]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[e._v("$ "),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("git")]),e._v(" status\n$ "),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("git")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("add")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v(".")]),e._v("\n$ "),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("git")]),e._v(" commit\n\nText Editor appears to "),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("add")]),e._v(" your commit message"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("..")]),e._v(".\nExample Commit Message: Fix bug "),t("span",{pre:!0,attrs:{class:"token keyword"}},[e._v("for")]),e._v(" update button\n\nAccept Changes: Ctrl + x\nSave Changes: Shift + y\nClose Editor with: Enter\n\n$ "),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("git")]),e._v(" push origin Fix/BugBranch\n")])])]),t("p",[e._v("See your new branch has been created on you www.Github.com BTCPay Server Fork, review changes and create Pull Request.")]),e._v(" "),t("h3",{attrs:{id:"create-a-branch-of-a-pull-request"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#create-a-branch-of-a-pull-request"}},[e._v("#")]),e._v(" Create a Branch of a Pull Request")]),e._v(" "),t("p",[e._v("A great way to contribute without having to be an advanced developer is by testing other contributor's pull requests. Manual testing is a great way to help other's and ensure that BTCPay Server code changes are working properly. Here is an example of how to make a branch of someone else's pull request, using this previous PoS Pull Request https://github.com/btcpayserver/btcpayserver/pull/454. Open a GitBash terminal and navigate to your "),t("em",[e._v("clone local path")]),e._v(" with the command: "),t("code",[e._v("$ cd Documents/Github/btcpayserver")]),e._v(" and use "),t("code",[e._v("git status")]),e._v(" to check you don't have any other staged commits (git status is clear).")]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[e._v("$ "),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("git")]),e._v(" status\n$ "),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("git")]),e._v(" fetch upstream pull/454/head:pos-new-design\n$ "),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("git")]),e._v(" branch "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("(")]),e._v("to your new testing branch called pos-new-design"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(")")]),e._v("\n")])])]),t("p",[e._v("Note: Be sure to change the /454/ pull request number to the number of the one you would like to test. You can typically leave /head: as is, and add the name of the pull request branch after it.")]),e._v(" "),t("h3",{attrs:{id:"delete-local-branch"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#delete-local-branch"}},[e._v("#")]),e._v(" Delete Local Branch")]),e._v(" "),t("p",[e._v("If you delete a branch on your forked BTCPay repository on Github.com, your local copy on your machine will still remain, unless you delete it:")]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[e._v("$ "),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("git")]),e._v(" checkout master\n$ "),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("git")]),e._v(" branch "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-D")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("<")]),e._v("branch name"),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v(">")]),e._v("\n")])])]),t("p",[e._v("Note: You can't delete a branch if you have it checked out, so checkout another branch like "),t("code",[e._v("master")]),e._v(" first, as shown in the example above.")]),e._v(" "),t("h2",{attrs:{id:"working-with-docker-containers"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#working-with-docker-containers"}},[e._v("#")]),e._v(" Working with Docker Containers")]),e._v(" "),t("p",[e._v("If you want to use Docker Commands when developing locally, you can run the following commands in the "),t("code",[e._v("BTCPayServer.Tests")]),e._v(" directory.")]),e._v(" "),t("ul",[t("li",[e._v("Show running containers "),t("code",[e._v("docker ps")])]),e._v(" "),t("li",[e._v("Show logs for a container "),t("code",[e._v("docker ps logs ")])]),e._v(" "),t("li",[e._v("Start Docker containers "),t("code",[e._v("docker-compose up dev")])]),e._v(" "),t("li",[e._v("Stop Docker containers "),t("code",[e._v("docker-compose down")])]),e._v(" "),t("li",[e._v("Destroy Docker containers "),t("code",[e._v("docker-compoose down --v")])])]),e._v(" "),t("h2",{attrs:{id:"greenfield-api-development"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#greenfield-api-development"}},[e._v("#")]),e._v(" Greenfield API Development")]),e._v(" "),t("p",[e._v("The BTCPay Greenfield API is "),t("RouterLink",{attrs:{to:"/FAQ/General/#how-can-i-use-the-btcpay-server-api"}},[e._v("currently being developed")]),e._v(". You can find a "),t("RouterLink",{attrs:{to:"/Development/GreenFieldExample/"}},[e._v("usage example here")]),e._v(". The official Greenfield "),t("a",{attrs:{href:"https://docs.btcpayserver.org/API/Greenfield/v1/",target:"_blank",rel:"noopener noreferrer"}},[e._v("API reference documentation"),t("OutboundLink")],1),e._v(" is available for developers who want to develop with the BTCPay REST API.")],1),e._v(" "),t("p",[e._v("Developers who would like to contribute to the Greenfield API should follow the "),t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver/blob/master/docs/greenfield-development.md",target:"_blank",rel:"noopener noreferrer"}},[e._v("developer guidelines"),t("OutboundLink")],1),e._v(" used by the BTCPay project for additions or modifications. If you feel these guidelines are not clear, consider discussing your ideas in the community chat (development channel) or "),t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver/issues/new/choose",target:"_blank",rel:"noopener noreferrer"}},[e._v("open a github issue"),t("OutboundLink")],1),e._v(" to discuss endpoint implementation ideas.")]),e._v(" "),t("h2",{attrs:{id:"working-with-the-database"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#working-with-the-database"}},[e._v("#")]),e._v(" Working with the Database")]),e._v(" "),t("p",[e._v("BTCPay uses a PostgreSQL database by default. During development you can easily connect to it. This is helpful if you want to view how data is saved, modify records or use it to find issues during development. You can use the free tool "),t("a",{attrs:{href:"https://www.pgadmin.org/download/",target:"_blank",rel:"noopener noreferrer"}},[e._v("PgAdmin4"),t("OutboundLink")],1),e._v(" to do this.")]),e._v(" "),t("p",[e._v("Start your BTCPay in your local environment and view your debug console to find your database connection details:")]),e._v(" "),t("figure",[t("img",{attrs:{src:o(333),alt:"PostgreSQL Configuration",title:"PostgreSQL Configuration"}})]),e._v(" "),t("p",[e._v("Next, open your PgAdmin and select: "),t("code",[e._v("Servers > Create > Server...")]),e._v(" to connect to your server. Provide a name for your server and provide your host connection details from your Visual Studio debug console:")]),e._v(" "),t("figure",[t("img",{attrs:{src:o(334),alt:"PgAdmin Connection",title:"PgAdmin Connection"}})]),e._v(" "),t("p",[e._v("Save to connect to your development btcpayserver database. In the btcpayserver database look for:\n"),t("code",[e._v("Schemas > public > Tables")]),e._v(" to see the tables which contain the BTCPay Server data.")]),e._v(" "),t("p",[e._v("As an example, you can see all the users registered to your development BTCPay by viewing the rows of the "),t("code",[e._v("AspNetUsers")]),e._v(" table. Try changing the username of a registered user in the database, then "),t("code",[e._v("Save Changes")]),e._v(" and "),t("code",[e._v("Refresh (F5)")]),e._v(". Now log into your BTCPay using the new username and original password.")]),e._v(" "),t("figure",[t("img",{attrs:{src:o(335),alt:"PgAdmin Edit",title:"PgAdmin Edit"}})]),e._v(" "),t("h2",{attrs:{id:"questions"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#questions"}},[e._v("#")]),e._v(" Questions")]),e._v(" "),t("p",[e._v("If you have questions about the BTCPay Server local development setup, you can join the "),t("a",{attrs:{href:"https://chat.btcpayserver.org/",target:"_blank",rel:"noopener noreferrer"}},[e._v("community chat"),t("OutboundLink")],1),e._v(". If you have questions about any of the other tools or commands, etc. it's likely you can find answers to your questions by doing a search on the internet or on "),t("a",{attrs:{href:"https://stackoverflow.com/",target:"_blank",rel:"noopener noreferrer"}},[e._v("StackOverflow"),t("OutboundLink")],1),e._v(".")])])}),[],!1,null,null,null);t.default=r.exports}}]); \ No newline at end of file diff --git a/assets/js/39.2bb60463.js b/assets/js/39.3c178189.js similarity index 97% rename from assets/js/39.2bb60463.js rename to assets/js/39.3c178189.js index ad4103e0ee..d1f1f25390 100644 --- a/assets/js/39.2bb60463.js +++ b/assets/js/39.3c178189.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[39],{444:function(t,e,a){t.exports=a.p+"assets/img/BTCPayPayButtonDynamic2.ade3500b.png"},445:function(t,e,a){t.exports=a.p+"assets/img/BTCPayPayButtonDynamic.5ea88bef.png"},446:function(t,e,a){t.exports=a.p+"assets/img/domainmapping1.6d8e57ba.png"},447:function(t,e,a){t.exports=a.p+"assets/img/domainmapping2.96812b62.png"},448:function(t,e,a){t.exports=a.p+"assets/img/AppRedirect.21368bcf.png"},449:function(t,e,a){t.exports=a.p+"assets/img/CrowdfundingWoo.372a5115.gif"},450:function(t,e,a){t.exports=a.p+"assets/img/CrowdfundCodeEmbed.11ca2ead.png"},774:function(t,e,a){"use strict";a.r(e);var s=a(10),n=Object(s.a)({},(function(){var t=this,e=t._self._c;return e("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[e("h1",{attrs:{id:"apps-faq"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#apps-faq"}},[t._v("#")]),t._v(" Apps FAQ")]),t._v(" "),e("p",[t._v("This document covers frequently asked questions about the BTCPay Server Apps.")]),t._v(" "),e("p"),e("div",{staticClass:"table-of-contents"},[e("ul",[e("li",[e("a",{attrs:{href:"#what-are-the-apps-in-btcpay"}},[t._v("What are the Apps in BTCPay?")])]),e("li",[e("a",{attrs:{href:"#is-there-a-limit-on-the-number-of-apps-i-can-create"}},[t._v("Is there a limit on the number of Apps I can create?")])]),e("li",[e("a",{attrs:{href:"#is-there-a-point-of-sale-feature-in-btcpay"}},[t._v("Is there a Point of Sale feature in BTCPay?")])]),e("li",[e("a",{attrs:{href:"#how-can-i-use-btcpay-in-a-physical-store"}},[t._v("How can I use BTCPay in a physical store?")])]),e("li",[e("a",{attrs:{href:"#how-to-customize-the-appearance-of-point-of-sale-app-in-btcpay"}},[t._v("How to customize the appearance of Point of Sale App in BTCPay")])]),e("li",[e("a",{attrs:{href:"#what-is-a-payment-button"}},[t._v("What is a Payment Button?")])]),e("li",[e("a",{attrs:{href:"#how-to-create-a-pay-button-with-a-custom-amount"}},[t._v("How to create a Pay Button with a custom amount?")])]),e("li",[e("a",{attrs:{href:"#how-to-map-a-domain-name-to-an-app"}},[t._v("How to map a domain name to an app?")])]),e("li",[e("a",{attrs:{href:"#how-to-redirect-to-another-site-after-payment"}},[t._v("How to redirect to another site after payment?")])]),e("li",[e("a",{attrs:{href:"#how-to-integrate-woocommerce-store-into-a-btcpay-crowdfund-app"}},[t._v("How to integrate WooCommerce Store into a BTCPay Crowdfund app?")]),e("ul",[e("li",[e("a",{attrs:{href:"#requirements"}},[t._v("Requirements")])]),e("li",[e("a",{attrs:{href:"#instructions"}},[t._v("Instructions")])])])])])]),e("p"),t._v(" "),e("h2",{attrs:{id:"what-are-the-apps-in-btcpay"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#what-are-the-apps-in-btcpay"}},[t._v("#")]),t._v(" What are the Apps in BTCPay?")]),t._v(" "),e("p",[t._v("Apps are features you can use to expand the use case of your BTCPay. See the "),e("RouterLink",{attrs:{to:"/Apps/"}},[t._v("apps doc")]),t._v(" for more information.")],1),t._v(" "),e("h2",{attrs:{id:"is-there-a-limit-on-the-number-of-apps-i-can-create"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#is-there-a-limit-on-the-number-of-apps-i-can-create"}},[t._v("#")]),t._v(" Is there a limit on the number of Apps I can create?")]),t._v(" "),e("p",[t._v("Apps are added on the store level. To create one, you need to have a store already setup. There is no limit to the number of apps that can be assigned to a store.")]),t._v(" "),e("h2",{attrs:{id:"is-there-a-point-of-sale-feature-in-btcpay"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#is-there-a-point-of-sale-feature-in-btcpay"}},[t._v("#")]),t._v(" Is there a Point of Sale feature in BTCPay?")]),t._v(" "),e("p",[t._v("Yes. Please read our "),e("RouterLink",{attrs:{to:"/WhatsNext/#creating-the-pay-button"}},[t._v("guide on creating the POS app")]),t._v(".")],1),t._v(" "),e("h2",{attrs:{id:"how-can-i-use-btcpay-in-a-physical-store"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#how-can-i-use-btcpay-in-a-physical-store"}},[t._v("#")]),t._v(" How can I use BTCPay in a physical store?")]),t._v(" "),e("p",[t._v("You can use our Point of Sale (PoS) app. When you create a PoS app within BTCPay Server, it will be publicly accessible via a URL where checkout buttons for products you’ve created for your PoS will be displayed.\nTo have a physical PoS, the easiest solution (currently) is to create a PoS App in BTCPay and display it on any web device such as a phone, tablet or pc.")]),t._v(" "),e("p",[t._v("Please follow our detailed guide on how to use our "),e("a",{attrs:{href:"https://blog.btcpayserver.org/bitcoin-pos/",target:"_blank",rel:"noopener noreferrer"}},[t._v("PoS App on a mobile device"),e("OutboundLink")],1),t._v(". Also note that Section 2.3 Connecting a Wallet is covered much more in-depth here in the "),e("RouterLink",{attrs:{to:"/WalletSetup/"}},[t._v("wallet section")]),t._v(".")],1),t._v(" "),e("h2",{attrs:{id:"how-to-customize-the-appearance-of-point-of-sale-app-in-btcpay"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#how-to-customize-the-appearance-of-point-of-sale-app-in-btcpay"}},[t._v("#")]),t._v(" How to customize the appearance of Point of Sale App in BTCPay")]),t._v(" "),e("p",[t._v("It is very easy to customize the look of the Point of Sale app. "),e("RouterLink",{attrs:{to:"/Development/Theme/"}},[t._v("Follow this guide")]),t._v(" to learn how to change the theme.")],1),t._v(" "),e("h2",{attrs:{id:"what-is-a-payment-button"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#what-is-a-payment-button"}},[t._v("#")]),t._v(" What is a Payment Button?")]),t._v(" "),e("p",[t._v("The Payment Button is a simple and customizable HTML button you can create and embed into your website. To create a payment button, "),e("RouterLink",{attrs:{to:"/WhatsNext/#creating-the-point-of-sale-app"}},[t._v("follow this guide")]),t._v(".")],1),t._v(" "),e("h2",{attrs:{id:"how-to-create-a-pay-button-with-a-custom-amount"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#how-to-create-a-pay-button-with-a-custom-amount"}},[t._v("#")]),t._v(" How to create a Pay Button with a custom amount?")]),t._v(" "),e("p",[t._v("The BTCPay Server Pay Button which can be found in Store Settings > Pay Button, currently does not support custom amounts.\nHowever, you can use a work-around:")]),t._v(" "),e("ul",[e("li",[e("RouterLink",{attrs:{to:"/WhatsNext/#creating-the-point-of-sale-app"}},[t._v("Create Point of sale app")])],1),t._v(" "),e("li",[t._v("Enable "),e("code",[t._v("user can input a custom amount")]),t._v(" field")]),t._v(" "),e("li",[t._v("Remove all the products from the automatically generated template.")]),t._v(" "),e("li",[t._v("Save settings.")]),t._v(" "),e("li",[t._v("Click on the "),e("code",[t._v("Embed payment button linking to PoS item")]),t._v(" at the bottom of the page and copy the expanded code. Paste it into html page of your website.")]),t._v(" "),e("li",[t._v("Remove the extra fields you do not need, especially "),e("code",[t._v('')]),t._v(" so that button redirects to the point of sale.")])]),t._v(" "),e("p",[e("img",{attrs:{src:a(444),alt:"Custom Amount Pay Button",title:"Custom Amount Pay Button"}}),t._v(" "),e("img",{attrs:{src:a(445),alt:"Custom Amount Pay Button",title:"Custom Amount Pay Button"}})]),t._v(" "),e("h2",{attrs:{id:"how-to-map-a-domain-name-to-an-app"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#how-to-map-a-domain-name-to-an-app"}},[t._v("#")]),t._v(" How to map a domain name to an app?")]),t._v(" "),e("p",[t._v("BTCPay Server Apps can have a domain name that's different from the servers domain. Let's assume you have BTCPay Server at mybtcpayserver.com and want to display your PoS app on mybtcpaypos.com instead mybtcpayserver.com/apps/pos/abc123\nFirst, "),e("RouterLink",{attrs:{to:"/FAQ/Deployment/#setting-up-dns-records"}},[t._v("configure DNS settings")]),t._v(") of mypointofsale.com and make sure it's pointing to the external ip of your BTCPay Server.")],1),t._v(" "),e("p",[t._v("Next, add additional domain or subdomain name(s) by adding a new environment variable through ssh:")]),t._v(" "),e("div",{staticClass:"language-bash extra-class"},[e("pre",{pre:!0,attrs:{class:"language-bash"}},[e("code",[e("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("su")]),t._v(" -\n"),e("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("export")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token assign-left variable"}},[t._v("BTCPAY_ADDITIONAL_HOSTS")]),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"mybtcpaypos.com"')]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v(".")]),t._v(" btcpay-setup.sh "),e("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-i")]),t._v("\n")])])]),e("p",[t._v("If you want to add multiple domains, you just need to update the env variables again:")]),t._v(" "),e("div",{staticClass:"language-bash extra-class"},[e("pre",{pre:!0,attrs:{class:"language-bash"}},[e("code",[e("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("su")]),t._v(" -\n"),e("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("export")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token assign-left variable"}},[t._v("BTCPAY_ADDITIONAL_HOSTS")]),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"mybtcpaypos.com,subdomain.domain2.com,domain3.com"')]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v(".")]),t._v(" btcpay-setup.sh "),e("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-i")]),t._v("\n")])])]),e("p",[t._v("Finally, in Server Settings > Policies click on the "),e("code",[t._v("Map specific domains to specific apps")])]),t._v(" "),e("figure",[e("img",{attrs:{src:a(446),alt:"App domain mapping",title:"App domain mapping"}})]),t._v(" "),e("p",[t._v("Enter domain name, select a previously created app from the drop down menu and click "),e("code",[t._v("save")]),t._v(" to map the app to specific domain.")]),t._v(" "),e("figure",[e("img",{attrs:{src:a(447),alt:"App domain mapping",title:"App domain mapping"}})]),t._v(" "),e("p",[t._v("If any of the additionally added hosts do not have a properly configured DNS, Let's Encrypt will not be able to renew the certificate for any of the domains, including the main domain. If you're using additional hosts and facing https issues with the main domain, try removing a domain from the "),e("code",[t._v("BTCPAY_ADDITIONAL_HOSTS")]),t._v(" and re-run the setup. The https issue also occurs if "),e("RouterLink",{attrs:{to:"/Deployment/DynamicDNS/"}},[t._v("Dynamic DNS")]),t._v(" has not been renewed and is configured as an additional host.")],1),t._v(" "),e("p",[t._v("If for any reason, you want an app to be on the same domain as your BTCPay Server homepage, you can select to display it on the root. In that case, no DNS configuration is needed, since your domain is already pointing properly. Using an app on the root domain of BTCPay Server means you'll have to access the login and other pages manually. The easiest way is to append a page route such as "),e("code",[t._v("/apps")]),t._v(" or "),e("code",[t._v("/stores")]),t._v(" to your root domain. (Ex: "),e("code",[t._v("mybtcpayserver.com/apps")]),t._v("). This will make navigation to your root displayed app easier, but navigation to other pages (such as Login) more challenging for users.")]),t._v(" "),e("h2",{attrs:{id:"how-to-redirect-to-another-site-after-payment"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#how-to-redirect-to-another-site-after-payment"}},[t._v("#")]),t._v(" How to redirect to another site after payment?")]),t._v(" "),e("p",[t._v("Point of Sale apps allow redirecting customers to any URL after an invoice is paid. Modify the redirect functionality in Apps > Settings")]),t._v(" "),e("figure",[e("img",{attrs:{src:a(448),alt:"Set Point of Sale Redirects",title:"Set Point of Sale Redirects"}})]),t._v(" "),e("p",[t._v("In PoS settings these are the following options for redirects on paid invoices:")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("No")]),t._v(" - "),e("em",[t._v("Without")]),t._v(" Redirect URL\n"),e("ul",[e("li",[t._v("Invoice displays a prompt for the user to return to the PoS App (Default setting).")])])]),t._v(" "),e("li",[e("strong",[t._v("No")]),t._v(" - "),e("em",[t._v("With")]),t._v(" Redirect URL\n"),e("ul",[e("li",[t._v("Invoice displays a prompt for the user to return to the provided App Redirect URL.")])])]),t._v(" "),e("li",[e("strong",[t._v("Yes")]),t._v(" - "),e("em",[t._v("Without")]),t._v(" Redirect URL\n"),e("ul",[e("li",[t._v("Paid invoice automatically redirects to the PoS App.")])])]),t._v(" "),e("li",[e("strong",[t._v("Yes")]),t._v(" - "),e("em",[t._v("With")]),t._v(" Redirect URL\n"),e("ul",[e("li",[t._v("Paid invoice automatically redirects to the provided App Redirect URL.")])])]),t._v(" "),e("li",[e("strong",[t._v("Use Store Settings")]),t._v(" "),e("ul",[e("li",[t._v("Enable/disable automatic redirect to the PoS App on the "),e("RouterLink",{attrs:{to:"/FAQ/Stores/#how-to-redirect-store-invoices-after-payment"}},[t._v("store level")]),t._v(".")],1)])])]),t._v(" "),e("p",[t._v("Notes:")]),t._v(" "),e("ol",[e("li",[t._v("Provide the Redirect URL in the App Settings (above the redirect option).")]),t._v(" "),e("li",[t._v("Expired or partially paid "),e("RouterLink",{attrs:{to:"/Invoices/#invoice-statuses"}},[t._v("invoices")]),t._v(" will not redirect, even if the setting is enabled. This feature is for paid invoices only.")],1),t._v(" "),e("li",[t._v("Alternatively, redirect URLs can be specified via the API (i.e. Embedded PoS).")])]),t._v(" "),e("h2",{attrs:{id:"how-to-integrate-woocommerce-store-into-a-btcpay-crowdfund-app"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#how-to-integrate-woocommerce-store-into-a-btcpay-crowdfund-app"}},[t._v("#")]),t._v(" How to integrate WooCommerce Store into a BTCPay Crowdfund app?")]),t._v(" "),e("p",[t._v("If you want to provide a way for your backers to receive digital files and physical products, you can embed WooCommerce store into your Crowdfunding app.")]),t._v(" "),e("figure",[e("img",{attrs:{src:a(449),alt:"Crowdfunding WooCommerce Integration Preview",title:"Crowdfunding WooCommerce Integration Preview"}})]),t._v(" "),e("p",[t._v("The following tutorial assumes you have a semi-advanced understanding of BTCPay, WordPress and WooCommerce.")]),t._v(" "),e("h3",{attrs:{id:"requirements"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#requirements"}},[t._v("#")]),t._v(" Requirements")]),t._v(" "),e("ol",[e("li",[t._v("Wordpress Website")]),t._v(" "),e("li",[e("a",{attrs:{href:"https://wordpress.org/plugins/woocommerce/",target:"_blank",rel:"noopener noreferrer"}},[t._v("WooCommerce Plugin"),e("OutboundLink")],1)]),t._v(" "),e("li",[e("a",{attrs:{href:"https://wordpress.org/plugins/btcpay-for-woocommerce/",target:"_blank",rel:"noopener noreferrer"}},[t._v("BTCPay for WooCommerce Plugin"),e("OutboundLink")],1)]),t._v(" "),e("li",[e("a",{attrs:{href:"https://wordpress.org/themes/storefront/",target:"_blank",rel:"noopener noreferrer"}},[t._v("Storefront Theme"),e("OutboundLink")],1),t._v(" (if you're using another theme, you may need to modify the CSS code to fit your theme.")]),t._v(" "),e("li",[t._v("BTCPay Server")])]),t._v(" "),e("p",[e("strong",[t._v("Important Note")]),t._v(" Make sure that both your WooCommerce store and BTCPay Server "),e("strong",[t._v("are on a same domain")]),t._v(". Some browsers have aggressive way of blocking the cross-domain embedded content. Quite specifically, Safari on iOS will destroy the cookie when the item is added, which will lead to empty cart. There's no other way to fix this besides having BTCPay and Woo on a same domain as subdomains at least.")]),t._v(" "),e("h4",{attrs:{id:"optional-wordpress-plugins"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#optional-wordpress-plugins"}},[t._v("#")]),t._v(" Optional WordPress Plugins")]),t._v(" "),e("p",[t._v("The following plugins are recommended, but not required. You don't have to use them if you're an advanced WordPress user.")]),t._v(" "),e("ul",[e("li",[e("a",{attrs:{href:"https://wordpress.org/plugins/flexible-checkout-fields/",target:"_blank",rel:"noopener noreferrer"}},[t._v("Flexible Checkout Fields"),e("OutboundLink")],1),t._v(" (to edit checkout and remove redundant checkout fields in Woo)")]),t._v(" "),e("li",[e("a",{attrs:{href:"https://wordpress.org/plugins/woocommerce-direct-checkout/",target:"_blank",rel:"noopener noreferrer"}},[t._v("WooCommerce Direct Checkout"),e("OutboundLink")],1),t._v(" (remove redundant steps in the checkout process and make pledging quicker)")]),t._v(" "),e("li",[e("a",{attrs:{href:"https://wordpress.org/plugins/header-and-footer-scripts/",target:"_blank",rel:"noopener noreferrer"}},[t._v("Header and Footer Scripts"),e("OutboundLink")],1),t._v(" (place "),e("code",[t._v(" + diff --git a/sitemap.xml b/sitemap.xml index a749dfca7d..c3ba061bf5 100644 --- a/sitemap.xml +++ b/sitemap.xml @@ -1 +1 @@ -https://docs.btcpayserver.org/AdvancedForms/dailyhttps://docs.btcpayserver.org/BTCPayServer/db-migration/dailyhttps://docs.btcpayserver.org/BTCPayServer/Security/dailyhttps://docs.btcpayserver.org/Apps/dailyhttps://docs.btcpayserver.org/BTCPayServer/LocalDevSetup/dailyhttps://docs.btcpayserver.org/BTCPayServer/greenfield-authorization/dailyhttps://docs.btcpayserver.org/ColdCardWallet/dailyhttps://docs.btcpayserver.org/BTCPayServer/greenfield-development/dailyhttps://docs.btcpayserver.org/BTCPayVsOthers/dailyhttps://docs.btcpayserver.org/Community/dailyhttps://docs.btcpayserver.org/Configurator/dailyhttps://docs.btcpayserver.org/ConnectWallet/dailyhttps://docs.btcpayserver.org/Contribute/Design/dailyhttps://docs.btcpayserver.org/Contribute/DevCode/dailyhttps://docs.btcpayserver.org/Contribute/DevTest/dailyhttps://docs.btcpayserver.org/Contribute/Dev/dailyhttps://docs.btcpayserver.org/Contribute/Misc/dailyhttps://docs.btcpayserver.org/Contribute/Translate/dailyhttps://docs.btcpayserver.org/Contribute/dailyhttps://docs.btcpayserver.org/Contribute/Write/dailyhttps://docs.btcpayserver.org/Contribute/WriteBlog/dailyhttps://docs.btcpayserver.org/Contribute/WriteDocs/dailyhttps://docs.btcpayserver.org/CreateWallet/dailyhttps://docs.btcpayserver.org/CreateStore/dailyhttps://docs.btcpayserver.org/CustomIntegration/dailyhttps://docs.btcpayserver.org/Dashboard/dailyhttps://docs.btcpayserver.org/Contribute/WriteSoftware/dailyhttps://docs.btcpayserver.org/Deployment/Azure/dailyhttps://docs.btcpayserver.org/Deployment/AzurePennyPinching/dailyhttps://docs.btcpayserver.org/Deployment/Clovyr/dailyhttps://docs.btcpayserver.org/Deployment/DreamlabNetwork/dailyhttps://docs.btcpayserver.org/Deployment/DynamicDNS/dailyhttps://docs.btcpayserver.org/Deployment/Hack0/dailyhttps://docs.btcpayserver.org/Deployment/GoogleCloud/dailyhttps://docs.btcpayserver.org/Deployment/Hardware/dailyhttps://docs.btcpayserver.org/Deployment/HardwareAsAService/dailyhttps://docs.btcpayserver.org/Deployment/LunaNode/dailyhttps://docs.btcpayserver.org/Deployment/ManualDeployment/dailyhttps://docs.btcpayserver.org/Deployment/LightningInABox/dailyhttps://docs.btcpayserver.org/Deployment/RaspberryPi4/dailyhttps://docs.btcpayserver.org/Deployment/dailyhttps://docs.btcpayserver.org/Deployment/ManualDeploymentExtended/dailyhttps://docs.btcpayserver.org/Deployment/ReverseProxyToTor/dailyhttps://docs.btcpayserver.org/Deployment/voltagecloud/dailyhttps://docs.btcpayserver.org/Deployment/ReverseSSHtunnel/dailyhttps://docs.btcpayserver.org/Deployment/webdeployment/dailyhttps://docs.btcpayserver.org/Deployment/ThirdPartyHosting/dailyhttps://docs.btcpayserver.org/Development/Altcoins/dailyhttps://docs.btcpayserver.org/Development/GreenFieldExample-NodeJS/dailyhttps://docs.btcpayserver.org/Development/GreenfieldExample-PHP/dailyhttps://docs.btcpayserver.org/Development/GreenFieldExample/dailyhttps://docs.btcpayserver.org/Development/LocalDev/dailyhttps://docs.btcpayserver.org/Development/InvoiceMetadata/dailyhttps://docs.btcpayserver.org/Development/LocalDevelopment/dailyhttps://docs.btcpayserver.org/Development/Plugins/dailyhttps://docs.btcpayserver.org/Development/dailyhttps://docs.btcpayserver.org/Development/TestnetDemo/dailyhttps://docs.btcpayserver.org/Development/Theme/dailyhttps://docs.btcpayserver.org/Docker/chatwoot/dailyhttps://docs.btcpayserver.org/Docker/dailyhttps://docs.btcpayserver.org/Docker/backup-restore/dailyhttps://docs.btcpayserver.org/Docker/cloudflare-tunnel/dailyhttps://docs.btcpayserver.org/Docker/fastsync/dailyhttps://docs.btcpayserver.org/Docker/fireflyiii/dailyhttps://docs.btcpayserver.org/Docker/joinmarket/dailyhttps://docs.btcpayserver.org/Docker/ndlc/dailyhttps://docs.btcpayserver.org/Docker/pihole/dailyhttps://docs.btcpayserver.org/Docker/lightning-terminal/dailyhttps://docs.btcpayserver.org/Docker/tallycoin-connect/dailyhttps://docs.btcpayserver.org/Drupal/dailyhttps://docs.btcpayserver.org/ElectrumPersonalServer/dailyhttps://docs.btcpayserver.org/ElectrumX/dailyhttps://docs.btcpayserver.org/ElectrumWallet/dailyhttps://docs.btcpayserver.org/FAQ/Apps/dailyhttps://docs.btcpayserver.org/FAQ/Altcoin/dailyhttps://docs.btcpayserver.org/FAQ/Deployment/dailyhttps://docs.btcpayserver.org/FAQ/Integrations/dailyhttps://docs.btcpayserver.org/FAQ/General/dailyhttps://docs.btcpayserver.org/FAQ/LightningNetwork/dailyhttps://docs.btcpayserver.org/FAQ/dailyhttps://docs.btcpayserver.org/FAQ/ServerSettings/dailyhttps://docs.btcpayserver.org/FAQ/Stores/dailyhttps://docs.btcpayserver.org/FAQ/Synchronization/dailyhttps://docs.btcpayserver.org/FAQ/Wallet/dailyhttps://docs.btcpayserver.org/Forms/dailyhttps://docs.btcpayserver.org/Invoices/dailyhttps://docs.btcpayserver.org/LNDhubAPI/dailyhttps://docs.btcpayserver.org/Guide/dailyhttps://docs.btcpayserver.org/HardwareWalletIntegration/dailyhttps://docs.btcpayserver.org/LNbank/LNDhub/dailyhttps://docs.btcpayserver.org/LNbank/Troubleshooting/dailyhttps://docs.btcpayserver.org/LNbank/dailyhttps://docs.btcpayserver.org/LedgerWallet/dailyhttps://docs.btcpayserver.org/LightningNetwork/dailyhttps://docs.btcpayserver.org/LightningNetwork_PaymentChannels/dailyhttps://docs.btcpayserver.org/Magento/dailyhttps://docs.btcpayserver.org/NBXplorer/API/dailyhttps://docs.btcpayserver.org/NBXplorer/Postgres-Migration/dailyhttps://docs.btcpayserver.org/NBXplorer/Postgres-Schema/dailyhttps://docs.btcpayserver.org/NBXplorer/dailyhttps://docs.btcpayserver.org/Nostr/dailyhttps://docs.btcpayserver.org/Notifications/dailyhttps://docs.btcpayserver.org/OpenCart/dailyhttps://docs.btcpayserver.org/Payjoin/dailyhttps://docs.btcpayserver.org/PaymentRequests/dailyhttps://docs.btcpayserver.org/Payouts/dailyhttps://docs.btcpayserver.org/PodServer/dailyhttps://docs.btcpayserver.org/Refund/dailyhttps://docs.btcpayserver.org/PullPayments/dailyhttps://docs.btcpayserver.org/RegisterAccount/dailyhttps://docs.btcpayserver.org/dailyhttps://docs.btcpayserver.org/PrestaShop/dailyhttps://docs.btcpayserver.org/Shopify/dailyhttps://docs.btcpayserver.org/Shopware/dailyhttps://docs.btcpayserver.org/Sign-PSBT-with-sparrow-wallet/dailyhttps://docs.btcpayserver.org/Reporting/dailyhttps://docs.btcpayserver.org/Support/dailyhttps://docs.btcpayserver.org/Transmuter/DCA/dailyhttps://docs.btcpayserver.org/TicketTailor/dailyhttps://docs.btcpayserver.org/Transmuter/dailyhttps://docs.btcpayserver.org/Transmuter/EmailReceiptsPreset/dailyhttps://docs.btcpayserver.org/Trocador/dailyhttps://docs.btcpayserver.org/TryItOut/dailyhttps://docs.btcpayserver.org/Troubleshooting/dailyhttps://docs.btcpayserver.org/UseCase/dailyhttps://docs.btcpayserver.org/Vault/HowToVerify/dailyhttps://docs.btcpayserver.org/Vault/dailyhttps://docs.btcpayserver.org/VirtueMart/dailyhttps://docs.btcpayserver.org/Wabisabi/dailyhttps://docs.btcpayserver.org/Wallet/dailyhttps://docs.btcpayserver.org/Walkthrough/dailyhttps://docs.btcpayserver.org/WasabiWallet/dailyhttps://docs.btcpayserver.org/WalletSetup/dailyhttps://docs.btcpayserver.org/WooCommerce/dailyhttps://docs.btcpayserver.org/WhatsNext/dailyhttps://docs.btcpayserver.org/Zapier/daily \ No newline at end of file +https://docs.btcpayserver.org/Apps/dailyhttps://docs.btcpayserver.org/AdvancedForms/dailyhttps://docs.btcpayserver.org/BTCPayServer/LocalDevSetup/dailyhttps://docs.btcpayserver.org/BTCPayServer/Security/dailyhttps://docs.btcpayserver.org/BTCPayVsOthers/dailyhttps://docs.btcpayserver.org/BTCPayServer/greenfield-development/dailyhttps://docs.btcpayserver.org/BTCPayServer/db-migration/dailyhttps://docs.btcpayserver.org/BTCPayServer/greenfield-authorization/dailyhttps://docs.btcpayserver.org/ColdCardWallet/dailyhttps://docs.btcpayserver.org/Community/dailyhttps://docs.btcpayserver.org/Configurator/dailyhttps://docs.btcpayserver.org/ConnectWallet/dailyhttps://docs.btcpayserver.org/Contribute/Design/dailyhttps://docs.btcpayserver.org/Contribute/Dev/dailyhttps://docs.btcpayserver.org/Contribute/DevCode/dailyhttps://docs.btcpayserver.org/Contribute/DevTest/dailyhttps://docs.btcpayserver.org/Contribute/Misc/dailyhttps://docs.btcpayserver.org/Contribute/dailyhttps://docs.btcpayserver.org/Contribute/Translate/dailyhttps://docs.btcpayserver.org/Contribute/WriteBlog/dailyhttps://docs.btcpayserver.org/Contribute/Write/dailyhttps://docs.btcpayserver.org/Contribute/WriteDocs/dailyhttps://docs.btcpayserver.org/CreateStore/dailyhttps://docs.btcpayserver.org/CreateWallet/dailyhttps://docs.btcpayserver.org/CustomIntegration/dailyhttps://docs.btcpayserver.org/Deployment/Azure/dailyhttps://docs.btcpayserver.org/Contribute/WriteSoftware/dailyhttps://docs.btcpayserver.org/Dashboard/dailyhttps://docs.btcpayserver.org/Deployment/AzurePennyPinching/dailyhttps://docs.btcpayserver.org/Deployment/Clovyr/dailyhttps://docs.btcpayserver.org/Deployment/DreamlabNetwork/dailyhttps://docs.btcpayserver.org/Deployment/DynamicDNS/dailyhttps://docs.btcpayserver.org/Deployment/GoogleCloud/dailyhttps://docs.btcpayserver.org/Deployment/Hardware/dailyhttps://docs.btcpayserver.org/Deployment/Hack0/dailyhttps://docs.btcpayserver.org/Deployment/HardwareAsAService/dailyhttps://docs.btcpayserver.org/Deployment/LunaNode/dailyhttps://docs.btcpayserver.org/Deployment/LightningInABox/dailyhttps://docs.btcpayserver.org/Deployment/ManualDeployment/dailyhttps://docs.btcpayserver.org/Deployment/ManualDeploymentExtended/dailyhttps://docs.btcpayserver.org/Deployment/RaspberryPi4/dailyhttps://docs.btcpayserver.org/Deployment/ReverseProxyToTor/dailyhttps://docs.btcpayserver.org/Deployment/dailyhttps://docs.btcpayserver.org/Deployment/ReverseSSHtunnel/dailyhttps://docs.btcpayserver.org/Deployment/voltagecloud/dailyhttps://docs.btcpayserver.org/Deployment/ThirdPartyHosting/dailyhttps://docs.btcpayserver.org/Deployment/webdeployment/dailyhttps://docs.btcpayserver.org/Development/Altcoins/dailyhttps://docs.btcpayserver.org/Development/GreenFieldExample-NodeJS/dailyhttps://docs.btcpayserver.org/Development/GreenfieldExample-PHP/dailyhttps://docs.btcpayserver.org/Development/GreenFieldExample/dailyhttps://docs.btcpayserver.org/Development/InvoiceMetadata/dailyhttps://docs.btcpayserver.org/Development/LocalDevelopment/dailyhttps://docs.btcpayserver.org/Development/Plugins/dailyhttps://docs.btcpayserver.org/Development/LocalDev/dailyhttps://docs.btcpayserver.org/Development/dailyhttps://docs.btcpayserver.org/Development/TestnetDemo/dailyhttps://docs.btcpayserver.org/Development/Theme/dailyhttps://docs.btcpayserver.org/Docker/dailyhttps://docs.btcpayserver.org/Docker/chatwoot/dailyhttps://docs.btcpayserver.org/Docker/cloudflare-tunnel/dailyhttps://docs.btcpayserver.org/Docker/joinmarket/dailyhttps://docs.btcpayserver.org/Docker/backup-restore/dailyhttps://docs.btcpayserver.org/Docker/fastsync/dailyhttps://docs.btcpayserver.org/Docker/lightning-terminal/dailyhttps://docs.btcpayserver.org/Docker/fireflyiii/dailyhttps://docs.btcpayserver.org/Docker/ndlc/dailyhttps://docs.btcpayserver.org/Docker/pihole/dailyhttps://docs.btcpayserver.org/Docker/tallycoin-connect/dailyhttps://docs.btcpayserver.org/ElectrumPersonalServer/dailyhttps://docs.btcpayserver.org/ElectrumX/dailyhttps://docs.btcpayserver.org/Drupal/dailyhttps://docs.btcpayserver.org/FAQ/Altcoin/dailyhttps://docs.btcpayserver.org/FAQ/Apps/dailyhttps://docs.btcpayserver.org/ElectrumWallet/dailyhttps://docs.btcpayserver.org/FAQ/Deployment/dailyhttps://docs.btcpayserver.org/FAQ/Integrations/dailyhttps://docs.btcpayserver.org/FAQ/LightningNetwork/dailyhttps://docs.btcpayserver.org/FAQ/ServerSettings/dailyhttps://docs.btcpayserver.org/FAQ/Stores/dailyhttps://docs.btcpayserver.org/FAQ/dailyhttps://docs.btcpayserver.org/FAQ/Synchronization/dailyhttps://docs.btcpayserver.org/Forms/dailyhttps://docs.btcpayserver.org/FAQ/Wallet/dailyhttps://docs.btcpayserver.org/Guide/dailyhttps://docs.btcpayserver.org/LNDhubAPI/dailyhttps://docs.btcpayserver.org/Invoices/dailyhttps://docs.btcpayserver.org/HardwareWalletIntegration/dailyhttps://docs.btcpayserver.org/LNbank/LNDhub/dailyhttps://docs.btcpayserver.org/LightningNetwork/dailyhttps://docs.btcpayserver.org/LNbank/dailyhttps://docs.btcpayserver.org/LedgerWallet/dailyhttps://docs.btcpayserver.org/LNbank/Troubleshooting/dailyhttps://docs.btcpayserver.org/LightningNetwork_PaymentChannels/dailyhttps://docs.btcpayserver.org/Magento/dailyhttps://docs.btcpayserver.org/NBXplorer/Postgres-Migration/dailyhttps://docs.btcpayserver.org/NBXplorer/API/dailyhttps://docs.btcpayserver.org/NBXplorer/Postgres-Schema/dailyhttps://docs.btcpayserver.org/NBXplorer/dailyhttps://docs.btcpayserver.org/Notifications/dailyhttps://docs.btcpayserver.org/Nostr/dailyhttps://docs.btcpayserver.org/OpenCart/dailyhttps://docs.btcpayserver.org/Payjoin/dailyhttps://docs.btcpayserver.org/Payouts/dailyhttps://docs.btcpayserver.org/PodServer/dailyhttps://docs.btcpayserver.org/PaymentRequests/dailyhttps://docs.btcpayserver.org/PrestaShop/dailyhttps://docs.btcpayserver.org/PullPayments/dailyhttps://docs.btcpayserver.org/Reporting/dailyhttps://docs.btcpayserver.org/RegisterAccount/dailyhttps://docs.btcpayserver.org/Shopify/dailyhttps://docs.btcpayserver.org/Shopware/dailyhttps://docs.btcpayserver.org/Support/dailyhttps://docs.btcpayserver.org/dailyhttps://docs.btcpayserver.org/TicketTailor/dailyhttps://docs.btcpayserver.org/Transmuter/EmailReceiptsPreset/dailyhttps://docs.btcpayserver.org/Sign-PSBT-with-sparrow-wallet/dailyhttps://docs.btcpayserver.org/Transmuter/dailyhttps://docs.btcpayserver.org/Transmuter/DCA/dailyhttps://docs.btcpayserver.org/Troubleshooting/dailyhttps://docs.btcpayserver.org/Trocador/dailyhttps://docs.btcpayserver.org/UseCase/dailyhttps://docs.btcpayserver.org/TryItOut/dailyhttps://docs.btcpayserver.org/Vault/dailyhttps://docs.btcpayserver.org/Vault/HowToVerify/dailyhttps://docs.btcpayserver.org/Walkthrough/dailyhttps://docs.btcpayserver.org/FAQ/General/dailyhttps://docs.btcpayserver.org/Wabisabi/dailyhttps://docs.btcpayserver.org/VirtueMart/dailyhttps://docs.btcpayserver.org/Wallet/dailyhttps://docs.btcpayserver.org/WasabiWallet/dailyhttps://docs.btcpayserver.org/WalletSetup/dailyhttps://docs.btcpayserver.org/WhatsNext/dailyhttps://docs.btcpayserver.org/Zapier/dailyhttps://docs.btcpayserver.org/WooCommerce/dailyhttps://docs.btcpayserver.org/Refund/daily \ No newline at end of file