diff --git a/electrs/electrs_to_RaspiBlitz.sh b/electrs/electrs_to_RaspiBlitz.sh new file mode 100644 index 0000000..3647012 --- /dev/null +++ b/electrs/electrs_to_RaspiBlitz.sh @@ -0,0 +1,287 @@ +# Download and run this script on the RaspiBlitz: +# $ wget https://github.com/openoms/bitcoin-tutorials/raw/master/electrs/electrs_to_RaspiBlitz.sh && bash electrs_to_RaspiBlitz.sh + +# https://github.com/romanz/electrs/blob/master/doc/usage.md + +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 -- -y +#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 /home/electrs/.cargo/bin/cargo build --release + +echo "" +echo "***" +echo "The electrs database will be built in /mnt/hdd/electrs/db. Takes ~18 hours and ~50Gb diskspace" +echo "***" +echo "" +sudo mkdir /mnt/hdd/electrs 2>/dev/null +sudo chown -R electrs:electrs /mnt/hdd/electrs + +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 rm -f /home/electrs/.electrs/config.toml +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 </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 + +sudo systemctl enable nginx +sudo systemctl restart nginx + +echo "" +echo "***" +echo "Installing the systemd service" +echo "***" +echo "" + +sudo systemctl stop electrs +sudo systemctl disable electrs +sudo rm /etc/systemd/system/electrs.service + +# sudo nano /etc/systemd/system/electrs.service +echo " +[Unit] +Description=Electrs +After=bitcoind.service + +[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 + +# Hidden Service for electrs if Tor active + +source /mnt/hdd/raspiblitz.conf + +if [ "${runBehindTor}" = "on" ]; then + isElectrsTor=$(sudo cat /etc/tor/torrc 2>/dev/null | grep -c 'electrs') + if [ ${isElectrsTor} -eq 0 ]; then + echo " + # Hidden Service for Electrum Server + HiddenServiceDir /mnt/hdd/tor/electrs + HiddenServiceVersion 3 + HiddenServicePort 50001 127.0.0.1:50001 + " | sudo tee -a /etc/tor/torrc + + sudo systemctl restart tor + sudo systemctl restart tor@default + fi + TOR_ADDRESS=$(sudo cat /mnt/hdd/tor/electrs/hostname) + echo "" + echo "***" + echo "The hidden service address for electrs is:" + echo "$TOR_ADDRESS" + echo "***" + echo "" +fi + +echo "" +echo "***" +echo "Starting electrs in the background" +echo "***" +echo "" +# sudo -u electrs /home/electrs/.cargo/bin/cargo run --release -- --index-batch-size=10 --electrum-rpc-addr="0.0.0.0:50001" +sudo systemctl enable electrs +sudo systemctl start electrs + +echo "" +echo "To connect from outside of the local network make sure the port 50002 is forwarded on the router" +echo "Electrum wallet: start with the options \`electrum --oneserver --server RaspiBlitz_IP:50002:s" +echo "" \ No newline at end of file