#!/bin/bash set -e # ========== 配置 ========== PROJECT_DIR=$(cd "$(dirname "$0")" && pwd) VERSION='1.2.1' ENV='dev' MODULE='aitori-bi-v2' REGISTRY='registry.cn-shenzhen.aliyuncs.com/bantbox' REMOTE_DEV="root@192.168.0.155" REMOTE_TEST="root@34.146.228.227" REMOTE_PRO="root@34.146.222.45" # ========== 函数 ========== usage() { echo "" echo "Usage:" echo " $0 [-e env] [-v version] [-h]" echo "" echo "Options:" echo " -e 部署环境 (dev/test/pro),默认: dev" echo " -v 镜像版本号,默认: 1.2.1" echo " -h 显示帮助" echo "" } docker_login() { echo "[+] Docker login..." docker login --username=arche@1030463161912241 --password=bantbox@2021 registry.cn-shenzhen.aliyuncs.com } build_image() { local IMAGE_TAG="${REGISTRY}/${MODULE}:${VERSION}-${ENV}" echo "[+] ================================" echo "[+] 开始构建镜像..." echo "[+] 环境: ${ENV}" echo "[+] 版本: ${VERSION}" echo "[+] 镜像: ${IMAGE_TAG}" echo "[+] ================================" cd "$PROJECT_DIR" docker build \ --build-arg ACTIVE_ENV="${ENV}" \ -t "${MODULE}:${VERSION}" \ -t "${IMAGE_TAG}" \ . echo "[+] 推送镜像: ${IMAGE_TAG}" docker push "${IMAGE_TAG}" echo "[+] 构建完成" echo "[+] ================================" } restart_app() { local IMAGE_TAG="${REGISTRY}/${MODULE}:${VERSION}-${ENV}" local REMOTE="" local MEMORY_LIMIT="-m 2g" local MYSQL_HOST="" local MYSQL_PORT="3306" local MYSQL_DATABASE="aitori" local MYSQL_USERNAME="root" local MYSQL_PASSWORD="" local REDIS_HOST="" local REDIS_PORT="6379" local REDIS_PASSWORD="" local REDIS_DATABASE="1" case $ENV in dev) REMOTE=$REMOTE_DEV MYSQL_HOST="127.0.0.1" MYSQL_PASSWORD="" REDIS_HOST="127.0.0.1" REDIS_PASSWORD="" ;; test) REMOTE=$REMOTE_TEST MYSQL_HOST="10.146.0.2" MYSQL_PASSWORD='mysql@aitori!@#' REDIS_HOST="10.146.0.2" REDIS_PASSWORD='redis@aitori!@#' ;; pro) REMOTE=$REMOTE_PRO MEMORY_LIMIT="" MYSQL_HOST="35.189.132.138" MYSQL_PASSWORD='mysql@aitori!@#' REDIS_HOST="10.146.0.3" REDIS_PASSWORD='redis@aitori!@#' ;; *) echo "[-] 未知环境: $ENV" exit 1 ;; esac echo "[+] ================================" echo "[+] 重启远程服务: ${REMOTE}" echo "[+] MySQL: ${MYSQL_HOST}:${MYSQL_PORT}/${MYSQL_DATABASE}" echo "[+] Redis: ${REDIS_HOST}:${REDIS_PORT} db=${REDIS_DATABASE}" echo "[+] ================================" ssh "$REMOTE" << EEOOFF set -e echo "[remote] 停止旧容器..." docker rm -f ${MODULE} || true echo "[remote] 拉取新镜像..." docker pull ${IMAGE_TAG} echo "[remote] 启动新容器..." docker run -d \ --name ${MODULE} \ --restart always \ ${MEMORY_LIMIT} \ -p 9901:8080 \ -p 9902:8090 \ --volume /etc/localtime:/etc/localtime \ -v /logs:/logs \ -v /data/www/file/:/data/www/file/ \ -v /usr/share/fonts/:/usr/share/fonts/ \ -e ACTIVE_ENV=${ENV} \ -e MYSQL_HOST=${MYSQL_HOST} \ -e MYSQL_PROT=${MYSQL_PORT} \ -e MYSQL_DATABASE=${MYSQL_DATABASE} \ -e MYSQL_USERNAME=${MYSQL_USERNAME} \ -e MYSQL_PASSWORD='${MYSQL_PASSWORD}' \ -e REDIS_HOST=${REDIS_HOST} \ -e REDIS_PORT=${REDIS_PORT} \ -e REDIS_PASSWORD='${REDIS_PASSWORD}' \ -e REDIS_DATABASE=${REDIS_DATABASE} \ -e ACTIVE_ENV=${ENV} \ --privileged=true \ ${IMAGE_TAG} echo "[remote] 容器已启动" docker ps --filter "name=${MODULE}" --format "table {{.ID}}\t{{.Image}}\t{{.Status}}" EEOOFF echo "[+] 远程部署完成" echo "[+] ================================" } # ========== 解析参数 ========== while getopts "e:v:h" arg; do case $arg in e) ENV=$OPTARG echo "[+] 部署环境: $ENV" ;; v) VERSION=$OPTARG echo "[+] 镜像版本: $VERSION" ;; h) usage exit 0 ;; *) usage exit 1 ;; esac done # ========== 执行 ========== docker_login build_image restart_app