Masquer les derniers auteurs
| author | version | line-number | content |
|---|---|---|---|
![]() |
1.1 | 1 | Statistiques et historique d'utilisation du serveur Jellyfin, installé sur le [[Raspberry Pi>>Wiki Batcave John.Infrastructure.RaspberryPi.WebHome]]. |
| 2 | |||
| 3 | == Fonctionnalités == | ||
| 4 | |||
| 5 | * Suivi des sessions en cours et journal des lectures, avec appareil et méthode de lecture. | ||
| 6 | * Historique de visionnage et activité par utilisateur. | ||
| 7 | * Statistiques par bibliothèque, contenus les plus regardés. | ||
| 8 | * Synchronisation automatique des bibliothèques de Jellyfin. | ||
| 9 | * Sauvegarde et restauration de ses propres données. | ||
| 10 | |||
| 11 | Jellystat interroge Jellyfin par son API, avec une clé d'API créée dans Jellyfin (Tableau de bord > Clés API), et conserve tout l'historique dans sa propre base. | ||
| 12 | |||
| 13 | == Architecture == | ||
| 14 | |||
| 15 | |=Conteneur|=Rôle | ||
| 16 | |jellystat|Application | ||
| 17 | |jellystat-db|Base PostgreSQL 15 | ||
| 18 | |||
| 19 | == Stack == | ||
| 20 | |||
| 21 | {{code language="yaml"}} | ||
| 22 | services: | ||
| 23 | jellystat-db: | ||
| 24 | image: postgres:15 | ||
| 25 | container_name: jellystat-db | ||
| 26 | restart: unless-stopped | ||
| 27 | environment: | ||
| 28 | POSTGRES_USER: postgres | ||
| 29 | POSTGRES_PASSWORD: <MOT_DE_PASSE> | ||
| 30 | volumes: | ||
| 31 | - postgres-data:/var/lib/postgresql/data | ||
| 32 | |||
| 33 | jellystat: | ||
| 34 | image: cyfershepard/jellystat:latest | ||
| 35 | container_name: jellystat | ||
| 36 | restart: unless-stopped | ||
| 37 | environment: | ||
| 38 | POSTGRES_USER: postgres | ||
| 39 | POSTGRES_PASSWORD: <MOT_DE_PASSE> | ||
| 40 | POSTGRES_IP: jellystat-db | ||
| 41 | POSTGRES_PORT: 5432 | ||
| 42 | JWT_SECRET: "<SECRET_JWT>" | ||
| 43 | TZ: Europe/Paris | ||
| 44 | volumes: | ||
| 45 | - jellystat-backup-data:/app/backend/backup-data | ||
| 46 | ports: | ||
| 47 | - "5000:3000" | ||
| 48 | depends_on: | ||
| 49 | - jellystat-db | ||
| 50 | networks: | ||
| 51 | - default | ||
| 52 | - proxy | ||
| 53 | |||
| 54 | networks: | ||
| 55 | default: | ||
| 56 | proxy: | ||
| 57 | external: true | ||
| 58 | |||
| 59 | volumes: | ||
| 60 | postgres-data: | ||
| 61 | jellystat-backup-data: | ||
| 62 | {{/code}} | ||
| 63 | |||
| 64 | * ##JWT_SECRET## signe les jetons de connexion. Ne jamais garder la valeur d'exemple de la documentation : elle permettrait à n'importe qui de fabriquer un jeton valide. Générer une valeur avec ##openssl rand -hex 32##. | ||
| 65 | * Jellystat doit être sur le réseau ##proxy## dans la stack elle-même : un branchement fait à la main (##docker network connect##) est perdu à chaque recréation du conteneur, et SWAG répond alors 502. | ||
| 66 | * La base reste sur le réseau interne de la stack. | ||
| 67 | |||
| 68 | == Changement d'image PostgreSQL : avertissements de collation == | ||
| 69 | |||
| 70 | Passer d'une image à une autre de la même version majeure (par exemple ##postgres:15.2## vers ##postgres:15##) peut changer la version de la bibliothèque système qui trie les textes. PostgreSQL le signale au démarrage par ##collation version mismatch##. Reconstruire les index puis enregistrer la nouvelle version, pour chaque base : | ||
| 71 | |||
| 72 | {{code language="bash"}} | ||
| 73 | for db in jfstat postgres template1; do | ||
| 74 | docker exec jellystat-db psql -U postgres -d "$db" -c "REINDEX DATABASE $db;" -c "ALTER DATABASE $db REFRESH COLLATION VERSION;" | ||
| 75 | done | ||
| 76 | {{/code}} | ||
| 77 | |||
| 78 | Vérifier : les deux versions affichées doivent être identiques pour chaque base. | ||
| 79 | |||
| 80 | {{code language="bash"}} | ||
| 81 | docker exec jellystat-db psql -U postgres -tAc "SELECT datname, datcollversion, pg_database_collation_actual_version(oid) FROM pg_database WHERE datallowconn;" | ||
| 82 | {{/code}} | ||
| 83 | |||
| 84 | == Sauvegarde == | ||
| 85 | |||
| 86 | Dump SQL de ##jellystat-db## par le script de [[Sauvegarde>>Wiki Batcave John.Infrastructure.Sauvegarde.WebHome]]. Les volumes nommés ne sont pas sauvegardés : le dump suffit. |
