Skip to content

Penpot

Le rôle Penpot déploie l’application à l’aide de Docker Compose, configure les différents services nécessaires à son fonctionnement et assure le démarrage de l’ensemble des conteneurs.

Il est responsable de :

  • la création du répertoire d’installation
  • le déploiement du fichier docker-compose.yaml
  • le démarrage des services Penpot
  • le redémarrage des services lorsque la configuration est modifiée

Penpot a été retenu comme outil de conception d’interfaces car il est open source et peut être auto-hébergé sans coût de licence. Il constitue une alternative crédible à Figma tout en permettant de conserver la maîtrise complète des données du projet.

Le répertoire d’installation se situe ici :

Terminal window
cd /srv/apps/penpot

Le rôle déploie Penpot à l’aide d’un fichier docker-compose.yaml généré depuis un template Jinja2.

L’application est composée de plusieurs conteneurs :

  • Frontend
  • Backend
  • PostgreSQL
  • Valkey
  • Mailcatcher
  • Exporter
  • MCP

Tous les services communiquent via un réseau Docker dédié. Seul le frontend expose un port sur le VPS. Le frontend reste uniquement accessible localement (127.0.0.1) et est publié sur Internet via Caddy.

roles/penpot/
├── defaults/
│ └── main.yml # Variables du rôle
├── handlers/
│ └── main.yml # Redémarrage de Penpot si nécessaire
├── tasks/
│ ├─ install.yml # Installation de Penpot
│ └── main.yml # Point d'entrée du rôle
└── templates/
└── docker-compose.yaml.j2 # Template du Docker Compose à déployer
Client
│
▼
Caddy
│ reverse_proxy
▼
127.0.0.1:9001
│
Docker Compose
│
▼
Penpot Frontend
│
├── Backend
├── PostgreSQL
├── Valkey
├── Mailcatcher
├── Exporter
└── MCP

Les variables sont contenues dans le fichier main.yml dans le dossier defaults.

Variable Type Description
penpot_directory string Répertoire contenant le projet Docker Compose
penpot_version string Version de l’image à utiliser
penpot_public_uri string Adresse URL accessible depuis Internet
penpot_frontend_bind_address string Adresse IP sur laquelle publier le service
penpot_frontend_port int Port exposé sur le VPS
penpot_mailcatch_bind_address string Adresse IP sur laquelle publier le service de mail
penpot_mailcatch_port int Port exposé sur le VPS pour le service de mail
penpot_postgres_database string Nom de la base de données
penpot_postgres_username string Nom du compte utilisateur de la base de données
penpot_postgres_password string Mot de passe du compte utilisateur de la base de données
penpot_secret_key string Clé secrète utilisée par Penpot pour signer les sessions et les jetons.
penpot_directory: /srv/apps/penpot
penpot_version: "2.16"
penpot_public_uri: "https://penpot.corentin-talour.fr"
penpot_frontend_bind_address: "127.0.0.1"
penpot_frontend_port: 9001
penpot_mailcatch_bind_address: "127.0.0.1"
penpot_mailcatch_port: 1080
penpot_postgres_database: penpot
penpot_postgres_username: penpot
penpot_postgres_password: penpot
# À déplacer ensuite dans Ansible Vault.
penpot_secret_key: "change-this-insecure-key"

Le rôle réalise les opérations suivantes :

  1. Création du répertoire d’installation.
  2. Génération du fichier docker-compose.yaml depuis un template Jinja2.
  3. Déploiement des services avec Docker Compose.
  4. Redémarrage automatique des services en cas de modification du fichier de configuration.

Le rôle contient un handler chargé de redémarrer le conteneur Penpot lorsqu’une modification du fichier docker-compose.yaml est détectée.

Le handler est défini dans le fichier suivant handlers/main.yml.

Le handler est appelé par la tâche qui déploie le fichier, celle-ci : Deploy Penpot Docker Compose file.

La directive notify déclenche le handler uniquement lorsque le fichier de configuration a réellement été modifié.

Cela permet d’éviter un redémarrage inutile du service à chaque exécution du playbook.

Terminal window
docker compose ps

Tous les services doivent être en état running.

Terminal window
curl http://127.0.0.1:9001

Une réponse HTTP doit être retournée.

Terminal window
docker compose logs

Aucune erreur critique ne doit apparaître.