Cette idée d'article m'a été suggérée par Mathieu C, que je remercie d'ailleurs !
Aujourd'hui nous allons parler de Komodo !

Même si c'est tentant de vous parler de ce superbe animal, on va s'en tenir à Komodo, l’application qui fait office d'orchestrateur. On va surtout aborder les parties stacks et déploiement. Komodo dispose de nombreuses autres fonctions.
Vous connaissez très probablement Portainer ? Avec Komodo, vous allez aussi pouvoir vous créer une bibliothèque d'applications sous forme de stacks, les gérer avec des fonctions élémentaires comme START, RESTART, STOP, DEPLOY, PULL, DELETE, et, bien entendu, les déployer, mais si en plus vous avez plusieurs serveurs, vous pourrez choisir de le déployer directement à partir de Komodo, sur le serveur de votre choix.
Il y a deux parties, la partie serveur et la partie client. Vous pouvez très bien n'utiliser que la partie serveur si vous n'avez qu'un seul serveur.
Mathieu, qui m'a parlé de Komodo, l'utilise de cette manière, qui n'est qu'un exemple :
Moi je l’utilise en lien avec mes dépôts git sur Gitea hébergé sur mon NAS pour sauvegarder mes projets docker-compose et du coup Komodo se connecte directement pour lire le fichier compose.yaml et le .env s’il est présent pour déployer à distance sur mes VM ou LXC.
Aujourd'hui, on va voir comment mettre en place Komodo, créer des stacks, gérer les stacks et les déployer sur le serveur sur lequel Komodo est installé et sur un serveur autre, par exemple, une autre VM.
⚡ Caractéristiques
- Connectez tous vos serveurs et recevez des alertes sur l'utilisation du processeur, de la mémoire et du disque.
- Créez, démarrez, arrêtez et redémarrez des conteneurs Docker sur les serveurs connectés, et consultez leur état et leurs journaux.
- Déployez des piles Docker Compose. Le fichier peut être défini dans l'interface utilisateur ou dans un dépôt Git, avec déploiement automatique lors d'une requête Git Push.
- Créez le code source de votre application dans des images Docker auto-versionnées, générées automatiquement par webhook. Déployez des instances AWS à usage unique pour une capacité illimitée.
- Gérez les dépôts sur les serveurs connectés, qui peuvent être automatisés via des scripts et des webhooks.
- Gérez toutes vos variables de configuration et d'environnement, avec une interpolation de variables globales et de secrets partagés.
- Gardez une trace de toutes les actions effectuées et de leurs auteurs.
- Support podman.





💾 Installation du serveur
Prérequis
Avant de commencer, assurez-vous d’avoir :
Étapes d'installation
- Créez votre compose.yml dans le dossier ou vous comptez installer Komodo :
sudo nano compose.yml
- Et collez ça dedans :
#################################
# 🦎 KOMODO COMPOSE - SQLITE 🦎 #
#################################
## This compose file will deploy:
## 1. Sqlite + FerretDB Mongo adapter (https://www.ferretdb.com)
## 2. Komodo Core
## 3. Komodo Periphery
services:
ferretdb:
image: ghcr.io/ferretdb/ferretdb:1
labels:
komodo.skip: # Prevent Komodo from stopping with StopAllContainers
restart: unless-stopped
logging:
driver: ${COMPOSE_LOGGING_DRIVER:-local}
# ports:
# - 27017:27017
volumes:
- sqlite-data:/state
environment:
- FERRETDB_HANDLER=sqlite
core:
image: ghcr.io/moghtech/komodo-core:${COMPOSE_KOMODO_IMAGE_TAG:-latest}
labels:
komodo.skip: # Prevent Komodo from stopping with StopAllContainers
restart: unless-stopped
depends_on:
- ferretdb
logging:
driver: ${COMPOSE_LOGGING_DRIVER:-local}
ports:
- 9120:9120
env_file: ./compose.env
environment:
KOMODO_DATABASE_ADDRESS: ferretdb
volumes:
## Core cache for repos for latest commit hash / contents
- repo-cache:/repo-cache
## Store sync files on server
# - /path/to/syncs:/syncs
## Optionally mount a custom core.config.toml
# - /path/to/core.config.toml:/config/config.toml
## Allows for systemd Periphery connection at
## "http://host.docker.internal:8120"
# extra_hosts:
# - host.docker.internal:host-gateway
## Deploy Periphery container using this block,
## or deploy the Periphery binary with systemd using
## https://github.com/moghtech/komodo/tree/main/scripts
periphery:
image: ghcr.io/moghtech/komodo-periphery:${COMPOSE_KOMODO_IMAGE_TAG:-latest}
labels:
komodo.skip: # Prevent Komodo from stopping with StopAllContainers
restart: unless-stopped
logging:
driver: ${COMPOSE_LOGGING_DRIVER:-local}
env_file: ./compose.env
environment:
PERIPHERY_REPO_DIR: ${PERIPHERY_ROOT_DIRECTORY:-/etc/komodo}/repos
PERIPHERY_STACK_DIR: ${PERIPHERY_ROOT_DIRECTORY:-/etc/komodo}/stacks
PERIPHERY_SSL_KEY_FILE: ${PERIPHERY_ROOT_DIRECTORY:-/etc/komodo}/ssl/key.pem
PERIPHERY_SSL_CERT_FILE: ${PERIPHERY_ROOT_DIRECTORY:-/etc/komodo}/ssl/cert.pem
volumes:
## Mount external docker socket
- /var/run/docker.sock:/var/run/docker.sock
## Allow Periphery to see processes outside of container
- /proc:/proc
## Specify the Periphery agent root directory.
## Must be the same inside and outside the container,
## or docker will get confused. See https://github.com/moghtech/komodo/discussions/180.
## Default: /etc/komodo.
- ${PERIPHERY_ROOT_DIRECTORY:-/etc/komodo}:${PERIPHERY_ROOT_DIRECTORY:-/etc/komodo}
volumes:
# Sqlite
sqlite-data:
# Core
repo-cache:
- Créez un fichier compose.env dans le même dossier que le compose.yml :
nano compose.env
- Collez ça dedans :
####################################
# 🦎 KOMODO COMPOSE - VARIABLES 🦎 #
####################################
## These compose variables can be used with all Komodo deployment options.
## Pass these variables to the compose up command using `--env-file komodo/compose.env`.
## Additionally, they are passed to both Komodo Core and Komodo Periphery with `env_file: ./compose.env`,
## so you can pass any additional environment variables to Core / Periphery directly in this file as well.
## Stick to a specific version, or use `latest`
COMPOSE_KOMODO_IMAGE_TAG=latest
## Note: 🚨 Podman does NOT support local logging driver 🚨. See Podman options here:
## `https://docs.podman.io/en/v4.6.1/markdown/podman-run.1.html#log-driver-driver`
COMPOSE_LOGGING_DRIVER=local # Enable log rotation with the local driver.
## DB credentials - Ignored for Sqlite
KOMODO_DB_USERNAME=admin
KOMODO_DB_PASSWORD=admin
## Configure a secure passkey to authenticate between Core / Periphery.
KOMODO_PASSKEY=votre_clé_sécurisée
#=-------------------------=#
#= Komodo Core Environment =#
#=-------------------------=#
## Full variable list + descriptions are available here:
## 🦎 https://github.com/moghtech/komodo/blob/main/config/core.config.toml 🦎
## Note. Secret variables also support `${VARIABLE}_FILE` syntax to pass docker compose secrets.
## Docs: https://docs.docker.com/compose/how-tos/use-secrets/#examples
## Used for Oauth / Webhook url suggestion / Caddy reverse proxy.
KOMODO_HOST=https://komodo.mondomaine.com
## Displayed in the browser tab.
KOMODO_TITLE=Komodo
## Create a server matching this address as the "first server".
## Use `https://host.docker.internal:8120` when using systemd-managed Periphery.
KOMODO_FIRST_SERVER=https://periphery:8120
## Make all buttons just double-click, rather than the full confirmation dialog.
KOMODO_DISABLE_CONFIRM_DIALOG=false
## Rate Komodo polls your servers for
## status / container status / system stats / alerting.
## Options: 1-sec, 5-sec, 15-sec, 1-min, 5-min.
## Default: 15-sec
KOMODO_MONITORING_INTERVAL="15-sec"
## Rate Komodo polls Resources for updates,
## like outdated commit hash.
## Options: 1-min, 5-min, 15-min, 30-min, 1-hr.
## Default: 5-min
KOMODO_RESOURCE_POLL_INTERVAL="5-min"
## Used to auth incoming webhooks. Alt: KOMODO_WEBHOOK_SECRET_FILE
KOMODO_WEBHOOK_SECRET=a_random_secret
## Used to generate jwt. Alt: KOMODO_JWT_SECRET_FILE
KOMODO_JWT_SECRET=a_random_jwt_secret
## Enable login with username + password.
KOMODO_LOCAL_AUTH=true
## Disable new user signups.
KOMODO_DISABLE_USER_REGISTRATION=false
## All new logins are auto enabled
KOMODO_ENABLE_NEW_USERS=false
## Disable non-admins from creating new resources.
KOMODO_DISABLE_NON_ADMIN_CREATE=false
## Allows all users to have Read level access to all resources.
KOMODO_TRANSPARENT_MODE=false
## Time to live for jwt tokens.
## Options: 1-hr, 12-hr, 1-day, 3-day, 1-wk, 2-wk
KOMODO_JWT_TTL="1-day"
## OIDC Login
KOMODO_OIDC_ENABLED=false
## Must reachable from Komodo Core container
# KOMODO_OIDC_PROVIDER=https://oidc.provider.internal/application/o/komodo
## Change the host to one reachable be reachable by users (optional if it is the same as above).
## DO NOT include the `path` part of the URL.
# KOMODO_OIDC_REDIRECT_HOST=https://oidc.provider.external
## Your OIDC client id
# KOMODO_OIDC_CLIENT_ID= # Alt: KOMODO_OIDC_CLIENT_ID_FILE
## Your OIDC client secret.
## If your provider supports PKCE flow, this can be ommitted.
# KOMODO_OIDC_CLIENT_SECRET= # Alt: KOMODO_OIDC_CLIENT_SECRET_FILE
## Make usernames the full email.
## Note. This does not work for all OIDC providers.
# KOMODO_OIDC_USE_FULL_EMAIL=true
## Add additional trusted audiences for token claims verification.
## Supports comma separated list, and passing with _FILE (for compose secrets).
# KOMODO_OIDC_ADDITIONAL_AUDIENCES=abc,123 # Alt: KOMODO_OIDC_ADDITIONAL_AUDIENCES_FILE
## Github Oauth
KOMODO_GITHUB_OAUTH_ENABLED=false
# KOMODO_GITHUB_OAUTH_ID= # Alt: KOMODO_GITHUB_OAUTH_ID_FILE
# KOMODO_GITHUB_OAUTH_SECRET= # Alt: KOMODO_GITHUB_OAUTH_SECRET_FILE
## Google Oauth
KOMODO_GOOGLE_OAUTH_ENABLED=false
# KOMODO_GOOGLE_OAUTH_ID= # Alt: KOMODO_GOOGLE_OAUTH_ID_FILE
# KOMODO_GOOGLE_OAUTH_SECRET= # Alt: KOMODO_GOOGLE_OAUTH_SECRET_FILE
## Aws - Used to launch Builder instances and ServerTemplate instances.
KOMODO_AWS_ACCESS_KEY_ID= # Alt: KOMODO_AWS_ACCESS_KEY_ID_FILE
KOMODO_AWS_SECRET_ACCESS_KEY= # Alt: KOMODO_AWS_SECRET_ACCESS_KEY_FILE
## Hetzner - Used to launch ServerTemplate instances
## Hetzner Builder not supported due to Hetzner pay-by-the-hour pricing model
KOMODO_HETZNER_TOKEN= # Alt: KOMODO_HETZNER_TOKEN_FILE
#=------------------------------=#
#= Komodo Periphery Environment =#
#=------------------------------=#
## Full variable list + descriptions are available here:
## 🦎 https://github.com/moghtech/komodo/blob/main/config/periphery.config.toml 🦎
## Periphery passkeys must include KOMODO_PASSKEY to authenticate.
PERIPHERY_PASSKEYS=${KOMODO_PASSKEY}
## Specify the root directory used by Periphery agent.
PERIPHERY_ROOT_DIRECTORY=/etc/komodo
## Enable SSL using self signed certificates.
## Connect to Periphery at https://address:8120.
PERIPHERY_SSL_ENABLED=true
## If the disk size is overreporting, can use one of these to
## whitelist / blacklist the disks to filter them, whichever is easier.
## Accepts comma separated list of paths.
## Usually whitelisting just /etc/hostname gives correct size.
PERIPHERY_INCLUDE_DISK_MOUNTS=/etc/hostname
# PERIPHERY_EXCLUDE_DISK_MOUNTS=/snap,/etc/repos
- KOMODO_PASSKEY=votre_clé_sécurisée => Changez votre_clé_sécurisée par la vôtre. Cela peut-être un long mot de passe ou une phrase de passe.
- - KOMODO_HOST=https://komodo.mondomaine.com => Remplacez https://komodo.mondomaine.com par le domaine de votre instance Komodo.
- On va déployer l'application :
docker compose up -d
- Rendez-vous sur l'ip:port, suivant l'IP de votre serveur local et du port choisi, 9120 par défaut :
http://ip:9120/
ou votre domaine :
https://komodo.mondomaine.com
👤 Création du compte administrateur
Comme toujours, ou presque, il va falloir créer le compte administrateur.
Replissez les deux champs suivants :

- Username => Choisissez un nom d'utilisateur pour votre compte administrateur.
- Password => Choisissez un mot de passe, fort de préférence.
Cliquez sur Sign Up pour terminer la création de votre compte. Vous serez alors redirigé vers votre tableau de bord :

🚫 Empêcher la création de nouveaux utilisateurs
Si vous souhaitez désactiver la création de compte après avoir créé le vôtre :
Dans le fichier compose.env, passez de false à true :
KOMODO_DISABLE_USER_REGISTRATION=true
Terminez par un :
docker compose up -d
Il n'est désormais plus possible de créer un nouveau compte, l'option à disparue :

💾 Installation du client
Déployer le container
Créez votre compose.yml :
nano compose.yml
Collez ça dedans :
# File: compose-komodo-client.yml
services:
periphery:
image: ghcr.io/mbecker20/periphery:latest
# image: ghcr.io/mbecker20/periphery:latest-aarch64 # use for arm support
labels:
komodo.skip: # Prevent Komodo from stopping with StopAllContainers
logging:
driver: local
ports:
- 8120:8120
volumes:
## Mount external docker socket
- /var/run/docker.sock:/var/run/docker.sock
## Allow Periphery to see processes outside of container
- /proc:/proc
## use self signed certs in docker volume,
## or mount your own signed certs.
- ssl-certs:/etc/komodo/ssl
## manage repos in a docker volume,
## or change it to an accessible host directory.
- repos:/etc/komodo/repos
## manage stack files in a docker volume,
## or change it to an accessible host directory.
- stacks:/etc/komodo/stacks
## Optionally mount a path to store compose files
# - /path/to/compose:/host/compose
environment:
## Full list: `https://github.com/mbecker20/komodo/blob/main/config/periphery.config.toml`
## Configure the same passkey given to Komodo Core (KOMODO_PASSKEY)
PERIPHERY_PASSKEYS: votre_clé_sécurisée # Alt: PERIPHERY_PASSKEYS_FILE
## Adding IP here will ensure calling IP is in the list. (optional)
PERIPHERY_SSL_ENABLED: false
## If the disk size is overreporting, can use one of these to
## whitelist / blacklist the disks to filter them, whichever is easier.
## Accepts comma separated list of paths.
## Usually whitelisting /etc/hostname gives correct size.
PERIPHERY_INCLUDE_DISK_MOUNTS: /etc/hostname
# PERIPHERY_EXCLUDE_DISK_MOUNTS: /snap,/etc/repos
volumes:
ssl-certs:
repos:
stacks:
- PERIPHERY_PASSKEYS: votre_clé_sécurisée => Doit obligatoirement être la même déjà renseignée dans le compose.env.
On va déployer l'application :
docker compose up -d
Ajouter le client au serveur Komodo
Rendez-vous sur votre instance Komodo, partie Servers et ensuite cliquez sur New Server + :

Nommez votre serveur et cliquez sur Create :

Dans la partie Config, Address, ajoutez l'IP suivie du port (adaptez suivant vos besoins), le port est le 8120 par défaut, l'IP de ma VM étant 192.168.1.89, cela prendra cette forme :

Activez le serveur :

Cliquez sur Save :

Mettez à jour les informations :

Confirmez le changement :

Si tout s'est bien déroulé, vous pouvez voir le serveur en vert :

📚 Les stacks
Créer une stack
Dans cet exemple, nous allons créer une stack pour Immich.
Dans le menu de gauche, cliquez sur Stacks, ensuite sur New Stack + :

Nommez votre stack :

Cliquez sur Create pour terminer, dans la partie Stacks, immich est bien présent :

Compléter la stack
C'est bien joli d'avoir une stack, mais sans les informations pour la déployer, cela ne sert pas à grand chose.
On va cliquer sur la stack de Immich :

Dans la partie Config, Select Server, choisissez le serveur sur lequel vous voulez déployer la stack, je vais choisir le serveur où est installé Komodo :

Cliquez sur UI Defined :

Vous pourrez voir apparaître sous vos yeux émerveillés, les partie Compose File et Environment :

- 1 => Collez votre compose dans ce champ.
- 2 => Collez votre fichier .env dans ce champ.
- 3 => Facultatif, nommez votre fichier .env.
Ce qui donne, dans le cas de Immich :
Compose File

Environment

Env File Path

Lorsque c'est bon, cliquez sur Save :

Cliquez sur Update :

Confirmez en cliquant sur Confirm :

Tout semble bon pour déployer Immich :

Déployer la stack
Vient enfin le moment de déployer la stack !
Cliquez sur Deploy :

Le processus se lance :

Après quelques instants :

Options de la stack
Vous avez toutes les options qui vont bien pour gérer votre stack :

Les options de mises à jour automatique :

Vous pouvez également ajouter l'URL de votre application ici, cliquez sur Save :

Qui sera disponible ici :

Déployer la stack sur le serveur de son choix
Et bien vous faites exactement la même opération sauf à cet endroit, vous choisissez tout simplement le serveur souhaité :

📊 Stats
Vous avez, sous l'onglet Stats de votre serveur sélectionné, des statistiques diverses :





🌐 Où se trouvent les stacks ?
Si vous n'indiquez pas de path, tout se trouve ici :
/etc/komodo/stacks/nom_de_l'application

❗Conclusion
Une solution open source qu'elle est bien ! Elle pourra aisément remplacer Portainer pour gérer vos containers, les déployer, et quand on l'a bien en main, c'est vraiment plaisant de l'utiliser !
Je n'ai évidemment pas tout abordé car elle est super complète et pour certaines options, je n'ai pas encore assez d'expérience. Je vais continuer à creuser et j'ajouterai éventuellement un tutoriel.
Bon amusement !