You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
genie-api always binds to 127.0.0.1:3080, while health probes, genie-ctl, and the dashboard Services row read [services.api].url from geniepod.toml. If an operator changes only the configured URL (e.g. for a second local instance on port 4080), probes and CLI target the new port but genie-api still listens on :3080, producing false DOWN signals and a broken dashboard.
This is the same class of config drift as #121 ([core].port vs [services.core].url), but for the dashboard service itself.
Duplicate check
Searched open/closed issues and PRs (May 2026). Related work fixed probe/proxy paths only, not the API server bind address:
Summary
genie-apialways binds to127.0.0.1:3080, while health probes,genie-ctl, and the dashboard Services row read[services.api].urlfromgeniepod.toml. If an operator changes only the configured URL (e.g. for a second local instance on port4080), probes and CLI target the new port butgenie-apistill listens on:3080, producing false DOWN signals and a broken dashboard.This is the same class of config drift as #121 (
[core].portvs[services.core].url), but for the dashboard service itself.Duplicate check
Searched open/closed issues and PRs (May 2026). Related work fixed probe/proxy paths only, not the API server bind address:
genie-ctl/ dashboard proxies to genie-core now useConfig::core_http_addr().genie-ctl/ dashboard probegenie-apiand HA from[services.*].url.genie-apilisten address ignoring config.Steps to reproduce
Set a non-default API URL while leaving the binary unchanged:
Start the stack:
Observe bind vs config:
genie-ctl health/ dashboard Services row forapireport unhealthy while the process is up on the wrong port.Expected behavior
genie-apilistens, aligned with[services.api].url(or explicit[api].port/[api].bind_hostmirroring[core]).genie-ctlagree with the actual listen socket.:3080) unchanged.Actual behavior
crates/genie-api/src/main.rshardcodes the bind address:Meanwhile
genie-corecorrectly usesconfig.core.portandconfig.core.bind_hostat startup.Suggested fix
Add
ApiConfig(or reuse parsed host/port from[services.api].url) ingenie-common, e.g.:genie-api:http::serve(&config.api_http_addr(), config)instead of a literal.Optional: At
Config::load(),tracing::warn!ifservices.api.urlport disagrees with the derived listen port (same pattern proposed for[services.core].urldrifts from[core].port— health monitor and dashboard probe wrong port #121).Tests:
genie-commonunit test — URLhttp://127.0.0.1:4080/api/status→ bind addr127.0.0.1:4080.Acceptance criteria
[services.api].url = "http://127.0.0.1:4080/api/status",genie-apilistens on127.0.0.1:4080.genie-health, dashboard/api/servicesapi row, andgenie-ctl healthall agree when the service is healthy.:3080) has no regression.Hardware / version
main@ clone time (2026-05-22)Related
genie-corehealth URL