Bitwarden server Aspire AppHost 启动时服务卡在等待状态怎么排查
【免费下载链接】serverBitwarden infrastructure/backend (API, database, Docker, etc).项目地址: https://gitcode.com/GitHub_Trending/ser/server
在 Bitwarden server 仓库的AppHost目录执行dotnet run后,Aspire 会编排整套本地开发环境。按设计,所有资源按依赖顺序启动,各业务服务(api、billing、identity等)会等待数据库和 secrets 初始化完成后再启动。如果你发现 dashboard 里的服务资源长时间停留在 waiting 状态、迟迟不进入运行状态,本文说明如何沿着等待链定位卡住的前置资源,并按 AppHost/README.md 的 Troubleshooting 表逐项处理。适用环境是本地开发环境(.NET Aspire 编排的AppHost),前提条件见下文。
启动前的前置条件
AppHost/README.md 列出的 Prerequisites:
| 要求 | 说明 |
|---|---|
| .NET SDK 10 | Aspire 要求 |
| Docker Desktop | 运行支撑基础设施容器(SQL Server、Azurite、MailCatcher、Redis 等) |
PowerShell(pwsh) | 迁移脚本和 secrets 脚本用它执行 |
| 已完成的 server 初始化 | dev/secrets.json必须存在 |
满足后按 Quick Start 启动:
cd AppHost dotnet runAspire dashboard 会自动在浏览器打开。资源按依赖顺序启动,服务在数据库和 secrets 初始化完成前会一直等待——这是正常行为,只有等待链上的前置资源异常时才需要排查。
先理解等待链:服务在等什么
从 AppHost/AppHost.cs 和 AppHost/BuilderExtensions.cs 的编排逻辑看,等待关系是:
- 每个 Bitwarden 服务都
WaitFor(mssql)并WaitForCompletion(setup-secrets),即等数据库就绪、等setup-secrets这个可执行资源跑完(见 BuilderExtensions.cs 的AddBitwardenService); api、events、eventsProcessor、notifications额外WaitFor(azurite);run-db-migrations本身WaitFor(mssql)并WaitForCompletion(setup-secrets)(AppHost.cs)。
也就是说,服务卡在 waiting,根因几乎总在前置链上:setup-secrets没跑完、mssql容器起不来、或者迁移脚本失败。README 的 Troubleshooting 表对这一现象给出的直接指引是:检查 dashboard 中setup-secrets或run-db-migrations的日志。
打开 Dashboard 查看资源状态和日志
dashboard 运行后会自动打开;也可以直接访问(AppHost/README.md):
| Profile | URL |
|---|---|
| HTTPS(默认) | https://localhost:17271 |
| HTTP | http://localhost:15055 |
dashboard 展示每个资源的实时状态、结构化日志、分布式 trace 和环境变量。重点看两个可执行资源setup-secrets和run-db-migrations的日志输出,按下面的已知原因对号入座。
已知原因与对应处理
1.dev/secrets.json缺失,secrets 未应用
setup-secrets资源实际执行dev/setup_secrets.ps1(带-clear参数,见 BuilderExtensions.cs)。该脚本在dev目录下找不到secrets.json时会输出警告并直接退出(setup_secrets.ps1):
No secrets.json file found, please copy and modify the provided example处理:参照 dev/secrets.json.example 复制出dev/secrets.json并填入本地值,然后按 Troubleshooting 表的处理方式——从 Aspire dashboard 重新运行setup-secrets资源。
注意副作用:重新运行setup-secrets时脚本会先对列出的项目(src/Api、src/Billing、src/Admin等 12 个项目)执行dotnet user-secrets clear,再把dev/secrets.json的内容重新应用到这些项目(见 setup_secrets.ps1)。如果你的本地 user secrets 有其他未写进secrets.json的值,会被覆盖。
2. SQL Server 容器起不来
所有服务和run-db-migrations都等待mssql资源。Troubleshooting 表给出的检查项:确认Docker Desktop 正在运行,且端口 1433 空闲。mssql使用mssql/server:2022-latest镜像、映射宿主机 1433 端口(AppHost/README.md、appsettings.Development.json)。端口被占用时容器起不来,整条等待链都会停滞。
3. 迁移立即失败:pwsh不在 PATH 上
setup-secrets和run-db-migrations都是pwsh可执行资源,run-db-migrations实际执行dev/migrate.ps1(对vault_dev建库并跑全部迁移,见 migrate.ps1)。Troubleshooting 表:迁移立即失败时,确保pwsh(PowerShell)在$PATH上。
4. 启动时端口冲突
各服务的BasePort预填在 AppHost/appsettings.Development.json(例如api为4000),与每个服务自身Properties/launchSettings.json的端口一致。如果本机其他进程占了该端口,按 Troubleshooting 表用 user secrets 覆盖为空闲端口,例如:
dotnet user-secrets set "Services:api:BasePort" "4001"<name>换成冲突的服务名(api、billing、identity等),端口换成你机器上空闲的值。
验证结果与边界说明
- 修复后回到 dashboard 观察:
setup-secrets、mssql、run-db-migrations等前置资源完成运行,等待中的服务按依赖顺序陆续启动——README 的说明是“services wait for the database and secrets setup to finish before launching”,即前置资源完成后服务开始运行即为预期结果。 - 每个资源的运行证据(状态、日志、环境变量)都可以直接在 dashboard 里查看,无需另开终端。
- 一个容易误判的情况:
idp、web-frontend、billing-webhook-ngrok-endpoint是explicit start资源,README 明确说明它们需要从 dashboard 手动启动。这些资源一直显示未启动属于设计行为,不属于“卡在等待”。
如果某个前置资源日志里仍报错,以该资源在 dashboard 中的结构化日志为准继续定位;上表覆盖的是 README Troubleshooting 表列出的已知原因。
【免费下载链接】serverBitwarden infrastructure/backend (API, database, Docker, etc).项目地址: https://gitcode.com/GitHub_Trending/ser/server
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考