Vue d'ensemble

Documentation Infrastructure OBBConnect — Montréal

Version
v6.8 — 21 July 2026
Serveur
homeserver · 10.10.1.21
Matériel
GMKtec NucBox K8 Plus · AMD Ryzen 7 8845HS · 32 Go · 1 To SSD
OS
Ubuntu 24.04.4 LTS Server · Kernel 6.8.0-136-generic
Réseau
UniFi Dream Machine SE · VLAN 1/30/50/60
Domaine
obbconnect.net · Cloudflare Zero Trust : obbconnect
Audit sécurité 05/04/2026 complété. HomeKit filtré 07/04/2026. Rapport Graylog Intelligent déployé 10/04/2026. Harmony Hubs intégrés HA 10/04/2026. TR-004U migré NAS Storage Mode 09/04/2026. Vault épinglé (1.17.6 le 15/04/2026, aujourd'hui 1.21.4). 1641 — WiZ Entrée 1+2 intégrés HA + automation crépuscule (19/04/2026). Sensibo Air Pro x3 + ConnectLife THZEWIFI x3 intégrés. Architecture: Sensibo=capteurs ambiants, ConnectLife=commandes. Google Weather remplace Met.no (19/05/2026). Confort Climatique v5: humidex, cible été dynamique, fan_mode low, rééval 5min, hystérésis météo 0.4°C (19/05/2026). Admin VLAN migré 192.168.1.0/24 → 10.10.1.0/24 (20/05/2026). Python Matter Server déployé + Claude Code opérationnel sur homeserver — API UniFi UDM-SE via Vault obbconnect/unifi-mcp (04/06/2026). NTP recentralisé sur NAS 10.10.1.60 post-renumération réseau — homeserver, Pi + DHCP UniFi (Default/IoT/Apt) corrigés (09/06/2026). Confort Climatique v5 finding 3 corrigé (ordre choose: turn_off×4 avant rattrapage fan). Rename sensor.aire_ouverte_temperature_feels_like_2 → sans suffixe _2 (11/06/2026). Agent de maintenance nocturne déployé, Phases 1 à 6 : diagnostic + actions correctives bornées sur allowlist validée, notification Telegram via n8n, timer systemd quotidien 04:15 America/Montreal (21/07/2026). Inventaire Docker audité — 19 conteneurs : stack Zigbee2MQTT + Mosquitto + ESPHome + OTBR (Thread) documenté ; Apple TV (10.10.1.168/.169) et Grafana (NAS 10.10.1.60:3000) corrigés (21/07/2026).
Document de référence opérationnelle pour l'administration du homeserver domotique OBBConnect. Généré automatiquement — toujours à jour.
Section 1

Inventaire des machines

Rôles et adresses IP de chaque équipement

MachineIPVLANRôle
homeserver (GMKtec NucBox K8 Plus)10.10.1.21VLAN 1 AdminMini PC principal · AMD Ryzen 7 8845HS · 32 Go · 1 To · Héberge tous les conteneurs Docker · Refroidissement : dual-fan Hyper Ice Chamber 2.0 (CPU Fan + System Fan) · BIOS Full Speed abaissé à 65°C (10/04/2026)
QNAP TS-435XeU10.10.1.60VLAN 1 AdminNAS — sauvegardes automatiques SMB, serveur NTP primaire (stratum 9, UDP/123), Grafana :3000. TR-004U : Storage Pool 2 (External RAID), Volume VOL_TR004U 21.61 TB, partages FILMS / TV_SHOWS / IPHONE_OBB
Raspberry Pi 410.10.1.70VLAN 1 AdminMonitoring températures rack — Prometheus + Pushgateway + Node Exporter. Grafana hébergé sur le NAS (10.10.1.60:3000)
UDM-SE10.10.1.1VLAN 1 AdminUniFi Dream Machine SE — routeur/firewall, VLANs, WireGuard
CyberPower UPS10.10.1.62VLAN 1 AdminOnduleur CP1500PFCLCDa — monitoring batterie, interface web, alertes Uptime Kuma
MacBook ProDHCPVLAN 1 AdminPoste d'administration — SSH ed25519 via 1Password + Touch ID
Section 2

Services Docker — homeserver

19 conteneurs · Structure normalisée /opt/docker/[service]/

Tous les services sont dans /opt/docker/[service]/docker-compose.yml. Structure normalisée le 05/04/2026.
19 conteneurs en exécution — le stack Graylog compte pour 3 conteneurs distincts (graylog + mongodb + opensearch).
ConteneurImagePort(s)Dossier composeURL externe
homeassistantghcr.io/home-assistant/home-assistant:2026.68123/opt/docker/homeassistant/ha-ext.obbconnect.net
music-assistantghcr.io/music-assistant/server:2.98095/8097/opt/docker/music-assistant/ma-ext.obbconnect.net
matter-serverghcr.io/home-assistant-libs/python-matter-server:8.15580 (WS, host net)/opt/docker/matter-server/— (ws://localhost:5580/ws)
zigbee2mqttkoenkk/zigbee2mqtt:latest8080 (frontend, réseau iot)/opt/docker/zigbee2mqtt/
mosquittoeclipse-mosquitto:21883 (MQTT, réseau iot)/opt/docker/mosquitto/
esphomeesphome/esphome:2026.66052/opt/docker/esphome/
otbropenthread/otbr:latest— (host net, /dev/zbt2-matter)/opt/docker/otbr/
portainerportainer/portainer-ce:latest9000/opt/docker/portainer/
adguardhomeadguard/adguardhome:latest53/3000/opt/docker/adguard/
nginx-proxy-managerjc21/nginx-proxy-manager:latest80/443/81/opt/docker/nginx-proxy-manager/
graylog (stack)graylog/graylog:7.0 + mongo:8.0.26 + opensearch:29001/opt/docker/graylog/
n8ndocker.n8n.io/n8nio/n8n:2.23.45678/opt/docker/n8n/
vaulthashicorp/vault:1.21.48200 (publié sur 10.10.1.21)/opt/docker/vault/
cloudflare-ddnsfavonia/cloudflare-ddns:1/opt/docker/cloudflare-ddns/
cloudflaredcloudflare/cloudflared:latestTunnel ZT
watchtowernickfedor/watchtower:1.18.1/opt/docker/watchtower/
uptime-kumalouislam/uptime-kuma:13001/opt/docker/uptime-kuma/
Port 8097 requis pour Music Assistant (streamserver Sonos) — règle firewall IoT → homeserver distincte du port 8095.
Stack domotique Matter / Thread / Zigbeematter-server (host network, WS :5580) + otbr (OpenThread Border Router, host network, radio /dev/zbt2-matter) + zigbee2mqtt (frontend :8080) relié à mosquitto (broker MQTT :1883). esphome (:6052) pour les capteurs custom.

Réseaux Docker

Réseau DockerSubnetUsage
nginx-proxy-manager_default172.19.0.0/16NPM, AdGuard, Graylog, cloudflared, n8n, Vault
bridge (défaut)172.17.0.0/16Portainer, Watchtower, Uptime Kuma
iotzigbee2mqtt, mosquitto — bus domotique isolé
esphome_defaultesphome
hosthomeassistant, music-assistant, matter-server, otbr — utilisent directement l'IP du homeserver
Les IPs Docker (172.19.x.x) changent à chaque reboot. NPM doit toujours pointer vers les noms de conteneurs, jamais vers des IPs Docker.
Section 3

Réseau & VLANs

UniFi Dream Machine SE · Zones firewall

VLANNomSubnetÉquipements / Usage
VLAN 1Admin10.10.1.0/24homeserver, NAS, Pi, UDM-SE, UPS, MacBook Pro. DNS : 10.10.1.21
VLAN 30IoT192.168.30.0/24Sonos, Philips Hue, Lutron, Apple TV, Shelly EM (à venir)
VLAN 50GuestTHE INVADERS — réseau invités isolé
VLAN 60Apt192.168.60.0/241641 — appartement isolé. Sensibo: .30-.32 · ConnectLife THZEWIFI: .33-.35 · Lutron Bridge Pro: .10 · Apple TV: .20 · WiZ: .40-.49

Règles firewall IoT → homeserver

RègleProtoPortDestinationRaison
ALLOW IoT → HATCP812310.10.1.21Home Assistant API
ALLOW IoT → MA APITCP809510.10.1.21Music Assistant commandes
ALLOW IoT → MA StreamTCP809710.10.1.21Sonos streamserver audio

Synchronisation NTP

Correctif NTP post-renumération réseau (09/06/2026) — la migration 192.168.1.x → 10.10.1.x avait laissé les clients pointés sur l'ancien serveur 192.168.1.60 (mort). Source NTP recentralisée sur le NAS 10.10.1.60. Dérive de −24,4 s sur homeserver résorbée (offset désormais −5,4 ms).
HôteIPConfigurationStatut
NAS QNAP (source)10.10.1.60Serveur NTP interne — UDP/123, stratum 9Opérationnel
homeserver10.10.1.21/etc/systemd/timesyncd.conf → NTP=10.10.1.60 (était 192.168.1.60)offset −5,4 ms
Raspberry Pi10.10.1.70/etc/systemd/timesyncd.conf → NTP=10.10.1.60 (ligne #NTP= décommentée)NTPSynchronized=yes
UniFi DHCPNTP Server 10.10.1.60 — réseaux Default (Admin), IoT (VLAN30), Apt (VLAN60)Guest : sans NTP interne (appareils de passage)
Les ~20 appareils IoT non accessibles en SSH récupèrent la nouvelle config NTP au renouvellement de leur bail DHCP — automatique sous 24 h pour le VLAN IoT (lease 86400 s).
Section 4

Règles UFW — homeserver

Audit sécurité 05/04/2026 · Règles ciblées par port et subnet

Audit UFW 05/04/2026 — règles larges ALLOW Anywhere depuis LAN et IoT supprimées. DNS port 53 restreint aux 4 subnets légitimes. Toutes les règles sont maintenant ciblées par port et subnet.
RègleActionSourceCommentaire
22/tcpALLOW10.10.1.0/24SSH — Admin VLAN uniquement
8123/tcpALLOW10.10.1.0/24Home Assistant — Admin VLAN
8123/tcpALLOW192.168.30.0/24Home Assistant — IoT VLAN
8123/tcpALLOW172.16.0.0/12Home Assistant — réseaux Docker
9000/tcpALLOW10.10.1.0/24Portainer — Admin VLAN
9001/tcpALLOW10.10.1.0/24Graylog UI — Admin VLAN
5140/tcp+udpALLOW10.10.1.0/24Graylog Syslog — Admin VLAN
3000/tcpALLOW10.10.1.0/24AdGuard UI — Admin VLAN
81/tcpALLOW10.10.1.0/24NPM Admin — Admin VLAN
80/tcp · 443/tcpALLOWAnywhereNPM HTTP/HTTPS
53/tcp+udpALLOW10.10.1.0/24AdGuard DNS — Admin VLAN
53/tcp+udpALLOW192.168.30.0/24AdGuard DNS — IoT VLAN
53/tcp+udpALLOW192.168.2.0/24AdGuard DNS — WireGuard VPN
53/tcp+udpALLOW172.16.0.0/12AdGuard DNS — Docker networks
21064ALLOW10.10.1.0/24HomeKit Bridge — Admin VLAN
AnywhereALLOW192.168.2.0/24WireGuard VPN clients — accès admin complet
8095/tcpALLOW192.168.30.0/24Music Assistant API — IoT VLAN Sonos
8097/tcpALLOW192.168.30.0/24Music Assistant Streamserver — IoT VLAN Sonos
8095/tcpALLOW172.19.0.0/16Music Assistant — NPM Docker
5678/tcpALLOW172.19.0.0/16n8n — NPM Docker
2375/tcpALLOW172.19.0.0/16Docker API — n8n
22/tcpALLOW172.19.0.0/16SSH — n8n Docker network
3001/tcpALLOW10.10.1.0/24Uptime Kuma — Admin VLAN
Section 5

Accès distant

VPN · Cloudflare Zero Trust · Tunnels SSH · Claude Code

MéthodePortéeDétailsUsage
SSH directLocal + VPNssh homeserver — ed25519 via 1Password + Touch IDAdministration système, Docker CLI, Claude Code
VS Code Remote SSHLocal + VPNExtension Remote-SSH → homeserver 10.10.1.21Claude Code interactif, édition configs, terminal intégré
WireGuard VPNDistantvpn.obbconnect.net:51820 — split-tunnel subnets LANAccès complet LAN depuis l'extérieur
Cloudflare Zero TrustDistant sans VPNTunnel chiffré — policy Accès OBB (Tutanota, 1 mois)ha-ext, nas-ext, ups-ext, ma-ext
Nabu CasaDistant (fallback)Compte iCloud — Alexa + Google AssistantApps mobiles HA, assistants vocaux
Tunnels SSHLocal + VPNssh -N tunnel-[service] — 7 tunnels configurésSecours si NPM ou VPN indisponible

Tunnels SSH Mac

Alias SSHPort localURL après tunnel
tunnel-ha18123http://localhost:18123
tunnel-portainer19000http://localhost:19000
tunnel-adguard13000http://localhost:13000
tunnel-graylog19001http://localhost:19001
tunnel-nas18080http://localhost:18080
tunnel-vault18200http://localhost:18200/ui
tunnel-n8n15678http://localhost:15678
Toujours fermer le tunnel avec Ctrl+C après utilisation.

WireGuard VPN

ParamètreValeur
Domainevpn.obbconnect.net (Cloudflare DNS only, TTL 2 min)
Port51820/UDP
Subnet VPN192.168.2.0/24 — gateway 192.168.2.1
ClientsOBB24 (192.168.2.2), MacBook Pro OBB (192.168.2.3), CLIENT_NAS_CATH (192.168.2.4)
Split-tunnel192.168.2.0/24 + 10.10.1.0/24 + 192.168.30.0/24
Fix 27/03/2026 : route statique 192.168.2.0/24 ajoutée dans /etc/netplan/50-cloud-init.yaml + règle UFW ALLOW from 192.168.2.0/24. Admin VLAN migré vers 10.10.1.0/24 le 20/05/2026 (le split-tunnel route désormais 10.10.1.0/24, plus 192.168.1.0/24).

Claude Code — Administration IA

Claude Code sur homeserver — Installé (/usr/local/bin/claude, projet ~/claude-obbconnect/). Accès via VS Code Remote SSH ou terminal SSH. Token Anthropic via Vault dans l'environnement. CLAUDE.md avec règles de sécurité opérationnelles. API UniFi UDM-SE via Vault obbconnect/unifi-mcp.
Section 6

Nginx Proxy Manager

Certificat SSL wildcard *.obbconnect.net · Proxy hosts par nom

ParamètreValeur
Ports exposés80 (HTTP), 443 (HTTPS), 81 (interface admin)
Certificat SSLWildcard *.obbconnect.net — Let's Encrypt + Cloudflare DNS
Expiration cert.21 juin 2026 — renouvellement automatique cron 3h15 via Certbot
Compose/opt/docker/nginx-proxy-manager/docker-compose.yml
Certbot config/opt/docker/certbot/config/
Cert NPM/opt/docker/nginx-proxy-manager/letsencrypt/live/npm-1/

Proxy Hosts HTTPS actifs

URL publiqueBackend (nom conteneur)Service
ha.obbconnect.nethomeassistant:8123Home Assistant
ma.obbconnect.net172.17.0.1:8095Music Assistant (host network)
portainer.obbconnect.netportainer:9000Portainer Docker
adguard.obbconnect.netadguardhome:3000AdGuard Home
graylog.obbconnect.netgraylog:9001Graylog logs
n8n.obbconnect.netn8n:5678n8n automatisation
npm.obbconnect.net127.0.0.1:81NPM interface admin
vault.obbconnect.netvault:8200HashiCorp Vault (Docker interne)
nas.obbconnect.net10.10.1.60:443QNAP NAS
grafana.obbconnect.net10.10.1.60:3000Grafana NAS
ups.obbconnect.net10.10.1.62CyberPower UPS
Tous les proxy hosts utilisent les noms de conteneurs (ex: vault, adguardhome) — jamais les IPs Docker qui changent après reboot.
Section 7

Cloudflare DNS & Zero Trust

obbconnect.net · Plan Free · team: obbconnect

Entrées DNS actives

Sous-domaineTypeCibleProxyNotes
vpnA70.24.246.252DNS onlyWireGuard — IP WAN Bell, MAJ par cloudflare-ddns
ha / portainer / graylog / adguard / ma / npm / n8n / vaultA10.10.1.21DNS onlyServices homeserver via NPM
nasA10.10.1.60DNS onlyQNAP NAS via NPM
grafanaA10.10.1.60DNS onlyGrafana NAS — accès direct port 3000
upsA10.10.1.21DNS onlyCyberPower UPS — via NPM proxy
homeCNAMEobbconnect-home.pages.devProxiedDashboard Cloudflare Pages
docsCNAMEobbconnect-home.pages.devProxiedDocumentation Cloudflare Pages

Tunnels Zero Trust exposés

URL externeBackendNotes
ha-ext.obbconnect.nethomeassistant:8123trusted_proxies 172.19.0.0/16 dans HA
nas-ext.obbconnect.net10.10.1.60 (HTTPS+NoTLS)Accès NAS externe
ups-ext.obbconnect.net10.10.1.62Accès UPS externe
ma-ext.obbconnect.nethomeassistant:8095Accès Music Assistant externe
Politique Access "Accès OBB" — email Tutanota uniquement, session 1 mois. Portainer NON exposé via tunnel. vault.obbconnect.net résout en IP privée uniquement.
Section 8

Home Assistant

Domotique centrale · HACS · Mushroom Cards · Kiosk Mode

IntégrationBridge / IPVLANNotes
Philips HueHue Bridge ProIoT 30Intégration native HA
Lutron CasetaBridge ProIoT 30Intégration native HA
SonosIPs manuellesIoT 30IPs fixes dans configuration.yaml HA — mDNS ne traverse pas les VLANs
Google CastAuto-discoveryAdmin 1Nest Hub, Chromecast, TV Streamer
Apple TV Salon10.10.1.168Admin 1Hub HomeKit cross-VLAN — ATV SALON (Apple TV 4). Post-migration Admin VLAN 20/05/2026
Apple TV Loft10.10.1.169Admin 1ATV-LOFT (Apple TV 4). Post-migration Admin VLAN 20/05/2026
HomeKit BridgePort 21064Admin 1iPhone → ATV Salon → HASS Bridge → HA → IoT. Domaines exposés : light, climate, cover, switch, remote, sensor, media_player. Limite 150 appareils — scene/button/automation exclus (07/04/2026)
Python Matter Serverws://localhost:5580/wsAdmin 1Conteneur matter-server (image :8.1, host network). Border router Thread via OTBR (openthread/otbr). Déployé 04/06/2026.
Zigbee2MQTT10.10.1.21:8080Admin 1Passerelle Zigbee → MQTT. Frontend web :8080 (réseau Docker iot). Broker : mosquitto (eclipse-mosquitto:2, :1883).
Nabu CasaCloud (iCloud)Alexa + Google Assistant. 0 entité exposée volontairement
WiZ 1641 — Entrée192.168.60.40 / .41Apt 60UDP 38899 (HA→WiZ) + 38900 (WiZ→HA). Firewall UniFi: Internal→WiZ + WiZ→HA. Automation crépuscule: fade 100%→50% sur golden/blue hour, 50% nuit, météo le jour. Terminal : commande WIZ (homeserver) — deploy via scripts/wiz/deploy_wiz.sh
Sensibo Air Pro — 1641 Chambre Gauche192.168.60.30Apt 60climate.chambre_gauche. AirQ (CO2, TVOC, feels_like). Capteurs ambiants uniquement — commandes via ConnectLife. MAC: 90:15:06:5F:8C:A0.
Sensibo Air Pro — 1641 Chambre Droite192.168.60.31Apt 60climate.chambre_droite. AirQ (CO2, TVOC, feels_like). Capteurs ambiants uniquement — commandes via ConnectLife. MAC: 10:06:1C:50:8B:84.
Sensibo Air Pro — 1641 Aire Ouverte192.168.60.32Apt 60climate.aire_ouverte. AirQ (CO2, TVOC, feels_like). Capteurs ambiants uniquement — commandes via ConnectLife.
ConnectLife THZEWIFI — 1641 Chambre Gauche192.168.60.33Apt 60climate.chambre_gauche_wifi. Module WiFi interne Zephyr. HACS oyvindwe/connectlife-ha v0.34.0. Commandes: hvac_mode, temperature, fan_mode. MAC: e4:e3:3d:27:7f:fb.
ConnectLife THZEWIFI — 1641 Chambre Droite192.168.60.34Apt 60climate.chambre_droite_wifi. Module WiFi interne Zephyr. HACS oyvindwe/connectlife-ha v0.34.0. Commandes: hvac_mode, temperature, fan_mode. MAC: e4:e3:3d:27:7f:e3.
ConnectLife THZEWIFI — 1641 Aire Ouverte192.168.60.35Apt 60climate.aire_ouverte_wifi. Module WiFi interne Zephyr. HACS oyvindwe/connectlife-ha v0.34.0. Commandes: hvac_mode, temperature, fan_mode. MAC: e4:e3:3d:27:7f:11.
Google Weather — Maison-Cloudsensor.maison_temperature, sensor.maison_apparent_temperature, sensor.maison_humidite. Intégration native HA 2025.12. Clé API: 1Password 'Google Weather API Key — HomeAssistant'. Remplace Met.no pour Confort Climatique.
Music Assistant8095 / 8097IoT 30Sonos multi-pièces — port 8097 streamserver

Assistants vocaux

AssistantMéthodeStatus
Amazon AlexaSkill 'Home Assistant' via Nabu CasaActif
Google AssistantSkill 'Home Assistant Cloud by Nabu Casa'Actif
Synthèse vocale HABrigitteNeural — françaisActif
trusted_proxies resserré à 172.19.0.0/16 (réseau Docker NPM uniquement) — audit 05/04/2026.
Section 9

HashiCorp Vault

Gestionnaire de secrets machine · Isolé réseau Docker · AWS KMS

ParamètreValeur
Image Dockerhashicorp/vault:1.21.4 — épinglée (épinglage depuis 15/04/2026, latest incompatible kernel Ubuntu)
Compose/opt/docker/vault/docker-compose.yml
Config/opt/docker/vault/config/vault.hcl
Secrets AWS KMS/opt/docker/vault/vault.env (chmod 600, root)
Port bindingPublié sur 10.10.1.21:8200 (VLAN Admin) — ⚠ inverse le durcissement du 05/04/2026 qui avait retiré l'exposition host ; vérifier que c'est intentionnel
api_addrhttp://10.10.1.21:8200
Auto-unsealAWS KMS — us-east-2
Accès HTTPShttps://vault.obbconnect.net (via NPM, nom conteneur vault)
Accès tunnel SSHssh -N tunnel-vault → http://localhost:18200/ui
Accès CLI (host)export VAULT_ADDR=http://10.10.1.21:8200 puis vault [commande] (CLI natif /usr/bin/vault, token ~/.vault-token). 127.0.0.1:8200 ne répond pas
Emergency Kit1Password : Vault — Emergency Kit — homeserver
Contrôles routiniers Vault :
1. dig vault.obbconnect.net +short → doit retourner IP privée (10.10.1.21) uniquement
2. docker ps | grep vault → affiche 10.10.1.21:8200->8200/tcp (port publié sur l'IP admin)
3. curl -s http://10.10.1.21:8200/v1/sys/health → répond (Vault écoute sur l'IP admin — exposition à revalider vs durcissement 05/04/2026)

Secrets engines actifs

CheminTypeContenu
obbconnect/backup/unifiKVUNIFI_PASS — mot de passe UniFi pour scripts backup
obbconnect/backup/rcloneKVaccount, key, crypt_password, crypt_password2 — Backblaze B2
obbconnect/ai/anthropicKVapi_key — Clé API Claude — workflows n8n + Claude Code homeserver
obbconnect/graylog/configKVCredentials Graylog
obbconnect/network/cloudflare-ddnsKVToken Cloudflare DDNS
obbconnect/network/unifi-proxyKVCredentials UniFi proxy — REGIE-PI
obbconnect/unifi-mcpKVapi_key, host, site_id — API Key UniFi mcp-service — Claude Code accès UDM-SE

Architecture secrets OBBConnect

Règle fondamentale : un humain tape le secret → 1Password. Un processus lit le secret → Vault.
CoffreTypeContenu
1PasswordHumainLogins, SSH keys, accès admin, emergency kits, credentials cloud
HashiCorp VaultMachineTokens API, credentials scripts, secrets Docker, rclone B2
Section 10

n8n — Automatisation

Workflows · Rapport Graylog Intelligent · Ops Advisor v4 · Telegram

ParamètreValeur
Port5678
Compose/opt/docker/n8n/docker-compose.yml
Données/opt/docker/n8n/data/ (bind mount — migré de volume anonyme 05/04/2026)
Accès HTTPShttps://n8n.obbconnect.net
Tunnel SSHssh -N tunnel-n8n → http://localhost:15678

Workflows actifs

WorkflowDéclencheurAction
🔴 Alerte Docker - Services DownCron toutes les 5 minDocker TCP API → Telegram si service down
🧠 Rapport Graylog Intelligent - OBBConnectCron 7h00Graylog API → Claude #1 (analyse + commandes SSH) → SSH homeserver → Claude #2 (décision) → Switch action → Telegram
⚙️ Graylog → Claude Ops Advisor v4Webhook /webhook/graylog-alertClaude → analyse → action Docker ou SSH Pi
🌙 Agent de maintenance nocturne (maintNocturneOBB1)Webhook depuis night_check.sh — 04:15Rapport quotidien + alertes actions correctives → Telegram (fallback log local si injoignable)

Ops Advisor v4 — Actions supportées

ActionMéthodeCible
restart_homeassistantDocker API 172.19.0.1:2375Conteneur homeassistant
restart_musicassistantDocker API 172.19.0.1:2375Conteneur music-assistant
restart_nginxDocker API 172.19.0.1:2375Conteneur nginx-proxy-manager
restart_adguardDocker API 172.19.0.1:2375Conteneur adguardhome
restart_graylogDocker API 172.19.0.1:2375Conteneur graylog
reboot_piSSH credential SSH Private Key pi10.10.1.70

Credentials SSH

Credential n8nCibleUsage
SSH Private Key Homeadmin10.10.1.21 (homeadmin)Rapport Graylog Intelligent — diagnostics SSH
SSH Private Key pi10.10.1.70 (pi)Ops Advisor v4 + Rapport Intelligent reboot Pi
Section 11

Dashboard

home.obbconnect.net · Cloudflare Pages · GitHub

ParamètreValeur
URLhttps://home.obbconnect.net
ProtectionCloudflare Access — OTP email Tutanota, session 1 mois
HébergementCloudflare Pages — déploiement auto à chaque git push
Repo GitHubgithub.com/olivierbb73/obbconnect-home (privé)
Clone local Mac~/Documents/obbconnect-home/
ÉditeurVS Code + Claude Code — NE PAS utiliser TextEdit (corrompt UTF-8)
Structure reposcripts/ · dist/ · assets/ · docs/ · index.html · CLAUDE.md
Scripts actifsscripts/generate/ → docs.html · scripts/glossaire/ → glossaire.html · scripts/network/ → network.html · scripts/wiz/ → WIZ (homeserver) · scripts/sensibo/ → SENSIBO (homeserver)
Imagesassets/images/ — dossier unique (sources/ supprimé)
Documentation webhome.obbconnect.net — nav → /dist/docs.html · /dist/glossaire.html · /dist/network.html

Workflow mise à jour doc

# 1. Modifier le script via Claude Code (VS Code) ou directement
# Les scripts sont dans scripts/generate|glossaire|network/

# 2. Régénérer les HTML
python3 ~/Documents/obbconnect-home/scripts/generate/generate_current.py
python3 ~/Documents/obbconnect-home/scripts/glossaire/glossaire_current.py
python3 ~/Documents/obbconnect-home/scripts/network/network_current.py

# 3. Pousser sur GitHub
cd ~/Documents/obbconnect-home && git add -A && git commit -m '...' && git push origin main

# OU utiliser update-obbdoc (place les scripts versionnés dans ~/Downloads/)
update-obbdoc
Ne jamais éditer dist/ directement. HTML générés par les scripts Python. Images dans assets/images/ — dossier unique.

Tuiles actives

ServiceImageLiens
Home Assistantha.pngLocal + HTTPS + Tunnel CF + SSH tunnel
Music Assistantma.pngLocal + HTTPS + Tunnel CF
Portainerportainer.pngLocal + HTTPS + SSH tunnel
AdGuard Homeadguard.pngLocal + HTTPS + SSH tunnel
Nginx Proxy Managernpm.pngLocal + HTTPS
Cloudflarecloudflare.pngdash.cloudflare.com + one.dash.cloudflare.com
Grayloggraylog.pngLocal + HTTPS + SSH tunnel
Grafanagrafana.pngLocal + HTTPS — NAS 10.10.1.60:3000
NAS QNAPnas.pngLocal + HTTPS + Tunnel CF + SSH tunnel
CyberPower UPSups.pngLocal + HTTPS + Tunnel CF
Backblaze B2backblaze.pngsecure.backblaze.com (cloud)
Nabu Casanabucasa.pngaccount.nabucasa.com + HA local
iCloudicloud.pngicloud.com + mail + photos + drive + find + appleid
HashiCorp Vaultvault.pngLocal + HTTPS + SSH tunnel
n8nn8n.pngLocal + HTTPS + SSH tunnel
Section 12

Sauvegardes

Backup quotidien cloud · Backblaze B2 · Certbot auto

ParamètreValeur
FréquenceQuotidienne à 2h00 du matin (cron)
Source/opt/docker/ (toutes les données persistantes)
DestinationBackblaze B2 via rclone + chiffrement
Rétention14 copies — rotation automatique
Certbot renouvellementCron 3h15 — /opt/docker/certbot/
0 2 * * * /usr/local/bin/cloud-backup.sh >> /var/log/cloud-backup.log 2>&1
0 3 * * * /opt/docker/backup-ha.sh >> /var/log/ha-backup.log 2>&1
15 3 * * * docker run --rm -v /opt/docker/certbot/config:/etc/letsencrypt \
  -v /opt/docker/certbot/logs:/var/log/letsencrypt \
  -v /opt/docker/certbot/cloudflare:/cloudflare \
  certbot/dns-cloudflare renew --dns-cloudflare \
  --dns-cloudflare-credentials /cloudflare/credentials.ini --quiet
30 3 * * * docker restart music-assistant
0 3 * * 1 /usr/local/bin/vault-renew-tokens.sh
Section 13

Points de vigilance

Pièges connus · Fixes documentés · Bonnes pratiques

mDNS ne traverse pas les VLANs — Sonos et appareils similaires nécessitent des IPs fixes dans configuration.yaml HA.
NAT WireGuard disparaît après reset modem — Règle persistée via /data/on_boot.d/10-wireguard-nat.sh avec sleep 10.
Route retour VPN homeserver — La route 192.168.2.0/24 doit être dans /etc/netplan/50-cloud-init.yaml pour survivre aux reboots.
Music Assistant — mode host networking — NPM contacte MA via 172.17.0.1:8095. Ports 8095 et 8097 requis depuis VLAN IoT.
Vault — exposé sur l'IP admin — ⚠ Le port 8200 est désormais publié sur 10.10.1.21:8200 (VLAN Admin), ce qui inverse le durcissement du 05/04/2026 (l'audit avait retiré l'exposition host). Accès aussi via vault.obbconnect.net (NPM) et tunnel SSH. Vérifier que l'exposition sur l'IP admin est bien voulue.
Certificat SSL wildcard — *.obbconnect.net expire le 21 juin 2026 — renouvellement auto cron 3h15 via Certbot.
NPM proxy hosts — noms de conteneurs — Toujours utiliser les noms de conteneurs (ex: vault, adguardhome) — les IPs Docker changent après reboot.
TextEdit corrompt UTF-8 — Toujours utiliser VS Code pour éditer index.html. Jamais TextEdit.
Images dashboard — Toujours copier depuis assets/images/ avant git add. Git compare les hash.
TR-004U — NAS Storage Mode uniquement — Ne jamais reconfigurer en External Storage + Software RAID (mdadm+LVM). QTS ne remonte pas ce type de volume automatiquement au boot. Toujours utiliser NAS Storage Mode natif (Storage Pool 2).
GMKtec — ventilateurs non visibles par Linux — Contrôle propriétaire BIOS. Linux ne lit pas les RPM (cat /sys/class/hwmon/hwmon*/fan*_input → vide). Normal. BIOS modifié : Full Speed 85°C → 65°C (10/04/2026). Dual-fan Hyper Ice Chamber 2.0 : CPU Fan (sous carte mère) + System Fan (sous couvercle transparent). CPU sous stress ≤ 48°C.
Vault — image épinglée à 1.21.4 — Ne jamais utiliser hashicorp/vault:latest — incompatible avec le kernel Ubuntu (CAP_SETFCAP bloqué). Toujours épingler une version explicite (actuellement 1.21.4).
Structure Docker normalisée — Tous les services dans /opt/docker/[service]/docker-compose.yml. /home/homeadmin/docker/ supprimé le 05/04/2026.
Claude Code — actions write — Toute modification UniFi/Docker/Vault/config production nécessite confirmation explicite avant exécution. Claude Code tourne sur homeserver (/usr/local/bin/claude v2.1.x, projet ~/claude-obbconnect). Token Anthropic via Vault obbconnect/ai/anthropic.
Vault CLI sur homeserver — Le CLI vault natif est installé sur le host. Le serveur écoute sur 10.10.1.21:8200 (port publié sur l'IP admin — 127.0.0.1:8200 ne répond pas). Usage : export VAULT_ADDR=http://10.10.1.21:8200 puis vault kv list obbconnect (token dans ~/.vault-token). Alternative dans le conteneur : docker exec -e VAULT_ADDR=http://127.0.0.1:8200 vault vault [commande].
Admin VLAN migré 20/05/2026 — Subnet Admin migré de 192.168.1.0/24 vers 10.10.1.0/24 pour résoudre un conflit WireGuard VPN. SSH config Mac, split-tunnel WireGuard, Apple TV et Grafana pointent désormais tous en 10.10.1.x.
NTP — pointer sur 10.10.1.60, jamais 192.168.1.60 — La renumération réseau 192.168.1.x → 10.10.1.x a tué l'ancien serveur de temps 192.168.1.60. Source NTP unique : NAS 10.10.1.60 (stratum 9). Vérifier les clients : timedatectl show -p NTP -p NTPSynchronized + timedatectl timesync-status. Côté UniFi : NTP Server DHCP = 10.10.1.60 sur Default/IoT/Apt.
Section 14

Checklist de santé système

Vérifications rapides après maintenance ou reboot

homeserver (10.10.1.21)

Accès distant

Section 15

Agent de maintenance nocturne

Diagnostic + actions correctives bornées · Timer 04:15 America/Montreal

ParamètreValeur
Répertoire/opt/maintenance-agent/ — dépôt git local, pas de remote distant
Compte de servicesvc-maintenance (uid 996) — sudoers en allowlist stricte de commandes exactes, jamais ALL
HoraireTimer systemd night-maintenance.timer — 04:15 America/Montreal, après la fenêtre des sauvegardes/certbot/cron existants
Mode par défautdry-run — le passage en --live se fait allowlist par allowlist, après validation manuelle d'un run réel
NotificationWorkflow n8n dédié (maintNocturneOBB1) → Telegram. Fallback : rapport écrit en local si n8n injoignable

Politique d'autonomie

ContrôlePolitique
Diagnostic approfondiToujours autorisé, strictement lecture seule (logs, code de sortie, OOMKilled, nombre de redémarrages) — même sur mongodb/opensearch/vault
Restart simpleAutorisé automatiquement sur l'allowlist Tier 1 uniquement — jamais bases de données, jamais Vault (unseal manuel requis)
Réparation bornéeRecréer depuis un docker-compose.yml inchangé, ou revenir à la dernière image fonctionnelle connue — jamais modifier config/volume/données
Reboot completExceptionnel : conditions strictes, jamais plus d'1/24h, jamais si backup/transfert actif, notification systématique
Jamais automatiqueSecrets/comptes, réseau/DNS/pare-feu/Cloudflare/NPM, mises à jour paquets/kernel, Home Assistant, toute commande root arbitraire décidée librement par le modèle

Phases du projet

PhaseContenuÉtat
1Audit lecture seule de l'infrastructure existanteTerminé
2Création des fichiers du projet (script, allowlist, systemd, sudoers, workflow n8n)Terminé
3-4Durcissement + installation (compte de service, sudoers, unités systemd dans /etc)Terminé
5Validation en conditions réelles (--live) sur un conteneur non critique — uptime-kumaTerminé
6Notification Telegram via n8n active, timer nocturne activé (04:15)Terminé
7Politique de reboot complet — brief finalisé, pas encore déployé sur le homeserverÀ venir
Transition en cours : le cron historique 30 3 * * * docker restart music-assistant est conservé temporairement comme filet de sécurité pendant que l'agent bascule en --live sur ce conteneur. À retirer après 2-3 nuits d'observation concluantes.