#!/usr/bin/env bash # run-local.sh — 一键起本地后端(DB/Redis + 密钥 + 迁移 + seed + server)。 # 从项目根运行: bash dev/run-local.sh # 验证码:未配 SMTP,注册验证码会打到本终端的 server 日志里。 # 密钥:首次生成到 dev/.local/(gitignore);标量密钥用固定/随机 dev 值,纯本地玩具。 set -euo pipefail export PATH="/opt/homebrew/bin:$PATH" ROOT="$PWD" LOCAL="$ROOT/dev/.local" mkdir -p "$LOCAL" # ── 1. 起 MySQL + Redis ────────────────────────────────────────────── echo "[run-local] 起 MySQL + Redis ..." docker compose -f dev/docker-compose.yml up -d echo "[run-local] 等待 MySQL 就绪 ..." until docker exec pangolin-dev-mysql mysqladmin ping -proot --silent >/dev/null 2>&1; do sleep 1 done echo "[run-local] MySQL 就绪。" # ── 2. 生成密钥(仅当缺失)──────────────────────────────────────────── if [ ! -f "$LOCAL/jwt_private.pem" ]; then echo "[run-local] 生成 RS256 JWT 密钥对 ..." openssl genrsa -out "$LOCAL/jwt_private.pem" 2048 openssl rsa -in "$LOCAL/jwt_private.pem" -pubout -out "$LOCAL/jwt_public.pem" fi [ -f "$LOCAL/webhook_secret" ] || openssl rand -hex 32 > "$LOCAL/webhook_secret" [ -f "$LOCAL/derive_key" ] || openssl rand -hex 32 > "$LOCAL/derive_key" # ── 3. 组装环境变量 ────────────────────────────────────────────────── read -r WEBHOOK_SECRET < "$LOCAL/webhook_secret" read -r NODE_DERIVE_KEY < "$LOCAL/derive_key" export WEBHOOK_SECRET NODE_DERIVE_KEY export DB_DSN="root:root@tcp(127.0.0.1:13306)/pangolin?parseTime=true&loc=UTC&multiStatements=true" export REDIS_ADDR="127.0.0.1:16379" export JWT_PRIVATE_KEY_PATH="$LOCAL/jwt_private.pem" export JWT_KEY_ID="dev-key-1" export JWT_PUBLIC_KEYS="dev-key-1:$LOCAL/jwt_public.pem" export ADDR=":18080" # 避让本机已占用的 8080 # 真发邮件:dev/.local/smtp.env 存在则 source(设 SMTP_*)→ 后端用真 SMTP; # 否则不设 SMTP_* → LogMailer 把验证码打日志。不设 GRPC_* → 不启 agent server。 # shellcheck disable=SC1091 [ -f "$LOCAL/smtp.env" ] && . "$LOCAL/smtp.env" # ── 4. 迁移 + seed ─────────────────────────────────────────────────── echo "[run-local] 数据库迁移 ..." ( cd server && go run ./cmd/migrate up ) echo "[run-local] seed 节点 ..." docker exec -i pangolin-dev-mysql mysql -uroot -proot pangolin < dev/seed.sql # ── 5. 启动后端(前台,验证码看本终端日志)────────────────────────── echo "[run-local] 启动后端 :18080 —— 注册验证码会打印在下方日志。Ctrl+C 停止。" ( cd server && go run ./cmd/server )