204 lines
8.5 KiB
Markdown
204 lines
8.5 KiB
Markdown
---
|
|
title: Grist
|
|
created: 2026-06-07
|
|
updated: 2026-06-07
|
|
type: app
|
|
tags: [catalogue, database, low-code, spreadsheet, python, postgres, sqlite, analytics, bi, apache]
|
|
confidence: high
|
|
contested: false
|
|
sources: [https://selfh.st/apps/?tag=Database, https://github.com/gristlabs/grist-core]
|
|
---
|
|
|
|
# 🗄️ Grist
|
|
|
|
> **Le tableur relationnel open source** : la puissance des colonnes calculées, des références entre tables, des formules Python-like, et un modèle relationnel complet. L'Excel pour les gens qui structurent vraiment leurs données.
|
|
|
|
## 📋 Informations Générales
|
|
|
|
| Champ | Valeur |
|
|
| :--- | :--- |
|
|
| **Site web** | [getgrist.com](https://www.getgrist.com/) |
|
|
| **GitHub** | [gristlabs/grist-core](https://github.com/gristlabs/grist-core) |
|
|
| **License** | Apache-2.0 |
|
|
| **Langage** | Python (backend) + TypeScript (UI) |
|
|
| **Étoiles GitHub** | 11k ⭐ |
|
|
| **Dernière MAJ** | 2026-06-05 |
|
|
| **Catégorie** | [[cat-database\|Database]] |
|
|
|
|
## 📝 Description
|
|
|
|
**Grist** est un **tableur relationnel** : à mi-chemin entre Excel, Airtable et une vraie base de données. Là où Airtable permet d'avoir plusieurs "tables" liées, Grist pousse le concept jusqu'au bout : **vraies foreign keys, vrais types de colonnes, vraies contraintes**, le tout dans une **UI de tableur** familière.
|
|
|
|
L'ingrédient magique de Grist ce sont ses **formules Python-like** : on peut écrire du code proche de Python directement dans une cellule, avec accès aux colonnes des autres tables, des fonctions de chaîne, des conditions, des boucles, et même des fonctions custom en Python. C'est ce qui fait la différence avec Airtable : on a **la souplesse d'un tableur** avec **la rigueur d'une base de données**.
|
|
|
|
### 🛠️ Cas d'usage typiques
|
|
|
|
- ✅ Suivi de budget personnel / familial avec multi-devises et rolling forecasts
|
|
- ✅ Inventaire avec relations (fournisseurs → produits → commandes)
|
|
- ✅ CRM léger pour freelance (contacts → opportunités → factures)
|
|
- ✅ Planification de projet avec dépendances et Gantt
|
|
- ✅ Bases de connaissances structurées
|
|
- ✅ Dashboards avec graphiques intégrés (bar, line, pie, scatter…)
|
|
- ✅ ETL rapide : importer des CSV, les transformer via formules, exporter
|
|
- ✅ Collaboration multi-utilisateurs avec ACL fines
|
|
|
|
### 🎯 Différenciateurs clés
|
|
|
|
- ✅ **Modèle relationnel natif** : foreign keys, lookups, références entre tables
|
|
- ✅ **Formules Python-like** : on peut littéralement écrire `if x > 0: return y * 1.2` dans une colonne
|
|
- ✅ **Custom widgets** : créer ses propres visualisations
|
|
- ✅ **API complète** : REST + Python SDK
|
|
- ✅ **ACL par table, par ligne, par colonne** (un vrai row-level security)
|
|
- ✅ **Import/Export** : CSV, XLSX, JSON, SQLite dump
|
|
- ✅ **Self-hosted** : Docker simple, ou natif Python
|
|
- ✅ **Versioning** : chaque modification est versionnée, on peut rollback
|
|
- ✅ **Templating** : partager un document comme template reproductible
|
|
- ✅ **Embeds** : intégrer une vue Grist dans une page web (iframe ou widget JS)
|
|
|
|
**Public cible** : homelabs qui veulent remplacer Excel/Google Sheets, petites structures qui n'ont pas besoin d'un ERP complet, analystes qui veulent prototyper rapidement.
|
|
|
|
## 🚀 Installation
|
|
|
|
### Option 1 : Docker Compose (recommandé)
|
|
|
|
```yaml
|
|
# docker-compose.yml
|
|
version: '3.8'
|
|
services:
|
|
grist:
|
|
image: gristlabs/grist:latest
|
|
container_name: grist
|
|
restart: unless-stopped
|
|
environment:
|
|
GRIST_HOST: "0.0.0.0"
|
|
GRIST_PORT: 8484
|
|
GRIST_DOMAIN: "grist.example.com"
|
|
GRIST_SINGLE_ORG: "homelab"
|
|
GRIST_FORCE_LOGIN: "true"
|
|
# Optionnel : authentification via OIDC/SAML
|
|
# GRIST_OAUTH_ID: "..."
|
|
# GRIST_OAUTH_SECRET: "..."
|
|
# GRIST_OAUTH_HOST: "https://grist.example.com"
|
|
# GRIST_OAUTH_IDP_ISSUER: "https://authentik.example.com/application/o/grist/"
|
|
# Type de BDD : sqllite (par défaut) ou postgres
|
|
TYPE: "sqllite"
|
|
SQLITE_PATH: "/persist/home.sqlite"
|
|
ports:
|
|
- "8484:8484"
|
|
volumes:
|
|
- grist-data:/persist
|
|
labels:
|
|
- "traefik.enable=true"
|
|
- "traefik.http.routers.grist.rule=Host(`grist.example.com`)"
|
|
- "traefik.http.routers.grist.entrypoints=websecure"
|
|
- "traefik.http.routers.grist.tls.certresolver=letsencrypt"
|
|
- "traefik.http.services.grist.loadbalancer.server.port=8484"
|
|
|
|
volumes:
|
|
grist-data:
|
|
```
|
|
|
|
> 💡 Grist peut aussi tourner en **mode multi-org** (plusieurs équipes séparées) en supprimant `GRIST_SINGLE_ORG`.
|
|
|
|
### Option 2 : Binaire natif (développement)
|
|
|
|
```bash
|
|
git clone https://github.com/gristlabs/grist-core.git
|
|
cd grist-core
|
|
npm install
|
|
GRIST_HOST=0.0.0.0 npm run build && npm start
|
|
```
|
|
|
|
### Option 3 : Postgres backend (production)
|
|
|
|
```yaml
|
|
services:
|
|
grist:
|
|
environment:
|
|
TYPE: "postgres"
|
|
PGHOST: grist-db
|
|
PGPORT: 5432
|
|
PGUSER: grist
|
|
PGPASSWORD: changez_moi
|
|
PGDATABASE: grist
|
|
grist-db:
|
|
image: postgres:16-alpine
|
|
environment:
|
|
POSTGRES_DB: grist
|
|
POSTGRES_USER: grist
|
|
POSTGRES_PASSWORD: changez_moi
|
|
volumes:
|
|
- grist-pg:/var/lib/postgresql/data
|
|
```
|
|
|
|
## ⚙️ Configuration Initiale
|
|
|
|
1. **Premier accès** : `https://grist.example.com` → créer le premier utilisateur (devient admin via `GRIST_SINGLE_ORG`)
|
|
2. **Activer OIDC** (recommandé) : configurer les variables `GRIST_OAUTH_*` et pointer vers Authentik/Authelia
|
|
3. **Créer un document** : + New Document → importer un CSV, XLSX, ou partir de zéro
|
|
4. **Créer une deuxième table** : + Add new table → définir les types de colonnes
|
|
5. **Créer une relation** : dans une table, ajouter une colonne de type "Reference" pointant vers l'autre table
|
|
6. **Ajouter une formule** : sur une colonne → click droit → "Formula" → `len($name.upper())` par exemple
|
|
|
|
## 🔄 Alternatives
|
|
|
|
### Open Source
|
|
- **NocoDB** — Plus Airtable-like, plus de connecteurs
|
|
- **Baserow** — Plus simple, plus jeune
|
|
- **Teable** — Plus moderne, basé sur Postgres
|
|
- **Mathesar** — Plus brut, plus orienté data team
|
|
- **AirTable clone in Grist** — 😄
|
|
- **LibreOffice Calc** — Tableur classique, sans modèle relationnel
|
|
- **EtherCalc** — Multi-utilisateurs mais très basique
|
|
|
|
### Propriétaires
|
|
- **Airtable** — Standard du marché, freemium
|
|
- **Google Sheets** — Tableur classique collaboratif, sans relations fortes
|
|
- **Microsoft Excel** — Roi historique, mais client lourd
|
|
- **Coda** — Tableur + documents, approche originale
|
|
- **Smartsheet** — Project management + tables
|
|
- **Notion** — Bases de données, plus wiki
|
|
- **Retool Tables** — Plus dev-oriented
|
|
|
|
### Comparaison
|
|
|
|
| Critère | Grist | Airtable | NocoDB | Google Sheets |
|
|
| :--- | :--- | :--- | :--- | :--- |
|
|
| Licence | Apache-2.0 | Propriétaire | AGPL-3.0 | Propriétaire |
|
|
| Modèle relationnel | ✅ Vrai | ✅ Limité | ✅ Vrai | ❌ |
|
|
| Formules | Python-like | Propre | Limitée | Propre |
|
|
| ACL par ligne | ✅ | ✅ (Pro) | ❌ | ✅ |
|
|
| API | REST + Python | REST | REST/GraphQL | Sheets API |
|
|
| Auto-hébergeable | ✅ | ❌ | ✅ | ❌ |
|
|
| Visualisations intégrées | ✅ | ✅ | Limité | ✅ |
|
|
| Versioning | ✅ Auto | Pro only | ❌ | ✅ |
|
|
| Prix | Gratuit | Freemium | Gratuit | Freemium |
|
|
|
|
**Verdict** : Grist est **le meilleur choix open source** pour un homelab qui veut un **vrai tableur relationnel** avec ACL fines. Il bat Airtable sur la rigueur des données, le pricing et la portabilité. Pour un usage plus "no-code Airtable-like", **NocoDB** ou **Teable** sont mieux.
|
|
|
|
## 🔐 Sécurité
|
|
|
|
- **Authentification** : email/password par défaut, **OIDC / OAuth / SAML** via config (recommandé)
|
|
- **HTTPS obligatoire** via [[app-traefik]] — Grist expose aussi une API
|
|
- **ACL fines** : par table, par colonne, par ligne
|
|
- **Secrets** : si OIDC, stocker `GRIST_OAUTH_SECRET` hors de l'image
|
|
- **Backups** : [[app-backup]] (restic) sur le volume `grist-data` (contient `home.sqlite`) — **indispensable**, c'est toute votre data
|
|
- **Si Postgres backend** : sauvegarder la BDD via `pg_dump`
|
|
|
|
## 📚 Ressources
|
|
|
|
- [Site officiel](https://www.getgrist.com/)
|
|
- [GitHub gristlabs/grist-core](https://github.com/gristlabs/grist-core)
|
|
- [Documentation](https://support.getgrist.com/)
|
|
- [Exemples et templates](https://templates.getgrist.com/)
|
|
- [Forum communautaire](https://community.getgrist.com/)
|
|
|
|
## Pages Liées
|
|
- [[cat-database]] — Catégorie Database
|
|
- [[app-postgres]] — BDD alternative au SQLite
|
|
- [[app-backup]] (restic) — Sauvegardes critiques
|
|
- [[app-traefik]] — Reverse-proxy HTTPS
|
|
- [[recettes-docker-compose]] — Recettes
|
|
- [[securisation-home-lab]] — Bonnes pratiques
|
|
- [[glossaire-homelab]] — Glossaire
|