# 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 #cleanup sudo systemctl stop electrs sudo systemctl disable electrs sudo rm -f /etc/systemd/system/electrs.service 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 -- -y # workaround to keep Rust at v1.37.0 # check with: $ /home/electrs/.rustup/toolchains/stable-armv7-unknown-linux-gnueabihf/bin/rustc --version sudo -u electrs /home/electrs/.cargo/bin/rustup install 1.37.0 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 /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 -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 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 sudo systemctl enable electrs sudo systemctl start 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 "" # 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 Tor Hidden Service address for electrs is:" echo "$TOR_ADDRESS" echo "Electrum wallet: start with the options:" echo "\`electrum --oneserver --server=$TOR_ADDRESS:50001:t --proxy socks5:127.0.0.1:9150 \'" echo "***" echo "" else 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 "" fi