Files
2026-06-09 18:40:21 +02:00

7.6 KiB


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
GitHub quickwit-oss/quickwit
License Apache-2.0
Langage Rust
Étoiles GitHub 11.3k
Dernière MAJ 2026-06-04
Catégorie [[cat-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)

# 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

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)

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 :

    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 :

    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

Pages Liées