some changes and new idea for LN Script
This commit is contained in:
parent
220125a2d9
commit
910f8763cd
503
Bitcoin/lndinstall.sh
Normal file
503
Bitcoin/lndinstall.sh
Normal file
@ -0,0 +1,503 @@
|
||||
#!/bin/bash
|
||||
#This is a script to install LND.
|
||||
|
||||
#Global Functions.
|
||||
|
||||
#Global Functions.
|
||||
is_package_installed() {
|
||||
if dpkg -l "$1" 2>/dev/null | grep -q "^ii"; then
|
||||
echo "$1 is installed."
|
||||
return 0 # Package is installed
|
||||
else
|
||||
echo "$1 is not installed."
|
||||
return 1 # Package is not installed
|
||||
fi
|
||||
}
|
||||
prompt_yes_no() {
|
||||
local question="$1"
|
||||
local default_choice="${2:-yes}"
|
||||
|
||||
while true; do
|
||||
read -p "$question (y/n) [default: $default_choice]: " user_choice
|
||||
case $user_choice in
|
||||
[Yy])
|
||||
echo "yes"
|
||||
return
|
||||
;;
|
||||
[Nn])
|
||||
echo "no"
|
||||
return
|
||||
;;
|
||||
"")
|
||||
# If the user just presses Enter, return the default choice
|
||||
echo "$default_choice"
|
||||
return
|
||||
;;
|
||||
*)
|
||||
echo "Invalid choice. Please enter 'y' for yes or 'n' for no."
|
||||
;;
|
||||
esac
|
||||
done
|
||||
}
|
||||
|
||||
is_bitcoin_core_installed() {
|
||||
command -v bitcoind &>/dev/null
|
||||
}
|
||||
|
||||
# Lightning Stuff
|
||||
|
||||
# Function to check if Go is installed and upgrade to the latest version if needed
|
||||
upgrade_go() {
|
||||
local installed_go_version=$(go version 2>/dev/null | grep -oP 'go[0-9.]+')
|
||||
local latest_go_version=$(curl -s https://golang.org/dl/ | grep -oP 'https://golang.org/dl/go([0-9.]+).linux-amd64.tar.gz' | head -1 | grep -oP 'go([0-9.]+)')
|
||||
|
||||
if [[ -z "$installed_go_version" ]]; then
|
||||
echo "Go is not installed. Installing the latest version."
|
||||
elif [[ "$installed_go_version" == "$latest_go_version" ]]; then
|
||||
echo "Latest version of Go ($installed_go_version) is already installed. Skipping."
|
||||
return
|
||||
else
|
||||
echo "Upgrading Go from $installed_go_version to $latest_go_version."
|
||||
fi
|
||||
|
||||
wget -q "https://golang.org/dl/$latest_go_version.linux-amd64.tar.gz" -P /tmp || {
|
||||
echo "Failed to download Go. Aborting."
|
||||
exit 1
|
||||
}
|
||||
|
||||
tar -C /usr/local -xzf "/tmp/$latest_go_version.linux-amd64.tar.gz" || {
|
||||
echo "Failed to extract Go. Aborting."
|
||||
exit 1
|
||||
}
|
||||
rm "/tmp/$latest_go_version.linux-amd64.tar.gz"
|
||||
|
||||
if ! grep -q '/usr/local/go/bin' /etc/profile; then
|
||||
echo "export PATH=\$PATH:/usr/local/go/bin" >>/etc/profile
|
||||
echo "Go installation/upgrade completed successfully! Sourcing /etc/profile to update the PATH for the current session."
|
||||
source /etc/profile
|
||||
else
|
||||
echo "Go installation/upgrade completed successfully!"
|
||||
fi
|
||||
}
|
||||
|
||||
# Function to install LND
|
||||
install_lnd() {
|
||||
# Edit the bitcoin.conf file using cat
|
||||
bitcoin_conf_file="/home/bitcoin/.bitcoin/bitcoin.conf"
|
||||
if [ -f "$bitcoin_conf_file" ]; then
|
||||
echo "Editing the bitcoin.conf file..."
|
||||
cat <<EOF >>"$bitcoin_conf_file"
|
||||
# [RPC]
|
||||
debug=rpc
|
||||
rpcauth='lnd:1628299163766bdce1b3b9d321955971\$dfeb5a806808e3f5f31b46bc8289c79f27f679cfd41b9df1e154ab6588e10ad7'
|
||||
|
||||
# [zeromq]
|
||||
zmqpubrawblock=tcp://127.0.0.1:28332
|
||||
zmqpubrawtx=tcp://127.0.0.1:28333
|
||||
EOF
|
||||
else
|
||||
echo "Bitcoin configuration file not found at $bitcoin_conf_file. Please ensure Bitcoin Core is correctly configured."
|
||||
fi
|
||||
|
||||
# Restart bitcoind
|
||||
echo "Restarting bitcoind..."
|
||||
sudo systemctl restart bitcoind
|
||||
echo "bitcoind has been restarted."
|
||||
|
||||
echo "Checking the latest release of LND..."
|
||||
latest_release=$(curl -s https://api.github.com/repos/lightningnetwork/lnd/releases/latest | grep -oP '"tag_name": "\K(.*)(?=")')
|
||||
|
||||
lnd_directory="/home/bitcoin/node/lnd"
|
||||
|
||||
if [ -d "$lnd_directory" ]; then
|
||||
echo "LND directory already exists. Skipping cloning."
|
||||
else
|
||||
echo "Cloning LND into /home/bitcoin/node/lnd..."
|
||||
git clone https://github.com/lightningnetwork/lnd "$lnd_directory"
|
||||
fi
|
||||
|
||||
cd "$lnd_directory"
|
||||
|
||||
echo "Checking out the latest release of LND (v$latest_release)..."
|
||||
git checkout "v$latest_release"
|
||||
|
||||
echo "Building and installing LND..."
|
||||
make install
|
||||
|
||||
echo "LND has been installed successfully."
|
||||
|
||||
# Move lncli binary to /usr/local/bin for system-wide access
|
||||
echo "Moving lncli binary to /usr/local/bin..."
|
||||
sudo mv /home/bitcoin/go/bin/lncli /usr/local/bin/
|
||||
}
|
||||
|
||||
|
||||
# Function to configure LND and create its data folder
|
||||
configure_lnd() {
|
||||
echo "Configuring LND..."
|
||||
|
||||
# Ask the user for their node name
|
||||
echo -n "Enter a name for your node: "
|
||||
read -r node_name
|
||||
|
||||
# Create the LND data folder if it doesn't exist
|
||||
lnd_data_folder="/home/bitcoin/.lnd"
|
||||
mkdir -p "$lnd_data_folder"
|
||||
chown bitcoin:bitcoin "$lnd_data_folder"
|
||||
echo "LND data folder created: $lnd_data_folder"
|
||||
|
||||
# Generate LND configuration file
|
||||
lnd_config_file="/home/bitcoin/.lnd/lnd.conf"
|
||||
cat <<EOF >"$lnd_config_file"
|
||||
[Application Options]
|
||||
# Allow push payments
|
||||
accept-keysend=1
|
||||
# Public network name (User-provided node name)
|
||||
alias=$node_name
|
||||
# Allow gift routes
|
||||
allow-circular-route=1
|
||||
# Reduce the cooperative close chain fee
|
||||
coop-close-target-confs=1000
|
||||
# Log levels
|
||||
debuglevel=CNCT=debug,CRTR=debug,HSWC=debug,NTFN=debug,RPCS=debug
|
||||
# Mark unpayable, unpaid invoices as deleted
|
||||
gc-canceled-invoices-on-startup=1
|
||||
gc-canceled-invoices-on-the-fly=1
|
||||
# Avoid historical graph data sync
|
||||
ignore-historical-gossip-filters=1
|
||||
# Listen (not using Tor? Remove this)
|
||||
listen=localhost
|
||||
# Set the maximum amount of commit fees in a channel
|
||||
max-channel-fee-allocation=1.0
|
||||
# Set the max timeout blocks of a payment
|
||||
max-cltv-expiry=5000
|
||||
# Allow commitment fee to rise on anchor channels
|
||||
max-commit-fee-rate-anchors=100
|
||||
# Pending channel limit
|
||||
maxpendingchannels=10
|
||||
# Min inbound channel limit
|
||||
minchansize=5000
|
||||
# gRPC socket binding
|
||||
rpclisten=0.0.0.0:10009
|
||||
restlisten=0.0.0.0:8080
|
||||
# Avoid high startup overhead
|
||||
stagger-initial-reconnect=1
|
||||
# Delete and recreate RPC TLS certificate when details change or cert expires
|
||||
tlsautorefresh=true
|
||||
# Do not include IPs in the RPC TLS certificate
|
||||
tlsdisableautofill=true
|
||||
|
||||
[Bitcoin]
|
||||
# Turn on Bitcoin mode
|
||||
bitcoin.active=1
|
||||
# Set the channel confs to wait for channels
|
||||
bitcoin.defaultchanconfs=2
|
||||
# Forward fee rate in parts per million
|
||||
bitcoin.feerate=1000
|
||||
# Set bitcoin.testnet=1 or bitcoin.mainnet=1 as appropriate
|
||||
bitcoin.mainnet=1
|
||||
# Set the lower bound for HTLCs
|
||||
bitcoin.minhtlc=1
|
||||
# Set backing node, bitcoin.node=neutrino or bitcoin.node=bitcoind
|
||||
bitcoin.node=bitcoind
|
||||
# Set CLTV forwarding delta time
|
||||
bitcoin.timelockdelta=144
|
||||
|
||||
[bitcoind]
|
||||
# Configuration for using Bitcoin Core backend
|
||||
|
||||
# Set the password to what the auth script said
|
||||
bitcoind.rpcpass=K@iHa$$0
|
||||
# Set the username
|
||||
bitcoind.rpcuser=lnd
|
||||
# Set the ZMQ listeners
|
||||
bitcoind.zmqpubrawblock=tcp://127.0.0.1:28332
|
||||
bitcoind.zmqpubrawtx=tcp://127.0.0.1:28333
|
||||
|
||||
[bolt]
|
||||
# Enable database compaction when restarting
|
||||
db.bolt.auto-compact=true
|
||||
[protocol]
|
||||
# Enable large channels support
|
||||
protocol.wumbo-channels=1
|
||||
|
||||
[routerrpc]
|
||||
# Set minimum desired savings of trying a cheaper path
|
||||
routerrpc.attemptcost=10
|
||||
routerrpc.attemptcostppm=10
|
||||
# Set the number of historical routing records
|
||||
routerrpc.maxmchistory=10000
|
||||
# Set the min confidence in a path worth trying
|
||||
routerrpc.minrtprob=0.005
|
||||
|
||||
[routing]
|
||||
# Remove channels from graph that have one side that hasn't made announcements
|
||||
routing.strictgraphpruning=1
|
||||
EOF
|
||||
|
||||
chown bitcoin:bitcoin "$lnd_config_file"
|
||||
echo "LND configuration file created: $lnd_config_file"
|
||||
|
||||
# Ask the user about Tor mode and validate input
|
||||
while true; do
|
||||
read -rp "Do you want to use Tor only mode or hybrid mode? (Type 'yes' for Tor only mode, 'no' for hybrid mode): " tor_mode
|
||||
case $tor_mode in
|
||||
[Yy]es)
|
||||
echo "Enabling Tor mode in LND..."
|
||||
;;
|
||||
[Nn]o)
|
||||
echo "LND will be configured in hybrid mode (without Tor)."
|
||||
;;
|
||||
*)
|
||||
echo "Invalid input. Please type 'yes' for Tor only mode or 'no' for hybrid mode."
|
||||
continue
|
||||
;;
|
||||
esac
|
||||
break
|
||||
done
|
||||
|
||||
if [[ "$tor_mode" == "yes" ]]; then
|
||||
echo -n "Enter a password for LND Tor (this will be used to generate HashedControlPassword in torrc): "
|
||||
read -r tor_password
|
||||
|
||||
# Set Tor configurations in LND conf file for Tor only mode
|
||||
cat <<EOF >>"$lnd_config_file"
|
||||
[tor]
|
||||
tor.active=1
|
||||
tor.v3=1
|
||||
tor.socks=127.0.0.1:9050
|
||||
tor.streamisolation=true
|
||||
tor.password=$tor_password
|
||||
tor.privatekeypath=/root/.lnd/v3_onion_private_key
|
||||
EOF
|
||||
|
||||
# Update the torrc file with HashedControlPassword
|
||||
tor_hashed_password=$(tor --hash-password "$tor_password")
|
||||
echo "Updating torrc file with HashedControlPassword..."
|
||||
echo "HashedControlPassword $tor_hashed_password" | sudo tee -a /etc/tor/torrc
|
||||
sudo systemctl restart tor
|
||||
|
||||
echo "LND has been configured in Tor only mode."
|
||||
else
|
||||
echo -n "Enter a password for LND Tor (this will be used to generate HashedControlPassword in torrc): "
|
||||
read -r tor_password
|
||||
|
||||
# Set Tor configurations in LND conf file for hybrid mode
|
||||
cat <<EOF >>"$lnd_config_file"
|
||||
[tor]
|
||||
tor.active=1
|
||||
tor.v3=1
|
||||
tor.socks=127.0.0.1:9050
|
||||
tor.streamisolation=false
|
||||
tor.password=$tor_password
|
||||
tor.privatekeypath=/root/.lnd/v3_onion_private_key
|
||||
EOF
|
||||
|
||||
# Update the torrc file with HashedControlPassword
|
||||
tor_hashed_password=$(tor --hash-password "$tor_password")
|
||||
echo "Updating torrc file with HashedControlPassword..."
|
||||
echo "HashedControlPassword $tor_hashed_password" | sudo tee -a /etc/tor/torrc
|
||||
sudo systemctl restart tor
|
||||
fi
|
||||
|
||||
# Create the systemd service file for LND
|
||||
lnd_service_file="/etc/systemd/system/lnd.service"
|
||||
cat <<EOF | sudo tee "$lnd_service_file"
|
||||
[Unit]
|
||||
Description=LND Lightning Network Daemon
|
||||
Wants=bitcoind.service
|
||||
After=bitcoind.service
|
||||
|
||||
[Service]
|
||||
User=bitcoin
|
||||
|
||||
LimitNOFILE=65535
|
||||
ExecStart=/home/bitcoin/go/bin/lnd --configfile=/home/bitcoin/.lnd/lnd.conf
|
||||
ExecStop=/usr/local/bin/lncli stop
|
||||
SyslogIdentifier=lnd
|
||||
Restart=always
|
||||
RestartSec=30
|
||||
|
||||
[Install]
|
||||
WantedBy=multi-user.target
|
||||
|
||||
EOF
|
||||
|
||||
# Enable and start the LND service
|
||||
sudo systemctl enable lnd.service
|
||||
sudo systemctl start lnd.service
|
||||
}
|
||||
# Function to prompt the user to create a wallet
|
||||
prompt_create_wallet() {
|
||||
echo "Now it's time to create your wallet. Please press any key to continue and create a new wallet."
|
||||
|
||||
# Wait for user input to continue
|
||||
read -n 1 -s -r -p ""
|
||||
echo ""
|
||||
|
||||
echo -n "Please remember the password you enter for your wallet: "
|
||||
read -s wallet_password
|
||||
echo ""
|
||||
|
||||
# Run the lncli create command
|
||||
lncli create
|
||||
|
||||
# Create the wallet password file
|
||||
wallet_password_file="/home/bitcoin/.lnd/wallet_password"
|
||||
echo "$wallet_password" >"$wallet_password_file"
|
||||
chown bitcoin:bitcoin "$wallet_password_file"
|
||||
chmod 400 "$wallet_password_file"
|
||||
}
|
||||
|
||||
# Ride the lightning dashboard stuff
|
||||
|
||||
# Install RTL dash (Ride The Lightning)
|
||||
install_rtl() {
|
||||
echo "Checking for NPM (Node Package Manager)..."
|
||||
if ! command -v npm &>/dev/null; then
|
||||
echo "NPM not found. Installing NPM..."
|
||||
sleep 1
|
||||
sudo apt update
|
||||
sudo apt install -qq -y npm
|
||||
else
|
||||
echo "NPM is already installed."
|
||||
sleep 1
|
||||
fi
|
||||
|
||||
rtl_folder="/home/bitcoin/node/RTL"
|
||||
echo "Cloning RTL into $rtl_folder..."
|
||||
git clone https://github.com/Ride-The-Lightning/RTL.git "$rtl_folder"
|
||||
|
||||
echo "Entering the RTL folder..."
|
||||
cd "$rtl_folder"
|
||||
|
||||
echo "Running npm install..."
|
||||
npm install --omit=dev
|
||||
|
||||
echo "RTL has been installed successfully."
|
||||
sleep 1
|
||||
}
|
||||
|
||||
# Configure RTL and plug it into systemd
|
||||
configure_rtl() {
|
||||
echo "Configuring RTL..."
|
||||
sleep 1
|
||||
|
||||
# Get the computer's LAN IPv4 address
|
||||
lan_address=$(ip -4 addr show | grep -oP '(?<=inet\s)\d+(\.\d+){3}' | grep -v '127.0.0.1' | head -1)
|
||||
|
||||
# Ask the user about enabling FIAT conversion
|
||||
echo "Do you want to enable FIAT conversion? (Type 'yes' for enabling FIAT conversion, 'no' otherwise):"
|
||||
read -r enable_fiat
|
||||
|
||||
rtl_folder="/home/bitcoin/node/RTL"
|
||||
rtl_config_file="$rtl_folder/RTL-Config.json"
|
||||
|
||||
cat <<EOF >"$rtl_config_file"
|
||||
{
|
||||
"multiPass": "password",
|
||||
"port": "3000",
|
||||
"defaultNodeIndex": 1,
|
||||
"dbDirectoryPath": "/home/bitcoin/node/RTL/data",
|
||||
"SSO": {
|
||||
"rtlSSO": 0
|
||||
},
|
||||
"nodes": [
|
||||
{
|
||||
"index": 1,
|
||||
"lnNode": "LND",
|
||||
"lnImplementation": "LND",
|
||||
"Authentication": {
|
||||
"macaroonPath": "/home/bitcoin/.lnd/data/chain/bitcoin/mainnet"
|
||||
},
|
||||
"Settings": {
|
||||
"userPersona": "OPERATOR",
|
||||
"themeMode": "NIGHT",
|
||||
"themeColor": "PURPLE",
|
||||
"channelBackupPath": "/home/bitcoin/bitcoin/node/RTL/backups",
|
||||
"bitcoindConfigPath": "/home/bitcoin/.bitcoin/bitcoin.conf",
|
||||
"logLevel": "INFO",
|
||||
"fiatConversion": "$enable_fiat",
|
||||
"unannouncedChannels": true,
|
||||
"lnServerUrl": "https://$lan_address:8080"
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
EOF
|
||||
|
||||
echo "RTL configuration file created: $rtl_config_file"
|
||||
|
||||
# Create the data folder for RTL
|
||||
rtl_data_folder="/home/bitcoin/node/RTL/data"
|
||||
mkdir -p "$rtl_data_folder"
|
||||
chown bitcoin:bitcoin "$rtl_data_folder"
|
||||
echo "RTL data folder created: $rtl_data_folder"
|
||||
|
||||
echo "RTL has been configured."
|
||||
|
||||
# Create and start the systemd service for RTL
|
||||
rtl_systemd_file="/etc/systemd/system/rtl.service"
|
||||
cat <<EOF >"$rtl_systemd_file"
|
||||
[Unit]
|
||||
Description=Ride The Lightning (RTL) Bitcoin Lightning Network GUI
|
||||
After=bitcoind.service lnd.service
|
||||
|
||||
[Service]
|
||||
User=bitcoin
|
||||
Group=bitcoin
|
||||
Type=simple
|
||||
ExecStart=/usr/bin/npm --prefix /home/bitcoin/node/RTL run start
|
||||
|
||||
[Install]
|
||||
WantedBy=multi-user.target
|
||||
EOF
|
||||
|
||||
echo "Systemd service file created: $rtl_systemd_file"
|
||||
sudo systemctl enable rtl
|
||||
sudo systemctl start rtl
|
||||
|
||||
echo "RTL service has been started."
|
||||
echo "You can access RTL at http://localhost:8080 or http://$lan_address:8080"
|
||||
}
|
||||
|
||||
# Root Check
|
||||
if [ "$EUID" -ne 0 ]; then
|
||||
echo "Please run this script as root."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Welcom Message
|
||||
cat <<"EOF"
|
||||
! .::::::. ... ::: .::.:::::::.. :::. :::. :::. :::. :::. ... :::::::-. .,:::::: ::::::::::. :::. .,-::::: ::: .
|
||||
! ;;;` ` .;;;;;;;. ';;, ,;;;' ;;;;``;;;; ;;`;; `;;;;, `;;; `;;;;, `;;; .;;;;;;;. ;;, `';,;;;;'''' `;;;```.;;; ;;`;; ,;;;'````' ;;; .;;,.
|
||||
! '[==/[[[[,,[[ \[[, \[[ .[[/ [[[,/[[[' ,[[ '[[, [[[[[. '[[ [[[[[. '[[,[[ \[[, `[[ [[ [[cccc `]]nnn]]' ,[[ '[[, [[[ [[[[[/'
|
||||
! ''' $$$$, $$$ Y$c.$$" $$$$$$c c$$$cc$$$c $$$ "Y$c$$ $$$ "Y$c$$$$$, $$$ $$, $$ $$"""" $$$"" c$$$cc$$$c $$$ _$$$$,
|
||||
! 88b dP"888,_ _,88P Y88P 888b "88bo, 888 888, 888 Y88 888 Y88"888,_ _,88P 888_,o8P' 888oo,__ 888o 888 888,`88bo,__,o, "888"88o,
|
||||
! "YMmMY" "YMMMMMP" MP MMMM "W" YMM ""` MMM YM MMM YM "YMMMMMP" MMMMP"` """"YUMMM YMMMb YMM ""` "YUMMMMMP" MMM "MMP"
|
||||
EOF
|
||||
echo
|
||||
center_text "Thanks for using Enki's LND install script"
|
||||
center_text "This script will install LND and RTL on your box."
|
||||
center_text "To continue, hit any key."
|
||||
if [ -t 0 ]; then # Check if running in an interactive shell before using "read"
|
||||
center_text "To continue, hit any key."
|
||||
read -n 1 -s -r -p ""
|
||||
fi
|
||||
echo
|
||||
|
||||
# Main part of the script.
|
||||
# Checks if Bitcoin Core is installed
|
||||
|
||||
if is_bitcoin_core_installed; then
|
||||
echo "Core is installed. Lets "
|
||||
else
|
||||
echo "Bitcoin Core is not installed. do you want to install Core?"
|
||||
fi
|
||||
|
||||
install_go # Install Go if it's not already installed
|
||||
install_lnd # Call the function to install LND
|
||||
configure_lnd # Call the function to configure LND and create its data folder
|
||||
prompt_create_wallet # Makes a wallet and adds the auto unlock file.
|
||||
install_rtl # Installs Ride The Lightning
|
||||
configure_rtl # makes the RTL config file and plugs it into systemd
|
504
Bitcoin/lndnew.sh
Normal file
504
Bitcoin/lndnew.sh
Normal file
@ -0,0 +1,504 @@
|
||||
#!/bin/bash
|
||||
#This is a script to install LND.
|
||||
|
||||
#--------------------
|
||||
#Global Functions.
|
||||
#--------------------
|
||||
is_package_installed() {
|
||||
if dpkg -l "$1" 2>/dev/null | grep -q "^ii"; then
|
||||
echo "$1 is installed."
|
||||
return 0 # Package is installed
|
||||
else
|
||||
echo "$1 is not installed."
|
||||
return 1 # Package is not installed
|
||||
fi
|
||||
}
|
||||
prompt_yes_no() {
|
||||
local question="$1"
|
||||
local default_choice="${2:-yes}"
|
||||
|
||||
while true; do
|
||||
read -p "$question (y/n) [default: $default_choice]: " user_choice
|
||||
case $user_choice in
|
||||
[Yy])
|
||||
echo "yes"
|
||||
return
|
||||
;;
|
||||
[Nn])
|
||||
echo "no"
|
||||
return
|
||||
;;
|
||||
"")
|
||||
# If the user just presses Enter, return the default choice
|
||||
echo "$default_choice"
|
||||
return
|
||||
;;
|
||||
*)
|
||||
echo "Invalid choice. Please enter 'y' for yes or 'n' for no."
|
||||
;;
|
||||
esac
|
||||
done
|
||||
}
|
||||
|
||||
is_bitcoin_core_installed() {
|
||||
command -v bitcoind &>/dev/null
|
||||
}
|
||||
|
||||
#--------------------
|
||||
# Lightning Stuff
|
||||
#--------------------
|
||||
|
||||
# Function to check if Go is installed and upgrade to the latest version if needed
|
||||
upgrade_go() {
|
||||
local installed_go_version=$(go version 2>/dev/null | grep -oP 'go[0-9.]+')
|
||||
local latest_go_version=$(curl -s https://golang.org/dl/ | grep -oP 'https://golang.org/dl/go([0-9.]+).linux-amd64.tar.gz' | head -1 | grep -oP 'go([0-9.]+)')
|
||||
|
||||
if [[ -z "$installed_go_version" ]]; then
|
||||
echo "Go is not installed. Installing the latest version."
|
||||
elif [[ "$installed_go_version" == "$latest_go_version" ]]; then
|
||||
echo "Latest version of Go ($installed_go_version) is already installed. Skipping."
|
||||
return
|
||||
else
|
||||
echo "Upgrading Go from $installed_go_version to $latest_go_version."
|
||||
fi
|
||||
|
||||
wget -q "https://golang.org/dl/$latest_go_version.linux-amd64.tar.gz" -P /tmp || {
|
||||
echo "Failed to download Go. Aborting."
|
||||
exit 1
|
||||
}
|
||||
|
||||
tar -C /usr/local -xzf "/tmp/$latest_go_version.linux-amd64.tar.gz" || {
|
||||
echo "Failed to extract Go. Aborting."
|
||||
exit 1
|
||||
}
|
||||
rm "/tmp/$latest_go_version.linux-amd64.tar.gz"
|
||||
|
||||
if ! grep -q '/usr/local/go/bin' /etc/profile; then
|
||||
echo "export PATH=\$PATH:/usr/local/go/bin" >>/etc/profile
|
||||
echo "Go installation/upgrade completed successfully! Sourcing /etc/profile to update the PATH for the current session."
|
||||
source /etc/profile
|
||||
else
|
||||
echo "Go installation/upgrade completed successfully!"
|
||||
fi
|
||||
}
|
||||
|
||||
# Function to install LND
|
||||
install_lnd() {
|
||||
# Edit the bitcoin.conf file using cat
|
||||
bitcoin_conf_file="/home/bitcoin/.bitcoin/bitcoin.conf"
|
||||
if [ -f "$bitcoin_conf_file" ]; then
|
||||
echo "Editing the bitcoin.conf file..."
|
||||
cat <<EOF >>"$bitcoin_conf_file"
|
||||
# [RPC]
|
||||
debug=rpc
|
||||
rpcauth='lnd:1628299163766bdce1b3b9d321955971\$dfeb5a806808e3f5f31b46bc8289c79f27f679cfd41b9df1e154ab6588e10ad7'
|
||||
|
||||
# [zeromq]
|
||||
zmqpubrawblock=tcp://127.0.0.1:28332
|
||||
zmqpubrawtx=tcp://127.0.0.1:28333
|
||||
EOF
|
||||
else
|
||||
echo "Bitcoin configuration file not found at $bitcoin_conf_file. Please ensure Bitcoin Core is correctly configured."
|
||||
fi
|
||||
|
||||
# Restart bitcoind
|
||||
echo "Restarting bitcoind..."
|
||||
sudo systemctl restart bitcoind
|
||||
echo "bitcoind has been restarted."
|
||||
|
||||
echo "Checking the latest release of LND..."
|
||||
latest_release=$(curl -s https://api.github.com/repos/lightningnetwork/lnd/releases/latest | grep -oP '"tag_name": "\K(.*)(?=")')
|
||||
|
||||
lnd_directory="/home/bitcoin/node/lnd"
|
||||
|
||||
if [ -d "$lnd_directory" ]; then
|
||||
echo "LND directory already exists. Skipping cloning."
|
||||
else
|
||||
echo "Cloning LND into /home/bitcoin/node/lnd..."
|
||||
git clone https://github.com/lightningnetwork/lnd "$lnd_directory"
|
||||
fi
|
||||
|
||||
cd "$lnd_directory"
|
||||
|
||||
echo "Checking out the latest release of LND (v$latest_release)..."
|
||||
git checkout "v$latest_release"
|
||||
|
||||
echo "Building and installing LND..."
|
||||
make install
|
||||
|
||||
echo "LND has been installed successfully."
|
||||
|
||||
# Move lncli binary to /usr/local/bin for system-wide access
|
||||
echo "Moving lncli binary to /usr/local/bin..."
|
||||
sudo mv /home/bitcoin/go/bin/lncli /usr/local/bin/
|
||||
}
|
||||
|
||||
# Function to configure LND and create its data folder
|
||||
configure_lnd() {
|
||||
echo "Configuring LND..."
|
||||
|
||||
# Ask the user for their node name
|
||||
echo -n "Enter a name for your node: "
|
||||
read -r node_name
|
||||
|
||||
# Create the LND data folder if it doesn't exist
|
||||
lnd_data_folder="/home/bitcoin/.lnd"
|
||||
mkdir -p "$lnd_data_folder"
|
||||
chown bitcoin:bitcoin "$lnd_data_folder"
|
||||
echo "LND data folder created: $lnd_data_folder"
|
||||
|
||||
# Generate LND configuration file
|
||||
lnd_config_file="/home/bitcoin/.lnd/lnd.conf"
|
||||
cat <<EOF >"$lnd_config_file"
|
||||
[Application Options]
|
||||
# Allow push payments
|
||||
accept-keysend=1
|
||||
# Public network name (User-provided node name)
|
||||
alias=$node_name
|
||||
# Allow gift routes
|
||||
allow-circular-route=1
|
||||
# Reduce the cooperative close chain fee
|
||||
coop-close-target-confs=1000
|
||||
# Log levels
|
||||
debuglevel=CNCT=debug,CRTR=debug,HSWC=debug,NTFN=debug,RPCS=debug
|
||||
# Mark unpayable, unpaid invoices as deleted
|
||||
gc-canceled-invoices-on-startup=1
|
||||
gc-canceled-invoices-on-the-fly=1
|
||||
# Avoid historical graph data sync
|
||||
ignore-historical-gossip-filters=1
|
||||
# Listen (not using Tor? Remove this)
|
||||
listen=localhost
|
||||
# Set the maximum amount of commit fees in a channel
|
||||
max-channel-fee-allocation=1.0
|
||||
# Set the max timeout blocks of a payment
|
||||
max-cltv-expiry=5000
|
||||
# Allow commitment fee to rise on anchor channels
|
||||
max-commit-fee-rate-anchors=100
|
||||
# Pending channel limit
|
||||
maxpendingchannels=10
|
||||
# Min inbound channel limit
|
||||
minchansize=5000
|
||||
# gRPC socket binding
|
||||
rpclisten=0.0.0.0:10009
|
||||
restlisten=0.0.0.0:8080
|
||||
# Avoid high startup overhead
|
||||
stagger-initial-reconnect=1
|
||||
# Delete and recreate RPC TLS certificate when details change or cert expires
|
||||
tlsautorefresh=true
|
||||
# Do not include IPs in the RPC TLS certificate
|
||||
tlsdisableautofill=true
|
||||
|
||||
[Bitcoin]
|
||||
# Turn on Bitcoin mode
|
||||
bitcoin.active=1
|
||||
# Set the channel confs to wait for channels
|
||||
bitcoin.defaultchanconfs=2
|
||||
# Forward fee rate in parts per million
|
||||
bitcoin.feerate=1000
|
||||
# Set bitcoin.testnet=1 or bitcoin.mainnet=1 as appropriate
|
||||
bitcoin.mainnet=1
|
||||
# Set the lower bound for HTLCs
|
||||
bitcoin.minhtlc=1
|
||||
# Set backing node, bitcoin.node=neutrino or bitcoin.node=bitcoind
|
||||
bitcoin.node=bitcoind
|
||||
# Set CLTV forwarding delta time
|
||||
bitcoin.timelockdelta=144
|
||||
|
||||
[bitcoind]
|
||||
# Configuration for using Bitcoin Core backend
|
||||
|
||||
# Set the password to what the auth script said
|
||||
bitcoind.rpcpass=K@iHa$$0
|
||||
# Set the username
|
||||
bitcoind.rpcuser=lnd
|
||||
# Set the ZMQ listeners
|
||||
bitcoind.zmqpubrawblock=tcp://127.0.0.1:28332
|
||||
bitcoind.zmqpubrawtx=tcp://127.0.0.1:28333
|
||||
|
||||
[bolt]
|
||||
# Enable database compaction when restarting
|
||||
db.bolt.auto-compact=true
|
||||
[protocol]
|
||||
# Enable large channels support
|
||||
protocol.wumbo-channels=1
|
||||
|
||||
[routerrpc]
|
||||
# Set minimum desired savings of trying a cheaper path
|
||||
routerrpc.attemptcost=10
|
||||
routerrpc.attemptcostppm=10
|
||||
# Set the number of historical routing records
|
||||
routerrpc.maxmchistory=10000
|
||||
# Set the min confidence in a path worth trying
|
||||
routerrpc.minrtprob=0.005
|
||||
|
||||
[routing]
|
||||
# Remove channels from graph that have one side that hasn't made announcements
|
||||
routing.strictgraphpruning=1
|
||||
EOF
|
||||
|
||||
chown bitcoin:bitcoin "$lnd_config_file"
|
||||
echo "LND configuration file created: $lnd_config_file"
|
||||
|
||||
# Ask the user about Tor mode and validate input
|
||||
while true; do
|
||||
read -rp "Do you want to use Tor only mode or hybrid mode? (Type 'yes' for Tor only mode, 'no' for hybrid mode): " tor_mode
|
||||
case $tor_mode in
|
||||
[Yy]es)
|
||||
echo "Enabling Tor mode in LND..."
|
||||
;;
|
||||
[Nn]o)
|
||||
echo "LND will be configured in hybrid mode (without Tor)."
|
||||
;;
|
||||
*)
|
||||
echo "Invalid input. Please type 'yes' for Tor only mode or 'no' for hybrid mode."
|
||||
continue
|
||||
;;
|
||||
esac
|
||||
break
|
||||
done
|
||||
|
||||
if [[ "$tor_mode" == "yes" ]]; then
|
||||
echo -n "Enter a password for LND Tor (this will be used to generate HashedControlPassword in torrc): "
|
||||
read -r tor_password
|
||||
|
||||
# Set Tor configurations in LND conf file for Tor only mode
|
||||
cat <<EOF >>"$lnd_config_file"
|
||||
[tor]
|
||||
tor.active=1
|
||||
tor.v3=1
|
||||
tor.socks=127.0.0.1:9050
|
||||
tor.streamisolation=true
|
||||
tor.password=$tor_password
|
||||
tor.privatekeypath=/root/.lnd/v3_onion_private_key
|
||||
EOF
|
||||
|
||||
# Update the torrc file with HashedControlPassword
|
||||
tor_hashed_password=$(tor --hash-password "$tor_password")
|
||||
echo "Updating torrc file with HashedControlPassword..."
|
||||
echo "HashedControlPassword $tor_hashed_password" | sudo tee -a /etc/tor/torrc
|
||||
sudo systemctl restart tor
|
||||
|
||||
echo "LND has been configured in Tor only mode."
|
||||
else
|
||||
echo -n "Enter a password for LND Tor (this will be used to generate HashedControlPassword in torrc): "
|
||||
read -r tor_password
|
||||
|
||||
# Set Tor configurations in LND conf file for hybrid mode
|
||||
cat <<EOF >>"$lnd_config_file"
|
||||
[tor]
|
||||
tor.active=1
|
||||
tor.v3=1
|
||||
tor.socks=127.0.0.1:9050
|
||||
tor.streamisolation=false
|
||||
tor.password=$tor_password
|
||||
tor.privatekeypath=/root/.lnd/v3_onion_private_key
|
||||
EOF
|
||||
|
||||
# Update the torrc file with HashedControlPassword
|
||||
tor_hashed_password=$(tor --hash-password "$tor_password")
|
||||
echo "Updating torrc file with HashedControlPassword..."
|
||||
echo "HashedControlPassword $tor_hashed_password" | sudo tee -a /etc/tor/torrc
|
||||
sudo systemctl restart tor
|
||||
fi
|
||||
|
||||
# Create the systemd service file for LND
|
||||
lnd_service_file="/etc/systemd/system/lnd.service"
|
||||
cat <<EOF | sudo tee "$lnd_service_file"
|
||||
[Unit]
|
||||
Description=LND Lightning Network Daemon
|
||||
Wants=bitcoind.service
|
||||
After=bitcoind.service
|
||||
|
||||
[Service]
|
||||
User=bitcoin
|
||||
|
||||
LimitNOFILE=65535
|
||||
ExecStart=/home/bitcoin/go/bin/lnd --configfile=/home/bitcoin/.lnd/lnd.conf
|
||||
ExecStop=/usr/local/bin/lncli stop
|
||||
SyslogIdentifier=lnd
|
||||
Restart=always
|
||||
RestartSec=30
|
||||
|
||||
[Install]
|
||||
WantedBy=multi-user.target
|
||||
|
||||
EOF
|
||||
|
||||
# Enable and start the LND service
|
||||
sudo systemctl enable lnd.service
|
||||
sudo systemctl start lnd.service
|
||||
}
|
||||
# Function to prompt the user to create a wallet
|
||||
prompt_create_wallet() {
|
||||
echo "Now it's time to create your wallet. Please press any key to continue and create a new wallet."
|
||||
|
||||
# Wait for user input to continue
|
||||
read -n 1 -s -r -p ""
|
||||
echo ""
|
||||
|
||||
echo -n "Please remember the password you enter for your wallet: "
|
||||
read -s wallet_password
|
||||
echo ""
|
||||
|
||||
# Run the lncli create command
|
||||
lncli create
|
||||
|
||||
# Create the wallet password file
|
||||
wallet_password_file="/home/bitcoin/.lnd/wallet_password"
|
||||
echo "$wallet_password" >"$wallet_password_file"
|
||||
chown bitcoin:bitcoin "$wallet_password_file"
|
||||
chmod 400 "$wallet_password_file"
|
||||
}
|
||||
|
||||
# Ride the lightning dashboard stuff
|
||||
|
||||
# Install RTL dash (Ride The Lightning)
|
||||
install_rtl() {
|
||||
echo "Checking for NPM (Node Package Manager)..."
|
||||
if ! command -v npm &>/dev/null; then
|
||||
echo "NPM not found. Installing NPM..."
|
||||
sleep 1
|
||||
sudo apt update
|
||||
sudo apt install -qq -y npm
|
||||
else
|
||||
echo "NPM is already installed."
|
||||
sleep 1
|
||||
fi
|
||||
|
||||
rtl_folder="/home/bitcoin/node/RTL"
|
||||
echo "Cloning RTL into $rtl_folder..."
|
||||
git clone https://github.com/Ride-The-Lightning/RTL.git "$rtl_folder"
|
||||
|
||||
echo "Entering the RTL folder..."
|
||||
cd "$rtl_folder"
|
||||
|
||||
echo "Running npm install..."
|
||||
npm install --omit=dev
|
||||
|
||||
echo "RTL has been installed successfully."
|
||||
sleep 1
|
||||
}
|
||||
|
||||
# Configure RTL and plug it into systemd
|
||||
configure_rtl() {
|
||||
echo "Configuring RTL..."
|
||||
sleep 1
|
||||
|
||||
# Get the computer's LAN IPv4 address
|
||||
lan_address=$(ip -4 addr show | grep -oP '(?<=inet\s)\d+(\.\d+){3}' | grep -v '127.0.0.1' | head -1)
|
||||
|
||||
# Ask the user about enabling FIAT conversion
|
||||
echo "Do you want to enable FIAT conversion? (Type 'yes' for enabling FIAT conversion, 'no' otherwise):"
|
||||
read -r enable_fiat
|
||||
|
||||
rtl_folder="/home/bitcoin/node/RTL"
|
||||
rtl_config_file="$rtl_folder/RTL-Config.json"
|
||||
|
||||
cat <<EOF >"$rtl_config_file"
|
||||
{
|
||||
"multiPass": "password",
|
||||
"port": "3000",
|
||||
"defaultNodeIndex": 1,
|
||||
"dbDirectoryPath": "/home/bitcoin/node/RTL/data",
|
||||
"SSO": {
|
||||
"rtlSSO": 0
|
||||
},
|
||||
"nodes": [
|
||||
{
|
||||
"index": 1
|
||||
"lnNode": "LND",
|
||||
"lnImplementation": "LND",
|
||||
"Authentication": {
|
||||
"macaroonPath": "/home/bitcoin/.lnd/data/chain/bitcoin/mainnet"
|
||||
},
|
||||
"Settings": {
|
||||
"userPersona": "OPERATOR",
|
||||
"themeMode": "NIGHT",
|
||||
"themeColor": "PURPLE",
|
||||
"channelBackupPath": "/home/bitcoin/bitcoin/node/RTL/backups",
|
||||
"bitcoindConfigPath": "/home/bitcoin/.bitcoin/bitcoin.conf",
|
||||
"logLevel": "INFO",
|
||||
"fiatConversion": "$enable_fiat",
|
||||
"unannouncedChannels": true,
|
||||
"lnServerUrl": "https://$lan_address:8080"
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
EOF
|
||||
|
||||
echo "RTL configuration file created: $rtl_config_file"
|
||||
|
||||
# Create the data folder for RTL
|
||||
rtl_data_folder="/home/bitcoin/node/RTL/data"
|
||||
mkdir -p "$rtl_data_folder"
|
||||
chown bitcoin:bitcoin "$rtl_data_folder"
|
||||
echo "RTL data folder created: $rtl_data_folder"
|
||||
|
||||
echo "RTL has been configured."
|
||||
|
||||
# Create and start the systemd service for RTL
|
||||
rtl_systemd_file="/etc/systemd/system/rtl.service"
|
||||
cat <<EOF >"$rtl_systemd_file"
|
||||
[Unit]
|
||||
Description=Ride The Lightning (RTL) Bitcoin Lightning Network GUI
|
||||
After=bitcoind.service lnd.service
|
||||
|
||||
[Service]
|
||||
User=bitcoin
|
||||
Group=bitcoin
|
||||
Type=simple
|
||||
ExecStart=/usr/bin/npm --prefix /home/bitcoin/node/RTL run start
|
||||
|
||||
[Install]
|
||||
WantedBy=multi-user.target
|
||||
EOF
|
||||
|
||||
echo "Systemd service file created: $rtl_systemd_file"
|
||||
sudo systemctl enable rtl
|
||||
sudo systemctl start rtl
|
||||
|
||||
echo "RTL service has been started."
|
||||
echo "You can access RTL at http://localhost:8080 or http://$lan_address:8080"
|
||||
}
|
||||
|
||||
# Root Check
|
||||
if [ "$EUID" -ne 0 ]; then
|
||||
echo "Please run this script as root."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Welcom Message
|
||||
cat <<"EOF"
|
||||
! .::::::. ... ::: .::.:::::::.. :::. :::. :::. :::. :::. ... :::::::-. .,:::::: ::::::::::. :::. .,-::::: ::: .
|
||||
! ;;;` ` .;;;;;;;. ';;, ,;;;' ;;;;``;;;; ;;`;; `;;;;, `;;; `;;;;, `;;; .;;;;;;;. ;;, `';,;;;;'''' `;;;```.;;; ;;`;; ,;;;'````' ;;; .;;,.
|
||||
! '[==/[[[[,,[[ \[[, \[[ .[[/ [[[,/[[[' ,[[ '[[, [[[[[. '[[ [[[[[. '[[,[[ \[[, `[[ [[ [[cccc `]]nnn]]' ,[[ '[[, [[[ [[[[[/'
|
||||
! ''' $$$$, $$$ Y$c.$$" $$$$$$c c$$$cc$$$c $$$ "Y$c$$ $$$ "Y$c$$$$$, $$$ $$, $$ $$"""" $$$"" c$$$cc$$$c $$$ _$$$$,
|
||||
! 88b dP"888,_ _,88P Y88P 888b "88bo, 888 888, 888 Y88 888 Y88"888,_ _,88P 888_,o8P' 888oo,__ 888o 888 888,`88bo,__,o, "888"88o,
|
||||
! "YMmMY" "YMMMMMP" MP MMMM "W" YMM ""` MMM YM MMM YM "YMMMMMP" MMMMP"` """"YUMMM YMMMb YMM ""` "YUMMMMMP" MMM "MMP"
|
||||
EOF
|
||||
echo
|
||||
center_text "Thanks for using Enki's LND install script"
|
||||
center_text "This script will install LND and RTL on your box."
|
||||
center_text "To continue, hit any key."
|
||||
if [ -t 0 ]; then # Check if running in an interactive shell before using "read"
|
||||
center_text "To continue, hit any key."
|
||||
read -n 1 -s -r -p ""
|
||||
fi
|
||||
echo
|
||||
|
||||
# Main part of the script.
|
||||
# Checks if Bitcoin Core is installed
|
||||
|
||||
if is_bitcoin_core_installed; then
|
||||
echo "Core is installed. LFG"
|
||||
else
|
||||
echo "Bitcoin Core is not installed. do you want to install Core?"
|
||||
fi
|
||||
|
||||
install_go # Install Go if it's not already installed
|
||||
install_lnd # Call the function to install LND
|
||||
configure_lnd # Call the function to configure LND and create its data folder
|
||||
prompt_create_wallet # Makes a wallet and adds the auto unlock file.
|
||||
install_rtl # Installs Ride The Lightning
|
||||
configure_rtl # makes the RTL config file and plugs it into systemd
|
Loading…
Reference in New Issue
Block a user