A clean, responsive web console for Ship — the Kamal-inspired Docker deployment tool. Built with React + Vite and HeroUI.
Unlike a static mockup, this ships with a small dependency-free Node backend that drives real Docker containers and presents them through Ship's domain model — services, accessories, hosts, and deployments. Every button performs a real docker operation.
- Overview — live fleet stats, recent deployments, and an activity feed
- Services — container services with images, pools, live CPU/memory, uptime, and status
- Hosts — real host metrics (CPU / memory / disk) read from
/procand Docker - Accessories — stateful services (postgres, redis) on named volumes
- Deployments — a rollback-aware release timeline
- ship.yml — a syntax-highlighted config viewer generated from live state
- Light / dark theme, mobile-responsive, built entirely from HeroUI components
| Action | What it actually does |
|---|---|
| Deploy / Redeploy | docker pull + recreate the container from its spec |
| Roll back | Recreate pinned to the previous image generation |
| Start / Stop / Restart | docker start / stop / restart |
| Backup (accessory) | Real pg_dumpall / redis SAVE written to disk |
| Logs | Streams docker logs into a modal |
Live metrics poll every few seconds; every action reflects immediately in the UI.
Browser ──HTTPS──> Caddy ──> Node backend (:8090) ──> Docker Engine
React + HeroUI TLS server/server.js ship-demo-* containers
- Frontend — React 18 + Vite 6, HeroUI 2 (Tailwind CSS 3), lucide-react icons.
- Backend — a single
server/server.jswith zero npm dependencies. It shells out to thedockerCLI, serves the built SPA, and exposes a tiny JSON API (/api/state,/api/action,/api/logs). - Demo containers are namespaced
ship-demo-*and labelledship.*, so the backend only ever manages its own resources.
npm install
npm run dev # http://localhost:5173 (proxies to the backend at :8090)
npm run build # production build → dist/Requires Node 18+ and Docker on the host.
node server/server.js # serves the API + ./server/public on :8090
PORT=8090 PUBLIC_HOST=your.domain node server/server.jsOn first boot it creates the demo containers (web, api, worker, postgres, redis) on an isolated ship-demo Docker network. Build the frontend and copy dist/ into server/public/ to serve everything from one port.
src/
App.jsx # HeroUI Navbar + Tabs shell (responsive)
api.jsx # live API client + polling state provider
ui.jsx # shared StatusChip / Meter
components/ # LogsModal
pages/ # Overview, Services, Hosts, Accessories, Deployments, Config
server/
server.js # dependency-free Docker-driven backend
The deployment tool this dashboard is built for is watzon/ship by Chris Watson — a single-binary, Kamal-inspired system for deploying Docker apps to plain Linux servers. This project is an independent UI and is not affiliated with or endorsed by the Ship project.
MIT