Skip to content

feat!: add system initialization (setup wizard) support - #3041

Open
PIKACHUIM wants to merge 2 commits into
mainfrom
feat/init-setup
Open

feat!: add system initialization (setup wizard) support#3041
PIKACHUIM wants to merge 2 commits into
mainfrom
feat/init-setup

Conversation

@PIKACHUIM

Copy link
Copy Markdown
Member

PR: 系统初始化(安装向导)功能

概述 / Overview

Go 后端与 TS 后端实现同一套公开 API,前端仅需对接一套接口即可同时支持两种后端。

Summary / 摘要

Add a full system initialization (setup wizard) to OpenList. On first deployment the admin account is no longer auto-created with a random password; instead a web wizard guides the user through setting the admin username/password and site title before entering the login flow. Both Go and TS backends expose the same public API, so the frontend works against both with a single integration.


为 OpenList 增加**系统初始化(安装向导)**能力。首次部署时不再自动创建随机密码的管理员账号,而是通过 Web 安装向导引导用户设置管理员账号、密码与站点名称,完成后再进入登录流程。此举消除「首次启动密码只打印在日志里」这一易被忽略的安全隐患,同时提供一致的首次部署体验。

设计 / Design

行为变更 / Behavior Change

  • 行为变化(用户可感知):全新部署不再自动创建随机密码的 admin 账号,前端会检测「未初始化」状态并自动跳转到 /@init 安装向导。
  • 实现变化
    • bootstrap/data/initUser 拆分为 initAdmin + initGuest;未初始化且未设置 OPENLIST_ADMIN_PASSWORD、非 --dev 模式时,initAdmin 直接返回,不再自动创建管理员。
    • 新增 server/handles/setup.go,实现 InitStatusInitSetup 两个 handler。
  • API 变化:新增公开 API GET /api/public/init_statusPOST /api/public/init/setup
  • 兼容性:设置 OPENLIST_ADMIN_PASSWORD 环境变量或 --dev 模式时仍自动初始化(保持现有部署/CI 行为不变);数据库表创建(GORM AutoMigrate)逻辑不变。
场景 之前 现在
首次部署,无环境变量 自动创建 admin + 随机密码(打印到日志) 不创建 admin,系统进入「未初始化」状态,前端跳转到 /@init
设置了 OPENLIST_ADMIN_PASSWORD(Go)/ ADMIN_PASSWORD(TS) 用该密码自动建 admin 保持不变(自动初始化,兼容现有部署)
Go 开发模式(--dev 自动建 admin/admin 保持不变
数据库表创建 启动时自动迁移 保持不变(GORM AutoMigrate / KV 存储)
  • This PR has breaking changes.
    / 此 PR 包含破坏性变更。
  • This PR changes public API, config, storage format, or migration behavior.
    / 此 PR 修改了公开 API、配置、存储格式或迁移行为。
  • This PR requires corresponding changes in related repositories.
    / 此 PR 需要关联仓库同步修改。

新增公开 API / New Public API

Related repository PRs / 关联仓库 PR:

方法 路径 说明
GET /api/public/init_status 返回 { initialized: boolean },前端据此判断是否跳转安装向导
POST /api/public/init/setup 执行初始化,请求体 { username, password, site_title }
  • OpenList-Frontend: feat/init-setup(安装向导页面,待创建 PR)
  • OpenList-Docs: 暂无(如有安装向导文档需求,后续补充)
  • OpenList-Worker(TS 后端):已直接提交至 mainafabd9b),非 PR

初始化判定标准:存在已设置密码的管理员账号(role = admin

Related Issues / 关联 Issue


改动清单 / Changes

不适用 / Not applicable.

1. Go 后端(OpenList-Backends

Testing / 测试

  • internal/bootstrap/data/user.go
    • initUser 拆分为 initAdmin + initGuest
    • initAdmin:未初始化且非 Dev、未设置 OPENLIST_ADMIN_PASSWORD直接返回,不再自动创建管理员
  • server/handles/setup.go(新增)
    • InitStatus:读取 admin 是否存在,返回初始化状态
    • InitSetup:校验已初始化状态与密码长度(≥4),创建管理员并写入站点名称设置项(conf.SiteTitle
  • server/router.go
    • 注册 GET/POST /api/public/init_statusPOST /api/public/init/setup

2. TS 后端(OpenList-TSWorker

  • go build ./...(通过)

  • go test ./...(未运行,本改动无新增单测,建议合并前执行)

  • Manual test / 手动测试:

    • 全新部署(不设置 OPENLIST_ADMIN_PASSWORD)→ 前端应自动跳转 /@init 安装向导
    • 填写管理员账号/密码/站点名称并提交 → 跳转登录页,使用设置的账号密码可正常登录
    • 设置 OPENLIST_ADMIN_PASSWORD 后部署 → 跳过向导,直接用该密码登录(兼容性)
    • --dev 模式 → 仍自动创建 admin/admin
  • server/auth.ts

    • getOrInitUsers:未设置 ADMIN_PASSWORD 时不再生成随机密码,仅创建 guest,admin 交由安装向导
    • admin 识别从 username === "admin" 统一改为 role === 2(支持自定义管理员用户名)
  • server/public.ts

    • 新增 GET /api/public/init_statusPOST /api/public/init/setup
    • 支持「admin 已存在但密码为空」的更新场景
  • server/default_credentials.test.ts

    • 同步更新 2 个依赖旧行为的测试用例

Checklist / 检查清单

3. 前端(OpenList-Frontend

  • I have read CONTRIBUTING.
    / 我已阅读 CONTRIBUTING

  • I confirm this contribution follows the repository license, contribution policy, and code of conduct.
    / 我确认此贡献符合仓库许可证、贡献规范和行为准则。

  • I have formatted the changed code with gofmt, go fmt, or prettier where applicable.
    / 我已按适用情况使用 gofmtgo fmtprettier 格式化变更代码。

  • I have requested review from relevant maintainers or code owners where applicable.
    / 我已在适用情况下请求相关维护者或代码所有者审查。

  • pages/init/index.tsx(新增)

    • 安装向导页面:管理员用户名 / 密码 / 确认密码 / 站点名称
    • 已初始化时自动跳转登录页,密码校验(长度 ≥4、两次一致)
  • app/App.tsx

    • 新增 /@init 路由
    • 应用启动时请求 init_status,未初始化自动跳转 /@init
  • lang/en/init.json + lang/en/entry.ts

    • 新增安装向导 i18n 文案

AI Disclosure / AI 使用声明


graph TD
    A[访问站点] --> B{GET /api/public/init_status}
    B -->|initialized = true| C[正常登录流程]
    B -->|initialized = false| D[跳转 /@init 安装向导]
    D --> E[填写管理员账号/密码/站点名称]
    E --> F{POST /api/public/init/setup}
    F -->|成功| G[跳转登录页]
    F -->|已初始化/校验失败| D
Loading
  • This PR includes AI-assisted content.
    / 此 PR 包含 AI 辅助内容。

Tools used / 使用工具:

测试 / Testing

  • ChatGPT

  • Codex

  • GitHub Copilot

  • Claude

  • Gemini

  • Other (please specify) / 其他(请注明): Deepseek-V4-Pro (CodeBuddy)

  • Go 后端go build ./... 通过

  • TS 后端:更新后的 default_credentials.test.ts 覆盖新行为(未初始化不自动建 admin、空密码保持为空)

  • 前端:lint 通过

  • 手动验证

    1. 全新部署(无 ADMIN_PASSWORD/OPENLIST_ADMIN_PASSWORD)→ 首页应自动跳转 /@init
    2. 填写并提交安装向导 → 跳转登录页,用设置的账号密码可正常登录
    3. 设置 ADMIN_PASSWORD/OPENLIST_ADMIN_PASSWORD 后部署 → 跳过向导,直接用该密码登录(兼容性)
      Usage scope / 使用范围:

  • Code generation / 代码生成
  • Refactoring / 重构
  • Documentation / 文档
  • Tests / 测试
  • Translation / 翻译
  • Review assistance / 审查辅助

提交方式 / Submission

仓库 分支 提交方式
OpenList-TSWorker main 直接 commit
OpenList-Backends feat/init-setup PR(base: main
OpenList-Frontend feat/init-setup PR(base: main

Checklist

  • Go 后端初始化 API 与自动建 admin 行为调整
  • TS 后端初始化 API 与自动建 admin 行为调整
  • 前端安装向导页面与路由
  • i18n 文案
  • TS 后端相关测试同步更新
  • 双后端行为对齐(API 路径、初始化判定、环境变量兼容)
  • I have reviewed and validated all AI-assisted content included in this PR.
    / 我已审核并验证此 PR 中的所有 AI 辅助内容。
  • I have ensured that all AI-assisted commits include Co-Authored-By attribution.
    / 我已确保所有 AI 辅助提交都包含 Co-Authored-By 归属信息。
  • I can reproduce all AI-assisted content included in this PR without any AI tools.
    / 我可以在没有任何 AI 工具的情况下重现此 PR 中包含的所有 AI 辅助内容。

@github-actions

github-actions Bot commented Sep 5, 2026

Copy link
Copy Markdown

⚠️ PR 标题需以 feat(): , docs(): , fix(): , style(): , refactor(): , chore(): 其中之一开头,例如:feat(component): 新增功能
⚠️ The PR title must start with feat(): , docs(): , fix(): , style(): , or refactor(): , chore(): . For example: feat(component): add new feature.

如果跨多个组件,请使用主要组件作为前缀,并在标题中枚举、描述中说明。
If it spans multiple components, use the main component as the prefix and enumerate in the title, describe in the body.

如果是破坏性变更,请在类型后添加 !,例如 feat(component)!: 破坏性变更
For breaking changes, add ! after the type, e.g., feat(component)!: breaking change.

@xrgzs xrgzs changed the title feat: add system initialization (setup wizard) support feat!: add system initialization (setup wizard) support Sep 6, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant