You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
76 lines
4.8 KiB
76 lines
4.8 KiB
#!/usr/bin/env bash
|
|
# voitrans 开发环境:构建开发镜像 → 推送 → 远端拉取重启。
|
|
#
|
|
# 业务五服务(gateway/home/api/mcp/timer)打成单镜像 voitrans-a11,推到私有仓库后远端拉取重启。
|
|
# 仅做镜像部署:服务器上的 docker-compose.yml / .env / confs/ 由你自行维护
|
|
# (照着仓库里的 env/env.example、confs/*.yaml.example 在服务器上放好真实文件),本脚本不上传任何配置。
|
|
#
|
|
# 用法(在 deploy/voitrans/ 下):
|
|
# ./dev-deploy.sh # 构建并发布 voitrans-a11:dev-latest
|
|
#
|
|
# 开发版镜像始终使用固定 tag dev-latest(不接受参数覆盖),每次构建覆盖同一 tag。
|
|
set -euo pipefail
|
|
|
|
SVC_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" # deploy/voitrans
|
|
REPO_ROOT="$(cd "$SVC_DIR/../.." && pwd)" # 仓库根
|
|
BUILD_CONTEXT="$REPO_ROOT/apps/services" # Go 构建上下文
|
|
DOCKERFILE="$BUILD_CONTEXT/Dockerfile.voitrans"
|
|
|
|
blue() { printf "\033[34m%s\033[0m\n" "$*"; }
|
|
green() { printf "\033[32m%s\033[0m\n" "$*"; }
|
|
red() { printf "\033[31m%s\033[0m\n" "$*"; }
|
|
|
|
# ╔══════════════════════════════════════════════════════════════════════╗
|
|
# ║ 开发部署目标 / 私有仓库凭据 —— 写死在此(本文件纳入 git,私有仓库内可接受) ║
|
|
# ║ ⚠️ 公开仓库前务必清空 DEV_HOST / REGISTRY_PASS ║
|
|
# ╚══════════════════════════════════════════════════════════════════════╝
|
|
IMAGE_NAME="voitrans-a11" # 业务单镜像名
|
|
REGISTRY="docker-registry.ideapsound.com" # 私有镜像仓库
|
|
REGISTRY_USER="admin" # 仓库账号
|
|
REGISTRY_PASS="li13451234" # 仓库密码
|
|
|
|
DEV_HOST="124.222.232.218" # ← 开发服务器 IP(必填)
|
|
DEV_PORT=22
|
|
DEV_USER=root
|
|
DEV_KEY=/Users/liwei/Documents/key/earphone.pem # 本机访问开发服务器的 SSH 私钥
|
|
DEV_DIR="/home/work/voitrans-a11" # 远端部署目录(其中 docker-compose.yml/.env/confs 由你自己维护)
|
|
|
|
PLATFORM="${PLATFORM:-linux/amd64}"
|
|
TAG="dev-latest" # 开发版固定 tag,每次构建覆盖同一 dev-latest
|
|
FULL_IMAGE="$REGISTRY/$IMAGE_NAME:$TAG"
|
|
|
|
[ -f "$DOCKERFILE" ] || { red "✗ 缺少 $DOCKERFILE"; exit 1; }
|
|
: "${DEV_HOST:?请在 dev-deploy.sh 顶部填 DEV_HOST(开发服务器 IP)}"
|
|
|
|
# ── 远程 SSH ──
|
|
_ssh() { ssh -p "$DEV_PORT" -i "${DEV_KEY/#\~/$HOME}" -o StrictHostKeyChecking=accept-new "$DEV_USER@$DEV_HOST" "$@"; }
|
|
_scp() { scp -P "$DEV_PORT" -i "${DEV_KEY/#\~/$HOME}" -o StrictHostKeyChecking=accept-new "$@"; }
|
|
_dest() { echo "$DEV_USER@$DEV_HOST:$1"; }
|
|
|
|
# 1) 构建并推送镜像
|
|
blue ">>> 构建镜像 $FULL_IMAGE (context=$BUILD_CONTEXT)"
|
|
echo "$REGISTRY_PASS" | docker login "$REGISTRY" -u "$REGISTRY_USER" --password-stdin
|
|
docker build --network=host --platform "$PLATFORM" -f "$DOCKERFILE" -t "$FULL_IMAGE" "$BUILD_CONTEXT"
|
|
docker push "$FULL_IMAGE"
|
|
|
|
# 2) 同步「模板 + compose」到服务器(只传模板,绝不覆盖你维护的真实 .env / confs/*.yaml)
|
|
blue ">>> 同步模板与 compose → $DEV_USER@$DEV_HOST:$DEV_DIR"
|
|
_ssh "mkdir -p '$DEV_DIR/confs' '$DEV_DIR/log'"
|
|
_scp "$SVC_DIR/docker-compose.yml" "$(_dest "$DEV_DIR/docker-compose.yml")"
|
|
_scp "$SVC_DIR"/confs/*.yaml.example "$(_dest "$DEV_DIR/confs/")"
|
|
_scp "$SVC_DIR/env/env.example" "$(_dest "$DEV_DIR/env.example")"
|
|
|
|
# 3) 远端拉取并重启(用你在服务器维护的真实 .env / confs/*.yaml)
|
|
# REGISTRY/TAG 通过 inline 环境变量传给 compose(优先级高于 --env-file),确保拉到本次镜像。
|
|
blue ">>> 远端拉取并重启"
|
|
_ssh "echo '$REGISTRY_PASS' | docker login '$REGISTRY' -u '$REGISTRY_USER' --password-stdin >/dev/null"
|
|
_ssh "docker network inspect 1panel-network >/dev/null 2>&1 || docker network create 1panel-network"
|
|
if ! _ssh "test -f '$DEV_DIR/.env' && test -f '$DEV_DIR/confs/gateway.yaml'"; then
|
|
red "⚠ 服务器缺少真实 .env 或 confs/*.yaml —— 模板已同步,请登录服务器按模板填好后重跑本脚本:"
|
|
echo " ssh -i $DEV_KEY $DEV_USER@$DEV_HOST"
|
|
echo " cd $DEV_DIR && cp env.example .env # 再把 confs/*.yaml.example 各自复制为 confs/*.yaml 并填真实值"
|
|
exit 0
|
|
fi
|
|
_ssh "cd '$DEV_DIR' && REGISTRY='$REGISTRY' TAG='$TAG' docker compose --env-file .env pull && REGISTRY='$REGISTRY' TAG='$TAG' docker compose --env-file .env up -d --force-recreate && docker image prune -f"
|
|
|
|
green "✓ voitrans dev 已发布: $FULL_IMAGE → $DEV_HOST:$DEV_DIR"
|
|
|