| `database` | `name`, `containerName`, `engine` | Thin skin over the same Docker collector - `engine` is `postgres` or `redis`, used for icon/label only. `interval` default `10s`. |
| `http` | `name`, `url` | HTTP health check with latency and consecutive-failure tracking. Optional `method` (default `GET`), `timeout` (default `5s`), `interval` (default `30s`), `expect.status` (default `200`). |
| `traefik` | `apiUrl` | Router/entrypoint/middleware status from Traefik's own API (`--api.dashboard=true` must be enabled). Optional `name` (default `Traefik`), `interval` (default `15s`). |
`interval`/`timeout` values are duration strings: `500ms`, `5s`, `1m`, `1h`.
### Auto-discovery
With `discovery.docker.enabled: true`, PulseNode scans running containers
every 60s (and immediately on any `config.yml` change) for
`traefik.enable=true` labels, parses the router's `Host(...)` rule for a
link, and adds anything not already listed manually to a synthetic
"Discovered" group. `discovery.docker.excludeLabels` and `.network` narrow
what qualifies; `.labelPrefix` (default `traefik`) controls which label
namespace is read.
## Deployment
```bash
cp .env.example .env
cp config/.env.example config/.env
# edit both, then:
docker compose up -d --build
```
-`.env` (repo root) holds `TRAEFIK_HOST`, `NETWORK_NAME`, and `DOCKER_GID` -
compose-level values, interpolated into `docker-compose.yml`'s Traefik
labels and used to join the container to the docker group. Find your
host's docker group id with `getent group docker | cut -d: -f3`; without
it the non-root container gets `EACCES` on `/var/run/docker.sock`.
-`config/.env` holds values referenced from `config.yml` (see above).
- The compose file joins the container to an **external**`falcon_network`
so collectors can reach services directly by container name
(`http://umami:3000/...`) instead of only through Traefik.
-`/var/run/docker.sock` is mounted read-only; `/app/config` is mounted
read-only from `./config`.
- The container runs as a non-root user with a read-only root filesystem,