deploy: 本地预构建发布(push-build),对齐 1Panel 与 backend_v2 目录
- 新增 Dockerfile.prebuilt / scripts/push-build.sh:本机构建、只上传产物,服务器零编译 - deploy.sh 增加 --prebuilt(自动 --no-pull + 产物校验),并保留 --no-cache - compose 支持 BACKEND_DOCKERFILE / WEB_DOCKERFILE 切换;预构建时用 prebuilt 变体 - init-db.sh / scripts/backup-db.sh 改为 docker exec 1Panel 的 Postgres 容器 - WEB_DIR 默认改为 ../frontend_v2;nginx 切换文件改到 .deploy/ 避免弄脏工作区 - 新增 .gitattributes 固定脚本与配置为 LF
This commit is contained in:
40
deploy.sh
40
deploy.sh
@ -8,6 +8,7 @@
|
||||
# ./deploy.sh all --no-pull 用服务器上现有代码构建
|
||||
# ./deploy.sh web --no-cache 强制不用构建缓存(前端 SSG 依赖后端数据,数据变了要强制重建)
|
||||
# ./deploy.sh --prune 只清理旧镜像(保留最近 KEEP_IMAGES 个,默认 5)
|
||||
# ./deploy.sh all --prebuilt 用已上传的预构建产物(不拉代码、不在容器内编译)
|
||||
# GIT_BRANCH=dev ./deploy.sh all 临时指定分支(优先于 .env)
|
||||
#
|
||||
# 每次发布生成 RELEASE=<时间戳>-<后端提交号>,镜像以此打标签(不可变,不覆盖历史)。
|
||||
@ -19,6 +20,7 @@ TARGET="backend"
|
||||
NO_PULL=0
|
||||
NO_CACHE=0
|
||||
PRUNE_ONLY=0
|
||||
PREBUILT=0
|
||||
for arg in "$@"; do
|
||||
case "$arg" in
|
||||
backend|web|all) TARGET="$arg" ;;
|
||||
@ -26,7 +28,8 @@ for arg in "$@"; do
|
||||
--no-pull) NO_PULL=1 ;;
|
||||
--no-cache) NO_CACHE=1 ;;
|
||||
--prune) PRUNE_ONLY=1 ;;
|
||||
*) echo "用法: ./deploy.sh [backend|web|all|--rollback|--prune] [--no-pull] [--no-cache]"; exit 1 ;;
|
||||
--prebuilt) PREBUILT=1 ;;
|
||||
*) echo "用法: ./deploy.sh [backend|web|all|--rollback|--prune] [--no-pull] [--no-cache] [--prebuilt]"; exit 1 ;;
|
||||
esac
|
||||
done
|
||||
|
||||
@ -38,7 +41,7 @@ set -a; . ./.env; set +a
|
||||
[ -n "$CLI_GIT_BRANCH" ] && GIT_BRANCH="$CLI_GIT_BRANCH"
|
||||
GIT_BRANCH="${GIT_BRANCH:-main}"
|
||||
KEEP_IMAGES="${KEEP_IMAGES:-5}"
|
||||
WEB_DIR="${WEB_DIR:-../test}"
|
||||
WEB_DIR="${WEB_DIR:-../frontend_v2}"
|
||||
|
||||
STATE_DIR=".deploy"
|
||||
ACTIVE_CONF="$STATE_DIR/nginx/active.conf"
|
||||
@ -201,12 +204,45 @@ prune_images() {
|
||||
done
|
||||
}
|
||||
|
||||
# ---- 预构建产物校验 ----
|
||||
# 本地构建 + 上传的路径:镜像只负责打包,不在服务器上编译。
|
||||
# 同时强制 --no-pull:代码已在本地构建完毕,服务器仓库不需要(也不应该)再更新。
|
||||
use_prebuilt() {
|
||||
PREBUILT=1
|
||||
NO_PULL=1
|
||||
export BACKEND_DOCKERFILE=Dockerfile.prebuilt
|
||||
export WEB_DOCKERFILE=Dockerfile.prebuilt
|
||||
echo "==> 使用预构建产物(不在服务器编译)"
|
||||
case "$TARGET" in
|
||||
backend|all)
|
||||
[ -f server-linux-amd64 ] || {
|
||||
echo "!! 缺少 server-linux-amd64:先在本机执行 scripts/push-build.sh"
|
||||
exit 1
|
||||
}
|
||||
echo " 后端二进制:$(du -h server-linux-amd64 | cut -f1)"
|
||||
;;
|
||||
esac
|
||||
case "$TARGET" in
|
||||
web|all)
|
||||
[ -f "$WEB_DIR/dist/server/entry.mjs" ] || {
|
||||
echo "!! 缺少 $WEB_DIR/dist/server/entry.mjs:前端还没构建或没上传"
|
||||
exit 1
|
||||
}
|
||||
echo " 前端产物:$WEB_DIR/dist"
|
||||
;;
|
||||
esac
|
||||
}
|
||||
|
||||
# ---- 主流程 ----
|
||||
if [ "$PRUNE_ONLY" = "1" ]; then
|
||||
prune_images
|
||||
exit 0
|
||||
fi
|
||||
|
||||
if [ "$PREBUILT" = "1" ] && [ "$TARGET" != "rollback" ]; then
|
||||
use_prebuilt
|
||||
fi
|
||||
|
||||
if [ "$TARGET" != "rollback" ]; then
|
||||
export RELEASE="${RELEASE:-$(new_release)}"
|
||||
echo "==> 发布号 $RELEASE"
|
||||
|
||||
Reference in New Issue
Block a user