- Déplace les migrations du service `migrate` séparé vers un entrypoint.sh - L'API exécute `sqlx migrate run` au démarrage avant de lancer le binaire - Gestion de la rétrocompatibilité : détecte un schéma pre-sqlx et crée une baseline `_sqlx_migrations` pour éviter les conflits sur les instances existantes - Installe sqlx-cli dans le builder, copie le binaire et les migrations dans l'image finale - Supprime le service `migrate` du docker-compose.yml ; l'indexer dépend maintenant du healthcheck de l'API (qui garantit que les migrations sont appliquées) Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Stripstream Librarian
A comprehensive comic book and e-book management system with automatic indexing, full-text search, and a modern web interface.
Architecture
The project consists of the following components:
- API (
apps/api/) - Rust-based REST API service - Indexer (
apps/indexer/) - Rust-based background indexing service - Backoffice (
apps/backoffice/) - Next.js web administration interface - Infrastructure (
infra/) - Docker Compose setup with PostgreSQL and Meilisearch
Quick Start
Prerequisites
- Docker and Docker Compose
- (Optional) Rust toolchain for local development
- (Optional) Node.js 18+ for backoffice development
Environment Setup
-
Copy the example environment file:
cp .env.example .env -
Edit
.envand set secure values for:MEILI_MASTER_KEY- Master key for MeilisearchAPI_BOOTSTRAP_TOKEN- Bootstrap token for initial API authentication
Running with Docker
cd infra
docker compose up -d
This will start:
- PostgreSQL (port 6432)
- Meilisearch (port 7700)
- API service (port 7080)
- Indexer service (port 7081)
- Backoffice web UI (port 7082)
Accessing the Application
- Backoffice: http://localhost:7082
- API: http://localhost:7080
- Meilisearch: http://localhost:7700
Default Credentials
The default bootstrap token is configured in your .env file. Use this for initial API authentication.
Development
Local Development (without Docker)
API & Indexer (Rust)
# Start dependencies
cd infra
docker compose up -d postgres meilisearch
# Run API
cd apps/api
cargo run
# Run Indexer (in another terminal)
cd apps/indexer
cargo run
Backoffice (Next.js)
cd apps/backoffice
npm install
npm run dev
The backoffice will be available at http://localhost:3000
Features
Libraries Management
- Create and manage multiple libraries
- Configure automatic scanning schedules (hourly, daily, weekly)
- Real-time file watcher for instant indexing
- Full and incremental rebuild options
Books Management
- Support for CBZ, CBR, and PDF formats
- Automatic metadata extraction
- Series and volume detection
- Full-text search with Meilisearch
Jobs Monitoring
- Real-time job progress tracking
- Detailed statistics (scanned, indexed, removed, errors)
- Job history and logs
- Cancel pending jobs
Search
- Full-text search across titles, authors, and series
- Library filtering
- Real-time suggestions
Environment Variables
| Variable | Description | Default |
|---|---|---|
API_LISTEN_ADDR |
API service bind address | 0.0.0.0:7080 |
INDEXER_LISTEN_ADDR |
Indexer service bind address | 0.0.0.0:7081 |
BACKOFFICE_PORT |
Backoffice web UI port | 7082 |
DATABASE_URL |
PostgreSQL connection string | postgres://stripstream:stripstream@postgres:5432/stripstream |
MEILI_URL |
Meilisearch connection URL | http://meilisearch:7700 |
MEILI_MASTER_KEY |
Meilisearch master key (required) | - |
API_BOOTSTRAP_TOKEN |
Initial API admin token (required) | - |
INDEXER_SCAN_INTERVAL_SECONDS |
Watcher scan interval | 5 |
LIBRARIES_ROOT_PATH |
Path to libraries directory | /libraries |
API Documentation
The API is documented with OpenAPI/Swagger. When running locally, access the docs at:
http://localhost:7080/swagger-ui
Project Structure
stripstream-librarian/
├── apps/
│ ├── api/ # Rust REST API
│ ├── indexer/ # Rust background indexer
│ └── backoffice/ # Next.js web UI
├── infra/
│ ├── docker-compose.yml
│ └── migrations/ # SQL database migrations
├── libraries/ # Book storage (mounted volume)
└── .env # Environment configuration
Docker Registry
Images are built and pushed to Docker Hub with the naming convention docker.io/{owner}/stripstream-{service}.
Publishing Images (Maintainers)
To build and push all service images to the registry:
# Login to Docker Hub first
docker login -u julienfroidefond32
# Build and push all images
./scripts/docker-push.sh
This script will:
- Build images for
api,indexer, andbackoffice - Tag them with the current version (from
Cargo.toml) andlatest - Push to the registry
Using Published Images
To use the pre-built images in your own docker-compose.yml:
services:
postgres:
image: postgres:16-alpine
environment:
POSTGRES_DB: stripstream
POSTGRES_USER: stripstream
POSTGRES_PASSWORD: stripstream
volumes:
- postgres_data:/var/lib/postgresql/data
meilisearch:
image: getmeili/meilisearch:v1.12
environment:
MEILI_MASTER_KEY: ${MEILI_MASTER_KEY}
api:
image: julienfroidefond32/stripstream-api:latest
env_file:
- .env
ports:
- "7080:7080"
volumes:
- ${LIBRARIES_HOST_PATH:-./libraries}:/libraries
- ${THUMBNAILS_HOST_PATH:-./data/thumbnails}:/data/thumbnails
indexer:
image: julienfroidefond32/stripstream-indexer:latest
env_file:
- .env
ports:
- "7081:7081"
volumes:
- ${LIBRARIES_HOST_PATH:-./libraries}:/libraries
- ${THUMBNAILS_HOST_PATH:-./data/thumbnails}:/data/thumbnails
backoffice:
image: julienfroidefond32/stripstream-backoffice:latest
env_file:
- .env
environment:
- PORT=7082
- HOST=0.0.0.0
ports:
- "7082:7082"
volumes:
postgres_data:
License
[Your License Here]