- Added a new job status 'extracting_pages' to represent the first sub-phase of thumbnail generation. - Updated the database schema to include a timestamp for when thumbnail generation starts. - Enhanced job progress components to handle the new status, including UI updates for displaying progress and status labels. - Refactored job-related logic to accommodate the two-phase process: extracting pages and generating thumbnails. - Adjusted SQL queries and job detail responses to include the new fields and statuses. This change improves the clarity of job processing states and enhances user feedback during the thumbnail generation process.
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]