---
name: shogun-admin
description: Administration du 2e VPS shogun.ovh (Debian 12, Yunohost) — accès SSH + port 2022, secret sudo via coffre pass, supervision DNS (dnsmasq unique + watchdog), alertes ntfy topic vps-shogun, Home Assistant (app YNH, compte bot-oc, token pass, supervision ha-status.sh), commandes Yunohost (user group/permission, pièges stdin sudo), diagnostic journalctl.
---

# Skill: shogun-admin — 2e serveur shogun.ovh

## Quand charger ce skill

Toute intervention sur **shogun.ovh** : maintenance, mise à jour apt, services, DNS, alertes, diagnostic de panne.

## Accès

| Élément | Valeur |
|---|---|
| SSH | `ssh -p 2022 shogun@shogun.ovh` (clé ed25519 du VPS principal déployée) |
| OS | Debian 12 (bookworm), Yunohost, OVH |
| Utilisateur | `shogun` (groupes LDAP : `admins`, `all_users` + groupes d'apps) |
| Sudo | mot de passe **dans le coffre pass** → `opencode/shogun-sudo` |

### Sudo non interactif (jamais affiché)

Le sudo exige un mot de passe (rôle LDAP `admins` → `(root) ALL`). Injection par pipe :

```bash
{ /var/lib/opencode/.local/bin/pass show opencode/shogun-sudo; cat <<'SCRIPT'
# commandes root ici
systemctl status dnsmasq
SCRIPT
} | ssh -p 2022 -o BatchMode=yes shogun@shogun.ovh 'sudo -S -p "" /bin/bash -s'
```

**Piège sudo** : une règle `NOPASSWD` dans `/etc/sudoers.d/` est **écrasée** par le rôle LDAP `admins` (`(root) ALL`, lu après) → inutile, ne pas en recréer (règle `apt-nopasswd` supprimée le 31/10).

## Architecture DNS (point critique)

- **dnsmasq = DNS unique** : `/etc/resolv.conf` → `127.0.0.1` (resolvconf). Si dnsmasq sature/fige → **tout le serveur est sans DNS** (apt compris).
- Config : `/etc/dnsmasq.conf` + `/etc/dnsmasq.d/` (≈ 60 fichiers d'apps Yunohost, spamhaus, `98-limits.conf` = `dns-forward-max=300`).
- Amonts : `/etc/resolv.dnsmasq.conf` (IPv4+IPv6 OK vérifié le 31/10).

### Réflexe en cas de panne apt / timeout réseau

```
1. dig @127.0.0.1 deb.debian.org → timeout = dnsmasq figé
2. systemctl restart dnsmasq  (wedge possible → SIGKILL au bout de 90 s, normal)
3. Vérifier : dig @127.0.0.1 + apt-get update
```

## Supervision en place (depuis le 31/10)

| Élément | Détail |
|---|---|
| **Watchdog** | `/usr/local/sbin/cron-5min-dns-watchdog.sh` + `/etc/cron.d/dns-watchdog` (`*/5`) : `dig @127.0.0.1` **rc≠0** → restart + alerte ntfy. Critère = code retour (NXDOMAIN = sain), jamais le contenu. |
| **Seuil** | `/etc/dnsmasq.d/98-limits.conf` = `dns-forward-max=300` (filet contre le scan PTR horaire de HA). |
| **Alertes ntfy** | serveur de shogun : `https://ntfy.shogun.ovh` (proxy ; interne `127.0.0.1:8086`), topic **`vps-shogun`**. User dédié `watchdog@shogun.ovh` (write-only), secret `/root/.config/ntfy-watchdog.env` (600 root, `curl -K -` via stdin). Lecture : user `guillaume_ryckelynck` (admin). |
| **Rotation logs** | `/etc/logrotate.d/dnsmasq-queries` (daily, 7, copytruncate). |

## Home Assistant (app YNH, depuis 10/11)

| Élément | Valeur |
|---|---|
| App | YNH `homeassistant` — Core 2026.10.4, service systemd `homeassistant`, venv `/var/www/homeassistant/venv/bin/python` (aiohttp OK, **websockets absent**) |
| Local | `http://127.0.0.1:8123` — API REST `/api/*`, WS **`/api/websocket`** (pas `/websocket` = 404) |
| Public | `homeassistant.shogun.ovh` → SSO YNH (302), inutilisable pour un script |
| Compte | **`bot-oc`** (mdp → `pass opencode/bot-oc-ldap`) : permission `homeassistant.main` + groupe `admins` YNH → admin HA via provider LDAP `command_line` (`ynh_ldap-auth.sh`) |
| Token | **`pass opencode/ha-shogun-token`** (LLA créé dans l'UI HA, profil → bas de page) |
| Script | `~/.opencode/bin/ha-status.sh` — état, repairs, unavailable, error_log (injection par substitution, jamais affiché) |

**Auth HA** : le WebSocket `auth` n'accepte que `access_token` (schéma `websocket_api/auth.py`) — username/password = flux OAuth HTTP non utilisé. Le compte HA n'est créé qu'au 1ᵉʳ login LDAP via l'UI.

## Commandes Yunohost 12 — pièges

- **Pas de rename user** → `user delete X --purge --force` + `user create Y …` (les permissions/groupes sont à refaire).
- Groupe : **sous-catégorie** `yunohost user group add <groupe> <user>` (l'option `--group` de `user update` n'existe pas) ; permission : `yunohost user permission add <app>.<perm> <user>`.
- **Stdin volé** : yunohost lit le stdin du script → script distant sur **fd3** : `exec 3<&0` en tête, chaque commande yunohost avec `<&3` sinon « Not a tty » / prompt interactif.
- **Secret distant** : écrire dans `/tmp` (600) **avant** sudo (user `shogun` ne peut pas écrire `/root`), lire après sudo, `rm` en fin de script.
- **Jamais d'SSH parallèle** vers shogun → fail2ban (kex reset) ; exécuter séquentiellement.

## Pièges connus

- **Grist (corrigé 31/10)** : fichiers de `/home/yunohost.app/grist/` possédés par `nocodb` → `SQLITE_READONLY` en boucle (520+ restarts). Fix : `chown -R grist:grist /home/yunohost.app/grist/` — **vérifier le owner après toute réinstall d'app**.
- **Services en échec** (31/10) : `gitlab-runsvdir`, `mongod` — à investiguer si besoin.
- **Flooder TXT 1/s identifié et coupé (01/11)** : module **`dnsmasq` de netdata** (go.d) interrogeait dnsmasq en TXT `*.bind` (format BIND) → fix: `/var/www/netdata/etc/netdata/go.d.conf` = `bind: no` + `dnsmasq: no`. Piège : `go.d.plugin` standalone ne tourne pas sans pipe netdata **et mange le stdin** du script ssh → tests non fiables, passer par désactivation par lots en contexte service.
- **Saturations horaires :44 = Home Assistant** (identifié 01/11) : scan reverse du /24 par le device tracker (pic 341 PTR/s). Bénin → **laissé tel quel**, `dns-forward-max=300` conservé en filet. Traçage retiré (cron `dns-burst-capture` + `99-trace-queries.conf` supprimés).
- **Journald** : 3,9 Go, pas de limite explicite → traces dans fichiers dédiés, jamais dans le journal.
- **`pass`** : binaire `/var/lib/opencode/.local/bin/pass` (pas dans le PATH root) ; depuis root : `HOME=/var/lib/opencode GNUPGHOME=/var/lib/opencode/.gnupg`, ou wrapper `opencode-pass` (VPS principal).

## Voir aussi

Notes : [[04_NOTES/VPS-SHOGUN_HOMEASSISTANT]] · [[04_NOTES/VPS-SHOGUN_APT-DNS]] · skill [[80_CONFIG/IA_SKILLS/Ntfy]] (VPS principal).
