deploy.sh 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738
  1. #!/usr/bin/env bash
  2. set -Eeuo pipefail
  3. ROOT_DIR=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)
  4. SERVER=root@47.93.193.127
  5. KEY_FILE="$ROOT_DIR/ccdw-meishi-1.pem"
  6. REMOTE_DIR=/opt/xinghen
  7. KNOWN_HOSTS="$ROOT_DIR/.deploy-known-hosts"
  8. IMAGE_ARCHIVE=$(mktemp /tmp/xinghen-app.XXXXXX.tar.gz)
  9. trap 'rm -f "$IMAGE_ARCHIVE"' EXIT
  10. if [[ ! -f "$KEY_FILE" ]]; then
  11. echo "缺少 SSH 私钥:$KEY_FILE(.pem.pub 公钥不能用于登录)" >&2
  12. exit 1
  13. fi
  14. SSH=(ssh -i "$KEY_FILE" -o BatchMode=yes -o StrictHostKeyChecking=accept-new -o UserKnownHostsFile="$KNOWN_HOSTS")
  15. RSYNC_SSH="ssh -i $KEY_FILE -o BatchMode=yes -o StrictHostKeyChecking=accept-new -o UserKnownHostsFile=$KNOWN_HOSTS"
  16. docker buildx build --platform linux/amd64 --pull --load -t xinghen-app:deploy "$ROOT_DIR"
  17. docker save xinghen-app:deploy | gzip >"$IMAGE_ARCHIVE"
  18. "${SSH[@]}" "$SERVER" "install -d -m 755 '$REMOTE_DIR' '$REMOTE_DIR/.deploy'"
  19. rsync -az --delete \
  20. --exclude '.git/' \
  21. --exclude 'node_modules/' \
  22. --exclude 'dist/' \
  23. --exclude '.env' \
  24. --exclude '.deploy/' \
  25. --exclude '.deploy-known-hosts' \
  26. --exclude '*.pem' \
  27. --exclude '*.pem.pub' \
  28. -e "$RSYNC_SSH" \
  29. "$ROOT_DIR/" "$SERVER:$REMOTE_DIR/"
  30. rsync -az -e "$RSYNC_SSH" "$IMAGE_ARCHIVE" "$SERVER:$REMOTE_DIR/.deploy/app-image.tar.gz"
  31. "${SSH[@]}" "$SERVER" "chmod 755 '$REMOTE_DIR/deployment/remote-deploy.sh' && ENABLE_FUTURE_DOMAIN='${ENABLE_FUTURE_DOMAIN:-0}' '$REMOTE_DIR/deployment/remote-deploy.sh'"
  32. echo "部署完成:https://xinghen.lessncosmos.com"