Pourquoi auto-héberger Grist ?

L'auto-hébergement vous permet de :

  • Maîtriser vos données : Hébergement sur votre propre serveur
  • Réduire les coûts : Gratuit si vous avez déjà un serveur
  • Personnaliser : Accès complet à la configuration
  • Intégrer : Connexion à vos systèmes internes

Prérequis

Matériel recommandé

  • CPU : 2 cœurs minimum (4 recommandés)
  • RAM : 4 Go minimum (8 Go recommandés)
  • Stockage : 20 Go minimum (SSD recommandé)
  • OS : Linux (Ubuntu 20.04/22.04, Debian 11/12)

Logiciels nécessaires

  • Docker 20.10+
  • Docker Compose 2.0+
  • Un nom de domaine (optionnel mais recommandé)

Installation de Docker

Sur Ubuntu/Debian

# Mettre à jour le système
sudo apt update && sudo apt upgrade -y

# Installer les dépendances
sudo apt install -y apt-transport-https ca-certificates curl gnupg lsb-release

# Ajouter la clé GPG officielle de Docker
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg

# Ajouter le repository Docker
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

# Installer Docker
sudo apt update
sudo apt install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin

# Vérifier l'installation
sudo docker --version
sudo docker compose version

Configuration Docker Compose

Créer le fichier docker-compose.yml

version: '3.8'

services:
  grist:
    image: gristlabs/grist:latest
    container_name: grist
    restart: unless-stopped
    ports:
      - "8484:8484"
    environment:
      - APP_HOME_URL=https://grist.votredomaine.com
      - GRIST_SINGLE_ORG=mon-organisation
      - [email protected]
      - GRIST_SUPPORT_ANON=false
      - GRIST_FORCE_LOGIN=true
    volumes:
      - ./data:/persist
      - ./docs:/docs
    networks:
      - grist-network

  # Optionnel : Base de données PostgreSQL externe
  postgres:
    image: postgres:15-alpine
    container_name: grist-postgres
    restart: unless-stopped
    environment:
      POSTGRES_DB: grist
      POSTGRES_USER: grist
      POSTGRES_PASSWORD: votre_mot_de_passe_secure
    volumes:
      - postgres_data:/var/lib/postgresql/data
    networks:
      - grist-network

  # Optionnel : Redis pour le cache
  redis:
    image: redis:7-alpine
    container_name: grist-redis
    restart: unless-stopped
    volumes:
      - redis_data:/data
    networks:
      - grist-network

volumes:
  postgres_data:
  redis_data:

networks:
  grist-network:
    driver: bridge

Configuration avec Traefik (SSL automatique)

version: '3.8'

services:
  traefik:
    image: traefik:v2.10
    container_name: traefik
    restart: unless-stopped
    command:
      - "--api.insecure=true"
      - "--providers.docker=true"
      - "--providers.docker.exposedbydefault=false"
      - "--entrypoints.web.address=:80"
      - "--entrypoints.websecure.address=:443"
      - "--certificatesresolvers.letsencrypt.acme.tlschallenge=true"
      - "--certificatesresolvers.letsencrypt.acme.email=admin@votredomaine.com"
      - "--certificatesresolvers.letsencrypt.acme.storage=/letsencrypt/acme.json"
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock:ro
      - ./letsencrypt:/letsencrypt
    networks:
      - grist-network

  grist:
    image: gristlabs/grist:latest
    container_name: grist
    restart: unless-stopped
    environment:
      - APP_HOME_URL=https://grist.votredomaine.com
      - GRIST_SINGLE_ORG=mon-organisation
    volumes:
      - ./data:/persist
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.grist.rule=Host(`grist.votredomaine.com`)"
      - "traefik.http.routers.grist.entrypoints=websecure"
      - "traefik.http.routers.grist.tls.certresolver=letsencrypt"
      - "traefik.http.services.grist.loadbalancer.server.port=8484"
    networks:
      - grist-network

networks:
  grist-network:
    driver: bridge

Démarrer Grist

Lancer les conteneurs

# Créer le dossier de données
mkdir -p ~/grist && cd ~/grist

# Créer le fichier docker-compose.yml
nano docker-compose.yml
# (Collez la configuration choisie)

# Lancer Grist
sudo docker compose up -d

# Vérifier que tout fonctionne
sudo docker compose ps
sudo docker compose logs -f grist

Accéder à Grist

  • Sans SSL : http://votre-ip:8484
  • Avec Traefik : https://grist.votredomaine.com

Configuration avancée

Variables d'environnement importantes

VariableDescriptionExemple
APP_HOME_URLURL publique de Gristhttps://grist.example.com
GRIST_SINGLE_ORGNom de l'organisationma-societe
GRIST_DEFAULT_EMAILEmail admin par défaut[email protected]
GRIST_SUPPORT_ANONAutoriser l'accès anonymefalse
GRIST_FORCE_LOGINForcer l'authentificationtrue
GRIST_SANDBOX_FLAVORIsolation des formulesgvisor

Activer l'authentification OAuth (Google)

environment:
  - GRIST_OAUTH_PROVIDER=google
  - GRIST_OAUTH_CLIENT_ID=votre-client-id
  - GRIST_OAUTH_CLIENT_SECRET=votre-client-secret

Backup et restauration

Script de backup automatique

#!/bin/bash
# backup-grist.sh

BACKUP_DIR="/backups/grist"
DATE=$(date +%Y%m%d_%H%M%S)
mkdir -p $BACKUP_DIR

# Backup des données Grist
tar -czf $BACKUP_DIR/grist_data_$DATE.tar.gz ~/grist/data

# Backup PostgreSQL (si utilisé)
docker exec grist-postgres pg_dump -U grist grist > $BACKUP_DIR/grist_db_$DATE.sql

# Garder seulement les 7 derniers backups
ls -t $BACKUP_DIR/*.tar.gz | tail -n +8 | xargs rm -f
ls -t $BACKUP_DIR/*.sql | tail -n +8 | xargs rm -f

echo "Backup terminé : $DATE"

Restaurer un backup

# Arrêter Grist
docker compose down

# Restaurer les données
sudo tar -xzf grist_data_20240331_120000.tar.gz -C ~/

# Restaurer la base (si PostgreSQL)
docker exec -i grist-postgres psql -U grist grist < grist_db_20240331_120000.sql

# Redémarrer
docker compose up -d

Mise à jour de Grist

# Arrêter les conteneurs
cd ~/grist
sudo docker compose down

# Télécharger la dernière version
sudo docker pull gristlabs/grist:latest

# Redémarrer
sudo docker compose up -d

# Nettoyer les anciennes images
sudo docker image prune -f

Résolution des problèmes courants

Grist ne démarre pas

# Vérifier les logs
sudo docker compose logs grist

# Vérifier les ports utilisés
sudo netstat -tlnp | grep 8484

# Redémarrer proprement
sudo docker compose down
sudo docker compose up -d

Problèmes de permissions

# Corriger les permissions
cd ~/grist
sudo chown -R 1000:1000 data
sudo chmod -R 755 data

Certificat SSL non valide

# Vérifier Traefik
sudo docker compose logs traefik

# Forcer le renouvellement
sudo rm -rf letsencrypt/*
sudo docker compose restart traefik

Sécurité recommandée

  • Firewall : Ouvrir uniquement les ports 80, 443 et 22
  • Fail2ban : Protéger contre les attaques par force brute
  • Updates : Activer les mises à jour automatiques de sécurité
  • Backup : Automatiser les sauvegardes quotidiennes
  • Monitoring : Surveiller l'utilisation des ressources

Ressources complémentaires

Besoin d'aide pour le déploiement ?

Je peux vous accompagner sur :

  • L'installation et la configuration
  • La migration depuis Grist Cloud
  • L'intégration avec vos systèmes
  • La mise en place de backups automatisés

Consulter mes prestations →