Files
app-api/scripts/deploy.sh
T
2026-06-30 13:50:29 +08:00

134 lines
3.6 KiB
Bash
Executable File
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#!/usr/bin/env bash
set -euo pipefail
REMOTE_DIR="/data/project/app-api"
show_help() {
cat <<'EOF'
用法: deploy.sh [选项] [服务器]
本地交叉编译后上传二进制到服务器。
选项:
-a 同时上传 Dockerfile 和 docker-compose.yml
-r 上传后 SSH 到服务器执行 docker compose up -d --build 重启容器
-s 跳过编译,直接使用已编译好的 bin/server-linux
-n 虚拟执行,不实际传输文件
-h, --help 显示此帮助信息
服务器:
api1 仅部署到 api1 (luxsin-api1)
api2 仅部署到 api2 (luxsin-api2)
(省略) 同时部署到 api1 和 api2
默认行为:
1. 本地执行 make build-linux 交叉编译
2. 上传编译好的二进制到服务器
示例:
deploy.sh 编译并上传二进制到 api1 和 api2
deploy.sh api1 编译并上传二进制到 api1
deploy.sh -s api1 跳过编译,直接上传已有二进制到 api1
deploy.sh -a api1 同时上传 Dockerfile + docker-compose.yml 到 api1
deploy.sh -r 编译、上传二进制并重启容器
deploy.sh -s -r api1 跳过编译,上传已有二进制并重启
deploy.sh -a -r api1 全量部署到 api1(含 Docker 文件 + 重启)
deploy.sh -n api1 虚拟执行,预览部署到 api1
EOF
}
remote_host_for() {
case "$1" in
api1) echo "luxsin-api1" ;;
api2) echo "luxsin-api2" ;;
*)
echo "未知服务器: $1(可选: api1, api2" >&2
exit 1
;;
esac
}
UPLOAD_ALL=false
RESTART=false
SKIP_BUILD=false
DRY_RUN=false
ARGS=()
for arg in "$@"; do
case "$arg" in
-a) UPLOAD_ALL=true ;;
-r) RESTART=true ;;
-s) SKIP_BUILD=true ;;
-n) DRY_RUN=true ;;
-h|--help)
show_help
exit 0
;;
*)
ARGS+=("$arg")
;;
esac
done
SERVERS=()
if [ ${#ARGS[@]} -gt 0 ] && { [ "${ARGS[0]}" = "api1" ] || [ "${ARGS[0]}" = "api2" ]; }; then
SERVERS=("${ARGS[0]}")
else
SERVERS=(api1 api2)
fi
if [ "$SKIP_BUILD" = true ]; then
echo "=== 跳过编译,使用已有二进制 ==="
if [ ! -f bin/server-linux ]; then
echo "错误: bin/server-linux 不存在,请先编译" >&2
exit 1
fi
echo " 文件: bin/server-linux ($(du -h bin/server-linux | cut -f1))"
else
echo "=== 本地编译 ==="
if [ "$DRY_RUN" = true ]; then
echo "(虚拟) make build-linux"
else
make build-linux
fi
fi
echo
rsync_opts=(-avz --progress)
if [ "$DRY_RUN" = true ]; then
rsync_opts+=(-n)
fi
for server in "${SERVERS[@]}"; do
remote_host="$(remote_host_for "$server")"
if [ "$DRY_RUN" = true ]; then
echo "=== 虚拟部署到 ${server} (${remote_host}) ==="
else
echo "=== 部署到 ${server} (${remote_host}) ==="
fi
echo " 上传二进制: bin/server-linux -> ${remote_host}:${REMOTE_DIR}/server"
rsync "${rsync_opts[@]}" bin/server-linux "${remote_host}:${REMOTE_DIR}/server"
if [ "$UPLOAD_ALL" = true ]; then
echo " 上传 Dockerfile -> ${remote_host}:${REMOTE_DIR}/Dockerfile"
rsync "${rsync_opts[@]}" Dockerfile "${remote_host}:${REMOTE_DIR}/Dockerfile"
echo " 上传 docker-compose.yml -> ${remote_host}:${REMOTE_DIR}/docker-compose.yml"
rsync "${rsync_opts[@]}" docker-compose.yml "${remote_host}:${REMOTE_DIR}/docker-compose.yml"
fi
if [ "$RESTART" = true ]; then
if [ "$DRY_RUN" = true ]; then
echo " (虚拟) SSH 重启容器: docker compose up -d --build"
else
echo " SSH 重启容器 ..."
ssh "$remote_host" "cd ${REMOTE_DIR} && docker compose up -d --build"
fi
fi
echo
done
echo "完成。"