Yggdrasil 本地开发排障清单(CSRF / 405 / DB / dx 就绪)
沉淀自会话记忆;历史演变多,动手前以当前
.env、compose、README 与 DB 实际配置为准。
CSRF / trusted origin 403
- 权威 base URL 在数据库的
security_app_base_url;环境变量通常只在首次启动播种,改 env 不覆盖已有 DB 值。 - 浏览器、测试、Host、Origin、cookie 域必须同源:DB 配
http://localhost:8080就不能混用127.0.0.1。 - 只读 server fn 也是 POST,同样受校验。
- 不要为了让本地跑通放宽生产 CSRF。
- 本地 curl 用
--noproxy '*'排除 SOCKS 代理假故障。
405(跨编译 server fn POST)
Dioxus 0.7 #[server(Fn, "/api")] 的后缀 = xxh64(hash_key + ":" + module_path!(), 0),hash_key 默认 CARGO_MANIFEST_DIR(编译时绝对路径)。宿主与容器/交叉编译路径不同 → WASM 请求的 hash 与 server 注册的 hash 不一致 → 落到 SSR catch-all 的 GET-only 路由,返回 405 且 allow: GET,HEAD。这是结构性必然,不是缓存或版本漂移。
诊断:容器启动日志 Registering: POST /api/login<数字> vs 浏览器 Network 的 POST /api/login<数字>,比对后缀(精确验证可用 xxh64 手算)。
修法:.cargo/config.toml 的 [env] SERVER_FN_OVERRIDE_KEY 两端统一,然后两端都重建。
数据库连接
- PostgreSQL 是独立容器
global-postgres(全局 compose 项目),共享 external 网络global-databases_default。 - 宿主工具:
postgres://issuser@127.0.0.1:5432/yggdrasil;dev 容器必须共享该网络并直连postgres://issuser@global-postgres:5432/yggdrasil。 host.docker.internal曾同时解析 IPv4/IPv6,容器无 IPv6 路由 → tokio-postgresENETUNREACH (os error 101)。不要用 extra_hosts 或盲改宿主地址绕过。- 容器内 localhost 是它自己。
- compose 的
environment:覆盖env_file:;.env只供插值,不自动进容器。
dx serve 就绪与卡顿
- 「Serving your app」banner 早于编译完成,不是就绪信号;验证前查进程、日志与真实 HTTP 响应。
- 卡在
Waiting for cargo-metadata:查并行 Cargo 进程/缓存锁与 sparse registry 网络,冷 registry volume 可能只需首次刷新。 - 近零 CPU + 存在
rustup downloads/*.partial:dx 在运行时下载 nightly(cargo +nightly rustc --unit-graph -Z unstable-options)。持久修法是在 Dockerfile.dev 构建期装 nightly + wasm32 target,运行中手装只对该容器有效。 dx build/serve会清 sccache wrapper,避免RUSTC_WRAPPER与 Dioxus 的RUSTC_WORKSPACE_WRAPPER冲突;普通 cargo 仍可用 sccache。- 改
input.css后必须重新生成public/style.css(make css);它是 gitignore 的生成物,dev 容器 watch 的 ignore 列表不包含它。
资源 404
/uploads/xxx.webp 404 先查原文件与 volume:?w= / ?thumb= 不会凭空恢复原图,缺原图只能恢复备份或重新上传并更新引用。
需要管理员会话时
本地开发管理员凭据在仓库 .env(不要打印)。也可直连 sessions 表造短窗口 token:token_hash = sha256_hex(token),token 为 UUID 字符串;带 Cookie: session=<token> 与同源 Origin 调 /api/<fn><hash>,用完删除该行。
报告纪律
SSR HTML 检查只证明响应与 HTML,不能宣称已验证水合、视觉或交互;Rust、WASM、前端、浏览器验证分开报告,明确阻塞项与未执行项。