2020-02-10 12:33:03 +01:00
#!/bin/bash
2022-02-10 15:46:12 +00:00
# https://github.com/lnbits/lnbits-legend
2020-02-10 12:33:03 +01:00
# command info
if [ $# -eq 0 ] || [ " $1 " = "-h" ] || [ " $1 " = "-help" ] ; then
2020-04-22 20:57:32 +02:00
echo "small config script to switch LNbits on or off"
2022-02-10 15:46:12 +00:00
echo "bonus.lnbits.sh on [lnd|tlnd|slnd|cl|tcl|scl] [?GITHUBUSER] [?BRANCH|?TAG]"
2021-12-16 20:10:03 +01:00
echo "bonus.lnbits.sh switch [lnd|tlnd|slnd|cl|tcl|scl]"
echo "bonus.lnbits.sh off"
echo "bonus.lnbits.sh status"
echo "bonus.lnbits.sh menu"
echo "bonus.lnbits.sh prestart"
echo "bonus.lnbits.sh githubsync"
2020-04-22 20:57:32 +02:00
exit 1
2020-02-10 12:33:03 +01:00
fi
2022-01-31 22:36:40 +00:00
echo " # Running: 'bonus.lnbits.sh $* ' "
2020-04-28 18:01:50 +02:00
source /mnt/hdd/raspiblitz.conf
2020-02-10 12:33:03 +01:00
# show info menu
if [ " $1 " = "menu" ] ; then
2020-07-14 21:04:14 +02:00
# get LNbits status info
2020-02-10 12:33:03 +01:00
echo "# collecting status info ... (please wait)"
source <( sudo /home/admin/config.scripts/bonus.lnbits.sh status)
2020-11-23 21:27:39 +01:00
# display possible problems with IP2TOR setup
2020-09-14 15:29:50 +02:00
if [ ${# ip2torWarn } -gt 0 ] ; then
2020-11-23 21:27:39 +01:00
whiptail --title " Warning " \
--yes-button "Back" \
--no-button "Continue Anyway" \
--yesno " Your IP2TOR+LetsEncrypt may have problems:\n ${ ip2torWarn } \n\nCheck if locally responding: https:// ${ localIP } : ${ httpsPort } \n\nCheck if service is reachable over Tor:\n ${ toraddress } " 14 72
if [ " $? " != "1" ] ; then
exit 0
fi
2020-09-14 15:29:50 +02:00
fi
2021-12-16 20:10:03 +01:00
# add info on funding source
fundinginfo = ""
if [ " ${ LNBitsFunding } " = = "lnd" ] || [ " ${ LNBitsFunding } " = = "tlnd" ] || [ " ${ LNBitsFunding } " = = "slnd" ] ; then
fundinginfo = "on LND "
elif [ " ${ LNBitsFunding } " = = "cl" ] || [ " ${ LNBitsFunding } " = = "tcl" ] || [ " ${ LNBitsFunding } " = = "scl" ] ; then
fundinginfo = "on c-lightning "
fi
2021-08-19 21:06:27 +01:00
text = " Local Web Browser: https:// ${ localIP } : ${ httpsPort } "
2020-07-14 21:04:14 +02:00
if [ ${# publicDomain } -gt 0 ] ; then
text = " ${ text }
Public Domain: https://${ publicDomain } :${ httpsPort }
2021-12-14 23:34:35 +01:00
port forwarding on router needs to be active & may change port"
2020-07-14 21:04:14 +02:00
fi
2021-04-18 18:04:59 +02:00
text = " ${ text } \n
2021-04-20 00:26:49 +02:00
You need to accept self-signed HTTPS cert with SHA1 Fingerprint:
2021-12-14 23:34:35 +01:00
${ sslFingerprintIP } "
2020-02-10 12:33:03 +01:00
2020-07-14 21:04:14 +02:00
if [ " ${ runBehindTor } " = "on" ] && [ ${# toraddress } -gt 0 ] ; then
2022-02-13 12:23:34 +00:00
sudo /home/admin/config.scripts/blitz.display.sh qr " ${ toraddress } "
2020-07-14 21:04:14 +02:00
text = " ${ text } \n
2020-07-14 21:17:05 +02:00
TOR Browser Hidden Service address ( QR see LCD) :
2020-07-14 21:04:14 +02:00
${ toraddress } "
fi
2021-12-14 23:34:35 +01:00
2020-07-14 21:04:14 +02:00
if [ ${# ip2torDomain } -gt 0 ] ; then
2020-07-14 23:06:09 +02:00
text = " ${ text } \n
2020-07-14 21:04:14 +02:00
IP2TOR+LetsEncrypt: https://${ ip2torDomain } :${ ip2torPort }
2021-12-16 20:10:03 +01:00
SHA1 ${ sslFingerprintTOR } \n
https://${ ip2torDomain } :${ ip2torPort } ready for public use"
2020-07-14 21:04:14 +02:00
elif [ ${# ip2torIP } -gt 0 ] ; then
2020-07-14 22:56:20 +02:00
text = " ${ text } \n
2020-07-14 21:04:14 +02:00
IP2TOR: https://${ ip2torIP } :${ ip2torPort }
2021-12-16 20:10:03 +01:00
SHA1 ${ sslFingerprintTOR } \n
Consider adding a LetsEncrypt HTTPS Domain under OPTIONS."
2020-07-14 21:04:14 +02:00
elif [ ${# publicDomain } -eq 0 ] ; then
2020-07-14 21:10:19 +02:00
text = " ${ text } \n
2020-08-12 09:44:49 +02:00
To enable easy reachability with normal browser from the outside
2021-12-16 20:10:03 +01:00
Consider adding a IP2TOR Bridge under OPTIONS."
2020-02-10 12:33:03 +01:00
fi
2021-12-16 20:10:03 +01:00
whiptail --title " LNbits ${ fundinginfo } " --yes-button "OK" --no-button "OPTIONS" --yesno " ${ text } " 18 69
result = $?
2022-02-13 12:23:34 +00:00
sudo /home/admin/config.scripts/blitz.display.sh hide
2021-12-16 20:10:03 +01:00
echo " option ( ${ result } ) - please wait ... "
# exit when user presses OK to close menu
if [ ${ result } -eq 0 ] ; then
exit 0
fi
# LNbits OPTIONS menu
OPTIONS = ( )
# IP2TOR options
if [ " ${ ip2torDomain } " != "" ] ; then
# IP2TOR+LetsEncrypt active - offer cancel
OPTIONS += ( IP2TOR-OFF "Cancel IP2Tor Subscription for LNbits" )
elif [ " ${ ip2torIP } " != "" ] ; then
# just IP2TOR active - offer cancel or Lets Encrypt
OPTIONS += ( HTTPS-ON "Add free HTTPS-Certificate for LNbits" )
OPTIONS += ( IP2TOR-OFF "Cancel IP2Tor Subscription for LNbits" )
else
OPTIONS += ( IP2TOR-ON "Make Public with IP2Tor Subscription" )
fi
# Change Funding Source options (only if available)
if [ " ${ LNBitsFunding } " = = "lnd" ] && [ " ${ cl } " = = "on" ] ; then
OPTIONS += ( SWITCH-CL "Switch: Use c-lightning as funding source" )
elif [ " ${ LNBitsFunding } " = = "cl" ] && [ " ${ lnd } " = = "on" ] ; then
OPTIONS += ( SWITCH-LND "Switch: Use LND as funding source" )
fi
WIDTH = 66
CHOICE_HEIGHT = $(( " ${# OPTIONS [@] } /2+1 " ))
HEIGHT = $(( CHOICE_HEIGHT+7))
CHOICE = $( dialog --clear \
--title " LNbits - Options" \
--ok-label "Select" \
--cancel-label "Back" \
--menu "Choose one of the following options:" \
$HEIGHT $WIDTH $CHOICE_HEIGHT \
" ${ OPTIONS [@] } " \
2>& 1 >/dev/tty)
case $CHOICE in
IP2TOR-ON)
python /home/admin/config.scripts/blitz.subscriptions.ip2tor.py create-ssh-dialog LNBITS ${ toraddress } 443
exit 0
; ;
IP2TOR-OFF)
clear
python /home/admin/config.scripts/blitz.subscriptions.ip2tor.py subscription-cancel ${ ip2torID }
echo
echo "OK - PRESS ENTER to continue"
read key
exit 0
; ;
HTTPS-ON)
python /home/admin/config.scripts/blitz.subscriptions.letsencrypt.py create-ssh-dialog
exit 0
; ;
SWITCH-CL)
clear
/home/admin/config.scripts/bonus.lnbits.sh switch cl
echo "Restarting LNbits ..."
sudo systemctl restart lnbits
echo
echo "OK new funding source for LNbits active."
echo "PRESS ENTER to continue"
read key
exit 0
; ;
SWITCH-LND)
clear
/home/admin/config.scripts/bonus.lnbits.sh switch lnd
echo "Restarting LNbits ..."
sudo systemctl restart lnbits
echo
echo "OK new funding source for LNbits active."
echo "PRESS ENTER to continue"
read key
exit 0
; ;
*)
clear
exit 0
esac
2020-02-10 12:33:03 +01:00
exit 0
fi
# status
if [ " $1 " = "status" ] ; then
2020-04-23 23:08:14 +02:00
if [ " ${ LNBits } " = "on" ] ; then
2020-02-10 12:33:03 +01:00
echo "installed=1"
2021-08-04 00:18:30 +02:00
localIP = $( hostname -I | awk '{print $1}' )
2020-07-14 20:29:33 +02:00
echo " localIP=' ${ localIP } ' "
2021-04-18 18:04:59 +02:00
echo "httpPort='5000'"
2020-07-14 20:29:33 +02:00
echo "httpsPort='5001'"
2022-05-05 10:59:50 +02:00
echo "httpsForced='1'"
echo "httpsSelfsigned='1'" # TODO: change later if IP2Tor+LetsEncrypt is active
echo "authMethod='none'"
2020-07-14 20:29:33 +02:00
echo " publicIP=' ${ publicIP } ' "
2021-12-16 20:10:03 +01:00
# check funding source
if [ " ${ LNBitsFunding } " = = "" ] ; then
LNBitsFunding = "lnd"
fi
echo " LNBitsFunding=' ${ LNBitsFunding } ' "
2020-07-14 20:29:33 +02:00
# check for LetsEnryptDomain for DynDns
error = ""
source <( sudo /home/admin/config.scripts/blitz.subscriptions.ip2tor.py ip-by-tor $publicIP )
if [ ${# error } -eq 0 ] ; then
echo " publicDomain=' ${ domain } ' "
fi
2020-07-14 20:35:37 +02:00
sslFingerprintIP = $( openssl x509 -in /mnt/hdd/app-data/nginx/tls.cert -fingerprint -noout 2>/dev/null | cut -d"=" -f2)
2020-07-14 20:29:33 +02:00
echo " sslFingerprintIP=' ${ sslFingerprintIP } ' "
toraddress = $( sudo cat /mnt/hdd/tor/lnbits/hostname 2>/dev/null)
echo " toraddress=' ${ toraddress } ' "
2020-07-14 20:35:37 +02:00
sslFingerprintTOR = $( openssl x509 -in /mnt/hdd/app-data/nginx/tor_tls.cert -fingerprint -noout 2>/dev/null | cut -d"=" -f2)
2020-07-14 20:29:33 +02:00
echo " sslFingerprintTOR=' ${ sslFingerprintTOR } ' "
# check for IP2TOR
error = ""
source <( sudo /home/admin/config.scripts/blitz.subscriptions.ip2tor.py ip-by-tor $toraddress )
if [ ${# error } -eq 0 ] ; then
echo " ip2torType=' ${ ip2tor -v1 } ' "
2020-07-14 20:36:04 +02:00
echo " ip2torID=' ${ id } ' "
2020-07-14 20:29:33 +02:00
echo " ip2torIP=' ${ ip } ' "
echo " ip2torPort=' ${ port } ' "
# check for LetsEnryptDomain on IP2TOR
error = ""
source <( sudo /home/admin/config.scripts/blitz.subscriptions.letsencrypt.py domain-by-ip $ip )
if [ ${# error } -eq 0 ] ; then
echo " ip2torDomain=' ${ domain } ' "
2020-09-14 15:29:50 +02:00
domainWarning = $( sudo /home/admin/config.scripts/blitz.subscriptions.letsencrypt.py subscription-detail ${ domain } ${ port } | jq -r ".warning" )
if [ ${# domainWarning } -gt 0 ] ; then
echo " ip2torWarn=' ${ domainWarning } ' "
fi
2020-07-14 20:29:33 +02:00
fi
fi
2020-02-10 12:33:03 +01:00
# check for error
isDead = $( sudo systemctl status lnbits | grep -c 'inactive (dead)' )
if [ ${ isDead } -eq 1 ] ; then
echo "error='Service Failed'"
2022-05-05 10:59:50 +02:00
exit 0
2020-02-10 12:33:03 +01:00
fi
else
echo "installed=0"
fi
exit 0
fi
2021-12-16 20:10:03 +01:00
##########################
# PRESTART
# - will be called as prestart by systemd service (as user lnbits)
#########################
2020-04-22 20:57:32 +02:00
2021-12-16 20:10:03 +01:00
if [ " $1 " = "prestart" ] ; then
# users need to be `lnbits` so that it can be run by systemd as prestart (no SUDO available)
if [ " $USER " != "lnbits" ] ; then
echo "# FAIL: run as user lnbits"
2020-02-10 12:33:03 +01:00
exit 1
fi
2021-12-16 20:10:03 +01:00
# get if its for lnd or cl service
echo "## lnbits.service PRESTART CONFIG"
echo "# --> /home/lnbits/lnbits/.env"
# set values based in funding source in raspiblitz config
LNBitsNetwork = "bitcoin"
LNBitsChain = ""
LNBitsLightning = ""
if [ " ${ LNBitsFunding } " = = "" ] || [ " ${ LNBitsFunding } " = = "lnd" ] ; then
LNBitsFunding = "lnd"
LNBitsLightning = "lnd"
LNBitsChain = "main"
elif [ " ${ LNBitsFunding } " = = "tlnd" ] ; then
LNBitsLightning = "lnd"
LNBitsChain = "test"
elif [ " ${ LNBitsFunding } " = = "slnd" ] ; then
LNBitsLightning = "lnd"
LNBitsChain = "sig"
elif [ " ${ LNBitsFunding } " = = "cl" ] ; then
LNBitsLightning = "cl"
LNBitsChain = "main"
elif [ " ${ LNBitsFunding } " = = "tcl" ] ; then
LNBitsLightning = "cl"
LNBitsChain = "test"
elif [ " ${ LNBitsFunding } " = = "scl" ] ; then
LNBitsLightning = "cl"
LNBitsChain = "sig"
else
echo " # FAIL: Unknown LNBitsFunding= ${ LNBitsFunding } "
exit 1
2020-05-01 11:15:32 +02:00
fi
2021-12-16 20:10:03 +01:00
echo " # LNBitsFunding( ${ LNBitsFunding } ) --> network( ${ LNBitsNetwork } ) chain( ${ LNBitsChain } ) lightning( ${ LNBitsLightning } ) "
2021-04-20 00:26:49 +02:00
2021-12-16 20:10:03 +01:00
# set lnd config
if [ " ${ LNBitsLightning } " = = "lnd" ] ; then
echo "# setting lnd config fresh ..."
# check if lnbits user has read access on lnd data files
checkReadAccess = $( cat /mnt/hdd/app-data/lnd/data/chain/${ LNBitsNetwork } /${ LNBitsChain } net/admin.macaroon | grep -c "lnd" )
if [ " ${ checkReadAccess } " != "1" ] ; then
echo "# FAIL: missing lnd data in '/mnt/hdd/app-data/lnd' or missing access rights for lnbits user"
exit 1
fi
echo "# Updating LND TLS & macaroon data fresh for LNbits config ..."
# set tls.cert path (use | as separator to avoid escaping file path slashes)
sed -i "s|^LND_REST_CERT=.*|LND_REST_CERT=/mnt/hdd/app-data/lnd/tls.cert|g" /home/lnbits/lnbits/.env
# set macaroon path info in .env - USING HEX IMPORT
chmod 600 /home/lnbits/lnbits/.env
macaroonAdminHex = $( xxd -ps -u -c 1000 /mnt/hdd/app-data/lnd/data/chain/${ LNBitsNetwork } /${ LNBitsChain } net/admin.macaroon)
macaroonInvoiceHex = $( xxd -ps -u -c 1000 /mnt/hdd/app-data/lnd/data/chain/${ LNBitsNetwork } /${ LNBitsChain } net/invoice.macaroon)
macaroonReadHex = $( xxd -ps -u -c 1000 /mnt/hdd/app-data/lnd/data/chain/${ LNBitsNetwork } /${ LNBitsChain } net/readonly.macaroon)
sed -i " s/^LND_REST_ADMIN_MACAROON=.*/LND_REST_ADMIN_MACAROON= ${ macaroonAdminHex } /g " /home/lnbits/lnbits/.env
sed -i " s/^LND_REST_INVOICE_MACAROON=.*/LND_REST_INVOICE_MACAROON= ${ macaroonInvoiceHex } /g " /home/lnbits/lnbits/.env
sed -i " s/^LND_REST_READ_MACAROON=.*/LND_REST_READ_MACAROON= ${ macaroonReadHex } /g " /home/lnbits/lnbits/.env
elif [ " ${ LNBitsLightning } " = = "cl" ] ; then
isUsingCL = $( cat /home/lnbits/lnbits/.env | grep -c "LNBITS_BACKEND_WALLET_CLASS=CLightningWallet" )
if [ " ${ isUsingCL } " != "1" ] ; then
echo "# FAIL: /home/lnbits/lnbits/.env not set to c-lightning"
exit 1
fi
echo " # everything looks OK for lnbits config on c-lightning on ${ LNBitsChain } net "
else
echo " # FAIL: missing or not supported LNBitsLightning= ${ LNBitsLightning } "
exit 1
fi
echo "# OK: prestart finished"
exit 0 # exit with clean code
2020-02-10 12:33:03 +01:00
fi
2020-10-14 23:25:39 +02:00
if [ " $1 " = "repo" ] ; then
# get github parameters
githubUser = " $2 "
if [ ${# githubUser } -eq 0 ] ; then
echo "echo='missing parameter'"
exit 1
fi
githubBranch = " $3 "
if [ ${# githubBranch } -eq 0 ] ; then
githubBranch = "master"
fi
# check if repo exists
2021-12-16 20:10:03 +01:00
#githubRepo="https://github.com/${githubUser}/lnbits"
githubRepo = " https://github.com/ ${ githubUser } /lnbits-legend "
2020-10-14 23:25:39 +02:00
httpcode = $( curl -s -o /dev/null -w "%{http_code}" ${ githubRepo } )
if [ " ${ httpcode } " != "200" ] ; then
echo " # tested github repo: ${ githubRepo } "
echo "error='repo for user does not exist'"
exit 1
fi
# change origin repo of lnbits code
echo " # changing LNbits github repo( ${ githubUser } ) branch( ${ githubBranch } ) "
cd /home/lnbits/lnbits
sudo git remote remove origin
sudo git remote add origin ${ githubRepo }
sudo git fetch
sudo git checkout ${ githubBranch }
sudo git branch --set-upstream-to= origin/${ githubBranch } ${ githubBranch }
fi
if [ " $1 " = "sync" ] || [ " $1 " = "repo" ] ; then
echo "# pull all changes from github repo"
# output basic info
cd /home/lnbits/lnbits
sudo git remote -v
sudo git branch -v
# pull latest code
sudo git pull
# restart lnbits service
sudo systemctl restart lnbits
echo "# server is restarting ... maybe takes some seconds until available"
exit 0
fi
2020-02-10 12:33:03 +01:00
# stop service
sudo systemctl stop lnbits 2>/dev/null
2021-12-16 20:10:03 +01:00
# install
2020-02-10 12:33:03 +01:00
if [ " $1 " = "1" ] || [ " $1 " = "on" ] ; then
2021-12-16 20:10:03 +01:00
# check if already installed
2020-02-10 12:33:03 +01:00
isInstalled = $( sudo ls /etc/systemd/system/lnbits.service 2>/dev/null | grep -c 'lnbits.service' )
2021-12-16 20:10:03 +01:00
if [ " ${ isInstalled } " = = "1" ] ; then
echo "# FAIL: already installed"
exit 1
fi
2020-02-10 12:33:03 +01:00
2021-12-16 20:10:03 +01:00
# get funding source and check that its available
fundingsource = " $2 "
2020-04-28 09:27:03 +01:00
2022-05-05 10:59:50 +02:00
# run with default funding source if not given as parameter
if [ " ${ fundingsource } " = = "" ] ; then
echo " # running with default lightning as funing source: ${ lightning } "
fundingsource = " ${ lightning } "
fi
2021-12-16 20:10:03 +01:00
if [ " ${ fundingsource } " = = "lnd" ] ; then
if [ " ${ lnd } " != "on" ] ; then
2022-01-11 14:55:06 +00:00
echo "# FAIL: lnd mainnet needs to be activated"
2021-12-16 20:10:03 +01:00
exit 1
fi
2020-10-14 23:25:39 +02:00
2021-12-16 20:10:03 +01:00
elif [ " ${ fundingsource } " = = "tlnd" ] ; then
if [ " ${ tlnd } " != "on" ] ; then
2022-01-11 14:55:06 +00:00
echo "# FAIL: lnd testnet needs to be activated"
2021-12-16 20:10:03 +01:00
exit 1
2020-10-14 23:25:39 +02:00
fi
2021-12-16 20:10:03 +01:00
elif [ " ${ fundingsource } " = = "slnd" ] ; then
if [ " ${ slnd } " != "on" ] ; then
2022-01-11 14:55:06 +00:00
echo "# FAIL: lnd signet needs to be activated"
2021-12-16 20:10:03 +01:00
exit 1
2020-10-14 23:25:39 +02:00
fi
2020-02-10 12:33:03 +01:00
2021-12-16 20:10:03 +01:00
elif [ " ${ fundingsource } " = = "cl" ] ; then
if [ " ${ cl } " != "on" ] ; then
2022-01-11 14:55:06 +00:00
echo "# FAIL: c-lightning mainnet needs to be activated"
2021-12-16 20:10:03 +01:00
exit 1
fi
2020-02-10 21:07:24 +01:00
2021-12-16 20:10:03 +01:00
elif [ " ${ fundingsource } " = = "tcl" ] ; then
if [ " ${ tcl } " != "on" ] ; then
2022-01-11 14:55:06 +00:00
echo "# FAIL: c-lightning testnet needs to be activated"
2021-12-16 20:10:03 +01:00
exit 1
fi
2020-02-10 12:33:03 +01:00
2021-12-16 20:10:03 +01:00
elif [ " ${ fundingsource } " = = "scl" ] ; then
if [ " ${ scl } " != "on" ] ; then
2022-01-11 14:55:06 +00:00
echo "# FAIL: c-lightning signet needs to be activated"
2021-12-16 20:10:03 +01:00
exit 1
fi
2020-10-14 23:25:39 +02:00
2021-12-16 20:10:03 +01:00
else
2022-01-11 14:55:06 +00:00
echo "# FAIL: invalid funding source parameter"
2021-12-16 20:10:03 +01:00
exit 1
fi
2020-10-14 23:25:39 +02:00
2021-12-16 20:10:03 +01:00
# add lnbits user
echo "*** Add the 'lnbits' user ***"
2022-02-06 19:56:56 +00:00
sudo adduser --disabled-password --gecos "" lnbits
2020-07-22 21:20:34 +02:00
2021-12-16 20:10:03 +01:00
# get optional github parameter
githubUser = "lnbits"
if [ " $3 " != "" ] ; then
githubUser = " $3 "
fi
2022-02-10 15:46:12 +00:00
# https://github.com/lnbits/lnbits-legend/releases
2022-07-28 15:04:32 +02:00
tag = "0.9.0"
2021-12-16 20:10:03 +01:00
if [ " $4 " != "" ] ; then
2022-02-10 15:46:12 +00:00
tag = " $4 "
2021-12-16 20:10:03 +01:00
fi
# install from GitHub
2022-02-10 15:46:12 +00:00
echo " # get the github code user( ${ githubUser } ) branch( ${ tag } ) "
2021-12-16 20:10:03 +01:00
sudo rm -r /home/lnbits/lnbits 2>/dev/null
cd /home/lnbits
sudo -u lnbits git clone https://github.com/${ githubUser } /lnbits-legend lnbits
cd /home/lnbits/lnbits
2022-05-17 21:53:05 +02:00
sudo -u lnbits git checkout ${ tag } || exit 1
2020-10-14 23:25:39 +02:00
2021-12-16 20:10:03 +01:00
# prepare .env file
echo "# preparing env file"
sudo rm /home/lnbits/lnbits/.env 2>/dev/null
sudo -u lnbits touch /home/lnbits/lnbits/.env
sudo bash -c "echo 'LNBITS_FORCE_HTTPS=0' >> /home/lnbits/lnbits/.env"
# set database path to HDD data so that its survives updates and migrations
sudo mkdir /mnt/hdd/app-data/LNBits 2>/dev/null
sudo chown lnbits:lnbits -R /mnt/hdd/app-data/LNBits
sudo bash -c "echo 'LNBITS_DATA_FOLDER=/mnt/hdd/app-data/LNBits' >> /home/lnbits/lnbits/.env"
# let switch command part do the detail config
/home/admin/config.scripts/bonus.lnbits.sh switch ${ fundingsource }
# to the install
echo "# installing application dependencies"
cd /home/lnbits/lnbits
# do install like this
sudo -u lnbits python3 -m venv venv
sudo -u lnbits ./venv/bin/pip install -r requirements.txt
sudo -u lnbits ./venv/bin/pip install pylightning
2022-01-31 22:36:40 +00:00
sudo -u lnbits ./venv/bin/pip install secp256k1
2021-12-16 20:10:03 +01:00
2022-07-28 15:04:32 +02:00
# build
./venv/bin/python build.py
2021-12-16 20:10:03 +01:00
# open firewall
echo
echo "*** Updating Firewall ***"
sudo ufw allow 5000 comment 'lnbits HTTP'
sudo ufw allow 5001 comment 'lnbits HTTPS'
echo ""
2020-02-10 12:33:03 +01:00
# install service
2020-02-10 14:29:28 +01:00
echo "*** Install systemd ***"
2020-05-23 22:17:00 +01:00
cat <<EOF | sudo tee /etc/systemd/system/lnbits.service >/dev/null
2020-02-10 18:16:55 +01:00
# systemd unit for lnbits
2020-02-10 12:33:03 +01:00
[ Unit]
Description = lnbits
2021-09-26 10:30:09 +01:00
Wants = bitcoind.service
After = bitcoind.service
2020-02-10 12:33:03 +01:00
[ Service]
2020-04-28 09:27:03 +01:00
WorkingDirectory = /home/lnbits/lnbits
2021-12-16 20:10:03 +01:00
ExecStartPre = /home/admin/config.scripts/bonus.lnbits.sh prestart
2021-12-23 14:03:46 +01:00
ExecStart = /bin/sh -c 'cd /home/lnbits/lnbits && ./venv/bin/uvicorn lnbits.__main__:app --port 5000'
2020-04-28 09:27:03 +01:00
User = lnbits
2020-02-10 12:33:03 +01:00
Restart = always
TimeoutSec = 120
RestartSec = 30
2021-12-16 20:10:03 +01:00
StandardOutput = journal
2020-02-10 12:33:03 +01:00
StandardError = journal
2020-02-10 18:40:53 +01:00
2021-08-04 00:18:30 +02:00
# Hardening measures
PrivateTmp = true
ProtectSystem = full
NoNewPrivileges = true
PrivateDevices = true
2020-02-10 18:40:53 +01:00
[ Install]
WantedBy = multi-user.target
2020-02-10 12:33:03 +01:00
EOF
sudo systemctl enable lnbits
2020-07-19 17:56:00 +02:00
2021-12-14 23:34:35 +01:00
source <( /home/admin/_cache.sh get state)
2020-07-19 17:56:00 +02:00
if [ " ${ state } " = = "ready" ] ; then
2020-07-19 17:56:39 +02:00
echo "# OK - lnbits service is enabled, system is on ready so starting lnbits service"
2020-07-19 17:56:00 +02:00
sudo systemctl start lnbits
else
echo "# OK - lnbits service is enabled, but needs reboot or manual starting: sudo systemctl start lnbits"
fi
2020-02-10 12:33:03 +01:00
2020-05-23 22:34:03 +01:00
# setup nginx symlinks
2020-05-26 21:34:19 +02:00
if ! [ -f /etc/nginx/sites-available/lnbits_ssl.conf ] ; then
sudo cp /home/admin/assets/nginx/sites-available/lnbits_ssl.conf /etc/nginx/sites-available/lnbits_ssl.conf
fi
if ! [ -f /etc/nginx/sites-available/lnbits_tor.conf ] ; then
sudo cp /home/admin/assets/nginx/sites-available/lnbits_tor.conf /etc/nginx/sites-available/lnbits_tor.conf
fi
if ! [ -f /etc/nginx/sites-available/lnbits_tor_ssl.conf ] ; then
sudo cp /home/admin/assets/nginx/sites-available/lnbits_tor_ssl.conf /etc/nginx/sites-available/lnbits_tor_ssl.conf
fi
sudo ln -sf /etc/nginx/sites-available/lnbits_ssl.conf /etc/nginx/sites-enabled/
sudo ln -sf /etc/nginx/sites-available/lnbits_tor.conf /etc/nginx/sites-enabled/
sudo ln -sf /etc/nginx/sites-available/lnbits_tor_ssl.conf /etc/nginx/sites-enabled/
2020-05-23 22:34:03 +01:00
sudo nginx -t
sudo systemctl reload nginx
2020-02-10 12:33:03 +01:00
# setting value in raspi blitz config
2021-12-14 23:34:35 +01:00
/home/admin/config.scripts/blitz.conf.sh set LNBits "on"
2020-04-22 20:57:32 +02:00
2020-02-10 14:29:28 +01:00
# Hidden Service if Tor is active
2020-02-10 12:33:03 +01:00
source /mnt/hdd/raspiblitz.conf
if [ " ${ runBehindTor } " = "on" ] ; then
2021-12-14 23:34:35 +01:00
# make sure to keep in sync with tor.network.sh script
/home/admin/config.scripts/tor.onion-service.sh lnbits 80 5002 443 5003
2020-02-10 12:33:03 +01:00
fi
2021-12-16 20:10:03 +01:00
echo "# OK install done ... might need to restart or call: sudo systemctl start lnbits"
2022-05-05 10:59:50 +02:00
# needed for API/WebUI as signal that install ran thru
echo "result='OK'"
2021-12-16 20:10:03 +01:00
exit 0
fi
# config for a special funding source (e.g lnd or c-lightning as backend)
if [ " $1 " = "switch" ] ; then
echo " ## bonus.lnbits.sh switch $2 "
# get funding source and check that its available
fundingsource = " $2 "
clrpcsubdir = ""
if [ " ${ fundingsource } " = = "lnd" ] ; then
if [ " ${ lnd } " != "on" ] ; then
echo "#FAIL: lnd mainnet not installed or running"
exit 1
fi
elif [ " ${ fundingsource } " = = "tlnd" ] ; then
if [ " ${ tlnd } " != "on" ] ; then
echo "# FAIL: lnd testnet not installed or running"
exit 1
fi
elif [ " ${ fundingsource } " = = "slnd" ] ; then
if [ " ${ slnd } " != "on" ] ; then
echo "# FAIL: lnd signet not installed or running"
exit 1
fi
elif [ " ${ fundingsource } " = = "cl" ] ; then
if [ " ${ cl } " != "on" ] ; then
echo "# FAIL: c-lightning mainnet not installed or running"
exit 1
fi
elif [ " ${ fundingsource } " = = "tcl" ] ; then
clrpcsubdir = "/testnet"
if [ " ${ tcl } " != "on" ] ; then
echo "# FAIL: c-lightning testnet not installed or running"
exit 1
fi
elif [ " ${ fundingsource } " = = "scl" ] ; then
clrpcsubdir = "/signet"
if [ " ${ scl } " != "on" ] ; then
echo "# FAIL: c-lightning signet not installed or running"
exit 1
fi
else
echo "# FAIL: unvalid fundig source parameter"
exit 1
fi
echo "##############"
echo "# NOTE: If you switch the funding source of a running LNbits instance all sub account will keep balance."
echo "# Make sure that the new funding source has enough sats to cover the LNbits bookeeping of sub accounts."
echo "##############"
# remove all old possible settings for former funding source (clean state)
sudo sed -i "/^LNBITS_BACKEND_WALLET_CLASS=/d" /home/lnbits/lnbits/.env 2>/dev/null
sudo sed -i "/^LND_REST_ENDPOINT=/d" /home/lnbits/lnbits/.env 2>/dev/null
sudo sed -i "/^LND_REST_CERT=/d" /home/lnbits/lnbits/.env 2>/dev/null
sudo sed -i "/^LND_REST_ADMIN_MACAROON=/d" /home/lnbits/lnbits/.env 2>/dev/null
sudo sed -i "/^LND_REST_INVOICE_MACAROON=/d" /home/lnbits/lnbits/.env 2>/dev/null
sudo sed -i "/^LND_REST_READ_MACAROON=/d" /home/lnbits/lnbits/.env 2>/dev/null
sudo /usr/sbin/usermod -G lnbits lnbits
sudo sed -i "/^CLIGHTNING_RPC=/d" /home/lnbits/lnbits/.env 2>/dev/null
# LND CONFIG
if [ " ${ fundingsource } " = = "lnd" ] || [ " ${ fundingsource } " = = "tlnd" ] || [ " ${ fundingsource } " = = "slnd" ] ; then
# make sure lnbits user can access LND credentials
echo "# adding lnbits user is member of lndreadonly, lndinvoice, lndadmin"
sudo /usr/sbin/usermod --append --groups lndinvoice lnbits
sudo /usr/sbin/usermod --append --groups lndreadonly lnbits
sudo /usr/sbin/usermod --append --groups lndadmin lnbits
# prepare config entries in lnbits config for lnd
echo "# preparing lnbits config for lnd"
sudo bash -c "echo 'LNBITS_BACKEND_WALLET_CLASS=LndRestWallet' >> /home/lnbits/lnbits/.env"
sudo bash -c "echo 'LND_REST_ENDPOINT=https://127.0.0.1:8080' >> /home/lnbits/lnbits/.env"
sudo bash -c "echo 'LND_REST_CERT=' >> /home/lnbits/lnbits/.env"
sudo bash -c "echo 'LND_REST_ADMIN_MACAROON=' >> /home/lnbits/lnbits/.env"
sudo bash -c "echo 'LND_REST_INVOICE_MACAROON=' >> /home/lnbits/lnbits/.env"
sudo bash -c "echo 'LND_REST_READ_MACAROON=' >> /home/lnbits/lnbits/.env"
fi
if [ " ${ fundingsource } " = = "cl" ] || [ " ${ fundingsource } " = = "tcl" ] || [ " ${ fundingsource } " = = "scl" ] ; then
2022-02-09 19:12:59 +00:00
echo "# add the 'lnbits' user to the 'bitcoin' group"
sudo /usr/sbin/usermod --append --groups bitcoin lnbits
echo "# check user"
id lnbits
2021-12-16 20:10:03 +01:00
echo "# allowing lnbits user as part of the bitcoin group to RW RPC hook"
sudo chmod 770 /home/bitcoin/.lightning/bitcoin${ clrpcsubdir }
sudo chmod 660 /home/bitcoin/.lightning/bitcoin${ clrpcsubdir } /lightning-rpc
2022-03-06 13:31:51 +00:00
if [ " ${ fundingsource } " = = "cl" ] ; then
CLCONF = "/home/bitcoin/.lightning/config"
else
CLCONF = " /home/bitcoin/.lightning ${ clrpcsubdir } /config "
fi
# https://github.com/rootzoll/raspiblitz/issues/3007
if [ " $( sudo cat ${ CLCONF } | grep -c "^rpc-file-mode=0660" ) " -eq 0 ] ; then
echo "rpc-file-mode=0660" | sudo tee -a ${ CLCONF }
fi
2021-12-16 20:10:03 +01:00
echo "# preparing lnbits config for c-lightning"
sudo bash -c "echo 'LNBITS_BACKEND_WALLET_CLASS=CLightningWallet' >> /home/lnbits/lnbits/.env"
sudo bash -c " echo 'CLIGHTNING_RPC=/home/bitcoin/.lightning/bitcoin ${ clrpcsubdir } /lightning-rpc' >> /home/lnbits/lnbits/.env "
fi
# set raspiblitz config value for funding
2021-12-18 00:38:49 +01:00
/home/admin/config.scripts/blitz.conf.sh set LNBitsFunding " ${ fundingsource } "
2021-12-16 20:10:03 +01:00
echo "##############"
2022-03-06 13:31:51 +00:00
echo "# OK new funding source set - does need restart or call: sudo systemctl restart lnbits"
2021-12-16 20:10:03 +01:00
echo "##############"
2020-02-10 12:33:03 +01:00
exit 0
fi
# switch off
if [ " $1 " = "0" ] || [ " $1 " = "off" ] ; then
2020-07-24 02:00:47 +02:00
# check for second parameter: should data be deleted?
deleteData = 0
if [ " $2 " = "--delete-data" ] ; then
deleteData = 1
elif [ " $2 " = "--keep-data" ] ; then
deleteData = 0
else
2020-10-14 23:25:39 +02:00
if ( whiptail --title " DELETE DATA? " --yesno "Do you want to delete\nthe LNbits Server Data?" 8 30) ; then
2020-07-24 02:00:47 +02:00
deleteData = 1
else
deleteData = 0
fi
fi
echo " # deleteData( ${ deleteData } ) "
2022-01-31 10:24:54 +00:00
echo "*** REMOVING LNbits ***"
2020-07-24 02:00:47 +02:00
2022-01-31 10:24:54 +00:00
isInstalled = $( sudo ls /etc/systemd/system/lnbits.service 2>/dev/null | grep -c 'lnbits.service' )
if [ ${ isInstalled } -eq 1 ] || [ " ${ LNBits } " = = "on" ] ; then
sudo systemctl stop lnbits
sudo systemctl disable lnbits
sudo rm /etc/systemd/system/lnbits.service
echo "OK lnbits.service removed."
else
echo "lnbits.service is not installed."
fi
2020-02-10 12:33:03 +01:00
2020-05-23 22:34:03 +01:00
# remove nginx symlinks
2020-06-11 16:29:30 +01:00
sudo rm -f /etc/nginx/sites-enabled/lnbits_ssl.conf
sudo rm -f /etc/nginx/sites-enabled/lnbits_tor.conf
sudo rm -f /etc/nginx/sites-enabled/lnbits_tor_ssl.conf
2020-06-26 22:57:12 +02:00
sudo rm -f /etc/nginx/sites-available/lnbits_ssl.conf
sudo rm -f /etc/nginx/sites-available/lnbits_tor.conf
sudo rm -f /etc/nginx/sites-available/lnbits_tor_ssl.conf
2020-05-23 22:34:03 +01:00
sudo nginx -t
sudo systemctl reload nginx
2020-07-12 20:05:41 +02:00
# Hidden Service if Tor is active
if [ " ${ runBehindTor } " = "on" ] ; then
2021-12-14 23:34:35 +01:00
/home/admin/config.scripts/tor.onion-service.sh off lnbits
2020-07-12 20:05:41 +02:00
fi
2022-01-31 10:24:54 +00:00
# always clean
sudo userdel -rf lnbits
2020-07-24 02:00:47 +02:00
2022-01-31 10:24:54 +00:00
if [ ${ deleteData } -eq 1 ] ; then
echo "# deleting data"
sudo rm -R /mnt/hdd/app-data/LNBits
2020-04-22 20:57:32 +02:00
else
2022-01-31 10:24:54 +00:00
echo "# keeping data"
2020-02-10 12:33:03 +01:00
fi
2022-01-31 10:24:54 +00:00
# setting value in raspi blitz config
/home/admin/config.scripts/blitz.conf.sh set LNBits "off"
2022-05-05 10:59:50 +02:00
# needed for API/WebUI as signal that install ran thru
echo "result='OK'"
2020-02-10 12:33:03 +01:00
exit 0
fi
echo " FAIL - Unknown Parameter $1 "
exit 1