Compose Control
A web-based control center for Docker and Docker Compose, with a built-in self-hosted app catalog.
Compose Control is a web-based management interface for Docker hosts, inspired by the approachable stack workflow of Dockge and the deeper environment management of Portainer. It ships as a single container, talks to your Docker engine through the Docker CLI, and stores everything it manages as plain Compose files on disk, so nothing it creates is locked away.
It is aimed at homelabbers and small teams who want one place to deploy curated self-hosted apps, edit Compose stacks in the browser, inspect containers with live resource charts, and manage multiple Docker hosts through lightweight remote agents. Compose Control is currently an early alpha.
Key Features
- Authentication – ASP.NET Core Identity login, account management, two-factor authentication, and a one-time first-run wizard that creates the initial administrator (public registration is disabled).
- Engine overview – Docker host name, version, OS, and container/image counts, with graceful handling when the engine is offline.
- Container management – discovery and filtering, detail views with logs, live CPU/memory/disk stat charts, and an interactive shell.
- Images, networks, volumes – full listings with in-use detection; networks and volumes can be created and removed.
- Stack workflow – discovery of every Compose project, an in-app editor for new stacks (with optional
.env), start/stop/restart/pull/remove lifecycle actions, and edit-and-redeploy of Compose Control-managed stacks. - Built-in app catalog – searchable catalog of popular self-hosted apps (Jellyfin, Immich, Uptime Kuma, PostgreSQL, Nginx Proxy Manager, Home Assistant) with parameterized Compose previews and one-click deploy into isolated stack directories.
- Events and audit log – live Docker engine event feed plus a Compose Control audit trail of deploys, removals, edits, and sign-ins.
- Update checks – compares the running image against the published version and flags when an update is available.
- Remote agents – register token-protected Compose Control Agent instances and switch the Control Center between Docker hosts from the top-bar environment selector.
Tech Stack
| Component | Technology |
|---|---|
| Web UI | Blazor Server (Interactive Server), Razor components |
| Backend | ASP.NET Core on .NET 9 |
| Database | SQLite via EF Core (Identity and app data) |
| Docker integration | Shells out to the docker / docker compose CLIs and parses JSON output (no Docker SDK) |
| Remote agents | Token-protected HTTP API (Compose Control.Agent) |
| Packaging | Multi-stage Dockerfile (.NET 9 SDK build, aspnet runtime + Docker CLI), GitHub Container Registry (ghcr.io/stoxello/Compose Control) |
| Tests | xUnit (tests/Compose Control.Web.Tests) |
Architecture & Project Structure
Compose Control is a single ASP.NET Core / Blazor application. Rather than using the Docker SDK, it invokes the docker and docker compose CLIs and parses their JSON output, keeping behavior identical to running commands by hand. Stacks created through the UI are written as ordinary compose.yaml (and optional .env) files under the stacks directory, sandboxed by name so only stacks Compose Control created can be edited or rewritten. A separate lightweight agent exposes the same CLI operations over HTTP for remote hosts.
docker/
├── src/
│ ├── Compose Control.Web/ Blazor UI, Identity, app catalog, and Docker services
│ │ ├── Components/ Razor pages and layouts (Apps, Stacks, Containers, Account)
│ │ ├── Services/ DockerCliService, StackService, AppDeploymentService, SetupService
│ │ └── Data/ EF Core DbContext and Identity migrations
│ └── Compose Control.Agent/ Token-protected HTTP agent for remote Docker hosts
├── tests/Compose Control.Web.Tests/ xUnit test suite
├── Dockerfile Multi-stage build (SDK build -> aspnet runtime + docker CLI)
├── compose.yaml Deployment Compose file (pulls from GHCR)
├── compose.build.yaml Overlay to build the image from source
├── compose.agent.yaml Deployment Compose file for a remote Compose Control Agent
├── ghcr-publish.ps1 Build and publish the image to GitHub Container Registry
└── scripts/ Host repair/maintenance scripts
Getting Started
Prerequisites: Docker Engine with the Compose v2 plugin (docker compose); on Windows/macOS, Docker Desktop. For development, the .NET 9 SDK and a locally running Docker engine.
- Clone the repository (or create a minimal
compose.yamlpointing at the published image). - Start the container:
docker compose up -d. The bundled file pullsghcr.io/stoxello/Compose Control:latest, so no build step is needed. If the GHCR package is private, rundocker login ghcr.iofirst. - Open http://localhost:8080 and complete the first-run administrator wizard.
- To build locally instead of pulling, layer the build overlay:
docker compose -f compose.yaml -f compose.build.yaml up -d --build. - (Optional) Install Compose Control.Agent on another Docker host and register it under the Agents page.
# Quick start
git clone https://github.com/stoxello/Compose Control.git
cd Compose Control
docker compose up -d
# Local development
dotnet run --project ./src/Compose Control.Web
# then open http://localhost:5146 (or https://localhost:7142)
# Remote agent on another host
curl -O https://raw.githubusercontent.com/stoxello/Compose Control/main/compose.agent.yaml
printf "Compose Control_AGENT_TOKEN=$(openssl rand -hex 32)\n" > .env
docker compose -f compose.agent.yaml up -d
Usage
After signing in, the Apps page lets you browse the built-in catalog and install an app into its own isolated stack directory with one click. The Stacks page lists every Compose project on the host; you can open a stack to view its containers, Compose definition, and .env, perform lifecycle actions (start, stop, restart, pull updates, remove), or edit and redeploy stacks Compose Control manages. The Containers page provides filtering, logs, live CPU/memory/disk charts, and an interactive shell per container. Images, Networks, and Volumes pages show usage detection and allow creation/removal where supported. The Events page combines the live engine event feed with the audit log. When agents are registered, use the top-bar environment selector to switch between "This host" and remote hosts; most pages operate against the selected environment. Per-container lifecycle actions, role-based access control, remote shell sessions, and one-click self-update are on the roadmap.
Configuration
Compose Control is configured through environment variables (defaults shown are what the container image ships with):
| Variable | Default (container) | Description |
|---|---|---|
Compose Control_PORT | 8080 | Host port mapped to the container (set in the Compose .env) |
ASPNETCORE_URLS | http://+:8080 | Listen address inside the container |
ConnectionStrings__DefaultConnection | DataSource=/app/data/Compose Control.db | SQLite connection string for Identity and app data |
Compose Control__DataPath | /app/data | Persistent app state directory |
Compose Control__StacksPath | /opt/stacks | Directory where managed Compose stacks are written |
Compose Control__DataProtectionPath | /app/keys | Persisted ASP.NET Core data-protection keys |
Compose Control__AgentsPath | /app/data/agents.json | Registered remote agents |
Compose Control__ReplicationPath | /app/data/replication.json | Replication plans and job history |
Compose Control__ReplicaStacksPath | /app/data/replicas | Local cold-replica Compose files and volume archives |
Compose Control_AGENT_TOKEN | — (required) | Access token for a remote Compose Control Agent; the agent exits at startup without one |
Compose Control_AGENT_STACKS_ROOT | /opt/Compose Control/stacks | Agent-side directory for stacks deployed to that host |
Keep the ./data, ./keys, and ./stacks volume mounts to preserve state across upgrades; persisting the Docker socket mount is what allows Compose Control to drive the host engine. Because access to the Docker socket equals administrative control of the host, keep Compose Control behind an HTTPS-terminating reverse proxy and do not expose it directly to the internet. Passwords must be at least 10 characters; email confirmation is disabled since no SMTP is configured. Legacy COMPOSE_CONTROL_* / DOCKPILOT_* settings from earlier project names are still recognized.