dgb-wallet/ops/deploy-wallet.sh

141 lines
4.7 KiB
Bash
Raw Permalink Normal View History

#!/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