Remove Meilisearch dependency entirely. Search is now handled by PostgreSQL ILIKE with pg_trgm indexes, joining series_metadata for series-level authors. No external search engine needed. - Replace search.rs Meilisearch HTTP calls with PostgreSQL queries - Remove meili.rs from indexer, sync_meili call from job pipeline - Remove MEILI_URL/MEILI_MASTER_KEY from config, state, env files - Remove meilisearch service from docker-compose.yml - Add migration 0027: drop sync_metadata, enable pg_trgm, add indexes - Remove search resync button/endpoint (no longer needed) - Update all documentation (CLAUDE.md, README.md, AGENTS.md, PLAN.md) API contract unchanged — same SearchResponse shape returned. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
74 lines
2.8 KiB
Markdown
74 lines
2.8 KiB
Markdown
# Stripstream Librarian
|
|
|
|
Gestionnaire de bibliothèque de bandes dessinées/ebooks. Workspace Cargo multi-crates avec backoffice Next.js.
|
|
|
|
## Architecture
|
|
|
|
| Service | Dossier | Port local |
|
|
|---------|---------|------------|
|
|
| API REST (axum) | `apps/api/` | 7080 |
|
|
| Indexer (background) | `apps/indexer/` | 7081 |
|
|
| Backoffice (Next.js) | `apps/backoffice/` | 7082 |
|
|
| PostgreSQL | infra | 6432 |
|
|
|
|
Crates partagés : `crates/core` (config env), `crates/parsers` (CBZ/CBR/PDF).
|
|
|
|
## Commandes
|
|
|
|
```bash
|
|
# Build
|
|
cargo build # workspace entier
|
|
cargo build -p api # crate spécifique
|
|
cargo build --release # version optimisée
|
|
|
|
# Linting / format
|
|
cargo clippy
|
|
cargo fmt
|
|
|
|
# Tests
|
|
cargo test
|
|
cargo test -p parsers
|
|
|
|
# Infra (dépendances uniquement) — docker-compose.yml est à la racine
|
|
docker compose up -d postgres
|
|
|
|
# Backoffice dev
|
|
cd apps/backoffice && npm install && npm run dev # http://localhost:7082
|
|
|
|
# Migrations
|
|
sqlx migrate run # DATABASE_URL doit être défini
|
|
```
|
|
|
|
## Environnement
|
|
|
|
```bash
|
|
cp .env.example .env # puis éditer les valeurs REQUIRED
|
|
```
|
|
|
|
Variables **requises** au démarrage : `DATABASE_URL`, `API_BOOTSTRAP_TOKEN`.
|
|
|
|
## Gotchas
|
|
|
|
- **Dépendances système** : 4 outils requis — `unrar` (CBR listing), `unar` (CBR extraction), `pdfinfo` (PDF page count), `pdftoppm` (PDF rendu). `unrar` ≠ `unar`.
|
|
- **Port backoffice** : `npm run dev` écoute sur **7082**, pas 3000.
|
|
- **LIBRARIES_ROOT_PATH** : les chemins en DB commencent par `/libraries/` ; en dev local, définir cette variable pour remapper vers le dossier réel.
|
|
- **Thumbnails** : stockés dans `THUMBNAIL_DIRECTORY` (défaut `/data/thumbnails`), générés par **l'API** (pas l'indexer) — l'indexer déclenche un checkup via `POST /index/jobs/:id/thumbnails/checkup`.
|
|
- **Workspace Cargo** : les dépendances externes sont définies dans le `Cargo.toml` racine, pas dans les crates individuels.
|
|
- **Migrations** : dossier `infra/migrations/`, géré par sqlx. Toujours migrer avant de démarrer les services.
|
|
- **Recherche** : full-text via PostgreSQL (`ILIKE` + `pg_trgm`), pas de moteur de recherche externe.
|
|
|
|
## Fichiers clés
|
|
|
|
| Fichier | Rôle |
|
|
|---------|------|
|
|
| `crates/core/src/config.rs` | Config depuis env (API, Indexer, AdminUI) |
|
|
| `crates/parsers/src/lib.rs` | Détection format, extraction métadonnées |
|
|
| `apps/api/src/books.rs` | Endpoints CRUD livres |
|
|
| `apps/api/src/search.rs` | Recherche full-text PostgreSQL |
|
|
| `apps/api/src/pages.rs` | Rendu pages + cache LRU |
|
|
| `apps/indexer/src/scanner.rs` | Scan filesystem |
|
|
| `infra/migrations/*.sql` | Schéma DB |
|
|
|
|
> Voir `AGENTS.md` pour les conventions de code détaillées (error handling, patterns sqlx, async/tokio).
|
|
> Des `AGENTS.md` spécifiques existent dans `apps/api/`, `apps/indexer/`, `apps/backoffice/`, `crates/parsers/`.
|