Mode d'emploi des outils

Comprendre chaque ligne d'un docker-compose généré

image, restart, user, read_only, cap_drop, volumes, networks, labels Traefik : le docker-compose de Vaultwarden et de Paperless expliqué ligne par ligne, sécurité comprise.

Publié le 10 octobre 2026 · ⏱ 9 min de lecture

Les fichiers compose.yml créés par Mon serveur et le générateur suivent tous le même modèle. Une fois que vous avez compris celui-ci, vous savez lire (et modifier) tous les autres. Si les mots « image » et « conteneur » sont nouveaux pour vous, commencez par Docker expliqué simplement.

Un exemple complet : Vaultwarden

services:
  vaultwarden:
    image: vaultwarden/server:latest
    container_name: vaultwarden
    restart: unless-stopped
    user: "1000:1000"
    read_only: true
    tmpfs:
      - /tmp
    security_opt:
      - no-new-privileges:true
    cap_drop:
      - ALL
    environment:
      DOMAIN: https://vault.mondomaine.fr
      SIGNUPS_ALLOWED: "false"
      ROCKET_PORT: "8080"
      TZ: Europe/Paris
    volumes:
      - ./data:/data
    networks:
      - traefik
    labels:
      - traefik.enable=true
      - traefik.http.routers.vaultwarden.rule=Host(`vault.mondomaine.fr`)
      - traefik.http.routers.vaultwarden.entrypoints=websecure
      - traefik.http.services.vaultwarden.loadbalancer.server.port=8080

networks:
  traefik:
    external: true

Ce qui fait tourner l’application

  • image : le programme à télécharger et sa version, après les deux-points. latest = la dernière publiée. Une version figée (gitea/gitea:1, postgres:17-alpine) évite les mauvaises surprises lors des mises à jour.
  • container_name : le nom du conteneur dans docker ps et docker logs vaultwarden.
  • restart: unless-stopped : Docker relance l’application si elle plante ou si le serveur redémarre… sauf si vous l’avez arrêtée vous-même. Ce n’est pas une garantie absolue : voir relancer ses conteneurs après un incident.
  • environment : les réglages de l’application. Leur sens dépend de chaque application (sa documentation fait foi). TZ règle le fuseau horaire.

La sécurité, ligne par ligne

Ces lignes ne changent rien au fonctionnement normal. Elles limitent les dégâts si l’application était piratée.

Ligne Effet Pourquoi pas partout ?
user: "1000:1000" L’application tourne avec un utilisateur normal, pas root Certaines images doivent démarrer en root
read_only: true Le conteneur ne peut pas modifier ses propres fichiers Beaucoup d’applications écrivent ailleurs que dans leurs données
tmpfs: /tmp Un dossier temporaire en mémoire, pour les applications en lecture seule —
no-new-privileges:true Un programme piraté ne peut pas devenir administrateur Incompatible avec les images qui changent d’utilisateur au démarrage
cap_drop: ALL Retire tous les « pouvoirs spéciaux » de root Seulement sur les images testées sans

Le générateur n’applique chaque protection que là où l’application la supporte : c’est pourquoi Vaultwarden en a cinq et Paperless une seule. Pour aller plus loin : sécuriser ses conteneurs Docker.

Les données : volumes

    volumes:
      - ./data:/data

À gauche des deux-points, un dossier du serveur (./data = à côté du compose.yml) ; à droite, où l’application le voit. Vos données sont à gauche : c’est ce dossier que la sauvegarde copie. Supprimer le conteneur ne supprime pas ce dossier.

Avec :ro à la fin (/srv/medias:/media:ro), l’application peut lire mais pas modifier : Jellyfin ne risque pas d’effacer vos films.

Le chemin jusqu’à Internet : networks et labels

  • networks: - traefik : l’application rejoint le réseau du reverse proxy, pour qu’il puisse lui transmettre les visites. Elle n’a aucun port ouvert sur Internet : tout passe par Traefik.
  • external: true (en bas) : ce réseau existe déjà, créé par Traefik. S’il n’existe pas, vous aurez cette erreur.
  • Les labels sont les instructions pour Traefik :
    • traefik.enable=true : publie cette application ;
    • rule=Host(...) : pour quelle adresse ;
    • entrypoints=websecure : en HTTPS (le certificat est géré par Traefik) ;
    • loadbalancer.server.port=8080 : sur quel port l’application écoute dans son conteneur.

Les applications à plusieurs conteneurs

Paperless a besoin d’une base de données et d’un « broker » (une file d’attente). Extrait :

services:
  paperless:
    depends_on:
      - db
      - broker
    environment:
      PAPERLESS_DBHOST: db
      PAPERLESS_DBPASS: "${DB_PASSWORD}"
    networks:
      - traefik
      - default
    labels:
      - traefik.docker.network=traefik

  db:
    image: postgres:17-alpine
    container_name: paperless-db
    environment:
      POSTGRES_PASSWORD: "${DB_PASSWORD}"
    volumes:
      - ./db:/var/lib/postgresql/data
  • depends_on : démarre la base avant l’application (sans attendre qu’elle soit prête : d’où les messages « database system is starting up », sans gravité).
  • PAPERLESS_DBHOST: db : les conteneurs d’un même fichier se joignent par leur nom de service.
  • ${DB_PASSWORD} : la valeur vient du fichier .env (les mots de passe générés).
  • default : le réseau privé de l’application. La base n’est que sur celui-ci : ni Internet ni Traefik ne la voient.
  • traefik.docker.network=traefik : indique à Traefik par quel réseau joindre l’application, puisqu’elle en a deux.

Modifier un fichier sans casser

  1. Gardez une copie : sudo cp compose.yml compose.yml.bak.
  2. Respectez l’indentation : deux espaces par niveau, jamais de tabulation.
  3. Vérifiez : sudo docker compose config --quiet (pas de message = fichier valide).
  4. Appliquez : sudo docker compose up -d (ne recrée que ce qui a changé).

Rappel : si vous relancez le script de Mon serveur, il réécrit les compose.yml. Notez vos modifications.

Une commande qui ne marche pas, une explication pas claire ? Signaler une erreur dans cette page.

Prêt à vous lancer ?

Choisissez vos applications et récupérez une installation complète.

Créer mon serveur