Skip to content

Déploiement de Semaphore avec Docker Compose

Ansible en ligne de commande, c'est parfait tant qu'on est seul aux commandes. Dès qu'on veut partager l'exécution d'un playbook, garder une trace de qui a lancé quoi, ou déclencher un déploiement sans donner un accès SSH à tout le monde, il faut une interface. Semaphore est cette interface — légère, sans la lourdeur d'AWX/Tower, mais avec l'essentiel : lancer vos playbooks depuis le navigateur, planifier, historiser, et cloisonner les accès.


Prérequis

  • Docker et Docker Compose installés — voir Installation Docker
  • Connexion internet pour récupérer les images Docker
  • Le port 3000 doit être disponible sur votre machine

1⃣ Configuration

Le fichier docker-compose.yml déploie deux services principaux :

Service Description
PostgreSQL Base de données stockant projets, tâches et utilisateurs de Semaphore
Semaphore Interface web pour Ansible accessible via le port 3000

Volumes de persistance

  • semaphore-postgres : volume Docker pour les données PostgreSQL afin d’assurer la persistance.

2⃣ Variables d’environnement

Stockez les paramètres sensibles et personnalisables dans un fichier .env :

SEMAPHORE_USER=utilisateur
SEMAPHORE_PASS=PASSWORD
SEMAPHORE_ADMIN_EMAIL=admin@example.com
SEMAPHORE_DB=semaphore

Ces variables sont injectées dans le fichier docker-compose.yml pour séparer configuration et déploiement.


3⃣ Exemple de fichier docker-compose.yml

version: '3'

services:
  postgres:
    container_name: semaphore_db
    image: postgres:14
    restart: unless-stopped
    environment:
      POSTGRES_USER: ${SEMAPHORE_USER}
      POSTGRES_PASSWORD: ${SEMAPHORE_PASS}
      POSTGRES_DB: ${SEMAPHORE_DB}
    volumes:
      - semaphore-postgres:/var/lib/postgresql/data

  semaphore:
    container_name: semaphore
    image: semaphoreui/semaphore:latest
    restart: unless-stopped
    depends_on:
      - postgres
    ports:
      - "3000:3000"
    environment:
      SEMAPHORE_DB_USER: ${SEMAPHORE_USER}
      SEMAPHORE_DB_PASS: ${SEMAPHORE_PASS}
      SEMAPHORE_DB_HOST: postgres
      SEMAPHORE_DB_PORT: 5432
      SEMAPHORE_DB_DIALECT: postgres
      SEMAPHORE_DB: ${SEMAPHORE_DB}
      SEMAPHORE_ADMIN: ${SEMAPHORE_USER}
      SEMAPHORE_ADMIN_NAME: ${SEMAPHORE_USER}
      SEMAPHORE_ADMIN_PASSWORD: ${SEMAPHORE_PASS}
      SEMAPHORE_ADMIN_EMAIL: ${SEMAPHORE_ADMIN_EMAIL}
      SEMAPHORE_ACCESS_KEY_ENCRYPTION: "<générer avec : head -c 32 /dev/urandom | base64>"
      TZ: UTC

volumes:
  semaphore-postgres:

4⃣ Lancement du projet

docker-compose up -d
  • Cette commande télécharge les images, crée les volumes et démarre les services en arrière-plan.

5⃣ Accès à l’interface web

Ouvrez votre navigateur à :

http://localhost:3000

Connectez-vous avec les identifiants définis dans le fichier .env.


6⃣ Gestion des services

Action Commande
Vérifier l’état docker-compose ps
Afficher les logs docker-compose logs -f
Redémarrer les services docker-compose restart
Arrêter et supprimer docker-compose down

7⃣ Sécurité

Clé de chiffrement obligatoire

La variable SEMAPHORE_ACCESS_KEY_ENCRYPTION doit être unique par installation. Ne jamais utiliser une valeur copiée depuis une documentation ou un exemple — elle chiffre les secrets stockés dans Semaphore (clés SSH, tokens, mots de passe). Générer une clé spécifique avant le premier démarrage :

head -c 32 /dev/urandom | base64

Conserver cette valeur en lieu sûr : si elle change après le démarrage, les secrets existants ne pourront plus être déchiffrés.

  • Changez le mot de passe admin à la première connexion.
  • Exposez le port 3000 uniquement localement si Semaphore ne doit pas être accessible depuis l’extérieur.

8⃣ Notes complémentaires

  • Pour utiliser MySQL au lieu de PostgreSQL, adaptez la configuration.
  • Vous pouvez monter un fichier ansible.cfg pour personnaliser Ansible.
  • Semaphore n’a pas de support natif pour SSO, mais propose une intégration LDAP.

9⃣ Exemple d’arborescence du projet

/opt/docker-compose/Semaphore/
├── docker-compose.yml
├── .env
├── README.md

En résumé

Semaphore, c'est le juste milieu : plus qu'un simple ansible-playbook lancé à la main, mais sans la machinerie d'une plateforme d'entreprise. Pour un homelab ou une petite équipe, c'est souvent le point d'équilibre parfait. Le seul geste à ne jamais bâcler : la clé de chiffrement (voir l'encart plus haut) — c'est elle qui protège les secrets que Semaphore va garder pour vous.