102 lines
4.2 KiB
Bash
Executable File
102 lines
4.2 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
set -euo pipefail
|
|
|
|
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
PROJECT_ROOT="$(cd "$SCRIPT_DIR/../.." && pwd)"
|
|
if [[ -f "$PROJECT_ROOT/scripts/lib/load-project-env.sh" ]]; then
|
|
# shellcheck source=/dev/null
|
|
source "$PROJECT_ROOT/scripts/lib/load-project-env.sh"
|
|
fi
|
|
if [[ -f "$PROJECT_ROOT/config/ip-addresses.conf" ]]; then
|
|
# shellcheck source=/dev/null
|
|
source "$PROJECT_ROOT/config/ip-addresses.conf" 2>/dev/null || true
|
|
fi
|
|
|
|
PHOENIX_DEPLOY_WORKSPACE="${PHOENIX_DEPLOY_WORKSPACE:-}"
|
|
NPMPLUS_PROXMOX_HOST="${NPMPLUS_PROXMOX_HOST:-${PROXMOX_HOST_R630_01:-192.168.11.11}}"
|
|
NPMPLUS_VMID="${NPMPLUS_VMID:-10233}"
|
|
NPMPLUS_DEPLOY_ROOT="${NPMPLUS_DEPLOY_ROOT:-/var/www/ecosystem/cromero}"
|
|
NPMPLUS_DATA_ROOT="${NPMPLUS_DATA_ROOT:-/opt/npmplus/html/ecosystem/cromero}"
|
|
PUBLIC_URL="${PUBLIC_URL:-https://d-bis.org/ecosystem/cromero/}"
|
|
DRY_RUN="${DRY_RUN:-0}"
|
|
SSH_OPTS=(-o BatchMode=yes -o ConnectTimeout=15 -o StrictHostKeyChecking=accept-new)
|
|
TMP_ARCHIVE="/tmp/cromero-dapp-dist-$$.tgz"
|
|
|
|
usage() { printf 'Usage: %s [--dry-run]\n' "$(basename "$0")"; }
|
|
log() { printf '[cromero-phoenix] %s\n' "$*" >&2; }
|
|
die() { printf '[cromero-phoenix][FATAL] %s\n' "$*" >&2; exit 1; }
|
|
need_cmd() { command -v "$1" >/dev/null 2>&1 || die "missing required command: $1"; }
|
|
run() { if [[ "$DRY_RUN" == 1 ]]; then printf '[dry-run] %q ' "$@" >&2; printf '\n' >&2; else "$@"; fi; }
|
|
cleanup() { rm -f "$TMP_ARCHIVE"; }
|
|
trap cleanup EXIT
|
|
|
|
while [[ $# -gt 0 ]]; do
|
|
case "$1" in
|
|
--dry-run) DRY_RUN=1; shift ;;
|
|
-h|--help) usage; exit 0 ;;
|
|
*) die "unknown arg: $1" ;;
|
|
esac
|
|
done
|
|
|
|
for cmd in ssh scp tar curl node npm; do need_cmd "$cmd"; done
|
|
[[ -n "$PHOENIX_DEPLOY_WORKSPACE" ]] || die "PHOENIX_DEPLOY_WORKSPACE is required"
|
|
[[ -d "$PHOENIX_DEPLOY_WORKSPACE" ]] || die "staged workspace missing: $PHOENIX_DEPLOY_WORKSPACE"
|
|
|
|
log "building CROMERO from staged workspace: $PHOENIX_DEPLOY_WORKSPACE"
|
|
pushd "$PHOENIX_DEPLOY_WORKSPACE" >/dev/null
|
|
if [[ -f package-lock.json ]]; then
|
|
run npm ci --no-audit --no-fund
|
|
else
|
|
run npm install --no-audit --no-fund
|
|
fi
|
|
run env \
|
|
VITE_THIRDWEB_CLIENT_ID="${VITE_THIRDWEB_CLIENT_ID:-}" \
|
|
VITE_PROJECT_WALLET_ADDRESS="${VITE_PROJECT_WALLET_ADDRESS:-0x3E309b87fA79092767531a0A6F5B6c3480737c5e}" \
|
|
VITE_CHAIN_138_RPC="${VITE_CHAIN_138_RPC:-https://rpc.d-bis.org}" \
|
|
VITE_CHAIN_138_EXPLORER="${VITE_CHAIN_138_EXPLORER:-https://explorer.d-bis.org}" \
|
|
npm run build
|
|
[[ -f dist/index.html ]] || die "build produced no dist/index.html"
|
|
tar -C "$PHOENIX_DEPLOY_WORKSPACE" -czf "$TMP_ARCHIVE" dist
|
|
popd >/dev/null
|
|
|
|
log "deploying dist/ through $NPMPLUS_PROXMOX_HOST to CT $NPMPLUS_VMID:$NPMPLUS_DEPLOY_ROOT"
|
|
run scp "${SSH_OPTS[@]}" "$TMP_ARCHIVE" "root@$NPMPLUS_PROXMOX_HOST:/tmp/cromero-dapp-dist.tgz"
|
|
if [[ "$DRY_RUN" == 1 ]]; then
|
|
log "dry-run complete"
|
|
exit 0
|
|
fi
|
|
ssh "${SSH_OPTS[@]}" "root@$NPMPLUS_PROXMOX_HOST" bash -s -- "$NPMPLUS_VMID" "$NPMPLUS_DEPLOY_ROOT" "$NPMPLUS_DATA_ROOT" <<'INNER'
|
|
set -euo pipefail
|
|
vmid="$1"
|
|
deploy_root="$2"
|
|
data_root="$3"
|
|
pct exec "$vmid" -- bash -lc "
|
|
set -euo pipefail
|
|
mkdir -p '$data_root' /var/www/ecosystem
|
|
if [ -e '$deploy_root' ] && [ ! -L '$deploy_root' ]; then rm -rf '$deploy_root'; fi
|
|
ln -sfn '$data_root' '$deploy_root'
|
|
rm -rf /tmp/cromero-dist
|
|
"
|
|
pct push "$vmid" /tmp/cromero-dapp-dist.tgz /tmp/cromero-dapp-dist.tgz
|
|
pct exec "$vmid" -- bash -lc "
|
|
set -euo pipefail
|
|
rm -rf /tmp/cromero-dist
|
|
mkdir -p /tmp/cromero-dist '$data_root'
|
|
tar -xzf /tmp/cromero-dapp-dist.tgz -C /tmp/cromero-dist
|
|
find '$data_root' -mindepth 1 -maxdepth 1 -exec rm -rf {} +
|
|
cp -R /tmp/cromero-dist/dist/. '$data_root/'
|
|
chown -R root:root /opt/npmplus/html/ecosystem /var/www/ecosystem
|
|
chmod 755 /opt/npmplus/html /opt/npmplus/html/ecosystem '$data_root' /var/www /var/www/ecosystem
|
|
if command -v docker >/dev/null 2>&1; then
|
|
docker exec npmplus sh -lc 'rm -rf /var/www && ln -s /data/html /var/www && nginx -t && nginx -s reload'
|
|
fi
|
|
rm -rf /tmp/cromero-dist /tmp/cromero-dapp-dist.tgz
|
|
"
|
|
rm -f /tmp/cromero-dapp-dist.tgz
|
|
INNER
|
|
|
|
log "verifying $PUBLIC_URL"
|
|
body="$(curl -fsS --max-time 20 "$PUBLIC_URL")" || die "public URL failed: $PUBLIC_URL"
|
|
printf '%s' "$body" | grep -F '<div id="root"></div>' >/dev/null || die "public URL missing React root"
|
|
log "CROMERO Phoenix deploy completed"
|