diff --git a/blog/2024/05/21/blocky-et-unbound-sous-nixos/data/attachments/images/DTaMGE/article.webp b/blog/2024/05/21/blocky-et-unbound-sous-nixos/data/attachments/images/DTaMGE/article.webp
new file mode 100644
index 000000000..122791e39
Binary files /dev/null and b/blog/2024/05/21/blocky-et-unbound-sous-nixos/data/attachments/images/DTaMGE/article.webp differ
diff --git a/blog/2024/05/21/blocky-et-unbound-sous-nixos/data/attachments/images/DTaMGE/gallery.webp b/blog/2024/05/21/blocky-et-unbound-sous-nixos/data/attachments/images/DTaMGE/gallery.webp
new file mode 100644
index 000000000..f6cb87ce3
Binary files /dev/null and b/blog/2024/05/21/blocky-et-unbound-sous-nixos/data/attachments/images/DTaMGE/gallery.webp differ
diff --git a/blog/2024/05/21/blocky-et-unbound-sous-nixos/data/attachments/images/DTaMGE/listitem.webp b/blog/2024/05/21/blocky-et-unbound-sous-nixos/data/attachments/images/DTaMGE/listitem.webp
new file mode 100644
index 000000000..c41362792
Binary files /dev/null and b/blog/2024/05/21/blocky-et-unbound-sous-nixos/data/attachments/images/DTaMGE/listitem.webp differ
diff --git a/blog/2024/05/21/blocky-et-unbound-sous-nixos/data/attachments/images/DTaMGE/original.webp b/blog/2024/05/21/blocky-et-unbound-sous-nixos/data/attachments/images/DTaMGE/original.webp
new file mode 100644
index 000000000..0890036f0
Binary files /dev/null and b/blog/2024/05/21/blocky-et-unbound-sous-nixos/data/attachments/images/DTaMGE/original.webp differ
diff --git a/blog/2024/05/21/blocky-et-unbound-sous-nixos/data/attachments/images/mMfOpQ/article.webp b/blog/2024/05/21/blocky-et-unbound-sous-nixos/data/attachments/images/mMfOpQ/article.webp
new file mode 100644
index 000000000..e49f8e4b7
Binary files /dev/null and b/blog/2024/05/21/blocky-et-unbound-sous-nixos/data/attachments/images/mMfOpQ/article.webp differ
diff --git a/blog/2024/05/21/blocky-et-unbound-sous-nixos/data/attachments/images/mMfOpQ/gallery.webp b/blog/2024/05/21/blocky-et-unbound-sous-nixos/data/attachments/images/mMfOpQ/gallery.webp
new file mode 100644
index 000000000..3e98b5cc9
Binary files /dev/null and b/blog/2024/05/21/blocky-et-unbound-sous-nixos/data/attachments/images/mMfOpQ/gallery.webp differ
diff --git a/blog/2024/05/21/blocky-et-unbound-sous-nixos/data/attachments/images/mMfOpQ/listitem.webp b/blog/2024/05/21/blocky-et-unbound-sous-nixos/data/attachments/images/mMfOpQ/listitem.webp
new file mode 100644
index 000000000..5d906571a
Binary files /dev/null and b/blog/2024/05/21/blocky-et-unbound-sous-nixos/data/attachments/images/mMfOpQ/listitem.webp differ
diff --git a/blog/2024/05/21/blocky-et-unbound-sous-nixos/data/attachments/images/mMfOpQ/original.png b/blog/2024/05/21/blocky-et-unbound-sous-nixos/data/attachments/images/mMfOpQ/original.png
new file mode 100644
index 000000000..a54af95a8
Binary files /dev/null and b/blog/2024/05/21/blocky-et-unbound-sous-nixos/data/attachments/images/mMfOpQ/original.png differ
diff --git a/blog/2024/05/21/blocky-et-unbound-sous-nixos/data/images.json b/blog/2024/05/21/blocky-et-unbound-sous-nixos/data/images.json
new file mode 100644
index 000000000..3bc3fad13
--- /dev/null
+++ b/blog/2024/05/21/blocky-et-unbound-sous-nixos/data/images.json
@@ -0,0 +1,58 @@
+{
+ "files": {
+ "mMfOpQ": {
+ "filename": "attachments/images/mMfOpQ/original.png",
+ "checksum": "eacdf1ebb276b67f53b0af411279dc6b",
+ "last_modified": "2024-05-20T09:13:52+00:00",
+ "title": "Utilisez le bouton \"Brut\" pour obtenir l'URL du fichier à rajouter à blocky",
+ "alt": {
+ "text": "Capture d'écran de l'interface web de la forge logicielle Gitea, montrant notamment le bouton nommé 'Brut' offrant un lien direct vers le fichier concerné."
+ }
+ },
+ "DTaMGE": {
+ "filename": "attachments/images/DTaMGE/original.webp",
+ "checksum": "1c41123d5e2f656f50dda532170f45dc",
+ "title": "Illustration par DALL·E",
+ "last_modified": "2024-05-20T09:51:04+00:00",
+ "alt": {
+ "text": "Image d'en-tête de l'article. Il s'agit d'une interprétation visuelle de l'article proposée par Dall-E."
+ }
+ }
+ },
+ "variants": {
+ "mMfOpQ": {
+ "article": {
+ "checksum": "87934699dbc19ab361d682fda233b305",
+ "filename": "attachments/images/mMfOpQ/article.webp",
+ "last_modified": "2024-05-20T09:13:52.363323Z"
+ },
+ "listitem": {
+ "checksum": "8634ceec60986b8fffe4a6d25bbd5345",
+ "filename": "attachments/images/mMfOpQ/listitem.webp",
+ "last_modified": "2024-05-20T09:13:52.415330Z"
+ },
+ "gallery": {
+ "checksum": "60c484fa8a7145f19cb8b043ba4fa154",
+ "filename": "attachments/images/mMfOpQ/gallery.webp",
+ "last_modified": "2024-05-20T09:13:52.471948Z"
+ }
+ },
+ "DTaMGE": {
+ "article": {
+ "checksum": "62e71b212fb52c00b6591ce31d4094a1",
+ "filename": "attachments/images/DTaMGE/article.webp",
+ "last_modified": "2024-05-20T09:51:04.997207Z"
+ },
+ "listitem": {
+ "checksum": "6bb0aa2625df91aa8ed904c8364dd3c9",
+ "filename": "attachments/images/DTaMGE/listitem.webp",
+ "last_modified": "2024-05-20T09:51:05.071325Z"
+ },
+ "gallery": {
+ "checksum": "4164563453e2fabdb82d9762538089ff",
+ "filename": "attachments/images/DTaMGE/gallery.webp",
+ "last_modified": "2024-05-20T09:51:05.121718Z"
+ }
+ }
+ }
+}
diff --git a/blog/2024/05/21/blocky-et-unbound-sous-nixos/data/index.json b/blog/2024/05/21/blocky-et-unbound-sous-nixos/data/index.json
new file mode 100644
index 000000000..c968e6009
--- /dev/null
+++ b/blog/2024/05/21/blocky-et-unbound-sous-nixos/data/index.json
@@ -0,0 +1,11 @@
+{
+ "title": "Blocky et Unbound sous NixOS",
+ "date": "2024-05-21T00:10:53+02:00",
+ "cover": "DTaMGE",
+ "description": {
+ "text": "Configuration de Blocky avec Redis sur deux serveurs physiques pour un blocage et une liste blanche fiables, en utilisant sentinel ou la réplication maître/esclave avec redis, et intégation de listes noires et blanches personnalisées via des dépôts Git.",
+ "generator": "App\\Services\\AI\\Providers\\Ollama",
+ "model": "llama3",
+ "edited": true
+ }
+}
\ No newline at end of file
diff --git a/blog/2024/05/21/blocky-et-unbound-sous-nixos/data/metadata.json b/blog/2024/05/21/blocky-et-unbound-sous-nixos/data/metadata.json
new file mode 100644
index 000000000..05c4457fd
--- /dev/null
+++ b/blog/2024/05/21/blocky-et-unbound-sous-nixos/data/metadata.json
@@ -0,0 +1,29 @@
+{
+ "Autres mots-clé": {
+ "Matériel": ["Raspberry Pi"],
+ "Logiciels": [
+ "Blocky",
+ "Unbound",
+ "Redis",
+ "pi-hole",
+ "AdGuard Home",
+ "dig",
+ "Git",
+ "Gitea",
+ "Prometheus",
+ "Grafana"
+ ],
+ "Systèmes d'exploitation": ["Raspberry Pi OS", "NixOS"],
+ "Autres": [
+ "DNS",
+ "Blacklist",
+ "Whitelist",
+ "DNS Blackhole",
+ "Publicité",
+ "Redondance",
+ "Haut-disponibilité",
+ "Fichier hosts"
+ ],
+ "Langages de programmation": ["Go", "nix", "shell"]
+ }
+}
diff --git a/blog/2024/05/21/blocky-et-unbound-sous-nixos/index.md b/blog/2024/05/21/blocky-et-unbound-sous-nixos/index.md
new file mode 100644
index 000000000..1aae3e796
--- /dev/null
+++ b/blog/2024/05/21/blocky-et-unbound-sous-nixos/index.md
@@ -0,0 +1,423 @@
+## Contexte
+
+### Hardware
+
+J'en ai marre des Raspberry Pi.
+Ça fait depuis longtemps que [je le dis](/blog/2021/02/28/rant-raspberry-pi-4/), et le temps n'a malheureusement pas corrigé certains défauts.
+Je vais oser l'affirmation :
+
+**Il est impossible d'avoir un uptime décent pour faire un serveur d'un Raspberry Pi**, peu importe le type de serveur ou la génération de Raspberry Pi dont on parle.
+Ce sont des machines d'*expérimentation*, et malgré les soins que je leur apporte, je ne peux pas les utiliser comme des serveurs pour deux raisons :
+
+- le réseau est instable (en particulier en Wifi mais c'est aussi vrai en ethernet pour les RPi qui en sont dotés, en tout cas le 4 comme on va le voir)
+- le système de stockage aux fraises (je ne parle pas des cartes SD mais du stockage USB)
+
+Pour les caméras, ce n'est pas trop grave si l'une d'elles se déconnecte pendant quelques minutes.
+C'est beaucoup plus embêtant pour un serveur DNS, en substance [pi-hole](https://pi-hole.net/), hébergé depuis quelque temps sur un [Raspberry Pi 4](https://www.raspberrypi.com/products/raspberry-pi-4-model-b/).
+La machine utilise l'[ISO officielle](https://www.raspberrypi.com/software/operating-systems/#raspberry-pi-os-64-bit) de la fondation et il n'y a que pi-hole qui y soit installé.
+**Aucune configuration supplémentaire** n'est faite sur la machine.
+L'installation est parfaitement *vanilla*, sauf ce qui est installé par pi-hole.
+
+Le Pi 4 est connecté en ethernet, et il boote depuis un SSD SATA en USB3.
+Je ne me fous pas de la gueule de cette machine quand même.
+
+Occasionnellement, une fois par semaine ou peut-être plus, la machine *disparaît* du réseau.
+Comme ça : pouf, plus de Raspberry Pi.
+Plus de DNS.
+Plus de SSH.
+Plus de pi-hole.
+Plus *rien*.
+Sans explication : pas de log, rien, que dalle, *peanuts*.
+
+### Software
+
+J'adore pi-hole.
+L'application fonctionne exactement comme je veux qu'elle le fasse.
+Je vois en temps réel les domaines demandés par le réseau, je peux black/whitelister un domaine en un clic, c'est très frugal, ça répond bien, bref, c'est un excellent logiciel.
+
+Malgré ces éloges, j'ai trois "problèmes" :
+
+- installer un upstream récursif sur la même machine n'est pas "simple" (c'est-à-dire que [c'est facile de copier/coller des commandes](https://docs.pi-hole.net/guides/dns/unbound/), mais les comprendre — et surtout comprendre pourquoi ça ne fonctionne pas — est une autre histoire)
+- installer un cluster de pi-hole est tout sauf trivial ([il y a moyen](https://discourse.pi-hole.net/t/clustered-pihole-ive-done-it/12716/7) mais ce n'est absolument pas propre)
+- pas d'installation sous NixOS (selon ma politique personnelle, docker n'est pas une option)
+
+## Perdre pour gagner avec Blocky, Unbound et NixOS
+
+Hors de question de re-tenter le coup avec AdGuard Home pour les raisons que j'ai déjà détaillées [ici](/blog/2023/06/21/migration-de-pi-hole-vers-adguard-home-et-digression/).
+Une alternative (parmi d'autres) est [blocky](https://github.com/0xERR0R/blocky).
+Une "petite" application écrite en Go, qui fait office de proxy DNS et de blocklist.
+Avec unbound en upstream, on obtient une solution *similaire* à pi-hole.
+C'est la "stack" que l'on va installer sur un "vrai" serveur.
+
+*Similaire* parce que, "malheureusement", on va perdre l'UI, mais est-ce que ça sera vraiment un problème ?
+Pour l'instant, je ne sais pas...
+
+### Pré-requis
+
+Partons du principe qu'on a un serveur DNS fonctionnel sur le réseau (typiquement, le routeur ou le serveur DNS à remplacer).
+
+On va installer Blocky et Unbound sur un serveur sous [NixOS](https://nixos.org/).
+
+### Unbound
+
+```nix
+{
+ services.unbound = {
+ enable = true;
+ resolveLocalQueries = false;
+
+ settings = {
+ server = {
+ interface = "127.0.0.1@5353";
+ access-control = [ "127.0.0.1/0 allow" ];
+ verbosity = 1;
+ };
+ };
+ };
+}
+```
+
+On passe `resolveLocalQueries` à `false` pour qu'unbound ne pirate pas le `resolv.conf` : étant donné qu'il n'écoute pas sur le port standard, si on ne met pas cette directive, NixOS ne pourra plus résoudre des domaines après l'installation d'unbound.
+
+`interface` et `access-control` ne servent respectivement qu'à indiquer comment le serveur doit écouter (en l'occurrence, uniquement depuis `127.0.0.1` sur le port `5353`) et n'autoriser que la machine locale à l'utiliser.
+
+- [Consulter toutes les directives de configuration d'unbound pour NixOS](https://search.nixos.org/options?channel=23.11&from=0&size=50&sort=alpha_asc&type=packages&query=services.unbound).
+
+Et c'est **tout** : tous les autres paramètres par défaut sont suffisants, nous n'avons besoin de rien d'autre.
+
+```shell
+nix-os rebuild switch
+```
+
+Et on s'assure que ça fonctionne :
+
+```shell
+nix-shell -p dig # Shell temporaire pour lancer dig
+dig free.fr @127.0.0.1 -p 5353
+```
+
+```ansi
+; <<>> DiG 9.18.26 <<>> free.fr @127.0.0.1 -p 5353
+;; global options: +cmd
+;; Got answer:
+;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 22474
+;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1
+
+;; OPT PSEUDOSECTION:
+; EDNS: version: 0, flags:; udp: 1232
+;; QUESTION SECTION:
+;free.fr. IN A
+
+;; ANSWER SECTION:
+free.fr. 600 IN A 212.27.48.10
+
+;; Query time: 67 msec
+;; SERVER: 127.0.0.1#5353(127.0.0.1) (UDP)
+;; WHEN: Mon May 20 00:49:10 CEST 2024
+;; MSG SIZE rcvd: 52
+```
+
+On peut passer à la suite.
+
+L'avantage avec NixOS (et plus généralement, les distros du même genre) c'est qu'à ce stade, si ça ne fonctionne pas, ça ne vient pas de la configuration 😁
+
+### Blocky
+
+```nix
+{
+ services.blocky = {
+ enable = true;
+ settings = {
+ # On peut utiliser plusieurs upstreams dans plusieurs groupes...
+ upstreams = {
+ groups = {
+ default = [
+ # Mais en l'occurrence, on va se contenter d'utiliser notre unbound
+ "127.0.0.1:5353"
+ ];
+ };
+ };
+ conditional = {
+ # Si Blocky n'a pas déjà résolu un domaine, il demande à l'upstream.
+ # Si on mettait false, on obtiendrait une erreur de résolution.
+ fallbackUpstream = true;
+ mapping = {
+ # Ça c'est personnel : c'est 10.0.0.1 qui répond pour le domaine
+ # home.arpa sur mon réseau parce que c'est le DHCP et qu'il stocke les
+ # noms d'hôtes du réseau local
+ "home.arpa" = "10.0.0.1";
+ };
+ };
+ blocking = {
+ blackLists = {
+ ads = [
+ # Là on ajoute les listes que l'on veut, à commencer par la plus
+ # célèbre
+ https://raw.githubusercontent.com/StevenBlack/hosts/master/hosts
+ ];
+ };
+ clientGroupsBlock = {
+ default = [
+ # Sans cette ligne, rien ne sera bloqué, tout sera envoyé à
+ # l'upstream. Le nom doit correspondre à au moins une liste créée
+ # dans `blackLists`
+ "ads"
+ ];
+ };
+ };
+ # Les ports d'écoute
+ ports = {
+ dns = 53;
+ };
+ };
+ };
+}
+```
+
+Voyez que si l'on virait les lignes ne servant qu'à ouvrir et fermer des blocs de config, on n'aurait moins d'une dizaine de lignes de configuration.
+Si vous préférez quelque chose de plus condensé :
+
+```nix
+{
+ services.blocky.enable = true;
+ services.blocky.settings.upstreams.groups.default = [ "127.0.0.1:5353" ];
+ services.blocky.settings.conditional.fallbackUpstream = true;
+ services.blocky.settings.conditional.mapping."home.arpa" = "10.0.0.1";
+ services.blocky.settings.blocking.blackLists.ads = [
+ https://raw.githubusercontent.com/StevenBlack/hosts/master/hosts
+ ];
+ services.blocky.settings.clientGroupsBlock.default = [ "ads" ];
+ services.blocky.settings.ports.dns = 53;
+}
+```
+
+**On répète exactement la même configuration sur un deuxième serveur.**
+On obtient deux serveurs DNS capables de bloquer des domaines sur le réseau, mais, pour obtenir un véritable effet "cluster", il faut aller un peu plus loin.
+
+Les directives de configuration de Blocky pour NixOS se résument à `enable` et `settings`, cette dernière acceptant une notation équivalent à celle de Blocky.
+On pourra donc utiliser "directement" [la documentation de Blocky](https://0xerr0r.github.io/blocky/v0.23/configuration/) pour le configurer dans NixOS.
+
+### redis
+
+J'utilise de toute façon redis sur mon serveur web, ce n'est pas bien compliqué de l'installer sur le reverse-proxy (qui est aussi une machine sous NixOS).
+
+Je vais d'ailleurs considérer que le redis du serveur web (`10.0.2.2`) sera le maître du réseau, tandis que celui du reverse-proxy (`10.0.2.1`) sera l'esclave.
+
+Le redis maître sera configuré comme suit :
+
+```
+{
+ services.redis.vmOverCommit = true;
+
+ services.redis.servers.blocky = {
+ enable = true;
+ bind = "0.0.0.0";
+ port = 16379
+ masterAuth = "secret";
+ requirePass = "secret";
+ };
+}
+```
+
+Notons que nous créons un service redis spécialement dédié à blocky.
+On applique [la modification que redis recommande](https://redis.io/docs/latest/develop/get-started/faq/#background-saving-fails-with-a-fork-error-on-linux) avec `services.redis.vmOverCommit = true;`.
+En outre, on fait écouter ce serveur sur un port différent du port original (`6379`) pour pouvoir continuer d'utiliser une autre instance de redis dédiée à d'autres usages.
+
+Enfin, n'oubliez pas de changer le mot de passe (`secret`).
+
+Et l'esclave :
+
+```
+{
+ services.redis.vmOverCommit = true;
+
+ services.redis.servers.blocky = {
+ enable = true;
+ bind = "0.0.0.0";
+ masterAuth = "secret";
+ requirePass = "secret";
+
+ slaveOf = {
+ ip = "10.0.2.2";
+ port = 16379;
+ };
+ };
+}
+```
+
+Même configuration, mais en précisant simplement quel est le serveur maître.
+
+Après quelques `nixos rebuild switch`, on devrait voir la sortie suivante sur le serveur maître :
+
+```shell
+journalctl -u redis-blocky.service -f
+```
+
+```ansi
+May 20 10:27:08 mac-mini-m1-de-richard redis[97580]: Running mode=standalone, port=16379.
+May 20 10:27:08 mac-mini-m1-de-richard redis[97580]: Server initialized
+May 20 10:27:08 mac-mini-m1-de-richard redis[97580]: Loading RDB produced by version 7.2.4
+May 20 10:27:08 mac-mini-m1-de-richard redis[97580]: RDB age 0 seconds
+May 20 10:27:08 mac-mini-m1-de-richard redis[97580]: RDB memory usage when created 0.98 Mb
+May 20 10:27:08 mac-mini-m1-de-richard redis[97580]: Done loading RDB, keys loaded: 0, keys expired: 0.
+May 20 10:27:08 mac-mini-m1-de-richard redis[97580]: DB loaded from disk: 0.000 seconds
+May 20 10:27:08 mac-mini-m1-de-richard redis[97580]: Ready to accept connections tcp
+May 20 10:27:08 mac-mini-m1-de-richard redis[97580]: Ready to accept connections unix
+May 20 10:27:08 mac-mini-m1-de-richard systemd[1]: Started Redis Server - redis-blocky.
+May 20 10:27:42 mac-mini-m1-de-richard redis[97580]: Replica 10.0.2.1:16379 asks for synchronization
+May 20 10:27:42 mac-mini-m1-de-richard redis[97580]: Partial resynchronization request from 10.0.2.1:16379 accepted. Sending 0 bytes of backlog starting from offset 2087.
+```
+
+Et sur l'esclave :
+
+```shell
+journalctl -u redis-blocky.service -f
+```
+
+```ansi
+May 20 10:27:42 reverse-proxy redis[48394]: Ready to accept connections unix
+May 20 10:27:42 reverse-proxy systemd[1]: Started Redis Server - redis-blocky.
+May 20 10:27:42 reverse-proxy redis[48394]: Connecting to MASTER 10.0.2.2:16379
+May 20 10:27:42 reverse-proxy redis[48394]: MASTER <-> REPLICA sync started
+May 20 10:27:42 reverse-proxy redis[48394]: Non blocking connect for SYNC fired the event.
+May 20 10:27:42 reverse-proxy redis[48394]: Master replied to PING, replication can continue...
+May 20 10:27:42 reverse-proxy redis[48394]: Trying a partial resynchronization (request c55ad3ed1037641cbbf6f8cc36a7e76bc64b59e5:2087).
+May 20 10:27:42 reverse-proxy redis[48394]: Successful partial resynchronization with master.
+May 20 10:27:42 reverse-proxy redis[48394]: Master replication ID changed to 00484c469b8a3de337df088cadefc5e2687f2338
+May 20 10:27:42 reverse-proxy redis[48394]: MASTER <-> REPLICA sync: Master accepted a Partial Resynchronization.
+```
+
+Donc, a priori tout fonctionne.
+
+Il ne reste plus qu'à intégrer redis à Blocky en modifiant sa configuration sur les deux serveurs :
+
+```nix
+{
+ services.blocky = {
+ enable = true;
+ settings = {
+ # [...]
+ redis = {
+ address = "127.0.0.1:16379";
+ password = "secret";
+ };
+ };
+ };
+}
+```
+
+Dans un monde idéal, on aurait trois serveurs redis et on utiliserait [sentinel](https://redis.io/docs/latest/operate/oss_and_stack/management/sentinel/), mais dans le cas présent, un système maître/esclave devrait suffire : c'est pourquoi on indique à chaque serveur blocky d'utiliser son propre serveur redis qui sera de toute façon répliqué sur l'autre serveur physique.
+
+Après quelques instants, on devrait pouvoir voir la base de données de redis se remplir :
+
+```shell
+redis-cli -p 16379 -a secret
+```
+
+```ansi
+127.0.0.1:16379> KEYS *
+1) "blocky:cache:\x00\x01hosts.tweedge.net"
+2) "blocky:cache:\x00\x01blocklistproject.github.io"
+3) "blocky:cache:\x00\x1cgit.athaliasoft.com"
+4) "blocky:cache:\x00\x01git.athaliasoft.com"
+5) "blocky:cache:\x00\x1craw.githubusercontent.com"
+6) "blocky:cache:\x00\x1cblocklistproject.github.io"
+7) "blocky:cache:\x00\x01raw.githubusercontent.com"
+8) "blocky:cache:\x00\x1chosts.tweedge.net"
+```
+
+Et on devrait voir plus ou moins la même chose sur les deux serveurs.
+
+### Blacklist/whitelist personnelles
+
+Évidemment, on peut modifier la configuration de Blocky pour ajouter ses propres black/whitelists :
+
+```nix
+{
+ services.blocky = {
+ enable = true;
+ settings = {
+ # [...]
+ blocking = {
+ blackLists = {
+ ads = [
+ "someadsdomain.com"
+ # [...]
+ ];
+ };
+ };
+ };
+ };
+}
+```
+
+Mais cela impose de modifier les deux serveurs à chaque fois, puis `nixos rebuild switch`, etc.
+C'est chiant.
+Donc, la solution, c'est d'héberger ses listes dans un dépôt git.
+Du coup, on peut faire ça :
+
+```nix
+{
+ services.blocky = {
+ enable = true;
+ settings = {
+ # [...]
+ blocking = {
+ blackLists = {
+ externalLists = [
+ https://raw.githubusercontent.com/StevenBlack/hosts/master/hosts
+ ];
+ internalLists = [
+ https://git.athaliasoft.com/Infrastructure/dns/raw/branch/main/blacklist.txt
+ ];
+ };
+ whiteLists = {
+ internalLists = [
+ https://git.athaliasoft.com/Infrastructure/dns/raw/branch/main/whitelist.txt
+ ];
+ };
+ };
+ # [...]
+ };
+ };
+}
+```
+
+Il n'y a qu'à mettre à jour le dépôt git pour que, ponctuellement, Blocky mette à jour ses listes.
+Et si on est vraiment pressé, on peut toujours faire `systemctl restart blocky.service`.
+
+On écrira alors notre blacklist comme un fichier `hosts` :
+
+```txt
+0.0.0.0 cache.consentframework.com
+0.0.0.0 cdn.stripcash.com.c.footprint.net
+0.0.0.0 consentframework.com
+0.0.0.0 cookieless-data.com
+# etc
+```
+
+Alors que la whitelist contiendra un domaine par ligne, tout simplement.
+
+On utilisera alors le chemin vers le fichier brut, fourni par notre forge logicielle.
+
+
+
+Il y a d'autres façons de faire : blocky peut aussi interpréter des fichiers locaux[^1].
+Mais j'ai estimé que pour mon cas d'usage, stocker mes black/whitelists dans Gitea était plus intéressant.
+
+[^1]:
+
+Je regrette juste de ne pas encore avoir compris s'il était possible de fournir à blocky la liste des listes à parser : j'aurais aimé stocker dans Gitea un fichier qui contient une liste d'URLs (contenant notamment mentionné dans mes exemples, mais pas seulement), mais je n'ai pas — encore — compris comment faire ni même si c'était possible.
+
+## Conclusion
+
+La gestion des black/whitelists est un peu plus pénible que sous pi-hole : je ne peux plus afficher en temps réel la liste des domaines demandés, et cliquer sur l'un d'eux pour le (dé)bloquer.
+Il est possible de partiellement remédier à cela en installant une stack [Prometheus/Grafana](https://0xerr0r.github.io/blocky/v0.23/prometheus_grafana/), ce que je n'ai pas envie de faire pour le moment, pas juste pour blocky.
+
+Pour le moment, cette solution me satisfait, et, finalement, l'interface web ne me manque pas.
+Après tout, une fois que tout est en place, on ne touche plus à rien, et la supervision se fait aussi bien en ligne de commande.
+Et je ne trifouille pas tous les jours les black/whitelists.
+
+Notons tout de même que tout cela est bien plus simple et rapide à installer, et surtout [à sauvegarder et à restaurer](/blog/2024/05/04/maintenance-terminee/) que pi-hole sur un Raspberry Pi.
+
+Deux instances de blocky couplées à deux instances de redis sur deux serveurs physiques "fiables" devraient m'éviter quelques déconvenues à l'avenir...
\ No newline at end of file
diff --git a/blog/2024/05/21/data/index.json b/blog/2024/05/21/data/index.json
new file mode 100644
index 000000000..bbc83fbd4
--- /dev/null
+++ b/blog/2024/05/21/data/index.json
@@ -0,0 +1,3 @@
+{
+ "title": "Publiés le 21 mai 2024"
+}
\ No newline at end of file
diff --git a/blog/2024/05/21/index.md b/blog/2024/05/21/index.md
new file mode 100644
index 000000000..e69de29bb
diff --git a/termes/adguard-home/data/relations.json b/termes/adguard-home/data/relations.json
index bf4bad81d..036f6510c 100644
--- a/termes/adguard-home/data/relations.json
+++ b/termes/adguard-home/data/relations.json
@@ -1,5 +1,8 @@
{
"Autres": [
"/blog/2023/06/21/migration-de-pi-hole-vers-adguard-home-et-digression/"
+ ],
+ "Logiciels": [
+ "/blog/2024/05/21/blocky-et-unbound-sous-nixos/"
]
}
\ No newline at end of file
diff --git a/termes/blacklist/data/index.json b/termes/blacklist/data/index.json
new file mode 100644
index 000000000..10e9bd507
--- /dev/null
+++ b/termes/blacklist/data/index.json
@@ -0,0 +1,3 @@
+{
+ "title": "Blacklist"
+}
\ No newline at end of file
diff --git a/termes/blacklist/data/relations.json b/termes/blacklist/data/relations.json
new file mode 100644
index 000000000..f034357e2
--- /dev/null
+++ b/termes/blacklist/data/relations.json
@@ -0,0 +1,5 @@
+{
+ "Autres": [
+ "/blog/2024/05/21/blocky-et-unbound-sous-nixos/"
+ ]
+}
\ No newline at end of file
diff --git a/termes/blacklist/index.md b/termes/blacklist/index.md
new file mode 100644
index 000000000..e69de29bb
diff --git a/termes/blocky/data/index.json b/termes/blocky/data/index.json
new file mode 100644
index 000000000..a190c3aec
--- /dev/null
+++ b/termes/blocky/data/index.json
@@ -0,0 +1,3 @@
+{
+ "title": "Blocky"
+}
\ No newline at end of file
diff --git a/termes/blocky/data/relations.json b/termes/blocky/data/relations.json
new file mode 100644
index 000000000..1891b4f6c
--- /dev/null
+++ b/termes/blocky/data/relations.json
@@ -0,0 +1,5 @@
+{
+ "Logiciels": [
+ "/blog/2024/05/21/blocky-et-unbound-sous-nixos/"
+ ]
+}
\ No newline at end of file
diff --git a/termes/blocky/index.md b/termes/blocky/index.md
new file mode 100644
index 000000000..e69de29bb
diff --git a/termes/dig/data/index.json b/termes/dig/data/index.json
new file mode 100644
index 000000000..156cf51da
--- /dev/null
+++ b/termes/dig/data/index.json
@@ -0,0 +1,3 @@
+{
+ "title": "dig"
+}
\ No newline at end of file
diff --git a/termes/dig/data/relations.json b/termes/dig/data/relations.json
new file mode 100644
index 000000000..1891b4f6c
--- /dev/null
+++ b/termes/dig/data/relations.json
@@ -0,0 +1,5 @@
+{
+ "Logiciels": [
+ "/blog/2024/05/21/blocky-et-unbound-sous-nixos/"
+ ]
+}
\ No newline at end of file
diff --git a/termes/dig/index.md b/termes/dig/index.md
new file mode 100644
index 000000000..e69de29bb
diff --git a/termes/dns-blackhole/data/index.json b/termes/dns-blackhole/data/index.json
new file mode 100644
index 000000000..28eb20365
--- /dev/null
+++ b/termes/dns-blackhole/data/index.json
@@ -0,0 +1,3 @@
+{
+ "title": "DNS Blackhole"
+}
\ No newline at end of file
diff --git a/termes/dns-blackhole/data/relations.json b/termes/dns-blackhole/data/relations.json
new file mode 100644
index 000000000..f034357e2
--- /dev/null
+++ b/termes/dns-blackhole/data/relations.json
@@ -0,0 +1,5 @@
+{
+ "Autres": [
+ "/blog/2024/05/21/blocky-et-unbound-sous-nixos/"
+ ]
+}
\ No newline at end of file
diff --git a/termes/dns-blackhole/index.md b/termes/dns-blackhole/index.md
new file mode 100644
index 000000000..e69de29bb
diff --git a/termes/dns/data/relations.json b/termes/dns/data/relations.json
index 3b0fe447b..34eb91fdb 100644
--- a/termes/dns/data/relations.json
+++ b/termes/dns/data/relations.json
@@ -4,6 +4,7 @@
],
"Autres": [
"/blog/2021/03/09/mon-reseau/",
- "/blog/2023/06/21/migration-de-pi-hole-vers-adguard-home-et-digression/"
+ "/blog/2023/06/21/migration-de-pi-hole-vers-adguard-home-et-digression/",
+ "/blog/2024/05/21/blocky-et-unbound-sous-nixos/"
]
}
\ No newline at end of file
diff --git a/termes/fichier-hosts/data/index.json b/termes/fichier-hosts/data/index.json
new file mode 100644
index 000000000..221308df1
--- /dev/null
+++ b/termes/fichier-hosts/data/index.json
@@ -0,0 +1,3 @@
+{
+ "title": "Fichier hosts"
+}
\ No newline at end of file
diff --git a/termes/fichier-hosts/data/relations.json b/termes/fichier-hosts/data/relations.json
new file mode 100644
index 000000000..f034357e2
--- /dev/null
+++ b/termes/fichier-hosts/data/relations.json
@@ -0,0 +1,5 @@
+{
+ "Autres": [
+ "/blog/2024/05/21/blocky-et-unbound-sous-nixos/"
+ ]
+}
\ No newline at end of file
diff --git a/termes/fichier-hosts/index.md b/termes/fichier-hosts/index.md
new file mode 100644
index 000000000..e69de29bb
diff --git a/termes/git/data/relations.json b/termes/git/data/relations.json
index 4e9b69d7e..0e7308acc 100644
--- a/termes/git/data/relations.json
+++ b/termes/git/data/relations.json
@@ -9,5 +9,8 @@
"/liens-interessants/2022/12/05/08dde6076b5f1b9d3aac67e6e6c0f131/",
"/blog/2023/04/06/previsualiser-des-eml-dans-gitea/",
"/blog/2023/06/10/tentative-de-remplacement-de-drone-ci-par-gitea-actions-sous-nixos/"
+ ],
+ "Logiciels": [
+ "/blog/2024/05/21/blocky-et-unbound-sous-nixos/"
]
}
\ No newline at end of file
diff --git a/termes/gitea/data/relations.json b/termes/gitea/data/relations.json
index 676720c9a..2de07b3fe 100644
--- a/termes/gitea/data/relations.json
+++ b/termes/gitea/data/relations.json
@@ -9,5 +9,8 @@
"/blog/2023/04/06/previsualiser-des-eml-dans-gitea/",
"/blog/2023/06/10/tentative-de-remplacement-de-drone-ci-par-gitea-actions-sous-nixos/",
"/blog/2023/06/17/migration-vers-woodpecker/"
+ ],
+ "Logiciels": [
+ "/blog/2024/05/21/blocky-et-unbound-sous-nixos/"
]
}
\ No newline at end of file
diff --git a/termes/go/data/relations.json b/termes/go/data/relations.json
index 3e3572159..03ffe92c9 100644
--- a/termes/go/data/relations.json
+++ b/termes/go/data/relations.json
@@ -2,5 +2,8 @@
"Autres": [
"/blog/2022/12/17/javascript-c-est-de-la-merde/",
"/blog/2023/06/10/tentative-de-remplacement-de-drone-ci-par-gitea-actions-sous-nixos/"
+ ],
+ "Langages de programmation": [
+ "/blog/2024/05/21/blocky-et-unbound-sous-nixos/"
]
}
\ No newline at end of file
diff --git a/termes/grafana/data/index.json b/termes/grafana/data/index.json
new file mode 100644
index 000000000..a12217efc
--- /dev/null
+++ b/termes/grafana/data/index.json
@@ -0,0 +1,3 @@
+{
+ "title": "Grafana"
+}
\ No newline at end of file
diff --git a/termes/grafana/data/relations.json b/termes/grafana/data/relations.json
new file mode 100644
index 000000000..1891b4f6c
--- /dev/null
+++ b/termes/grafana/data/relations.json
@@ -0,0 +1,5 @@
+{
+ "Logiciels": [
+ "/blog/2024/05/21/blocky-et-unbound-sous-nixos/"
+ ]
+}
\ No newline at end of file
diff --git a/termes/grafana/index.md b/termes/grafana/index.md
new file mode 100644
index 000000000..e69de29bb
diff --git a/termes/haut-disponibilite/data/index.json b/termes/haut-disponibilite/data/index.json
new file mode 100644
index 000000000..28b4e9820
--- /dev/null
+++ b/termes/haut-disponibilite/data/index.json
@@ -0,0 +1,3 @@
+{
+ "title": "Haut-disponibilité"
+}
\ No newline at end of file
diff --git a/termes/haut-disponibilite/data/relations.json b/termes/haut-disponibilite/data/relations.json
new file mode 100644
index 000000000..f034357e2
--- /dev/null
+++ b/termes/haut-disponibilite/data/relations.json
@@ -0,0 +1,5 @@
+{
+ "Autres": [
+ "/blog/2024/05/21/blocky-et-unbound-sous-nixos/"
+ ]
+}
\ No newline at end of file
diff --git a/termes/haut-disponibilite/index.md b/termes/haut-disponibilite/index.md
new file mode 100644
index 000000000..e69de29bb
diff --git a/termes/nix/data/index.json b/termes/nix/data/index.json
new file mode 100644
index 000000000..c325fd603
--- /dev/null
+++ b/termes/nix/data/index.json
@@ -0,0 +1,3 @@
+{
+ "title": "nix"
+}
\ No newline at end of file
diff --git a/termes/nix/data/relations.json b/termes/nix/data/relations.json
new file mode 100644
index 000000000..9b05532ea
--- /dev/null
+++ b/termes/nix/data/relations.json
@@ -0,0 +1,5 @@
+{
+ "Langages de programmation": [
+ "/blog/2024/05/21/blocky-et-unbound-sous-nixos/"
+ ]
+}
\ No newline at end of file
diff --git a/termes/nix/index.md b/termes/nix/index.md
new file mode 100644
index 000000000..e69de29bb
diff --git a/termes/nixos/data/relations.json b/termes/nixos/data/relations.json
index d43829e13..6c3bc6d4d 100644
--- a/termes/nixos/data/relations.json
+++ b/termes/nixos/data/relations.json
@@ -12,5 +12,8 @@
"/blog/2023/06/17/migration-vers-woodpecker/",
"/blog/2023/06/21/migration-de-pi-hole-vers-adguard-home-et-digression/",
"/blog/2023/06/26/de-retour-sur-le-fediverse/"
+ ],
+ "Systèmes d'exploitation": [
+ "/blog/2024/05/21/blocky-et-unbound-sous-nixos/"
]
}
\ No newline at end of file
diff --git a/termes/pi-hole/data/relations.json b/termes/pi-hole/data/relations.json
index bf4bad81d..036f6510c 100644
--- a/termes/pi-hole/data/relations.json
+++ b/termes/pi-hole/data/relations.json
@@ -1,5 +1,8 @@
{
"Autres": [
"/blog/2023/06/21/migration-de-pi-hole-vers-adguard-home-et-digression/"
+ ],
+ "Logiciels": [
+ "/blog/2024/05/21/blocky-et-unbound-sous-nixos/"
]
}
\ No newline at end of file
diff --git a/termes/prometheus/data/index.json b/termes/prometheus/data/index.json
new file mode 100644
index 000000000..638e2af9b
--- /dev/null
+++ b/termes/prometheus/data/index.json
@@ -0,0 +1,3 @@
+{
+ "title": "Prometheus"
+}
\ No newline at end of file
diff --git a/termes/prometheus/data/relations.json b/termes/prometheus/data/relations.json
new file mode 100644
index 000000000..1891b4f6c
--- /dev/null
+++ b/termes/prometheus/data/relations.json
@@ -0,0 +1,5 @@
+{
+ "Logiciels": [
+ "/blog/2024/05/21/blocky-et-unbound-sous-nixos/"
+ ]
+}
\ No newline at end of file
diff --git a/termes/prometheus/index.md b/termes/prometheus/index.md
new file mode 100644
index 000000000..e69de29bb
diff --git a/termes/publicite/data/relations.json b/termes/publicite/data/relations.json
index 2a483f059..fcb6af592 100644
--- a/termes/publicite/data/relations.json
+++ b/termes/publicite/data/relations.json
@@ -4,6 +4,7 @@
],
"Autres": [
"/liens-interessants/2023/01/03/f56d3ee90876fd553a3b09af5dd8e8bc/",
- "/blog/2024/02/21/retour-d-experience-deux-mois-sur-instagram/"
+ "/blog/2024/02/21/retour-d-experience-deux-mois-sur-instagram/",
+ "/blog/2024/05/21/blocky-et-unbound-sous-nixos/"
]
}
\ No newline at end of file
diff --git a/termes/raspberry-pi-os/data/index.json b/termes/raspberry-pi-os/data/index.json
new file mode 100644
index 000000000..08f1feca5
--- /dev/null
+++ b/termes/raspberry-pi-os/data/index.json
@@ -0,0 +1,3 @@
+{
+ "title": "Raspberry Pi OS"
+}
\ No newline at end of file
diff --git a/termes/raspberry-pi-os/data/relations.json b/termes/raspberry-pi-os/data/relations.json
new file mode 100644
index 000000000..edb5a91b1
--- /dev/null
+++ b/termes/raspberry-pi-os/data/relations.json
@@ -0,0 +1,5 @@
+{
+ "Systèmes d'exploitation": [
+ "/blog/2024/05/21/blocky-et-unbound-sous-nixos/"
+ ]
+}
\ No newline at end of file
diff --git a/termes/raspberry-pi-os/index.md b/termes/raspberry-pi-os/index.md
new file mode 100644
index 000000000..e69de29bb
diff --git a/termes/raspberry-pi/data/relations.json b/termes/raspberry-pi/data/relations.json
index 35d55c4ac..dce309afe 100644
--- a/termes/raspberry-pi/data/relations.json
+++ b/termes/raspberry-pi/data/relations.json
@@ -4,5 +4,8 @@
"/blog/2021/03/09/mon-reseau/",
"/blog/2023/01/24/mon-raspberry-pi4-est-enfin-utile/",
"/liens-interessants/2023/04/17/09769bd44da909dfd6dd3fbb2d112e0a/"
+ ],
+ "Matériel": [
+ "/blog/2024/05/21/blocky-et-unbound-sous-nixos/"
]
}
\ No newline at end of file
diff --git a/termes/redis/data/index.json b/termes/redis/data/index.json
new file mode 100644
index 000000000..485a62919
--- /dev/null
+++ b/termes/redis/data/index.json
@@ -0,0 +1,3 @@
+{
+ "title": "Redis"
+}
\ No newline at end of file
diff --git a/termes/redis/data/relations.json b/termes/redis/data/relations.json
new file mode 100644
index 000000000..1891b4f6c
--- /dev/null
+++ b/termes/redis/data/relations.json
@@ -0,0 +1,5 @@
+{
+ "Logiciels": [
+ "/blog/2024/05/21/blocky-et-unbound-sous-nixos/"
+ ]
+}
\ No newline at end of file
diff --git a/termes/redis/index.md b/termes/redis/index.md
new file mode 100644
index 000000000..e69de29bb
diff --git a/termes/redondance/data/index.json b/termes/redondance/data/index.json
new file mode 100644
index 000000000..85b348316
--- /dev/null
+++ b/termes/redondance/data/index.json
@@ -0,0 +1,3 @@
+{
+ "title": "Redondance"
+}
\ No newline at end of file
diff --git a/termes/redondance/data/relations.json b/termes/redondance/data/relations.json
new file mode 100644
index 000000000..f034357e2
--- /dev/null
+++ b/termes/redondance/data/relations.json
@@ -0,0 +1,5 @@
+{
+ "Autres": [
+ "/blog/2024/05/21/blocky-et-unbound-sous-nixos/"
+ ]
+}
\ No newline at end of file
diff --git a/termes/redondance/index.md b/termes/redondance/index.md
new file mode 100644
index 000000000..e69de29bb
diff --git a/termes/shell/data/relations.json b/termes/shell/data/relations.json
index 839434932..20eb2b679 100644
--- a/termes/shell/data/relations.json
+++ b/termes/shell/data/relations.json
@@ -1,5 +1,8 @@
{
"Autres": [
"/liens-interessants/2022/05/24/ad6e8f37e26427d45505b725e7c27729/"
+ ],
+ "Langages de programmation": [
+ "/blog/2024/05/21/blocky-et-unbound-sous-nixos/"
]
}
\ No newline at end of file
diff --git a/termes/unbound/data/index.json b/termes/unbound/data/index.json
new file mode 100644
index 000000000..7142973de
--- /dev/null
+++ b/termes/unbound/data/index.json
@@ -0,0 +1,3 @@
+{
+ "title": "Unbound"
+}
\ No newline at end of file
diff --git a/termes/unbound/data/relations.json b/termes/unbound/data/relations.json
new file mode 100644
index 000000000..1891b4f6c
--- /dev/null
+++ b/termes/unbound/data/relations.json
@@ -0,0 +1,5 @@
+{
+ "Logiciels": [
+ "/blog/2024/05/21/blocky-et-unbound-sous-nixos/"
+ ]
+}
\ No newline at end of file
diff --git a/termes/unbound/index.md b/termes/unbound/index.md
new file mode 100644
index 000000000..e69de29bb
diff --git a/termes/whitelist/data/index.json b/termes/whitelist/data/index.json
new file mode 100644
index 000000000..cbf7be790
--- /dev/null
+++ b/termes/whitelist/data/index.json
@@ -0,0 +1,3 @@
+{
+ "title": "Whitelist"
+}
\ No newline at end of file
diff --git a/termes/whitelist/data/relations.json b/termes/whitelist/data/relations.json
new file mode 100644
index 000000000..f034357e2
--- /dev/null
+++ b/termes/whitelist/data/relations.json
@@ -0,0 +1,5 @@
+{
+ "Autres": [
+ "/blog/2024/05/21/blocky-et-unbound-sous-nixos/"
+ ]
+}
\ No newline at end of file
diff --git a/termes/whitelist/index.md b/termes/whitelist/index.md
new file mode 100644
index 000000000..e69de29bb