CIS Downloads
Recommandation CIS en sécurité.
— Permalink
Recommandation CIS en sécurité.
— Permalink
Je lorgne beaucoup sur Stalwart en remplacement de mon vénérable combo Postfix + Courier-imap, principalement parce que ma stack ne supporte pas les règles SIEVE et que ça me manque.
Après beaucoup sont passés sur Dovecot, moi pas, parce que flemme, parce que config compliqué, parce que juste ça marche....
Peut être que la prochaine fois que Google me fera suer, je franchirais le pas.
La dernière fois que j'ai changé ma pile logiciel mail, c'était pour mettre en place ARC, une bonne idée sur le papier, mais la mise à place, un enfer, j'ai réussi grâce à Rspamd.
Nouvelles photos d'Urbex :-)
— Permalink
J’avais complètement zappé de présenter le fabuleux SugestArr il y a quelques mois, remédions à ça de suite !
On ajoute tous les contenus découverts sur le Web, sur IMDB, TMDB, Trakt, par des connaissances, via des forums, via Overseerr ou Jellyseerr…
Cet outil de guiseppe99barchetta devrait vous ravir puisqu’il permet d’avoir des recommandations personnalisées et est, je trouve, relativement complet :
- Prise en charge multi-médias : compatible avec Jellyfin, Plex et Emby pour récupérer le contenu.
- Intégration TMDb : recherche de films et séries similaires via TMDb.
- Requêtes automatisées : envoie des demandes de téléchargement pour les contenus recommandés vers Jellyseer ou Overseerr.
- Interface web : interface conviviale pour la configuration et la gestion.
- Journaux en temps réel : visualiser et filtrer les logs en direct (ex. INFO, ERROR, DEBUG).
- Sélection des utilisateurs : possibilité de choisir quels utilisateurs peuvent initier des requêtes, avec gestion et validation des contenus demandés automatiquement.
- Gestion des tâches cron : modification du planning des cron jobs directement depuis l’interface web.
- Pré-validation de configuration : vérifie automatiquement les clés API et les URLs lors de l’installation.
- Filtrage de contenu : exclut les demandes de contenus déjà disponibles sur les plateformes de streaming dans votre pays.
- Support de bases de données externes : possibilité d’utiliser PostgreSQL ou MySQL en plus de SQLite pour plus de performance et d’évolutivité.
Y’a pas d’application AndroidTV/smarthone mais c’est responsive et on peut automatiser les ajouts.
Pour l’utiliser il faut une clé API TMDB et évidemment une ou des instances Plex/Emby/Jellyfin et Oberseerr/Jellyseerr.
services:
suggestarr:
image: ciuse99/suggestarr:latest
container_name: SuggestArr
restart: always
ports:
- 5000:5000
volumes:
- /mnt/user/appdata/suggestarr:/app/config/config_files
labels:
- com.centurylinklabs.watchtower.enable=true
Une fois lancé, on se connecte avec notre lecteur favori, on ajoute une clé TMDB

Dans le cas de Plex, ça liste les serveurs disponibles (pour faire simple j’ai sélectionné un local) et ça en détaille les librairies et utilisateurs. On peut aussi mettre une URL directement

On enchaine avec Overseerr ou Jellyseerr

Je reste sur du SQLite. Si vous voulez une BDD robuste à part, il faut revoir le docker-compose pour l’ajouter

Configuration rapide :


Et la récap de fin avant le 1er lancement

Et ça ajoute les recommandations dans Overseerr ou Jellyseerr selon votre configuration. Attention du coup si, comme moi, tout est automatiquement validé, ça peut vite accroître les bibliothèques !
Mon setup étant tout récent je n’ai hélas pas de screen à vous montrer mais vous pouvez voir ce que ça donne avec la fin de cette vidéo YouTube avec UNRAiD.
![]()
J’aime bien avoir une idée des notes IMDB/TMDB des contenus répertoriés par Plex. Kometa, un script Python empaqueté dans un Docker pour plus de simplicité, permet de m’auditer les jaquettes des contenus indexés et créer celles de collections et playlists.
On peut presque faire la même chose sur Emby/Jellyfin, avec Posterizarr qui fonctionne aussi pour Plex)


On peut y mettre les infos qu’on souhaite, à l’endroit qu’on veut et créer/afficher ou non les listes par diffuseur etc. Tout est configurable, pour peu qu’on prenne le temps de lire la documentation.
Je partage ma configuration actuelle, qu’il faudrait encore peaufiner, et vous pouvez en trouver d’autres ici ou là.

Voici un Docker qui fonctionne très bien. Au besoin, pour UNRAiD, Synology, QNAP, Kubernetes, la doc est complète.
services:
kometa:
image: kometateam/kometa:develop
container_name: kometa
restart: always
environment:
- TZ=Europe/Paris
- KOMETA_CONFIG=/config/config.yml
- KOMETA_RUN=true
- KOMETA_TIMES=00:00,06:00,12:00,18:00
volumes:
- /home/aerya/docker/kometa/config:/config
- /home/aerya/docker/kometa/assets:/assets
labels:
- com.centurylinklabs.watchtower.enable=true
KOMETA_TIMES = les heures où Kometa doit mouliner
Et voici mon config.yml
Il faut le domaine Plex + token, les clés API TMDB, FanART et MDBlist. Je voulais tester les playlists, pas encore pris le temps…
Attention, dans la partie « libraries » les noms des librairies doivent être ceux de Plex, ici Films et Séries TV
plex:
url: https://plex.domain.tld
token: xxx
timeout: 120
verify_ssl: true
db_cache:
clean_bundles: false
empty_trash: true
optimize: true
tmdb:
apikey: xxx
language: fr-FR
region: FR
cache_expiration: 60
imdb:
cache_expiration: 30
mdblist:
apikey: xxx
cache_expiration: 60
fanart:
apikey: xxx
settings:
run_order:
- operations
- metadata
- overlays
- collections
asset_directory:
- /assets
overlay_artwork_filetype: jpg
overlay_artwork_quality: 100
show_unmanaged: true
show_unconfigured: true
show_missing: true
cache: true
cache_expiration: 60
asset_folders: true
asset_depth: 0
create_asset_folders: false
prioritize_assets: false
dimensional_asset_rename: false
download_url_assets: false
show_missing_assets: true
show_missing_season_assets: false
show_missing_episode_assets: false
show_asset_not_needed: true
sync_mode: append
default_collection_order:
minimum_items: 1
item_refresh_delay: 0
delete_below_minimum: false
delete_not_scheduled: false
run_again_delay: 0
missing_only_released: false
only_filter_missing: false
show_filtered: false
show_unfiltered: false
show_options: false
save_report: false
tvdb_language: default
ignore_ids:
ignore_imdb_ids:
playlist_sync_to_users:
playlist_exclude_users:
playlist_report: true
custom_repo:
libraries:
Films:
collection_files:
- default: streaming
template_variables:
region: FR
language: fr
sep_style: gray
visible_library_netflix: true
visible_library_amazon: true
visible_library_disney: true
visible_library_appletv: true
visible_library_paramount: true
visible_library_max: true
overlay_files:
- default: ratings
template_variables:
rating1: critic
rating1_image: imdb
rating2: audience
rating2_image: tmdb
rating3: user
rating3_image: imdb
- default: resolution
template_variables:
use_edition: false
- default: streaming
template_variables:
region: FR
operations:
assets_for_all: true
mass_audience_rating_update: tmdb
mass_user_rating_update: imdb
Séries TV:
collection_files:
- default: streaming
template_variables:
region: FR
language: fr
sep_style: gray
visible_library_netflix: true
visible_library_amazon: true
visible_library_disney: true
visible_library_appletv: true
visible_library_paramount: true
visible_library_max: true
overlay_files:
- default: ratings
template_variables:
builder_level: show
rating1: critic
rating1_image: imdb
rating2: audience
rating2_image: tmdb
rating3: user
rating3_image: imdb
- default: resolution
template_variables:
builder_level: show
use_edition: false
- default: streaming
template_variables:
region: FR
operations:
assets_for_all: true
mass_audience_rating_update: tmdb
mass_user_rating_update: imdb
collections_streaming.yml
collections:
"Netflix • Films & Séries":
tmdb_watch_provider: Netflix
tmdb_region: FR
summary: "Titres disponibles sur Netflix (France)."
sync_mode: sync
collection_order: alpha
visible_home: true
visible_shared: true
build_collection: true
url_poster: /assets/Streaming/Netflix/poster.jpg
"Prime Video • Films & Séries":
tmdb_watch_provider: Amazon Prime Video
tmdb_region: FR
summary: "Titres disponibles sur Amazon Prime Video (France)."
sync_mode: sync
collection_order: alpha
visible_home: true
visible_shared: true
build_collection: true
url_poster: /assets/Streaming/PrimeVideo/poster.jpg
"Disney+ • Films & Séries":
tmdb_watch_provider: Disney Plus
tmdb_region: FR
summary: "Titres disponibles sur Disney+ (France)."
sync_mode: sync
collection_order: alpha
visible_home: true
visible_shared: true
build_collection: true
url_poster: /assets/Streaming/DisneyPlus/poster.jpg
"Apple TV+ • Films & Séries":
tmdb_watch_provider: Apple TV+
tmdb_region: FR
summary: "Titres disponibles sur Apple TV+ (France)."
sync_mode: sync
collection_order: alpha
visible_home: true
visible_shared: true
build_collection: true
url_poster: /assets/Streaming/AppleTVPlus/poster.jpg
# (Optionnel) Réseaux pour séries — utile pour “Originals”
"Netflix • Séries (Network)":
tmdb_network: Netflix
summary: "Séries produites/diffusées par Netflix."
sync_mode: sync
collection_order: alpha
visible_home: false
visible_shared: true
url_poster: /assets/Networks/Netflix/poster.jpg
"Apple TV+ • Séries (Network)":
tmdb_network: Apple TV+
summary: "Séries Apple Originals."
sync_mode: sync
collection_order: alpha
visible_home: false
visible_shared: true
url_poster: /assets/Networks/AppleTVPlus/poster.jpg
overlays.yml
overlays:
ratings:
template: rating
default:
rating1: imdb
rating2: tmdb
position: top_right
font: Roboto-Bold
font_size: 62
operations:
delete_overlays: false
resolution:
template: resolution
default:
position: bottom_left
font: Roboto-Bold
font_size: 70
operations:
delete_overlays: false
streaming:
template: streaming
default:
position: bottom_right
region: FR
style: logo
allow_multiple: true
font: Roboto-Bold
font_size: 50
template_variables:
include:
- Netflix
- Amazon Prime Video
- Disney Plus
- Apple TV+
- Canal+
- Paramount+
- OCS
operations:
delete_overlays: false
Si après un test, vous voulez que Plex revienne par défaut, Kometa propose un outil de reset.

![]()
Entre T-shirts personnalisés, casquettes uniques et textiles customisés, la presse à chaud VEVOR 2-en-1 promet de transformer vos idées en créations concrètes. Compacte, équipée d’une plaque de 38 x 38 cm et d’un module pour casquettes, elle vise à séduire aussi bien les makers, les autoentrepreneurs, les fablabs ou associations en quête d’une solution abordable […]
Cet article Test presse à chaud VEVOR 2-en-1 : personnalisation de T-shirts et casquettes a été publié en premier sur Framboise 314, le Raspberry Pi à la sauce française.....
Je continue mon tour d’horizon des solutions de streaming à la carte, légales ou non selon les pays, et qui permet de se créer et maintenir une bibliothèque multimédia sans stockage local.
Je n’aborderai pas publiquement les solutions de streaming depuis des .nzb directement.
Sur le même principe que Stremio, Vortex, ou RDT-Client/Zurg, ou encore DebridMediaManager, on peut utiliser Decypharr pour simuler un client BitTorrent (qBittorrent) et streaming le contenu de .torrent depuis des débrideurs, dont TorBox.
Je vais détailler ici l’installation manuelle de Decypharr, Prowlarr et Radarr/Sonarr/Plex mais tout est notamment inclus dans le script SSDv2 (avec une grosse et belle nouveauté à venir).
J’en profite pour remercier Laster13 et Teal-C pour leurs réponses à mes questions.
La dernière mouture de Decypharr embarque rClone et sa configuration sera automatisée. Mes tests sont réalisés avec Prowlarr et des indexeurs FR publics dont YGG via « api.eu », le débrideur AllDebrid ; et je ne « tape » que dans le contenu en cache chez AD (donc aucun téléchargement).
Verdict : RàS pour les films, quelques saisons de séries manquantes uniquement dans le cache, OK avec le téléchargement.
Le plus important est de bien comprendre que si on demande aux *arrs d’organiser les bibliothèques dans /mnt/Bibliothèques, ils ne vont y mettre que des symlinks vers le montage rClone d’AllDebrid (/mnt/decypharr).
Les *arrs, pour traiter les fichiers, tout comme Plex (ou autre) pour leur lecture, doivent avoir accès à ce montage rClone.
C’est pourquoi il est impératif de monter ce dossier en volume pour chaque Docker devant y avoir accès.
Arborescence du test :
aerya@StreamBox:/$ tree -L 2 /mnt/
/mnt/
├── Bibliothèques
│ ├── Films
│ └── Séries
├── Data
│ ├── lost+found
│ ├── quotaless
│ └── rCloneCache
└── decypharr
├── alldebrid
└── qbit
├── radarr
└── sonarr
Bibliothèques : dossier racine pour les *arrs
Data/rCloneCache : j’avais déjà le dossier pour autre chose, j’utilise le même
decypharr/alldebrid : montage de mon compte AD
decypharr/qbit : dossier de téléchargement (simulé) des fichiers. Les sous-dossiers radarr/sonarr seront ajoutés automatiquement lors de la configuration de Decypharr (tags)
Il faut installer et lancer Decypharr avant le reste vu que tout dépend ensuite du montage du débrideur et des symlinks. Idem s’il faut relancer le Docker Decypharr, il faut relancer les autres ensuite.
services:
decypharr:
image: cy01/blackhole:latest
container_name: decypharr
restart: always
cap_add:
- SYS_ADMIN
security_opt:
- apparmor:unconfined
ports:
- 8282:8282
volumes:
- /mnt:/mnt:rshared
- /mnt/decypharr/qbit:/mnt/decypharr/qbit
- /home/aerya/docker/decypharr/configs/:/app
environment:
- TZ=Europe/Paris
- PUID=0
- PGID=0
devices:
- /dev/fuse:/dev/fuse:rwm
labels:
- com.centurylinklabs.watchtower.enable=true
/mnt/decypharr/qbit devant être commun aux *arrs et Plex, on y montera /mnt:/mnt dans chaque ainsi que /mnt/decypharr/qbit:/mnt/decypharr/qbit dans les *arrs qui sauront directement où aller chercher les fichiers à traiter.
La configuration n’est pas vraiment expliquée dans la doc, la mienne n’est peut-être pas optimale mais fonctionne.
Je n’ai rien modifié dans l’onglet général. J’ai testé les notifications Discord (attention on voit la passkey des trackers utilisés) mais y’a vraiment pas d’intérêt si on ne fait qu’utilise le cache du débrideur (pas de téléchargement).

Pour la partie débrideur, on fait notre choix, on colle une clé API (ou plusieurs) et j’ai configuré le montage dans
/mnt/decypharr/alldebrid/__all__
On peut ajouter plusieurs débrideurs. On pourra les attribuer à un *arr lié à Decypharr et même les sélectionner lors de l’ajout manuel d’un .torrent
J’utilise le WebDav et je NE COCHE PAS la case Download Uncached pour qu’il ne télécharge aucun fichier (sur AD) mais n’utilise que son cache.
Je fais ça parce que je voulais tester le cache d’AD et ne voulais pas télécharger des fichiers sans les partager. On peut tout à fait faire les 2 mais attention, il n’y aura pas de seed (donc ratio 0). A ne pas faire chez les Tier 1 sous peine de voir son compte banni !
Certains ont créé des scripts qui captent les .torrent utilisés pour les mettre en seed depuis un client local ou sur un serveur. Dans ce cas, Decypharr est utilisable sans crainte sur les trackers privés.

Configuration du client qBittorrent émulé. Je met le chemin qui correspond au volume local dont je parlais au début
/mnt/decypharr/qbit

On peut ajouter les *arrs soit depuis Decypharr soit depuis les *arrs eux-mêmes. Je n’ai qu’AD en débrideur j’ai donc laissé la sélection auto mais on peut choisir.
Par exemple Radarr sur AD et Sonarr sur RD ou Sonarr4K sur TB etc. Selon les goût de chacun. Ce qui est certain, c’est que le cache de contenu MULTi/FRENCH est évidemment plus important sur AD et RD que sur TB, principalement utilisé par les anglophones pour Stremio.

Le Repair est le contrôle et la réparation des symlinks. Qui peuvent être cassés si le contenu lié est effacé du débrideur. Dans ce cas, selon la config, ça peut soit rechercher sur le débrideur (si le fichier a été renommé, vu que ça fonctionne avec le hash et non le nom) soit ça ira chercher un autre .torrent via les *arrs.
Pour l’instant je laisse l’option par défaut à savoir « per torrent » mais il est peut-être préférable d’utiliser « per file ». Dans le cas d’un .torrent de saison complètement, que ça ne recherche que l’épisode manquant (du cache) plutôt que de tout relancer.
Je l’ai mis en autotmatique, toutes les 24h.

Et enfin la partie rClone. Le monte globalement dans /mnt/decypharr et souhaite utiliser un cache (100Go) dans un dossier (et disque) qui me sert déjà à ça : /mnt/Data/rCloneCache
On peut sans doute améliorer cette configuration mais Plex lit un fichier de 94Go sans broncher…

Avec le mode de téléchargement activé, voici le rendu. PausedUP signifie que le .torrent est complété (et de fait plus en seed).

Je ne montre que l’exemple de configuration de Radarr. Pour Sonarr c’est la même logique. Chez moi c’est derrière un VPN pour des interrogations de sources hors Prowlarr et NZBHydra, il n’y a donc pas de port de publié.
Je retire tous les volumes par défaut pour ne monter que /mnt/decypharr/qbit:/mnt/decypharr/qbit et /mnt:/mnt
services:
radarr:
container_name: radarr
restart: always
network_mode: container:gluetun-mullvad
environment:
- TZ=Europe/Paris
- PUID=0
- PGID=0
volumes:
- /home/aerya/docker/radarr:/config
- /mnt/decypharr/qbit:/mnt/decypharr/qbit
- /mnt:/mnt
labels:
- com.centurylinklabs.watchtower.enable=true
image: linuxserver/radarr:nightly
Configuration du dossier racine : /mnt/Bibliothèques/Films

Configuration du client de téléchargement si on n’a pas ajouté Radarr depuis Decypharr. Il faut sélectionner qBittorrent

Et dans l’adresse il faut mettre l’URL (ou l’IP) de Decypharr et le port (et SSL si vous utilisez une URL et un reverse proxy).
Le nom d’utilisateur et le mot de passe sont l’URL de Radarr et sa clé API.
La catégorie : radarr (et donc sonarr pour Sonarr ofc!)
Ne surtout pas cocher la case Sequential Order (sinon ça DL localement)

Et comme le même chemin/volume est monté dans chaque Docker, il n’y a aucun Remote Path Mapping à mettre

Lors de l’ajout d’un film, la complétion est quasi instantanée pour peu que le fichier cherché soit déjà dans le cache d’AllDebrid. Si vous activez le téléchargement des fichiers non encore en cache, ça peut prendre quelques minutes.

En regardant de plus près, on voit bien que c’est un symlink vers le cache d’AllDebrid
aerya@StreamBox:/mnt/Bibliothèques/Films$ ls -l Alien\ -\ Romulus\ \(2024\)/
total 4
lrwxrwxrwx 1 root root 208 Aug 25 18:55 Alien.Romulus.2024.MULTi.VFF.2160p.UHD.BluRay.REMUX.DV.HDR.HEVC.TrueHD.7.1.Atmos-ONLY.mkv -> /mnt/decypharr/alldebrid/__all__/Alien.Romulus.2024.MULTi.VFF.2160p.UHD.BluRay.REMUX.DV.HDR.HEVC.TrueHD.7.1.Atmos-ONLY/Alien.Romulus.2024.MULTi.VFF.2160p.UHD.BluRay.REMUX.DV.HDR.HEVC.TrueHD.7.1.Atmos-ONLY.mkv
ncdu 1.19 ~ Use the arrow keys to navigate, press ? for help
--- /mnt/Bibliothèques/Films/Alien - Romulus (2024)- ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
@ 4.0 KiB [###################################################] Alien.Romulus.2024.MULTi.VFF.2160p.UHD.BluRay.REMUX.DV.HDR.HEVC.TrueHD.7.1.Atmos-ONLY.mkv
Plus globalement, tous les fichiers sont bien chez AllDebrid, monté via WebDav/rClone et je n’ai localement que des symlinks qui ne prennent aucune place.
En théorie, on pourrait se faire cette installation sur une Carte MicroSD de quelques Go 
ncdu 1.19 ~ Use the arrow keys to navigate, press ? for help
--- /mnt ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
15.9 TiB [###################################################] /decypharr
4.0 MiB [ ] /Bibliothèques
Pour terminer, la configuration de Plex. Toujours avec /mnt:/mnt de monté pour garantir l’accès aux symlinks.
services:
pms-docker:
container_name: plex
restart: always
ports:
- 32400:32400/tcp
- 33401:33401/tcp
- 3005:3005/tcp
- 8324:8324/tcp
- 32469:32469/tcp
- 1900:1900/udp
- 32410:32410/udp
- 32412:32412/udp
- 32413:32413/udp
- 32414:32414/udp
environment:
- PLEX_UID=0
- PLEX_GID=0
- TZ=Europe/Paris
- PLEX_CLAIM=claim-xxx
- ADVERTISE_IP=http://192.168.0.163:32400/
hostname: plex.xxx.xxx
volumes:
- /home/aerya/docker/plex:/config
- /mnt:/mnt
- type: tmpfs
target: /transcode
tmpfs:
size: 4g
labels:
- com.centurylinklabs.watchtower.enable=true
image: plexinc/pms-docker:latest


![]()
rsync -rv --size-only --info=progress2 /mnt/nas01_usb_disk/xxx/Images/ /mnt/nas01/Photos/
Recopie les fichiers absents du dossier destination depuis le dossier source.
-rv : récursif + verbose
--size-only : ne prend en compte que la taille des fichiers
Hier, j'ai eu l'occasion de tester le jeu Gobs Death Robot, issu du dernier défi Trois Fois Forgé, organisé tous les ans par le site PTGPTB.fr.
J'avais participé à ce défi de création collective de jeux de rôle il y a 4 ans, et j'adore son principe : concevoir des …
Avant-hier matin, mercredi 13 août, suite à une mise à jour vers Ubuntu 22 de mon serveur, j'ai eu la mauvaise surprise de ne pas le voir redémarrer...
Subissant en plus un rhume carabiné, je me suis un peu décomposé en voyant mes systèmes de supervision m'alerter lorsque la vingtaine …
Quand on cherche à faire fabriquer ses propres circuits imprimés, on pense souvent en premier aux plateformes asiatiques, notamment chinoises. Pourtant, il existe des alternatives fiables et performantes en Europe… mais aussi au Canada. Bittele Electronics, dont le siège est basé à Toronto, propose une solution clé en main pour la fabrication et l’assemblage de […]
Cet article Bittele Electronics : fabrication et assemblage de PCB clé en main, du prototype à la grande série a été publié en premier sur Framboise 314, le Raspberry Pi à la sauce française.....
Réflexion issue d’une discussion sur le Discord de Cuistops concernant le fait que Talos pourrait ne pas être le meilleur point de départ pour s’attaquer à cette technologie d’infrastructure qui a balayé le monde de l’orchestration de containers en une petite dizaine d’années. Pour illustrer pourquoi il n’y a pas de réponse absolue à cette question, je me suis dit que vous décrire mon parcours concernant l’univers des containers et Kubernetes en particulier (aussi bien au niveau perso que pro) serait éclairant sur certains points.
Le moins qu’on puisse dire, c’est que mon entrée dans l’univers des containers, en particulier via docker, n’était pas brillante. Je conserve avec malice le premier billet que j’ai consacré à ce sujet en 2016 pour illustrer à quel point je me trompais sur la technologie, que je n’avais jusque là pas vraiment vu, encore moins au niveau professionnel. J’ai heureusement rattrapé cette erreur depuis, aussi bien à la faveur de formations au travail (merci Thomas Perelle
) qu’au niveau perso, où mes propres expérimentations m’ont conduit à partager ma découverte et mon utilisation de Docker Swarm. J’ai bien rattrapé le coup, hein ?
D’ailleurs, Swarm a été pour moi la découverte de la notion d’orchestration. Que j’ai pu creuser cette fois au niveau pro en 2018 après un premier tout petit pas vers l’univers Kubernetes par la porte OpenShift à la faveur d’un workshop de deux jours par un collègue qui sera réellement un mentor pour les années suivantes, Julien Francoz. Je n’ai malheureusement pas gardé grand chose de ce workshop, étant donné que je n’avais aucune plateforme de ce type dans mon pôle client, encore moins de Kubernetes. Tout juste on commençait à avoir des clients qui cherchaient à déployer leurs applis en mode container sur des serveurs classiques, avec Docker. Sans pratique, la théorie s’efface vite, d’autant qu’en 2018, les usages « domestiques » n’étaient pas légion, donc les articles de blog non plus, encore moins autour d’Openshift. C’est en 2019 que tout change.
Je vous passe le contexte de comment j’en suis arrivé à cette situation intense qui aura duré 5 mois, mais oui, j’ai découvert Kubernetes d’une façon un peu particulière : service cloud managé, sur Azure, el famoso « AKS« , à devoir migrer des applications précédemment hébergées sur des serveurs virtuels Debian dépassés, avec un cluster déployé manuellement qu’on a tenté de « terraformer » après-coup, avec toute la « qualité » de l’API d’Azure d’alors. Et je remercie encore Julien d’avoir pris autant de temps à me soutenir dans cet apprentissage express (la notion de mentor n’était pas galvaudée, clairement).
Service cloud Managé veut dire qu’on ne gère pas certains aspects importants de la vie d’un cluster : tout le control plane est masqué, vous ne voyez que les nœuds, vous ne vous occupez pas trop de certains aspects comme la rotation des certificats, les mises à jour sont automatisées (vous indiquez une version cible, le service s’occupe de la montée de version du control plane, puis des nœuds un par un), et vous bénéficiez d’intégrations avec le reste de l’infra du fournisseur, au niveau du réseau, du stockage, des capacités comme l’autoscaling (vous augmentez et réduisez automatiquement le nombre de nœuds en fonction de la charge ou des réservations de ressources des pods à déployer). L’installation se fait en trois/quatre clics via l’interface web, une ligne de commande avec l’utilitaire maison, ou un peu plus de lignes de code si on le fait via un outil d’infrastructure as code.
Bref, c’est cool, ça permet de se concentrer sur les aspects opérationnels des applications déployées, mais même comme ça, je vous avoue que AKS tel que Microsoft le proposait n’était pas toujours une sinécure. Azure lui-même était pénible, avec des VMs qui mettaient plusieurs minutes à démarrer (quand les concurrents tournaient autour de la minute). Et comme on ne gère pas le control plane, on rate tout un pan de l’architecture et de la gestion de Kubernetes et de ses composants sous-jacents. En plus à l’époque, l’image de l’OS utilisé pour les nœuds était basée sur Ubuntu, pas le plus léger et le « gaspillage » de ressources était réel, au-delà de Kubernetes lui-même.
J’aurais l’occasion de passer encore quelques années, pratiquement trois, à déployer d’autres projets AKS pour d’autres clients, ce qui m’a permis de constater, il faut savoir aussi le reconnaitre, comment Microsoft a cravaché pour amener un niveau de qualité sur le service bien plus en phase avec ce qu’on attend d’un tel fournisseur. Rotation automatique des certificats via les mises à jour (c’était pas le cas, la commande de rotation était à lancer à la main), amélioration générale d’Azure sur les temps de démarrage des nœuds, efficacité des mises à jour, intégrations avancées au niveau réseau (Calico, Istio, etc)… Ce qui n’empêche pas certains pains avec entre autres une API qui accepte certaines valeurs pourtant non supportées et qui m’ont forcé à redéployer des clusters from scratch parce que la communication entre les nœuds étaient devenue impossible (réponse du support : « on va mettre à jour la doc pour indiquer les valeurs supportées »; bravo…). Par la suite, j’ai découvert et encore plus adoré exploiter et déployer du GKE, le service équivalent de Google Cloud; il m’aura permis au passage d’apprendre comment fonctionnait ce fournisseur et tout ce qu’il fait de mieux que Microsoft (et parfois d’AWS). Au point de passer la certification « Professional Architect » au bout de 4 mois seulement de pratiques.
Cette expérience en particulier avec Azure ne m’aura pas empêché pas de tomber amoureux de la technologie, au point de remiser Docker Swarm, et de migrer sur K3S. Là aussi un choix particulier, conçu pour les machines très légères, puisque ciblant les Raspberry Pi, j’ai malgré tout fait le déploiement du flemmard, même si j’ai privilégié un déploiement semi-automatisé avec un playbook/role Ansible, et un seul nœud comme control plane (qui était le seul mode de déploiement supporté alors).
Particularité de k3s, regrouper tous les composants « core » de Kubernetes dans un seul binaire, une petite prouesse à la base de son empreinte mémoire réduite, mais pas que : un des éléments les plus critiques d’un cluster, la base de données ETCD, la « mémoire » du cluster, est remplacée par SQlite, bien plus léger, mais évidemment limité à une seul nœud, et moins enclin aux problèmes des bases de données plus complexe. Bien que le mode « multi-master » ait été implémenté par la suite, au passage à mes Raspberry Pi 4, j’ai quand même conservé le même mode de fonctionnement. J’ai eu l’occasion de détailler pas mal de choses concernant K3S sur ce blog, je ne vais donc pas m’étendre beaucoup plus.
Reste qu’à l’occasion d’une volonté de refonte, accélérée par la mort successive des cartes SD des Raspi après 4 ans de bons et loyaux services, j’ai décidé de revenir à un Kubernetes un peu moins simplifié, en partant sur un autre choix particulier, Talos Linux, qui aura fini en machine virtuelle suite à une déconvenue de matériel et de limitations électriques, que je me suis pris en pleine poire en plein live Twitch. Talos propose un déploiement Kubernetes beaucoup plus standardisé dans ses composants de base, mais dont la gestion des nœuds est très particulière : pas d’OS à proprement parler, juste le noyau et une API qui permet de pratiquer toutes les opérations sur la gestion de ces nœuds : pas de SSH, pas de CLI directe, l’utilitaire talosctl est là pour configurer les nœuds à l’envi, permettant de les ajouter/retirer d’un cluster en un clin d’œil, un aspect très important dans une gestion d’infrastructure au sens large (comprendre, en entreprise). Toute la configuration de base se fait au travers de fichiers de configuration YAML, à l’instar de Kubernetes lui-même, permettant une approche « intégration continue » et un versionnement via git.
Actuellement, je me débats avec certains paramétrages par défaut orientés sécurité entre autres qui peuvent limiter/bloquer certains usages sans attention particulière. Il est vrai que par défaut, Kubernetes est une plateforme particulièrement ouverte avec peu de gardes-fous, et c’est à chacun d’adapter cet aspect en fonction de son propre contexte, ce qui amène à devoir exploiter nombre d’extensions et contrôleurs additionnels pour y parvenir. Et comme souvent, la sécurité à un prix…
On le voit, au final je n’ai que peu choisi comment j’ai découvert et abordé la technologie et son déploiement « dans le monde réel », et j’ai démarré par certaines abstractions qui font que si je m’étais retrouvé face à un cluster « vanilla » (kubeadm, kubespray), et un problème lié au control plane, j’aurais été plus en peine que quelqu’un ayant directement attaqué « the hard way » (z’avez la ref ?). Et d’un certain côté c’est certainement encore le cas encore aujourd’hui, ce qui me vaudrait d’être recalé au recrutement chez Lucca ou Enix. Le livre à venir teasé par Denis Germain (qui ne s’appellera pas 50 Nuances de Kubernetes, ce qui aurait été bien trop cool comme titre) montre bien la diversité d’approches qui ont chacune leurs spécificités, avec la plupart des services dit « managés » abstrayant une bonne partie des composants et concepts de bas-niveau pour vous concentrer sur vos applications ou celles de vos clients.
Est-ce que l’une d’elles est meilleure qu’une autre ? Je considère toujours que la théorie est importante, jusqu’à un certain point, dans la mesure où si on n’a pas de le contrôle sur les éléments, ne pas savoir comment ils fonctionnent de manière sous-jacente n’est pas toujours une grosse tare : ce n’est pas de notre ressort que d’y mettre les mains. Imaginez une corruption de base ETCD sur un service managé. Ma seule préoccupation sera d’être capable éventuellement de restaurer tout ce que j’y ai mis au départ – mes déploiements d’applications, mes secrets, mes CRDs, etc- , là où la préoccupation du provider, sera de réparer cette corruption; dans le pire des cas, s’il n’aura pas été capable de restaurer le service avec un minimum de pertes, il s’agira de restaurer tout ça sur un nouveau cluster.
Nous vivons également dans un monde connecté à la plus grande base de connaissances du monde : Le Web. Je n’ai pas besoin de connaitre l’intégralité des arcanes du moindre bout de logiciel, quelque soit son niveau dans l’environnement où j’évolue, pour être capable de l’exploiter au quotidien, voire de le réparer. Les connaissances déjà acquises sont évidemment importantes, parce qu’elles permettent de définir un état d’esprit, un mode de réflexion, qui est la plupart du temps applicable aux autres technologies que vous rencontrerez. Mais si je rencontre un problème que je n’ai pas déjà vu par le passé, une recherche sur le web m’amène généralement soit à la solution, soit à une piste à creuser pour déterminer la cause. Dès lors, il n’y a pas de réponses simples à apporter à la question « par où démarrer », parce qu’elle peut dépendre aussi de la « fin ».
Faire un cluster à la mano avec tous les composants en mode « the hard way » ne sert pratiquement à rien si après on évolue dans un contexte de service managé. À l’inverse, un service managé est intéressant en ce sens qu’il permet de gérer les interactions avec d’autres services du fournisseur, et donc le mode de fonctionnement de celui-ci. Sur Kube lui-même vous manquez des choses, mais vous avez quand même pas mal de concepts à intégrer. Est-ce moins pertinent ? Pas forcément si c’est ce que vous manipulez tous les jours. Dans le même esprit, « the hard way » est probablement la pire méthode pour gérer le quotidien sur de l’infra qu’on gère, même si pour le coup on a toutes les tripes du cluster sur la table. On privilégiera donc très vite d’autres outils plus automatisés pour la gestion habituelle. N’est-ce pas tout aussi pertinent de démarrer directement avec ces solutions pour intégrer plus rapidement leurs concepts ?
Par où commencer Kubernetes ? J’ai envie de dire, par la solution qui vous rendra curieux. C’est tout le sel de l’apprentissage, comme de la recherche scientifique, où chaque réponse qu’on trouve amène d’autres questions, tout aussi passionnantes. D’autant plus que quand on démarre, on est amené à faire, défaire, refaire, à comparer. Notre univers informatique au sens large bouge tout le temps, la « galaxie » Kubernetes n’est pas en reste, il y a toujours des dizaines d’angles d’attaque possible, et à de très rares exceptions près, il n’y en a pas nécessairement une qui est plus mauvaise qu’une autre. Et d’autres apparaitront régulièrement, ce qui représente de nouvelles réponses possibles à cette question. Il ne faut pas avoir peur de se faire plaisir de différentes manières 

Il y a quelques années, j’utilisais un plugin pour Plex pour synchroniser les visionnages. L’intérêt étant surtout de pouvoir ajouter/retirer des contenus, voire réinstaller un serveur Plex, tout en ne perdant pas le chemin parcouru 
Avec l’évolution de Plex, il faut passer par un script Python, empaqueté dans un Docker pour plus de simplicité : PlexTraktSync, de Taxel. Alors que pour Jellyfin, on utilise toujours le plugin qui va bien.
On peut synchroniser de Plex vers Trakt et/ou Trakt vers Plex, par bibliothèque et utilisateur.
Voici un exemple d’installation et de configuration, sans prise en compte de Watchlists (que je n’ai pas vu qu’ici on passe par Overseerr uniquement).
Il faut une application Trakt.tv vérifiée (gratuit) pour récupérer ses clés d’accès. Et si vous voulez les notifications Discord, l’OS hôte (mon script est externe) doit avoir curl et jq.
Installation du Docker. Ofelia étant un cron qui permet de lancer la synchronisation selon nos préférences, je le lance toutes les 6h (0 */6 * * *). Pour paramétrer, aidez-vous de Cron Guru au besoin.
services:
plextraktsync:
image: ghcr.io/taxel/plextraktsync:latest
container_name: plextraktsync
restart: always
environment:
- PUID=1000
- PGID=1000
- TZ=Europe/Paris
volumes:
- /home/aerya/docker/plextraktsync/config:/app/config
command: watch
labels:
- ofelia.enabled=true
- ofelia.job-exec.sync.schedule=0 */6 * * *
- ofelia.job-exec.sync.command=plextraktsync sync
- ofelia.job-exec.sync.no-overlap=true
ofelia:
image: mcuadros/ofelia:latest
container_name: ofelia
restart: always
command: daemon --docker
volumes:
- /var/run/docker.sock:/var/run/docker.sock:ro
networks: {}
En suivant le ReadMe, lancer le Docker la 1ère fois créera le fichier de configuration config.yml. Mais on peut aussi l’éditer à la main, tout comme servers.yml.
Pour sélectionner le serveur, utiliser les flèches du clavier.

Je me suis trompé de serveur, j’ai édité la conf à la main ensuite, du coup il cherchait à valider un SSL alors que j’avais mis un serveur en IP locale. Il faut lui laisser un peu le temps mais ensuite c’est bon.

Si ce n’est pas déjà fait, il explique la marche à suivre pour se faire une application Trakt.tv

Quand je vois SickGear dans mes applications… ça rappelle de sacrés souvenirs ! 




Il convient tout de même d’éditer un peu la configuration à la main, notamment si on veut exclure des bibliothèques ou watchlists. Ici c’est basique, je n’ai qu’un utilisateur et synchronise tout mais pour aller plus dans le détail je vous recommande de suivre son ReadMe.
C’est config.yml dans /home/aerya/docker/plextraktsync/config
cache:
path: $PTS_CACHE_DIR/trakt_cache
# You may want to use per server libraries config instead:
# - https://github.com/Taxel/PlexTraktSync#libraries
excluded-libraries:
- Private
config:
dotenv_override: true
plex:
timeout: 30
logging:
append: true
# Whether to show timestamps in console messages
console_time: false
debug: false
filename: plextraktsync.log
# Additional logger names to apply filtering
filter_loggers:
# - plexapi
# - requests_cache.backends
# - requests_cache.backends.base
# - requests_cache.backends.sqlite
# - requests_cache.policy.actions
# - requests_cache.session
# - trakt.core
# - urllib3.connectionpool
filter:
# # Filter out all messages with level WARNING
# - level: WARNING
# # Filter out message with level WARNING and containing a text
# - level: WARNING
# message: "not found on Trakt"
# - message: "because provider local has no external Id"
# - message: "because provider none has no external Id"
# - message: "Retry using search for specific Plex Episode"
# # Filter out messages by requests_cache
# - name: requests_cache.backends
# - name: requests_cache.backends.base
# - name: requests_cache.backends.sqlite
# - name: requests_cache.policy.actions
# - name: requests_cache.session
# settings for 'sync' command
sync:
# Setting for whether ratings from one platform should have priority.
# Valid values are trakt, plex or none. (default: plex)
# none - No rating priority. Existing ratings are not overwritten.
# trakt - Trakt ratings have priority. Existing Plex ratings are overwritten.
# plex - Plex ratings have priority. Existing Trakt ratings are overwritten.
rating_priority: plex
plex_to_trakt:
collection: false
# Clear collected state of items not present in Plex
clear_collected: false
ratings: true
watched_status: true
# If plex_to_trakt watchlist=false and trakt_to_plex watchlist=true
# the Plex watchlist will be overwritten by Trakt watchlist
watchlist: false
trakt_to_plex:
liked_lists: true
ratings: true
watched_status: true
# If trakt_to_plex watchlist=false and plex_to_trakt watchlist=true
# the Trakt watchlist will be overwritten by Plex watchlist
watchlist: false
# If you prefer to fetch trakt watchlist as a playlist instead of
# plex watchlist, toggle this to true (is read only if watchlist=true)
watchlist_as_playlist: false
# Sync Play Progress from Trakt to Plex
playback_status: false
# Configuration for liked lists
liked_lists:
# Whether to keep watched items in the list
keep_watched: true
# Configuration override for specific lists
#liked_list:
# "Saw Collection":
# keep_watched: true
# settings for 'watch' command
watch:
add_collection: false
remove_collection: false
# what video watched percentage (0 to 100) triggers the watched status
scrobble_threshold: 80
# true to scrobble only what's watched by you, false for all your PMS users
username_filter: true
# Show the progress bar of played media in terminal
media_progressbar: true
# Clients to ignore when listening Play events
ignore_clients: ~
xbmc-providers:
movies: imdb
shows: tvdb
De même, on peut venir éditer le fichier du ou des serveurs Plex à synchroniser : servers.yml
servers:
default:
token: null
urls:
- null
- null
id: null
config: null
plex.domain.tld:
token: xxxx
urls:
- https://plex.domain.tld
# - http://192.168.0.139:32400
id: xxxx
config: null
Et donc, toutes les 6h, le Docker se lance et synchronise Plex et Trakt.tv pour mettre à jour les films et séries lus/non lus.
La 1ère fois peut prendre un peu de temps selon le nombre de fichiers.
Je voulais les notifications sur Discord, j’ai donc créé un script qui lance le Docker et envoie la récap en notification :

Nécessite curl et jq. Pour l’icône, ici comme pour Heimdall, j’utilise dashboardicons.com
Et il faut retirer Ofelia et les labels inhérents
du compose plus haut puisque c’est maintenant l’hôte, via crontab par exemple, qui va exécuter le script qui va lui-même lancer le Docker de plextraktsync.
Le compose devient
services:
plextraktsync:
image: ghcr.io/taxel/plextraktsync:latest
container_name: plextraktsync
restart: always
environment:
- PUID=1000
- PGID=1000
- TZ=Europe/Paris
volumes:
- /home/aerya/docker/plextraktsync/config:/app/config
command: watch
Et mon script
#!/bin/bash
set -euo pipefail
WEBHOOK_URL="https://discord.com/api/webhooks/xxxx"
TMP_LOG="$(mktemp)"
docker compose exec plextraktsync plextraktsync sync 2>&1 | tee "$TMP_LOG"
RESULT=$?
# récupère les 20 dernières lignes
LOG_TAIL="$(tail -n 20 "$TMP_LOG" | jq -Rs .)"
PAYLOAD=$(jq -n --arg res "$RESULT" --arg logs "$LOG_TAIL" '
{content: "Résultat sync : \($res)\n```\n\($logs | fromjson)\n```"}
')
curl -sS -X POST -H "Content-Type: application/json" \
-d "$PAYLOAD" "$WEBHOOK_URL"

Je l’ai donc mis en cron, toutes les 6h :
0 */6 * * * bash /home/aerya/docker/plextraktsync/config/plextraktsyncdiscord.sh
![]()
about:config
browser.ml.chat.enabled -> false
browser.tabs.groups.smart.enabled -> false
browser.ml.enable -> false
Test pour "vous [aider] à choisir une distribution Linux qui vous correspond" :-)
Simple et efficace !