deploy.sh 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. #!/usr/bin/env bash
  2. set -euo pipefail
  3. cd "$(dirname "$0")"
  4. source ./deploy.config
  5. KEY_PATH="${KEY_FILE/#\~/$HOME}"
  6. RELEASE_ID="$(date -u +%Y%m%d%H%M%S)"
  7. ARCHIVE="${TMPDIR:-/tmp}/lessncosmos-${RELEASE_ID}.tar.gz"
  8. REMOTE_ARCHIVE="/tmp/lessncosmos-${RELEASE_ID}.tar.gz"
  9. if [[ ! -f "$KEY_PATH" ]]; then
  10. echo "Deployment key not found: $KEY_PATH" >&2
  11. exit 1
  12. fi
  13. chmod 600 "$KEY_PATH"
  14. npm run build
  15. COPYFILE_DISABLE=1 tar -C dist -czf "$ARCHIVE" .
  16. SSH=(ssh -i "$KEY_PATH" -o BatchMode=yes -o StrictHostKeyChecking=accept-new "$SERVER_USER@$SERVER_HOST")
  17. SCP=(scp -i "$KEY_PATH" -o BatchMode=yes -o StrictHostKeyChecking=accept-new)
  18. "${SCP[@]}" "$ARCHIVE" "$SERVER_USER@$SERVER_HOST:$REMOTE_ARCHIVE"
  19. "${SSH[@]}" bash -s -- \
  20. "$REMOTE_ARCHIVE" "$REMOTE_ROOT" "$RELEASE_ID" \
  21. "$SITE_CONTAINER" "$DOCKER_NETWORK" "$PROXY_CONTAINER" "$DOMAIN" <<'REMOTE'
  22. set -euo pipefail
  23. archive="$1"
  24. remote_root="$2"
  25. release_id="$3"
  26. site_container="$4"
  27. docker_network="$5"
  28. proxy_container="$6"
  29. domain="$7"
  30. release_dir="$remote_root/releases/$release_id"
  31. if ! docker inspect "$proxy_container" >/dev/null 2>&1; then
  32. echo "Proxy container not found: $proxy_container" >&2
  33. exit 1
  34. fi
  35. if ! docker network inspect "$docker_network" >/dev/null 2>&1; then
  36. echo "Docker network not found: $docker_network" >&2
  37. exit 1
  38. fi
  39. if ! grep -q "server_name $domain;" /opt/meishi_ccdw_life/nginx.conf; then
  40. echo "Domain gateway configuration is missing; run the one-time provisioning first." >&2
  41. exit 1
  42. fi
  43. mkdir -p "$release_dir"
  44. tar -xzf "$archive" -C "$release_dir"
  45. ln -sfn "$release_dir" "$remote_root/current"
  46. rm -f "$archive"
  47. if docker inspect "$site_container" >/dev/null 2>&1; then
  48. docker rm -f "$site_container" >/dev/null
  49. fi
  50. docker run -d \
  51. --name "$site_container" \
  52. --restart unless-stopped \
  53. --network "$docker_network" \
  54. -v "$remote_root/current:/usr/share/nginx/html:ro" \
  55. docker.m.daocloud.io/library/nginx:alpine >/dev/null
  56. docker exec "$proxy_container" nginx -t
  57. docker exec "$proxy_container" nginx -s reload
  58. find "$remote_root/releases" -mindepth 1 -maxdepth 1 -type d \
  59. -printf '%T@ %p\n' | sort -nr | tail -n +6 | cut -d' ' -f2- | xargs -r rm -rf
  60. REMOTE
  61. rm -f "$ARCHIVE"
  62. echo "Deployed: https://$DOMAIN"