故障排查
星火赋能平台本地部署与联调故障排查:启动失败、端口占用与数据“消失”
要点速览
星火赋能平台联调时最常见的三类问题:启动时没加 -f net8.0 导致“面向多个框架”报错;旧实例或其它程序占用 5005 / 1883 端口导致整个后端启动失败;在 bin 目录下启动进程导致 SQLite 连到一个新的空库,看起来像数据丢失。按本文逐项核对基本都能定位。
这篇面向在本机或测试服务器上部署、联调星火赋能平台的开发与运维人员。问题标题尽量使用你看到的报错原文或现象,按标题检索即可。环境搭建步骤见快速入门。
启动失败 #
提示“你的项目面向多个框架,请指定要使用 --framework 运行的框架” #
这不是环境问题,启动命令加上 -f net8.0(或 -f net10.0)即可。
平台后端、以及解决方案中的其它可执行工程都同时面向 net8.0 与 net10.0 两个目标框架,单独执行 dotnet run 时 .NET 无法判断用哪个。正确写法:
dotnet run -f net8.0-f 是 --framework 的简写,两者等价。
SocketException (10048) 端口已被占用,随后 Hosting failed to start #
最常见的原因是本机已经有一个后端实例在运行,它同时占用着 API 端口(本地默认 5005)和内置 MQTT 端口(默认 1883)。
处理方法:
- 查找占用端口的进程。Windows 下可以用
netstat -ano并筛选:5005,Linux 下可以用ss -lntp或lsof -i :5005; - 确认是上次没停干净的旧实例后,结束该进程;
- 重新启动后端。
只启动了一个后端实例,仍然启动失败 #
检查 1883 端口是否被其它 MQTT 服务(如 Mosquitto、EMQX 或其它项目)占用。
后端内置的 MQTT 服务默认开启,端口 1883;MQTT 绑定失败会导致整个后端启动失败,而不仅仅是 MQTT 不可用。在 Windows 上 1883 还可能落在系统动态保留端口段,偶发冲突。处理方法二选一:
- 修改应用层配置目录下
Mqtt.json的Port; - 不需要 MQTT 时,把
Mqtt.json中的Enabled设为false。
日志中出现 Cannot open log for source '.NET Runtime'. You may not have write access. #
这条不是启动失败的原因,真正的原因在它上面几行。
在受限账户或受限沙箱中运行时,进程尝试写 Windows 事件日志被拒绝,就会出现这条信息。它只在启动已经失败之后作为“记录失败日志”的二次异常出现。向上查看日志,通常能找到端口占用等真正原因。
前端 pnpm run dev 提示 8888 端口被占用 #
上一次的开发服务没有退出干净,找到占用 8888 的进程并结束即可。
同样的方法适用于其它前端开发端口。
数据与账号 #
刚创建的数据或账号突然“消失”了 #
大概率是进程工作目录变了,连到了另一个 SQLite 库。
使用 SQLite 时,连接串是相对路径(默认 DataSource=./Sepe.Net.db),从哪个目录启动进程,就使用哪个目录下的库。如果先进入 bin/Debug/net8.0 再运行可执行文件,平台会在该目录下新建一个空库,日志和接口都正常,但数据和之前的不是同一份。
排查方法:在项目目录下递归搜索 *.db 文件,看是否存在多个库。以后统一在项目目录(Sepe.Net.Web.Entry)下启动进程。正式环境建议使用 MySQL、PostgreSQL 等服务端数据库,或把 SQLite 连接串改为明确的绝对路径。
重启后种子数据会不会覆盖我改过的数据? #
不会覆盖用户等标记为只补不覆盖的数据。
平台每次启动都会增量补齐种子数据:缺表建表、缺记录插入;带 [IncreSeed] 的种子按 Id 更新;带 [IgnoreUpdateSeed] 的实体(如用户表)只插入缺失记录,不改写已有记录,因此改过的密码不会被还原。
想把本地环境恢复到初始状态怎么办? #
停止后端进程,删除库文件后重新启动,平台会重建全部表并写入种子数据。
使用 SQLite 时删除项目目录下的 Sepe.Net.db* 文件(包括同名的附属文件);使用其它数据库时清空对应的库。此操作会丢失全部数据,正式环境不要这样做。
登录与接口 #
管理后台登录页能打开,但登录或接口请求失败 #
先确认后端是否在运行,以及前端代理指向的地址是否正确。
- 访问
http://localhost:5005/api/sysConfig/smPublicKey,返回code为 200 说明后端正常; - 检查
Web/.env.development中VITE_API_URL是否指向实际的后端地址;开发模式下 Vite 会把/api代理到该地址; - 正式部署时检查 Web 服务器是否把
/api正确反向代理到后端。
直接从其它页面或域名调用后端接口被跨域拦截 #
在后端 App.json 的跨域配置 CorsAccessorSettings.WithOrigins 中加入允许的来源。
平台默认的跨域配置较为宽松,便于本地调试;上线前必须收紧,只保留正式的管理后台域名。
官网与社区组件(如交付包含) #
如果你的交付内容包含基于 Nuxt 的官网与社区站点,以及为它提供接口的用户站点服务(本地默认端口 3000 与 5015),还可能遇到下面几个问题。
官网登录或社区接口返回 502 #
官网连不上用户站点服务,先确认 http://127.0.0.1:5015/healthz 是否返回 200。
不是 200 就先把用户站点服务启动起来(同样需要 -f net8.0)。另外注意启动顺序:用户站点库由后端管理服务首次启动时建表并写入种子数据,用户站点服务自身不建表;库不存在时它会直接连接失败。所以首次部署要先启动一次后端,再启动用户站点服务,之后谁先启动都可以。
官网登录后一直显示未登录 #
检查浏览器地址与官网配置的站点地址是否统一使用 localhost(或统一使用 127.0.0.1)。
localhost 与 127.0.0.1 对浏览器来说是两个不同的站点,不会共享 Cookie。还可以直接打开官网的 /api/member-session,正常应返回 {"member":null}(未登录)而不是网络错误。
用管理后台账号登录官网提示“账号或密码不正确” #
这是预期行为:官网会员与管理后台员工是两套完全独立的账号体系,互相不能登录。
官网会员需要在官网自行注册。
后台修改了社区设置,官网没有立即生效 #
用户站点服务对社区设置有缓存,默认最多 60 秒后生效。
联调时如需立即看到效果,可以调小用户站点服务配置中的社区设置缓存时间并重启服务。
