chore(deploy): add same-host staging stack next to production
dev deploys to /opt/dukang-staging (819x, *-test domains); main deploys to production. Staging uses full Mock with shared WeChat app ids. Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
+32
-10
@@ -1,6 +1,6 @@
|
||||
#!/usr/bin/env bash
|
||||
# 同步 API 生产环境变量到服务器 .env.production
|
||||
# 用法: deploy/sync-api-env.sh [production]
|
||||
# 同步 API 环境变量到服务器
|
||||
# 用法: deploy/sync-api-env.sh staging|production
|
||||
set -euo pipefail
|
||||
|
||||
SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
|
||||
@@ -12,16 +12,31 @@ DEPLOY_USER="root"
|
||||
DEPLOY_PORT="22"
|
||||
DEPLOY_SSH_KEY=""
|
||||
APP_ROOT="/opt/dukang"
|
||||
STAGING_APP_ROOT="/opt/dukang-staging"
|
||||
PROD_APP_ROOT="/opt/dukang"
|
||||
|
||||
TARGET="${1:-production}"
|
||||
TARGET="${1:-}"
|
||||
case "$TARGET" in
|
||||
production|prod) SRC_ENV="$REPO_ROOT/server/dukang-api/.env.production" ;;
|
||||
staging|stage|test)
|
||||
TARGET=staging
|
||||
SRC_ENV="$REPO_ROOT/server/dukang-api/.env.staging"
|
||||
REMOTE_NAME=".env.staging"
|
||||
PM2_NAME=dukang-stg-api
|
||||
HEALTH_PORT=8190
|
||||
;;
|
||||
production|prod)
|
||||
TARGET=production
|
||||
SRC_ENV="$REPO_ROOT/server/dukang-api/.env.production"
|
||||
REMOTE_NAME=".env.production"
|
||||
PM2_NAME=dukang-api
|
||||
HEALTH_PORT=8090
|
||||
;;
|
||||
development|dev)
|
||||
echo "错误: development 仅用于本地开发,请使用 .env / .env.development,不同步到服务器" >&2
|
||||
echo "错误: development 仅用于本地开发,请使用 .env,不同步到服务器" >&2
|
||||
exit 1
|
||||
;;
|
||||
*)
|
||||
echo "用法: $0 [production]" >&2
|
||||
echo "用法: $0 staging|production" >&2
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
@@ -31,8 +46,14 @@ if [[ -f "$ENV_FILE" ]]; then
|
||||
source "$ENV_FILE"
|
||||
fi
|
||||
|
||||
if [[ "$TARGET" == "staging" ]]; then
|
||||
APP_ROOT="${STAGING_APP_ROOT:-/opt/dukang-staging}"
|
||||
else
|
||||
APP_ROOT="${PROD_APP_ROOT:-/opt/dukang}"
|
||||
fi
|
||||
|
||||
if [[ ! -f "$SRC_ENV" ]]; then
|
||||
echo "错误: 未找到 $SRC_ENV(可从 .env.production.example 复制)" >&2
|
||||
echo "错误: 未找到 $SRC_ENV(可从 ${SRC_ENV}.example 复制)" >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
@@ -46,7 +67,8 @@ SCP_OPTS=(-o "StrictHostKeyChecking=accept-new" -P "$DEPLOY_PORT")
|
||||
[[ -n "$DEPLOY_SSH_KEY" ]] && SSH_OPTS+=(-i "$DEPLOY_SSH_KEY") && SCP_OPTS+=(-i "$DEPLOY_SSH_KEY")
|
||||
REMOTE="${DEPLOY_USER}@${DEPLOY_HOST}"
|
||||
|
||||
echo "==> 同步 production 环境到 $REMOTE:$APP_ROOT/server/dukang-api/.env.production"
|
||||
scp "${SCP_OPTS[@]}" "$SRC_ENV" "$REMOTE:$APP_ROOT/server/dukang-api/.env.production"
|
||||
ssh "${SSH_OPTS[@]}" "$REMOTE" "pm2 restart dukang-api && sleep 2 && curl -sf -o /dev/null -w 'api-health:%{http_code}\n' http://127.0.0.1:8090/api/v1/health"
|
||||
echo "==> 同步 $TARGET 环境到 $REMOTE:$APP_ROOT/server/dukang-api/$REMOTE_NAME"
|
||||
scp "${SCP_OPTS[@]}" "$SRC_ENV" "$REMOTE:$APP_ROOT/server/dukang-api/$REMOTE_NAME"
|
||||
ssh "${SSH_OPTS[@]}" "$REMOTE" \
|
||||
"pm2 restart $PM2_NAME && sleep 2 && curl -sf -o /dev/null -w 'api-health:%{http_code}\n' http://127.0.0.1:${HEALTH_PORT}/api/v1/health"
|
||||
echo "==> 完成"
|
||||
|
||||
Reference in New Issue
Block a user