dgb-wallet/ops/deploy-wallet.sh
Digibyte.X d50286a9a5 DigiByte.X Wallet — recovery-first web wallet monorepo
Packages: core (BIP39/32/44/49/84/86 derivation, WIF), keystore (PBKDF2 +
AES-GCM), psbt, p2p (BIP157/158 SPV daemon, Dandelion++ broadcast with
relay-echo verification), blockbook, rpc, electrum, net, bns, web-ui
(React/Vite), mobile (Expo). ops/ holds the nginx vhost, systemd unit and
push.sh deploy script for digibyte.x/web.
2026-09-20 20:16:52 +02:00

140 lines
4.7 KiB
Bash
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/usr/bin/env bash
# Bootstrap a fresh VPS to serve digibyte.x — static wallet bundle +
# reverse-proxied /p2p/ daemon behind a self-signed TLS cert whose
# fingerprint you paste into the digibyte.x BNS record.
#
# Usage:
# scp -r . user@vps:/opt/dgb-wallet # get the monorepo onto the box
# ssh user@vps
# sudo /opt/dgb-wallet/ops/deploy-wallet.sh digibyte.x
#
# Steps:
# 1. install caddy + node20 (if missing)
# 2. install monorepo deps, build web-ui
# 3. create dgb-wallet system user, seed /var/lib/dgb-wallet
# 4. install dgb-daemon.service, enable + start
# 5. generate self-signed cert (CN=digibyte.x), print SHA-256
# 6. render Caddyfile.wallet with cert paths + site root
# 7. install Caddy service, reload
# 8. print the exact BNS UPD payload for you to sign
set -euo pipefail
if [[ $EUID -ne 0 ]]; then
echo "Run as root (sudo)." >&2
exit 1
fi
if [[ $# -lt 1 ]]; then
echo "Usage: $0 <bns-name> e.g. $0 digibyte.x" >&2
exit 1
fi
BNS_NAME="$1"
REPO_DIR="${REPO_DIR:-/opt/dgb-wallet}"
SITE_ROOT="/var/www/dgb-wallet"
CERT_DIR="/etc/ssl/dgb-wallet"
DAEMON_HOME="/var/lib/dgb-wallet"
OPS_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
log() { echo -e "\n\033[1;36m>>> $*\033[0m"; }
log "Step 1/8: install prerequisites (caddy, node 20)"
apt-get update -qq
apt-get install -y -qq curl gpg ca-certificates openssl rsync debian-keyring debian-archive-keyring apt-transport-https
if ! command -v caddy >/dev/null; then
curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/gpg.key' | gpg --dearmor -o /usr/share/keyrings/caddy-stable-archive-keyring.gpg
curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/debian.deb.txt' | tee /etc/apt/sources.list.d/caddy-stable.list >/dev/null
apt-get update -qq
apt-get install -y -qq caddy
fi
if ! command -v node >/dev/null || ! node -v | grep -qE '^v(20|22|24)\.'; then
curl -fsSL https://deb.nodesource.com/setup_20.x | bash -
apt-get install -y -qq nodejs
fi
log "Step 2/8: install deps and build web-ui bundle"
cd "$REPO_DIR"
npm install --silent
npm run build -w @dgb-wallet/web-ui
mkdir -p "$SITE_ROOT"
rsync -a --delete "$REPO_DIR/packages/web-ui/dist/" "$SITE_ROOT/"
log "Step 3/8: create dgb-wallet user"
if ! id -u dgb-wallet >/dev/null 2>&1; then
useradd --system --home "$DAEMON_HOME" --shell /usr/sbin/nologin dgb-wallet
fi
mkdir -p "$DAEMON_HOME"
chown -R dgb-wallet:dgb-wallet "$DAEMON_HOME" "$REPO_DIR"
log "Step 4/8: install dgb-daemon.service"
install -m 0644 "$OPS_DIR/dgb-daemon.service" /etc/systemd/system/dgb-daemon.service
systemctl daemon-reload
systemctl enable --now dgb-daemon.service
sleep 2
systemctl --no-pager --lines=5 status dgb-daemon.service || true
log "Step 5/8: generate self-signed TLS cert (CN=$BNS_NAME)"
mkdir -p "$CERT_DIR"
if [[ ! -f "$CERT_DIR/server.crt" ]]; then
openssl req -x509 -newkey ec:<(openssl ecparam -name prime256v1) \
-sha256 -days 3650 -nodes \
-keyout "$CERT_DIR/server.key" \
-out "$CERT_DIR/server.crt" \
-subj "/CN=$BNS_NAME"
chmod 600 "$CERT_DIR/server.key"
fi
TLS_FINGERPRINT="$(openssl x509 -in "$CERT_DIR/server.crt" -outform DER | openssl dgst -sha256 -binary | xxd -p -c 64)"
log "Step 6/8: render Caddyfile"
sed \
-e "s|@CERT_FILE@|$CERT_DIR/server.crt|g" \
-e "s|@KEY_FILE@|$CERT_DIR/server.key|g" \
-e "s|@SITE_ROOT@|$SITE_ROOT|g" \
"$OPS_DIR/Caddyfile.wallet" > /etc/caddy/Caddyfile
caddy validate --config /etc/caddy/Caddyfile
systemctl reload caddy || systemctl restart caddy
log "Step 7/8: open firewall (443 https, 12024 DGB p2p out only)"
if command -v ufw >/dev/null; then
ufw --force enable
ufw allow 22/tcp
ufw allow 443/tcp
fi
log "Step 8/8: DONE."
VPS_IP="$(curl -s -4 https://ifconfig.me || echo '<unknown>')"
cat <<EOF
===================================================================
digibyte.x deploy complete
===================================================================
Site root: $SITE_ROOT
Daemon: dgb-daemon.service (bound 127.0.0.1:5174)
Reverse proxy: Caddy on :443 → /p2p/* to daemon, / to bundle
VPS IPv4: $VPS_IP
TLS fingerprint: $TLS_FINGERPRINT
Paste this into the BNS UPD (from your BCH wallet host):
cd D:\\Dev\\NameCoin
node src/update.js $BNS_NAME '{
"ip": "$VPS_IP",
"tls": "$TLS_FINGERPRINT",
"u": "https://$BNS_NAME"
}'
Wait 1–2 confirmations, then load https://$BNS_NAME/ in a wallet-
aware client. Balance/Send will hit https://$BNS_NAME/p2p/balance
transparently.
To re-deploy after a code change:
cd $REPO_DIR && git pull && npm install && \\
npm run build -w @dgb-wallet/web-ui && \\
rsync -a --delete packages/web-ui/dist/ $SITE_ROOT/ && \\
systemctl restart dgb-daemon
Tail logs:
journalctl -u dgb-daemon -u caddy -f
EOF