Вы не можете выбрать более 25 тем Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.
 
 
 

143 строки
3.9 KiB

  1. #!/usr/bin/env bash
  2. set -Eeuo pipefail
  3. # Download a package URL and deploy it on the target server.
  4. # Usage:
  5. # DEPLOY_ENV=emp-uat bash deploy-from-url.sh "<signed package URL>"
  6. # DEPLOY_ENV=emp-uat PACKAGE_SHA256=<sha256> bash deploy-from-url.sh "<signed package URL>"
  7. DEPLOY_ENV="${DEPLOY_ENV:-emp-test}"
  8. PROJECT_NAME="${PROJECT_NAME:-$DEPLOY_ENV}"
  9. DEPLOY_HOME="${DEPLOY_HOME:-/home/admin-x99/emp/$DEPLOY_ENV}"
  10. PACKAGE_URL="${1:-}"
  11. EXPECTED_SHA256="${PACKAGE_SHA256:-${2:-}}"
  12. RUN_ID="${RUN_ID:-$(date '+%Y%m%d%H%M%S')}"
  13. PACKAGE_ROOT="${PACKAGE_ROOT:-$DEPLOY_HOME/packages}"
  14. RUNTIME_DIR="${RUNTIME_DIR:-$DEPLOY_HOME/runtime}"
  15. WORK_DIR="$PACKAGE_ROOT/$RUN_ID"
  16. DOWNLOAD_FILE="$WORK_DIR/package.tar.gz"
  17. EXTRACT_DIR="$WORK_DIR/extracted"
  18. log() {
  19. echo "[$(date '+%Y-%m-%d %H:%M:%S')] $*"
  20. }
  21. die() {
  22. echo "ERROR: $*" >&2
  23. exit 1
  24. }
  25. need_cmd() {
  26. command -v "$1" >/dev/null 2>&1 || die "Missing command: $1"
  27. }
  28. download_package() {
  29. local url="$1"
  30. local output="$2"
  31. if command -v curl >/dev/null 2>&1; then
  32. curl -fL --retry 3 --connect-timeout 20 -o "$output" "$url"
  33. elif command -v wget >/dev/null 2>&1; then
  34. wget -O "$output" "$url"
  35. else
  36. die "Missing curl or wget"
  37. fi
  38. }
  39. calc_sha256() {
  40. local file="$1"
  41. if command -v sha256sum >/dev/null 2>&1; then
  42. sha256sum "$file" | awk '{print $1}'
  43. elif command -v shasum >/dev/null 2>&1; then
  44. shasum -a 256 "$file" | awk '{print $1}'
  45. else
  46. die "Missing sha256sum or shasum for checksum verification"
  47. fi
  48. }
  49. verify_checksum() {
  50. local file="$1"
  51. local expected="$2"
  52. [[ -n "$expected" ]] || return
  53. local actual
  54. actual="$(calc_sha256 "$file")"
  55. if [[ "$actual" != "$expected" ]]; then
  56. die "SHA256 mismatch. expected=$expected actual=$actual"
  57. fi
  58. log "SHA256 verified: $actual"
  59. }
  60. copy_runtime_package() {
  61. mkdir -p "$RUNTIME_DIR"
  62. cp "$EXTRACT_DIR/docker-compose.yml" "$RUNTIME_DIR/docker-compose.yml"
  63. cp "$EXTRACT_DIR/install.sh" "$RUNTIME_DIR/install.sh"
  64. cp "$EXTRACT_DIR/images.tar" "$RUNTIME_DIR/images.tar"
  65. if [[ -f "$EXTRACT_DIR/deploy-from-url.sh" ]]; then
  66. cp "$EXTRACT_DIR/deploy-from-url.sh" "$RUNTIME_DIR/deploy-from-url.sh"
  67. fi
  68. if [[ -f "$EXTRACT_DIR/.env.example" ]]; then
  69. cp "$EXTRACT_DIR/.env.example" "$RUNTIME_DIR/.env.example"
  70. fi
  71. if [[ -f "$EXTRACT_DIR/README.md" ]]; then
  72. cp "$EXTRACT_DIR/README.md" "$RUNTIME_DIR/README.md"
  73. fi
  74. }
  75. deploy_runtime_package() {
  76. log "Deploy runtime package to $RUNTIME_DIR"
  77. copy_runtime_package
  78. (
  79. cd "$RUNTIME_DIR"
  80. DEPLOY_ENV="$DEPLOY_ENV" \
  81. PROJECT_NAME="$PROJECT_NAME" \
  82. ENV_FILE=.env \
  83. COMPOSE_FILE=docker-compose.yml \
  84. IMAGE_TAR=images.tar \
  85. bash install.sh
  86. )
  87. }
  88. deploy_update_package() {
  89. [[ -f "$RUNTIME_DIR/.env" ]] || die "Missing runtime env file: $RUNTIME_DIR/.env"
  90. [[ -f "$RUNTIME_DIR/docker-compose.yml" ]] || die "Missing runtime compose file: $RUNTIME_DIR/docker-compose.yml"
  91. log "Apply update package with runtime dir: $RUNTIME_DIR"
  92. (
  93. cd "$EXTRACT_DIR"
  94. DEPLOY_ENV="$DEPLOY_ENV" \
  95. DEPLOY_HOME="$DEPLOY_HOME" \
  96. PROJECT_NAME="$PROJECT_NAME" \
  97. ENV_FILE="$RUNTIME_DIR/.env" \
  98. COMPOSE_FILE="$RUNTIME_DIR/docker-compose.yml" \
  99. IMAGE_TAR=images.tar \
  100. bash apply-update.sh
  101. )
  102. }
  103. [[ -n "$PACKAGE_URL" ]] || die "Usage: DEPLOY_ENV=emp-uat bash deploy-from-url.sh <package-url>"
  104. need_cmd tar
  105. mkdir -p "$WORK_DIR" "$EXTRACT_DIR"
  106. log "Deploy env: $DEPLOY_ENV"
  107. log "Deploy home: $DEPLOY_HOME"
  108. log "Download package"
  109. download_package "$PACKAGE_URL" "$DOWNLOAD_FILE"
  110. verify_checksum "$DOWNLOAD_FILE" "$EXPECTED_SHA256"
  111. log "Extract package"
  112. tar -xzf "$DOWNLOAD_FILE" -C "$EXTRACT_DIR" --strip-components=1
  113. if [[ -f "$EXTRACT_DIR/install.sh" && -f "$EXTRACT_DIR/docker-compose.yml" ]]; then
  114. deploy_runtime_package
  115. elif [[ -f "$EXTRACT_DIR/apply-update.sh" && -f "$EXTRACT_DIR/images.tar" ]]; then
  116. deploy_update_package
  117. else
  118. die "Unknown package structure: $EXTRACT_DIR"
  119. fi
  120. log "Done. Package workspace: $WORK_DIR"