Skip to content

Repository files navigation

Ship UI

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.


Features

  • 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 /proc and 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

Real actions

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.


Architecture

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.js with zero npm dependencies. It shells out to the docker CLI, serves the built SPA, and exposes a tiny JSON API (/api/state, /api/action, /api/logs).
  • Demo containers are namespaced ship-demo-* and labelled ship.*, so the backend only ever manages its own resources.

Getting started

Frontend (dev)

npm install
npm run dev      # http://localhost:5173  (proxies to the backend at :8090)
npm run build    # production build → dist/

Backend

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.js

On 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.


Project structure

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

Credits

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.

License

MIT

About

A responsive web console for watzon/ship

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages