---
tags: [VPS-IA, documentation]
type: note
nature: documentation
univers: PRO
projects:
  - [[03_PROJETS/VPS-IA]]
description: "Index de la documentation du projet VPS-IA : les notes 04_NOTES/VPS-IA_* classées par thème, généré depuis le frontmatter."
---
# Documentation — VPS-IA

Point d'entrée de la documentation technique du [[03_PROJETS/VPS-IA]] : installation, configuration et exploitation du VPS (OpenCode, SilverBullet, MCP, sécurité, automatisation).

**Comment ça marche** : chaque note `04_NOTES/VPS-IA_*` porte en frontmatter `description` (une ligne), `nature: documentation`, `projects: [[03_PROJETS/VPS-IA]]` et **un tag thématique unique**. Les tableaux ci-dessous sont générés par requête : ajouter une note = remplir son frontmatter, elle apparaît toute seule dans sa section.

**Tags thématiques** (classement ici) : `OpenCode` · `MCP` · `SilverBullet` · `Securite` · `Infra` · `Automatisation`. Les autres tags restent libres : ils servent à la recherche, pas au classement.

## OpenCode

*Serveur, agents, mémoire S/M/L, compaction, coûts, sessions.*

${query[[
  from p = index.pages()
  where string.startsWith(p.name, '04_NOTES/VPS-IA_')
    and p.name ~= '04_NOTES/VPS-IA_Documentation'
    and table.includes(p.tags or {}, 'OpenCode')
  order by p.name asc
  limit 50
  select {
    NOTE = "[[" .. p.name .. "|" .. (string.match(p.name, 'VPS%-IA_(.+)') or p.name) .. "]]",
    DESCRIPTION = p.description or "—",
    DATE = string.match(tostring(p.date or ""), '%d%d%d%d%-%d%d%-%d%d') or "—"
  }
]]}

## Infra & serveur

*Disque, fuseau horaire, site Astro, synthèse serveur, Grist.*

${query[[
  from p = index.pages()
  where string.startsWith(p.name, '04_NOTES/VPS-IA_')
    and p.name ~= '04_NOTES/VPS-IA_Documentation'
    and table.includes(p.tags or {}, 'Infra')
  order by p.name asc
  limit 50
  select {
    NOTE = "[[" .. p.name .. "|" .. (string.match(p.name, 'VPS%-IA_(.+)') or p.name) .. "]]",
    DESCRIPTION = p.description or "—",
    DATE = string.match(tostring(p.date or ""), '%d%d%d%d%-%d%d%-%d%d') or "—"
  }
]]}

## MCP

*Serveurs connectés (SilverBullet, Excalidraw, draw.io, Grist) et permissions par agent.*

${query[[
  from p = index.pages()
  where string.startsWith(p.name, '04_NOTES/VPS-IA_')
    and p.name ~= '04_NOTES/VPS-IA_Documentation'
    and table.includes(p.tags or {}, 'MCP')
  order by p.name asc
  limit 50
  select {
    NOTE = "[[" .. p.name .. "|" .. (string.match(p.name, 'VPS%-IA_(.+)') or p.name) .. "]]",
    DESCRIPTION = p.description or "—",
    DATE = string.match(tostring(p.date or ""), '%d%d%d%d%-%d%d%-%d%d') or "—"
  }
]]}

## Sécurité

*Audits, secrets (pass), alertes SSH, garde-fous.*

${query[[
  from p = index.pages()
  where string.startsWith(p.name, '04_NOTES/VPS-IA_')
    and p.name ~= '04_NOTES/VPS-IA_Documentation'
    and table.includes(p.tags or {}, 'Securite')
  order by p.name asc
  limit 50
  select {
    NOTE = "[[" .. p.name .. "|" .. (string.match(p.name, 'VPS%-IA_(.+)') or p.name) .. "]]",
    DESCRIPTION = p.description or "—",
    DATE = string.match(tostring(p.date or ""), '%d%d%d%d%-%d%d%-%d%d') or "—"
  }
]]}

## SilverBullet

*L'espace shizendo : CLI, plein-texte, accès lecture, runtime.*

${query[[
  from p = index.pages()
  where string.startsWith(p.name, '04_NOTES/VPS-IA_')
    and p.name ~= '04_NOTES/VPS-IA_Documentation'
    and table.includes(p.tags or {}, 'SilverBullet')
  order by p.name asc
  limit 50
  select {
    NOTE = "[[" .. p.name .. "|" .. (string.match(p.name, 'VPS%-IA_(.+)') or p.name) .. "]]",
    DESCRIPTION = p.description or "—",
    DATE = string.match(tostring(p.date or ""), '%d%d%d%d%-%d%d%-%d%d') or "—"
  }
]]}

## Automatisation

*Node-RED, bridge Matrix, cas d'usage.*

${query[[
  from p = index.pages()
  where string.startsWith(p.name, '04_NOTES/VPS-IA_')
    and p.name ~= '04_NOTES/VPS-IA_Documentation'
    and table.includes(p.tags or {}, 'Automatisation')
  order by p.name asc
  limit 50
  select {
    NOTE = "[[" .. p.name .. "|" .. (string.match(p.name, 'VPS%-IA_(.+)') or p.name) .. "]]",
    DESCRIPTION = p.description or "—",
    DATE = string.match(tostring(p.date or ""), '%d%d%d%d%-%d%d%-%d%d') or "—"
  }
]]}

## Contrôles

Filets de contrôle : ces deux tableaux doivent rester **vides**. S'ils se remplissent, une note vient d'être créée avec un frontmatter incomplet.

### Notes sans tag thématique

${query[[
  from p = index.pages()
  where string.startsWith(p.name, '04_NOTES/VPS-IA_')
    and p.name ~= '04_NOTES/VPS-IA_Documentation'
    and not table.includes(p.tags or {}, 'OpenCode')
    and not table.includes(p.tags or {}, 'Infra')
    and not table.includes(p.tags or {}, 'MCP')
    and not table.includes(p.tags or {}, 'Securite')
    and not table.includes(p.tags or {}, 'SilverBullet')
    and not table.includes(p.tags or {}, 'Automatisation')
  order by p.name asc
  select {
    NOTE = "[[" .. p.name .. "|" .. (string.match(p.name, 'VPS%-IA_(.+)') or p.name) .. "]]",
    TAGS = table.concat(p.tags or {}, ", ")
  }
]]}

### Notes sans description

${query[[
  from p = index.pages()
  where string.startsWith(p.name, '04_NOTES/VPS-IA_')
    and p.name ~= '04_NOTES/VPS-IA_Documentation'
    and not p.description
  order by p.name asc
  select {
    NOTE = "[[" .. p.name .. "|" .. (string.match(p.name, 'VPS%-IA_(.+)') or p.name) .. "]]"
  }
]]}

## Ajouter une note

1. Créer la note `04_NOTES/VPS-IA_<Sujet>` (dossier imposé par le préfixe).
2. Frontmatter minimal :

```yaml
---
tags: [VPS-IA, <tag thématique parmi les 6 ci-dessus>]
description: "Une ligne : ce que la note couvre et le résultat/choix clé."
nature: documentation
type: note
projects:
  - [[03_PROJETS/VPS-IA]]
date: "YYYY-MM-DD"
---
```

3. Vérifier que la section « Contrôles » est restée vide.
