Tableau de bord compagnon non officiel pour les utilisateurs de Plex.
Application web pour gérer votre accès Plex, afficher abonnements, statistiques de visionnage, et accéder à Seerr via SSO intégré.
📖 Voir le CHANGELOG complet pour l'historique des versions et fonctionnalités
🔐 Authentification Plex : Connexion via compte Plex (OAuth)
📊 Dashboard : Vue d'ensemble (abonnement, statistiques, demandes Seerr)
🎫 Abonnements Wizarr : Date d'expiration et groupe (requis pour toutes les fonctionnalités)
📈 Statistiques Tautulli : Historique de visionnage, temps total, collections (requis pour toutes les fonctionnalités)
🛡️ Intégration Seerr (SSO) : Accès à Seerr dans une iframe full-page sans re-connexion
🏆 Système XP & Succès : Points d'expérience et badges selon l'activité de visionnage
👤 Page Profil : Stats personnelles, demandes Seerr, succès débloqués
📅 Calendrier des sorties : Sorties films/séries à venir depuis Radarr et Sonarr (4 vues : semaine, mois, jour, liste)
🔄 Reverse Proxy Automatique : Détection auto via headers X-Forwarded-*
⚡ Configuration Minimale : Juste SESSION_SECRET en obligatoire
- Français :
100%(référence principale du projet) - Anglais :
~82%(estimation actuelle de couverture UI)
🛠️ Docker & Docker Compose 👤 Compte Plex 🔗 Wizarr, Tautulli, Seerr (requis pour toutes les fonctionnalités)
# L'app détecte automatiquement le reverse proxy via X-Forwarded-*
docker compose up -d
# Accès : https://portall.votredomaine.comImage Docker publique :
ghcr.io/idrinkx/portall:latest
- SETUP.md Guide pas à pas complet
- DOCKER.md Guide Docker et reverse proxy
- UNRAID.md Configuration spécifique Unraid
- TECHNICAL.md Architecture technique et fonctionnement runtime
- CONTRIBUTING.md Regles pour proposer une contribution
- CODE_OF_CONDUCT.md Regles de comportement pour les contributions et echanges
- SECURITY.md Procedure de signalement des failles de securite
portall/
Dockerfile
docker-compose.yml
server.js # Serveur Express principal
TECHNICAL.md # Architecture et configuration runtime
package.json
routes/
auth.routes.js # Login Plex OAuth + setup initial
dashboard.routes.js # Dashboard, paramètres admin, intégrations
seerr-proxy.routes.js # Route iframe Seerr (/seerr)
views/
layout.ejs
login.ejs
setup.ejs
succes.ejs
parametres/
index.ejs # Onglets admin
dashboard/
index.ejs # Dashboard principal
profil/
index.ejs
seerr/
index.ejs # Iframe full-page Seerr
apps/
iframe.ejs # Wrapper iframe pour cartes custom/intégrations
service-connect.ejs # Connexion utilisateur Komga/Jellyfin/RomM
statistiques/
index.ejs
activite.ejs
public/
css/style.css
js/
dashboard.js
statistiques.js
utils/
config.js # Config centralisée DB > env > défaut
database.js # SQLite et app_settings
i18n.js # Traductions fr/en
site-background.js # Fond global configurable
dashboard-builtins.js # Cartes natives dashboard
dashboard-custom-html.js # HTML custom sous les cartes
achievements.js # Système de succès
tautulli-direct.js # Lecture directe DB Tautulli
seerr.js # API Seerr (stats demandes)
wizarr.js # API Wizarr
config/
logo.png # Logo personnalisable
Plex Portal propose un système de gamification avancé pour encourager l'engagement :
- XP (Points d'expérience) : Gagnez des points en fonction de votre activité de visionnage (heures, films, séries, sessions).
- Badges & Succès : Débloquez des badges selon des critères variés (nombre de films, séries, heures, collections, événements spéciaux, etc.). Certains badges sont révoqués si les conditions ne sont plus remplies.
- Catégories de succès : Plusieurs catégories (visionnage, collections, activité, événements, etc.) avec progression visible.
- Classement : Comparez votre progression avec les autres utilisateurs via une page podium dynamique.
- Progression & Modalités : Visualisez votre progression via des barres, modals et liens dédiés sur le dashboard et le profil.
- XP Breakdown : Accédez à un détail de vos sources d'XP (modal explicative).
Exemples de badges :
- "Cinema God" (nombre de films vus)
- "Series Overlord" (nombre d'épisodes)
- "Collections Master" (collections complètes)
- Succès spéciaux (événements, horaires, etc.)
Pour plus de détails, consultez la page /succes ou le dashboard.
Le projet n'a plus besoin d'un fichier de configuration runtime séparé pour fonctionner.
Le modèle actuel est:
docker-compose.ymlcontient uniquement les variables de bootstrap- le premier lancement passe par
/setup - les URLs et tokens des services sont ensuite gérés dans
Parametres > Connexions - les valeurs sont persistées en base SQLite
Variables de bootstrap typiques:
SESSION_SECRETPORTCOOKIE_SECURENODE_ENV
Pour komga_auto, jellyfin_auto et romm_auto, chaque utilisateur connecte son compte une seule fois dans le portail.
services:
portall:
image: ghcr.io/idrinkx/portall:latest
container_name: portall
ports:
- "4000:3000"
environment:
SESSION_SECRET: "change-me"
NODE_ENV: "production"
COOKIE_SECURE: "true"
restart: unless-stopped
networks:
- proxy
volumes:
- /chemin/appdata/portall/config:/config
- /chemin/appdata/tautulli:/tautulli-data
networks:
proxy:
external: truePlex Portal intègre Seerr (ex-Overseerr / Jellyseerr) via SSO Organizr-style :
- Au login Plex portall contacte Seerr en interne (
SEERR_URL) et récupère leconnect.sid - Ce cookie est posé dans le browser avec
domain=.votredomaine.com(sous-domaine parent commun) - Navigation vers
/seerriframe full-page chargée depuisSEERR_PUBLIC_URL - Le browser envoie automatiquement le cookie Seerr authentifié sans re-connexion
Prérequis :
SEERR_PUBLIC_URLet l'URL de portall doivent partager le même domaine parent (ex:portall.votredomaine.com+seerr.votredomaine.comparent.votredomaine.com)- HTTPS obligatoire en production (cookie
secure: true) SEERR_URLetSEERR_PUBLIC_URLpeuvent être renseignés depuisParametres > Connexions
# Pages
GET / Login ou redirect dashboard
GET /dashboard Dashboard principal (auth requis)
GET /profil Page profil utilisateur (auth requis)
GET /statistiques Statistiques de visionnage (auth requis)
GET /statistiques/activite Activité détaillée (auth requis)
GET /seerr Seerr en iframe full-page (auth requis)
GET /succes Liste des succès disponibles
GET /calendrier Calendrier des sorties Radarr + Sonarr (auth requis)
# Auth
GET /login Initie l'auth Plex OAuth
GET /auth-complete Callback Plex OAuth
GET /logout Déconnexion
# APIs JSON
GET /api/subscription Infos abonnement Wizarr
GET /api/stats Statistiques Tautulli
GET /api/seerr Stats demandes Seerr
GET /api/server-stats Stats librairies serveur (films, séries, musiques)
GET /api/calendar Calendrier events Radarr + Sonarr (auth requis)
POST /api/cache/invalidate Invalide le cache utilisateur
Aucun header X-Forwarded-*
http://localhost:3000 (basePath: "")
X-Forwarded-Proto: https
X-Forwarded-Host: portall.votredomaine.com
X-Forwarded-Prefix: /
https://portall.votredomaine.com (auto-détecté)
Aucune configuration manuelle requise.
- Authentification via Plex OAuth uniquement (aucun mot de passe stocké)
- Sessions HttpOnly, SameSite=Lax, nom personnalisé (
portall.sid) - Support HTTPS via reverse proxy
- Whitelist optionnelle par serveur Plex (
PLEX_URL+PLEX_TOKEN) - Changez
SESSION_SECRETen production :openssl rand -hex 32 - Gardez toutes les clés API secrètes
- Backend : Node.js + Express.js
- Templating : EJS + express-ejs-layouts
- Auth : Plex OAuth (plex.tv API v2)
- Base de données : SQLite (sessions, XP, cache stats)
- Container : Docker
Le code source principal est ce dépôt GitHub.
Pour toute suggestion ou bug, ouvrez une issue ou contactez l'auteur.
Q : Que modifier pour passer du local à la production ?
R : Rien côté app. Configurez ngx proxy manager pour pointer vers portall, les headers X-Forwarded-* sont auto-détectés.
Q : Seerr ne charge pas dans l'iframe ?
R : Vérifiez que SEERR_PUBLIC_URL et l'URL du portail partagent le même domaine parent (.votredomaine.com). HTTPS requis.
Q : Comment changer le port ?
R : Dans docker-compose.yml : ports: ["4000:3000"] l'interne reste 3000, l'externe est libre.
Q : Comment personnaliser le logo ?
R : Placez votre logo.png dans le volume ./config:/config.
Plus de questions ?
Si vous souhaitez proposer une amélioration ou signaler un bug, ouvrez une issue ou proposez une pull request sur le dépôt principal.
- Plex Pour leur API OAuth
- Wizarr Gestion des invitations
- Tautulli Statistiques de visionnage
- Seerr Gestion des demandes de médias
- Organizr Inspiration pour le SSO iframe
Ce projet est distribué sous licence GNU General Public License v3.0 (GPLv3).
Vous pouvez utiliser, modifier et redistribuer ce projet conformément aux termes de la GPLv3.
Toute redistribution d'une version modifiée doit rester sous GPLv3 et respecter les obligations de la licence.
Ce logiciel est fourni sans garantie, dans les limites prévues par la GPLv3.
Voir le fichier LICENSE pour plus d'informations.
This project is not affiliated with, endorsed by, or sponsored by Plex Inc.
"Plex" is a trademark of Plex Inc.








