Você não pode selecionar mais de 25 tópicos Os tópicos devem começar com uma letra ou um número, podem incluir traços ('-') e podem ter até 35 caracteres.
 
 
 

96 linhas
3.4 KiB

  1. #!/usr/bin/env bash
  2. set -Eeuo pipefail
  3. # 一次性安装 shunfeng 无源码运行目录。本脚本只复制运行配置,不重启服务。
  4. SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
  5. DEPLOY_HOME="${DEPLOY_HOME:-/home/emp-shunfeng}"
  6. RUNTIME_DIR="${RUNTIME_DIR:-$DEPLOY_HOME/runtime}"
  7. EXISTING_ENV_FILE="${EXISTING_ENV_FILE:-}"
  8. log() {
  9. echo "[$(date '+%Y-%m-%d %H:%M:%S')] $*"
  10. }
  11. die() {
  12. echo "ERROR: $*" >&2
  13. exit 1
  14. }
  15. validate_runtime() {
  16. local compose_cmd=()
  17. if docker compose version >/dev/null 2>&1; then
  18. compose_cmd=(docker compose)
  19. elif command -v docker-compose >/dev/null 2>&1; then
  20. compose_cmd=(docker-compose)
  21. else
  22. die "missing docker compose"
  23. fi
  24. (
  25. set -a
  26. # shellcheck disable=SC1090
  27. . "$RUNTIME_DIR/release.env"
  28. set +a
  29. [[ "${RUNTIME_DIR:-}" == "/home/emp-shunfeng/runtime" ]] \
  30. || die "RUNTIME_DIR must be /home/emp-shunfeng/runtime"
  31. [[ "${BACKEND_COMPOSE_FILE:-}" == "$RUNTIME_DIR/docker-compose.yml" ]] \
  32. || die "BACKEND_COMPOSE_FILE does not match RUNTIME_DIR"
  33. [[ "${BACKEND_ENV_FILE:-}" == "$RUNTIME_DIR/.env" ]] \
  34. || die "BACKEND_ENV_FILE does not match RUNTIME_DIR"
  35. [[ "${REMOTE_DEPLOY_HOME:-}" == "/home/emp-shunfeng" ]] \
  36. || die "REMOTE_DEPLOY_HOME must be /home/emp-shunfeng"
  37. [[ "${REMOTE_RUNTIME_DIR:-}" == "/home/emp-shunfeng/runtime" ]] \
  38. || die "REMOTE_RUNTIME_DIR must be /home/emp-shunfeng/runtime"
  39. [[ -n "${PRIMARY_HOST:-}" && -n "${REMOTE_HOST:-}" ]] \
  40. || die "PRIMARY_HOST and REMOTE_HOST are required"
  41. BACKEND_ENV_FILE="$RUNTIME_DIR/.env" IMAGE_TAG=latest "${compose_cmd[@]}" \
  42. --env-file "$RUNTIME_DIR/.env" \
  43. -f "$RUNTIME_DIR/docker-compose.yml" \
  44. -p "${BACKEND_PROJECT_NAME:-emp_server}" \
  45. config >/dev/null
  46. )
  47. log "Runtime configuration validation passed"
  48. }
  49. [[ -f "$SCRIPT_DIR/docker-compose.yml" ]] || die "missing docker-compose.yml"
  50. [[ -f "$SCRIPT_DIR/deploy-from-url.sh" ]] || die "missing deploy-from-url.sh"
  51. [[ -f "$SCRIPT_DIR/release.env.example" ]] || die "missing release.env.example"
  52. mkdir -p "$RUNTIME_DIR"
  53. cp "$SCRIPT_DIR/docker-compose.yml" "$RUNTIME_DIR/docker-compose.yml"
  54. cp "$SCRIPT_DIR/deploy-from-url.sh" "$RUNTIME_DIR/deploy-from-url.sh"
  55. chmod +x "$RUNTIME_DIR/deploy-from-url.sh"
  56. if [[ ! -f "$RUNTIME_DIR/.env" ]]; then
  57. if [[ -n "$EXISTING_ENV_FILE" ]]; then
  58. [[ -f "$EXISTING_ENV_FILE" ]] || die "existing env file not found: $EXISTING_ENV_FILE"
  59. cp "$EXISTING_ENV_FILE" "$RUNTIME_DIR/.env"
  60. chmod 600 "$RUNTIME_DIR/.env"
  61. log "Existing backend env copied to $RUNTIME_DIR/.env"
  62. elif [[ -f "$SCRIPT_DIR/.env.example" ]]; then
  63. cp "$SCRIPT_DIR/.env.example" "$RUNTIME_DIR/.env"
  64. chmod 600 "$RUNTIME_DIR/.env"
  65. log "Created $RUNTIME_DIR/.env from example; replace all placeholders before deployment"
  66. else
  67. die "no existing env file supplied and .env.example is missing"
  68. fi
  69. else
  70. log "Keep existing runtime env: $RUNTIME_DIR/.env"
  71. fi
  72. if [[ ! -f "$RUNTIME_DIR/release.env" ]]; then
  73. cp "$SCRIPT_DIR/release.env.example" "$RUNTIME_DIR/release.env"
  74. chmod 600 "$RUNTIME_DIR/release.env"
  75. log "Created $RUNTIME_DIR/release.env; verify Compose project name and master/sub addresses"
  76. else
  77. log "Keep existing release config: $RUNTIME_DIR/release.env"
  78. fi
  79. validate_runtime
  80. log "Runtime files installed without restarting containers: $RUNTIME_DIR"
  81. log "Next: deploy one image package and verify the services before deleting source"