Initial vault setup
This commit is contained in:
@@ -0,0 +1,210 @@
|
||||
---
|
||||
title: Parseable
|
||||
created: 2026-06-07
|
||||
updated: 2026-06-07
|
||||
type: app
|
||||
tags: [catalogue, logs, observability, analytics, columnar, parquet, s3, rust, kubernetes, docker]
|
||||
confidence: high
|
||||
contested: false
|
||||
sources: [https://selfh.st/apps/?tag=Logs, https://github.com/parseablehq/parseable]
|
||||
---
|
||||
|
||||
# 📋 Parseable
|
||||
|
||||
> **L'alternative moderne à Loki** : stockage columnar Parquet sur S3, requêtes SQL standard, performances de classe analytique. Conçu pour l'ingestion haut débit et l'analyse long-terme.
|
||||
|
||||
## 📋 Informations Générales
|
||||
|
||||
| Champ | Valeur |
|
||||
| :--- | :--- |
|
||||
| **Site web** | [parseable.com](https://www.parseable.com/) |
|
||||
| **GitHub** | [parseablehq/parseable](https://github.com/parseablehq/parseable) |
|
||||
| **License** | Apache-2.0 (édition communauté) / EE pour features avancées |
|
||||
| **Langage** | Rust |
|
||||
| **Étoiles GitHub** | 2.4k ⭐ |
|
||||
| **Dernière MAJ** | 2026-06-04 |
|
||||
| **Catégorie** | [[cat-logs|Logs]] |
|
||||
|
||||
## 📝 Description
|
||||
|
||||
**Parseable** est un système d'**analytics de logs** moderne écrit en **Rust** qui stocke les événements au format **Parquet** (columnar) directement sur du stockage objet (S3, MinIO, filesystem). C'est la même approche que les **data warehouses** modernes (Snowflake, ClickHouse, DuckDB) appliquée aux logs : compression excellente, scan rapide de colonnes spécifiques, et requêtes **SQL standard** au lieu d'un DSL propriétaire.
|
||||
|
||||
L'architecture est volontairement simple : **un seul binaire Rust** (serveur + UI + storage engine). Pas de cluster state, pas de JVM, pas de ZooKeeper. La stack minimale est : Parseable + (optionnel) Postgres pour les métadonnées + bucket S3/MinIO. Pour démarrer, on peut même tourner sans S3 en mode filesystem local.
|
||||
|
||||
**Parseable** se distingue de [[app-loki]] par son approche **SQL-native** : on interroge les logs avec du vrai SQL (`SELECT * FROM logs WHERE level = 'error'`), pas avec LogQL. C'est un atout énorme pour les devs data, les analystes, et tous ceux qui maîtrisent SQL mais pas les DSL obscurs.
|
||||
|
||||
**Public cible** : équipes data/analytics, devs qui veulent requêter les logs en SQL, organisations qui ingèrent des millions d'événements/jour, fans de la stack Rust+Parquet+S3.
|
||||
|
||||
- ✅ **Format Parquet** : compression 10-50× vs JSON brut
|
||||
- ✅ **Requêtes SQL standard** : pas de DSL propriétaire
|
||||
- ✅ **Stockage S3 natif** : scale-to-zero, coûts réduits
|
||||
- ✅ **Écrit en Rust** : rapide, faible empreinte
|
||||
- ✅ **Single binary** : déploiement trivial
|
||||
- ✅ **Ingestion haut débit** : conçu pour des millions d'événements/sec
|
||||
- ✅ **Compatible OpenTelemetry** : ingestion OTLP
|
||||
- ✅ **UI web intégrée** : exploration SQL, dashboards
|
||||
- ✅ **PostgreSQL** optionnel pour métadonnées
|
||||
- ✅ **Prometheus metrics** : exposition native
|
||||
- ⚠️ **Communauté jeune** (2.4k ⭐) vs [[app-loki]] (28k ⭐)
|
||||
- ⚠️ **Versioning** : l'API peut évoluer (breaking changes)
|
||||
|
||||
## 🚀 Installation
|
||||
|
||||
### Option 1 : Docker Compose (single node + MinIO)
|
||||
|
||||
```yaml
|
||||
# docker-compose.yml
|
||||
version: '3.8'
|
||||
services:
|
||||
parseable:
|
||||
image: parseable/parseable:latest
|
||||
container_name: parseable
|
||||
restart: unless-stopped
|
||||
environment:
|
||||
P_ADDR: 0.0.0.0:8000
|
||||
P_DATABASE_DRIVER: postgres
|
||||
P_DATABASE_URL: postgres://parseable:parseable@postgres:5432/parseable
|
||||
P_STAGE_TYPE: s3
|
||||
P_STAGE_S3_URL: http://minio:9000
|
||||
P_STAGE_S3_BUCKET: parseable-data
|
||||
P_STAGE_S3_ACCESS_KEY_ID: parseable
|
||||
P_STAGE_S3_SECRET_ACCESS_KEY: parseable-secret-CHANGEME
|
||||
P_STAGE_S3_REGION: us-east-1
|
||||
depends_on:
|
||||
- postgres
|
||||
- minio
|
||||
ports:
|
||||
- "8000:8000"
|
||||
labels:
|
||||
- "traefik.enable=true"
|
||||
- "traefik.http.routers.parseable.rule=Host(`logs.example.com`)"
|
||||
- "traefik.http.routers.parseable.entrypoints=websecure"
|
||||
- "traefik.http.routers.parseable.tls.certresolver=letsencrypt"
|
||||
|
||||
postgres:
|
||||
image: postgres:16-alpine
|
||||
container_name: parseable-postgres
|
||||
restart: unless-stopped
|
||||
environment:
|
||||
POSTGRES_USER: parseable
|
||||
POSTGRES_PASSWORD: parseable
|
||||
POSTGRES_DB: parseable
|
||||
volumes:
|
||||
- postgres-data:/var/lib/postgresql/data
|
||||
|
||||
minio:
|
||||
image: minio/minio:latest
|
||||
container_name: parseable-minio
|
||||
restart: unless-stopped
|
||||
command: server /data --console-address ":9001"
|
||||
environment:
|
||||
MINIO_ROOT_USER: parseable
|
||||
MINIO_ROOT_PASSWORD: parseable-secret-CHANGEME
|
||||
volumes:
|
||||
- minio-data:/data
|
||||
ports:
|
||||
- "9000:9000"
|
||||
- "9001:9001"
|
||||
|
||||
volumes:
|
||||
postgres-data:
|
||||
minio-data:
|
||||
```
|
||||
|
||||
### Option 2 : Single binary (filesystem mode)
|
||||
|
||||
```bash
|
||||
curl -L https://github.com/parseablehq/parseable/releases/latest/download/parseable-linux-amd64 -o parseable
|
||||
chmod +x parseable
|
||||
P_ADDR=0.0.0.0:8000 ./parseable
|
||||
```
|
||||
|
||||
### Option 3 : Helm (Kubernetes)
|
||||
|
||||
```bash
|
||||
helm repo add parseable https://parseablehq.github.io/parseable-helm
|
||||
helm install parseable parseable/parseable \
|
||||
--namespace logging --create-namespace
|
||||
```
|
||||
|
||||
## ⚙️ Configuration Initiale
|
||||
|
||||
1. **Démarrer la stack** : `docker compose up -d`
|
||||
2. **Accéder à l'UI** : `http://IP:8000` (créer compte admin au premier login)
|
||||
3. **Créer un log stream** : UI > Streams > New Stream
|
||||
4. **Ingérer un premier événement** :
|
||||
```bash
|
||||
curl -X POST http://localhost:8000/api/v1/ingest \
|
||||
-H "X-P-Stream: my-app" \
|
||||
-H "Authorization: Basic <base64(user:pass)>" \
|
||||
-H "Content-Type: application/json" \
|
||||
-d '{"timestamp":"2026-06-07T12:00:00Z","level":"info","message":"hello"}'
|
||||
```
|
||||
5. **Requêter en SQL** : UI > Query > `SELECT * FROM my-app WHERE level = 'error' LIMIT 100`
|
||||
6. **Connecter Grafana** : Data Source > PostgreSQL > URL Parseable
|
||||
7. **Configurer la rétention** : `P_STAGE_OBJECT_STORE_DATA_RETENTION_DAYS=90`
|
||||
8. **Activer l'auth** : créer plusieurs utilisateurs (RBAC)
|
||||
|
||||
## 🔄 Alternatives
|
||||
|
||||
### Open Source
|
||||
- [[app-loki]] — Label-based, plus mature
|
||||
- [[app-quickwit]] — Full-text search, Rust aussi
|
||||
- [[app-graylog]] — SIEM complet, plus lourd
|
||||
- **ClickHouse** — OLAP columnar (Parseable s'en inspire)
|
||||
- **DuckDB** — SQLite-like columnar (parfois utilisé en local)
|
||||
- **SigNoz** — APM + logs + traces, OTLP-native
|
||||
|
||||
### Comparaison Parseable vs autres
|
||||
|
||||
| Critère | Parseable | Loki | Quickwit | ClickHouse |
|
||||
| :--- | :--- | :--- | :--- | :--- |
|
||||
| **Langage** | Rust | Go | Rust | C++ |
|
||||
| **Format stockage** | Parquet (columnar) | Chunks compressés | Tantivy | Native columnar |
|
||||
| **Langage requête** | SQL | LogQL | Lucene-like | SQL |
|
||||
| **Stockage** | S3 | S3 | S3 | Disque |
|
||||
| **Compression** | Excellente | Bonne | Bonne | Excellente |
|
||||
| **Analytics SQL** | ✅ Natif | ❌ | ❌ | ✅ Natif |
|
||||
| **UI web** | ✅ | ❌ (Grafana) | ✅ | ❌ (Grafana) |
|
||||
| **Maturité** | 🆕 Jeune | ✅ Stable | ✅ Stable | ✅ Très stable |
|
||||
| **RAM** | ~200 Mo | ~1 Go | ~500 Mo | ~2-4 Go |
|
||||
| **License** | Apache-2.0 | AGPL-3.0 | Apache-2.0 | Apache-2.0 |
|
||||
|
||||
**Verdict** : Parseable est **le choix idéal** si vous voulez des requêtes SQL standard sur des logs. Plus jeune que [[app-loki]] mais l'approche Parquet+SQL est rafraîchissante. Pour Grafana-first, Loki reste imbattable.
|
||||
|
||||
### Propriétaires (ce que Parseable remplace)
|
||||
- **Datadog Log Management** (cher)
|
||||
- **Snowflake** (data warehouse) pour l'analyse de logs
|
||||
- **Amazon Athena** + S3 (logs ad-hoc)
|
||||
- **ClickHouse Cloud**
|
||||
- **Honeycomb** (events analytics)
|
||||
|
||||
## 🔐 Sécurité
|
||||
|
||||
- ⚠️ **Logs = données sensibles** : SQL queries = grep puissant = accès large
|
||||
- ✅ **Chiffrement at-rest** : LUKS/ZFS + chiffrement S3 (SSE-S3/KMS)
|
||||
- ✅ **Chiffrement in-transit** : TLS obligatoire (Traefik en reverse proxy)
|
||||
- ✅ **Authentification** : basic auth, JWT, OAuth (Enterprise)
|
||||
- ✅ **RBAC** : users, rôles, scopes (read/write/admin par stream)
|
||||
- ⚠️ **Rétention** : GDPR/RGPD — `P_STAGE_OBJECT_STORE_DATA_RETENTION_DAYS=90`
|
||||
- ✅ **PII filtering** : ingestion pipeline avec regex/anonymisation
|
||||
- ✅ **Audit log** : logs d'accès API, métadonnées dans PostgreSQL
|
||||
- ✅ **Backups chiffrés** : [[app-restic]] sur bucket S3 + dump PostgreSQL
|
||||
- ⚠️ **SQL injection** : limiter les requêtes via RBAC strict
|
||||
|
||||
## 📚 Ressources
|
||||
|
||||
- [GitHub parseablehq/parseable](https://github.com/parseablehq/parseable)
|
||||
- [Documentation officielle](https://www.parseable.com/docs)
|
||||
- [Démo en ligne](https://demo.parseable.com/)
|
||||
- [Blog technique](https://www.parseable.com/blog)
|
||||
|
||||
## Pages Liées
|
||||
|
||||
- [[cat-logs]] — Catégorie Logs
|
||||
- [[app-loki]] — Alternative principale
|
||||
- [[app-prometheus]] — Métriques (souvent couplé)
|
||||
- [[app-grafana]] — Visualisation
|
||||
- [[app-tempo]] — Traces
|
||||
- [[app-uptime-kuma]] — Monitoring uptime
|
||||
- [[securisation-home-lab]] — Bonnes pratiques sécurité
|
||||
Reference in New Issue
Block a user