Docs

Compose Control

A web-based control center for Docker and Docker Compose, with a built-in self-hosted app catalog.

Compose Control – Documentation | Stoxello
Stoxello | Compose Control

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.

Repository
docker
Languages
C#, Razor/Blazor
Platform / Framework
.NET 9, ASP.NET Core Blazor (Interactive Server), EF Core + SQLite
Type
Self-hosted web application (single-container deployment)

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

ComponentTechnology
Web UIBlazor Server (Interactive Server), Razor components
BackendASP.NET Core on .NET 9
DatabaseSQLite via EF Core (Identity and app data)
Docker integrationShells out to the docker / docker compose CLIs and parses JSON output (no Docker SDK)
Remote agentsToken-protected HTTP API (Compose Control.Agent)
PackagingMulti-stage Dockerfile (.NET 9 SDK build, aspnet runtime + Docker CLI), GitHub Container Registry (ghcr.io/stoxello/Compose Control)
TestsxUnit (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.

  1. Clone the repository (or create a minimal compose.yaml pointing at the published image).
  2. Start the container: docker compose up -d. The bundled file pulls ghcr.io/stoxello/Compose Control:latest, so no build step is needed. If the GHCR package is private, run docker login ghcr.io first.
  3. Open http://localhost:8080 and complete the first-run administrator wizard.
  4. To build locally instead of pulling, layer the build overlay: docker compose -f compose.yaml -f compose.build.yaml up -d --build.
  5. (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):

VariableDefault (container)Description
Compose Control_PORT8080Host port mapped to the container (set in the Compose .env)
ASPNETCORE_URLShttp://+:8080Listen address inside the container
ConnectionStrings__DefaultConnectionDataSource=/app/data/Compose Control.dbSQLite connection string for Identity and app data
Compose Control__DataPath/app/dataPersistent app state directory
Compose Control__StacksPath/opt/stacksDirectory where managed Compose stacks are written
Compose Control__DataProtectionPath/app/keysPersisted ASP.NET Core data-protection keys
Compose Control__AgentsPath/app/data/agents.jsonRegistered remote agents
Compose Control__ReplicationPath/app/data/replication.jsonReplication plans and job history
Compose Control__ReplicaStacksPath/app/data/replicasLocal 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/stacksAgent-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.