This guide is specific to getting LND 0.5-beta and Bitcoind running on Ubuntu 16.04 LTS for mainnet. It is aging rapidly and includes steps not necessary on newer versions of LND. As of April 2021 it is very out of date for bitcoind. As of December 2021 it is outdated for LND too.
Original installation guide:
This guide is broken into the following sections:
- Install
bitcoind
and set to start automatically - Install development tools and dependancies
- Install
lnd
, setup a config file, fund and open channels - Install supervisor to automatically start
lnd
and optionally send email on failures
Advance warnings:
- The bitcoind portion of this guide can take several days to sync
- The lnd portion of this guide can take several hours to sync
https://bitcoin.org/en/full-node#linux-instructions
if you'd prefer to compile
bitcoind
yourself, please refer to https://gist.github.com/itoonx/95aec9a3b4da01fd1fd724dffc056963
and take note ofsudo apt install libzmq3-dev
and./configure ... --with-zmq --enable-zmq
First add the repository:
sudo apt-add-repository ppa:bitcoin/bitcoin
You will be prompted for your user password. Provide it to continue, and press enter when prompted.
Run the update process:
sudo apt-get update
Then proceed with installing bitcoind
as follows:
sudo apt-get install bitcoind
Setup your .bitcoin/bitcoin.conf file, there are samples at:
http://manpages.ubuntu.com/manpages/precise/man5/bitcoin.conf.5.html
https://github.com/bitcoin/bitcoin/blob/0.16/contrib/debian/examples/bitcoin.conf
Simplest version might be as follows:
server=1
txindex=1
daemon=1
externalip=X.X.X.X
maxconnections=10
rpcuser=REPLACEME
rpcpassword=REPLACEME
minrelaytxfee=0.00000000
incrementalrelayfee=0.00000010
zmqpubrawblock=tcp://127.0.0.1:28332
zmqpubrawtx=tcp://127.0.0.1:28333
Note: as of github master from 2018-08-10 onwards you need different ports for each zmq config option, setup in bitcoin.conf
Start bitcoind
to initiate sync, and be sure to take a look at https://en.bitcoin.it/wiki/Running_Bitcoin
bitcoind
You can monitor the progress in the logs:
tail $HOME/.bitcoin/debug.log
Important: The bitcoind
sync process can take 3 to 5 days to complete!
(Optional) You can monitor progress with the following:
Get the current block count onchain:
curl -s https://blockchain.info/q/getblockcount
Compare the result to the output of:
bitcoin-cli getblockcount
Alternatively, combine both of these into a convenient one-liner expression:
echo `bitcoin-cli getblockcount 2>&1`/`curl -s https://blockchain.info/q/getblockcount`
If the output values are the same, then your bitcoind
node is fully synced and you can proceed with lnd
installation.
To setup bitcoind
to start automatically, we'll borrow the systemd setup from the following guide:
Adapted from sources
First make sure bitcoind
is fully synced, then stop it with:
bitcoin-cli stop
Add & edit the systemd configuration file:
sudo nano /etc/systemd/system/bitcoind.service
Add in the following text, making sure to replace all instances of USERNAME with your username, or the applicable username bitcoind
is being run as:
[Unit]
Description=Bitcoin daemon
After=network.target
[Service]
User=USERNAME
Group=USERNAME
Type=forking
PIDFile=/home/USERNAME/.bitcoin/bitcoind.pid
ExecStart=/usr/bin/bitcoind -conf=/home/USERNAME/.bitcoin/bitcoin.conf -pid=/home/USERNAME/.bitcoin/bitcoind.pid
KillMode=process
Restart=always
TimeoutSec=120
RestartSec=30
[Install]
WantedBy=multi-user.target
Enable the systemd setup with the following commands:
sudo systemctl enable bitcoind
sudo systemctl start bitcoind
Check it's working properly with:
sudo systemctl status bitcoind
bitcoind
should start automatically from here on, and restart if it fails.
Next we need to install go
, then lnd
.
The lnd
install guide refers to golang-1.10-go, but Ubuntu 16.04 LTS currently has golang-1.9-go. To install the latest go
using snap
instead:
sudo snap install --classic go
On success you will see the result:
go 1.10 from 'mwhudson' installed
or
go 1.11.2 from Michael Hudson-Doyle (mwhudson) installed
Create a 'go' directory in your home directory:
mkdir go
Set go
paths, this can be done in .profile
(which reads .bashrc
) or directly in .bashrc
:
You might notice some difference between ssh sessions and local terminal sessions with .profile so for the purpose of this guide we'll use
.bashrc
as the results are the same for both types of session
nano .bashrc
Add to the end:
export GOPATH=$HOME/go
export PATH=$PATH:$GOROOT/bin:$GOPATH/bin
Important: the snap
install of go
will automatically set the GOROOT variable. It's no longer necessary to set this yourself, unless using apt-get install
for older version of go
prior to 1.11.
Logout and log back in to reread variables, or you can type:
source .bashrc
Check variables with:
go env
And if you see output, go
is setup correctly.
lnd
is now using dep
to manage dependancies, and dep
has some additional requirements for development tools, so make sure you have the build-essential package installed:
sudo apt-get install build-essential
sudo apt-get install git-core
Install dep
:
go get -u github.com/golang/dep/cmd/dep
Install lnd
by cloning the source and then the build commands as follows, according to the The LND Install Guide:
git clone https://github.com/lightningnetwork/lnd
cd lnd
make install
and use the following for checking out a release, the preferred way of installing LND:
git clone https://github.com/lightningnetwork/lnd
cd lnd
git checkout v0.x.x
make install
Important: this next step requires bitcoind
be fully synced!
Run lnd
for first run as follows, it will take a while to catch up and perform its own sync:
lnd --bitcoin.active --bitcoin.mainnet --debuglevel=debug --bitcoin.node=bitcoind --bitcoind.rpcuser=REPLACEME --bitcoind.rpcpass=REPLACEME --externalip=X.X.X.X --bitcoind.zmqpubrawblock=tcp://127.0.0.1:28332 --bitcoind.zmqpubrawtx=tcp://127.0.0.1:28333
But before the sync actually starts, in another terminal window you will need to create a wallet, store the recovery key, and then issue the unlock command.
To create a wallet run:
lncli create
An example of the output is as follows. Please ensure you have a strong password with minimum 8 characters, and mix of uppercase and lowercase:
Input wallet password: ********
Confirm wallet password: ********
Do you have an existing cipher seed mnemonic you want to use? (Enter y/n): n
Your cipher seed can optionally be encrypted.
Input your passphrase you wish to encrypt it (or press enter to proceed without a cipher seed passphrase): ********
Confirm cipher seed passphrase: ********
Generating fresh cipher seed...
!!!YOU MUST WRITE DOWN THIS SEED TO BE ABLE TO RESTORE THE WALLET!!!
------------------BEGIN LND CIPHER SEED------------------
1. one 2. two 3. three 4. four
5. five 6. six 7. seven 8. eight
9. nine 10. ten 11. eleven 12. twelve
13. thirteen 14. fourteen 15. fifteen 16. sixteen
17. seventeen 18. eighteen 19. nineteen 20. twenty
21. twentyone 22. twentytwo 23. twentythree 24. twentfour
------------------END LND CIPHER SEED--------------------
Copy and paste the cipher seed and store it securely somehow, such a secure note in a password manager, or printed to paper and locked in a safe, or similar.
You will now have to unlock the wallet you just created so lnd
can proceed with the initial sync:
lncli unlock
Once sync is complete, you can <ctrl-c>
the lnd process, and proceed with editing a config file so you can start lnd
with fewer flags on next launch.
Create and edit $HOME/.lnd/lnd.conf from
https://github.com/lightningnetwork/lnd/blob/master/sample-lnd.conf
A very simple version might be as follows, you can add more from the info in the sample config later:
[Application Options]
; set external IP if not using NAT
externalip=YOURIP
; set node alias (seen in explorers)
alias=SET-YOUR-ALIAS
[Bitcoin]
bitcoin.active=1
bitcoin.mainnet=1
bitcoin.node=bitcoind
[Bitcoind]
bitcoind.rpcuser=REPLACE
bitcoind.rpcpass=REPLACE
bitcoind.zmqpubrawblock=tcp://127.0.0.1:28332
bitcoind.zmqpubrawtx=tcp://127.0.0.1:28333
Note: as of github master from 2018-08-10 onwards you need different ports for each zmq config option, and no longer use bitcoind.zmqpath option.
Thereafter you can start lnd
without flags, or using supervisor
(see below) or some other option like systemd:
lnd
You monitor the log file in the logs directory under $HOME/.lnd/logs/bitcoin/mainnet/lnd.log
To verify lnd
is operational, open another terminal window or session and try the following:
lncli getinfo
lncli getnetworkinfo
lncli describegraph
Setup a wallet to deposit some bitcoin:
lncli newaddress p2wkh
This will produce a Bech32 format address, which is native segwit address format, with lower fees in fee calculations for opening/closing channels.
If you have troubles depositing to bech32 address from places like earn.com or exchanges which don't yet support segwit addressing, you can also use
lncli newaddress np2wkh
to get a different format address that looks more like a traditional multisig address, but won't be able to take advantage of segwit fees benefits.
Make the deposit and check progress with:
lncli walletbalance
A confirmed a balance means the deposit is complete and ready for opening channels.
To open your first channel(s) it may be useful to find active nodes. You can do this by browsing the node directory at various explorers such as https://www.robtex.com/lightning/node/ or https://1ml.com/node or you can open channels with the following:
* bitrefill: 024a2e265cd66066b78a788ae615acdc84b5b0dec9efac36d7ac87513015eaf6ed@lnd.bitrefill.com:9735
* yalls: 03e50492eab4107a773141bb419e107bda3de3d55652e6e1a41225f06a0bbf2d56@mainnet-lnd.yalls.org:9735
* guide author: 02262bbc21c171bc91a1d6bbf89571c95873849b9a60d3ea9671b777d852d39ecd@197.155.6.118:9735
Open a channel by first connecting, then opening a channel as follows:
lncli connect pubkey@ip:port
lncli openchannel --node_key=<pubkey> --local_amt=<amount>
Helpful hint:
if mSATs, satoshis, bits, mBTC are confusing, consider installing this useful calculator https://github.com/jb55/bcalc
Verify pending & open channels using:
lncli pendingchannels
lncli listchannels
supervisor
is one way to start lnd
automatically, and automatically restart if it fails.
First exit any running lnd
session, and proceed through the following steps:
First install supervisor
:
sudo apt-get install supervisor
Then setup the configuration file, sudo
access will be required:
cd /etc/supervisor/conf.d
sudo nano lnd.conf
Edit lnd.conf
and add the following:
[program:lnd]
user=REPLACE-WITH-YOUR-USERNAME
command=/home/USERNAME/go/bin/lnd --configfile=/home/USERNAME/.lnd/lnd.conf
startretries=999999999999999999999999999
autostart=true
autorestart=true
Reload supervisor
:
sudo supervisorctl reload
You can monitor the log files by tailing them in the relevant directories in your home directory for lnd
, or in /var/log/supervisor/ with sudo
access.
Important: If lnd
restarts via supervisor for some reason, you will need to unlock your wallet again for the node to go live.
lncli unlock
If you wish to be notified by email when supervisor restarts a process, you can install the superlance
plugin:
sudo apt-get install python-pip
sudo -H pip install superlance
Edit supervisor's config file:
sudo nano /etc/supervisor/supervisord.conf
Add the following, changing the email address to your email address:
[eventlistener:crashmail]
command=/usr/local/bin/crashmail -p lnd -m your@email.address
events=PROCESS_STATE
This should be followed by updating supervisor, which will also restart lnd
, and add the event notifier you've configured:
sudo supervisorctl update
So be sure to unlock your wallet again:
lncli unlock
When a process exits you will now get a notification sent via email and can login to unlock the wallet and take your node fully online again.
You might be interested in How to get Inbound Liquidity on LN
That's it, happy channeling. If you liked this guide and got it working, please consider leaving a tip
@bretton you're welcome! I'm going through it now, so if I run into more snags, I'll post here.