Service access¶
Once a Minder instance is running (Self-hosting), day-to-day you need to reach its services: hit a health endpoint, open a management UI, tail a log, or drop into a database shell. This page is the practical reference for how to get to each running service and which access path applies.
For the full deployment topology and hardening steps, see Production; for a tour of the browser control-plane, see Using Minder. This page is about access, not topology.
The access model¶
A full install runs on the order of three dozen containers (a couple are
failover-mode sidecars that stay inactive by default), all on the internal
minder-network Docker network. There are three ways to reach a service:
- Loopback host port — a port published on
127.0.0.1. Reachable on the box (curl http://localhost:<port>) for ops and health, but not from other machines. Use this for local health and debugging. - Reverse-proxy route — a
*.minder.localvirtual host served by Traefik on ports80/443. This is the intended path for external access, and it is gated by Authelia forward-auth. See Authentication. - Internal-only — no host port at all. Reachable from inside the Docker network by container name, or through a reverse-proxy route where one exists.
Host ports are loopback-bound
Every non-proxy host port is bound to 127.0.0.1, so it is reachable on the
host only. External access is meant to go through the reverse proxy, which
sits in front of the auth gate. Because the loopback ports sit behind that
gate, treat access to the box itself as privileged and firewall it
accordingly.
Host ports (loopback)¶
A published port is bound to 127.0.0.1; reach it on the host at
http://localhost:<port>. The core API table says which services publish one by
default. Each core API also serves interactive docs at /docs.
Core API services (FastAPI)¶
| Service | Container | Port | Published on the host |
|---|---|---|---|
| API Gateway | minder-api-gateway |
8000 | Yes (127.0.0.1) |
| Plugin Registry | minder-plugin-registry |
8001 | Only with MINDER_DEV_PORTS=1 |
| Platform Ops | minder-platform-ops |
8010 | Only with MINDER_DEV_PORTS=1 |
| Marketplace | minder-marketplace |
8002 | Only with MINDER_DEV_PORTS=1 |
| Orchestrator | minder-orchestrator |
8003 | Only with MINDER_DEV_PORTS=1 |
| RAG Pipeline | minder-rag-pipeline |
8004 | Only with MINDER_DEV_PORTS=1 |
| Model Management | minder-model-management |
8005 | Only with MINDER_DEV_PORTS=1 |
| TTS / STT | minder-tts-stt |
8006 | Only with the TTS/STT failover router |
| Graph-RAG | minder-graph-rag |
8008 | Only with MINDER_DEV_PORTS=1 |
| Web client | minder-client |
8009 | Yes (127.0.0.1) |
By default only the API Gateway (8000) and the web client (8009) publish a
host port. The other core APIs are reached over the internal service network,
and from outside only through the gateway, which applies auth and rate limits.
To debug one service directly, set MINDER_DEV_PORTS=1 in .env and run
bash setup.sh restart; that publishes their ports on 127.0.0.1 as well.
Platform Ops is the operational control plane (service discovery, bundles,
container logs, backups); see the API reference.
The TTS/STT service does not publish a host port in the default configuration either; reach it through the API Gateway proxy. It only binds a host port when its optional failover profile is active.
Observability and proxy¶
| Service | Container | Host port(s) |
|---|---|---|
| Grafana | minder-grafana |
3000 |
| Prometheus | minder-prometheus |
9090 |
| Alertmanager | minder-alertmanager |
9093 |
| InfluxDB | minder-influxdb |
8086 |
| OTel Collector | minder-otel-collector |
OTLP ingestion (gRPC/HTTP) — trace ingestion, not a browsable UI |
| Traefik | minder-traefik |
80, 443, 8081 (dashboard, IP-whitelisted) |
The Jaeger tracing UI has no loopback port: its base image ships with no authentication of its own, so publishing it on the host would expose the full trace UI to anyone with host access, with no credential check. Reach it only through its reverse-proxy route (below), where Authelia gates it. Its trace-ingestion ports are unaffected — they are not a browsable admin surface. See Monitoring.
# Reach loopback services on the host
curl http://localhost:8000/health # API Gateway
curl http://localhost:8000/v1/plugins # Plugin Registry, through the gateway
curl http://localhost:8000/v1/status # every core service's /health, through the gateway
# open http://localhost:3000 for Grafana
Reaching services through the reverse proxy¶
Traefik routes selected services on *.minder.local virtual hosts over ports
80/443. It is not exposed by default — only labeled services are routed:
| Host | Backend |
|---|---|
api.minder.local |
API Gateway |
grafana.minder.local |
Grafana |
jaeger.minder.local |
Jaeger UI |
chat.minder.local |
OpenWebUI (chat UI) |
minio.minder.local |
MinIO console |
rabbitmq.minder.local |
RabbitMQ management UI (IP-whitelisted) |
neo4j.minder.local |
Neo4j browser (IP-whitelisted) |
An Authelia forward-auth middleware gates the api-gateway, Grafana, OpenWebUI,
MinIO, Jaeger, and client routers: an unauthenticated request to those routes is
302-redirected to the Authelia portal. Because the underlying host ports are
loopback-only, there is no direct-port bypass. Full browser SSO also requires
real DNS and valid TLS on the deployment — see
Authentication.
To use the .minder.local hostnames from another machine on your network, add
them to that machine's hosts file pointing at the host running Traefik
(for example 192.168.1.50). For reaching an instance beyond the local network,
see Remote access.
Internal-only services¶
These publish no host port. Reach them from inside the Docker network by container name, or through a reverse-proxy route where one exists (see above).
| Service | Container | Notes |
|---|---|---|
| PostgreSQL | minder-postgres |
Relational data (primary + auxiliary databases) |
| Redis | minder-redis |
Cache, sessions, rate-limit counters |
| Qdrant | minder-qdrant |
Vector store for RAG |
| Neo4j | minder-neo4j |
Graph store; browser routed via neo4j.minder.local |
| MinIO | minder-minio |
S3-compatible object store; console via minio.minder.local |
| RabbitMQ | minder-rabbitmq |
Message queue; management UI via rabbitmq.minder.local |
| Schema Registry | minder-schema-registry |
Apicurio schema registry |
| Ollama | minder-ollama |
Local LLM runtime (local inference mode only) |
| Prometheus exporters | postgres / redis / rabbitmq / node / cadvisor / blackbox | Scraped by Prometheus |
# From inside the Docker network, a container name resolves via Docker DNS
docker exec minder-api-gateway curl http://minder-qdrant:6333/
docker exec minder-api-gateway curl http://minder-graph-rag:8008/health
Health and logs¶
# Overview
bash setup.sh status
docker ps -a --filter health=unhealthy # should be empty
# Per-service health (on the host)
curl http://localhost:8000/health # api-gateway
curl http://localhost:8004/health # rag-pipeline
curl http://localhost:9090/-/healthy # prometheus
curl http://localhost:3000/api/health # grafana
# Logs
docker logs minder-<service> --tail 100 -f
\"no healthcheck\" is not \"unhealthy\"
A few containers (the OTel collector and the Redis and RabbitMQ exporters)
ship without a healthcheck by design, because their base images lack the
tooling a probe would need. They show blank health in docker ps — confirm
them from their logs, not their health status.
Debugging access¶
Use docker exec to reach a service or a data backend directly:
# Health of a service from inside its own container
docker exec minder-api-gateway curl http://localhost:8000/health
# Database shells
docker exec -it minder-postgres psql -U "$POSTGRES_USER"
docker exec -it minder-redis redis-cli -a "$REDIS_PASSWORD" ping
# Ollama is internal-only — list models from inside the container
docker exec minder-ollama ollama list
Troubleshooting access¶
404 from the reverse proxy — confirm the target container is up and its route is registered:
Cannot reach an internal service from the host — internal-only services
(Postgres, Redis, Qdrant, Ollama, and others) publish no host port by design.
Reach them via docker exec into a service container, or via their reverse-proxy
route where one exists.
A service is unreachable — inspect and restart it:
docker ps -a --filter name=minder-<service>
docker logs minder-<service> --tail 50
bash setup.sh restart <service>
The full catalog of fixes is in Troubleshooting.
Related pages¶
- Production — deployment topology, ports, and hardening.
- Using Minder — the browser control-plane tour.
- Authentication — SSO, JWTs, and the Authelia auth gate.
- Monitoring — the observability stack.
- Remote access — reaching an instance beyond the LAN.
- Troubleshooting — diagnostics and common fixes.