From 34981c30a78e8bbd7791131059a9210f9928b62c Mon Sep 17 00:00:00 2001
From: 刘光辉 <347230014@qq.com>
Date: 星期四, 17 九月 2026 09:24:09 +0800
Subject: [PATCH] Merge remote-tracking branch 'origin/master' into master

---
 docker/postgres/tencent/add-customer.sh |  114 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 114 insertions(+), 0 deletions(-)

diff --git a/docker/postgres/tencent/add-customer.sh b/docker/postgres/tencent/add-customer.sh
new file mode 100644
index 0000000..da14839
--- /dev/null
+++ b/docker/postgres/tencent/add-customer.sh
@@ -0,0 +1,114 @@
+#!/usr/bin/env bash
+# 鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�
+# 寮�涓�涓鎴风殑 PG 瀹炰緥锛坉ocs/adr-multi-customer-db-isolation.md 搂8锛夈��
+#
+# 鍙槸鎶婂洓涓�愬凡鏈変笖閮芥敮鎸� CONTAINER 鍙傛暟銆戠殑鑴氭湰涓茶捣鏉ワ紝鏈韩涓嶅惈浠讳綍寤哄簱閫昏緫锛�
+#   compose up 鈫� install.sh锛堝缓鍥涘簱+schema锛夆啋 create-app-roles.sh锛堣鑹�+閰嶉锛�
+#   鈫� harden-pg-hba.sh锛坧ostgres 瓒呮埛绂佸叕缃戯級
+# 骞傜瓑锛氬鍣ㄥ凡鍦ㄨ窇浼氳烦杩囬噸寤猴紱install.sh 瀵归潪绌哄簱浼氳嚜宸辨嫆缁濓紙闄ら潪 FORCE_RESEED=1锛夈��
+#
+# 鐢ㄦ硶锛堝湪 /home/ubuntu/jnpf-pg/ 鎴栦粨搴撴牴锛夈�傚鎴� ID 鐩存帴鐢ㄣ�愬鎴锋嫾闊炽�戯紙2026-08-08 鍛藉悕瑙勮寖锛�
+# 瀹瑰櫒鍚� cx-pg-<鎷奸煶>锛屼竴鐪煎彲杈ㄥ鎴凤紱c2 鏄鎴稡鐨勫巻鍙� ID锛屽叾瀹瑰櫒鍚嶉潬 CUSTOMER_NAME 瀵归綈鎷奸煶锛夛細
+#   ./postgres/tencent/add-customer.sh customer22 15434
+#   ./postgres/tencent/add-customer.sh tpl     15439
+#
+# 鍑嵁鏂囦欢锛氭瘡涓鎴枫�愪竴浠借嚜宸辩殑銆戯紝鐢� ENV_FILE 鎸囧畾锛堝己鐑堝缓璁紝瑙佷笅锛夛細
+#   ENV_FILE=/home/ubuntu/jnpf-pg/.env.鏌愬鎴� ./postgres/tencent/add-customer.sh customer22 15434
+# 涓嶆寚瀹氬垯鍥為��鍒板叡浜殑 .env銆�
+#
+# 鈿狅笍 涓轰粈涔堣姣忓鎴蜂竴浠斤細瀵嗙爜涓庤繛鎺ラ厤棰濇槸銆愭寜瀹炰緥銆戜笉鍚岀殑锛岃�� create-app-roles.sh 浼氭寜鍑嵁
+#    鏂囦欢銆愰噸缃�戣鑹插瘑鐮併�傚叡鐢ㄤ竴浠� .env 灏卞彧鑳�"涓存椂鏀� 鈫� 璺� 鈫� 璁板緱鏀瑰洖鏉�"锛屾紡鏀逛竴娆″氨浼氬湪
+#    涓嬫瀵瑰埆鐨勫疄渚嬭窇鏈剼鏈椂锛屾妸閭d釜瀹㈡埛鐨勫瘑鐮佹敼鎴愯繖涓鎴风殑銆侲NV_FILE 璁╄繖绫讳簨鏁呬笉鍙兘鍙戠敓銆�
+#
+# 璇ユ枃浠堕渶瑕佺殑閿紙鐓� .env.example 鎶勶紝瀵嗙爜鎹㈡垚鏈鎴风嫭鏈夌殑锛夛細
+#   JNPF_PG_PASSWORD                                   瓒呮埛瀵嗙爜
+#   JNPF_APP_DB_PASSWORD / JNPF_FLOW_DB_PASSWORD / JNPF_NACOS_DB_PASSWORD
+#   JNPF_APP_CONN_LIMIT=120 / JNPF_FLOW_CONN_LIMIT=20 / JNPF_NACOS_CONN_LIMIT=5
+#     锛堝搴旀湰瀹炰緥 max_connections=150锛屽拰 145 < 147锛�
+#
+# 鍙﹂渶锛氳浠庡缃戣繛鏃讹紝浜戝畨鍏ㄧ粍宸叉斁琛岃绔彛锛堥檺鏉ユ簮 IP锛屽埆寮� 0.0.0.0/0锛夈��
+#
+# 鏈剼鏈�愪笉鍋氥�戠亴浜у搧鍩虹嚎鈥斺�旈偅瑕佷汉鍒ゆ柇娲楀摢浜涙暟鎹紝瑙� ADR 搂8 绗� 6 姝ャ��
+# 鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�
+set -euo pipefail
+
+CUSTOMER_ID="${1:-}"
+CUSTOMER_PG_PORT="${2:-}"
+[ -n "$CUSTOMER_ID" ] && [ -n "$CUSTOMER_PG_PORT" ] || {
+  echo "鐢ㄦ硶锛歛dd-customer.sh <瀹㈡埛ID锛屽 c2/c3/tpl> <绔彛锛屽鎴種=15431+N锛屾瘝鐗�=15439>" >&2
+  exit 1
+}
+
+log() { printf '\033[1;34m[add-customer]\033[0m %s\n' "$*"; }
+die() { printf '\033[1;31m[add-customer][err]\033[0m %s\n' "$*" >&2; exit 1; }
+
+case "$CUSTOMER_ID" in
+  ''|*[!a-z0-9]*) die "瀹㈡埛ID 鍙厑璁稿皬鍐欏瓧姣嶄笌鏁板瓧锛堝綋鍓� '$CUSTOMER_ID'锛夛紝瀹冧細鎴愪负瀹瑰櫒鍚嶄笌鍗峰悕鐨勪竴閮ㄥ垎";;
+esac
+case "$CUSTOMER_PG_PORT" in
+  ''|*[!0-9]*) die "绔彛蹇呴』鏄暣鏁帮紙褰撳墠 '$CUSTOMER_PG_PORT'锛�";;
+esac
+
+SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
+PG_DIR="$(dirname "$SCRIPT_DIR")"          # .../postgres
+CONTAINER="cx-pg-${CUSTOMER_ID}"
+
+# 鎶ゆ爮锛氱粷涓嶅厑璁告湰鑴氭湰纰板鎴�1 鐨勬棦鏈夊疄渚嬶紙cx-postgres:15432锛岀紪鎺�/鍐呭瓨/杩炴帴鏁伴兘涓嶅悓锛�
+# 涓� create-app-roles.sh 浼氭寜褰撳墠 .env 閲嶇疆瑙掕壊瀵嗙爜鈥斺�旇窇閿欏疄渚嬪氨鏀归敊浜嗗鎴�1 鐨勫瘑鐮侊級銆�
+# 鍒ゆ嵁鐢ㄣ�愮鍙c�戣�屼笉鏄鍣ㄥ悕锛氬鍣ㄥ悕鎭掍负 cx-pg-<id>锛屾案杩滀笉鍙兘绛変簬 cx-postgres锛岄偅绉嶆鏌ユ槸姝讳唬鐮併��
+[ "$CUSTOMER_PG_PORT" = "15432" ] && die "15432 鏄鎴�1 鏃㈡湁瀹炰緥 cx-postgres 鐨勭鍙o紝鏈剼鏈笉寰楁搷浣滃畠锛堟柊瀹㈡埛鐢� 15431+N锛屾瘝鐗堢敤 15439锛�"
+if docker ps -a --format '{{.Names}}' 2>/dev/null | grep -qx "$CONTAINER"; then
+  log "瀹瑰櫒 ${CONTAINER} 宸插瓨鍦ㄢ�斺�旀寜骞傜瓑缁х画锛坈ompose up 涓嶄細閲嶅缓閰嶇疆鏈彉鐨勫鍣級"
+fi
+
+for f in "$SCRIPT_DIR/docker-compose.customer-pg.yml" \
+         "$PG_DIR/migration/install.sh" \
+         "$PG_DIR/migration/create-app-roles.sh" \
+         "$SCRIPT_DIR/harden-pg-hba.sh"; do
+  [ -f "$f" ] || die "缂� $f锛堝厛鎶婁粨搴撶殑 docker/postgres/ 鏁寸洰褰曞悓姝ヨ繃鏉ワ紝瑙� ADR 搂8锛�"
+done
+
+# 鍑嵁鏂囦欢锛欵NV_FILE 浼樺厛锛屽惁鍒欑敤鍏变韩 .env锛坈ompose 涓庡缓瑙掕壊鑴氭湰蹇呴』璇诲悓涓�浠斤紝
+# 鍚﹀垯瓒呮埛瀵嗙爜涓庝笟鍔¤鑹插瘑鐮佷細鏉ヨ嚜涓や釜鏉ユ簮锛�
+if [ -n "${ENV_FILE:-}" ]; then
+  [ -f "$ENV_FILE" ] || die "ENV_FILE 鎸囧畾鐨� $ENV_FILE 涓嶅瓨鍦�"
+  ENV_PATH="$(cd "$(dirname "$ENV_FILE")" && pwd)/$(basename "$ENV_FILE")"
+else
+  ENV_PATH=""; d="$SCRIPT_DIR"
+  while [ "$d" != "/" ]; do
+    [ -f "$d/.env" ] && { ENV_PATH="$d/.env"; break; }
+    d="$(dirname "$d")"
+  done
+  [ -n "$ENV_PATH" ] || die "鍚戜笂鏈壘鍒� .env锛屼笖鏈寚瀹� ENV_FILE"
+  log "鏈寚瀹� ENV_FILE锛屽洖閫�鍏变韩鍑嵁鏂囦欢 $ENV_PATH 鈥斺�� 澶氬鎴峰満鏅缓璁瘡瀹㈡埛涓�浠斤紝瑙佹枃浠跺ご璇存槑"
+fi
+log "鍑嵁鏂囦欢锛�$ENV_PATH"
+
+log "1/4 璧峰鍣� ${CONTAINER}锛堢鍙� ${CUSTOMER_PG_PORT}锛宮ax_connections=150锛宻hared_buffers=128MB锛�"
+CUSTOMER_ID="$CUSTOMER_ID" CUSTOMER_PG_PORT="$CUSTOMER_PG_PORT" \
+  docker compose --env-file "$ENV_PATH" \
+    -f "$SCRIPT_DIR/docker-compose.customer-pg.yml" up -d
+
+log "2/4 寤哄洓搴� + schema锛坕nstall.sh锛屽簱鍚嶄笌瀹㈡埛1 瀹屽叏涓�鑷达級"
+# 鐢� bash 鏄惧紡璋冪敤锛屼笉渚濊禆鏉冮檺浣嶁�斺�攔sync/tar/zip 浼犳挱杩囩▼涓墽琛屼綅寰堝鏄撲涪
+CONTAINER="$CONTAINER" bash "$PG_DIR/migration/install.sh"
+
+log "3/4 寤鸿鑹� + 杩炴帴閰嶉锛坈reate-app-roles.sh锛岃 ${ENV_PATH} 鐨勫瘑鐮佷笌 *_CONN_LIMIT锛�"
+CONTAINER="$CONTAINER" ENV_FILE="$ENV_PATH" bash "$PG_DIR/migration/create-app-roles.sh"
+
+log "4/4 鏀剁揣 pg_hba锛坧ostgres 瓒呮埛绂佹鍏綉鐧诲綍锛�"
+CONTAINER="$CONTAINER" bash "$SCRIPT_DIR/harden-pg-hba.sh"
+
+cat <<EOF
+
+$(printf '\033[1;32m鉁揬033[0m') ${CONTAINER} 灏辩华銆傚潗鏍� = <CVM鍏綉IP>:${CUSTOMER_PG_PORT}
+
+涓嬩竴姝ワ細
+  1. 鐏屼骇鍝佸熀绾匡細璧� cx-pg-template 鈫� DATABASES="jnpf_init jnpf_flow" promote-db.sh dump/restore
+     锛堝姟蹇呮樉寮忛檺瀹氳繖涓や釜搴擄紝榛樿鍊煎惈 nacos_config锛岄偅鏄幆澧冪鏈夌殑锛岃 ADR 搂3.5锛�
+  2. 璇ュ鎴峰悇鐜鐨� .env 濉細
+       CUSTOMER_DB_HOST=<CVM鍏綉IP>
+       CUSTOMER_DB_PORT=${CUSTOMER_PG_PORT}
+  3. 鏈鐢ㄧ殑鍑嵁鏂囦欢锛�${ENV_PATH}
+$(if [ -z "${ENV_FILE:-}" ]; then printf '     \033[1;33m鈿燶033[0m  鐢ㄧ殑鏄叡浜� .env鈥斺�旇嫢鍒氭墠涓烘湰瀹㈡埛鏀硅繃瀵嗙爜/閰嶉锛岀幇鍦ㄥ繀椤昏繕鍘熸垚瀹㈡埛1 鐨勫�硷紝\n        鍚﹀垯涓嬫瀵� cx-postgres 璺戝缓瑙掕壊鑴氭湰浼氭敼閿欏瘑鐮併�傛敼鐢� ENV_FILE=<姣忓鎴蜂竴浠�> 鍙牴闄よ繖涓闄┿��'; else printf '     \033[1;32m鉁揬033[0m  鐢ㄧ殑鏄瀹㈡埛涓撳睘鍑嵁鏂囦欢锛屾湭瑙︾鍏朵粬瀹㈡埛鐨� .env'; fi)
+EOF

--
Gitblit v1.8.0