# 本地开发：一键起后端

让后端在本机真跑起来（auth 注册/登录 + 节点列表），供 mac app 接真后端调试。

## 前置

- Docker（起 MySQL + Redis）
- Go（`/opt/homebrew/bin` 在 PATH，脚本已内置）
- openssl（生成 JWT 密钥）

## 一键启动

```bash
cd <项目根>          # pangolin/
bash dev/run-local.sh
```

脚本做的事：
1. `docker compose` 起 `pangolin-dev-mysql`（:13306）+ `pangolin-dev-redis`（:16379，避让本机已占用的 3306/6379），等 MySQL 就绪
2. 首次生成密钥到 `dev/.local/`（gitignore）：RS256 JWT 私钥/公钥、`webhook_secret`、`derive_key`
3. 组装 env（`DB_DSN`/`WEBHOOK_SECRET`/`NODE_DERIVE_KEY`/`JWT_*`），不配 SMTP → 验证码打日志
4. `go run ./cmd/migrate up`（建表 + plans seed），`dev/seed.sql` 插一个 HK 测试节点
5. 前台启动 `go run ./cmd/server`（:18080）—— **注册验证码会打印在终端日志**

停止：`Ctrl+C`（停 server）；`docker compose -f dev/docker-compose.yml down` 停容器（加 `-v` 清库）。

## 端到端验证（curl）

```bash
# 1) 发验证码（看 server 终端日志读 6 位码）
curl -XPOST localhost:18080/v1/auth/code -H 'Content-Type: application/json' \
  -d '{"email":"me@x.com"}'

# 2) 注册（填上一步日志里的码）
curl -XPOST localhost:18080/v1/auth/register -H 'Content-Type: application/json' \
  -d '{"email":"me@x.com","code":"<码>","password":"pass1234"}'
# → {"access_token":"...","refresh_token":"..."}

# 3) 拉节点列表（带 access token）
curl localhost:18080/v1/nodes -H 'Authorization: Bearer <access>'
# → 含 HK 测试节点

# 4) 当前用户
curl localhost:18080/v1/me -H 'Authorization: Bearer <access>'
```

## mac app 接它

```bash
cd client
# 客户端默认连 :8080；本机 8080 被占用，dev 后端在 18080，故显式指定：
flutter run -d macos --dart-define=PANGOLIN_API_URL=http://localhost:18080
```

注册页输真邮箱 → 发验证码（后端日志读码）→ 填码+密码 → 进主界面 → 节点页显示真节点（HK·测试）。

## 说明

- **密钥纯本地玩具**：`dev/.local/` 不进 git；换机重跑脚本会重新生成。
- **节点 endpoint 占位**（`127.0.0.1:11443`）：档 2 只验证列表 + connect 配置渲染，**不真连**。真连接出网见档 3。
- 不连 EC2 生产 MySQL（本地隔离，避免污染线上）。
