le blog d'albâtre Blog d'Albâtre

OliveTin - Donnez un accès sûr et simple aux commandes shell prédéfinies à partir d'une interface Web.

Publié le samedi 9 août 2025
Par Jean-charles hoarau

Dans Services

Etiquettes: Service Docker Caddy self-hosting utilitaire

OliveTin donne un accès sûr et simple aux commandes shell prédéfinies à partir d'une interface Web.

Installation de OliveTin

Comme pour tous mes services (Glance et Glances), je pars du docker compose proposé par le projet

services:
  olivetin:
    container_name: olivetin
    image: jamesread/olivetin
    volumes:
      - OliveTin-config:/config # replace host path or volume as needed
    ports:
      - "1337:1337"
    restart: unless-stopped

volumes:
  OliveTin-config:
    external: false

et je modifie pour le CDP

services:
  olivetin:
    container_name: olivetin
    image: jamesread/olivetin
    volumes:
      - ./config:/config
      - /var/run/docker.sock:/var/run/docker.sock:ro # pour accéder aux dockers présent sur le serveur
    ports:
      - "1337:1337"
    user : root
    restart: unless-stopped
    labels: # pour le caddy docker proxy
      caddy: ot.albat.re
      caddy.reverse_proxy: "olivetin:1337"
      caddy.basic_auth.admin: "$2a$14$***********" # pour protéger l'accès au site
    networks:
      - webproxy-net

networks:
  webproxy-net:
    external: true

Les modifications apportées au docker compose d'origine sont les mêmes que pour les autres services. J'ajoute les labels et networks et caddy docker proxy fait le reste.

Attention, ce service accède en root à vos dockers, donc je le protège un minimum.

Configuration de OliveTin

Le fichier de configuration de OliveTin se trouve dans le dossier /config du service et ressemble à ceci chez moi. La documentation du projet est très bien faite

# Choose from INFO (default), WARN and DEBUG
logLevel: "INFO"

# Checking for updates https://docs.olivetin.app/reference/updateChecks.html
checkForUpdates: false


themeName: olive

# Docs: http://localhost/docs.olivetin.app/docs/entities.html
pageTitle: Alabtre1

actions:
  - title: docker ps
    shell: docker ps -a --format '{{.Names}}[{{.Image}}]({{.Status}})'
    icon: <iconify-icon icon="ix:list"></iconify-icon>
    popupOnStart: execution-dialog-stdout-only

  - title: docker logs
    shell: docker logs --tail 30 {{ containername }}
    icon: <iconify-icon icon="ix:log"></iconify-icon>
    popupOnStart: execution-dialog-stdout-only
    arguments:
      - name: containername
        title: nom du conteneur
        type: ascii_identifier


  - title: Start {{ container.Names }}
    icon: <iconify-icon icon="formkit:start"></iconify-icon>
    shell: docker start {{ container.Names }}
    entity: container
    triggers:
      - Update container entity file

  - title: Stop {{ container.Names }}
    icon: <iconify-icon icon="formkit:stop"></iconify-icon>
    shell: docker stop {{ container.Names }}
    entity: container
    triggers:
      - Update container entity file

  - title: Restart {{ container.Names }}
    icon: <iconify-icon icon="ix:reboot"></iconify-icon>
    shell: docker restart {{ container.Names }}
    popupOnStart: execution-dialog-stdout-only
    entity: container
    triggers:
      - Update container entity file

  - title: Logs de {{ container.Names }}
    shell: docker logs --tail 30 {{ container.Names }}
    icon: <iconify-icon icon="ix:log"></iconify-icon>
    popupOnStart: execution-dialog-stdout-only
    entity: container
    triggers:
      - Update container entity file

  # This is a hidden action, that is run on startup, and every 5 minutes, and
  # when the above start/stop commands are run (see the `triggers` property).

  - title: Update container entity file
    shell: 'docker ps -a --format json > /config/entities/containers.json'
    hidden: true
    execOnStartup: true
    execOnCron: '*/5 * * * *'

# Docs: http://docs.olivetin.app/entities.html
entities:
  - file: /config/entities/containers.json
    name: container

# The only way to properly use entities, are to use them with a `fieldset` on
# a dashboard.
dashboards:
  # This is the second dashboard.
  - title: Conteneurs
    contents:
      - title: 'Conteneur {{ container.Names }}'
        entity: container
        type: fieldset
        contents:
          - type: display
            title: |
              {{ container.Status }}
          - title: 'Start {{ container.Names }}'
          - title: 'Stop {{ container.Names }}'
          - title: 'Restart {{ container.Names }}'
          - title: 'Logs de {{ container.Names }}'

J'ai donc deux pages, une page avec des actions génériques sur mes dockers (liste des dockers, log d'un docker…) et une seconde page listant tous mes services avec des boutons permettant de les démarrer, arrêter, redémarrer, auditer.

Résultat

Page d'accueil

OliveTin accueil

Page des conteneurs

OliveTin conteneur

à bientôt

Articles similaires