raspiblitz/home.admin/config.scripts/bonus.electrs.sh

491 lines
15 KiB
Bash
Raw Normal View History

2019-12-04 08:13:21 +00:00
#!/bin/bash
# https://github.com/romanz/electrs/blob/master/doc/usage.md
# command info
if [ $# -eq 0 ] || [ "$1" = "-h" ] || [ "$1" = "-help" ]; then
2019-12-24 10:23:49 +01:00
echo "config script to switch the Electrum Rust Server on or off"
2020-01-26 20:33:05 +01:00
echo "bonus.electrs.sh [on|off|status|menu]"
2019-12-04 08:13:21 +00:00
exit 1
fi
source /mnt/hdd/raspiblitz.conf
2019-12-18 12:25:51 +01:00
# give status
if [ "$1" = "status" ]; then
echo "##### STATUS ELECTRS SERVICE"
if [ "${ElectRS}" = "on" ]; then
echo "configured=1"
else
echo "configured=0"
fi
serviceInstalled=$(sudo systemctl status electrs --no-page 2>/dev/null | grep -c "electrs.service - Electrs")
echo "serviceInstalled=${serviceInstalled}"
2019-12-18 13:07:55 +01:00
if [ ${serviceInstalled} -eq 0 ]; then
echo "infoSync='Service not installed'"
fi
2019-12-18 12:25:51 +01:00
serviceRunning=$(sudo systemctl status electrs --no-page 2>/dev/null | grep -c "active (running)")
echo "serviceRunning=${serviceRunning}"
2019-12-18 13:07:55 +01:00
if [ ${serviceRunning} -eq 0 ]; then
2019-12-18 13:10:13 +01:00
echo "infoSync='Not running - check: sudo journalctl -u electrs'"
2019-12-18 13:07:55 +01:00
fi
2019-12-18 12:25:51 +01:00
if [ ${serviceRunning} -eq 1 ]; then
2020-01-26 18:29:24 +01:00
2019-12-18 12:25:51 +01:00
# Experimental try to get sync Info
syncedToBlock=$(sudo journalctl -u electrs --no-pager -n100 | grep "new headers from height" | tail -n 1 | cut -d " " -f 16 | sed 's/[^0-9]*//g')
2019-12-18 12:38:03 +01:00
blockchainHeight=$(sudo -u bitcoin ${network}-cli getblockchaininfo 2>/dev/null | jq -r '.headers' | sed 's/[^0-9]*//g')
lastBlockchainHeight=$(($blockchainHeight -1))
if [ "${syncedToBlock}" = "${blockchainHeight}" ] || [ "${syncedToBlock}" = "${lastBlockchainHeight}" ]; then
2019-12-18 12:25:51 +01:00
echo "isSynced=1"
else
echo "isSynced=0"
2020-01-26 18:11:31 +01:00
echo "infoSync='Syncing / Building Index (please wait)'"
2019-12-18 12:25:51 +01:00
fi
2020-01-26 18:29:24 +01:00
# check local IPv4 port
localIP=$(ip addr | grep 'state UP' -A2 | tail -n1 | awk '{print $2}' | cut -f1 -d'/')
echo "localIP='${localIP}'"
echo "publicIP='${publicIP}'"
2020-01-26 18:42:47 +01:00
echo "portTCP='50001'"
2020-01-28 14:31:12 +01:00
localPortRunning=$(sudo netstat -a | grep -c '0.0.0.0:50001')
2020-01-26 18:42:47 +01:00
echo "localTCPPortActive=${localPortRunning}"
2020-01-26 18:29:24 +01:00
publicPortRunning=$(nc -z -w6 ${publicIP} 50001 2>/dev/null; echo $?)
if [ "${publicPortRunning}" == "0" ]; then
# OK looks good - but just means that something is answering on that port
2020-01-26 18:42:47 +01:00
echo "publicTCPPortAnswering=1"
2020-01-26 18:29:24 +01:00
else
# no answer on that port
2020-01-26 18:42:47 +01:00
echo "publicTCPPortAnswering=0"
2020-01-26 18:29:24 +01:00
fi
2020-01-28 14:37:55 +01:00
echo "portHTTP='50002'"
2020-01-28 14:31:12 +01:00
localPortRunning=$(sudo netstat -a | grep -c '0.0.0.0:50002')
2020-01-28 14:37:55 +01:00
echo "localHTTPPortActive=${localPortRunning}"
2020-01-26 18:42:47 +01:00
publicPortRunning=$(nc -z -w6 ${publicIP} 50002 2>/dev/null; echo $?)
if [ "${publicPortRunning}" == "0" ]; then
# OK looks good - but just means that something is answering on that port
2020-01-28 14:37:55 +01:00
echo "publicHTTPPortAnswering=1"
2020-01-26 18:42:47 +01:00
else
# no answer on that port
2020-01-28 14:37:55 +01:00
echo "publicHTTPPortAnswering=0"
2020-01-26 18:42:47 +01:00
fi
2020-01-26 22:12:46 +01:00
# add TOR info
if [ "${runBehindTor}" == "on" ]; then
echo "TORrunning=1"
TORaddress=$(sudo cat /mnt/hdd/tor/electrs/hostname)
echo "TORaddress='${TORaddress}'"
else
echo "TORrunning=0"
fi
# check Nginx
nginxTest=$(sudo nginx -t 2>&1 | grep -c "test is successful")
echo "nginxTest=$nginxTest"
2020-01-26 18:29:24 +01:00
2019-12-18 12:25:51 +01:00
else
echo "isSynced=0"
fi
exit 0
fi
2020-01-26 20:33:05 +01:00
if [ "$1" = "menu" ]; then
# get status
2020-01-26 22:13:47 +01:00
echo "# collecting status info ... (please wait)"
2020-01-26 20:33:05 +01:00
source <(sudo /home/admin/config.scripts/bonus.electrs.sh status)
if [ ${serviceInstalled} -eq 0 ]; then
echo "# FAIL not installed"
exit 1
fi
if [ ${serviceRunning} -eq 0 ]; then
dialog --title "Electrum Service Not Running" --msgbox "
The electrum system service is not running.
Please check the following debug info.
" 8 48
/home/admin/XXdebugInfo.sh
echo "Press ENTER to get back to main menu."
read key
exit 0
fi
if [ ${isSynced} -eq 0 ]; then
dialog --title "Electrum Index Not Ready" --msgbox "
Electrum server is still building its index.
Please wait and try again later.
This can take multiple hours.
" 9 48
exit 0
fi
if [ ${nginxTest} -eq 0 ]; then
dialog --title "Testing nginx.conf has failed" --msgbox "
Nginx is in a failed state. Will attempt to fix.
Try connecting via port 50002 or Tor again once finished.
Check 'sudo nginx -t' for a detailed error message.
" 9 61
logFileMissing=$(sudo nginx -t 2>&1 | grep -c "/var/log/nginx/access.log")
if [ ${logFileMissing} -eq 1 ]; then
sudo mkdir /var/log/nginx
sudo systemctl restart nginx
fi
/home/admin/config.scripts/internet.selfsignedcert.sh
echo "Press ENTER to get back to main menu."
read key
exit 0
fi
2020-01-26 20:33:05 +01:00
# Options (available without TOR)
OPTIONS=( \
CONNECT "How to Connect" \
INDEX "Delete&Rebuild Index" \
2020-01-26 21:52:00 +01:00
STATUS "ElectRS Status Info"
2020-01-26 20:33:05 +01:00
)
2020-01-26 22:15:07 +01:00
CHOICE=$(whiptail --clear --title "Electrum Rust Server" --menu "menu" 10 50 4 "${OPTIONS[@]}" 2>&1 >/dev/tty)
2020-01-26 20:33:05 +01:00
clear
case $CHOICE in
CONNECT)
echo "######## How to Connect to Electrum Rust Server #######"
2020-01-26 21:52:00 +01:00
echo
echo "Install the Electrum Wallet App on your laptop from:"
echo "https://electrum.org"
echo
echo "On Network Settings > Server menu:"
echo "- deactivate automatic server selection"
2020-01-28 14:37:55 +01:00
echo "- as manual server set '${localIP}' & '${portHTTP}'"
2020-01-26 21:52:00 +01:00
echo "- laptop and RaspiBlitz need to be within same local network"
2020-01-26 22:12:46 +01:00
echo
echo "To start directly from laptop terminal use:"
2020-01-28 14:37:55 +01:00
echo "electrum --oneserver --server ${localIP}:${portHTTP}:s"
2020-01-26 22:12:46 +01:00
if [ ${TORrunning} -eq 1 ]; then
echo ""
echo "The Tor Hidden Service address for electrs is (see LCD for QR code):"
2020-01-26 22:12:46 +01:00
echo "${TORaddress}"
2020-01-27 06:44:10 +01:00
echo
2020-01-26 22:12:46 +01:00
echo "To connect through TOR open the Tor Browser and start with the options:"
echo "electrum --oneserver --server${TORaddress}:50002:s --proxy socks5:127.0.0.1:9150"
2020-01-26 22:17:22 +01:00
/home/admin/config.scripts/blitz.lcd.sh qr "${TORaddress}"
2020-01-26 22:12:46 +01:00
fi
2020-01-26 21:52:00 +01:00
echo
echo "For more details check the RaspiBlitz README on ElectRS:"
echo "https://github.com/rootzoll/raspiblitz"
echo
echo "Press ENTER to get back to main menu."
2020-01-26 20:33:05 +01:00
read key
2020-01-26 22:18:30 +01:00
/home/admin/config.scripts/blitz.lcd.sh hide
2020-01-26 20:33:05 +01:00
;;
STATUS)
sudo /home/admin/config.scripts/bonus.electrs.sh status
echo
echo "Press ENTER to get back to main menu."
read key
;;
INDEX)
echo "######## Delete/Rebuild Index ########"
echo "# stopping service"
sudo systemctl stop electrs
echo "# deleting index"
sudo rm -r /mnt/hdd/app-storage/electrs/db
echo "# starting service"
sudo systemctl start electrs
echo "# ok"
echo
echo "Press ENTER to get back to main menu."
2020-01-26 20:33:05 +01:00
read key
;;
esac
exit 0
fi
2019-12-18 12:27:42 +01:00
# add default value to raspi config if needed
if ! grep -Eq "^ElectRS=" /mnt/hdd/raspiblitz.conf; then
2019-12-18 12:27:42 +01:00
echo "ElectRS=off" >> /mnt/hdd/raspiblitz.conf
fi
# stop service
echo "making sure services are not running"
sudo systemctl stop electrs 2>/dev/null
2019-12-04 08:13:21 +00:00
# switch on
if [ "$1" = "1" ] || [ "$1" = "on" ]; then
echo "*** INSTALL ELECTRS ***"
isInstalled=$(sudo ls /etc/systemd/system/electrs.service 2>/dev/null | grep -c 'electrs.service')
if [ ${isInstalled} -eq 0 ]; then
#cleanup
sudo rm -f /home/electrs/.electrs/config.toml
echo ""
echo "***"
echo "Creating the electrs user"
echo "***"
echo ""
sudo adduser --disabled-password --gecos "" electrs
cd /home/electrs
echo ""
echo "***"
echo "Installing Rust"
echo "***"
echo ""
sudo -u electrs curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sudo -u electrs sh -s -- --default-toolchain 1.39.0 -y
# check Rust version with: $ sudo -u electrs /home/electrs/.cargo/bin/cargo --version
# workaround to keep Rust at v1.37.0
# sudo -u electrs /home/electrs/.cargo/bin/rustup install 1.37.0 --force
# sudo -u electrs /home/electrs/.cargo/bin/rustup override set 1.37.0
#source $HOME/.cargo/env
sudo apt update
sudo apt install -y clang cmake # for building 'rust-rocksdb'
echo ""
echo "***"
echo "Downloading and building electrs. This will take ~30 minutes" # ~22 min on an Odroid XU4
echo "***"
echo ""
sudo -u electrs git clone https://github.com/romanz/electrs
cd /home/electrs/electrs
sudo -u electrs git reset --hard v0.8.3
2019-12-04 08:13:21 +00:00
sudo -u electrs /home/electrs/.cargo/bin/cargo build --release
echo ""
echo "***"
2019-12-17 14:05:20 +01:00
echo "The electrs database will be built in /mnt/hdd/app-storage/electrs/db. Takes ~18 hours and ~50Gb diskspace"
2019-12-04 08:13:21 +00:00
echo "***"
echo ""
2019-12-24 10:23:49 +01:00
# move old-database if present
if [ -d "/mnt/hdd/electrs/db" ]; then
echo "Moving existing ElectRS index to /mnt/hdd/app-storage/electrs..."
sudo mv -f /mnt/hdd/electrs /mnt/hdd/app-storage/
fi
2019-12-17 14:05:20 +01:00
sudo mkdir /mnt/hdd/app-storage/electrs 2>/dev/null
sudo chown -R electrs:electrs /mnt/hdd/app-storage/electrs
2019-12-04 08:13:21 +00:00
echo ""
echo "***"
echo "getting RPC credentials from the bitcoin.conf"
echo "***"
echo ""
#echo "Type the PASSWORD B of your RaspiBlitz followed by [ENTER] (needed for Electrs to access the bitcoind RPC):"
#read PASSWORD_B
RPC_USER=$(sudo cat /mnt/hdd/bitcoin/bitcoin.conf | grep rpcuser | cut -c 9-)
PASSWORD_B=$(sudo cat /mnt/hdd/bitcoin/bitcoin.conf | grep rpcpassword | cut -c 13-)
echo "Done"
echo ""
echo "***"
echo "generating electrs.toml setting file with the RPC passwords"
echo "***"
echo ""
# generate setting file: https://github.com/romanz/electrs/issues/170#issuecomment-530080134
# https://github.com/romanz/electrs/blob/master/doc/usage.md#configuration-files-and-environment-variables
sudo -u electrs mkdir /home/electrs/.electrs 2>/dev/null
touch /home/admin/config.toml
chmod 600 /home/admin/config.toml || exit 1
cat > /home/admin/config.toml <<EOF
verbose = 4
timestamp = true
jsonrpc_import = true
2019-12-17 14:05:20 +01:00
db_dir = "/mnt/hdd/app-storage/electrs/db"
2019-12-04 08:13:21 +00:00
cookie = "$RPC_USER:$PASSWORD_B"
# allow BTC-RPC-explorer show tx-s for addresses with a history of more than 100
txid_limit = 0
2019-12-04 08:13:21 +00:00
EOF
sudo mv /home/admin/config.toml /home/electrs/.electrs/config.toml
sudo chown electrs:electrs /home/electrs/.electrs/config.toml
echo ""
echo "***"
echo "Open port 50001 on UFW "
echo "***"
echo ""
sudo ufw allow 50001 comment 'electrs TCP'
echo ""
echo "***"
echo "Checking for config.toml"
echo "***"
echo ""
if [ ! -f "/home/electrs/.electrs/config.toml" ]
then
echo "Failed to create config.toml"
exit 1
else
echo "OK"
fi
# create a self-signed ssl certificate
/home/admin/config.scripts/internet.selfsignedcert.sh
2019-12-04 08:13:21 +00:00
echo ""
echo "***"
echo "Setting up nginx.conf"
echo "***"
echo ""
isElectrs=$(sudo cat /etc/nginx/nginx.conf 2>/dev/null | grep -c 'upstream electrs')
if [ ${isElectrs} -gt 0 ]; then
echo "electrs is already configured with Nginx. To edit manually run \`sudo nano /etc/nginx/nginx.conf\`"
elif [ ${isElectrs} -eq 0 ]; then
isStream=$(sudo cat /etc/nginx/nginx.conf 2>/dev/null | grep -c 'stream {')
if [ ${isStream} -eq 0 ]; then
echo "
stream {
upstream electrs {
server 127.0.0.1:50001;
}
server {
listen 50002 ssl;
proxy_pass electrs;
ssl_certificate /etc/ssl/certs/localhost.crt;
ssl_certificate_key /etc/ssl/private/localhost.key;
ssl_session_cache shared:SSL-electrs:1m;
ssl_session_timeout 4h;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
}
}" | sudo tee -a /etc/nginx/nginx.conf
elif [ ${isStream} -eq 1 ]; then
sudo truncate -s-2 /etc/nginx/nginx.conf
echo "
upstream electrs {
server 127.0.0.1:50001;
}
server {
listen 50002 ssl;
proxy_pass electrs;
ssl_certificate /etc/ssl/certs/localhost.crt;
ssl_certificate_key /etc/ssl/private/localhost.key;
ssl_session_cache shared:SSL-electrs:1m;
ssl_session_timeout 4h;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
}
}" | sudo tee -a /etc/nginx/nginx.conf
elif [ ${isStream} -gt 1 ]; then
echo " Too many \`stream\` commands in nginx.conf. Please edit manually: \`sudo nano /etc/nginx/nginx.conf\` and retry"
exit 1
fi
fi
echo "allow port 50002 on ufw"
sudo ufw allow 50002 comment 'electrs-nginx SSL'
sudo systemctl enable nginx
sudo systemctl restart nginx
echo ""
echo "***"
echo "Installing the systemd service"
echo "***"
echo ""
# sudo nano /etc/systemd/system/electrs.service
echo "
[Unit]
Description=Electrs
After=lnd.service
2019-12-04 08:13:21 +00:00
[Service]
WorkingDirectory=/home/electrs/electrs
ExecStart=/home/electrs/electrs/target/release/electrs --index-batch-size=10 --electrum-rpc-addr=\"0.0.0.0:50001\"
User=electrs
Group=electrs
Type=simple
KillMode=process
TimeoutSec=60
Restart=always
RestartSec=60
[Install]
WantedBy=multi-user.target
" | sudo tee -a /etc/systemd/system/electrs.service
sudo systemctl enable electrs
# manual start:
# sudo -u electrs /home/electrs/.cargo/bin/cargo run --release -- --index-batch-size=10 --electrum-rpc-addr="0.0.0.0:50001"
echo ""
echo "***"
echo "Starting ElectRS in the background"
echo "***"
echo ""
else
echo "ElectRS is already installed."
fi
# setting value in raspiblitz config
sudo sed -i "s/^ElectRS=.*/ElectRS=on/g" /mnt/hdd/raspiblitz.conf
# Hidden Service for electrs if Tor active
if [ "${runBehindTor}" = "on" ]; then
2020-01-26 23:59:06 +01:00
/home/admin/config.scripts/internet.hiddenservice.sh electrs 50002 50002 50001 50001
2019-12-04 08:13:21 +00:00
fi
## Enable BTCEXP_ADDRESS_API if BTC-RPC-Explorer is active
# see /home/admin/config.scripts/bonus.electrsexplorer.sh
# run every 10 min by _background.sh
2019-12-04 08:13:21 +00:00
echo ""
2020-01-26 22:12:46 +01:00
echo "# To connect through SSL from outside of the local network make sure the port 50002 is forwarded on the router"
2019-12-04 08:13:21 +00:00
echo ""
exit 0
fi
# switch off
if [ "$1" = "0" ] || [ "$1" = "off" ]; then
# setting value in raspiblitz config
sudo sed -i "s/^ElectRS=.*/ElectRS=off/g" /mnt/hdd/raspiblitz.conf
# if second parameter is "deleteindex"
if [ "$2" == "deleteindex" ]; then
echo "# deleting electrum index"
sudo rm -rf /mnt/hdd/app-storage/electrs/
fi
2019-12-04 08:13:21 +00:00
isInstalled=$(sudo ls /etc/systemd/system/electrs.service 2>/dev/null | grep -c 'electrs.service')
if [ ${isInstalled} -eq 1 ]; then
2019-12-18 13:07:55 +01:00
2020-01-26 22:12:46 +01:00
echo "#*** REMOVING ELECTRS ***"
2019-12-18 13:32:13 +01:00
2019-12-04 08:13:21 +00:00
sudo systemctl stop electrs
sudo systemctl disable electrs
2019-12-18 13:32:13 +01:00
2019-12-04 08:13:21 +00:00
sudo rm /etc/systemd/system/electrs.service
2019-12-18 13:32:13 +01:00
2019-12-04 08:13:21 +00:00
sudo rm -rf /home/electrs/electrs
sudo rm -rf /home/electrs/.cargo
sudo rm -rf /home/electrs/.rustup
sudo rm -rf /home/electrs/.profile
2019-12-18 13:32:13 +01:00
2020-01-26 22:12:46 +01:00
echo "# OK ElectRS removed."
2019-12-04 08:13:21 +00:00
## Disable BTCEXP_ADDRESS_API if BTC-RPC-Explorer is active
/home/admin/config.scripts/bonus.electrsexplorer.sh
2019-12-04 08:13:21 +00:00
else
2020-01-26 22:12:46 +01:00
echo "# ElectRS is not installed."
2019-12-04 08:13:21 +00:00
fi
exit 0
fi
echo "FAIL - Unknown Parameter $1"
exit 1