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:
toom1996
2026-10-21 00:02:18 +08:00
parent 822dd69911
commit 2e76507d37
11 changed files with 308 additions and 25 deletions

View File

@ -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"