feat(deploy): rebuild Next.js container after dist upload
Hybrid rendering requires the Next.js runtime to use the same build as the client assets served by Nginx. After uploading dist, sync public/ to the server project and rebuild/restart the novalon-website container so server action IDs and /_next/static references stay consistent.
This commit is contained in:
@@ -29,6 +29,7 @@
|
|||||||
#
|
#
|
||||||
# 环境变量覆盖:
|
# 环境变量覆盖:
|
||||||
# SERVER_IP SERVER_USER DEPLOY_ROOT PROJECT_NAME NGINX_CONTAINER
|
# SERVER_IP SERVER_USER DEPLOY_ROOT PROJECT_NAME NGINX_CONTAINER
|
||||||
|
# NEXTJS_CONTAINER COMPOSE_FILE COMPOSE_CMD
|
||||||
# DOMAIN BACKUP_RETENTION_COUNT DIST_DIR
|
# DOMAIN BACKUP_RETENTION_COUNT DIST_DIR
|
||||||
# ============================================================
|
# ============================================================
|
||||||
|
|
||||||
@@ -40,6 +41,9 @@ SERVER_USER="${SERVER_USER:-root}"
|
|||||||
DEPLOY_ROOT="${DEPLOY_ROOT:-/home/novalon/docker-app}"
|
DEPLOY_ROOT="${DEPLOY_ROOT:-/home/novalon/docker-app}"
|
||||||
PROJECT_NAME="${PROJECT_NAME:-novalon-website}"
|
PROJECT_NAME="${PROJECT_NAME:-novalon-website}"
|
||||||
NGINX_CONTAINER="${NGINX_CONTAINER:-novalon-nginx-secure}"
|
NGINX_CONTAINER="${NGINX_CONTAINER:-novalon-nginx-secure}"
|
||||||
|
NEXTJS_CONTAINER="${NEXTJS_CONTAINER:-novalon-website}"
|
||||||
|
COMPOSE_FILE="${COMPOSE_FILE:-docker-compose.server.yml}"
|
||||||
|
COMPOSE_CMD="${COMPOSE_CMD:-docker-compose}"
|
||||||
DOMAIN="${DOMAIN:-https://novalon.cn}"
|
DOMAIN="${DOMAIN:-https://novalon.cn}"
|
||||||
BACKUP_RETENTION="${BACKUP_RETENTION_COUNT:-${BACKUP_RETENTION:-3}}"
|
BACKUP_RETENTION="${BACKUP_RETENTION_COUNT:-${BACKUP_RETENTION:-3}}"
|
||||||
DIST_DIR="${DIST_DIR:-dist}"
|
DIST_DIR="${DIST_DIR:-dist}"
|
||||||
@@ -252,6 +256,30 @@ cmd_deploy() {
|
|||||||
fi
|
fi
|
||||||
"
|
"
|
||||||
|
|
||||||
|
# 步骤 6.5: 同步 public 并重建 Next.js 容器
|
||||||
|
# 混合渲染下,Nginx 提供新客户端资源,Next.js 容器也必须运行同一份构建,
|
||||||
|
# 否则会出现 /_next/static 404 或 Server Reference ID 不匹配。
|
||||||
|
log ""
|
||||||
|
log "📋 步骤 6.5: 重建 Next.js 容器 ($NEXTJS_CONTAINER)"
|
||||||
|
if [[ -d "$PROJECT_ROOT/public" ]]; then
|
||||||
|
if [[ "$DRY_RUN" == "1" ]]; then
|
||||||
|
log "🔍 [dry-run] rsync -az --delete \"$PROJECT_ROOT/public/\" $SERVER_USER@$SERVER_IP:$REMOTE_PROJECT_DIR/public/"
|
||||||
|
else
|
||||||
|
rsync -az --delete "$PROJECT_ROOT/public/" "$SERVER_USER@$SERVER_IP:$REMOTE_PROJECT_DIR/public/"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
run_remote "
|
||||||
|
set -e
|
||||||
|
cd '$REMOTE_PROJECT_DIR'
|
||||||
|
if [ -f '$COMPOSE_FILE' ]; then
|
||||||
|
$COMPOSE_CMD -f '$COMPOSE_FILE' build
|
||||||
|
$COMPOSE_CMD -f '$COMPOSE_FILE' up -d
|
||||||
|
echo \"✅ Next.js 容器已重建\"
|
||||||
|
else
|
||||||
|
echo \"⚠️ 未找到 $COMPOSE_FILE,跳过 Next.js 容器重建\"
|
||||||
|
fi
|
||||||
|
"
|
||||||
|
|
||||||
# 步骤 7: 验证生产环境
|
# 步骤 7: 验证生产环境
|
||||||
if ! verify_remote; then
|
if ! verify_remote; then
|
||||||
if [[ "$AUTO_ROLLBACK" == "1" ]]; then
|
if [[ "$AUTO_ROLLBACK" == "1" ]]; then
|
||||||
|
|||||||
Reference in New Issue
Block a user