Port all IPC handlers to HTTP endpoints so the UI and LLM use the same API. Adds routes/projects.js (scan, compare, init), routes/servers.js (CRUD, containers, logs), routes/docker.js (build, deploy, pull, vscode-diff). Enhanced ssh.js with full SSHService class (SFTP upload/download). Updated renderer api.js to use fetch instead of window.api IPC. Added concurrently for npm run dev (API + Vite + Electron). OpenAPI spec now covers all 24 endpoints. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Docker Deployment Manager - Desktop App
Electron desktop app for managing Docker deployments across multiple Linux servers.
Quick Start
# 1. Install dependencies
npm install
# 2. Configure SSH credentials
cp .env.example .env
# Edit .env with your SSH_USERNAME and SSH_PASSWORD
# 3. Run the app
npm start
# For development with DevTools:
npm run dev
Features
Dashboard
The main screen shows all projects in your C:\.bucket\Repos.Git directory that have Docker configurations.
| Column | Description |
|---|---|
| Project | Project name and path |
| Local | Click to see what files are present/missing |
| Deployed | Whether the project exists on the selected server |
| Running | Whether the container is currently running |
| Diff | Compare local vs deployed docker-compose.yml |
| Actions | Build, Deploy buttons |
Local Status (Click for Details)
Shows what files each project has:
- Dockerfile - Container build instructions (you create this manually)
- docker-compose.yml - Runtime config (ports, env, volumes)
- build-image-tar.ps1 - Script to build and package Docker image
- .dockerignore - Files to exclude from Docker image
If files are missing, click the status badge to see what's needed and how to fix it.
Server Management
Click "Servers" to add your Linux servers:
- Name: Friendly name (e.g., "Production Server")
- Host: IP address (e.g., 192.168.69.4)
- Username: SSH username (optional, uses .env by default)
Actions
Build
Runs the project's build-image-tar.ps1 script which:
- Builds the Docker image:
docker buildx build --platform linux/amd64 - Saves to tar:
docker save -o project.tar
Deploy
- Uploads the tar file to
~/containers/{project}/ - Uploads docker-compose.yml
- Runs
docker load -i project.tar - Runs
docker compose up -d
Compare (Diff)
Shows local vs deployed docker-compose.yml side by side.
- Pull: Download server version to local (sync your source of truth)
- Push: Upload local version to server
Init Project
If a project is missing files, the Details modal shows:
- Which files are missing
- Commands to create them
Click "Run CLI Init" to generate missing files using the CLI tool.
Configuration
SSH Credentials (.env)
SSH_USERNAME=deployer
SSH_PASSWORD=your-password-here
Server Config (deployment-config.json)
Auto-generated when you add servers:
{
"servers": [
{ "id": "1", "name": "Server 1", "host": "192.168.69.4" },
{ "id": "2", "name": "Server 2", "host": "192.168.69.5" }
],
"projectsRoot": "C:\\.bucket\\Repos.Git"
}
Server Convention
The app expects this structure on your Linux servers:
~/containers/
├── game.justone/
│ ├── docker-compose.yml
│ ├── .env (optional)
│ ├── data/ (optional)
│ └── game.justone.tar
├── another-project/
│ └── ...
Workflow
First Time Setup
- Create Dockerfile manually for your project (each project is different)
- Use CLI or app to generate docker-compose.yml and build scripts
- Add your server(s) in the app
- Build and deploy
Regular Deployment
- Make code changes
- Click "Build" to create new tar
- Click "Deploy" to push to server
Checking Differences
If you manually edited something on the server:
- Select server and click "Scan Server"
- Click "Compare" on the project
- Review differences
- Click "Pull" to update your local copy (source of truth)
Files
app/
├── main/
│ ├── index.js # Electron main process + IPC handlers
│ ├── ssh-service.js # SSH/SFTP operations
│ ├── project-scanner.js # Scans local projects for Docker files
│ └── server-scanner.js # Scans remote ~/containers/* via SSH
├── renderer/
│ ├── index.html # Dashboard UI
│ ├── styles.css # Dark theme
│ └── app.js # Frontend logic
├── preload.js # IPC bridge (contextBridge)
├── .env # SSH credentials (not committed)
├── .env.example # Template
└── package.json