#!/bin/bash # Sets up the BTCPayServer Wownero edition on a fresh Ubuntu VPS set -e if [[ -z $BTCPAY_HOST ]]; then echo Please provide a BTCPAY_HOST variable with the URL you will host your BTCPayServer at exit 1 fi if [[ -z $EMAIL ]] then echo Please provide a EMAIL variable to register for Lets Encrypt certificates exit 1 fi export DEBIAN_FRONTEND=noninteractive # Install packages apt-get update apt-get upgrade -y apt-get install -y \ software-properties-common \ sudo \ git \ certbot \ nginx \ ufw \ tor # Setup basic firewall rules ufw default deny incoming ufw default allow outgoing ufw allow 22 ufw allow 80 ufw allow 443 ufw -f enable # Install docker engine + docker compose curl -s https://get.docker.com | bash # Install btcpayserver wownero git clone https://github.com/lalanza808/btcpayserver-wownero /opt/btcpay echo BTCPAY_HOST=$BTCPAY_HOST > /opt/btcpay/.env cd /opt/btcpay docker compose up -d # Setup Tor mkdir -p /run/tor chown -R debian-tor:debian-tor /run/tor chmod 700 -R /run/tor mkdir -p /var/www/tor cat << EOF > /etc/tor/torrc ControlSocket /run/tor/control ControlSocketsGroupWritable 1 CookieAuthentication 1 CookieAuthFileGroupReadable 1 CookieAuthFile /run/tor/control.authcookie DataDirectory /var/lib/tor ExitPolicy reject6 *:*, reject *:* ExitRelay 0 IPv6Exit 0 Log notice stdout ORPort 127.0.0.1:9001 PublishServerDescriptor 0 SOCKSPort 9050 HiddenServiceDir /var/lib/tor/btcpayserver HiddenServicePort 80 127.0.0.1:80 EOF systemctl enable tor systemctl restart tor sleep 10 mkdir -p /var/www/tor/ cp /var/lib/tor/btcpayserver/hostname /var/www/tor/index.html chmod 644 /var/www/tor/index.html chmod 755 /var/www/tor/ chown -R nobody:nogroup /var/www/tor # Setup certs and Nginx mkdir -p /etc/nginx/conf.d mkdir -p /etc/ssl/certs rm -f /etc/nginx/sites-enabled/default openssl dhparam -out /etc/ssl/certs/dhparam.pem -2 2048 cat << EOF > /etc/nginx/conf.d/ssl.conf ## SSL Certs are referenced in the actual Nginx config per-vhost # Disable insecure SSL v2. Also disable SSLv3, as TLS 1.0 suffers a downgrade attack, allowing an attacker to force a connection to use SSLv3 and therefore disable forward secrecy. # ssl_protocols TLSv1 TLSv1.1 TLSv1.2; # Strong ciphers for PFS ssl_ciphers 'EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH'; # Use server's preferred cipher, not the client's # ssl_prefer_server_ciphers on; ssl_session_cache shared:SSL:10m; # Use ephemeral 4096 bit DH key for PFS ssl_dhparam /etc/ssl/certs/dhparam.pem; # Use OCSP stapling ssl_stapling on; ssl_stapling_verify on; resolver 1.1.1.1 valid=300s; resolver_timeout 5s; EOF cat << EOF > /etc/nginx/sites-enabled/${BTCPAY_HOST}.conf # Redirect inbound http to https server { listen 80 default_server; server_name ${BTCPAY_HOST}; index index.php index.html; return 301 https://${BTCPAY_HOST}$request_uri; } # Load SSL configs and serve SSL site server { listen 443 ssl; server_name ${BTCPAY_HOST}; error_log /var/log/nginx/${BTCPAY_HOST}-error.log warn; access_log /var/log/nginx/${BTCPAY_HOST}-access.log; client_body_in_file_only clean; client_body_buffer_size 32K; # set max upload size client_max_body_size 8M; sendfile on; send_timeout 600s; location / { proxy_pass http://127.0.0.1:49392; proxy_set_header Host \$host; proxy_set_header X-Real-IP \$remote_addr; proxy_set_header X-Frame-Options "SAMEORIGIN"; proxy_set_header X-Forwarded-For \$proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto \$scheme; proxy_redirect off; # WebSocket-specific headers proxy_http_version 1.1; proxy_set_header Upgrade \$http_upgrade; proxy_set_header Connection "upgrade"; # Optional timeouts proxy_connect_timeout 60s; proxy_send_timeout 60s; proxy_read_timeout 60s; # Disable caching proxy_buffering off; } location /tor { alias /var/www/tor/; } include conf.d/ssl.conf; ssl_certificate /etc/letsencrypt/live/${BTCPAY_HOST}/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/${BTCPAY_HOST}/privkey.pem; } EOF cat << EOF > /etc/nginx/sites-enabled/btcpay-tor.conf server { listen 80; server_name $(cat /var/lib/tor/btcpayserver/hostname); error_log /var/log/nginx/btcpay-tor-error.log warn; access_log /var/log/nginx/btcpay-tor-access.log; client_body_in_file_only clean; client_body_buffer_size 32K; location / { proxy_pass http://127.0.0.1:49392; proxy_set_header Host \$host; proxy_set_header X-Real-IP \$remote_addr; proxy_set_header X-Frame-Options "SAMEORIGIN"; proxy_set_header X-Forwarded-For \$proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto \$scheme; proxy_redirect off; } } EOF service nginx stop certbot certonly --standalone -d ${BTCPAY_HOST} --agree-tos -m ${EMAIL} -n sed -i 's/# server_names_hash_bucket_size.*/server_names_hash_bucket_size 128;/' /etc/nginx/nginx.conf service nginx start # Final output echo -e "\n\n[+] Wallet seed details" cat /opt/btcpay/data/wallet/init.log echo -e "\nOnion site for BTCPayServer: $(cat /var/lib/tor/btcpayserver/hostname)" echo -e "\nYou may now setup your BTCPayServer at ${BTCPAY_HOST}"