Installer Grav avec Docker
Guide d'installation de Grav sous Docker

Au sommaire :
- 1-Qu'est-ce que Grav ?
- 2-Prérequis
- 3-Déploiement
- 4-Configuration
- 5-Exposer son instance avec Traefik
1-Qu'est-ce que Grav ?
Grav est un CMS (Content Management System) open-source programmé en langage PHP qui tout comme Wordpress, Joomla, Drupal et Ghost va vous permettre de déployer un blog ou un site web.
À la différence de ses concurrents qui sont des CMS dis "monolithique", Grav est un CMS dis "Flat Files" (statique), c'est à dire qu'il ne nécessite aucune de base de données.
Les fichiers de configuration ainsi que le contenu sont écris en langage YAML et JSON.
Dans la liste des CMS de ce type, vous avez :
2-Prérequis
Pour déployer Grav, vous devez disposer d'une machine virtuelle fonctionnant sous Ubuntu Server.
Création de la machine virtuelle :
Virtualisation avec Proxmox VE : Si vous partez de zéro, suivez mon guide détaillé pour virtualiser Ubuntu sur Proxmox VE avec des réglages optimisés.

Automatisation avec Cloud-Init : Pour gagner du temps lors de la configuration, utilisez un template Cloud-Init. Cela permet d'automatiser et de simplifier l'initialisation de vos machines virtuelles. Retrouvez les instructions dans ce guide.

Installation des outils nécessaires :
Docker et Docker Compose : Une fois la machine virtuelle prête, installez Docker et Docker Compose, indispensables pour gérer et orchestrer vos conteneurs. Ce guide vous accompagnera dans l'installation.

Exposition de l'application :
Proxy inverse avec Traefik : Pour exposer vos applications sur Internet de manière sécurisée, configurez un proxy inverse. Traefik est une solution recommandée. Suivez ce guide pour l'installation.

3-Déploiement
Commencez par créer un dossier "docker" à la racine du dossier utilisateur"
mkdir -p ~/docker
Créez un fichier nommé "compose.yml"
touch ~/docker/compose.yml
Ouvrez le fichier "compose.yml" et copiez cette configuration.
networks:
# Docker Bridge Network
default:
driver: bridge
services:
grav:
image: lscr.io/linuxserver/grav:latest
container_name: grav
environment:
- PUID=${PUID}
- PGID=${PGID}
- TZ=${TZ}
volumes:
- ${APPDATA}/grav:/config
ports:
- 80:80
restart: unless-stopped
- services : c'est là qu'il faudra ajouter les configuration de vos conteneurs
- image : nom du registry suivi du nom de l'application et du tag "latest" (lscr.io/linuxserver/grav)
- container_name : le nom du conteneur, sinon Docker en choisira un de manière aléatoire
- environment : indiquez les variables de base des applications Linuxserver.io comme le PUID (utilisateur), le PGID (groupe) et la TZ (timezone)
- volumes : variable ${APPDATA) (/home/user_name/appdata) suivi du nom de l'application (/app_name)
- ports : le port d'écoute pour accéder à l'interface web
- restart : unless-stopped par défaut. Le daemon de Docker redémarrera automatiquement le conteneur sauf si vous l’arrêtez, il faudra le démarrer manuellement
Enregistrez le fichier "compose.yml" et déployez le conteneur.
docker compose up -d
4-Configuration
Une fois l'application démarrée, tapez l'adresse IP de votre machine virtuelle suivi du numéro de port que vous aurez choisi.
Il va falloir créer un utilisateur :
- Username : nom de l'utilisateur
- Email : adresse email
- Password/Confirme Password : mot de passe
- Full name : nom complet
- Title : votre intitulé (j'ai laissé Administrator)
Cliquez sur "Create User".

Vous aurez un "404 page not found" si vous avez changé le port d'écoute (le port 80 étant occupé par un reverse proxy en général).
Tapez l'adresse IP suivi du numéro de port et de "/admin" (http://IP_Address:listening_port).

Pour accéder à l'interface d'administration, la même chose suivi de "/admin" (http://IP_Address:listening_port/admin).

5-Exposer son instance avec Traefik
networks:
# default network
default:
driver: bridge
# Traefik network
web:
name: web
driver: bridge
services:
traefik:
container_name: traefik
image: traefik:v2
restart: always
networks:
- web
ports:
- 80:80
- 443:443
volumes:
- /var/run/docker.sock:/var/run/docker.sock:ro
- ${APPDATA}/traefik/traefik.yml:/traefik.yml
- ${APPDATA}/traefik/dynamic.yml:/dynamic.yml
- ${APPDATA}/traefik/letsencrypt/acme.json:/acme.json
- ${APPDATA}/traefik/shared:/shared
labels:
- traefik.enable=true
- traefik.http.routers.traefik.entrypoints=websecure
- traefik.http.routers.traefik.rule=Host(`traefik.<domain_name>`)
- traefik.http.routers.traefik.service=api@internal
- "traefik.http.routers.traefik.middlewares=middlewares-basic-auth@file"
grav:
image: lscr.io/linuxserver/grav:latest
container_name: grav
environment:
- PUID=${PUID}
- PGID=${PGID}
- TZ=${TZ}
volumes:
- ${APPDATA}/grav:/config
networks:
- web
restart: unless-stopped
labels:
- traefik.enable=true
- traefik.http.routers.grav.entrypoints=websecure
- traefik.http.routers.grav.rule=Host(`grav.<domain_name>`)
- traefik.http.routers.grav.service=grav-svc
- traefik.http.services.grav-svc.loadbalancer.server.port=80
- traefik.http.routers.grav.tls.certresolver=letsencrypt