c014b2abfb075fe42091e01d07b7f15afffe6c2f
Fresh boots opened the owner/token/session stores before EnsureDataRoot dropped to the host user, leaving a root-owned maestro/ state dir whose EACCES surfaced as a bogus ERR_INVALID_CREDENTIALS on /api/auth/setup. main() now runs the handoff first; EnsureDataRoot heals pre-existing root-owned state dirs while still root (healOwnerState). Storage failures from the owner store now answer 500 ERR_INTERNAL everywhere (status/setup/login/change-password/RequireSession/ GateWebSocket) instead of blaming credentials or re-advertising setup mode; SetupRequired returns the store error instead of swallowing it, and FileOwnerStore.Verify propagates read errors rather than masking them as unknown-user.
Maestro
Dcntrlized project coordinator service
Access & transport
The dashboard ships session cookies (instance-owner gate), so the deployment
default is loopback-only: docker-compose.yaml binds
127.0.0.1:8080:8080, making the listener unreachable from the LAN unless you
deliberately opt out. Maestro itself stays plaintext HTTP; TLS terminates in a
reverse proxy (D6 — no TLS machinery inside the process).
Single host
Reach the UI over SSH from your workstation:
ssh -L 8080:127.0.0.1:8080 <host>
# then open http://localhost:8080
Reverse proxy (LAN / public)
Put Caddy, Traefik or nginx in front of http://127.0.0.1:8080 and terminate
TLS there:
maestro.example.org {
reverse_proxy 127.0.0.1:8080
}
- WebSocket: the UI uses
/api/ws. Caddy and Traefik proxy upgrades automatically; nginx needs explicit headers:location / { proxy_pass http://127.0.0.1:8080; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; proxy_set_header Host $host; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; } - Cookies behind the proxy: set
COOKIE_SECURE=truein Maestro's environment so both session cookies (maestro_access/maestro_refresh) are markedSecure. - Host header: mutating requests carry an Origin/Referer CSRF check that
compares hosts. A proxy that preserves
Hostworks unchanged; if you rewrite the host, keep forwardingX-Forwarded-*and serve the UI on the same host you proxy to.
Languages
Go
63.9%
TypeScript
32.3%
CSS
3.3%
HTML
0.3%
Dockerfile
0.2%