Files
invest-mind-store/apps/api/src/modules/user/README-SEEDER.md

5.2 KiB
Raw Blame History

用户种子数据Seeder使用说明

概述

本项目提供了两种创建初始管理员用户的方式:

  1. SQL 脚本方式 (init-admin-user.sql) - 手动执行 SQL
  2. Seeder 方式 (user.seeder.ts) - 应用启动时自动执行(推荐)

方式对比

SQL 脚本方式

优点:

  • 简单直接,适合快速初始化
  • 不依赖应用代码,可以在应用启动前执行
  • 适合数据库迁移场景
  • 可以批量创建多个用户

缺点:

  • 需要手动执行,容易忘记
  • 密码哈希需要提前生成
  • 不便于版本控制(如果修改需要更新 SQL
  • 无法使用业务逻辑验证

适用场景:

  • 数据库迁移脚本
  • 一次性初始化
  • 生产环境手动创建用户

Seeder 方式(推荐)

优点:

  • 代码化管理,版本控制友好
  • 自动执行,无需手动操作
  • 可以使用业务逻辑(密码加密、验证等)
  • 环境变量配置,灵活性强
  • 幂等性:如果用户已存在,不会重复创建
  • 可以集成到 CI/CD 流程

缺点:

  • 需要应用启动后才能执行
  • 如果应用启动失败,无法创建用户

适用场景:

  • 开发/测试环境自动初始化
  • 新环境部署
  • 需要动态配置的场景

使用方式

方式1Seeder 自动创建(推荐)

1. 配置环境变量

.env.env.development 文件中添加:

# 启用用户种子数据(生产环境默认关闭)
ENABLE_USER_SEEDER=true

# 管理员用户配置(可选,有默认值)
ADMIN_USERNAME=admin
ADMIN_PASSWORD=admin123
ADMIN_EMAIL=admin@vestmind.com
ADMIN_NICKNAME=系统管理员
ADMIN_ROLE=admin

2. 确保 UserSeeder 已注册

user.module.ts 中,UserSeeder 应该已经在 providers 中:

@Module({
    imports: [TypeOrmModule.forFeature([User])],
    providers: [UserService, UserSeeder], // 确保包含 UserSeeder
    // ...
})

3. 启动应用

pnpm start:dev

应用启动时会自动检查并创建管理员用户(如果不存在)。

方式2SQL 脚本手动创建

1. 生成密码哈希(如果需要修改密码)

node src/modules/user/generate-password-hash.js your_password

2. 修改 SQL 文件

编辑 init-admin-user.sql,更新密码哈希值。

3. 执行 SQL

psql -U postgres -d your_database -f src/modules/user/init-admin-user.sql

环境配置说明

开发环境

# .env.development
ENABLE_USER_SEEDER=true
ADMIN_USERNAME=admin
ADMIN_PASSWORD=admin123
ADMIN_EMAIL=admin@vestmind.com

测试环境

# .env.test
ENABLE_USER_SEEDER=true
ADMIN_USERNAME=test_admin
ADMIN_PASSWORD=test_password_123
ADMIN_EMAIL=test@vestmind.com

生产环境

推荐做法:

  1. 方式1手动创建最安全

    • 使用 SQL 脚本手动创建
    • 或通过管理后台创建
    • 不启用自动 Seeder
  2. 方式2首次部署时启用

    # .env.production仅首次部署时
    ENABLE_USER_SEEDER=true
    ADMIN_PASSWORD=强密码
    

    创建完成后,移除 ENABLE_USER_SEEDER 或设置为 false

最佳实践建议

1. 开发环境

  • 使用 Seeder 自动创建
  • 使用简单的默认密码(如 admin123
  • 在 README 中说明默认账号密码

2. 测试环境

  • 使用 Seeder 自动创建
  • 使用测试专用的账号密码
  • 可以通过环境变量灵活配置

3. 生产环境

  • ⚠️ 不推荐自动创建(安全考虑)
  • 使用 SQL 脚本手动创建
  • 或通过管理后台首次创建
  • 使用强密码
  • 创建后立即修改密码

4. Docker/容器部署

  • 可以在启动脚本中执行 SQL
  • 或使用初始化容器执行 Seeder
  • 确保只执行一次(幂等性)

安全建议

  1. 密码安全

    • 生产环境必须使用强密码
    • 不要在代码中硬编码密码
    • 使用环境变量或密钥管理服务
  2. 权限控制

    • 生产环境默认不启用自动创建
    • 通过环境变量显式控制
  3. 审计日志

    • 记录管理员用户的创建时间
    • 记录创建来源Seeder/SQL/手动)
  4. 定期检查

    • 定期检查管理员账号
    • 删除未使用的测试账号

故障排查

Seeder 未执行

  1. 检查 UserSeeder 是否在 user.module.tsproviders
  2. 检查环境变量 ENABLE_USER_SEEDER 是否设置为 true
  3. 检查日志输出,查看是否有错误信息

用户已存在但想重新创建

  1. 删除现有用户:
    DELETE FROM "users" WHERE username = 'admin';
    
  2. 重启应用Seeder 会自动创建

修改管理员密码

  1. 使用 generate-password-hash.js 生成新密码哈希
  2. 更新数据库:
    UPDATE "users"
    SET password_hash = '$2b$10$新的哈希值',
        updated_at = NOW()
    WHERE username = 'admin';
    

总结

  • 开发/测试环境:推荐使用 Seeder自动化程度高
  • 生产环境:推荐使用 SQL 脚本或管理后台,更安全可控
  • 两种方式可以并存SQL 作为备用方案Seeder 作为主要方式