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