One dashboard for all your Docker hosts. A lightweight agent runs next to the Docker Engine on each host; a central server collects what the agents report and sends back what you ask them to do. DIM replaces neither Docker nor Compose — it is the control plane above the engines you already run.
- Every host in one place — containers, images, volumes and networks, live over WebSockets.
- Container and image actions — start, stop, restart, remove, pull, prune, straight from the UI.
- Update checks — local digests compared with Docker Hub,
ghcr.ioandlscr.io. - Pull & Recreate — update an image and recreate its containers in one step.
- Projects — group containers across hosts by a query and update them together.
- Autonomous auto-update — label- or project-driven, scheduled per host or project, run by the agents themselves, so it keeps working while the server is down.
- Activity list — what happened on each host, from the Docker event stream, grouped by the action or run that caused it.
- Webhooks — events go to a chat channel, a push service or an endpoint of your own, each webhook with a JSON body template of its own, filtered by level and event kind.
- Secure by default — agents register with a one-time token and a setup PIN; per-client address checks; local accounts and OIDC single sign-on.
Server — in an empty directory, touch server-config.yaml first, then:
services:
dim-server:
image: ghcr.io/stefgo/dim-server:latest
container_name: dim-server
ports:
- "3000:3000"
volumes:
- server-data:/app/server/backend/data
- ./server-config.yaml:/app/server/config.yaml
environment:
- NODE_ENV=production
restart: unless-stopped
volumes:
server-data:docker compose up -d, open http://<server>:3000 and sign in with admin / admin —
then change that password under Users.
Agent — on each Docker host, sudo touch client-config.yaml (the file has to belong to
root, the agent runs without capabilities), then:
services:
dim-client:
image: ghcr.io/stefgo/dim-client:latest
container_name: dim-client
ports:
- "3001:3001"
cap_drop:
- ALL
security_opt:
- no-new-privileges:true
read_only: true
tmpfs:
- /tmp
volumes:
- /var/run/docker.sock:/var/run/docker.sock
- ./client-config.yaml:/app/client/config.yaml
- client-data:/app/client/data
environment:
- NODE_ENV=production
restart: unless-stopped
volumes:
client-data:docker compose up -d, then in the dashboard Clients → Add Client → The agent connects to
this server → Generate Token. Open http://<host>:3001/register and enter the server URL,
the token and the setup PIN from docker logs dim-client.
The Quick Start guide walks through the same steps with screenshots.
stefgo.github.io/docker-instance-manager
— sources in docs/:
- Quick Start and Configuration
- User guide: Clients, Updates & Auto-Update, Activity, Webhooks
- Security, Operations, Upgrade Notes
- REST & WebSocket API and the architecture of backend, frontend and agent
An npm monorepo: server/backend (Fastify, SQLite), server/frontend (React, Vite),
client (the agent, Dockerode) and shared (types and Zod schemas). Setup, build pipeline and
release process are in the
Development guide.
Contributions are welcome — for larger changes please open an issue first.
MIT — see LICENSE.
