#!/usr/bin/env bash set -euo pipefail cd "$(dirname "$0")" source ./deploy.config KEY_PATH="${KEY_FILE/#\~/$HOME}" RELEASE_ID="$(date -u +%Y%m%d%H%M%S)" ARCHIVE="${TMPDIR:-/tmp}/lessncosmos-${RELEASE_ID}.tar.gz" REMOTE_ARCHIVE="/tmp/lessncosmos-${RELEASE_ID}.tar.gz" if [[ ! -f "$KEY_PATH" ]]; then echo "Deployment key not found: $KEY_PATH" >&2 exit 1 fi chmod 600 "$KEY_PATH" npm run build COPYFILE_DISABLE=1 tar -C dist -czf "$ARCHIVE" . SSH=(ssh -i "$KEY_PATH" -o BatchMode=yes -o StrictHostKeyChecking=accept-new "$SERVER_USER@$SERVER_HOST") SCP=(scp -i "$KEY_PATH" -o BatchMode=yes -o StrictHostKeyChecking=accept-new) "${SCP[@]}" "$ARCHIVE" "$SERVER_USER@$SERVER_HOST:$REMOTE_ARCHIVE" "${SSH[@]}" bash -s -- \ "$REMOTE_ARCHIVE" "$REMOTE_ROOT" "$RELEASE_ID" \ "$SITE_CONTAINER" "$DOCKER_NETWORK" "$PROXY_CONTAINER" "$DOMAIN" <<'REMOTE' set -euo pipefail archive="$1" remote_root="$2" release_id="$3" site_container="$4" docker_network="$5" proxy_container="$6" domain="$7" release_dir="$remote_root/releases/$release_id" if ! docker inspect "$proxy_container" >/dev/null 2>&1; then echo "Proxy container not found: $proxy_container" >&2 exit 1 fi if ! docker network inspect "$docker_network" >/dev/null 2>&1; then echo "Docker network not found: $docker_network" >&2 exit 1 fi if ! grep -q "server_name $domain;" /opt/meishi_ccdw_life/nginx.conf; then echo "Domain gateway configuration is missing; run the one-time provisioning first." >&2 exit 1 fi mkdir -p "$release_dir" tar -xzf "$archive" -C "$release_dir" ln -sfn "$release_dir" "$remote_root/current" rm -f "$archive" if docker inspect "$site_container" >/dev/null 2>&1; then docker rm -f "$site_container" >/dev/null fi docker run -d \ --name "$site_container" \ --restart unless-stopped \ --network "$docker_network" \ -v "$remote_root/current:/usr/share/nginx/html:ro" \ docker.m.daocloud.io/library/nginx:alpine >/dev/null docker exec "$proxy_container" nginx -t docker exec "$proxy_container" nginx -s reload find "$remote_root/releases" -mindepth 1 -maxdepth 1 -type d \ -printf '%T@ %p\n' | sort -nr | tail -n +6 | cut -d' ' -f2- | xargs -r rm -rf REMOTE rm -f "$ARCHIVE" echo "Deployed: https://$DOMAIN"