#!/usr/bin/env bash # 本地联调一键启动:pay(mock 渠道) + pangolin server + 官网 /buy 购买页。 # 仅本地测试用。密钥是 throwaway 值,勿用于生产,勿提交真值。 # # 端口(本机因 :8080 被 dudu 项目、:4321 被另一 astro 占用而错开): # pay :8090 (SERVER_PORT) # pangolin :8083 (ADDR) # 官网 :4321→自动顺延(实际看启动日志,本次是 :4322),用 http://localhost:PORT/buy/ # # 依赖:redis(本机已有 server-redis-1 容器在 :6379;没有就 `docker run -d -p 6379:6379 redis:7-alpine`) set -euo pipefail SECRET="localdev_pangolin_secret_2026" # 两侧共用的本地 throwaway HMAC 密钥 PAY_DIR="/Users/wangjia/code/pay" PG_DIR="/Users/wangjia/code/pangolin/.claude/worktrees/pay-v2-integration/server" WEB_DIR="/Users/wangjia/code/pangolin/.claude/worktrees/pay-v2-integration/web/website" DB="/tmp/pg-pangolin.db" JWT="/tmp/pg-jwt_priv.pem" LOGDIR="/tmp/pg-l13-logs"; mkdir -p "$LOGDIR" echo "== redis 探活 ==" redis_ok=$(docker exec server-redis-1 redis-cli ping 2>/dev/null || echo "") [ "$redis_ok" = "PONG" ] || { echo "redis 未就绪:请先 docker run -d -p 6379:6379 redis:7-alpine"; exit 1; } echo "== JWT 密钥 ==" [ -f "$JWT" ] || openssl genrsa -out "$JWT" 2048 echo "== pangolin sqlite 迁移 ==" ( cd "$PG_DIR" && DB_DRIVER=sqlite DB_DSN="$DB" go run ./cmd/migrate up ) echo "== 起 pay(:8090,mock 渠道,webhook tick 2s)==" ( cd "$PAY_DIR" && MOCK_CHANNEL_ENABLED=true SERVER_PORT=8090 WEBHOOK_TICK_SECONDS=2 \ BIZ_PANGOLIN_SECRET="$SECRET" go run . > "$LOGDIR/pay.log" 2>&1 & ) echo "== 起 pangolin(:8083,sqlite,接 pay :8090)==" ( cd "$PG_DIR" && DB_DRIVER=sqlite DB_DSN="$DB" ADDR=:8083 REDIS_ADDR=127.0.0.1:6379 \ JWT_PRIVATE_KEY_PATH="$JWT" JWT_KEY_ID=dev-1 \ PAY_BASE_URL=http://127.0.0.1:8090 PAY_BIZ_SECRET="$SECRET" PAY_BIZ_SYSTEM=pangolin \ go run ./cmd/server > "$LOGDIR/pangolin.log" 2>&1 & ) echo "== 起官网(astro dev,proxy /v1→:8083 /paydev→:8090)==" ( cd "$WEB_DIR" && npm run dev > "$LOGDIR/website.log" 2>&1 & ) echo echo "启动中… 约 15s 后:" echo " 官网购买页 → 看 $LOGDIR/website.log 里的 Local 端口(本次 http://localhost:4322/buy/)" echo " 登录账号 → paytest@gmail.com / testpass12345 (已注册;换邮箱需先注册)" echo " 日志 → $LOGDIR/{pay,pangolin,website}.log" echo " 停止 → lsof -ti tcp:8090,8083,4321,4322 | xargs kill"