Token créé dans Gitea (compte mazex, son compte SSO Zitadel). Débloque le serveur MCP gitea (GITEA_ACCESS_TOKEN_FILE) et les opérations git/API sur git.marcpartensky.com, dont le miroir des repos GitHub.
L'ancien câblage ne pouvait pas marcher : client_id littéral "gitea"
(impossible, Zitadel génère les client_id) et oneshot qui échouait à chaque
boot sur --enabled (flag inexistant en Gitea 1.27.x), avalé par `|| true`.
- App Zitadel "Gitea" (projet marcpartensky) : appId 396570385799184684,
clientId 396570385799250220, type Web, redirect
https://git.marcpartensky.com/user/oauth2/zitadel/callback
- oneshot gitea-oidc-init : add-or-update (id de login_source via psql),
secret lu depuis sops à chaque exécution, idempotent même en dérive
- [openid] d'app.ini : OpenID 2.0 legacy, désactivé (sans rapport avec OIDC,
échouait en "rel=openid2.provider not found" avec une URL Zitadel)
- [oauth2_client] : ENABLE_AUTO_REGISTRATION, USERNAME=email,
ACCOUNT_LINKING=login (page de liaison unique pour le compte local marc)
- ressource Pangolin : auth.sso-enabled=false (auth Gitea seule, une seule
couche, clients git/API à token non bloqués par un redirect SSO)
- secrets/gitea-oidc.yml : vrai oidc_client_secret (chiffré, clé tower)
secrets/switch-keys.yml (prod.keys d'Eden sur le deck, posees dans le home de marc) et secrets/headscale.yml (preauth_key reutilisable, consommee par services/tailscale sur tower, le deck et le VPS). Regles de creation sops associees dans .sops.yaml.
Module services/ygg-mesh : Yggdrasil en réseau privé (mot de passe partagé,
clés publiques épinglées), liens Tor via une instance tor dédiée (onion
service par machine) et lien direct multicast prioritaire sur le LAN.
Chaque machine garde une adresse IPv6 stable et un nom <host>.ygg.
Secret dans secrets/ygg-mesh.yml (règle .sops.yaml dédiée) ; config rendue
à chaud au démarrage (ExecStartPre + credential systemd), le mot de passe
ne touche jamais le store. Identités et clés dans la table `nodes`.
stalwart-mcp (Rust) parle JMAP au Stalwart du VPS, patche pour l'URL
API et l'envoi depuis l'identite marc. Mot de passe dedie dans
secrets/stalwart-mcp.yml ; importe par tower seulement, pour eviter
le conflit de cle sops avec services/stalwart sur anywhere.
Le mineur ne tourne que 01:00-09:00, plus en semaine 09:00-18:00
quand un evenement du calendrier sg est actif. Le wallet vient de
secrets/monero.yml via LoadCredential (plus dans la ligne de
commande) ; meme planning sur le Deck.
Le forward de box 77.207.176.170:42070 est mort : tower devient pair
client du hub wg1 avec persistentKeepalive. L'alias ssh tower pointe
sur 10.100.0.3 et la cle root du VPS est autorisee sur tower. Cle
privee dans secrets/wireguard.yml (recipient tower).
Renomme stalwart_mail_pw2/pw3, spam_pw, noreply_pw, admin_pw, bob_pw
et acme_secret en stalwart_*_password / stalwart_acme_secret, un
fichier sops par usage.
66.108.44.154 passe en allowed-ip : l'auto-ban persiste en base et
bloquait le domicile sur 25/465/993.
meetup@marcpartensky.com partage la boite de marc.
Les blobs common.yml et anywhere.yml sont re-chiffres dans le meme
commit (renommage des cles Stalwart, rotation, postgres_crt/key).
secrets/zitadel-smtp.yml porte le mot de passe du compte d'envoi pour
le provisioning SMTP par API (v2 ignore la config runtime). Le PAT
admin est materialise en 0400 pour hermes et rotate.
- secret oidc_env (secrets/winnie.yml, chiffre pour tower) materialise par le oneshot winnie-oidc-secret dans /var/lib/winnie/oidc.env, requis par winnie-backend (EnvironmentFile non optionnel)
- PKCE : pas de client_secret cote backend
- .sops.yaml : creation_rule pour secrets/winnie.yml
Rustguac : guacd en loopback (tls=false) + vhost guac.marcpartensky.com
(sans ACME, TLS par Pangolin). KasmVNC : display :20 (pas :1, session X
existe deja), desktop lxqt (lxqt-wayland refuse), mot de passe regeneré
par empreinte sops, auth HTTP 200/401 testee. Rustdesk : ports reels 1.1.16,
hbbs/hbbr corriges; nginx guac/kasm en loopback. Vault/rustguac secrets
lues par le bon user (vault, rustguac, marc) au lieu de root. WireGuard
client sur wg1 (10.100.0.3/32, endpoint VPS 104.129.12.158:443) desactive
tant que le secret sops wireguard/tower_private_key n'existe pas (evite
le blocage sops-nix sur tout le build). hermes.extraGroups += systemd-journal.
sops-install-secrets échouait sur ce fichier ('Could not decrypt with
AES_GCM: cipher: message authentication failed'), ce qui bloquait TOUT
nixos-rebuild switch sur tower (pas seulement les services concernés).
Recréé avec une nouvelle valeur aléatoire pour les deux clés partagées
(hermes_discord_bridge_env, discord_bot_hermes_bridge_env) : secret
purement interne (loopback 127.0.0.1, jamais exposé), la rotation ne
casse rien côté consommateurs (discord-bot, hermes-discord-bridge, API
server par défaut) puisqu'ils relisent tous la même valeur au prochain
switch.
services/nextcloud/password.txt était committé en clair ("nextcloudpassword")
depuis le 25/11/2025, jamais référencé dans la config, exposé publiquement
sur github/codeberg depuis. Supprimé.
adminpassFile ne fixe le mot de passe QUE lors de l'install initiale (occ
maintenance:install) : sur une instance déjà installée il est ignoré, donc
juste changer le secret sops n'aurait pas suffi. Ajout d'un ExecStartPost
sur nextcloud-setup qui force le mot de passe du compte root à la valeur
sops à chaque activation (self-healing).
Vérifié sur tower : ancien mot de passe "nextcloudpassword" -> 401 après
le switch, hash oc_users.password changé.
Un seul listener par hôte (profil default) sert tous les profils sous
/p/<profil>/... au lieu d'un gateway séparé par profil. Le pont Discord
existant (services/discord-bot) appelle maintenant
http://127.0.0.1:8642/p/discord-bridge/v1/chat/completions et expose une
surface de test locale (HERMES_BRIDGE_ASK_PORT). services/discord-hermes-bridge
(gateway dédié, 71 lignes) est retiré ; la clé est réutilisée depuis
secrets/discord-hermes-bridge.yml (clé renommée hermes_api_server_env).
Bibliothèque sous /srv/media (dataset partagé, cf services/media). Clé API
dans secrets/audiobookshelf.yml, pas encore consommée par un service. Exposé
publiquement via Pangolin (audiobookshelf.marcpartensky.com).
Positions, soldes, NAV, transactions via Flex Web Service (HTTPS, sans session
IBKR, sans 2FA, sans gateway local). Le token Flex est indépendant du mot de
passe du compte et révocable depuis le portail : aucun pouvoir de passer un
ordre. Token + Query IDs encore des placeholders dans secrets/ibkr.yml.
jr2804/vaultwarden-mcp, binaire Rust téléchargé depuis GitHub releases (plus
simple qu'un crate2nix). Mot de passe master dans secrets/tower.yml
(vaultwarden_mcp_password). Non importé (services/default.nix) : input flake
manquant, cf FIXME.
- buildGoModule, transport stdio, GITEA_ACCESS_TOKEN_FILE (secret jamais en clair)
- v1.6.0 (pas la dernière) : v1.7.0 exige go >= 1.27, non fourni par nixpkgs 26.05
- secret PAT dans secrets/gitea-mcp.yml (sops)
Le token Codeberg (CODEBERG_ACCOUNTS) est désormais injecté via un .env généré
par sops.templates et sourcé par le wrapper, au lieu d'un placeholder en dur
dans l'option env= (visible dans le nix store).
Gateway hermes-agent dédié (profil discord-bridge) sur 127.0.0.1:8643, API Server
OpenAI-compatible consommée par le cog hermes.py du discord-bot. Unité systemd écrite à
la main (le module NixOS ne gère pas d'instances) et même paquet que le bot Matrix,
donc mêmes groupes de deps (edge-tts, stt-whisper).
Clé d'API dans secrets/discord-hermes-bridge.yml, port jamais ouvert au firewall
(assertion). Côté discord-bot, HERMES_BRIDGE_URL et le nom de rôle viennent d'un
EnvironmentFile, seule la clé est secrète.
Instance gitea sur tower avec base postgres (rôle gitea en peer auth), compte admin
créé une seule fois par un oneshot idempotent avec le mot de passe de
secrets/gitea.yml (sops). Exposition gitea.marcpartensky.com via newt/Pangolin, et
assertion pour que le port HTTP local reste fermé.
Backend hermes-agent en mode dashboard (9120) + nginx host-rewrite (9121),
ressource newt terminal.marcpartensky.com. Ports jamais ouverts au firewall :
/api/pty est un shell.
Homeserver matrix.marcpartensky.com, @hermes:matrix.marcpartensky.com, E2EE
required (salles de pont chiffrées), pas de mention requise ni d'auto-thread
dans les salles de pont (3+ membres). Allowlist : @marc + son ghost Signal.
Token dans secrets/hermes-matrix.yml (règle .sops.yaml dédiée, sopsFile
explicite car hors de tower.yml).
Set kernel panic to reboot after 10 seconds.
Enable systemd watchdog for automatic reboot on freeze.
Add ZFS root key to initrd secrets.
Enable the Roku service.
The `nextcloud-setup` service now forces a re-run and executes `occ upgrade` to ensure all app tables are created. This resolves 500 errors for CalDAV due to missing calendar tables.
Also, temporarily disable the `kanidm` service and re-encrypt the `hermes_env` secret.
add custom provider `kimi-k3-global` for Moonshot API.
set default model to `kimi-k3` with vision and large context.
configure agent and auxiliary vision with max reasoning effort.
update hermes_env secret for new configuration.
Configure the hermes agent to use moonshot kimi, replacing anthropic
claude sonnet. Update `hermes_env` secret. Comment out beeper mcp
server and add commented-out nextcloud mcp setup.
Adds a new age key for the 'deck' machine to the sops configuration.
Re-encrypts common secrets to include the new recipient.
Also updates .gitignore to ignore all 'result*' files.
Integrates the discord bot as a new NixOS service.
This includes adding the flake input, configuring the service,
and setting up its environment variables via sops.
Enable the hermes-agent NixOS module and service.
Configure PostgreSQL database and user for Hermes.
Set up Anthropic model integration with dependencies and API URL.
Add hermes_env secret for agent environment variables.