David Bohl 676790f4ad draft: Experimental (#112)
* Enhance Git clone error handling in GitService

* Bump version to 1.2.2

* Add support for Git references in deployment management

* Refactor deployment handling and improve error logging for Git operations

* feat(ui): add full dark mode support and improve styling consistency

* Bump version to 1.2.2

* feat(ui): add full dark mode support and improve styling consistency

 - Added full dark mode theme with neutral greys (no blue tones)
 - Unified Material input backgrounds and removed side glow effects
 - Ensured input text and labels are white in dark mode
 - Improved table styling, spacing and rounded corners
 - Styled dialogs (e.g., Add Secret) for proper dark mode appearance
 - Added spacing between stacked input fields for visual clarity
 - Polished search field design across views

* fix(ui): improve disabled button contrast in dark mode and translate comments to English

---------

Reviewed-by: David Bohl <david@davidbohl.org>

* Update to Java 25

* Update Maven Build

* fixed search field styling

* Try to improve Thread stability

* First steps implementing an update functionality

* Extended logging and scheduled update check

* Add logging

* minor fixes/improvements in update service

* Update enabled is false

* Updated Image extraction

* fix constructor

* try fix uri build

* fixed registry endpoint usage

* feat: update: Made url building more robust

* feat: update: uri hardening

* feat: update: further uri hardening

* feat: update: accept oci image manifest too

* Refactored Process creation to avoid long living zombies

* Added application/vnd.oci.image.index.v1+json to accepted image manifest headers

* Added a roadmap to README.md

* added automated tests to README.me

* Added cleanups to roadmap

* Try to avoid zombie processes

* Improved update interval and process destruction

* Fixed env Hanlding for ProcessRunner

* Added some logging to ProcessRunner for better understanding

* Added more logging

* Try to improve ProcessRunner

* Added more logging

* Default timeout for Processes set to 1 minute

* Try to change order of properties in Exedcutor

* Removed Async working

* Enhance ProcessRunner with background cleanup for stale processes and improve command execution handling

* Update dependency @types/jasmine to v5.1.13 (#113)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>

* Update dependency org.springframework.boot:spring-boot-starter-parent to v3.5.8 (#114)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>

* Bump @angular/common from 19.2.15 to 19.2.16 in /frontend (#116)

Bumps [@angular/common](https://github.com/angular/angular/tree/HEAD/packages/common) from 19.2.15 to 19.2.16.
- [Release notes](https://github.com/angular/angular/releases)
- [Changelog](https://github.com/angular/angular/blob/main/CHANGELOG.md)
- [Commits](https://github.com/angular/angular/commits/19.2.16/packages/common)

---
updated-dependencies:
- dependency-name: "@angular/common"
  dependency-version: 19.2.16
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* fixed search field styling

* Refactor ProcessRunner to remove Apache Commons Exec dependency and improve process management

* Refactor ProcessRunner to remove process tracking and cleanup logic, simplifying command execution

* Refactor ProcessRunner to improve process termination handling and resource cleanup

* Refactor ProcessRunner to use Duration for wait time in process termination

* Refactor ProcessRunner to use shell commands for process execution, improving process management and preventing zombie processes

* Refactor ProcessRunner to simplify command execution and improve process termination handling

* Made Event Listeners @Async

* A lot of changes

- more stuff for image updates (update and frontend)
- restructured backend for a better domain driven design

* Removed Stream Closing in ProcessRunner

* Added Logging for process output in debug

* Fix Recreation Event after update

* Cleanup

* Implemented Check for Updates Button

* Add Errorhandling to Notification Service

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: aquestry <155507142+aquestry@users.noreply.github.com>
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-12-20 15:50:32 +01:00
2025-06-26 10:12:42 +02:00
2025-12-20 15:50:32 +01:00
2025-12-20 15:50:32 +01:00
2025-01-09 08:54:14 +01:00
2025-12-20 15:50:32 +01:00
2025-12-20 15:50:32 +01:00
2025-01-11 17:02:55 +01:00
2025-12-20 15:50:32 +01:00
2025-01-11 13:01:00 +01:00
2025-06-25 16:00:14 +02:00

Build Docker Image

Dirigent

Tool to manage your docker compose deployments via git.

Table of Contents

Screenshots

image

Why Dirigent?

TL;DR: Dirigent brings GitOps simplicity to Docker Compose.

Dirigent simplifies GitOps for Docker Compose deployments by automating the management of your containers through Git. Heres why you should use it:

Git-Centric Deployments

  • Version-controlled infrastructure: Track changes to your Docker Compose setups via Git, ensuring reproducibility and auditability.
  • Automated sync: Push changes to your Git repo, and Dirigent handles deployment — no manual docker compose commands needed.

🔄 Seamless Git Integration

  • Webhook-driven updates: Trigger deployments automatically when your repo changes
  • Centralized management: Define all deployments in a single deployments.yml file for easy orchestration.

🚀 Self-Hosting Made Simple

  • Designed for homelabs & private clouds: Perfect for developers who self-host with Docker and want Git-based control.
  • No Kubernetes complexity: Lightweight alternative to full-blown GitOps tools like ArgoCD or Flux—just Docker Compose + Git.

🔧 Extensible & Developer-Friendly

  • REST API: Integrate with existing tools (CI/CD, monitoring).
  • Gotify notifications: Get alerts when deployments fail.

🔒 Encrypted Secrets

  • You can store encrypted Secrets that are injected as Environment Variable on execution

Ideal for Self-hosters managing multiple services (e.g., Nextcloud, Gitea, Vaultwarden).

Setup

docker-compose

services:
  app:
    image: ghcr.io/derdavidbohl/dirigent-spring:1
    container_name: dirigent-app
    restart: unless-stopped
    environment:
      - DIRIGENT_DEPLOYMENTS_GIT_URL= # required
      - DIRIGENT_SECRETS_ENCRYPTION_KEY= # Has to be 16 Chars. Can be generated with `openssl rand -base64 12`
      - DIRIGENT_COMPOSE_COMMAND= # optional
      - DIRIGENT_GIT_AUTHTOKEN= # optional
      - DIRIGENT_START_ALL_ON_STARTUP= # optional
      - DIRIGENT_DEPLOYMENTS_SCHEDULE_ENABLED= # optional
      - DIRIGENT_DEPLOYMENTS_SCHEDULE_CRON= # optional
      - DIRIGENT_GOTIFY_BASEURL= # optional
      - DIRIGENT_GOTIFY_TOKEN= # optional
      - DIRIGENT_INSTANCENAME= # optional but recommended
    ports:
      - 8080:8080
    volumes:
      - /path/to/config:/app/config
      - /path/to/deployments:/app/deployments
      - /path/to/data:/app/data
      - /var/run/docker.sock:/var/run/docker.sock

docker CLI

docker run -d \
  --name=dirigent \
  -e DIRIGENT_DEPLOYMENTS_GIT_URL= \
  -e DIRIGENT_SECRETS_ENCRYPTION_KEY= \ # Has to be 16 Chars. Can be generated with `openssl rand -base64 12`
  #optional
  -e DIRIGENT_COMPOSE_COMMAND= \
  #optional
  -e DIRIGENT_GIT_AUTHTOKEN= \
  #optional
  -e DIRIGENT_STARTALL_ON_STARTUP= \
  #optional
  -e DIRIGENT_DEPLOYMENTS_SCHEDULE_ENABLED= \
  #optional
  -e DIRIGENT_DEPLOYMENTS_SCHEDULE_CRON= \
  #optional
  -e DIRIGENT_GOTIFY_BASEURL= \
  #optional
  -e DIRIGENT_GOTIFY_TOKEN= \
  #optional but recommended
  -e DIRIGENT_INSTANCENAME= \

  -v /path/to/config:/app/config \
  -v /path/to/deployments:/app/deployments \
  -v /path/to/data:/app/data \
  -v /var/run/docker.sock:/var/run/docker.sock \
  ghcr.io/derdavidbohl/dirigent-spring:1

Environment Variables

Variable Description Default
DIRIGENT_DEPLOYMENTS_GIT_URL URL to your deployments git repository
DIRIGENT_SECRETS_ENCRYPTION_KEY Encryption Key to save encrypted secrets. Has to be 16 Chars. Can be generated with openssl rand -base64 12
DIRIGENT_COMPOSE_COMMAND Command to run your docker-compose files docker compose
DIRIGENT_GIT_AUTHTOKEN Auth token with access to your repos
DIRIGENT_START_ALL_ON_STARTUP Start all deployments on startup true
DIRIGENT_DEPLOYMENTS_SCHEDULE_ENABLED enable scheduled start of all deployments true
DIRIGENT_DEPLOYMENTS_SCHEDULE_CRON cron expression for scheduled start of all deployments (second minute hour day(month) month day(week) * */5 * * * *
DIRIGENT_GOTIFY_BASEURL Gotify Base URL for Notification, when deployments fail
DIRIGENT_GOTIFY_TOKEN Gotify Token for Notification, when deployments fail
DIRIGENT_INSTANCENAME Name of your Instance (will be shown in Web UI)

deployments.yml

The deployments.yml contains the list of repos you want to deploy. Every deployment needs a name and a source. You can optionally define an order, if one deployment depends on another deployment.

Here is an example of a deployments.yml:

deployments:
  - name: test1
    source: https://github.com/url/tomyrepo1.git
  - name: test2
    source: https://github.com//url/tomyrepo2.git
    order: 10

Volumes

Volume Description
/app/config Config directory for Dirigent
/app/deployments Deployments directory for Dirigent
/app/data Data directory containing the database
/var/run/docker.sock Docker socket for Dirigent

Step by Step (Gitea)

Setup Deployments Repo

  1. Create a new repository in Gitea
  2. Create a new file deployments.yml in the root of your repository with the following content:
    deployments: []
    
  3. Deploy the dirigent app as described above. Set the DIRIGENT_DEPLOYMENTS_GIT_URL to the URL of your repository. Dont forget to set the DIRIGENT_GIT_AUTHTOKEN if your repository is private.
  4. Optional: Create a new webhook in your repository. Set the URL to http://<dirigent-host-and-port>/api/v1/gitea

Add Deployments

  1. Create a git repository for your deployment
  2. Add a docker-compose.yml to your repository
  3. Add a new entry to the deployments.yml in your deployments repository with the name of your deployment and the URL to your deployment repository. Optionally you can set an order, if your deployment depends on another deployment.
    deployments:
      - name: test1
        source: https://url/toyourdeploymentrepo.git
        order: 10 # optional
    
  4. Optional: Add a new webhook in your deployment repository. Set the URL to http://<dirigent-host-and-port>/api/v1/gitea

Optional good practice:

Store all your repositories for one host in one gitea organization. This way you only have to set up one webhook at organization level.

API

Gitea Webhook

POST to http://<dirigent-host-and-port>/api/v1/gitea

Deployments

Start

Parameters

Parameter Description
forceRecreate=true forces recreation of the targeted deployment(s)
All Deployments:

POST to /api/v1/deployments/all/start

Deployment by name:

POST to /api/v1/deployments/{name}/start

Stop

Deployment by name:

POST to /api/v1/deployments/{name}/stop

State

GET to /api/v1/deployment-states

Secrets

Model

{
  "key": "string",
  "value": "string",
  "environmentVariable": "string",
  "deployments": ["string"]
}

Get Secrets

GET to /api/v1/secrets

Save Secret

PUT to /api/v1/secrets/{key}

Delete Secret

DELETE to /api/v1/secrets/{iey}

Develop

Setup for local Tests

  1. copy src/test/resources/application-local.properties.template to src/test/resources/application-local.properties
  2. fill in your test repository url and auth token
  3. Done ;)

Roadmap

Here is a roadmap with future Ideas

  • Automate Updates for deployments - Work in Progress
  • Add automated tests
  • Add cleanups (i. e. docker system prune or docker volume prune)
  • Add a single repo mode
  • Improve pathhandling for deployment related files in repo
  • Multiple Dirigent hosts
S
Description
Git-powered Docker Compose deployment orchestration made simple.
Readme MIT 14 MiB
Latest
2026-03-21 12:13:40 -05:00
Languages
Java 66.6%
TypeScript 20.9%
HTML 10.5%
Dockerfile 1.7%
CSS 0.3%