feat: add SMS verification registration with UniSMS provider
- Add phone field to user model with index and helper methods - Implement SMS provider interface with UniSMS (合一短信) implementation - Add SMS verification code sending endpoint with rate limiting (1/60s) - Support SMS registration in Register() (mutually exclusive with email) - Add SMS configuration to admin settings (provider, keys, signature, template) - Display phone number in admin user list contact column - Add i18n translations for all SMS-related messages (zh-CN, en, zh-TW) - Add Claude Code skills: sync-upstream, migrate-server - Update CLAUDE.md with git conventions and deployment guide Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
175
.claude/commands/migrate-server.md
Normal file
175
.claude/commands/migrate-server.md
Normal file
@@ -0,0 +1,175 @@
|
||||
# Migrate Server - 服务器迁移指南
|
||||
|
||||
帮助将 new-api 服务从老服务器迁移到新服务器,包括代码部署、数据库迁移和配置同步。
|
||||
|
||||
## 执行步骤
|
||||
|
||||
### 1. 收集信息
|
||||
先向用户确认以下信息:
|
||||
- 老服务器 IP / 访问方式
|
||||
- 新服务器 IP / 访问方式
|
||||
- 当前使用的数据库类型(SQLite / MySQL / PostgreSQL)
|
||||
- 当前部署方式(Docker Compose / 直接部署)
|
||||
- 是否使用 Redis
|
||||
- 是否有自定义域名需要迁移
|
||||
|
||||
### 2. 老服务器 - 备份数据
|
||||
|
||||
#### 2.1 数据库备份
|
||||
|
||||
**如果使用 SQLite:**
|
||||
```bash
|
||||
# 找到 SQLite 数据库文件(通常在项目根目录或 data/ 目录下)
|
||||
# 停止服务防止写入
|
||||
docker compose stop # 或 systemctl stop new-api
|
||||
|
||||
# 复制数据库文件
|
||||
cp /path/to/new-api.db /backup/new-api.db
|
||||
|
||||
# 或者使用 sqlite3 导出
|
||||
sqlite3 /path/to/new-api.db .dump > /backup/new-api-dump.sql
|
||||
```
|
||||
|
||||
**如果使用 MySQL:**
|
||||
```bash
|
||||
# 导出完整数据库
|
||||
mysqldump -u root -p --single-transaction --routines --triggers new_api > /backup/new-api-mysql.sql
|
||||
|
||||
# 或者如果 MySQL 在 Docker 中
|
||||
docker exec <mysql_container> mysqldump -u root -p<password> new_api > /backup/new-api-mysql.sql
|
||||
```
|
||||
|
||||
**如果使用 PostgreSQL:**
|
||||
```bash
|
||||
# 导出完整数据库
|
||||
pg_dump -U postgres -d new_api -F c -f /backup/new-api-pg.dump
|
||||
|
||||
# 或者如果在 Docker 中
|
||||
docker exec <pg_container> pg_dump -U postgres -d new_api -F c > /backup/new-api-pg.dump
|
||||
```
|
||||
|
||||
#### 2.2 配置备份
|
||||
```bash
|
||||
# 备份环境变量文件
|
||||
cp .env /backup/.env
|
||||
|
||||
# 备份 Docker Compose 配置
|
||||
cp docker-compose.yml /backup/docker-compose.yml
|
||||
|
||||
# 备份其他配置文件(如果有)
|
||||
cp -r config/ /backup/config/ 2>/dev/null
|
||||
```
|
||||
|
||||
#### 2.3 Redis 数据备份(如果使用)
|
||||
```bash
|
||||
# Redis 数据通常不需要迁移(缓存会自动重建)
|
||||
# 但如果需要:
|
||||
redis-cli BGSAVE
|
||||
cp /var/lib/redis/dump.rdb /backup/redis-dump.rdb
|
||||
```
|
||||
|
||||
### 3. 传输备份到新服务器
|
||||
```bash
|
||||
# 使用 scp 传输
|
||||
scp -r /backup/ user@new-server:/path/to/backup/
|
||||
|
||||
# 或使用 rsync
|
||||
rsync -avz /backup/ user@new-server:/path/to/backup/
|
||||
```
|
||||
|
||||
### 4. 新服务器 - 部署准备
|
||||
|
||||
#### 4.1 安装基础环境
|
||||
```bash
|
||||
# Docker + Docker Compose(推荐)
|
||||
curl -fsSL https://get.docker.com | sh
|
||||
apt install docker-compose-plugin # 或 docker compose v2
|
||||
|
||||
# 或者直接部署需要 Go 1.22+ 和 Node.js/Bun
|
||||
```
|
||||
|
||||
#### 4.2 拉取代码
|
||||
```bash
|
||||
git clone https://git.586vip.cn/huangzhenpc/newapi-yx-diy.git
|
||||
cd newapi-yx-diy
|
||||
git checkout dev-v0.11.0-alpha.9 # 或目标分支
|
||||
```
|
||||
|
||||
#### 4.3 恢复配置
|
||||
```bash
|
||||
# 恢复环境变量
|
||||
cp /path/to/backup/.env .env
|
||||
|
||||
# 恢复 Docker Compose 配置(如有定制)
|
||||
cp /path/to/backup/docker-compose.yml docker-compose.yml
|
||||
```
|
||||
|
||||
### 5. 新服务器 - 恢复数据库
|
||||
|
||||
**如果使用 SQLite:**
|
||||
```bash
|
||||
# 直接复制数据库文件到项目目录
|
||||
cp /path/to/backup/new-api.db ./data/new-api.db
|
||||
# GORM AutoMigrate 会在启动时自动添加新字段(如 Phone)
|
||||
```
|
||||
|
||||
**如果使用 MySQL:**
|
||||
```bash
|
||||
# 先启动 MySQL 容器
|
||||
docker compose up -d mysql
|
||||
|
||||
# 等待 MySQL 完全启动
|
||||
sleep 10
|
||||
|
||||
# 导入数据
|
||||
docker exec -i <mysql_container> mysql -u root -p<password> new_api < /path/to/backup/new-api-mysql.sql
|
||||
```
|
||||
|
||||
**如果使用 PostgreSQL:**
|
||||
```bash
|
||||
# 先启动 PostgreSQL 容器
|
||||
docker compose up -d postgres
|
||||
|
||||
# 等待 PostgreSQL 完全启动
|
||||
sleep 5
|
||||
|
||||
# 创建数据库(如果不存在)
|
||||
docker exec <pg_container> createdb -U postgres new_api
|
||||
|
||||
# 导入数据
|
||||
docker exec -i <pg_container> pg_restore -U postgres -d new_api < /path/to/backup/new-api-pg.dump
|
||||
```
|
||||
|
||||
### 6. 新服务器 - 启动服务
|
||||
```bash
|
||||
# Docker Compose 部署
|
||||
docker compose up -d
|
||||
|
||||
# 检查服务状态
|
||||
docker compose ps
|
||||
docker compose logs -f --tail=50
|
||||
```
|
||||
|
||||
### 7. 验证
|
||||
|
||||
向用户确认以下检查项:
|
||||
- [ ] 服务是否正常启动(访问 `/api/status`)
|
||||
- [ ] 管理员账号能否正常登录
|
||||
- [ ] 用户数据是否完整
|
||||
- [ ] 渠道配置是否正常
|
||||
- [ ] API 密钥是否可用
|
||||
- [ ] 如果有自定义域名,DNS 是否已切换
|
||||
|
||||
### 8. 切换流量
|
||||
- 更新 DNS 记录指向新服务器
|
||||
- 或更新反向代理(Nginx/Caddy)配置
|
||||
- 老服务器保留一段时间作为回退方案
|
||||
|
||||
## 注意事项
|
||||
|
||||
1. **GORM AutoMigrate**:新版本可能有新的数据库字段(如 `phone`),启动时 GORM 会自动添加,不需要手动执行迁移脚本
|
||||
2. **环境变量**:确保 `.env` 中的数据库连接字符串指向正确的地址
|
||||
3. **数据一致性**:迁移前停止老服务器的写入,避免数据不一致
|
||||
4. **Redis**:Redis 缓存数据不需要迁移,服务启动后会自动重建
|
||||
5. **密钥安全**:传输过程中注意保护敏感信息(数据库密码、API 密钥等)
|
||||
6. **回退方案**:保留老服务器至少 1 周,确认新服务器稳定后再关闭
|
||||
72
.claude/commands/sync-upstream.md
Normal file
72
.claude/commands/sync-upstream.md
Normal file
@@ -0,0 +1,72 @@
|
||||
# Sync Upstream - 从上游仓库拉取合并
|
||||
|
||||
从 Calcium-Ion/new-api 上游仓库拉取最新代码并安全合并到当前分支。
|
||||
|
||||
## 执行步骤
|
||||
|
||||
### 1. 环境准备
|
||||
- 检查当前工作区是否有未提交的更改,如有则先提示用户处理
|
||||
- 检查是否已配置 `upstream` remote,如果没有则添加:
|
||||
```
|
||||
git remote add upstream https://github.com/Calcium-Ion/new-api.git
|
||||
```
|
||||
|
||||
### 2. 拉取上游代码
|
||||
```
|
||||
git fetch upstream
|
||||
```
|
||||
|
||||
### 3. 分析差异
|
||||
- 运行 `git log HEAD..upstream/main --oneline` 查看上游有哪些新提交
|
||||
- 运行 `git diff HEAD...upstream/main --stat` 查看哪些文件被改动
|
||||
- 将差异分析结果展示给用户
|
||||
|
||||
### 4. 冲突风险评估
|
||||
重点关注以下我们自定义修改过的文件,标记为**高风险**:
|
||||
- `CLAUDE.md` — 我们的项目规范,**必须保留我们的版本**
|
||||
- `.claude/` — 我们的 Claude Code 配置和 skills,**必须保留**
|
||||
- `common/sms.go`, `common/sms_unisms.go` — 短信功能(我们新增)
|
||||
- `middleware/sms-verification-rate-limit.go` — 短信限流(我们新增)
|
||||
- `common/constants.go` — 我们新增了 SMS 相关常量
|
||||
- `model/user.go` — 我们新增了 Phone 字段和相关方法
|
||||
- `model/option.go` — 我们新增了 SMS 相关配置
|
||||
- `controller/misc.go` — 我们新增了 SMS 验证接口
|
||||
- `controller/user.go` — 我们修改了注册逻辑
|
||||
- `router/api-router.go` — 我们新增了 SMS 路由
|
||||
- `i18n/` — 我们新增了 SMS 相关翻译
|
||||
- `web/src/components/auth/RegisterForm.jsx` — 手机号注册 UI
|
||||
- `web/src/components/settings/SystemSetting.jsx` — SMS 配置 UI
|
||||
- `web/src/components/table/users/UsersColumnDefs.jsx` — 用户列表手机号列
|
||||
- `web/src/i18n/locales/` — 前端翻译
|
||||
|
||||
将风险评估结果展示给用户,让用户确认是否继续。
|
||||
|
||||
### 5. 执行合并
|
||||
- 使用 `git merge upstream/main` 进行合并
|
||||
- **绝不**使用 `--force` 或 `--strategy-option theirs`
|
||||
|
||||
### 6. 处理冲突
|
||||
如果出现合并冲突:
|
||||
- 逐个冲突文件分析
|
||||
- 对于我们**新增**的文件(如 `common/sms.go`):保留我们的版本
|
||||
- 对于 `CLAUDE.md` 和 `.claude/`:**始终保留我们的版本**
|
||||
- 对于**双方都修改**的文件(如 `model/user.go`):智能合并,保留双方的改动
|
||||
- 读取冲突内容,理解上游改了什么、我们改了什么
|
||||
- 将两者的改动合并到一起
|
||||
- 确保我们的自定义功能(如 Phone 字段、SMS 验证)不丢失
|
||||
- 解决完所有冲突后,展示修改摘要给用户确认
|
||||
|
||||
### 7. 验证
|
||||
- 运行 `go build ./common/... ./model/... ./controller/... ./middleware/... ./router/...` 确认 Go 编译通过
|
||||
- 检查是否有遗漏的冲突标记 (`<<<<<<<`, `=======`, `>>>>>>>`)
|
||||
|
||||
### 8. 完成
|
||||
- 提示用户合并结果
|
||||
- 如果用户要求,创建合并提交
|
||||
|
||||
## 重要原则
|
||||
|
||||
1. **安全第一**:任何不确定的决策都要询问用户
|
||||
2. **保护自定义代码**:我们的新增功能和修改绝不能在合并中丢失
|
||||
3. **不自动推送**:合并完成后不会自动 push,需要用户确认后手动推送
|
||||
4. **可逆操作**:如果合并出问题,提示用户可以用 `git merge --abort` 回退
|
||||
Reference in New Issue
Block a user