🧰 Installation de Komodo

Depuis mes débuts sur Docker, je gère mes conteneurs à coup de CLI. C'était gérable quand j'en avais que quelques uns. Aujourd'hui ça devient plus difficilement gérable et si je veux mettre de la collaboration en place, c'est encore plus compliqué. J'avais testé alors à une époque lointaine Portainer mais sans être convaincu plus que ça, bien que reconnaissant son utilité.
Suite à l'article Installer Komodo avec Docker sur Belginux de Zarev, j'ai décidé de franchir le pas en me lançant sur l'installation de cet orchestrateur.
👋 Présentation
Komodo est une application web conçue pour structurer la gestion de vos serveurs, builds, déploiements et procédures automatisées.
Avec Komodo, vous pouvez :
- Connecter tous vos serveurs et recevoir des alertes sur l’utilisation du processeur, de la mémoire et du disque.
- Créer, démarrer, arrêter et redémarrer des conteneurs Docker sur les serveurs connectés, et consulter leur statut et leurs logs.
- Déployer des stacks Docker Compose. Le fichier peut être défini via l’interface ou stocké dans un dépôt Git, avec déploiement automatique lors d’un git push.
- Compiler le code source de vos applications en images Docker auto-versionnées, générées automatiquement via webhook. Déployer des instances AWS à usage unique pour une capacité infinie.
- Gérer les dépôts sur les serveurs connectés, capables d’exécuter des automatisations via scripts ou webhooks.
- Gérer toutes vos variables de configuration / d’environnement, avec des variables globales partagées et interpolation des secrets.
- Garder un historique de toutes les actions effectuées, avec l’identification de l’auteur de chaque action.
Il n’y a aucune limite au nombre de serveurs que vous pouvez connecter, et il n’y en aura jamais. Il n’y a aucune restriction sur les API que vous pouvez utiliser > pour l’automatisation, et il n’y en aura jamais non plus. Pas de version entreprise ici.
— Source : https://komo.do/docs/intro
Pour résumer : Komodo est une application web qui permet de gérer facilement vos serveurs, conteneurs Docker, déploiements et automatisations. Elle offre une supervision des ressources, le déploiement via Docker Compose ou Git, la gestion des variables d’environnement, ainsi que l’historique des actions. Sans aucune limite sur le nombre de serveurs ou l’usage des API, Komodo vise une gestion puissante et illimitée, sans version "entreprise".
Ça coche toutes les cases : c'est gratuit, sans limite et c'est libre sous licence GPL-3.0.
🧰 Installation avec Docker et Traefik
📋 Prérequis
Dans cet exemple, j'utilise les briques suivantes :
- VM debian 12 dédiée à Komodo (optionnel)
- Traefik ou un autre reverse-proxy
Afin de pouvoir se connecter à Komodo et de générer un certificat Let's Encrypt :
- Un NDD de portée globale
🛠️ Configuration de Komodo
Dans cette stack docker, je configure le serveur Komodo (core) et un agent (Periphery agent). Komodo core s'appuie ici sur Sqlite mais on peut s'appuyer également sur MongoDB ou Postgresql.
/srv/
└── docker/
└── komodo/
├── compose.env
├── compose.yml
├── repo-cache
├── secrets/
│ ├── KOMODO_JWT_SECRET
│ ├── KOMODO_PASSKEY
│ └── KOMODO_WEBHOOK_SECRET
└── sqlite-data/
---
secrets:
komodo_passkey:
file: "./secrets/KOMODO_PASSKEY"
komodo_webkook_secret:
file: "./secrets/KOMODO_WEBHOOK_SECRET"
komodo_jwt_secret:
file: "./secrets/KOMODO_JWT_SECRET"
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}
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
secrets:
- "komodo_passkey"
- "komodo_webkook_secret"
- "komodo_jwt_secret"
logging:
driver: ${COMPOSE_LOGGING_DRIVER:-local}
ports:
- 9120:9120
env_file: ./compose.env
environment:
KOMODO_DATABASE_ADDRESS: ferretdb
KOMODO_PASSKEY_FILE: /run/secrets/komodo_passkey
KOMODO_WEBHOOK_SECRET_FILE: /run/secrets/komodo_webkook_secret
KOMODO_JWT_SECRET_FILE: /run/secrets/komodo_jwt_secret
volumes:
## Core cache for repos for latest commit hash / contents
- ./repo-cache:/repo-cache
periphery:
image: ghcr.io/moghtech/komodo-periphery:${COMPOSE_KOMODO_IMAGE_TAG:-latest}
labels:
komodo.skip: # Prevent Komodo from stopping with StopAllContainers
restart: unless-stopped
secrets:
- "komodo_passkey"
logging:
driver: ${COMPOSE_LOGGING_DRIVER:-local}
env_file: ./compose.env
environment:
KOMODO_PASSKEYS_FILE: /run/secrets/komodo_passkey
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:
- /var/run/docker.sock:/var/run/docker.sock
- /proc:/proc
- ${PERIPHERY_ROOT_DIRECTORY:-/etc/komodo}:${PERIPHERY_ROOT_DIRECTORY:-/etc/komodo}
tr -cd '[:alnum:]' < /dev/urandom | fold -w "64" | head -n 1 > ./secrets/KOMODO_PASSKEY
tr -cd '[:alnum:]' < /dev/urandom | fold -w "64" | head -n 1 > ./secrets/KOMODO_WEBHOOK_SECRET
tr -cd '[:alnum:]' < /dev/urandom | fold -w "64" | head -n 1 > ./secrets/KOMODO_JWT_SECRET
On passe maintenant à la configuration des variables d'environnement.
####################################
# 🦎 KOMODO COMPOSE - VARIABLES 🦎 #
####################################
## Stick to a specific version, or use `latest`
COMPOSE_KOMODO_IMAGE_TAG=latest
COMPOSE_LOGGING_DRIVER=local # Enable log rotation with the local driver.
#=-------------------------=#
#= 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.domaine.fr
## 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"
## 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=flase
## 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"
#=------------------------------=#
#= Komodo Periphery Environment =#
#=------------------------------=#
## Full variable list + descriptions are available here:
## 🦎 https://github.com/moghtech/komodo/blob/main/config/periphery.config.toml 🦎
## 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
Lancez la stack Komodo.
🛠️ Configuration de Traefik
Traefik étant sur un autre serveur, j'ai déclaré un hôte dans la configuration dynamique :
---
http:
routers:
router-komodo:
rule: Host(`komodo.domaine.fr`)
service: service-komodo
tls:
certResolver: letsencrypt
services:
service-komodo:
loadBalancer:
servers:
- url: "http://<IP_SRV_DEBIAN_DEDIE_KOMODO>:9120"
passHostHeader: true
🚀 Première connexion à Komodo
Connectez-vous à l'interface web de Komodo (ex. : https://komodo.domaine.f). Renseignez un nom de compte, son mot de passe et cliquez sur Signup. Par défaut ce nouvel utilisateur bénéficie du rôle admin.

Uune fois l'inscription du premier compte réalisée, d'autres utilisateurs peuvent s'enregistrer mais seront par défaut désactivés. Pour empecher l'enregistrement d'autres utilisateurs, il faut modifier le compose.env comme ceci :
(...)
## Disable new user signups.
KOMODO_DISABLE_USER_REGISTRATION=true
(...)
Avant de commencer à créer des ressources, nous allons connecter Komodo à un IAM dans le chapitre suivant afin de bénéficier du SSO.