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

187 lines
8.4 KiB
Markdown

---
title: Jellyswarrm
created: 2026-06-06
updated: 2026-06-06
type: app
tags: [catalogue, reverse-proxy, media, jellyfin, federation, rust]
confidence: medium
contested: false
sources: [https://selfh.st/apps/?tag=Reverse+Proxy, https://github.com/LLukas22/Jellyswarrm]
---
# 🚦 Jellyswarrm
> **Reverse proxy spécialisé Jellyfin qui fusionne plusieurs serveurs en une bibliothèque unifiée**. Pour qui veut centraliser ses médias (et ceux de ses amis) sans configurer chaque client avec N serveurs.
## 📋 Informations Générales
| Champ | Valeur |
| :--- | :--- |
| **Site web** | (GitHub uniquement) |
| **GitHub** | [LLukas22/Jellyswarrm](https://github.com/LLukas22/Jellyswarrm) |
| **License** | GPL-2.0 (relicencé depuis MIT le 2025-08-29) |
| **Langage** | Rust (90.4 %), HTML, Python |
| **Étoiles GitHub** | 749 ⭐ |
| **Dernière MAJ** | 2025-08-29 (v0.2.1) |
| **Catégorie** | [[cat-reverse-proxy|Reverse Proxy]], Media, Jellyfin |
## 📝 Description
**Jellyswarrm** est un **reverse proxy L7 ultra-spécialisé** : il se place devant **plusieurs instances Jellyfin** et les présente aux clients (Jellyfin Mobile, web, TV, etc.) comme **un seul serveur unifié**. C'est la réponse au problème classique : "j'ai un serveur Jellyfin chez moi, mon ami en a un autre à 500 km, et je veux que mes apps n'en voient qu'un seul avec la bibliothèque agrégée".
Le tagline officiel résume bien : *"Many servers. Single experience."*
**Caractéristiques principales** :
-**Reverse proxy Jellyfin-compatible** : le client croit parler à un serveur Jellyfin normal
-**Bibliothèque unifiée** : fusion des films/séries/musique de tous les serveurs en arrière
-**Lecture directe depuis le serveur d'origine** : pas de transit par Jellyswarrm (transcodage fait sur place)
-**Mapping utilisateur** : lier ses comptes entre serveurs pour une expérience cohérente
-**Synchronisation de comptes** (fédération) : ajouter un user une seule fois
-**UI Jellyfin web embarquée** : accessible directement via `/`
-**WebSocket** pour les features temps-réel (SyncPlay en cours de stabilisation)
-**Client apps existants** : la plupart des apps Jellyfin fonctionnent sans modification
- ⚠️ **Encore en développement actif** : certaines features annoncées comme QuickConnect, ajustement automatique du bitrate, gestion des médias via l'UI ne sont pas encore implémentées
**Public cible** : utilisateurs de **Jellyfin multi-site** (plusieurs localisations géographiques, serveurs amis, familles éclatées) qui veulent **une seule bibliothèque**, **une seule URL** et **un seul login**. Particulièrement adapté aux personnes qui partagent des médias avec leurs proches sans monter un serveur centralisé coûteux.
## 🚀 Installation
### Option 1 : Docker Compose (recommandé)
```yaml
# docker-compose.yml
version: '3.8'
services:
jellyswarrm:
image: ghcr.io/llukas22/jellyswarrm:latest
container_name: jellyswarrm
restart: unless-stopped
ports:
- "3000:3000"
volumes:
- ./data:/app/data # config + base SQLite
environment:
- JELLYSWARRM_USERNAME=admin
- JELLYSWARRM_PASSWORD=jellyswarrm # ⚠️ CHANGER en production !
- JELLYSWARRM_HOST=0.0.0.0
- JELLYSWARRM_PORT=3000
networks:
- proxy
networks:
proxy:
external: true
```
> 💡 Le tag `latest` est reconstruit à chaque release. Pour un pinning, utilisez `:v0.2.1` (ou version actuelle).
### Variante Traefik (exposer derrière Traefik)
```yaml
# docker-compose.yml (variante)
version: '3.8'
services:
jellyswarrm:
image: ghcr.io/llukas22/jellyswarrm:latest
container_name: jellyswarrm
restart: unless-stopped
volumes:
- ./data:/app/data
environment:
- JELLYSWARRM_USERNAME=admin
- JELLYSWARRM_PASSWORD=changeme
labels:
- "traefik.enable=true"
- "traefik.docker.network=proxy"
- "traefik.http.routers.jellyswarrm.rule=Host(`media.example.com`)"
- "traefik.http.routers.jellyswarrm.entrypoints=websecure"
- "traefik.http.routers.jellyswarrm.tls.certresolver=letsencrypt"
- "traefik.http.services.jellyswarrm.loadbalancer.server.port=3000"
networks:
- proxy
networks:
proxy:
external: true
```
### Option 2 : Binaire natif (build depuis source)
```bash
# Prérequis : Rust toolchain + Node.js 20+
git clone --recurse-submodules https://github.com/LLukas22/Jellyswarrm.git
cd Jellyswarrm
cd ui && npm install && cd ..
cargo build --release
./target/release/jellyswarrm-proxy
```
## ⚙️ Configuration Initiale
1. **Lancer le conteneur** : `docker compose up -d`.
2. **Accéder à l'UI d'administration** : `http://YOUR_HOST:3000/ui` (login avec `JELLYSWARRM_USERNAME` / `JELLYSWARRM_PASSWORD`).
3. **Ajouter les serveurs Jellyfin upstream** : menu "Servers" → URL + clé API de chaque instance Jellyfin.
4. **Mapper les utilisateurs** : menu "Users" → lier un compte local à un compte distant.
5. **Tester** : `http://YOUR_HOST:3000` affiche l'UI Jellyfin web unifiée, brancher les clients (Android TV, iOS, web) sur cette URL unique.
6. **Sécuriser** derrière HTTPS (Traefik/Caddy) avant d'exposer sur Internet.
> ⚠️ **Changer le mot de passe par défaut** `jellyswarrm` immédiatement après la première connexion.
## 🔄 Alternatives
### Open Source
- **Jellystat** — analytics et stats Jellyfin (pas de fusion)
- **Jellyseerr** — requêtes média style Overseerr (Jellyfin-aware)
- **JellySync** — synchronisation entre serveurs (expérimental)
- **Multi-server dans l'app Jellyfin** — support natif dans certaines apps (Jellyfin Media Player, etc.) mais pas toutes
- **SMB / NFS mounts** — monter les bibliothèques distantes (perf réseau catastrophique, pas viable hors LAN)
- **Plex** — supporte multi-serveurs nativement mais c'est un autre écosystème
### Propriétaires (ce que Jellyswarrm remplace)
- **Plex** (passé à un modèle freemium) — multi-serveurs natif mais non libre
- **Emby Premiere** — multi-serveurs en option payante
- **Stremio + Real-Debrid** — agrégation SaaS de sources
### Comparaison rapide
| Critère | Jellyswarrm | Multi-serveur dans app Jellyfin | Plex |
| :--- | :--- | :--- | :--- |
| Licence | GPL-2.0 | GPL-2.0 (Jellyfin) | Propriétaire |
| Fusion bibliothèque | ✅ | ❌ (commutation) | ✅ |
| Single login | ✅ | ❌ | ✅ |
| Lecture directe | ✅ | n/a | ✅ |
| Stabilité | ⚠️ WIP | ✅ | ✅ |
| Transcodage | Côté serveur d'origine | Côté serveur sélectionné | Centralisé ou remote |
**Verdict** : **Jellyswarrm** est la **seule solution self-hosted** connue pour la fusion de bibliothèques Jellyfin. À utiliser si vous avez **réellement plusieurs serveurs** et que la commutation manuelle est insupportable. Sinon, l'ajout multi-serveur natif des clients Jellyfin reste la voie la plus stable.
## 🔐 Sécurité
- **Authentification admin** sur `/ui` : changer le mot de passe par défaut
- **HTTPS obligatoire** en production (Traefik/Caddy) : Jellyfin utilise des streams longs, MITM est un risque réel
- **Clés API Jellyfin upstream** : stockées dans `./data`, sécuriser les permissions du volume (`chmod 700`)
- **Mapping d'utilisateurs** : limiter aux comptes de confiance ; un user mappé peut voir la bibliothèque du serveur lié
- ⚠️ **Pas d'auth globale sur l'UI Jellyfin** : c'est Jellyswarrm qui **doit** faire office d'authentification, sinon tout le monde voit tout
- ⚠️ **WIP** : l'auth et certaines protections sont en cours de durcissement
- **Reverse proxy HTTPS** : utiliser les middlewares Traefik `secureHeaders` (HSTS, X-Frame-Options, etc.)
## 📚 Ressources
- [README officiel](https://github.com/LLukas22/Jellyswarrm/blob/main/README.md)
- [Documentation UI](https://github.com/LLukas22/Jellyswarrm/blob/main/docs/ui.md)
- [Documentation Config](https://github.com/LLukas22/Jellyswarrm/blob/main/docs/config.md)
- [Reddit r/JellyfinCommunity WIP](https://www.reddit.com/r/JellyfinCommunity/comments/1my7q6p/wip_jellyswarrm_a_reverse_proxy_to_merge_multiple/)
- [Patreon LLukas22 (devlog)](https://www.patreon.com/posts/jellyswarrm-into-145059441)
## Pages Liées
- [[cat-reverse-proxy]] — Catégorie Reverse Proxy
- [[app-caddy]] — reverse proxy L7 pour exposition HTTPS
- [[app-traefik]] — reverse proxy L7 cloud-native
- [[app-jellyfin]] — Le serveur média en aval
- [[comparatif-reverse-proxy]] — Comparaison détaillée
- [[media-stack]] — Stack média auto-hébergée