Aller au contenu principal

Services

Retrouvez une fiche par nom, rôle ou machine. Les composants internes, les accès et les détails Docker sont regroupés après le catalogue.

Services et acces​

Le statut décrit l’usage documenté du service, sans mesure de disponibilité en temps réel.

ServiceRôleMachineStatut
AdGuard HomeRésolution DNS et filtrage du réseaupennyEn service
AdGuard secondaireDNS de secours et sonde de pennygalahadEn service
Alloy + Loki HACollecte et réplication des logspenny, galahad, lancelotEn service
AutheliaAuthentification unique et MFApennyEn service
Claude RemoteAccès à penny depuis l’application ClaudepennyEn service
CrowdSecDétection et blocage à partir des logs TraefikpennyEn service
CyberChefEncodage, hachage et décodage de donnéespennyEn service
DozzleConsultation des logs DockerpennyEn service
ForgejoForge Git et gestion des dépôtspennyEn service
GrafanaExploration des logs et tableaux de bordlancelotEn service
HomepageTableau de bord du labpennyEn service
IPTVTélévision dans le navigateurgalahadEn service
ntfyNotifications et alertespennyEn service
OutlineRédaction de la documentationpennyEn service
Proxmox Backup ServerSauvegarde des conteneurs ProxmoxlancelotEn service
Proxmox VEVirtualisation et cluster des deux nœudsgalahad, lancelotEn service
PulseSupervision Proxmox et Docker, analyse PatrolgalahadEn service
Runner Forgejo ActionsExécution des workflows CIlancelotEn service
Stack logsLoki, Grafana, Prometheus et relais ntfylancelotEn service
StatusPage d’état statiquepennyEn service
Stirling PDFManipulation de fichiers PDFpennyEn service
TailscaleAccès distant au réseau et SSHpenny, galahad, lancelotEn service
TraefikReverse proxy et certificats TLSpennyEn service
VaultwardenGestionnaire de mots de passegalahadEn service
WaterlineServeur de test du mod navalgalahadEn test
Accès et détails techniques : Docker, LXC, réseaux et configuration

Tous les conteneurs sur penny tournent depuis un seul /mnt/ssd/config/docker/docker-compose.yml. Docker data-root sur le SSD (/mnt/ssd/docker).

Grafana + Loki ne sont pas sur penny — ils tournent dans le LXC logs sur lancelot. Voir la fiche Grafana. Vaultwarden est migre sur LXC 102 vault (galahad, 192.168.1.32). Voir la fiche Vaultwarden. Tailscale tourne sur l'host (pas en container) — SSH natif activé.

Exposés derrière Traefik​

ServiceImageURLHostRéseau Docker
Traefiktraefik:latesttraefik.home…pennyproxy, socket
Autheliaauthelia/authelia:latestauth.home…pennyproxy
AdGuard Homeadguard/adguardhome:latestdns.home…penny (host net)host
Homepageghcr.io/gethomepage/homepage:latesthome.gabin-simond.frpennyproxy, socket
Forgejocodeberg.org/forgejo/forgejo:13-rootlessgit.home…pennyproxy
Outlineoutlinewiki/outline:latestwiki.home…pennyoutline, proxy
ntfybinwiederhier/ntfy:latestntfy.home… + Funnelpennyproxy
Dozzleamir20/dozzle:latestdozzle.home…pennyproxy, socket
CyberChefghcr.io/gchq/cyberchef:latestcyberchef.home…pennyproxy
Stirling PDFghcr.io/stirling-tools/s-pdf:latest-ultra-litepdf.home…pennyproxy

Sans URL — internes ou agents​

ServiceImageRôle
socket-proxylscr.io/linuxserver/socket-proxy:3.4.2-r0-ls88Filtre l'API Docker pour Traefik, Homepage, Dozzle, autoheal
autohealwillfarrell/autoheal:latestRedémarre les conteneurs unhealthy
CrowdSeccrowdsecurity/crowdsec:latestDétection + bouncer Traefik
loki-replicagrafana/loki:latestRéplica du Loki de la LXC 101 — survit à la perte de lancelot
statusbusybox:1.38Page d'état statique
outline-db / outline-redispostgres:16-alpine / redis:7-alpineBase et cache d'Outline

Sur l'hôte penny, hors Docker​

ServiceRôle
TailscaleInstallé nativement (pas en conteneur) — SSH natif activé, Funnel pour ntfy
claude-remoteMode serveur claude remote-control : penny est un appareil dans l'app Claude
AdGuard HomeTourne bien en conteneur, mais sur le réseau host (ports 53/3000 sur l'hôte)
homelab_monitor.shCron chaque minute — voir monitoring
Les 30 timers systemdSondes planifiées — voir monitoring

Hors penny​

ServiceURLOù
Grafanalogs.home…LXC 101 logs / lancelot
Vaultwardenvault.home…LXC 102 vault / galahad
PBSbackup.home…LXC 103 pbs / lancelot
Pulsepulse.home…LXC 106 pulse / galahad
IPTViptv.home…LXC 109 iptv / galahad — depuis le 2026-10-26
AdGuard secondairedns-failover.home…LXC 100 dns-failover / galahad
Proxmoxgalahad.home… / lancelot.home…Les deux nœuds, bare metal
Docshomelab.gabin-simond.frGitHub Pages, hors infra — seul service public sans Authelia
Relevé historique du 2026-09-24

Le relevé du 2026-09-24 comptait 22 conteneurs et 10 LXC. Ces nombres décrivent ce relevé, pas le parc actuel après les retraits de novembre. Le catalogue ci-dessus reflète les statuts documentés dans les fiches de services.

Le relevé du 2026-08-26 comptait 24 conteneurs : kroki et kroki-mermaid ont été retirés le 2026-08-31.

À cette date, 109 avait porté Firefly III, retiré le 2026-09-19, et 110 portait Securo. Les LXC 104, 105 et 110 ont depuis été détruits : voir le tableau LXC plus bas. Les composants beszel-agent et homelable-backend ont été retirés avec leurs services le 2026-11-03.

Avant le 26/08 le tableau en listait 16 et en oubliait 11 — dont ntfy, forgejo, outline et crowdsec, tous cités des dizaines de fois ailleurs dans cette documentation. Une page d'inventaire qui n'est pas régénérée devient un piège : on y croit. Pour la redériver :

docker ps -a --format '{{.Names}}\t{{.Image}}' # sur penny
pct list # sur galahad, puis lancelot

Les accès web internes passent par *.home.gabin-simond.fr (reverse proxy Traefik). La plupart utilisent Authelia (OIDC ou ForwardAuth) ; Vaultwarden reste volontairement indépendant du SSO. La documentation publique est hébergée hors du lab sur GitHub Pages. Voir la configuration Authelia pour les clients OIDC et la configuration.

Épinglage par digest — relevé du 2026-09-24

Les tableaux donnent le tag pour la lisibilité. Au relevé du 2026-09-24, les 22 images étaient épinglées @sha256:… dans le compose. Ce constat est daté ; il ne vaut pas nouvelle vérification du parc actuel. pulse était la dernière exception, épinglée le 2026-09-02.

Conséquence pratique : un docker compose pull ne met rien à jour, il retélécharge le digest déjà épinglé. Mettre à jour se fait en changeant le digest dans le dépôt. L'écart entre le digest épinglé et le :latest amont est surveillé par digest-drift-check (le 1er du mois).

grep -E '^\s+image:' /mnt/ssd/config/docker/docker-compose.yml

Attention au piège : un digest n'identifie pas un contenu de façon comparable entre registres. Voir comparer les ID d'image, jamais les digests.

Architecture Docker (penny)​

Schéma agrandi
100 %

Le répertoire dynamic/ porte aussi les fichiers qui ne déclarent aucun backend mais des middlewares partagés : crowdsec-bouncer.yml, rate-limit.yml, security-headers.yml, tls-options.yml.

DNS interne​

Les containers sur proxy qui doivent résoudre *.home.gabin-simond.fr (pour contacter Authelia OIDC) utilisent dns: 192.168.1.28 (AdGuard) : Homepage. Voir dépannage si un container ne resout pas les domaines locaux.

Réseaux Docker​

RéseauTypeUsage
proxybridgeServices reverse-proxies par Traefik
socketbridge (internal)Clients de socket-proxy (Traefik, Homepage, autoheal)
hosthostAdGuard (Tailscale est sur l'host natif, pas Docker)
outlinebridgeOutline avec sa base Postgres et son Redis

Pour les implications sécurité (ICC, surface d'attaque inter-containers), voir hardening — réseaux Docker.

Socket proxy — isolation Docker API​

Presque tout passe par socket-proxy sur le réseau socket (internal, pas d'internet). Plus aucun conteneur ne monte /var/run/docker.sock en direct depuis le 2026-11-03 : les deux exceptions relevées le 2026-09-24, portainer et beszel-agent, ont été retirées avec leurs services.

Pour la liste détaillée des endpoints autorises/bloques et l'analyse de surface d'attaque, voir hardening — socket proxy.

LXC Proxmox​

IDNomHostIP LANRôle
100dns-failovergalahad192.168.1.30AdGuard secondaire + sonde penny — Tailscale guardian
101logslancelot192.168.1.31Loki + Grafana + Prometheus + relais ntfy
102vaultgalahad192.168.1.32Vaultwarden
103pbslancelot192.168.1.33Proxmox Backup Server
104zomboidgalahad—Détruit le 2026-11-01 (serveur Project Zomboid inutilisé, sauvegarde finale protégée sur PBS)
105sucrelancelot—Détruit le 2026-11-03 (arrêté depuis le 2026-08-25, remplacé par Pulse Patrol) — voir Bilan et arrêt
106pulsegalahad192.168.1.34Pulse (supervision Proxmox + Docker)
107waterlinegalahadDHCPServeur de test du mod Waterline
108ci-runnerlancelotDHCPRunner Forgejo Actions (aarch64)
109iptvgalahad192.168.1.37IPTVnator + passerelle Freebox → HLS (GPU passé au LXC)
110securolancelot—Détruit le 2026-11-03 : évaluation de Securo (agrégateur financier) abandonnée pour le moment

Les LXC 105 et 110 ont chacun une sauvegarde finale protégée sur PBS (ct/105/2026-11-03T09:50:19Z, ct/110/2026-11-03T09:50:44Z) : les relancer, c'est restaurer cette sauvegarde et reprendre leur déclaration Terraform dans l'historique de homelab-config.

Note d'isolement : vault et logs sont sur des hosts différents (galahad vs lancelot) — si un node tombe, on ne perd pas simultanement les secrets ET les logs.

Acces distant​

MéthodeDétail
TailscaleVPN mesh, acces a tous les services via IP Tailscale (100.64.0.0/10)
Tailscale SSHMode check (navigateur MFA), certs auto-rotated, pas de port 22 exposé

Services réseau (ports ouverts)​

Relevé sur penny le 2026-09-24 (iptables -L INPUT -n), sauf les deux lignes SSH des nœuds PVE qui concernent leurs propres pare-feux.

ServicePortProtocoleScope firewall
AdGuard DNS53TCP/UDPTous
AdGuard DoT853TCPTous — mais rien n'écoute derrière, voir ci-dessous
Traefik HTTP → HTTPS80TCPTous
Traefik HTTPS443TCPTous
SSH penny2806TCPTous (clé obligatoire)
SSH galahad2807TCPTous (clé obligatoire, pare-feu de galahad)
SSH lancelot2808TCPTous (clé obligatoire, pare-feu de lancelot)
AdGuard UI3000TCPLAN + Tailscale
node-exporter9100TCPLAN (scrape par le Prometheus de la LXC 101)
NFS rpcbind111TCP/UDPLAN + Tailscale (export du datastore PBS)
NFS2049TCPLAN + Tailscale (export du datastore PBS)
corosync-qnetd5403TCPLAN + Tailscale — voir cluster et QDevice

La politique de la chaîne INPUT est bien DROP : tout le reste est refusé.

Le port 853 est ouvert sur un service éteint

La règle existe, mais AdGuard ne sert pas DNS-over-TLS : tls.enabled: false dans AdGuardHome.yaml, et rien n'écoute sur 853.

Deux conséquences, opposées et toutes deux gênantes. Un client configuré en DoT vers penny échouera, sans que le tableau ci-dessus l'ait laissé prévoir. Et une règle ouverte sans service derrière est une ligne de pare-feu qu'on croit justifiée : le jour où quelque chose se met à écouter sur 853, il est exposé sans décision.

Volumes et configuration​

Bind mounts (configs versionnees), relevés le 2026-09-24 :

/mnt/ssd/config/traefik/ → /config (Traefik)
/mnt/ssd/config/authelia/ → /config (Authelia)
/mnt/ssd/config/homepage/ → /app/config (Homepage)
/mnt/ssd/config/crowdsec/ → /etc/crowdsec (CrowdSec)
/mnt/ssd/config/adguard/adguard-prod-1/ → /opt/adguardhome/conf (AdGuard)
/mnt/ssd/config/ntfy/server.yml → /etc/ntfy/server.yml ro (ntfy)
/mnt/ssd/config/logs/logs-replica-1/loki-config.yml → /etc/loki/local-config.yaml ro
AdGuard a un niveau de plus que les autres

Le chemin est adguard/adguard-prod-1/, pas adguard/ — le sous-répertoire distingue l'instance primaire de la config du secondaire (LXC 100). Un sed lancé sur adguard/ en croyant viser la config touche les deux.

Docker volumes (données) réellement montés :

traefik-certs / traefik-data — Certificats + logs d'acces (lus aussi par CrowdSec)
adguard-data — Donnees AdGuard
crowdsec-data — Base des decisions CrowdSec
ntfy-data — Messages et jetons ntfy
loki-replica-data — Replica du Loki de la LXC 101
Deux jeux de volumes coexistent, un seul sert

docker volume ls rend les mêmes noms sous deux préfixes, config_ et docker_ : une trace d'un changement de nom de projet Compose. Les volumes vivants sont les config_* — sauf CrowdSec, qui tourne sur docker_crowdsec-data pendant que config_crowdsec-data traîne à vide.

Le danger n'est pas docker volume prune, qui ne touche que les volumes inutilisés et laisserait donc docker_crowdsec-data tranquille. C'est le ménage manuel : quelqu'un qui voit deux préfixes, en déduit que les docker_* sont l'ancienne série et lance docker volume rm docker_… détruit la base CrowdSec, seule exception de la série.

Toujours vérifier le nom réellement monté avant de supprimer :

docker inspect crowdsec --format '{{range .Mounts}}{{.Name}} {{end}}'

Variables d'environnement​

Les secrets ne vivent pas en clair dans le dépôt. /mnt/ssd/config/.env est un lien symbolique vers /run/homelab/.env — donc sur un tmpfs, donc perdu à chaque redémarrage, ce qui est voulu. La source de vérité est /mnt/ssd/config/.env.enc, scellé par sops (clé age sur penny), et scripts/homelab-unseal.sh le matérialise au démarrage.

.env.enc → versionné, chiffré (la source)
.env → /run/…/.env → tmpfs, en clair, éphémère (ce que Compose lit)

Conséquence pratique : un docker compose lancé avant le descellement voit un .env vide, et les conteneurs démarrent sans leurs variables. En cas de doute, vérifier par docker exec <conteneur> printenv, jamais en lisant le fichier.

Compose interpole aussi les env_file

Depuis Compose 2.24, un $ dans une valeur d'env_file est interprété. Un hash bcrypt y perd un segment en silence — doubler les $.

Ce que le fichier porte : les identifiants Cloudflare du challenge DNS de Traefik, la clé d'enrôlement Tailscale, et les jetons de lecture des widgets Homepage (AdGuard, Proxmox, Pulse). L'inventaire nominatif est dans la politique de sécurité — cette page ne le duplique pas, pour n'avoir qu'un seul endroit à tenir à jour.