#### Start accepting Bitcoin today with BTCPayServer! This guide will walk you through the installation. ## One-click deployment For the easiest and fastest setup, host BTCPayServer on Microsoft Azure: First, [open an Azure account](https://azure.microsoft.com/en-us/account/), then: [![Deploy to Azure](https://azuredeploy.net/deploybutton.svg)](https://portal.azure.com/#create/Microsoft.Template/uri/https%3A%2F%2Fraw.githubusercontent.com%2Fbtcpayserver%2Fbtcpayserver-azure%2Fmaster%2Fazuredeploy.json) Final installation steps: * Fill in the options: Resource Group, Admin Password, Network * Click 'Purchase' * (Wait for deployment) * View the deployment (in Notifications or Resource Groups) * [SSH](#ssh-guide) into it: `ssh SSH-USERNAME@SSH-SERVER-AZURE-DNS` * (At your domain registrar, make sure you have [DNS](#dns-guide) pointing your domain at your Azure deployment's IP) * Run `sudo -i; ./change-domain.sh MYDOMAIN.com` That's it! * Run `docker ps` and `docker logs xxx` to view running processes * Run `btcpay-down.sh` and `btcpay-up.sh` to stop and start the BTCPayServer This video by Nicolas also demonstrates the above steps: [![BTCPay - One Click Setup](http://img.youtube.com/vi/Bxs95BdEMHY/mqdefault.jpg)](http://www.youtube.com/watch?v=Bxs95BdEMHY "BTCPay - One Click Setup") Approximate Cost (unpruned, Bitcoin-only): **60 USD per month** After all your nodes have synced and you've confirmed everything works, follow [this guide](https://github.com/btcpayserver/btcpayserver-doc/blob/master/PennyPinching.md) to fine-tune for savings; costs should drop to **30 or 40 USD per month**. ## Architecture ![Architecture](https://github.com/btcpayserver/btcpayserver-doc/raw/master/img/Architecture.png) As you can see, BTCPay depends on several pieces of infrastructure, mainly: * A lightweight block explorer (NBXplorer), * A database (PostgreSQL or SQLite), * A full node (eg. Bitcoin Core) There can be more dependencies if you support more than just standard Bitcoin transactions, including: * [C-Lightning](https://github.com/ElementsProject/lightning) * [LitecoinD](https://github.com/litecoin-project/litecoin) and other coin daemons * And more... Note: The setup process can be time consuming, but is heavily automated to make it a fun and easy experience. ## Full installation (for technical users) You can also install BTCPayServer on your own machine or VPS instance. First, make sure you have a domain name pointing to your host, with ports `443` and `80` externally accessible. Let's assume it is `btcpay.example.com`. If you want to support Litecoin, Bitcoin, and C-Lightning, and want HTTPS automatically configured by Nginx: ```bash # Login as root sudo su - # Create a folder for BTCPay mkdir BTCPayServer cd BTCPayServer # Clone this repository git clone https://github.com/btcpayserver/btcpayserver-docker cd btcpayserver-docker # Run btcpay-setup.sh with the right parameters export BTCPAY_HOST="btcpay.example.com" export NBITCOIN_NETWORK="mainnet" export BTCPAYGEN_CRYPTO1="btc" export BTCPAYGEN_CRYPTO2="ltc" export BTCPAYGEN_REVERSEPROXY="nginx" export BTCPAYGEN_LIGHTNING="clightning" . ./btcpay-setup.sh -i exit ``` `btcpay-setup.sh` will then: * Install Docker * Install Docker-Compose * Make sure BTCPay starts at reboot via upstart or systemd * Setup environment variables to use BTCPay utilities * Add BTCPay utilities in /usr/bin * Start BTCPay # Environment variables `btcpay-setup.sh` will use the following environment variables: * `BTCPAY_HOST`: The hostname of your website (eg. `btcpay.example.com`) * `NBITCOIN_NETWORK`: The type of network to use (eg. `mainnet`, `testnet`, or `regtest`. Default: `mainnet`) * `LIGHTNING_ALIAS`: An alias for your lightning network node, if used * `BTCPAYGEN_CRYPTO1`: First supported crypto currency (eg. `btc`, `ltc`. Default: `btc`) * `BTCPAYGEN_CRYPTO2`: Second supported crypto currency (eg. `btc`, `ltc`. Default: `(empty)`) * `BTCPAYGEN_CRYPTON`: N'th supported crypto currency where N is 9 at maximum. (eg. `btc`, `ltc`. Default: `(empty)`) * `BTCPAYGEN_REVERSEPROXY`: Whether to use or not a reverse proxy. NGinx setup HTTPS for you. (eg. `nginx`, `(empty)`. Default: `nginx`) * `BTCPAYGEN_LIGHTNING`: Lightning network implementation to use (eg. `clightning`, `(empty)`) * `BTCPAYGEN_ADDITIONAL_FRAGMENTS`: Semicolon-separated list of additional fragments you want to use (eg. `opt-save-storage`) * `LETSENCRYPT_EMAIL`: An email will be sent to this address if certificate expires and fail to renew automatically (eg. `me@example.com`) * `ACME_CA_URI`: The API endpoint to ask for HTTPS certificate (Default: `https://acme-v01.api.letsencrypt.org/directory`) * `BTCPAY_HOST_SSHKEYFILE`: Optional, SSH private key that BTCPay can use to connect to this VM's SSH server. This key will be copied to BTCPay's data directory * `BTCPAY_SSHTRUSTEDFINGERPRINTS`: Optional, BTCPay will ensure that it is connecting to the expected SSH server by checking the host's public key against these fingerprints # Tooling A wide variety of scripts are available once BTCPay is installed: * `bitcoin-cli.sh`: Access your Bitcoin node instance (for RPC) * `bitcoin-lightning-cli.sh`: Access your C-Lightning node instance (for RPC) * `changedomain.sh`: Change the domain of your BTCPayServer * `btcpay-update.sh`: Update BTCPayServer to the latest version * `btcpay-up.sh`: Run `docker-compose up` * `btcpay-down.sh`: Run `docker-compose down` * `btcpay-setup.sh`: Change the settings of your server * `. ./btcpay-setup.sh`: Information about additional parameters * `. ./btcpay-setup.sh -i`: Set up your BTCPayServer # Under the hood ## Generated docker-compose Under the hood, your environment variables are used by [build.sh](build.sh) (or [build.ps1](build.ps1)) to generate a docker-compose adapted for your needs. By default, it will generate `Generated/docker-compose.generated.yml` by gluing together the relevant [Docker fragments](docker-compose-generator/docker-fragments) for your setup. To configure your custom docker-compose, the following environment variables are supported: * `BTCPAYGEN_CRYPTO1` to `BTCPAYGEN_CRYPTO9`: Specify support for a crypto currency. (eg. `btc`, `ltc`) * `BTCPAYGEN_REVERSEPROXY`: Specify the reverse proxy to use (eg. `nginx`, `none`) * `BTCPAYGEN_LIGHTNING`: Specify the lightning network implementation (eg. `clightning`, `none`) * `BTCPAYGEN_SUBNAME`: The sub name of the generated docker-compose file, where the full name will be `Generated/docker-compose.SUBNAME.yml` (Default: `generated`) * `BTCPAYGEN_ADDITIONAL_FRAGMENTS`: Semicolon-separated list of additional fragments you want to use, (eg. `opt-save-storage`, Default: `(empty)`) Available `BTCPAYGEN_ADDITIONAL_FRAGMENTS` currently are: * [opt-save-storage](docker-compose-generator/docker-fragments/opt-save-storage.yml) will keep around 1 year of blocks (prune BTC for 100 GB) * [opt-save-storage-s](docker-compose-generator/docker-fragments/opt-save-storage-s.yml) will keep around 6 months of blocks (prune BTC for 50 GB) * [opt-save-storage-xxs](docker-compose-generator/docker-fragments/opt-save-storage-xxs.yml) will keep around 2 weeks of blocks (prune BTC for 5 GB) (lightning not supported) You can also create your own [custom fragments](#how-can-i-customize-the-generated-docker-compose-file). For example, if you want `btc` and `ltc` support with `nginx` and `clightning` inside `Generated/docker-compose.custom.yml`: Note: The first run might take a while, but following runs are instantaneous. On Windows (run in powershell): ```powershell Invoke-Command { $BTCPAYGEN_CRYPTO1="btc" $BTCPAYGEN_CRYPTO2="ltc" $BTCPAYGEN_REVERSEPROXY="nginx" $BTCPAYGEN_LIGHTNING="clightning" $BTCPAYGEN_SUBNAME="custom" . .\build.ps1 } ``` On Linux: ```bash BTCPAYGEN_CRYPTO1="btc" \ BTCPAYGEN_CRYPTO2="ltc" \ BTCPAYGEN_REVERSEPROXY="nginx" \ BTCPAYGEN_LIGHTNING="clightning" \ BTCPAYGEN_SUBNAME="custom" \ ./build.sh ``` Next, you will need to configure the runtime environment variables for `Generated/docker-compose.custom.yml`: * If you are using NGinx, [read this](Production/README.md). * If you are not using NGinx, [read this instead](Production-NoReverseProxy/README.md). ## What does `btcpay-setup.sh` do? `btcpay-setup.sh` is a utility which does the following: 1. Makes sure docker and docker-compose are installed on your system 2. Generates a docker-compose via `./build.sh` 3. Sets up an [Environment File](https://docs.docker.com/compose/env-file/) to configure your docker-compose 4. Sets up environment variables so the tools described in [Tooling](#tooling) can work 5. Adds symbolic links of those tools in `/usr/bin` 6. Starts docker-compose 7. Makes sure it restarts at reboot via upstart or systemd Here is an overview of the files generated by `btcpay-setup.sh`: `/etc/profile.d/btcpay-env.sh` ensures that your environment variables are correctly setup when you login, so you can use the tools: ```bash export BTCPAYGEN_OLD_PREGEN="false" export BTCPAYGEN_CRYPTO1="btc" export BTCPAYGEN_CRYPTO2="" export BTCPAYGEN_CRYPTO3="" export BTCPAYGEN_CRYPTO4="" export BTCPAYGEN_CRYPTO5="" export BTCPAYGEN_CRYPTO6="" export BTCPAYGEN_CRYPTO7="" export BTCPAYGEN_CRYPTO8="" export BTCPAYGEN_CRYPTO9="" export BTCPAYGEN_LIGHTNING="clightning" export BTCPAYGEN_REVERSEPROXY="nginx" export BTCPAYGEN_ADDITIONAL_FRAGMENTS="" export BTCPAY_DOCKER_COMPOSE="/var/lib/waagent/custom-script/download/0/btcpayserver-docker/Production/docker-compose.generated.yml" export BTCPAY_BASE_DIRECTORY="/var/lib/waagent/custom-script/download/0" export BTCPAY_ENV_FILE="/var/lib/waagent/custom-script/download/0/.env" export BTCPAY_HOST_SSHKEYFILE="/root/.ssh/id_rsa_btcpay" if cat $BTCPAY_ENV_FILE &> /dev/null; then export BTCPAY_HOST="$(cat $BTCPAY_ENV_FILE | sed -n 's/^BTCPAY_HOST=\(.*\)$/\1/p')" export LETSENCRYPT_EMAIL="$(cat $BTCPAY_ENV_FILE | sed -n 's/^LETSENCRYPT_EMAIL=\(.*\)$/\1/p')" export NBITCOIN_NETWORK="$(cat $BTCPAY_ENV_FILE | sed -n 's/^NBITCOIN_NETWORK=\(.*\)$/\1/p')" export LIGHTNING_ALIAS="$(cat $BTCPAY_ENV_FILE | sed -n 's/^LIGHTNING_ALIAS=\(.*\)$/\1/p')" export ACME_CA_URI="$(cat $BTCPAY_ENV_FILE | sed -n 's/^ACME_CA_URI=\(.*\)$/\1/p')" export BTCPAY_SSHKEYFILE="$(cat $BTCPAY_ENV_FILE | sed -n 's/^BTCPAY_SSHKEYFILE=\(.*\)$/\1/p')" export BTCPAY_SSHTRUSTEDFINGERPRINTS="$(cat $BTCPAY_ENV_FILE | sed -n 's/^BTCPAY_SSHTRUSTEDFINGERPRINTS=\(.*\)$/\1/p')" fi ``` `/etc/systemd/system/btcpayserver.service` ensures that you can control btcpay via `systemctl`, and that BTCPayServer starts on reboot: ```ini [Unit] Description=BTCPayServer service After=docker.service network-online.target Requires=docker.service network-online.target [Service] Type=oneshot RemainAfterExit=yes ExecStart=/bin/bash -c '. /etc/profile.d/btcpay-env.sh && cd "$(dirname $BTCPAY_ENV_FILE)" && docker-compose -f "$BTCPAY_DOCKER_COMPOSE" up -d' ExecStop=/bin/bash -c '. /etc/profile.d/btcpay-env.sh && cd "$(dirname $BTCPAY_ENV_FILE)" && docker-compose -f "$BTCPAY_DOCKER_COMPOSE" stop' ExecReload=/bin/bash -c '. /etc/profile.d/btcpay-env.sh && cd "$(dirname $BTCPAY_ENV_FILE)" && docker-compose -f "$BTCPAY_DOCKER_COMPOSE" restart' [Install] WantedBy=multi-user.target ``` `.env` (`$BTCPAY_ENV_FILE`) contains environment variables passed to the containers managed by your docker-compose: ```ini BTCPAY_HOST=btcpay.example.com ACME_CA_URI=https://acme-v01.api.letsencrypt.org/directory NBITCOIN_NETWORK=mainnet LETSENCRYPT_EMAIL=me@example.com BTCPAY_SSHTRUSTEDFINGERPRINTS=SHA256:eSCD7NtQ/Q6IBl2iRB9caAQ3lDZd8s8iUL6SdeNnhpA BTCPAY_SSHKEYFILE=/datadir/id_rsa ``` # How can I add an altcoin to BTCPayServer? 1. Add support for your crypto to [NBitcoin](https://github.com/MetacoSA/NBitcoin/tree/master/NBitcoin.Altcoins), [NBxplorer](https://github.com/dgarage/NBXplorer), and [BTCPayServer](https://github.com/btcpayserver/btcpayserver). (Use examples from other coins) 2. Create your own docker image ([Example for BTC](https://hub.docker.com/r/nicolasdorier/docker-bitcoin/)) 3. Create a docker-compose fragment ([Example for BTC](docker-compose-generator/docker-fragments/bitcoin.yml)) 4. Add your CryptoDefinition ([Example for BTC](docker-compose-generator/src/CryptoDefinition.cs)) Now if you want to test, **DO NOT USE `build.sh`**, because this utility is a pre-built docker image. Instead, install [.NET Core 2.1 SDK](https://www.microsoft.com/net/download/windows) then run: ```bash BTCPAYGEN_CRYPTO1="xxx" BTCPAYGEN_SUBNAME="test" cd docker-compose-generator/src dotnet run ``` This will generate your docker-compose in the `Generated` folder, which you can then try for yourself. Note that BTCPayServer developers will not spend time testing your image, so make sure it works. # FAQ ## How can I modify my environment? As root, run `. btcpay-setup.sh`; this will show you the environment variable it is expecting. For example, if you support `btc` and `ltc` already, and want to add `btg`: ```bash export BTCPAYGEN_CRYPTO3='btg' . btcpay-setup.sh -i ``` ## I deployed before `btcpay-setup.sh` existed (before May 17), can I migrate to this new system? Yes, run the following command to update: ```bash sudo su - btcpay-update.sh cd $DOWNLOAD_ROOT/btcpayserver-docker . ./btcpay-setup.sh -i exit ``` ## I'm getting an error on Windows: `Cannot create container for service docker: Mount denied`? If you see this error: `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'`. Run this in powershell: ```powershell $Env:COMPOSE_CONVERT_WINDOWS_PATHS=1 ``` Then, run `docker-compose -f up`. This bug comes from Docker for Windows and is [tracked on Github](https://github.com/docker/for-win/issues/1829). ## How I can prune my node(s)? This will prune your Bitcoin full node to a maximum of 100GB (of blocks): ```bash export BTCPAYGEN_ADDITIONAL_FRAGMENTS="opt-save-storage" . ./btcpay-setup.sh -i ``` Other options are `opt-save-storage-s` (50 GB), `opt-save-storage-xxs` (5 GB), or custom (see below). ## How can I customize the generated docker-compose file? In some instances, you might want to customize your environment in more detail. While you could modify `Generated/docker-compose.generated.yml` manually, your changes would be overwritten the next time you run `btcpay-update.sh`. Luckily, you can leverage `BTCPAYGEN_ADDITIONAL_FRAGMENTS` for this! Let's enable **pruning to 60 GB**, for example: First, copy [opt-save-storage](docker-compose-generator/docker-fragments/opt-save-storage.yml) into the [the docker fragment folder](docker-compose-generator/docker-fragments) as `opt-save-storage.custom.yml`. **Important:** the file must end with `.custom.yml`, or there will be git conflicts whenever you run `btcpay-update.sh`. Modify the new `opt-save-storage.custom.yml` file to your taste: ```diff @@ -14,8 +14,7 @@ version: "3" services: bitcoind: environment: - BITCOIN_EXTRA_ARGS: prune=100000 + BITCOIN_EXTRA_ARGS: prune=60000 ``` Then set it up: ```bash export BTCPAYGEN_ADDITIONAL_FRAGMENTS="opt-save-storage.custom" . ./btcpay-setup.sh -i ```