Files
wiki/Catalogue-Self-Hosted/apps/app-quickwit.md
T
2026-06-09 18:40:21 +02:00

191 lines
7.6 KiB
Markdown

---
title: Quickwit
created: 2026-06-07
updated: 2026-06-07
type: app
tags: [catalogue, logs, observability, search-engine, full-text, rust, cloud-native, s3, tracing]
confidence: high
contested: false
sources: [https://selfh.st/apps/?tag=Logs, https://github.com/quickwit-oss/quickwit]
---
# 📋 Quickwit
> **Le moteur de recherche cloud-native écrit en Rust** : recherche full-text ultra-rapide sur des pétaoctets de logs et traces, avec stockage objet S3 natif. La meilleure alternative moderne à Elasticsearch.
## 📋 Informations Générales
| Champ | Valeur |
| :--- | :--- |
| **Site web** | [quickwit.io](https://quickwit.io/) |
| **GitHub** | [quickwit-oss/quickwit](https://github.com/quickwit-oss/quickwit) |
| **License** | Apache-2.0 |
| **Langage** | Rust |
| **Étoiles GitHub** | 11.3k ⭐ |
| **Dernière MAJ** | 2026-06-04 |
| **Catégorie** | [[cat-logs|Logs]] |
## 📝 Description
**Quickwit** est un **moteur de recherche distribué** écrit en **Rust** (donc très rapide et économe en RAM), conçu pour la recherche full-text sur des volumes massifs de **logs, traces et événements**. Contrairement à Elasticsearch (basé sur Lucene/JVM, gourmand en mémoire), Quickwit utilise un index **Tantivy** optimisé pour le stockage objet S3.
L'architecture de Quickwit est **cloud-native by design** : stateless, découplage indexer/searcher, et stockage sur S3. Pas de cluster state, pas de ZooKeeper, pas de JVM à tuner. C'est l'outil idéal pour quiconque veut **rechercher dans des téraoctets de logs sans exploser son infra**.
Quickwit supporte à la fois la **recherche de logs** (ingestion via HTTP/gRPC/Kafka) et la **recherche de traces** OTLP (compatible avec OpenTelemetry). Une **UI web** est intégrée nativement, et une intégration Grafana est disponible.
**Public cible** : labos perso qui veulent un Elasticsearch-like léger, équipes qui ingèrent des téraoctets de logs/jour, SRE qui font du log analytics sur du long-terme (rétention mois/années), devs qui cherchent dans des dumps de production.
-**Écrit en Rust** : performances excellentes, faible empreinte RAM
-**Recherche full-text** ultra-rapide (Tantivy)
-**Stockage S3 natif** : scale-to-zero, pas de disque local obligatoire
-**Architecture stateless** : pas de ZooKeeper, pas de JVM
-**Support traces OTLP** : ingestion directe OpenTelemetry
-**UI web intégrée** : exploration des index, requêtes, stats
-**Compatible Kafka** : ingestion streaming
-**Indexation incrémentale** : pas de rebuild complet
-**Multi-tenancy** via namespaces
-**Compression** élevée (columnar + tantivy)
-**Distributed tracing** : corrélation log↔trace
-**Single binary** : déploiement simple
## 🚀 Installation
### Option 1 : Docker Compose (single node)
```yaml
# docker-compose.yml
version: '3.8'
services:
quickwit:
image: quickwit/quickwit:1.0.0
container_name: quickwit
restart: unless-stopped
command: run
environment:
QW_CONFIG: /quickwit/config/quickwit.yaml
QW_WORK_DIR: /quickwit/qwdata
ports:
- "7280:7280" # REST API
- "7281:7281" # UI web
volumes:
- quickwit-data:/quickwit/qwdata
- ./quickwit.yaml:/quickwit/config/quickwit.yaml:ro
labels:
- "traefik.enable=true"
- "traefik.http.routers.quickwit.rule=Host(`quickwit.example.com`)"
- "traefik.http.routers.quickwit.entrypoints=websecure"
- "traefik.http.routers.quickwit.tls.certresolver=letsencrypt"
- "traefik.http.services.quickwit.loadbalancer.server.port=7281"
volumes:
quickwit-data:
```
### Option 2 : Single binary
```bash
curl -L https://github.com/quickwit-oss/quickwit/releases/latest/download/quickwit-linux-x86_64.tar.gz | tar xz
./quickwit run
```
### Option 3 : Kubernetes (Helm)
```bash
helm repo add quickwit https://quickwit-io.github.io/quickwit-helm
helm install quickwit quickwit/quickwit --namespace logging --create-namespace
```
## ⚙️ Configuration Initiale
1. **Créer un index** :
```bash
curl -X POST http://localhost:7280/api/v1/indexes \
-H "Content-Type: application/yaml" \
-d 'version: 1
index_id: my-logs
doc_mapping:
field_mappings:
- name: timestamp
type: datetime
- name: message
type: text
- name: level
type: keyword
search_settings:
default_search_fields: [message]'
```
2. **Ingest un log** :
```bash
curl -X POST http://localhost:7280/api/v1/my-logs/ingest \
-H "Content-Type: application/json" \
-d '{"timestamp":"2026-06-07T12:00:00Z","message":"hello world","level":"info"}'
```
3. **Accéder à l'UI** : `http://IP:7281` (UI web intégrée)
4. **Rechercher** : barre de recherche type Lucene/Kibana
5. **Connecter Grafana** : Data Source > Quickwit > URL `http://quickwit:7280`
6. **Configurer la rétention** : `index_config.retention.policy` (ex: 90 jours)
7. **Activer le stockage S3** : `s3_uri: s3://bucket/prefix` dans la config index
## 🔄 Alternatives
### Open Source
- [[app-loki]] — Indexation par labels (pas full-text)
- [[app-elasticsearch]] — La référence historique (JVM, lourd)
- [[app-graylog]] — SIEM complet (SSPL)
- [[app-parseable]] — Columnar Parquet sur S3
- **Meilisearch** — Recherche full-text légère (Ruby/Rust)
- **Tantivy** — Bibliothèque sous-jacente de Quickwit
### Comparaison Quickwit vs autres
| Critère | Quickwit | Elasticsearch | Loki | Meilisearch |
| :--- | :--- | :--- | :--- | :--- |
| **Langage** | Rust | Java (JVM) | Go | Rust |
| **RAM (10 Go index)** | ~500 Mo | ~4-8 Go | ~1 Go | ~1 Go |
| **Stockage** | S3 natif | Disque | S3 | Disque/RAM |
| **Recherche full-text** | Excellente | Excellente | Regex | Excellente |
| **Démarrage cold** | <1s | 30-60s | 5s | <1s |
| **Distributed** | ✅ (stateless) | ✅ (stateful) | ✅ | ❌ |
| **Logs/Traces** | ✅ OTLP | ✅ ECS | ✅ Logs only | ❌ |
| **Setup** | Simple | Complexe | Moyen | Très simple |
| **License** | Apache-2.0 | SSPL/Elastic | AGPL-3.0 | MIT |
**Verdict** : Quickwit est **le meilleur choix moderne** pour remplacer Elasticsearch sur de la recherche logs/traces. Léger, rapide, S3-natif. Si vous n'avez pas besoin de full-text, [[app-loki]] reste plus simple.
### Propriétaires (ce que Quickwit remplace)
- **Elastic Cloud** (Elasticsearch managé, cher)
- **Algolia** (search-as-a-service, cher)
- **Amazon OpenSearch Service**
- **Coveo**
- **Meilisearch Cloud**
## 🔐 Sécurité
- ⚠️ **Logs = données sensibles** : traces OTLP contiennent souvent PII
- ✅ **Chiffrement at-rest** : LUKS/ZFS + chiffrement S3 (SSE-S3 ou SSE-KMS)
- ✅ **Chiffrement in-transit** : TLS obligatoire (Traefik en reverse proxy)
- ✅ **Authentification** : basic auth sur l'API, token JWT possible
- ✅ **RBAC** : `index_config.access_policy` (allow/deny par index)
- ⚠️ **Rétention** : GDPR/RGPD — configurer `retention.policy` (ex: 90 jours max)
- ✅ **PII filtering** : ingest pipeline avec regex avant indexation
- ✅ **Audit log** : logs d'accès dans `./qwdata/{index}/access.log`
-**Backups chiffrés** : [[app-restic]] sur le bucket S3
## 📚 Ressources
- [GitHub quickwit-oss/quickwit](https://github.com/quickwit-oss/quickwit)
- [Documentation officielle](https://quickwit.io/docs/)
- [Quickstart tutorial](https://quickwit.io/docs/get-started/quickstart)
- [Blog technique](https://quickwit.io/blog/)
## Pages Liées
- [[cat-logs]] — Catégorie Logs
- [[app-loki]] — Alternative label-based
- [[app-grafana]] — Visualisation
- [[app-tempo]] — Traces distribuées
- [[app-uptime-kuma]] — Monitoring uptime
- [[securisation-home-lab]] — Bonnes pratiques sécurité