#!/usr/bin/env bash set -Eeuo pipefail # 一次性安装 shunfeng 无源码运行目录。本脚本只复制运行配置,不重启服务。 SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" DEPLOY_HOME="${DEPLOY_HOME:-/home/emp-shunfeng}" RUNTIME_DIR="${RUNTIME_DIR:-$DEPLOY_HOME/runtime}" EXISTING_ENV_FILE="${EXISTING_ENV_FILE:-}" log() { echo "[$(date '+%Y-%m-%d %H:%M:%S')] $*" } die() { echo "ERROR: $*" >&2 exit 1 } validate_runtime() { local compose_cmd=() if docker compose version >/dev/null 2>&1; then compose_cmd=(docker compose) elif command -v docker-compose >/dev/null 2>&1; then compose_cmd=(docker-compose) else die "missing docker compose" fi ( set -a # shellcheck disable=SC1090 . "$RUNTIME_DIR/release.env" set +a [[ "${RUNTIME_DIR:-}" == "/home/emp-shunfeng/runtime" ]] \ || die "RUNTIME_DIR must be /home/emp-shunfeng/runtime" [[ "${BACKEND_COMPOSE_FILE:-}" == "$RUNTIME_DIR/docker-compose.yml" ]] \ || die "BACKEND_COMPOSE_FILE does not match RUNTIME_DIR" [[ "${BACKEND_ENV_FILE:-}" == "$RUNTIME_DIR/.env" ]] \ || die "BACKEND_ENV_FILE does not match RUNTIME_DIR" [[ "${REMOTE_DEPLOY_HOME:-}" == "/home/emp-shunfeng" ]] \ || die "REMOTE_DEPLOY_HOME must be /home/emp-shunfeng" [[ "${REMOTE_RUNTIME_DIR:-}" == "/home/emp-shunfeng/runtime" ]] \ || die "REMOTE_RUNTIME_DIR must be /home/emp-shunfeng/runtime" [[ -n "${PRIMARY_HOST:-}" && -n "${REMOTE_HOST:-}" ]] \ || die "PRIMARY_HOST and REMOTE_HOST are required" BACKEND_ENV_FILE="$RUNTIME_DIR/.env" IMAGE_TAG=latest "${compose_cmd[@]}" \ --env-file "$RUNTIME_DIR/.env" \ -f "$RUNTIME_DIR/docker-compose.yml" \ -p "${BACKEND_PROJECT_NAME:-emp_server}" \ config >/dev/null ) log "Runtime configuration validation passed" } [[ -f "$SCRIPT_DIR/docker-compose.yml" ]] || die "missing docker-compose.yml" [[ -f "$SCRIPT_DIR/deploy-from-url.sh" ]] || die "missing deploy-from-url.sh" [[ -f "$SCRIPT_DIR/release.env.example" ]] || die "missing release.env.example" mkdir -p "$RUNTIME_DIR" cp "$SCRIPT_DIR/docker-compose.yml" "$RUNTIME_DIR/docker-compose.yml" cp "$SCRIPT_DIR/deploy-from-url.sh" "$RUNTIME_DIR/deploy-from-url.sh" chmod +x "$RUNTIME_DIR/deploy-from-url.sh" if [[ ! -f "$RUNTIME_DIR/.env" ]]; then if [[ -n "$EXISTING_ENV_FILE" ]]; then [[ -f "$EXISTING_ENV_FILE" ]] || die "existing env file not found: $EXISTING_ENV_FILE" cp "$EXISTING_ENV_FILE" "$RUNTIME_DIR/.env" chmod 600 "$RUNTIME_DIR/.env" log "Existing backend env copied to $RUNTIME_DIR/.env" elif [[ -f "$SCRIPT_DIR/.env.example" ]]; then cp "$SCRIPT_DIR/.env.example" "$RUNTIME_DIR/.env" chmod 600 "$RUNTIME_DIR/.env" log "Created $RUNTIME_DIR/.env from example; replace all placeholders before deployment" else die "no existing env file supplied and .env.example is missing" fi else log "Keep existing runtime env: $RUNTIME_DIR/.env" fi if [[ ! -f "$RUNTIME_DIR/release.env" ]]; then cp "$SCRIPT_DIR/release.env.example" "$RUNTIME_DIR/release.env" chmod 600 "$RUNTIME_DIR/release.env" log "Created $RUNTIME_DIR/release.env; verify Compose project name and master/sub addresses" else log "Keep existing release config: $RUNTIME_DIR/release.env" fi validate_runtime log "Runtime files installed without restarting containers: $RUNTIME_DIR" log "Next: deploy one image package and verify the services before deleting source"