#!/usr/bin/env bash # 预构建镜像部署 — 服务器不编译,仅 load + 启动 # 用法: # bash deploy/install-prebuilt-image.sh # bash deploy/install-prebuilt-image.sh /path/to/yubao-app-image.tar set -euo pipefail ROOT_DIR="$(cd "$(dirname "$0")/.." && pwd)" COMPOSE_FILE="${ROOT_DIR}/deploy/docker-compose.prebuilt.yml" ENV_FILE="${ROOT_DIR}/.env" IMAGE_TAG="yubao-app:latest" RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' NC='\033[0m' log() { echo -e "${GREEN}[prebuilt]${NC} $*"; } warn() { echo -e "${YELLOW}[prebuilt]${NC} $*"; } err() { echo -e "${RED}[prebuilt]${NC} $*" >&2; } TAR_PATH="${1:-${ROOT_DIR}/deploy/yubao-app-image.tar}" if [[ ! -f "$ENV_FILE" ]]; then err "缺少 .env,请先配置 DATABASE_URL 等" exit 1 fi if ! command -v docker >/dev/null 2>&1; then err "未安装 Docker" exit 1 fi mkdir -p "${ROOT_DIR}/data" if docker image inspect "$IMAGE_TAG" >/dev/null 2>&1; then log "镜像已存在: $IMAGE_TAG" elif [[ -f "$TAR_PATH" ]]; then log "加载镜像: $TAR_PATH" docker load -i "$TAR_PATH" else err "未找到镜像 $IMAGE_TAG,也未找到 tar: $TAR_PATH" err "请先从开发机上传 deploy/yubao-app-image.tar" exit 1 fi cd "$ROOT_DIR" compose=(docker compose --env-file "$ENV_FILE" -f "$COMPOSE_FILE") log "启动 web + worker(不编译)…" "${compose[@]}" up -d log "同步数据库结构…" "${compose[@]}" run --rm --no-deps web pnpm exec prisma db push --skip-generate log "同步默认账号…" "${compose[@]}" run --rm --no-deps web pnpm db:seed || true "${compose[@]}" ps APP_PORT="$(grep -E '^APP_PORT=' "$ENV_FILE" | tail -1 | cut -d= -f2- | tr -d '\r' || echo 30327)" PUBLIC_HOST="$(grep -E '^PUBLIC_HOST=' "$ENV_FILE" | tail -1 | cut -d= -f2- | tr -d '\r' || echo 127.0.0.1)" log "完成 → http://${PUBLIC_HOST}:${APP_PORT}/login" warn "更新版本:开发机重新 build-image-local.ps1 → 上传新 tar → bash deploy/update-prebuilt-image.sh"