From b4d0a81e759db6f4f1ecd78abbd0d571428ccae7 Mon Sep 17 00:00:00 2001 From: Stadicus Date: Wed, 2 Mar 2022 13:35:45 +0100 Subject: [PATCH] Harmonize navigation and file structure # Menu navigation The guide navigation now uses generic descriptions instead of specific software names. The chapter explaining the installation of the Bitcoin client is now called "Bitcoin client" instead of "Bitcoin Core". See discussion in https://github.com/raspibolt/raspibolt/issues/930 Pull-request: https://github.com/raspibolt/raspibolt/pull/938 # File structure With the guide accumulating more technical support files, the guide content itself got buried. Storing all core guide files in the root directory became confusing with increasing scope. Moving all markdown files into the /guide directory makes it human-readable again. Images are kept in /images to keep it tidy. Pull-request: https://github.com/raspibolt/raspibolt/pull/941 --- .../include_metatags.md | 0 backstory.md => guide/backstory.md | 6 +- .../bitcoin/bitcoin-client.md | 10 +- .../bitcoin/blockchain-explorer.md | 12 +- .../bitcoin/electrum-server.md | 14 +- bitcoin.md => guide/bitcoin/index.md | 2 +- .../bonus-section-separator.md | 2 +- .../bonus/bitcoin/electrum-personal-server.md | 22 +-- {bonus => guide/bonus}/bitcoin/index.md | 0 {bonus => guide/bonus}/bitcoin/mempool.md | 4 +- .../bonus}/bitcoin/specter-desktop.md | 29 ++-- {bonus => guide/bonus}/bitcoin/white-paper.md | 4 +- {bonus => guide/bonus}/index.md | 4 +- .../bonus}/lightning/auto-unlock.md | 0 .../bonus}/lightning/balance-of-satoshis.md | 132 +++++++++--------- .../bonus}/lightning/charge-lnd.md | 32 ++--- .../bonus}/lightning/circuit-breaker.md | 2 +- {bonus => guide/bonus}/lightning/index.md | 4 +- .../bonus/lightning/lnbalance.md | 4 +- .../bonus/lightning/lnchannels.md | 4 +- {bonus => guide/bonus}/lightning/lntop.md | 4 +- .../bonus}/lightning/rebalance-lnd.md | 24 ++-- .../bonus}/lightning/remote-lncli.md | 31 ++-- .../bonus}/lightning/zap-desktop.md | 2 +- {bonus => guide/bonus}/lightning/zap-ios.md | 25 ++-- guide/bonus/lightning/zeus-over-tor.md | 85 +++++++++++ .../bonus}/raspberry-pi/aliases.md | 50 +++---- .../raspberry-pi/boot-from-microsd-card.md | 6 +- .../bonus}/raspberry-pi/command-line.md | 27 ++-- {bonus => guide/bonus}/raspberry-pi/index.md | 0 .../bonus}/raspberry-pi/odroid-setup.md | 20 +-- .../bonus}/raspberry-pi/system-overview.md | 2 +- .../bonus}/raspberry-pi/trezor-agent.md | 15 +- .../raspberry-pi/upgrade-external-drive.md | 52 +++---- faq.md => guide/faq.md | 8 +- .../lightning/channel-backup.md | 14 +- lightning.md => guide/lightning/index.md | 8 +- lnd.md => guide/lightning/lightning-client.md | 14 +- .../lightning/mobile-app.md | 18 +-- rtl.md => guide/lightning/web-app.md | 10 +- .../raspberry-pi/index.md | 4 +- .../raspberry-pi/operating-system.md | 8 +- .../raspberry-pi/preparations.md | 4 +- privacy.md => guide/raspberry-pi/privacy.md | 4 +- .../raspberry-pi/remote-access.md | 4 +- security.md => guide/raspberry-pi/security.md | 4 +- .../raspberry-pi/system-configuration.md | 8 +- .../troubleshooting-separator.md | 2 +- .../troubleshooting.md | 16 ++- images/60_eps_first-start.png | Bin 0 -> 64531 bytes images/60_eps_pip_install.png | Bin 0 -> 45113 bytes index.md | 18 +-- raspibolt/README.md | 8 -- 53 files changed, 433 insertions(+), 349 deletions(-) rename include_metatags.md => _includes/include_metatags.md (100%) rename backstory.md => guide/backstory.md (95%) rename bitcoin-core.md => guide/bitcoin/bitcoin-client.md (98%) rename btcrpcexplorer.md => guide/bitcoin/blockchain-explorer.md (96%) rename electrs.md => guide/bitcoin/electrum-server.md (96%) rename bitcoin.md => guide/bitcoin/index.md (93%) rename bonus-section-separator.md => guide/bonus-section-separator.md (53%) rename bonus/bitcoin/electrum-personal-server.md.md => guide/bonus/bitcoin/electrum-personal-server.md (84%) rename {bonus => guide/bonus}/bitcoin/index.md (100%) rename {bonus => guide/bonus}/bitcoin/mempool.md (97%) rename {bonus => guide/bonus}/bitcoin/specter-desktop.md (95%) rename {bonus => guide/bonus}/bitcoin/white-paper.md (97%) rename {bonus => guide/bonus}/index.md (99%) rename {bonus => guide/bonus}/lightning/auto-unlock.md (100%) rename {bonus => guide/bonus}/lightning/balance-of-satoshis.md (93%) rename {bonus => guide/bonus}/lightning/charge-lnd.md (97%) rename {bonus => guide/bonus}/lightning/circuit-breaker.md (99%) rename {bonus => guide/bonus}/lightning/index.md (94%) rename bonus/lightning/script-lnbalance.md => guide/bonus/lightning/lnbalance.md (95%) rename bonus/lightning/script-lnchannels.md => guide/bonus/lightning/lnchannels.md (96%) rename {bonus => guide/bonus}/lightning/lntop.md (95%) rename {bonus => guide/bonus}/lightning/rebalance-lnd.md (93%) rename {bonus => guide/bonus}/lightning/remote-lncli.md (88%) rename {bonus => guide/bonus}/lightning/zap-desktop.md (99%) rename {bonus => guide/bonus}/lightning/zap-ios.md (90%) create mode 100644 guide/bonus/lightning/zeus-over-tor.md rename {bonus => guide/bonus}/raspberry-pi/aliases.md (94%) rename {bonus => guide/bonus}/raspberry-pi/boot-from-microsd-card.md (94%) rename {bonus => guide/bonus}/raspberry-pi/command-line.md (77%) rename {bonus => guide/bonus}/raspberry-pi/index.md (100%) rename {bonus => guide/bonus}/raspberry-pi/odroid-setup.md (94%) rename {bonus => guide/bonus}/raspberry-pi/system-overview.md (97%) rename {bonus => guide/bonus}/raspberry-pi/trezor-agent.md (92%) rename {bonus => guide/bonus}/raspberry-pi/upgrade-external-drive.md (95%) rename faq.md => guide/faq.md (94%) rename static-channel-backup.md => guide/lightning/channel-backup.md (97%) rename lightning.md => guide/lightning/index.md (90%) rename lnd.md => guide/lightning/lightning-client.md (98%) rename mobile-app.md => guide/lightning/mobile-app.md (94%) rename rtl.md => guide/lightning/web-app.md (97%) rename raspberry-pi.md => guide/raspberry-pi/index.md (82%) rename operating-system.md => guide/raspberry-pi/operating-system.md (94%) rename preparations.md => guide/raspberry-pi/preparations.md (96%) rename privacy.md => guide/raspberry-pi/privacy.md (98%) rename remote-access.md => guide/raspberry-pi/remote-access.md (98%) rename security.md => guide/raspberry-pi/security.md (99%) rename system-configuration.md => guide/raspberry-pi/system-configuration.md (93%) rename troubleshooting-separator.md => guide/troubleshooting-separator.md (98%) rename troubleshooting.md => guide/troubleshooting.md (97%) create mode 100644 images/60_eps_first-start.png create mode 100644 images/60_eps_pip_install.png delete mode 100644 raspibolt/README.md diff --git a/include_metatags.md b/_includes/include_metatags.md similarity index 100% rename from include_metatags.md rename to _includes/include_metatags.md diff --git a/backstory.md b/guide/backstory.md similarity index 95% rename from backstory.md rename to guide/backstory.md index 22cbe6043..c54901e46 100644 --- a/backstory.md +++ b/guide/backstory.md @@ -4,7 +4,7 @@ title: Backstory nav_order: 10 --- -{% include_relative include_metatags.md %} +{% include include_metatags.md %} # Backstory {: .no_toc } @@ -47,7 +47,7 @@ This was the original goal of the RaspiBolt guide back in 2017: simply buying a I used the [Eclair](https://github.com/ACINQ/eclair){:target="_blank"} Lighting implementation back then, on Lightning testnet, as mainnet was not even running yet. Oh, how time flies... -[![Buying a Blockaccino](images/backstory_blockaccino.png)](https://vimeo.com/252693058){:target="_blank"} +[![Buying a Blockaccino](../images/backstory_blockaccino.png)](https://vimeo.com/252693058){:target="_blank"} Watch the [original screencast](https://vimeo.com/252693058){:target="_blank"} from back then. @@ -64,4 +64,4 @@ Thanks to everyone who cares about Bitcoin and feels that running your own Bitco --- -Next: [Rasperry Pi >>](raspberry-pi.md) +Next: [Rasperry Pi >>](raspberry-pi/index.md) diff --git a/bitcoin-core.md b/guide/bitcoin/bitcoin-client.md similarity index 98% rename from bitcoin-core.md rename to guide/bitcoin/bitcoin-client.md index 207908cdb..209e78711 100644 --- a/bitcoin-core.md +++ b/guide/bitcoin/bitcoin-client.md @@ -1,11 +1,11 @@ --- layout: default -title: Bitcoin Core +title: Bitcoin client nav_order: 10 parent: Bitcoin --- -# Bitcoin Core +# Bitcoin client {: .no_toc } We install [Bitcoin Core](https://bitcoin.org/en/bitcoin-core/){:target="_blank"}, the reference client implementation of the Bitcoin network. @@ -412,7 +412,7 @@ If everything is running smoothly, this is the perfect time to familiarize yours * you definitely need to have a [real copy](https://bitcoinbook.info/){:target="_blank"} of this book! * read it online on [Github](https://github.com/bitcoinbook/bitcoinbook){:target="_blank"} - ![Mastering Bitcoin](images/30_mastering_bitcoin_book.jpg){:target="_blank"} + ![Mastering Bitcoin](../../images/30_mastering_bitcoin_book.jpg){:target="_blank"} * [**Learning Bitcoin from the Command Line**](https://github.com/ChristopherA/Learning-Bitcoin-from-the-Command-Line/blob/master/README.md){:target="_blank"} by Christopher Allen gives a thorough deep dive into understanding the technical aspects of Bitcoin. @@ -457,7 +457,7 @@ When upgrading, there might be breaking changes, or changes in the data structur * There's no need to stop the application. Simply install the new version and restart the service. -* Download, verify, extract and install the Bitcoin Core binaries as described in the [Bitcoin section](bitcoin-core.md) of this guide. +* Download, verify, extract and install the Bitcoin Core binaries as described in the [Bitcoin section](bitcoin-client.md#installation) of this guide. * Restart the Bitcoin Core systemd unit @@ -469,4 +469,4 @@ When upgrading, there might be breaking changes, or changes in the data structur --- -Next: [Electrum >>](electrs.md) +Next: [Electrum server >>](electrum-server.md) diff --git a/btcrpcexplorer.md b/guide/bitcoin/blockchain-explorer.md similarity index 96% rename from btcrpcexplorer.md rename to guide/bitcoin/blockchain-explorer.md index 95992b589..b9511ba26 100644 --- a/btcrpcexplorer.md +++ b/guide/bitcoin/blockchain-explorer.md @@ -1,17 +1,17 @@ --- layout: default -title: Blockchain Explorer +title: Blockchain explorer nav_order: 30 parent: Bitcoin --- -# Blockchain Explorer +# Blockchain explorer {: .no_toc } Run your own private blockchain explorer with [BTC RPC Explorer](https://github.com/janoside/btc-rpc-explorer){:target="_blank"}. Trust your node, not some external services. -![BTC RPC Explorer home screen with dark theme](images/btcrpcexplorer-homepage.png) +![BTC RPC Explorer home screen with dark theme](../../images/btcrpcexplorer-homepage.png) --- @@ -42,7 +42,7 @@ For the BTC RPC Explorer to work, you need your full node to index all transacti * If you followed this guide, the transaction index parameter is already enabled (`txindex=1`), and you can skip to the next section. -* If this is not the case, you need to set the `txindex=1` parameter in your Bitcoin Core configuration file (`bitcoin.conf`): [Bitcoin node configuration](bitcoin-core.md#configuration). +* If this is not the case, you need to set the `txindex=1` parameter in your Bitcoin Core configuration file (`bitcoin.conf`): [Bitcoin node configuration](bitcoin-client.md#configuration). * After adding the parameter, restart Bitcoin Core, which will now index the whole blockchain @@ -70,7 +70,7 @@ You can follow the progress using `tail -f ~/.bitcoin/debug.log`. ### Firewall & reverse proxy -In the [Security section](security.md), we set up NGINX as a reverse proxy. +In the [Security section](../raspberry-pi/security.md#prepare-nginx-reverse-proxy), we set up NGINX as a reverse proxy. Now we can add the BTC RPC Explorer configuration. * Enable NGINX reverse proxy to route external encrypted HTTPS traffic internally to the BTC RPC Explorer @@ -344,5 +344,5 @@ Updating to a [new release](https://github.com/janoside/btc-rpc-explorer/release --- -Next: [Lightning >>](lightning.md) +Next: [Lightning >>](../lightning/index.md) diff --git a/electrs.md b/guide/bitcoin/electrum-server.md similarity index 96% rename from electrs.md rename to guide/bitcoin/electrum-server.md index c8ddaeec5..f987ea41c 100644 --- a/electrs.md +++ b/guide/bitcoin/electrum-server.md @@ -36,7 +36,7 @@ Wallets like the [BitBoxApp](https://shiftcrypto.ch/app/){:target="_blank"}, [El ## Preparations -Make sure that you have [reduced the database cache of Bitcoin Core](bitcoin-core.html#reduce-dbcache-after-full-sync) after full sync. +Make sure that you have [reduced the database cache of Bitcoin Core](bitcoin-client.md#reduce-dbcache-after-full-sync)#prepare-nginx-reverse-proxy after full sync. ### Install dependencies @@ -48,7 +48,7 @@ Make sure that you have [reduced the database cache of Bitcoin Core](bitcoin-cor ### Firewall & reverse proxy -In the [Security section](security.md), we already set up NGINX as a reverse proxy. +In the [Security section](../raspberry-pi/security.md), we already set up NGINX as a reverse proxy. Now we can add the Electrs configuration. * Enable NGINX reverse proxy to add SSL/TLS encryption to the Electrs communication. @@ -311,7 +311,7 @@ Only proceed with the next section once Electrs is ready. [Electrum wallet](https://electrum.org){:target="_blank"} is a well-established, feature-rich Bitcoin wallet for power-users that supports most hardware wallets. -![Electrum Wallet local](images/electrum-wallet-tor.png){:target="_blank"} +![Electrum Wallet local](../../images/electrum-wallet-tor.png){:target="_blank"} ### Force single server connection @@ -346,14 +346,14 @@ If you start Electrum, the green LED in the bottom right indicates an active con If you connect over Tor, make sure that Tor is installed on your regular computer. There are two options: -* Easy: download, install and run [Tor Browser](https://www.torproject.org). +* Easy: download, install and run [Tor Browser](https://www.torproject.org){:target="_blank"}. * The application must be started manually and run in the background whe you want to connect over Tor. * Tor proxy available on port `9150` * Expert: install Tor as a background service * The background service must be installed, and is always active in the background. * Tor proxy available on port `9050` - * See further installation instructions for [Windows](https://bitstobytes.org/tor), [macOS](https://deepdarkweb.github.io/how-to-install-tor-on-macos-tutorial/), and Linux (`sudo apt install tor`). + * See further installation instructions for [Windows](https://bitstobytes.org/tor){:target="_blank"}, [macOS](https://deepdarkweb.github.io/how-to-install-tor-on-macos-tutorial/){:target="_blank"}, and Linux (`sudo apt install tor`). Now we need to specifiy the Tor address for Electrs and the local Tor proxy port in the Electrum configuration. @@ -403,7 +403,7 @@ If you have Tor installed on your computer, you can access your RaspiBolt remote * Enable it and confirm the proxy address (usually the default `127.0.0.1:9050`) * When adding your RaspiBolt full node as described above, use your Tor address (e.g. `gwdllz5g7vky2q4gr45zGuvopjzf33czreca3a3exosftx72ekppkuqd.onion:50002`) -![BitBoxApp](images/electrum_BitBoxApp.png) +![BitBoxApp](../../images/electrum_BitBoxApp.png) --- @@ -459,4 +459,4 @@ Make sure to check the [release notes](https://github.com/romanz/electrs/blob/ma --- -Next: [Blockchain Explorer >>](btcrpcexplorer.md) +Next: [Blockchain explorer >>](blockchain-explorer.md) diff --git a/bitcoin.md b/guide/bitcoin/index.md similarity index 93% rename from bitcoin.md rename to guide/bitcoin/index.md index 336dbf97a..4d9291264 100644 --- a/bitcoin.md +++ b/guide/bitcoin/index.md @@ -5,7 +5,7 @@ nav_order: 30 has_children: true --- -{% include_relative include_metatags.md %} +{% include include_metatags.md %} # Bitcoin diff --git a/bonus-section-separator.md b/guide/bonus-section-separator.md similarity index 53% rename from bonus-section-separator.md rename to guide/bonus-section-separator.md index 642facda0..84dd3acc1 100644 --- a/bonus-section-separator.md +++ b/guide/bonus-section-separator.md @@ -3,4 +3,4 @@ layout: default title: __________________________ nav_order: 99 --- - \ No newline at end of file + diff --git a/bonus/bitcoin/electrum-personal-server.md.md b/guide/bonus/bitcoin/electrum-personal-server.md similarity index 84% rename from bonus/bitcoin/electrum-personal-server.md.md rename to guide/bonus/bitcoin/electrum-personal-server.md index 62b39518f..f3c0af777 100644 --- a/bonus/bitcoin/electrum-personal-server.md.md +++ b/guide/bonus/bitcoin/electrum-personal-server.md @@ -28,15 +28,15 @@ Status: Not tested v3 ### Introduction -The best way to safekeep your bitcoin (meaning the best combination of security and usability) is to use a hardware wallet (like [Ledger](https://www.ledgerwallet.com/) or [Trezor](https://trezor.io/)) in combination with your own Bitcoin node. This gives you security, privacy and eliminates the need to trust a third party to verify transactions. +The best way to safekeep your bitcoin (meaning the best combination of security and usability) is to use a hardware wallet (like [Ledger](https://www.ledgerwallet.com/){:target="_blank"} or [Trezor](https://trezor.io/)){:target="_blank"} in combination with your own Bitcoin node. This gives you security, privacy and eliminates the need to trust a third party to verify transactions. With the RaspiBolt setup, the Bitcoin Core wallet on the node can only be used from the command line as no graphical user interface is installed. As Bitcoin Core does not offer support for hardware wallets, only a "hot wallet" (exposed to the internet) can be realized. -One possibility to use Bitcoin Core with more functionality is to set up an additional [ElectrumX](https://github.com/kyuupichan/electrumx) server and then use the great [Electrum wallet](https://electrum.org/) (on your regular computer) that integrates with hardware wallets. But this setup is not easy, and the overhead is more than a Raspberry Pi can handle. +One possibility to use Bitcoin Core with more functionality is to set up an additional [ElectrumX](https://github.com/kyuupichan/electrumx){:target="_blank"} server and then use the great [Electrum wallet](https://electrum.org/){:target="_blank"} (on your regular computer) that integrates with hardware wallets. But this setup is not easy, and the overhead is more than a Raspberry Pi can handle. -The new [Electrum Personal Server](https://github.com/chris-belcher/electrum-personal-server) makes it possible to connect Electrum (using your hardware wallet) directly to your RaspiBolt. In contrast to ElectrumX, this is not a full server that serves multiple users, but your own dedicated backend. +The new [Electrum Personal Server](https://github.com/chris-belcher/electrum-personal-server){:target="_blank"} makes it possible to connect Electrum (using your hardware wallet) directly to your RaspiBolt. In contrast to ElectrumX, this is not a full server that serves multiple users, but your own dedicated backend. -Before using this setup, please familiarize yourself with all components by setting up your own Electrum wallet, visiting the linked project websites and reading [The Electrum Personal Server Will Give Users the Full Node Security They Need](https://bitcoinmagazine.com/articles/electrum-personal-server-will-give-users-full-node-security-they-need/) in Bitcoin Magazine. +Before using this setup, please familiarize yourself with all components by setting up your own Electrum wallet, visiting the linked project websites and reading [The Electrum Personal Server Will Give Users the Full Node Security They Need](https://bitcoinmagazine.com/articles/electrum-personal-server-will-give-users-full-node-security-they-need/){:target="_blank"} in Bitcoin Magazine. ### Preparations @@ -46,7 +46,7 @@ Before using this setup, please familiarize yourself with all components by sett $ sudo pip3 install setuptools ``` -* Configure firewall to allow incoming requests (please check if you need to adjust the subnet mask as [described in original setup](raspibolt_20_pi.md#enabling-the-uncomplicated-firewall)) +* Configure firewall to allow incoming requests (please check if you need to adjust the subnet mask as [described in original setup](../../raspberry-pi/security.md#enabling-the-uncomplicated-firewall)) ```sh $ sudo ufw allow from 192.168.0.0/24 to any port 50002 comment 'allow EPS from local network' $ sudo ufw enable @@ -66,7 +66,7 @@ Electrum Personal Server uses the Bitcoin Core wallet with "watch-only" addresse * Open a "bitcoin" user session and change into the home directory `$ sudo su - bitcoin` -* Download, verify and extract the latest release (check the [Releases page](https://github.com/chris-belcher/electrum-personal-server/releases) on Github for the correct links) +* Download, verify and extract the latest release (check the [Releases page](https://github.com/chris-belcher/electrum-personal-server/releases){:target="_blank"} on Github for the correct links) ```sh # create new directory on external hdd @@ -118,10 +118,10 @@ Electrum Personal Server uses the Bitcoin Core wallet with "watch-only" addresse $ pip3 install --user . ``` - ![Install Electrum Personal Server with Python Pip](./images/60_eps_pip_install.png) + ![Install Electrum Personal Server with Python Pip](../../../images/60_eps_pip_install.png) ### First start -The Electrum Personal Server scripts are installed in the directory `/home/bitcoin/.local/bin/`. Unfortunately, in Raspberry Pi OS this directory is not in the system path, so the full path needs to be specified when calling these scripts. Alternatively, just [add this directory to your $PATH environment variable](https://unix.stackexchange.com/questions/26047/how-to-correctly-add-a-path-to-path), but it's not necessary in this guide. +The Electrum Personal Server scripts are installed in the directory `/home/bitcoin/.local/bin/`. Unfortunately, in Raspberry Pi OS this directory is not in the system path, so the full path needs to be specified when calling these scripts. Alternatively, just [add this directory to your $PATH environment variable](https://unix.stackexchange.com/questions/26047/how-to-correctly-add-a-path-to-path){:target="_blank"}, but it's not necessary in this guide. * The first time the server is run it will import all configured addresses as watch-only into the Bitcoin node. This can take up to 10 minutes, after that the program will exit. ```sh @@ -143,7 +143,7 @@ The Electrum Personal Server scripts are installed in the directory `/home/bitco $ /home/bitcoin/.local/bin/electrum-personal-server /home/bitcoin/electrum-personal-server/config.cfg ``` - [![Run Electrum Personal Server manually](images/60_eps_first-start.png)](images/60_eps_first-start.png) + [![Run Electrum Personal Server manually](../../../images/60_eps_first-start.png) ### Connect Electrum @@ -153,11 +153,11 @@ On your regular computer, configure Electrum to use your RaspiBolt: * Uncheck "Select server automatically" * Enter the IP of your RaspiBolt (eg. 192.168.0.20) in the address field - [![Connect Electrum to RaspiBolt](images/60_eps_electrum-connect.png)](images/60_eps_electrum-connect.png) + [![Connect Electrum to RaspiBolt](../../../images/60_eps_electrum-connect.png) * `Close` and check connection in tab "Console" - [![Check Electrum console](images/60_eps_electrumwallet.png)](images/60_eps_electrumwallet.png) + [![Check Electrum console](../../../images/60_eps_electrumwallet.png) * This can also be achived by starting the Electrum wallet with the following command line arguments: `--oneserver --server 192.168.0.20:50002:s` diff --git a/bonus/bitcoin/index.md b/guide/bonus/bitcoin/index.md similarity index 100% rename from bonus/bitcoin/index.md rename to guide/bonus/bitcoin/index.md diff --git a/bonus/bitcoin/mempool.md b/guide/bonus/bitcoin/mempool.md similarity index 97% rename from bonus/bitcoin/mempool.md rename to guide/bonus/bitcoin/mempool.md index 262bb9c07..e3e9db775 100644 --- a/bonus/bitcoin/mempool.md +++ b/guide/bonus/bitcoin/mempool.md @@ -21,7 +21,7 @@ Difficulty: Medium Status: Tested v3 {: .label .label-green } -![Mempool](../../images/mempool.png) +![Mempool](../../../images/mempool.png) --- @@ -56,7 +56,7 @@ To run Mempool, we need to run Node.js v16 or above. > v16.13.1 ``` -* If Node.js is not installed, follow [this guide](https://raspibolt.org/btcrpcexplorer.html#install-nodejs) to install it. If the version is v14 or older, update it following [this tutorial](https://phoenixnap.com/kb/update-node-js-version){:target="_blank"}. +* If Node.js is not installed, follow [this guide](../../bitcoin/blockchain-explorer.md#install-nodejs) to install it. If the version is v14 or older, update it following [this tutorial](https://phoenixnap.com/kb/update-node-js-version){:target="_blank"}. ### Firewall diff --git a/bonus/bitcoin/specter-desktop.md b/guide/bonus/bitcoin/specter-desktop.md similarity index 95% rename from bonus/bitcoin/specter-desktop.md rename to guide/bonus/bitcoin/specter-desktop.md index 138b370de..c8ed4ed4d 100644 --- a/bonus/bitcoin/specter-desktop.md +++ b/guide/bonus/bitcoin/specter-desktop.md @@ -17,14 +17,15 @@ Difficulty: Intermediate Status: Not tested v3 {: .label .label-yellow } -
- - Table of contents - - {: .text-delta } +--- + +Table of contents +{: .text-delta } + 1. TOC {:toc} -
+ +--- The Specter Desktop app is a project that's working on making a convenient and user-friendly GUI around Bitcoin Core with a focus on ***multisignature setup with hardware wallets and airgapped devices***. @@ -193,7 +194,7 @@ These instructions will clone the repo to fetch the latest version and then "pip ``` -- Add the following udev rules based on the devices you require support for. The rules are based on [rules from the `bitcoin-core` repo](https://github.com/bitcoin-core/HWI/blob/master/hwilib/udev/README.md). +- Add the following udev rules based on the devices you require support for. The rules are based on [rules from the `bitcoin-core` repo](https://github.com/bitcoin-core/HWI/blob/master/hwilib/udev/README.md){:target="_blank"}. - #### Ledger @@ -340,7 +341,7 @@ Test Specter Desktop manually first to make sure it works. - Next we will test that Specter Desktop can detect your hardware wallet. Go to **Settings _(top right)_** -> **USB Devices _(tab)_** -> **Test connection _(bottom)_**. A blue popup should appear to the top of the page with the message `"Device detected successfully! USB connections configured correctly!"` - ![Hardware device check](images/76_specter_desktop1.gif) + ![Hardware device check](../../../images/76_specter_desktop1.gif) - Stop Specter Desktop in the terminal with Ctrl-C and exit the "specter" user session. ```sh @@ -394,7 +395,7 @@ If you would like to connect your hardware wallets to your laptop/computer inste With this, Specter is also downloaded and installed on the laptop/computer and then connected to the instance running on the Raspberry Pi. The two instances then communicate with the local laptop/computer instance handling the direct USB connection and the remote instance handling the connection to `bitcoind` via its RPC interface. -**\> Instructions for configuring this setup can be found at [hwibridge.md](https://github.com/cryptoadvance/specter-desktop/blob/v1.3.0/docs/hwibridge.md).** +** Instructions for configuring this setup can be found at [hwibridge.md](https://github.com/cryptoadvance/specter-desktop/blob/v1.3.0/docs/hwibridge.md){:target="_blank"}.** **Advantages** - The Bitcoin RPC ports remains locked down and local only to the Raspberry Pi @@ -408,13 +409,13 @@ With this, Specter is also downloaded and installed on the laptop/computer and t With this option, Specter is installed ***only*** on the user's laptop/computer and then made to talk directly to the Bitcoin RPC to get its blockchain data and access to the Bitcoin network. -**\> Instructions for configuring this setup can be found at [connect-your-node.md](https://github.com/cryptoadvance/specter-desktop/blob/v1.3.0/docs/connect-your-node.md).** +** Instructions for configuring this setup can be found at [connect-your-node.md](https://github.com/cryptoadvance/specter-desktop/blob/v1.3.0/docs/connect-your-node.md){:target="_blank"}.** **Advantages** - Specter only needs to be setup and maintained in one place **Disadvantages** - - The Bitcoin RPC port must be made available outside of the Raspberry Pi's internal `localhost` network. It must first be made available to the local LAN network, and then optionally to the wider web via port forwarding if the user wishes to use Specter outside the local LAN network. + - The Bitcoin RPC port must be made available outside of the Raspberry Pi's internal `localhost` network. It must first be made available to the local LAN network, and then optionally to the wider web via port forwarding if the user wishes to use Specter outside the local LAN network. This comes with its own security considerations that the user should be wary of. @@ -424,7 +425,7 @@ This is similar to **Option 1** in that two running instances of Specter Desktop This 3rd option is more involved though since the user must also install/configure Tor, setup Tor hidden services for each instance on it's machine, and then configure both instances to communicate with each other through a Tor proxy. -**\> Instructions for configuring this setup can be found at [tor.md](https://github.com/cryptoadvance/specter-desktop/blob/v1.3.0/docs/tor.md).** +**\> Instructions for configuring this setup can be found at [tor.md](https://github.com/cryptoadvance/specter-desktop/blob/v1.3.0/docs/tor.md){:target="_blank"}.** **Advantages** - The Bitcoin RPC ports remains locked down and local only to the Raspberry Pi @@ -440,13 +441,13 @@ This 3rd option is more involved though since the user must also install/configu For certain hardware wallets that are air-gapped and communicate via QR code only, an SSL certificate must be configure for the Specter Desktop service running inside the browser. -**\> Instructions for setting this up can be found at [self-signed-certificates.md](https://github.com/cryptoadvance/specter-desktop/blob/v1.3.0/docs/self-signed-certificates.md).** +**\> Instructions for setting this up can be found at [self-signed-certificates.md](https://github.com/cryptoadvance/specter-desktop/blob/v1.3.0/docs/self-signed-certificates.md){:target="_blank"}.** --- # Upgrade -Updating to a [new release](https://github.com/cryptoadvance/specter-desktop/releases) should be straight-forward, but make sure to check out [the changes](https://github.com/cryptoadvance/specter-desktop/releases/latest) first. +Updating to a [new release](https://github.com/cryptoadvance/specter-desktop/releases){:target="_blank"} should be straight-forward, but make sure to check out [the changes](https://github.com/cryptoadvance/specter-desktop/releases/latest){:target="_blank"} first. - From user “admin”, stop the service and open a "specter" user session ```sh diff --git a/bonus/bitcoin/white-paper.md b/guide/bonus/bitcoin/white-paper.md similarity index 97% rename from bonus/bitcoin/white-paper.md rename to guide/bonus/bitcoin/white-paper.md index fd4978e25..5da547e7b 100644 --- a/bonus/bitcoin/white-paper.md +++ b/guide/bonus/bitcoin/white-paper.md @@ -21,7 +21,7 @@ Difficulty: Easy Status: Tested v3 {: .label .label-green } -![Explorer white paper page](../../images/paper-pink.png) +![Explorer white paper page](../../../images/paper-pink.png) --- @@ -150,7 +150,7 @@ See [How to Use Putty pscp to Copy Files](https://tonyteaches.tech/putty-pscp-tu The BTC-RPC-Explorer has also a functionality to extract the data from the node and display the PDF in the web browser. -![Explorer white paper page](../../images/white-paper-transac.png) +![Explorer white paper page](../../../images/white-paper-transac.png) * Open your Explorer at [https://raspibolt.local:4000/](https://raspibolt.local:4000/){:target="_blank"} (replace raspibolt.local with your node IP address if needed). diff --git a/bonus/index.md b/guide/bonus/index.md similarity index 99% rename from bonus/index.md rename to guide/bonus/index.md index fb598aa7a..4687b66d6 100644 --- a/bonus/index.md +++ b/guide/bonus/index.md @@ -27,7 +27,7 @@ In the following categories, you can find various additional and optional guides All bonus guides are rated with labels to help you assess the difficulty of each guide, and if it is tested against the most recent version of the main guide. * Difficulty: indicates how difficult the bonus guide is in term of installation procedure or usage - + Difficulty: Easy {: .label .label-green } @@ -41,7 +41,7 @@ All bonus guides are rated with labels to help you assess the difficulty of each Status: Tested v3 {: .label .label-green } - + Status: Not tested v3 {: .label .label-yellow } diff --git a/bonus/lightning/auto-unlock.md b/guide/bonus/lightning/auto-unlock.md similarity index 100% rename from bonus/lightning/auto-unlock.md rename to guide/bonus/lightning/auto-unlock.md diff --git a/bonus/lightning/balance-of-satoshis.md b/guide/bonus/lightning/balance-of-satoshis.md similarity index 93% rename from bonus/lightning/balance-of-satoshis.md rename to guide/bonus/lightning/balance-of-satoshis.md index 24d1fadc1..1e500ed3a 100644 --- a/bonus/lightning/balance-of-satoshis.md +++ b/guide/bonus/lightning/balance-of-satoshis.md @@ -20,7 +20,7 @@ Difficulty: Medium Status: Tested v3 {: .label .label-green } -![bos-rebalance](../../images/bos-illustration.png) +![bos-rebalance](../../../images/bos-illustration.png) --- @@ -50,7 +50,7 @@ Table of contents > v16.13.2 ``` -* If the version is v12 or above, you can move to the next section. If Node.js is not installed, follow [this guide](https://raspibolt.org/btcrpcexplorer.html#install-nodejs) to install it. +* If the version is v12 or above, you can move to the next section. If Node.js is not installed, follow [this guide](../../bitcoin/blockchain-explorer.md#install-nodejs) to install it. ### Create the "bos" user and prepare the directory @@ -67,7 +67,7 @@ Table of contents ```sh $ ln -s /data/lnd /home/bos/.lnd ``` - + * Display the link and check that it's not shown in red (this would indicate an error) ```sh @@ -75,7 +75,7 @@ Table of contents ``` * Add the bos binary file location to PATH - + ```sh $ echo 'export PATH=$PATH:/home/bos/balanceofsatoshis' >> /home/bos/.bashrc $ source /home/bos/.bashrc @@ -93,14 +93,14 @@ Table of contents ``` * Still with user "bos", download the source code and install it - + ```sh $ git clone https://github.com/alexbosworth/balanceofsatoshis.git $ cd balanceofsatoshis ``` - -* Find the most recent tag and verify the signature. Add the `--tags` option to select even a lightweight/non-annotated tag. Add the `--abbrev=0` option to remove any long-format tag names. - + +* Find the most recent tag and verify the signature. Add the `--tags` option to select even a lightweight/non-annotated tag. Add the `--abbrev=0` option to remove any long-format tag names. + ```sh $ git describe --tags --abbrev=0 > v11.14.0 @@ -112,11 +112,11 @@ Table of contents ``` * Install Balance of Satoshis locally - + ```sh $ npm install > [...] - ``` + ``` * Check the version with the `-V` option @@ -124,9 +124,9 @@ Table of contents $ bos -V > v11.14.0 ``` - + --- - + ## Balance of Satoshis in action To use Balance of Satoshis, we will use the "bos" user. @@ -134,34 +134,34 @@ To use Balance of Satoshis, we will use the "bos" user. ### Introduction * To see a list of all available commands run the following command - + ```sh $ bos help - > bos 11.14.0 - > + > bos 11.14.0 + > > USAGE - > + > > bos [options] - > + > > COMMANDS - > + > > accounting Get an accounting rundown > [...] ``` - + * To see detailed information about an individual command, add the name of the command, e.g. with the command `rebalance` - + ```sh $ bos help rebalance - > bos 11.14.0 - > + > bos 11.14.0 + > > USAGE - > - > bos rebalance + > + > bos rebalance > Change the liquidity profile of two peers > [...] ``` - + * Get a short report of your LN node with pubkey, alias, local capacity, mempool information and recent routing activity ```sh @@ -178,26 +178,26 @@ To use Balance of Satoshis, we will use the "bos" user. > [...] ``` -### Circular rebalancing +### Circular rebalancing -Circular rebalancing allows to send satoshis out through one channel (which has too little inbound liquidity) and back through another channel (which has too little outbound liquidity). +Circular rebalancing allows to send satoshis out through one channel (which has too little inbound liquidity) and back through another channel (which has too little outbound liquidity). A good illustration is provided in Chapter 5 of 'Mastering the Lighnting Network' by Antonopoulos *et al.* ([source](https://github.com/lnbook/lnbook/blob/ec806916edd6f4d1b2f9da2fef08684f80acb671/05_node_operations.asciidoc#rebalancing-channels){:target="_blank"}) (Alice (A), is your node, Bob (B) and and Chan (C) are two peers with whom you have an opened channel with): -![circular-rebalancing](../../images/circular-rebalancing-lnbook.png) +![circular-rebalancing](../../../images/circular-rebalancing-lnbook.png) * To rebalance a channel (to node B) with high outbound and a channel with high inbound (to node C), use the `rebalance` command. ```sh $ bos rebalance --amount [AMOUNT_IN_SATS] --max-fee-rate [TOTAL_MAX_FEE_RATE_OF_REBALANCING] --in [NODE_C_PUBKEY] --out [NODE_A_PUBKEY] ``` - + * E.g. using the example above: - * with node B being the [Bitrefill node](https://amboss.space/node/03d607f3e69fd032524a867b288216bfab263b6eaee4e07783799a6fe69bb84fac){:target="_blank"}, - * node C being the [CoinOS node](https://amboss.space/node/02868e12f320073cad0c2959c42559fbcfd1aa326fcb943492ed7f02c9820aa399){:target="_blank"} - * rebalancing 50,000 sats + * with node B being the [Bitrefill node](https://amboss.space/node/03d607f3e69fd032524a867b288216bfab263b6eaee4e07783799a6fe69bb84fac){:target="_blank"}, + * node C being the [CoinOS node](https://amboss.space/node/02868e12f320073cad0c2959c42559fbcfd1aa326fcb943492ed7f02c9820aa399){:target="_blank"} + * rebalancing 50,000 sats * with a maximum fee rate that you are ready to pay of 100 ppm max - + ```sh $ bos rebalance --amount 50000 --max-fee-rate 100 --in 02868e12f320073cad0c2959c42559fbcfd1aa326fcb943492ed7f02c9820aa399 --out 03d607f3e69fd032524a867b288216bfab263b6eaee4e07783799a6fe69bb84fac ``` @@ -207,9 +207,9 @@ A good illustration is provided in Chapter 5 of 'Mastering the Lighnting Network ```sh $ bos rebalance --minutes [NUMBER_OF_MINUTES] --amount [AMOUNT_IN_SATS] --max-fee-rate [TOTAL_MAX_FEE_RATE_OF_REBALANCING] --in [NODE_C_PUBKEY] --out [NODE_A_PUBKEY] ``` - + * If you notice that a node in the tried paths is repeatedly the cause of failures, you can ask BoS to ignore this node during path finding by adding the `--avoid` option - + ```sh $ bos rebalance --minutes [number_of_minutes] --amount [AMOUNT_IN_SATS] --max-fee-rate [TOTAL_MAX_FEE_RATE_OF_REBALANCING] --avoid [NODE_PUBKEY] --in [NODE_C_PUBKEY] --out [NODE_A_PUBKEY] ``` @@ -224,26 +224,26 @@ BoS allows to create user-defined tags to classify nodes and then be used in the ```sh $ bos tags avoid-nodes --add [NODE_Y_PUBKEY] --add [NODE_Z_PUBKEY] - > tag: + > tag: > alias: avoid-nodes > id: abc123... - > nodes: + > nodes: > - [NODE_Y_PUBKEY] > - [NODE_Z_PUBKEY] ``` - + * Check the content of an existing tag ```sh $ bos tags - > tags: + > tags: > alias: avoid-nodes > id: abc123... - > nodes: + > nodes: > - [NODE_Y_PUBKEY] > - [NODE_Z_PUBKEY] ``` - + * Use the tag in commands, e.g. with `bos rebalance` ```sh @@ -279,7 +279,7 @@ You can also join the Balance of Satoshis Telegram group to get support: [https: ``` * Update the local repository by downloading the new commits from the source repository and check if a new tag/version is available (e.g. here v99.99.9) - + ```sh $ git fetch > [...] @@ -287,8 +287,8 @@ You can also join the Balance of Satoshis Telegram group to get support: [https: ``` * Find the most recent tag. Add the `--tags` option to select even a lightweight/non-annotated tag. Add the `--abbrev=0` option to remove any long-format tag names. - - ```sh + + ```sh $ git describe --tags --abbrev=0 > v11.14.0 ``` @@ -302,24 +302,24 @@ You can also join the Balance of Satoshis Telegram group to get support: [https: * Switch to new branch identified with `git fetch` (i.e. v99.99.9) and check that it is now the most recent tag - ```sh + ```sh $ git checkout v99.99.9 > Previous HEAD position was 1b2a38d add docs for coop close on open > HEAD is now at dd58fc0 [...] $ git describe --tags --abbrev=0 > v99.99.9 ``` - + * Check the GPG signature of the new version - + ```sh $ git verify-tag v99.99.9 > gpg: Signature made Tue 07 Dec 2021 03:57:11 GMT > gpg: using RSA key DE23E73BFA8A0AD5587D2FCDE80D2F3F311FD87E > gpg: Good signature from "Alex Bosworth " [unknown] > [...] - ``` - + ``` + * Install the new version and check this it has been installed properly ```sh @@ -340,7 +340,7 @@ If you want to uninstall Balance of Satoshis: ```sh $ sudo su - $ userdel -r bos - ``` + ``` --- @@ -348,7 +348,7 @@ If you want to uninstall Balance of Satoshis: Balance of Satoshis allows connecting a node to a Telegram bot to receive updates about routing forwards, channel opening and closing events, successful rebalancing payments, payments received, keysend messages etc. It also saves a copy of `channel.backup` (SCB) each time there is a channel being opened or closed. -![bos-tg-bot](../../images/bos-bot.png) +![bos-tg-bot](../../../images/bos-bot.png) *Requirements:* a Telegram account @@ -362,10 +362,10 @@ Balance of Satoshis allows connecting a node to a Telegram bot to receive update ### Torify -To avoid leaking our node IP address to Telegram, we can force bos to use Tor using the [`torify`](https://gitlab.torproject.org/legacy/trac/-/wikis/doc/TorifyHOWTO) utility. To do this, we first need to edit the `torsocks.conf` file. +To avoid leaking our node IP address to Telegram, we can force bos to use Tor using the [`torify`](https://gitlab.torproject.org/legacy/trac/-/wikis/doc/TorifyHOWTO){:target="_blank"} utility. To do this, we first need to edit the `torsocks.conf` file. * Using the "admin" user, edit the `torsocks.conf` file by uncommenting the `AllowOutboundLocalhost` and setting the value to 1. Save (Ctrl+O) and exit (Ctrl+X) - + ```sh $ sudo nano /etc/tor/torsocks.conf ``` @@ -373,7 +373,7 @@ To avoid leaking our node IP address to Telegram, we can force bos to use Tor us AllowOutboundLocalhost 1 ``` * Restart Tor - + ```sh $ sudo systemctl reload tor ``` @@ -381,17 +381,17 @@ To avoid leaking our node IP address to Telegram, we can force bos to use Tor us ### Use bos to connect your node to the bot * Change to the "bos" user - + ```sh $ sudo su - bos ``` * Now, we are going to request bos to connect our node to the TG bot - + ```sh $ /usr/bin/torify bos telegram ``` - + * When prompted, enter the HTTP API token that the @BotFather gave you earlier * Go to your new TG bot feed and type `/connect`. Your bot will give you a connection code @@ -405,12 +405,12 @@ To avoid leaking our node IP address to Telegram, we can force bos to use Tor us * Your TG bot will now receive notifications from your nodes for various events as described in the introduction. * Leave the temporary session by pressing Ctrl+C and log out of the "bos" user - + ```sh $ exit ``` -### Permannent connection and autostart on boot +### Permannent connection and autostart on boot Now we’ll make sure our Telegram Bot command starts as a systemd service on the Raspberry Pi so it’s always running. @@ -419,9 +419,9 @@ Now we’ll make sure our Telegram Bot command starts as a systemd service on th ```sh $ sudo nano /etc/systemd/system/bos-telegram.service ``` - + * Paste the following configuration. Replace YourConnectionCode with your own connection code provided by your bot above. Save and exit. - + ```ini # /etc/systemd/system/bos-telegram.service @@ -430,7 +430,7 @@ Now we’ll make sure our Telegram Bot command starts as a systemd service on th Wants=lnd.service After=lnd.service - [Service] + [Service] ExecStart=/usr/bin/torify /home/bos/balanceofsatoshis/bos telegram --connect YourConnectionCode User=bos Restart=always @@ -440,11 +440,11 @@ Now we’ll make sure our Telegram Bot command starts as a systemd service on th StandardError=journal [Install] - WantedBy=multi-user.target + WantedBy=multi-user.target ``` - + * Enable the service, start it and check the status of the service. You should also receive a connection message from your TG bot ('Connect to ...'). - + ```sh $ sudo systemctl enable bos-telegram.service $ sudo systemctl start bos-telegram.service @@ -457,7 +457,7 @@ Now we’ll make sure our Telegram Bot command starts as a systemd service on th > CPU: 7.981s > CGroup: /system.slice/bos-telegram.service > `-4682 node /home/bos/.npm-global/bin/bos telegram --connect 1536853548 - ``` + ``` * To monitor the live logging output use the following command. Exit with Ctrl+C. diff --git a/bonus/lightning/charge-lnd.md b/guide/bonus/lightning/charge-lnd.md similarity index 97% rename from bonus/lightning/charge-lnd.md rename to guide/bonus/lightning/charge-lnd.md index e7d988028..76a9193cc 100644 --- a/bonus/lightning/charge-lnd.md +++ b/guide/bonus/lightning/charge-lnd.md @@ -20,7 +20,7 @@ Difficulty: Easy Status: Tested v3 {: .label .label-green } -![charge-lnd policies](../../images/charge-lnd-illustration.png) +![charge-lnd policies](../../../images/charge-lnd-illustration.png) --- @@ -44,7 +44,7 @@ Table of contents `pip` is not installed by default on Raspberry Pi OS Lite (64-bit). * With user "admin", check if pip3 is already installed with the following command. If you don't get an output with a version number it means you need to install pip3 (otherwise, move to the next section "Install charge-lnd"). - + ```sh $ pip3 --version ``` @@ -68,21 +68,21 @@ Table of contents * `info:read` * With the "lnd" user, create (or 'bake') a suitably limited LND macaroon, then exit back to "admin" - + ```sh $ sudo su - lnd $ lncli bakemacaroon offchain:read offchain:write onchain:read info:read --save_to=~/.lnd/data/chain/bitcoin/mainnet/charge-lnd.macaroon > Macaroon saved to /home/lnd/.lnd/data/chain/bitcoin/mainnet/charge-lnd.macaroon $ exit ``` - + * With user "admin", create a new user "chargelnd" and make it a member of the "lnd" group ```sh $ sudo adduser --disabled-password --gecos "" chargelnd $ sudo adduser chargelnd lnd ``` - + * With the "charge-lnd" user, clone the charge-lnd repository, enter the directory and install the program and required packages using `pip3` ```sh @@ -123,7 +123,7 @@ Table of contents > path to config file ``` -* Create a symlink to the LND directory. Place it in the home directory of the "chargelnd" user to match the default LND directory used by charge-lnd (*i.e.* `~/.lnd`) +* Create a symlink to the LND directory. Place it in the home directory of the "chargelnd" user to match the default LND directory used by charge-lnd (*i.e.* `~/.lnd`) ```sh $ ln -s /data/lnd /home/chargelnd/.lnd @@ -135,12 +135,12 @@ Table of contents $ cd ~/ $ ls -la ``` - + --- ## Configuration file -For this example, we will use a policy that: +For this example, we will use a policy that: 1. Defines some default parameters @@ -149,7 +149,7 @@ For this example, we will use a policy that: 1. Then ignores some channels that we want to deal with manually (*e.g.* a liquidity sink) 1. And finally apply a fixed fee rate for two groups of channels - + 🚨 Warning: The policy below is just an example, _do_ change the policy according to your own strategy and needs! All the options are listed and described [here](https://github.com/accumulator/charge-lnd){:target="_blank"} * Still with user "chargelnd", create and open a configuration file @@ -200,7 +200,7 @@ For this example, we will use a policy that: strategy = static fee_ppm = 50 - + [5_high_fees_policy] node.id = , @@ -208,7 +208,7 @@ For this example, we will use a policy that: fee_ppm = 200 ``` -* Test if the syntax is correct or if it contains some errors using the --check option. +* Test if the syntax is correct or if it contains some errors using the --check option. Indicate where the configuration file is located using the -c option ```sh @@ -254,7 +254,7 @@ You can make the script run automatically at regular time intervals by using a c 🚨 Warning: It is not in your interest, nor in the interest of the wider network, to set up very short intervals between each policy change. Frequent channel policy update spams the LN gossip network and results in less accurate LN graphs overall as it takes a long time for a policy update to reach most of the nodes in the network. -* We the "admin" user, create and edit (option -e) the `crontab` file of the "charge-lnd" user (option -u). +* We the "admin" user, create and edit (option -e) the `crontab` file of the "charge-lnd" user (option -u). If asked, select the `/bin/nano` text editor (type 1 and enter) ```sh @@ -269,10 +269,10 @@ If asked, select the `/bin/nano` text editor (type 1 and enter) ########################################## # Run charge-lnd every 2 hours at the 21st minute; and log the updates in the /tmp/my_charge-lnd.log log file - 21 */6 * * * /home/charge-lnd/.local/bin/charge-lnd -c /home/chargelnd/charge-lnd.config > /tmp/my-charge-lnd.log 2>&1; date >> /tmp/my-charge-lnd.log + 21 */6 * * * /home/charge-lnd/.local/bin/charge-lnd -c /home/chargelnd/charge-lnd.config > /tmp/my-charge-lnd.log 2>&1; date >> /tmp/my-charge-lnd.log ``` - * The stars and numbers at the start defines the interval at which the job will be run. You can double-check it by using this online tool: [https://crontab.guru](https://crontab.guru/#21_*/6_*_*_*){:target="_blank"}. + * The stars and numbers at the start defines the interval at which the job will be run. You can double-check it by using this online tool: [https://crontab.guru](https://crontab.guru/#21_*/6_*_*_*){:target="_blank"}. * `/home/charge-lnd/.local/bin/charge-lnd -c /home/chargelnd/charge-lnd.config` is the command to be run and where to find it (its path) together with the required option(s) (here the location of the configuration file). * `> /tmp/my-charge-lnd.log 2>&1; date >> /tmp/my-charge-lnd.log` records the updates in a `my-charge-lnd.log` log file. @@ -309,7 +309,7 @@ If you need to check the log files: ``` * Fetch the latest version and install it (*e.g.* v9.9.9) - + ```sh $ git fetch $ git describe --tags --abbrev=0 @@ -322,7 +322,7 @@ If you need to check the log files: $ pip3 install -r requirements.txt . > [...] ``` - + --- ## Uninstall diff --git a/bonus/lightning/circuit-breaker.md b/guide/bonus/lightning/circuit-breaker.md similarity index 99% rename from bonus/lightning/circuit-breaker.md rename to guide/bonus/lightning/circuit-breaker.md index 6e5994f6f..61c15003f 100644 --- a/bonus/lightning/circuit-breaker.md +++ b/guide/bonus/lightning/circuit-breaker.md @@ -20,7 +20,7 @@ Difficulty: Easy Status: Tested v3 {: .label .label-green } -![circuit-breaker-tweet](../../images/circuit-breaker-tweet.png) +![circuit-breaker-tweet](../../../images/circuit-breaker-tweet.png) --- diff --git a/bonus/lightning/index.md b/guide/bonus/lightning/index.md similarity index 94% rename from bonus/lightning/index.md rename to guide/bonus/lightning/index.md index 9648b26c8..c45349ab6 100644 --- a/bonus/lightning/index.md +++ b/guide/bonus/lightning/index.md @@ -26,8 +26,8 @@ has_toc: false #### *CLI-only* * **[lntop](lntop.md)** - lntop is an interactive text-mode channels viewer for Unix systems -* **[lnbalance](script-lnbalance.md)** - a simple node balances viewer -* **[lnchannels](script-lnchannels.md)** - a simple channels viewer +* **[lnbalance](lnbalance.md)** - a simple node balances viewer +* **[lnchannels](lnchannels.md)** - a simple channels viewer #### *GUI - Desktop* * **[Zap](zap-desktop.md)** - a cross platform Lightning Network wallet focused on user experience and ease of use diff --git a/bonus/lightning/script-lnbalance.md b/guide/bonus/lightning/lnbalance.md similarity index 95% rename from bonus/lightning/script-lnbalance.md rename to guide/bonus/lightning/lnbalance.md index a773f8b2e..411733442 100644 --- a/bonus/lightning/script-lnbalance.md +++ b/guide/bonus/lightning/lnbalance.md @@ -7,7 +7,7 @@ nav_exclude: true has_toc: false --- -# Bonus guide: lnbalance script +# Bonus guide: lnbalance {: .no_toc } --- @@ -20,7 +20,7 @@ Difficulty: Easy Status: Tested v3 {: .label .label-green } -![lnbalance illustration](../../images/60_balance.png) +![lnbalance illustration](../../../images/60_balance.png) --- diff --git a/bonus/lightning/script-lnchannels.md b/guide/bonus/lightning/lnchannels.md similarity index 96% rename from bonus/lightning/script-lnchannels.md rename to guide/bonus/lightning/lnchannels.md index a63fd0d3d..02eb4dc35 100644 --- a/bonus/lightning/script-lnchannels.md +++ b/guide/bonus/lightning/lnchannels.md @@ -7,7 +7,7 @@ nav_exclude: true has_toc: false --- -# Bonus guide: lnchannels script +# Bonus guide: lnchannels {: .no_toc } --- @@ -20,7 +20,7 @@ Difficulty: Easy Status: Tested v3 {: .label .label-green } -![lnchannels](../../images/script-lnchannels.png) +![lnchannels](../../../images/script-lnchannels.png) --- diff --git a/bonus/lightning/lntop.md b/guide/bonus/lightning/lntop.md similarity index 95% rename from bonus/lightning/lntop.md rename to guide/bonus/lightning/lntop.md index e4c83e0ef..5e9830a43 100644 --- a/bonus/lightning/lntop.md +++ b/guide/bonus/lightning/lntop.md @@ -20,7 +20,7 @@ Difficulty: Easy Status: Tested v3 {: .label .label-green } -![lntop](../../images/74_lntop.png) +![lntop](../../../images/74_lntop.png) --- @@ -139,7 +139,7 @@ To use all the functionalities of lntop, use the following keys: * Check the lntop repository for [new releases](https://github.com/edouardparis/lntop/releases){:target="_blank"}. -* Follow the [installation guidelines](https://raspibolt.org/bonus/lightning/lntop.html#install-lntop) while making sure to replace the file names to match the latest version if necessary. +* Follow the [installation guidelines](#install-lntop) while making sure to replace the file names to match the latest version if necessary. --- diff --git a/bonus/lightning/rebalance-lnd.md b/guide/bonus/lightning/rebalance-lnd.md similarity index 93% rename from bonus/lightning/rebalance-lnd.md rename to guide/bonus/lightning/rebalance-lnd.md index 63d94ee81..9b7065a61 100644 --- a/bonus/lightning/rebalance-lnd.md +++ b/guide/bonus/lightning/rebalance-lnd.md @@ -12,7 +12,7 @@ has_toc: false --- -[rebalance-lnd](https://github.com/C-Otto/rebalance-lnd){:target="_blank"} (created by C-Otto) is a tool to manage your channel liquidity by doing circular rebalancing; i.e. sending sats out of a channel with too much outbound/local liquidity back to one of your channel with too much inbound/remote liquidity. +[rebalance-lnd](https://github.com/C-Otto/rebalance-lnd){:target="_blank"} (created by C-Otto) is a tool to manage your channel liquidity by doing circular rebalancing; i.e. sending sats out of a channel with too much outbound/local liquidity back to one of your channel with too much inbound/remote liquidity. You just pay the routing fees and can set up some maximum fees that you're ok to pay. Difficulty: Easy @@ -21,7 +21,7 @@ Difficulty: Easy Status: Tested v3 {: .label .label-green } -![rebalance-lnd illustration](../../images/rebalance-lnd-illustration.png) +![rebalance-lnd illustration](../../../images/rebalance-lnd-illustration.png) --- @@ -45,7 +45,7 @@ Table of contents pip is not installed by default on Raspberry Pi OS Lite (64-bit), check if it is already installed and install it if needed. * With user "admin", check if pip3 is already installed with the following command. If you don't get an output with a version number it means you need to install pip3 (otherwise, move to the next section 'Install rebalance-lnd). - + ```sh $ pip3 --version ``` @@ -63,13 +63,13 @@ pip is not installed by default on Raspberry Pi OS Lite (64-bit), check if it is ### Install rebalance-lnd -* We create a "rebalance-lnd" user and we make it part of the "bitcoin" group (to be able to interact with LND) +* We create a "rebalance-lnd" user and we make it part of the "bitcoin" group (to be able to interact with LND) ```sh $ sudo adduser --disabled-password --gecos "" rebalance-lnd $ sudo adduser rebalance-lnd lnd ``` - + * With the "charge-lnd" user, clone the charge-lnd repository, enter the directory and install the program and required packages using `pip3` (do _not_ forget the dot at the end of the pip command!) ```sh @@ -87,14 +87,14 @@ pip is not installed by default on Raspberry Pi OS Lite (64-bit), check if it is ` * Test if the installation was successful by running the program - + ```sh $ rebalance.py > usage: rebalance.py [-h] [--lnddir LNDDIR] [--network NETWORK] [--grpc GRPC] > [...] ``` - -* We are going to create a simlink to the LND directory. We'll place the link in the home directory of the "charge-lnd" user to match the default LND directory used by rebalance-lnd (~/.lnd) + +* We are going to create a simlink to the LND directory. We'll place the link in the home directory of the "charge-lnd" user to match the default LND directory used by rebalance-lnd (~/.lnd) ```sh $ ln -s /data/lnd/ /home/rebalance-lnd/.lnd @@ -102,7 +102,7 @@ pip is not installed by default on Raspberry Pi OS Lite (64-bit), check if it is ``` --- - + ### rebalance-lnd in action To use rebalance-lnd, use the "rebalance-lnd" user. @@ -114,7 +114,7 @@ To use rebalance-lnd, use the "rebalance-lnd" user. > Sending AmountInSats satoshis from channel [...] > [...] ``` - + * There are many more options available to fine-tuned your rebalancing strategy. Find more information about them in the [README](https://github.com/C-Otto/rebalance-lnd){:target="_blank"} page of C-Otto's repo. --- @@ -127,9 +127,9 @@ To use rebalance-lnd, use the "rebalance-lnd" user. $ sudo su - rebalance-lnd $ cd rebalance-lnd ``` - + * Fetch the latest version and install it - + ```sh $ git fetch $ git describe --tags --abbrev=0 diff --git a/bonus/lightning/remote-lncli.md b/guide/bonus/lightning/remote-lncli.md similarity index 88% rename from bonus/lightning/remote-lncli.md rename to guide/bonus/lightning/remote-lncli.md index d5998f01b..033c1d85b 100644 --- a/bonus/lightning/remote-lncli.md +++ b/guide/bonus/lightning/remote-lncli.md @@ -16,14 +16,15 @@ Difficulty: Easy Status: Not tested v3 {: .label .label-yellow } -
- - Table of contents - - {: .text-delta } +--- + +Table of contents +{: .text-delta } + 1. TOC {:toc} -
+ +--- It is possible to run *lnd* on the RaspiBolt, and *lncli* on a different computer. The instructions below explain how to install *lncli* on a Windows PC and communicate with the RaspiBolt. Instructions for different computer systems (MAC, Linux, ...) will be very similar. @@ -41,7 +42,7 @@ root@RaspiBolt:/home/admin# ufw allow from 192.168.0.0/24 to any port 10009 co root@RaspiBolt:/home/admin# ufw status root@RaspiBolt:/home/admin# exit ``` -- Add one new line in the [Application Options] section of lnd.conf to allow rpc from more than just the default localhost +- Add one new line in the [Application Options] section of lnd.conf to allow rpc from more than just the default localhost `admin ~ ฿ sudo nano /home/bitcoin/.lnd/lnd.conf` ```ini @@ -49,7 +50,7 @@ root@RaspiBolt:/home/admin# exit rpclisten=0.0.0.0:10009 ``` -- Temporarily allow admin.macaroon to be copied +- Temporarily allow admin.macaroon to be copied `admin ~ ฿ sudo chmod 777 /home/bitcoin/.lnd/admin.macaroon` ## Windows PC @@ -59,10 +60,10 @@ rpclisten=0.0.0.0:10009 - Download the file for your OS. For Windows10 it will generally be lnd-windows-amd64-vx.x.x.zip - Open the compressed file and extract the lncli application (e.g. lncli.exe) to your desktop. - ![Zip File](images/60_remote_zip.png) + ![Zip File](../../../images/60_remote_zip.png) -- Open a CMD window - `Press Win+R, enter cmd, then press Enter` +- Open a CMD window + `Press Win+R, enter cmd, then press Enter` - Change to the directory where you saved lncli.exe, and view the help information @@ -84,17 +85,17 @@ GLOBAL OPTIONS: ``` - Take note of the default (base) directory -- Make the necessary default directory +- Make the necessary default directory `> mkdir %LOCALAPPDATA%\Lnd` -* Follow the instructions in [ [Mainnet](raspibolt_50_mainnet.md) ] to use WinSCP to copy the files shown +* Use WinSCP to copy the files shown * Local: `\Users\xxxx\AppData\Local\Lnd` * Remote: `/home/bitcoin/.lnd/` * Files: `See below` - ![Files to Copy](images/60_winLND.png) + ![Files to Copy](../../../images/60_winLND.png) - - Back on the RaspiBolt: Reset admin.macaroon permissions + - Back on the RaspiBolt: Reset admin.macaroon permissions `admin ~ ฿ sudo chmod 600 /home/bitcoin/.lnd/admin.macaroon` diff --git a/bonus/lightning/zap-desktop.md b/guide/bonus/lightning/zap-desktop.md similarity index 99% rename from bonus/lightning/zap-desktop.md rename to guide/bonus/lightning/zap-desktop.md index 109590033..e7160186a 100644 --- a/bonus/lightning/zap-desktop.md +++ b/guide/bonus/lightning/zap-desktop.md @@ -18,7 +18,7 @@ Difficulty: Easy Status: Tested v3 {: .label .label-green } -![lntop](../../images/zap-desktop.png) +![lntop](../../../images/zap-desktop.png) --- diff --git a/bonus/lightning/zap-ios.md b/guide/bonus/lightning/zap-ios.md similarity index 90% rename from bonus/lightning/zap-ios.md rename to guide/bonus/lightning/zap-ios.md index 8e39f041a..95a5c4853 100644 --- a/bonus/lightning/zap-ios.md +++ b/guide/bonus/lightning/zap-ios.md @@ -16,20 +16,21 @@ Difficulty: Intermediate Status: Not tested v3 {: .label .label-yellow } -
- - Table of contents - - {: .text-delta } +--- + +Table of contents +{: .text-delta } + 1. TOC {:toc} -
+ +--- This guide describes how to use Zap iOS from within your own network, the same that also connects your RaspiBolt. -![Zap iOS](images/72_zapios.png) +![Zap iOS](../../../images/72_zapios.png) -Zap is a free Lightning Network wallet focused on good user experience and ease of use. It is in alpha testing, so **use it at your own risk**. You can find more details in the [Zap iOS GitHub repository](https://github.com/LN-Zap/zap-iOS). If you find bugs, you can contribute to this project by [reporting issues](https://github.com/LN-Zap/zap-iOS/issues). +Zap is a free Lightning Network wallet focused on good user experience and ease of use. It is in alpha testing, so **use it at your own risk**. You can find more details in the [Zap iOS GitHub repository](https://github.com/LN-Zap/zap-iOS){:target="_blank"}. If you find bugs, you can contribute to this project by [reporting issues](https://github.com/LN-Zap/zap-iOS/issues){:target="_blank"}. ### Preparation on the RaspiBolt @@ -100,10 +101,10 @@ The nifty helper tool LND Connect helps to pair the RaspiBolt with the iPhone, e * Open the Zap iOS on your phone. * Scan the QR code and check/modify the ip address you want to use to connect. It should be something like `192.168.x.x`. - ![Zap IOS scan example](images/72_zapios_scan.png) + ![Zap IOS scan example](../../../images/72_zapios_scan.png) * A successful connection will take you into the Zap iOS application: - ![Zap iOS succesful example](images/72_zapios_succesful.png) + ![Zap iOS succesful example](../../../images/72_zapios_succesful.png) 🚨 REMEMBER: If you change `lnd.conf` you need to delete & recreate the `tls.cert`, and also re-create and re-scan the QR code from the Zap iOS app. Do not forget to copy the new `tls.cert` and `admin.macaroon` files to the admin user. @@ -111,8 +112,6 @@ The nifty helper tool LND Connect helps to pair the RaspiBolt with the iPhone, e ### Connect Zap iOS to RaspiBolt over Tor -* [Install Tor](raspibolt_69_tor.md#installing-tor) - * Edit LND config file to enable REST interface on port 8080 ``` $ sudo nano /home/bitcoin/.lnd/lnd.conf @@ -151,6 +150,6 @@ The nifty helper tool LND Connect helps to pair the RaspiBolt with the iPhone, e * Create new wallet in Zap iOS and scan QR code ------- +--- << Back: [+ Lightning](index.md) diff --git a/guide/bonus/lightning/zeus-over-tor.md b/guide/bonus/lightning/zeus-over-tor.md new file mode 100644 index 000000000..910bafef9 --- /dev/null +++ b/guide/bonus/lightning/zeus-over-tor.md @@ -0,0 +1,85 @@ +--- +layout: default +title: Zeus App Via Tor +parent: + Lightning +grand_parent: Bonus Section +nav_exclude: true +has_toc: false +--- + +## Bonus guide: Connect Zeus App Over Tor +{: .no_toc } + +Difficulty: Intermediate +{: .label .label-yellow } + +Status: Not tested v3 +{: .label .label-yellow } + +Download the Zeus app, APKs available here: [https://github.com/ZeusLN/zeus/releases](https://github.com/ZeusLN/zeus/releases){:target="_blank"}, +on F-Droid and Google Play. + +Log in to your RaspiBolt through ssh. + +Edit `torrc` with `sudo nano /etc/tor/torrc` and add the following lines: +``` +HiddenServiceDir /var/lib/tor/lnd_api/ +HiddenServiceVersion 3 +HiddenServicePort 8080 127.0.0.1:8080 +HiddenServicePort 10009 127.0.0.1:10009 +``` +Save (Ctrl+O, ENTER) and exit (Ctrl+X) + +Restart Tor: +``` +$ sudo systemctl restart tor +``` + +View the private credentials of your new hidden service. The first part is the onion address, the second part is the secret. +``` +$ sudo cat /var/lib/tor/lnd_api/hostname +z1234567890abc.onion +``` + +Make sure Go is installed (should be v1.11 or higher): +``` +$ go version +``` +If need to install Go, run these: + +``` +$ wget https://storage.googleapis.com/golang/go1.11.linux-armv6l.tar.gz +$ sudo tar -C /usr/local -xzf go1.11.linux-armv6l.tar.gz +$ sudo rm *.gz +$ sudo mkdir /usr/local/gocode +$ sudo chmod 777 /usr/local/gocode +$ export GOROOT=/usr/local/go +$ export PATH=$PATH:$GOROOT/bin +$ export GOPATH=/usr/local/gocode +$ export PATH=$PATH:$GOPATH/bin +``` + +Install [lndconnect](https://github.com/LN-Zap/lndconnect){:target="_blank"}: +``` +$ cd ~/download +$ wget https://github.com/LN-Zap/lndconnect/releases/download/v0.1.0/lndconnect-linux-armv7-v0.1.0.tar.gz +$ sudo tar -xvf lndconnect-linux-armv7-v0.1.0.tar.gz --strip=1 -C /usr/local/bin +``` +Switch to user `bitcoin` and generate the LND connect URI QR code (or String): +It will be a big QR code so maximize your terminal window and use CTRL - to shrink the code further to fit the screen. +Replace the `host` variable with the onion address previously generated. +To generate QR Code: +``` +$ sudo su bitcoin +$ lndconnect --lnddir=/home/bitcoin/.lnd --host=z1234567890abc.onion --port=8080 +``` +To generate a String: +``` +$ sudo su bitcoin +$ lndconnect --lnddir=/home/bitcoin/.lnd --host=z1234567890abc.onion --port=8080 -j +``` +Scan or copy paste it with Zeus and you are done. + +------ + +<< Back: [+ Lightning](index.md) diff --git a/bonus/raspberry-pi/aliases.md b/guide/bonus/raspberry-pi/aliases.md similarity index 94% rename from bonus/raspberry-pi/aliases.md rename to guide/bonus/raspberry-pi/aliases.md index fde751310..d9061f024 100644 --- a/bonus/raspberry-pi/aliases.md +++ b/guide/bonus/raspberry-pi/aliases.md @@ -20,7 +20,7 @@ Difficulty: Easy Status: Tested v3 {: .label .label-green } -![alias](../../images/alias-example.png) +![alias](../../../images/alias-example.png) --- @@ -34,7 +34,7 @@ Table of contents ## Acknowledgments -The following list of aliases was derived from contributions by [RobClark56](https://github.com/robclark56){:target="_blank"} and [marcosdub](https://github.com/marcosdub){:target="_blank"}. +The following list of aliases was derived from contributions by [RobClark56](https://github.com/robclark56){:target="_blank"} and `marcosdub`. --- @@ -51,10 +51,10 @@ The following list of aliases was derived from contributions by [RobClark56](htt ```ini ################## # GENERAL STATUS # - ################## - + ################## + alias livehealth='sudo watch -n 1 "vcgencmd measure_clock arm; vcgencmd measure_temp"' - + alias showversion='echo The installed versions of the services are as follows: ; \ bitcoind --version ; \ lnd --version ; \ @@ -66,54 +66,54 @@ The following list of aliases was derived from contributions by [RobClark56](htt echo NodeJS: node -v ; \ lntop --version ; \ htop --version ; nginx -v' - + alias statuservices='echo The status of the services is as follows, press the space key to advance: ; \ sudo systemctl status bitcoind lnd rtl electrs btcrpcexplorer tor ssh fail2ban ufw vncserver-x11-serviced' - + ################## # START SERVICES # ################## - + alias startbitcoind='sudo systemctl start bitcoind' alias startelectrs='sudo systemctl start electrs' alias startexplorer='sudo systemctl start btcrpcexplorer' alias startlnd='sudo systemctl start lnd' alias startrtl='sudo systemctl start rtl' - + ################## # SERVICE STATUS # ################## - + alias statusbitcoind='sudo systemctl status bitcoind' alias statuselectrs='sudo systemctl status electrs' alias statusexplorer='sudo systemctl status btcrpcexplorer' alias statuslnd='sudo systemctl status lnd' alias statusrtl='sudo systemctl status rtl' - + ################## # STOP SERVICES # ################## - + alias stopbitcoind='sudo systemctl stop bitcoind' alias stopelectrs='sudo systemctl stop electrs' alias stopcexplorer='sudo systemctl stop btcrpcexplorer' alias stoplnd='sudo systemctl stop lnd' alias stoprtl='sudo systemctl stop rtl' - + ################## # SERVICE LOGS # ################## - + alias bitcoindlogs='sudo tail -f /mnt/ext/bitcoin/debug.log' alias electrslogs='sudo journalctl -f -u electrs' alias btcrpcexplorerlogs='sudo journalctl -f -u btcrpcexplorer' alias lndlogs='sudo journalctl -f -u lnd' alias rtllogs='sudo journalctl -f -u rtl' - + ################## # LND # ################## - + alias unlock='lncli unlock' alias newaddress='lncli newaddress p2wkh' alias txns='lncli listchaintxns' @@ -127,20 +127,20 @@ The following list of aliases was derived from contributions by [RobClark56](htt alias connect='lncli connect' alias payinvoice='lncli payinvoice' alias addinvoice='lncli addinvoice' - + ################## # LND Watchtower # ################## - + alias wtclientinfo='lncli wtclient towers' alias wtserverinfo='lncli tower info' - + ``` - + * Execute a `source` command to register changes to the `.bash_aliases` file - ```sh - $ source ~/.bash_aliases + ```sh + $ source ~/.bash_aliases ``` --- @@ -155,7 +155,7 @@ The following list of aliases was derived from contributions by [RobClark56](htt > frequency(48)= 124121523 > temp=37.0'C ``` - + ```sh $ showversion > The installed versions of the services are as follows: @@ -168,7 +168,7 @@ The following list of aliases was derived from contributions by [RobClark56](htt > NPM: v8.1.2 > NodeJS: node -v > lntop version v0.2.0 - > htop 3.0.5 + > htop 3.0.5 > nginx version: nginx/1.18.0 ``` @@ -186,4 +186,4 @@ The following list of aliases was derived from contributions by [RobClark56](htt --- -<< Back: [+ Lightning](index.md) +<< Back: [+ Raspberry Pi](index.md) diff --git a/bonus/raspberry-pi/boot-from-microsd-card.md b/guide/bonus/raspberry-pi/boot-from-microsd-card.md similarity index 94% rename from bonus/raspberry-pi/boot-from-microsd-card.md rename to guide/bonus/raspberry-pi/boot-from-microsd-card.md index 2671c5acf..9bb2c453e 100644 --- a/bonus/raspberry-pi/boot-from-microsd-card.md +++ b/guide/bonus/raspberry-pi/boot-from-microsd-card.md @@ -35,9 +35,9 @@ Table of contents To boot from a microSD card and store the data on an external drive, there are a few additional steps compared to the default RaspiBolt guide. Below is a summary of the main differences, with detailed guidance in the following sections. -1. [Operating system](../../operating-system.md): +1. [Operating system](../../raspberry-pi/operating-system.md): * write the operating system to the microSD card instead of the external drive -1. [System configuration](../../system-configuration.md): +1. [System configuration](../../raspberry-pi/system-configuration.md): * attach the external drive * test the USB3 performance * format the drive @@ -55,7 +55,7 @@ When writing RasPiOS to the boot medium, use a high-quality microSD card of 8+ G Connect your external drive to the Raspberry Pi using one of the blue USB3 ports. -Follow the [System configuration](../../system-configuration.md) section until you reach [Data directory](../../system-configuration.md#data-directory), continuing with the instructions below. +Follow the [System configuration](../../raspberry-pi/system-configuration.md) section until you reach [Data directory](../../raspberry-pi/system-configuration.md#data-directory), continuing with the instructions below. In case your external drive shows poor performance, follow the [Fix bad USB3 performance](../../troubleshooting.md#fix-bad-usb3-performance) instructions, as mentioned in the guide. diff --git a/bonus/raspberry-pi/command-line.md b/guide/bonus/raspberry-pi/command-line.md similarity index 77% rename from bonus/raspberry-pi/command-line.md rename to guide/bonus/raspberry-pi/command-line.md index f982ac67a..4156d9424 100644 --- a/bonus/raspberry-pi/command-line.md +++ b/guide/bonus/raspberry-pi/command-line.md @@ -7,7 +7,7 @@ nav_exclude: true has_toc: false --- -## Bonus guide: Pimp the command line +## Bonus guide: Pimp the command line {: .no_toc } Difficulty: Easy @@ -16,17 +16,18 @@ Difficulty: Easy Status: Not tested v3 {: .label .label-yellow } -
- - Table of contents - - {: .text-delta } +--- + +Table of contents +{: .text-delta } + 1. TOC {:toc} -
+ +--- ### Command prompt -You can prettify your command prompt for each user by enabling color output and setting a custom prompt. +You can prettify your command prompt for each user by enabling color output and setting a custom prompt. * Open and edit `.bashrc` as shown below, save and exit `$ nano /home/admin/.bashrc` @@ -42,19 +43,19 @@ PS1="${debian_chroot:+($debian_chroot)}\[\e[33m\]\u \[\033[01;34m\]\w\[\e[33;40m alias ls='ls -la --color=always' ``` -![Pimp prompt](images/60_pimp_prompt.png) +![Pimp prompt](../../../images/60_pimp_prompt.png) -* Reload configuration +* Reload configuration `source /home/admin/.bashrc` -![Pimped prompt](images/60_pimp_prompt_result.png) +![Pimped prompt](../../../images/60_pimp_prompt_result.png) ### Bash completion As user “admin”, install bash completion scripts for Bitcoin Core and all Lightning projects. You then can complete commands by pressing the Tab key (e.g. bitcoin-cli getblockch [Tab] → bitcoin-cli getblockchaininfo ) ```sh $ cd /home/admin/download -$ wget https://raw.githubusercontent.com/bitcoin/bitcoin/master/contrib/bitcoin-cli.bash-completion +$ wget https://raw.githubusercontent.com/bitcoin/bitcoin/master/contrib/bitcoin-cli.bash-completion $ wget https://raw.githubusercontent.com/lightningnetwork/lnd/master/contrib/lncli.bash-completion $ sudo cp *.bash-completion /etc/bash_completion.d/ ``` @@ -63,4 +64,4 @@ Bash completion will be enabled after your next login. ------ -<< Back: [+ Raspberry Pi](index.md) +<< Back: [+ Raspberry Pi](index.md) diff --git a/bonus/raspberry-pi/index.md b/guide/bonus/raspberry-pi/index.md similarity index 100% rename from bonus/raspberry-pi/index.md rename to guide/bonus/raspberry-pi/index.md diff --git a/bonus/raspberry-pi/odroid-setup.md b/guide/bonus/raspberry-pi/odroid-setup.md similarity index 94% rename from bonus/raspberry-pi/odroid-setup.md rename to guide/bonus/raspberry-pi/odroid-setup.md index 380795957..7a5064a2a 100644 --- a/bonus/raspberry-pi/odroid-setup.md +++ b/guide/bonus/raspberry-pi/odroid-setup.md @@ -25,11 +25,11 @@ Status: Not tested v3 {:toc} -This guide describes how to setup RaspiBolt using an Odroid XU4 or compatible hardware (like Odroid HC1, [HC2] (https://www.hardkernel.com/shop/odroid-hc2-home-cloud-two/) and many others). +This guide describes how to setup RaspiBolt using an Odroid XU4 or compatible hardware (like Odroid HC1, [HC2](https://www.hardkernel.com/shop/odroid-hc2-home-cloud-two/){:target="_blank"} and many others). -![Odroid XU4](images/76_odroidxu4.png) +![Odroid XU4](../../../images/76_odroidxu4.png) -The Odroid series is an alternative low-cost, light-weight computer based on ARM processors. There are a series of computers available at the manufacturer [Hardkernel](https://www.hardkernel.com/). The Odroid XU4 is roughly in the same league as the Raspberry Pi4 when it comes to computing power and price. +The Odroid series is an alternative low-cost, light-weight computer based on ARM processors. There are a series of computers available at the manufacturer [Hardkernel](https://www.hardkernel.com/){:target="_blank"}. The Odroid XU4 is roughly in the same league as the Raspberry Pi4 when it comes to computing power and price. This guide aims to provide an end-to-end solution to install on Odroid. Nevertheless, it is recommended to review the original RaspiBolt guide for the Raspberry Pi, to help you understand the origins of this guide and its deviations. @@ -47,13 +47,13 @@ You need: #### Operating System / Linux -You will install a Linux distribution that is compatible with the Odroid XU4 platform. See [Odroid XU4 Downloads](https://wiki.odroid.com/odroid-xu4/getting_started/os_installation_guide?redirect=1#tab__odroid-xu4) +You will install a Linux distribution that is compatible with the Odroid XU4 platform. See [Odroid XU4 Downloads](https://wiki.odroid.com/odroid-xu4/getting_started/os_installation_guide?redirect=1#tab__odroid-xu4){:target="_blank"} The node runs headless, that means without keyboard or display, so the operating system Ubuntu Minimal is used. 1. Write down the user and password for Ubuntu Minimal from the link above. 2. Download the Ubuntu Minimal disk image file -3. Write the disk image file to your SD Card using a [Etcher](https://www.balena.io/etcher/) or similar OS flashing software +3. Write the disk image file to your SD Card using a [Etcher](https://www.balena.io/etcher/){:target="_blank"} or similar OS flashing software #### Initial boot Now it's time to boot your Odroid for the first time. @@ -113,7 +113,7 @@ You will likely let your Odroid run at all times. These are some helpful command * `shutdown` ### Bitcoin Node -Now that our Odroid OS is running, we want to install a full Bitcoin node with the Bitcoin Blockchain on the Odroid. The blockchain is continuously growing with every block, see [chain size](https://bitcoinvisuals.com/chain-size), hence we will use the hard disk for the blockchain data. +Now that our Odroid OS is running, we want to install a full Bitcoin node with the Bitcoin Blockchain on the Odroid. The blockchain is continuously growing with every block, see [chain size](https://bitcoinvisuals.com/chain-size){:target="_blank"}, hence we will use the hard disk for the blockchain data. #### Prepare Hard Disk If you haven't connected your hard disk yet, please connect it now after you shutdown your Odroid and disconnected it from the power supply. @@ -310,12 +310,12 @@ This can take up to a week or two when using an Odroid XU4, depending mostly on ## Bitcoin Core upgrade If you want to upgrade to a new release of Bitcoin Core in the future, check out the FAQ section: -[How to upgrade Bitcoin Core](raspibolt_faq.md#how-to-upgrade-bitcoin-core) +[How to upgrade Bitcoin Core](../../faq.md#how-to-upgrade-bitcoin-core) #### Run Bitcoind and Sync Blockchain #### Using Bitcoin Node - ------- -<< Back: [+ Raspberry Pi](index.md) +--- + +<< Back: [+ Raspberry Pi](../index.md) diff --git a/bonus/raspberry-pi/system-overview.md b/guide/bonus/raspberry-pi/system-overview.md similarity index 97% rename from bonus/raspberry-pi/system-overview.md rename to guide/bonus/raspberry-pi/system-overview.md index 9838a6a3f..e7fb50751 100644 --- a/bonus/raspberry-pi/system-overview.md +++ b/guide/bonus/raspberry-pi/system-overview.md @@ -19,7 +19,7 @@ Difficulty: Easy Status: Tested v3 {: .label .label-green } -![MotD system overview](../../images/system-overview.png) +![MotD system overview](../../../images/system-overview.png) --- diff --git a/bonus/raspberry-pi/trezor-agent.md b/guide/bonus/raspberry-pi/trezor-agent.md similarity index 92% rename from bonus/raspberry-pi/trezor-agent.md rename to guide/bonus/raspberry-pi/trezor-agent.md index 74144ec42..dfadcfcc5 100644 --- a/bonus/raspberry-pi/trezor-agent.md +++ b/guide/bonus/raspberry-pi/trezor-agent.md @@ -16,18 +16,19 @@ Difficulty: Easy Status: Not tested v3 {: .label .label-yellow } -
- - Table of contents - - {: .text-delta } +--- + +Table of contents +{: .text-delta } + 1. TOC {:toc} -
+ +--- It is possible to SSH to your device using your Trezor (It should be possible with Ledger and Keepkey but I haven't tried) -* Using romanz's trezor-agent https://github.com/romanz/trezor-agent and Trezor's documentation https://wiki.trezor.io/Apps:SSH_agent +* Using romanz's trezor-agent [https://github.com/romanz/trezor-agent](https://github.com/romanz/trezor-agent){:target="_blank"} and Trezor's documentation [https://wiki.trezor.io/Apps:SSH_agent](https://wiki.trezor.io/Apps:SSH_agent){:target="_blank"} * This Process is currently only available on Linux On your main machine - diff --git a/bonus/raspberry-pi/upgrade-external-drive.md b/guide/bonus/raspberry-pi/upgrade-external-drive.md similarity index 95% rename from bonus/raspberry-pi/upgrade-external-drive.md rename to guide/bonus/raspberry-pi/upgrade-external-drive.md index 18bf6718f..7c56928c4 100644 --- a/bonus/raspberry-pi/upgrade-external-drive.md +++ b/guide/bonus/raspberry-pi/upgrade-external-drive.md @@ -16,14 +16,15 @@ Difficulty: Intermediate Status: Not tested v3 {: .label .label-yellow } -
- - Table of contents - - {: .text-delta } +--- + +Table of contents +{: .text-delta } + 1. TOC {:toc} -
+ +--- This is a guide for upgrading the external drive. Periodically, as the size of the blockchain grows, you will need to upgrade to a larger drive. @@ -34,8 +35,7 @@ This is a guide for upgrading the external drive. Periodically, as the size of t You should make a backup of any important files before proceeding with this operation. At a minimum, it's recommended to make a backup of the LND static channel backups. - -You can do this with Dropbox via the [Static Channel Backups](raspibolt_73_static_backup_dropbox.md) guide +Please check the [Channel Backup](../../lightning/channel-backup.md) section for more details. --- @@ -103,7 +103,7 @@ The Raspberry Pi 4 supports USB3 drives, but is very picky. A lot of USB3 adapters for external drives are not compatible and need a manual workaround to be usable. We will now check if your drive works well as-is, or if additional configuration is needed. -🔍 *more: [Raspberry Pi forum: bad performance with USB3 SSDs](https://www.raspberrypi.org/forums/viewtopic.php?f=28&t=245931){:target="_blank"}* +🔍 *more: [Raspberry Pi forum: bad performance with USB3 SSDs](../../raspberry-pi/system-configuration.md#check-usb3-drive-performance){:target="_blank"}* * First, lets get some information about your drive from the kernel messages. Clear the kernel buffer, and follow the new messages (let the last command run): @@ -148,19 +148,19 @@ We will now check if your drive works well as-is, or if additional configuration $ lsblk -o NAME,MOUNTPOINT,UUID,FSTYPE,SIZE,LABEL,MODEL > NAME MOUNTPOINT UUID FSTYPE SIZE LABEL MODEL > sda 931.5G BUP_Slim_RD - > └─sda1 /mnt/ext 3aab0952-3ed4-4652-b203-d994c4fdff20 ext4 931.5G + > └─sda1 /mnt/ext 3aab0952-3ed4-4652-b203-d994c4fdff20 ext4 931.5G > sdb 953.9G SABRENT - > mmcblk0 58G - > ├─mmcblk0p1 /boot 4BBD-D3E7 vfat 256M boot - > └─mmcblk0p2 / 45e99191-771b-4e12-a526-0779148892cb ext4 57.8G rootfs + > mmcblk0 58G + > ├─mmcblk0p1 /boot 4BBD-D3E7 vfat 256M boot + > └─mmcblk0p2 / 45e99191-771b-4e12-a526-0779148892cb ext4 57.8G rootfs ``` -* In the above, the original external drive is `sda` and has partition `sda1`. +* In the above, the original external drive is `sda` and has partition `sda1`. The newly attached external drive is `sdb` and has no partition yet. It's very important to keep track of which block device and partition applies to the original vs new drive * If your external drive (e.g. `sdb`) does not contain any partitions (e.g. no `sdb1`), create a partition first using as described here: - + [https://superuser.com/questions/643765/creating-ext4-partition-from-console](https://superuser.com/questions/643765/creating-ext4-partition-from-console){:target="_blank"} * Now, let's test the read performance of your drive. Make sure to use the right partition name (used with the `/dev/` prefix). @@ -227,12 +227,12 @@ We will now check if your drive works well as-is, or if additional configuration $ lsblk -o NAME,MOUNTPOINT,UUID,FSTYPE,SIZE,LABEL,MODEL > NAME MOUNTPOINT UUID FSTYPE SIZE LABEL MODEL > sda 931.5G BUP_Slim_RD - > └─sda1 /mnt/ext 3aab0952-3ed4-4652-b203-d994c4fdff20 ext4 931.5G + > └─sda1 /mnt/ext 3aab0952-3ed4-4652-b203-d994c4fdff20 ext4 931.5G > sdb 953.9G SABRENT - > └─sdb1 1d9e9dee-87c3-4296-94e2-e833b948a19d ext4 953.9G - > mmcblk0 58G - > ├─mmcblk0p1 /boot 4BBD-D3E7 vfat 256M boot - > └─mmcblk0p2 / 45e99191-771b-4e12-a526-0779148892cb ext4 57.8G rootfs + > └─sdb1 1d9e9dee-87c3-4296-94e2-e833b948a19d ext4 953.9G + > mmcblk0 58G + > ├─mmcblk0p1 /boot 4BBD-D3E7 vfat 256M boot + > └─mmcblk0p2 / 45e99191-771b-4e12-a526-0779148892cb ext4 57.8G rootfs ``` * Edit the `fstab` file and add the following as a new line at the end, replacing `123456` with your own `UUID`. @@ -257,7 +257,7 @@ We will now check if your drive works well as-is, or if additional configuration # use dphys-swapfile swap[on|off] for that ``` - 🔍 *more: [complete fstab guide](http://www.linuxstall.com/fstab){:target="_blank"}* + 🔍 *more: [How fstab works – introduction to the /etc/fstab file on Linux](https://linuxconfig.org/how-fstab-works-introduction-to-the-etc-fstab-file-on-linux){:target="_blank"}* * Create the directory to add the hard disk and set the correct owner @@ -309,7 +309,7 @@ We'll use rsync to copy the files, preserving permissions and extended attribute ```sh $ cd / - $ sudo rsync -avxHAX --exclude=swapfile --numeric-ids --info=progress2 mnt/ext/ mnt/extnew/ + $ sudo rsync -avxHAX --exclude=swapfile --numeric-ids --info=progress2 mnt/ext/ mnt/extnew/ ``` The output will show file progression @@ -337,7 +337,7 @@ We'll use rsync to copy the files, preserving permissions and extended attribute 2. overall percentage complete 3. transfer speed 4. time remaining (e.g. 1:04:17) and then changed to time taken (0:00:25) - 5. xfr is the file number transferred + 5. xfr is the file number transferred 6. ir-chk=4324/4334 is the incremental recursion check. files remaining / files total Over the course of the synchronization, the incremental recursion check can increase until it transitions @@ -365,7 +365,7 @@ We'll use rsync to copy the files, preserving permissions and extended attribute ```sh > lost+found/ > 426,795,633,281 100% 54.07MB/s 2:05:28 (xfr#20717, to-chk=0/20739) - > + > > sent 426,901,227,575 bytes received 393,910 bytes 56,674,626.15 bytes/sec > total size is 426,795,633,281 speedup is 1.00 ``` @@ -549,8 +549,8 @@ Now that the new drive contains all the old files, we will remount it in place o ```sh $ lncli unlock - > Input wallet password: - > + > Input wallet password: + > > lnd successfully unlocked! ``` diff --git a/faq.md b/guide/faq.md similarity index 94% rename from faq.md rename to guide/faq.md index 6f935e148..e21454b3e 100644 --- a/faq.md +++ b/guide/faq.md @@ -26,7 +26,7 @@ Enjoy the ride! ## Can I attach the Ext4 formatted hard disk to my Windows computer? -The Ext4 file system is not compatible with standard Windows, but with additional software like [Linux File Systems](https://www.paragon-software.com/home/linuxfs-windows/#faq) by Paragon Software (they offer a 10 days free trial) it is possible. +The Ext4 file system is not compatible with standard Windows, but with additional software like [Linux File Systems](https://www.paragon-software.com/home/linuxfs-windows/#faq){:target="_blank"} by Paragon Software (they offer a 10 days free trial) it is possible. --- @@ -144,9 +144,9 @@ For a specific command, you can enter `man [command]` to display the manual page ## Where can I get more information? If you want to learn more about Bitcoin and are curious about the inner workings of the Lightning Network, the following articles in Bitcoin Magazine offer a very good introduction: -* [What is Bitcoin?](https://bitcoinmagazine.com/guides/what-bitcoin) -* [Understanding the Lightning Network](https://bitcoinmagazine.com/articles/understanding-the-lightning-network-part-building-a-bidirectional-payment-channel-1464710791/) -* [Bitcoin resources](https://www.lopp.net/bitcoin-information.html) and [Lightning Network resources](https://www.lopp.net/lightning-information.html) by Jameson Lopp +* [What is Bitcoin?](https://bitcoinmagazine.com/guides/what-bitcoin){:target="_blank"} +* [Understanding the Lightning Network](https://bitcoinmagazine.com/articles/understanding-the-lightning-network-part-building-a-bidirectional-payment-channel-1464710791/){:target="_blank"} +* [Bitcoin resources](https://www.lopp.net/bitcoin-information.html){:target="_blank"} and [Lightning Network resources](https://www.lopp.net/lightning-information.html){:target="_blank"} by Jameson Lopp --- diff --git a/static-channel-backup.md b/guide/lightning/channel-backup.md similarity index 97% rename from static-channel-backup.md rename to guide/lightning/channel-backup.md index 7ecacc664..784b5667d 100644 --- a/static-channel-backup.md +++ b/guide/lightning/channel-backup.md @@ -1,16 +1,16 @@ --- layout: default -title: Static Channel Backup -nav_order: 15 +title: Channel backup +nav_order: 20 parent: Lightning --- -# Lightning: Static Channel Backup +# Channel backup {: .no_toc } We set up a local or remote "Static Channel Backup" for Lightning. A monitoring script keeps it up-to-date to enable the recovery of your Lightning funds in case of hardware failure. -![GitHub remote backup](images/remote-scb-backup.png) +![GitHub remote backup](../../images/remote-scb-backup.png) --- @@ -228,7 +228,7 @@ We set up the backup script as a systemd service to run in the background and st ## Option 1: Local backup -Follow this section if you want a local backup. If you only want a remote backup, skip to the [next section](https://raspibolt.org/static-channel-backup.html#option-2-remote-backup-preparations). +Follow this section if you want a local backup. If you only want a remote backup, skip to the [next section](#option-2-remote-backup-preparations). ### Storage device size @@ -310,7 +310,7 @@ The `channel.backup` file is very small in size (<<1 MB) so even the smallest US ## Option 2: Remote backup preparations -Follow this section if you want a remote backup. If you already set up a local backup, and don't want a remote backup, skip to the [next section](https://raspibolt.org/static-channel-backup.html#test-1). +Follow this section if you want a remote backup. If you already set up a local backup, and don't want a remote backup, skip to the [next section](#test-1). ### Create a GitHub repository @@ -451,5 +451,5 @@ You're set! Each time you open a new channel or close an existing one, the monit --- -Next: [Ride The Lightning >>](rtl.md) +Next: [Web app >>](web-app.md) diff --git a/lightning.md b/guide/lightning/index.md similarity index 90% rename from lightning.md rename to guide/lightning/index.md index 6c06c21a8..8789941f4 100644 --- a/lightning.md +++ b/guide/lightning/index.md @@ -5,7 +5,7 @@ nav_order: 40 has_children: true --- -{% include_relative include_metatags.md %} +{% include include_metatags.md %} # Lightning {: .no_toc } @@ -22,8 +22,8 @@ Check out [Understanding the Lightning Network](https://bitcoinmagazine.com/tech --- -To enable the Lightning Network on your RaspiBolt, we install LND, the "Lightning Network Daemon". -We then set up an automatic Static Channel Backup to protect ourselves in case of failure of the SSD drive. -We'll then add "Ride The Lightning", a web-based node management tool. +To enable the Lightning Network on your RaspiBolt, we install LND, the "Lightning Network Daemon". +We then set up an automatic Static Channel Backup to protect ourselves in case of failure of the SSD drive. +We'll then add "Ride The Lightning", a web-based node management tool. Finally, we'll install the Zeus mobile app to make on-chain and LN payments and manage our node while we're on the go. Together, they make operating your node a breeze. diff --git a/lnd.md b/guide/lightning/lightning-client.md similarity index 98% rename from lnd.md rename to guide/lightning/lightning-client.md index ea90bd95c..70f458315 100644 --- a/lnd.md +++ b/guide/lightning/lightning-client.md @@ -1,11 +1,11 @@ --- layout: default -title: LND +title: Lightning client nav_order: 10 parent: Lightning --- -# Lightning: LND +# Lightning client {: .no_toc } We set up [LND](https://github.com/lightningnetwork/lnd/blob/master/README.md){:target="_blank"}, the Lightning Network Daemon by [Lightning Labs](https://lightning.engineering/){:target="_blank"}. @@ -117,7 +117,7 @@ Now that LND is installed, we need to configure it to work with Bitcoin Core and ```sh $ ls -la ``` - ![symlinks](images/lnd-symlink-colour.png) + ![symlinks](../../images/lnd-symlink-colour.png) ### Wallet password @@ -278,7 +278,7 @@ The current state of your channels, however, cannot be recreated from this seed. For this, the Static Channel Backup stored at `/data/lnd-backup/channel.backup` is updated continuously. 🚨 This information must be kept secret at all times. -* **Write these 24 words down manually on a piece of paper and store it in a safe place.** +* **Write these 24 words down manually on a piece of paper and store it in a safe place.** You can use a simple piece of paper, write them on a proper [backup card](https://shiftcrypto.ch/backupcard/backupcard_print.pdf){:target="_blank"}), or even stamp the seed words into metal (see this [DIY guide](https://www.econoalchemist.com/post/backup){:target="_blank"}). This piece of paper is all an attacker needs to completely empty your on-chain wallet! Do not store it on a computer. @@ -675,7 +675,7 @@ A quick reference with common commands to play around with: ## For the future: upgrade LND Upgrading LND can lead to a number of issues. -**Always** read the [LND release notes](https://github.com/lightningnetwork/lnd/releases) completely to understand the changes. These also cover a lot of additional topics and many new features not mentioned here. +**Always** read the [LND release notes](https://github.com/lightningnetwork/lnd/releases){:target="_blank"} completely to understand the changes. These also cover a lot of additional topics and many new features not mentioned here. * Check your lnd version @@ -686,7 +686,7 @@ Upgrading LND can lead to a number of issues. * As "admin" user, stop the LND service `$ sudo systemctl stop lnd` -* Download, verify and install the latest LND binaries as described in the [LND section](lnd.md) of this guide. +* Download, verify and install the latest LND binaries as described in the [LND section](lightning-client.md#installation) of this guide. * Restart the services with the new configuration @@ -698,4 +698,4 @@ Upgrading LND can lead to a number of issues. --- -Next: [Static Channel Backup >>](static-channel-backup.md) +Next: [Channel backup >>](channel-backup.md) diff --git a/mobile-app.md b/guide/lightning/mobile-app.md similarity index 94% rename from mobile-app.md rename to guide/lightning/mobile-app.md index 47a63d855..a77000f38 100644 --- a/mobile-app.md +++ b/guide/lightning/mobile-app.md @@ -8,10 +8,10 @@ parent: Lightning # Mobile app {: .no_toc } -We install [Zeus](https://zeusln.app/){:target="_blank"}, a cross-platform mobile app that connect to your LN node over Tor. +We install [Zeus](https://zeusln.app/){:target="_blank"}, a cross-platform mobile app that connect to your LN node over Tor. Make payments with lightning or on-chain and manage your channels while you're on the go. -![Zeus](images/zeus.png) +![Zeus](../../images/zeus.png) --- @@ -72,10 +72,10 @@ lnconnect generates a URI and displays it as a QR code that Zeus can read. * Still with the "admin" user, use the following command. Make sure to replace the .onion address with the one you generated above. - ```sh + ```sh $ lndconnect --host=abcdefg..............xyz.onion --port=8080 ``` - + * It will be a big QR code, so maximize your terminal window and use `CTRL`+`-` to shrink the code further to fit the screen * Keep the SSH session with the QR code opened, it will be needed later @@ -86,8 +86,8 @@ lnconnect generates a URI and displays it as a QR code that Zeus can read. ### Install the Zeus app -Download the Zeus app for your mobile phone. -Check the [Zeus website](https://zeusln.app/){:target="_blank"} for the direct download links to the Apple App Store or Google Play. +Download the Zeus app for your mobile phone. +Check the [Zeus website](https://zeusln.app/){:target="_blank"} for the direct download links to the Apple App Store or Google Play. Or get it from the [F-Droid store](https://f-droid.org/en/packages/app.zeusln.zeus/){:target="_blank"}, the catalogue of FOSS Android apps. --- @@ -122,7 +122,7 @@ Anyone using Zeus on your phone has control over your node and all its funds. It Below is a list of Zeus existing and planned features: -![Zeus](images/zeus-features.png) +![Zeus](../../images/zeus-features.png) --- @@ -149,7 +149,7 @@ To uninstall, you need to uninstall the app on your phone and deactivate the LND #HiddenServiceVersion 3 #HiddenServicePort 8080 127.0.0.1:8080 ``` - + ```sh $ sudo systemctl reload tor ``` @@ -158,4 +158,4 @@ To uninstall, you need to uninstall the app on your phone and deactivate the LND --- -Next: [Bonus section >>](bonus/index.md) +Next: [Bonus section >>](../bonus/index.md) diff --git a/rtl.md b/guide/lightning/web-app.md similarity index 97% rename from rtl.md rename to guide/lightning/web-app.md index 64d349d35..ce60bc0cc 100644 --- a/rtl.md +++ b/guide/lightning/web-app.md @@ -1,16 +1,16 @@ --- layout: default -title: Ride The Lightning -nav_order: 50 +title: Web app +nav_order: 30 parent: Lightning --- -# Ride The Lightning +# Web app {: .no_toc } We install [Ride The Lightning](https://github.com/Ride-The-Lightning/RTL#readme){:target="_blank"}, a powerful web interface to manage your Lightning node. -![Ride The Lightning dashboard](images/rtl-homepage.png) +![Ride The Lightning dashboard](../../images/rtl-homepage.png) --- @@ -43,7 +43,7 @@ If you installed BTC RPC Explorer, then you've already accomplished this step. ### Firewall & reverse proxy -In the [Security section](security.md), we already set up NGINX as a reverse proxy. +In the [Security section](../raspberry-pi/security.md#prepare-nginx-reverse-proxy), we already set up NGINX as a reverse proxy. Now we can add the RTL configuration. * Enable NGINX reverse proxy to route external encrypted HTTPS traffic internally to RTL diff --git a/raspberry-pi.md b/guide/raspberry-pi/index.md similarity index 82% rename from raspberry-pi.md rename to guide/raspberry-pi/index.md index 29dbfdbd1..d0935997a 100644 --- a/raspberry-pi.md +++ b/guide/raspberry-pi/index.md @@ -5,7 +5,7 @@ nav_order: 20 has_children: true --- -{% include_relative include_metatags.md %} +{% include include_metatags.md %} # Raspberry Pi {: .no_toc } @@ -13,6 +13,6 @@ has_children: true This guide builds on the easily available and very flexible Raspberry Pi 4. This amazing piece of hardware is a tiny computer-on-a-chip, costs about $60 and consumes very little energy. -![Raspberry Pi](images/raspberry-pi_hardware.png) +![Raspberry Pi](../../images/raspberry-pi_hardware.png) In the following sections, we will start it up and prepare the operating system for your RaspiBolt. diff --git a/operating-system.md b/guide/raspberry-pi/operating-system.md similarity index 94% rename from operating-system.md rename to guide/raspberry-pi/operating-system.md index 72f0d5645..8fa52abc2 100644 --- a/operating-system.md +++ b/guide/raspberry-pi/operating-system.md @@ -5,7 +5,7 @@ nav_order: 20 parent: Raspberry Pi --- -{% include_relative include_metatags.md %} +{% include include_metatags.md %} # Operating system {: .no_toc } @@ -42,7 +42,7 @@ In order to write the operating system to the external drive, we will use the [R Open the "Advanced options" by pressing the cogwheel that has appeared in the bottom right corner of the application window: -![image](images/operating-system_imager-start.png) +![image](../../images/operating-system_imager-start.png) You can now pre-configure the operating system even before it's started for the first time. @@ -64,7 +64,7 @@ Configure the advanced options as follows: * **That's it.** You can ignore the other options. -![Raspberry Pi Imager: advanced settings](images/operating-system_imager-settings.png) +![Raspberry Pi Imager: advanced settings](../../images/operating-system_imager-settings.png) * Click "SAVE". @@ -110,7 +110,7 @@ Your Raspberry Pi should now boot from the SSD attached via USB. ## Fallback: if you can't boot from your external drive We assume that you can boot directly from the external drive. -This method works for most modern drives, but if it doesn't work in your case, please follow the fallback instructions [Boot from microSD card instead of external drive](bonus/raspberry-pi/boot-from-microsd-card.md). +This method works for most modern drives, but if it doesn't work in your case, please follow the fallback instructions [Boot from microSD card instead of external drive](../bonus/raspberry-pi/boot-from-microsd-card.md).

diff --git a/preparations.md b/guide/raspberry-pi/preparations.md similarity index 96% rename from preparations.md rename to guide/raspberry-pi/preparations.md index f54d476e6..fdd17d63a 100644 --- a/preparations.md +++ b/guide/raspberry-pi/preparations.md @@ -5,7 +5,7 @@ nav_order: 10 parent: Raspberry Pi --- -{% include_relative include_metatags.md %} +{% include include_metatags.md %} # Preparations {: .no_toc } @@ -64,7 +64,7 @@ They should be unique and very secure, at least 12 characters in length. Do **no [ E ] Ride The Lightning password ``` -![xkcd: Password Strength](images/preparations_xkcd.png) +![xkcd: Password Strength](../../images/preparations_xkcd.png) If you need inspiration for creating your passwords: the [xkcd: Password Strength](https://xkcd.com/936/){:target="_blank"} comic is funny and contains a lot of truth. Store a copy of your passwords somewhere safe (preferably in an open-source password manager like [KeePassXC](https://keepassxc.org/){:target="_blank"}), or whaterver password manager you're already using, and keep your original notes out of sight once your system is up and running. diff --git a/privacy.md b/guide/raspberry-pi/privacy.md similarity index 98% rename from privacy.md rename to guide/raspberry-pi/privacy.md index 710743222..21c8533d0 100644 --- a/privacy.md +++ b/guide/raspberry-pi/privacy.md @@ -5,7 +5,7 @@ nav_order: 50 parent: Raspberry Pi --- -{% include_relative include_metatags.md %} +{% include include_metatags.md %} # Privacy {: .no_toc } @@ -140,4 +140,4 @@ A few examples: --- -Next: [Bitcoin >>](bitcoin.md) +Next: [Bitcoin >>](../bitcoin/index.md) diff --git a/remote-access.md b/guide/raspberry-pi/remote-access.md similarity index 98% rename from remote-access.md rename to guide/raspberry-pi/remote-access.md index d5c23d5c4..1ecee5000 100644 --- a/remote-access.md +++ b/guide/raspberry-pi/remote-access.md @@ -5,7 +5,7 @@ nav_order: 20 parent: Raspberry Pi --- -{% include_relative include_metatags.md %} +{% include include_metatags.md %} # Remote access {: .no_toc } @@ -94,7 +94,7 @@ $ ls -la by pressing ⬆️ (arrow up) and ⬇️ (arrow down) on your keyboard, you can recall previously entered commands. * **Common Linux commands**: - For a very selective reference list of Linux commands, please refer to the [FAQ](faq.md) page. + For a very selective reference list of Linux commands, please refer to the [FAQ](../faq.md) page. * **Use admin privileges**: Our regular user has no direct admin privileges. diff --git a/security.md b/guide/raspberry-pi/security.md similarity index 99% rename from security.md rename to guide/raspberry-pi/security.md index 28c814b87..2d1c79dbc 100644 --- a/security.md +++ b/guide/raspberry-pi/security.md @@ -5,7 +5,7 @@ nav_order: 40 parent: Raspberry Pi --- -{% include_relative include_metatags.md %} +{% include include_metatags.md %} # Security {: .no_toc } @@ -162,7 +162,7 @@ The SSH login to the Pi must be specially protected. An additional measure is to install "fail2ban", which prevents an attacker from gaining access via brute force. It simply cuts off any remote system with five failed login attempts for ten minutes. -![fail2ban](images/security_fail2ban.png) +![fail2ban](../../images/security_fail2ban.png) *Me locking myself out by entering wrong passwords* * Install "fail2ban", which activates automatically diff --git a/system-configuration.md b/guide/raspberry-pi/system-configuration.md similarity index 93% rename from system-configuration.md rename to guide/raspberry-pi/system-configuration.md index ce6b62474..cb8bf0c75 100644 --- a/system-configuration.md +++ b/guide/raspberry-pi/system-configuration.md @@ -5,7 +5,7 @@ nav_order: 30 parent: Raspberry Pi --- -{% include_relative include_metatags.md %} +{% include include_metatags.md %} # System configuration {: .no_toc } @@ -39,7 +39,7 @@ We will use the primary user "admin" instead of "pi" to make this guide more uni ```sh $ sudo adduser admin sudo ``` - + * Exit your current "pi" user session and exit SSH @@ -49,7 +49,7 @@ We will use the primary user "admin" instead of "pi" to make this guide more uni * Create a new connection with the `admin` user -* Log in again using SSH (see [Access with Secure Shell](remote-access.html#access-with-secure-shell) section), but now with the user "admin" and your `password [A]` +* Log in again using SSH (see [Access with Secure Shell](remote-access.md#access-with-secure-shell) section), but now with the user "admin" and your `password [A]` ```sh $ ssh admin@raspibolt.local @@ -122,7 +122,7 @@ If the measured speed is more than 50 MB/s, you're good, no further action neede If the speed of your USB3 drive is not acceptable, we need to configure the USB driver to ignore the UAS interface. -Check the [Fix bad USB3 performance](troubleshooting.md#fix-bad-usb3-performance) entry in the Troubleshooting guide to learn how. +Check the [Fix bad USB3 performance](../troubleshooting.md#fix-bad-usb3-performance) entry in the Troubleshooting guide to learn how. --- diff --git a/troubleshooting-separator.md b/guide/troubleshooting-separator.md similarity index 98% rename from troubleshooting-separator.md rename to guide/troubleshooting-separator.md index 9bb7ef04c..707c20d60 100644 --- a/troubleshooting-separator.md +++ b/guide/troubleshooting-separator.md @@ -3,4 +3,4 @@ layout: default title: __________________________ nav_order: 199 --- - \ No newline at end of file + diff --git a/troubleshooting.md b/guide/troubleshooting.md similarity index 97% rename from troubleshooting.md rename to guide/troubleshooting.md index e97dc4ca7..9d58cf56b 100644 --- a/troubleshooting.md +++ b/guide/troubleshooting.md @@ -20,9 +20,9 @@ Where possible, I'll link to the relevant part of the guide. If you see any disc --- -## [General FAQ](raspibolt_faq.md) +## [General FAQ](faq.md) -I collected frequent questions not directly related with issues in a separate [General FAQ](raspibolt_faq.md) section: +I collected frequent questions not directly related with issues in a separate [General FAQ](faq.md) section: * Can I get rich by routing Lightning payments? * Can I attach the Ext4 formatted hard disk to my Windows computer? @@ -54,7 +54,7 @@ If you somehow locked yourself out of your Pi, you can connect it to a display a ### Fix bad USB3 performance -If the speed of your USB3 drive tested with `hdparm` in the [System configuration](system-configuration.md) section is not acceptable, we need to configure the USB driver to ignore the UAS interface. +If the speed of your USB3 drive tested with `hdparm` in the [System configuration](raspberry-pi/system-configuration.md) section is not acceptable, we need to configure the USB driver to ignore the UAS interface. * Get the Vendor and Product ID for your USB3 drive. Run the following command and look for the name of your drive or adapter. @@ -103,9 +103,9 @@ The additional configuration parameters (called "quirks") for the USB driver mus You should see a significant increase in performance. If the test still shows a very slow read speed, your drive or USB3 adapter might not be compatible with the Raspberry Pi. -In that case we recommend visiting the [Raspberry Pi Troubleshooting forum](https://forums.raspberrypi.com/viewforum.php?f=28) or simply trying out hardware alternatives. +In that case we recommend visiting the [Raspberry Pi Troubleshooting forum](https://forums.raspberrypi.com/viewforum.php?f=28){:target="_blank"} or simply trying out hardware alternatives. -🔍 *more: [Raspberry Pi forum: bad performance with USB3 SSDs](https://forums.raspberrypi.com/viewtopic.php?f=28&t=245931)* +🔍 *more: [Raspberry Pi forum: bad performance with USB3 SSDs](https://forums.raspberrypi.com/viewtopic.php?f=28&t=245931){:target="_blank"}* --- @@ -113,7 +113,7 @@ In that case we recommend visiting the [Raspberry Pi Troubleshooting forum](http The most important ports are 22, 8333, 9735 and 1900/udp. Others can be necessary for bonus guides, and there may be additional ports open on your Pi (eg. the `(v6)` variants). -It is essential to have the right subnet mask, like `192.168.0.0/24` (see [guide](raspibolt_20_pi.md#enabling-the-uncomplicated-firewall)). +It is essential to have the right subnet mask, like `192.168.0.0/24` (see [guide](raspberry-pi/security.md#enabling-the-uncomplicated-firewall)). ``` $ sudo ufw status @@ -477,3 +477,7 @@ $ tail -f /home/bitcoin/.lnd/logs/bitcoin/mainnet/lnd.log We will extend this troubleshooting guide constantly with findings that have been or will be reported in the issues section.

+ +--- + +Next: [FAQ >>](faq.md) diff --git a/images/60_eps_first-start.png b/images/60_eps_first-start.png new file mode 100644 index 0000000000000000000000000000000000000000..cc240b779455414a0df406babd3bfa96f05b03ad GIT binary patch literal 64531 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 G=Kla}OVY;x literal 0 HcmV?d00001 diff --git a/images/60_eps_pip_install.png b/images/60_eps_pip_install.png new file mode 100644 index 0000000000000000000000000000000000000000..bc304c5fa1d04c710e2091a3fb3398dfb49d3065 GIT binary patch literal 45113 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 j;$7tyB9eC|U^S-)w#Qb}F+_ow;Cqf&VI9)yEC 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 -{% include_relative include_metatags.md %} +{% include include_metatags.md %} ![RaspiBolt Logo](images/raspibolt3-logo.png) @@ -64,20 +64,20 @@ If you like to learn about Linux, Bitcoin, and Lightning, then this guide is for We aim to keep the core of this guide well maintained and up-to-date: -1. [Raspberry Pi](raspberry-pi.md): prepare the hardware and set up the operating system -1. [Bitcoin](bitcoin.md): sync your own Bitcoin full node, Electrum server, and Blockchain Explorer -1. [Lightning](lightning.md): run your own Lightning client with web-based and mobile-based node management +1. [Raspberry Pi](guide/raspberry-pi/index.md): prepare the hardware and set up the operating system +1. [Bitcoin](guide/bitcoin/index.md): sync your own Bitcoin full node, Electrum server, and Blockchain Explorer +1. [Lightning](guide/lightning/index.md): run your own Lightning client with web-based node management The bonus section contains more specific guides that build on top of the main section. More fun, lots of knowledge, but with lesser maintenance guarantees. Everything is optional. -* [Bonus guides](./bonus/index.md) +* [Bonus guides](guide/bonus/index.md) Running into issues? -* [Troubleshooting](troubleshooting.md): first aid to debug your system -* [FAQ](faq.md): frequently asked questions and further reading +* [Troubleshooting](guide/troubleshooting.md): first aid to debug your system +* [FAQ](guide/faq.md): frequently asked questions and further reading --- @@ -100,7 +100,7 @@ Unfortunately, a seamless update is not possible because RaspiBolt 3 uses an ent The general structure of the setup stays the same, however. We recommend setting up the RaspiBolt from scratch, but you can then copy over essential data. -[Read how to do that in the FAQ section](faq.md#can-i-update-my-raspibolt-2-to-the-new-version). +[Read how to do that in the FAQ section](guide/faq.md#can-i-update-my-raspibolt-2-to-the-new-version). ## Looking for an older version of this guide? @@ -110,4 +110,4 @@ If you're looking for an older version of this guide, you can still check out th --- -Get started: [Backstory >>](backstory.md) +Get started: [Backstory >>](guide/backstory.md) diff --git a/raspibolt/README.md b/raspibolt/README.md deleted file mode 100644 index c8549d346..000000000 --- a/raspibolt/README.md +++ /dev/null @@ -1,8 +0,0 @@ ---- -nav_exclude: true ---- -### The RaspiBolt Guide is now available on GitHub Pages: - -https://raspibolt.github.io/raspibolt/ - -This repository contains all sources and is used for Issue tracking.