# Docker Multi-Host Management Tools — Comparison

**Researched:** 2026-07-09
**Context:** IT Pro Partner multi-server Docker Compose environment (Core, ai.itpropartner.com, docker, unms, etc.). Need single-pane visibility across hosts, REST API for Hermes scripting, and self-hosted.

## Top 3 Recommendation

### 🏆 1st: **Komodo** — API-first multi-host Docker management
- **Architecture:** Core (web UI + API) + Periphery (agent on each host)
- **Why:** Best API story — REST + WebSocket + CLI + Rust/npm client libraries. Perfect for Hermes scripting. GPL-3.0, truly free, unlimited servers. Built-in backup/restore, webhooks, GitOps.
- **Trade-off:** Needs MongoDB (or FerretDB/Postgres). Heavier setup than alternatives.
- **Setup:** Docker Compose (Core + Mongo) + Python install script for Periphery agents
- **Docs:** https://komo.do/docs/intro
- **GitHub:** https://github.com/moghtech/komodo

### 🥈 2nd: **Arcane** — Modern, BSD-3-Clause, no-MongoDB option
- **Architecture:** Manager (Go backend + SvelteKit UI) + Agent (Direct or Edge mode)
- **Why:** 100% free BSD-3-Clause. Beautiful UI. OpenAPI 3.1 REST API. Edge mode handles NAT/firewall'd hosts (agents dial out). Built-in vulnerability scanning. iOS mobile app.
- **Trade-off:** Newer project (6.3k stars), smaller community than Portainer.
- **Setup:** Single Docker container for Manager, one per Agent
- **Docs:** https://getarcane.app/docs/setup/installation
- **GitHub:** https://github.com/getarcaneapp/arcane

### 🥉 3rd: **Portainer** — Most mature, best documented
- **Architecture:** Portainer Server + lightweight Go Agent on each host
- **Why:** Industry standard. Extensive docs. Free BE tier covers 3 nodes with full features. Comprehensive REST API. Agent auto-updates, mTLS.
- **Trade-off:** Beyond 3 nodes costs money. Heavier/fuller-featured than needed for Compose-only.
- **Setup:** `docker run` agent command on each host, add via UI
- **Docs:** https://docs.portainer.io/
- **GitHub:** https://github.com/portainer/portainer

## All Evaluated Tools

| Tool | Multi-Host | REST API | Free | Web GUI | License | Stars | Setup |
|---|---|---|---|---|---|---|---|
| **Portainer** | ✅ Agent | ✅ Full API | 3 nodes free | ⭐⭐⭐⭐⭐ | Proprietary/MIT | ~30k | Easy |
| **Arcane** | ✅ Agent (Direct+Edge) | ✅ OpenAPI 3.1 | ✅ 100% FOSS | ⭐⭐⭐⭐ | BSD-3-Clause | 6.3k | Easy |
| **Komodo** 🏆 | ✅ Periphery Agent | ✅ REST + WS + 3 libs | ✅ 100% FOSS | ⭐⭐⭐⭐ | GPL-3.0 | ~3k | Medium |
| **Dockge** | ✅ Agents (v1.4+) | ❌ No API | ✅ 100% FOSS | ⭐⭐⭐⭐ | MIT | 23.7k | Easy |
| **Dockhand** | ✅ Agent/TLS/Hawser | ⏳ Roadmap (distant) | ✅ Homelab free | ⭐⭐⭐⭐⭐ | BSL 1.1 | 5.1k | Easy |
| **Lazydocker** | ❌ Single host | ❌ No API | ✅ 100% FOSS | ❌ TUI only | MIT | 38.7k | Very Easy |

## Why the Others Don't Fit

- **Dockge:** No API, no webhooks, compose-only. Great for single-user compose management but can't be scripted by Hermes.
- **Dockhand:** No API (roadmap item, "distant future"). BSL license (not truly open source). Paid for commercial use. Beautiful UI but unusable for automation.
- **Lazydocker:** Single host only. Terminal-only. Good for quick SSH checks, not a management platform.

## Quick Deploy Commands

### Komodo (Correct v2 Env Vars — See references/komodo-deployment.md)

**CRITICAL:** Komodo v2 uses `KOMODO_DATABASE_ADDRESS` (not `MONGO_CONNECTION_STRING`), `KOMODO_PORT` (not `KOMODO_SERVER_PORT`). Using wrong env vars causes startup failure with _"Failed to initialize database"_ errors.

```yaml
# Core (management server) — full reference in references/komodo-deployment.md
services:
  mongo:
    image: mongo
    restart: unless-stopped
    command: --quiet --wiredTigerCacheSizeGB 0.25
    volumes:
      - ./data/mongo-data:/data/db
  core:
    image: ghcr.io/moghtech/komodo-core:2
    init: true
    restart: unless-stopped
    ports:
      - 9120:9120
    depends_on:
      - mongo
    volumes:
      - ./backups:/backups
      - ./keys:/config/keys
    environment:
      - KOMODO_DATABASE_ADDRESS=mongo:27017
      - KOMODO_PORT=9120
      - KOMODO_HOST=https://komodo.itpropartner.com
      - KOMODO_TITLE=Komodo
      - KOMODO_LOCAL_AUTH=true
      - KOMODO_INIT_ADMIN_USERNAME=admin
      - KOMODO_INIT_ADMIN_PASSWORD=changeme
      - KOMODO_FIRST_SERVER_NAME=core
      - KOMODO_PERIPHERY_PUBLIC_KEY=file:/config/keys/periphery.pub
      - KOMODO_DISABLE_CONFIRM_DIALOG=false
      - KOMODO_DISABLE_INIT_RESOURCES=false
      - KOMODO_JWT_SECRET=change-me
      - KOMODO_JWT_TTL=1-day
      - KOMODO_MONITORING_INTERVAL=15-sec
      - KOMODO_RESOURCE_POLL_INTERVAL=1-hr
```

```bash
# Periphery (each managed host)
curl -sSL https://raw.githubusercontent.com/moghtech/komodo/main/scripts/setup-periphery.py \
  | python3 - \
  --core-address="https://komodo.itpropartner.com" \
  --connect-as="$(hostname)" \
  --onboarding-key="O-..."
```

### Arcane
```bash
# Manager
docker run -d --name arcane -p 3552:3552 \
  -v arcane_data:/data \
  ghcr.io/getarcaneapp/manager:latest

# Agent (each remote host)
docker run -d --name arcane-agent -p 3553:3553 \
  -v /var/run/docker.sock:/var/run/docker.sock \
  -e AGENT_MODE=true \
  -e AGENT_TOKEN=<token> \
  -e MANAGER_API_URL=http://manager:3552 \
  ghcr.io/getarcaneapp/agent:latest
```

### Portainer
```bash
# Agent on each remote host
docker run -d -p 9001:9001 --name portainer_agent --restart=always \
  -v /var/run/docker.sock:/var/run/docker.sock \
  -v /var/lib/docker/volumes:/var/lib/docker/volumes \
  portainer/agent:latest
```

## Key Links
| Tool | Website | Docs | GitHub |
|---|---|---|---|
| Portainer | https://www.portainer.io/ | https://docs.portainer.io/ | https://github.com/portainer/portainer |
| Arcane | https://getarcane.app/ | https://getarcane.app/docs/setup/installation | https://github.com/getarcaneapp/arcane |
| Komodo | https://komo.do/ | https://komo.do/docs/intro | https://github.com/moghtech/komodo |
| Dockge | https://github.com/louislam/dockge | README only | https://github.com/louislam/dockge |
| Dockhand | https://dockhand.pro/ | https://dockhand.pro/manual/ | https://github.com/Finsys/dockhand |
| Lazydocker | https://lazydocker.com/ | README only | https://github.com/jesseduffield/lazydocker |

## Multi-Host Agent Architecture Patterns

All multi-host tools use the same pattern: a central management server + lightweight agents on each Docker host.

| Pattern | Used By | How It Works |
|---|---|---|
| **Agent polls out** | Arcane Edge, Dockhand Hawser | Agent behind NAT dials out to manager. No inbound port needed. |
| **Agent listens** | Portainer Agent, Arcane Direct | Manager connects to agent on a TCP port. Requires inbound access. |
| **Systemd agent** | Komodo Periphery | Agent runs as systemd service (or Docker). Bi-directional WebSocket to Core. |
