Skip to content

rishisulakhe/shipwright

Folders and files

NameName
Last commit message
Last commit date

Latest commit

Β 

History

56 Commits
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

Repository files navigation

Shipwright

A centralized multi-host Docker management dashboard built with Go and React/TypeScript. Monitor and manage containers, images, networks, and volumes across multiple Docker hosts from a single web interface.

Go React PostgreSQL Docker Kubernetes


Project architechture

flowchart TD
    Browser["🌐 Browser"] -->|HTTP / WS| Ingress

    subgraph K8S["☸️ Kubernetes Cluster"]
        Ingress["🚦 Ingress NGINX<br/>docker-dash.local"]

        subgraph Frontend["βš›οΈ Frontend (React + Vite)"]
            ReactUI["React + Tailwind<br/>Charts, xterm.js"]
            FrontendSVC["frontend-service<br/>ClusterIP :80"]
            ReactUI --> FrontendSVC
        end

        subgraph Backend["🟒 Backend (Go + Chi)"]
            APIRouter["API Router + JWT Auth"]
            HostMgr["Host Manager"]
            ContainerMgr["Container Manager"]
            NetworkMgr["Network Manager"]
            VolumeMgr["Volume Manager"]
            ImageMgr["Image Manager"]
            LogStream["Log Streamer<br/>WebSocket"]
            StatsMon["Stats Monitor<br/>WebSocket"]
            Terminal["Interactive Terminal<br/>WebSocket"]
            BackendSVC["backend-service<br/>ClusterIP :8080"]

            APIRouter --> HostMgr
            APIRouter --> ContainerMgr
            APIRouter --> NetworkMgr
            APIRouter --> VolumeMgr
            APIRouter --> ImageMgr
            APIRouter --> LogStream
            APIRouter --> StatsMon
            APIRouter --> Terminal
            APIRouter --> BackendSVC
        end

        subgraph Database["🐘 PostgreSQL StatefulSet"]
            PostgresSVC["postgres-service<br/>ClusterIP :5432"]
            PostgresPod["PostgreSQL Pod"]
            PV["πŸ’Ύ PV 1Gi"]

            PostgresSVC --> PostgresPod --> PV
        end

        subgraph Config["βš™οΈ Configuration"]
            CM["πŸ“„ ConfigMap<br/>DATABASE_URL<br/>MIGRATIONS_PATH<br/>POSTGRES_DB / USER"]
            Sec["πŸ” Secret<br/>POSTGRES_PASSWORD<br/>JWT_SECRET"]
        end

        Ingress -->|"/ /ws"| FrontendSVC
        Ingress -->|"/api"| BackendSVC

        HostMgr -.->|Docker Socket| D1
        HostMgr -.->|Docker Socket| D2
        HostMgr -.->|Docker Socket| DN
        ContainerMgr -.->|Docker SDK| D1
        NetworkMgr -.->|Docker SDK| D1
        VolumeMgr -.->|Docker SDK| D1
        ImageMgr -.->|Docker SDK| D1

        BackendSVC -->|TCP 5432| PostgresSVC
        CM -.->|env| BackendSVC
        Sec -.->|env| BackendSVC
        CM -.->|env| PostgresPod
        Sec -.->|env| PostgresPod
    end

    subgraph Hosts["🐳 Docker Hosts"]
        D1["Docker Host 1<br/>Docker Daemon"]
        D2["Docker Host 2<br/>Docker Daemon"]
        DN["Docker Host N<br/>Docker Daemon"]
    end

    D1 -.->|"hostPath<br/>/var/run/docker.sock"| Backend
    D2 -.->|"registered<br/>TCP endpoint"| Backend
    DN -.->|"registered<br/>TCP endpoint"| Backend
Loading

Features

  • Multi-host management β€” Register Unix socket, TCP, or SSH Docker hosts
  • Container lifecycle β€” Create, start, stop, and remove containers with port mappings
  • Real-time logs β€” Stream container logs via WebSocket with tail control
  • Live stats β€” CPU, memory, network, and block I/O charts updated in real-time
  • Interactive terminal β€” Browser-based shell via xterm.js and Docker exec
  • Network management β€” Create, delete, connect/disconnect containers from networks
  • Volume management β€” Create and remove volumes
  • Image management β€” Pull and delete images; dangling images filtered by default
  • Production-ready β€” Multi-stage Docker builds, Nginx reverse proxy, health checks

Architecture(k8s)

flowchart TD
    Browser["🌐 Browser"] -->|http://docker-dash.local| Ingress

    subgraph KIND_CLUSTER["☸️ KIND CLUSTER"]
        Ingress["🚦 Ingress NGINX<br/>docker-dash.local"]

        subgraph Frontend["Frontend Deployment"]
            FrontendSVC["frontend-service<br/>ClusterIP: 80"]
            ReactPod["βš›οΈ React + Nginx Pod"]

            FrontendSVC --> ReactPod
        end

        subgraph Backend["Backend Deployment (2 Replicas)"]
            BackendSVC["backend-service<br/>ClusterIP: 8080"]
            GoPod1["🟒 Go Pod 1"]
            GoPod2["🟒 Go Pod 2"]

            BackendSVC --> GoPod1
            BackendSVC --> GoPod2
        end

        subgraph Database["PostgreSQL StatefulSet"]
            PostgresSVC["postgres-service<br/>ClusterIP: 5432"]
            PostgresPod["🐘 PostgreSQL Pod"]
            PV["πŸ’Ύ PersistentVolume (1Gi)"]

            PostgresSVC --> PostgresPod
            PostgresPod --> PV
        end

        subgraph Config["Configuration"]
            CM["πŸ“„ ConfigMap<br/>POSTGRES_DB Β· POSTGRES_USER<br/>DATABASE_URL Β· MIGRATIONS_PATH"]
            Sec["πŸ” Secret<br/>POSTGRES_PASSWORD Β· JWT_SECRET"]
        end

        Ingress -->|/ & /api/ws| FrontendSVC
        Ingress -->|/api| BackendSVC

        GoPod1 -->|TCP 5432| PostgresSVC
        GoPod2 -->|TCP 5432| PostgresSVC

        CM -.->|env vars| GoPod1
        CM -.->|env vars| PostgresPod
        Sec -.->|env vars| GoPod1
        Sec -.->|env vars| PostgresPod

        GoPod1 -.->|/var/run/docker.sock| DockerSocket["πŸ”Œ Docker Socket (hostPath)"]
        GoPod2 -.->|/var/run/docker.sock| DockerSocket
    end
Loading

Quick Start

Docker Compose (Development)

git clone https://github.com/YOUR_USERNAME/shipwright.git
cd shipwright
make dev-up
Service URL
Frontend http://localhost:5173
Backend API http://localhost:8080
PostgreSQL localhost:5432

Kubernetes (kind)

cd shipwright
bash scripts/k8s-deploy.sh

Add to /etc/hosts:

127.0.0.1 docker-dash.local

Then open http://docker-dash.local


Project Structure

shipwright/
β”œβ”€β”€ backend/
β”‚   β”œβ”€β”€ cmd/server/          # Entrypoint (--migrate flag for DB migrations)
β”‚   β”œβ”€β”€ internal/            # Handlers, middleware, auth, repository, config
β”‚   β”œβ”€β”€ pkg/dockerclient/    # Docker SDK client + DockerProvider interface
β”‚   β”œβ”€β”€ migrations/          # PostgreSQL schema migrations
β”‚   └── Dockerfile           # Multi-stage production build (~11MB)
β”œβ”€β”€ frontend/
β”‚   β”œβ”€β”€ src/                 # React components, pages, services
β”‚   β”œβ”€β”€ Dockerfile           # Multi-stage build with Nginx (~21MB)
β”‚   └── nginx.conf           # SPA routing, gzip, API proxy
β”œβ”€β”€ infra/k8s/              # Kubernetes manifests
β”‚   β”œβ”€β”€ kind-cluster.yaml
β”‚   β”œβ”€β”€ namespace.yaml
β”‚   β”œβ”€β”€ postgres-*.yaml
β”‚   β”œβ”€β”€ backend-*.yaml
β”‚   β”œβ”€β”€ frontend-*.yaml
β”‚   └── ingress.yaml
β”œβ”€β”€ docker-compose.yaml      # Dev stack
β”œβ”€β”€ docker-compose.prod.yaml # Production stack
β”œβ”€β”€ Makefile
└── scripts/k8s-deploy.sh

Testing

make test           # Backend tests
make test-cover     # Tests with coverage report
make lint           # Lint backend + frontend
make lint-backend   # Backend lint only
make lint-frontend  # Frontend lint only (or lint-frontend-fix)

License

This project is private and proprietary.

About

A centralized multi-host Docker management dashboard

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors