191 lines
7.6 KiB
Markdown
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é
|