81 Commits
Author SHA1 Message Date
Hermes Agent 2cab48297f chore(gitea-mcp): PAT réel dans sops (remplace le placeholder)
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.
2026-10-24 15:58:14 -04:00
Hermes Agent eb71f8ae64 fix(gitea): OIDC Zitadel réellement fonctionnel (source OAuth2, app Web)
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)
2026-10-24 15:44:57 -04:00
Hermes Agent 10058770c4 feat(secrets): cles Switch (deck) et cle de pre-auth du mesh headscale
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.
2026-10-24 15:07:55 -04:00
Hermes Agent ab03b394a0 feat(ygg-mesh): réseau privé Yggdrasil entre tower, deck et anywhere
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`.
2026-10-23 10:31:36 -04:00
Hermes Agent c0002126b6 chore(sops): rotation du mdp postgres et cle API pangolin 2026-10-23 10:24:12 -04:00
Hermes Agent 1bf853a56a fix(deck): secret monero dedie et planning sans CalDAV 2026-10-19 02:38:26 -04:00
Hermes Agent 7615d98b36 feat(stalwart-mcp): serveur MCP JMAP pour tower
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.
2026-10-19 02:07:33 -04:00
Hermes Agent 4f5acfaf61 feat(monero): minage planifie selon le calendrier Nextcloud
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.
2026-10-19 02:07:32 -04:00
Hermes Agent de94c3e4bf feat(wireguard): tower rejoint le wg1 du VPS en pair 10.100.0.3
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).
2026-10-19 02:07:32 -04:00
Hermes Agent 8e604e3f8f fix(stalwart): cles de secrets explicites, allowed-ip, meetup
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).
2026-10-19 02:07:32 -04:00
Hermes Agent 7655391102 feat(zitadel): secret SMTP + PAT admin lisible par hermes
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.
2026-10-19 02:07:32 -04:00
Hermes Agent c427110b4b feat(mcp): serveurs MCP Wise et Bank
wise-mcp passe par le CLI officiel, token dans secrets/wise.yml.
bank-mcp lit une config locale 0600 (pas de secret nix).
2026-10-19 02:07:19 -04:00
Hermes Agent aadebcc0fd feat(winnie): OIDC Zitadel en PKCE via un secret sops oidc_env
- 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
2026-10-17 16:56:17 -04:00
Hermes Agent 917ebe40d3 feat(services): serveur de sync Anki auto-hébergé (anki.marcpartensky.com) 2026-10-09 17:38:38 -04:00
Hermes Agent 2edce1cd20 feat(tower): remote-desktop (rustguac, kasmvnc, rustdesk) + acl 777 access journal
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.
2026-10-06 21:41:47 -04:00
Hermes Agent 3d2c987b96 fix(secrets): régénérer discord-hermes-bridge.yml (fichier illisible, MAC cassé)
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.
2026-09-29 19:49:09 -04:00
Hermes Agent 9180562410 fix(nextcloud): retirer password.txt (mdp en clair, repo public) + rotation forcée
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é.
2026-09-29 19:49:09 -04:00
Hermes Agent a2e20bc376 chore(secrets): rotation admin_password gitea 2026-09-27 21:24:55 -04:00
Hermes Agent 97fe5aa462 chore(secrets): secret hermes-discord.yml (token bot Discord natif hermes) 2026-09-27 21:24:55 -04:00
Hermes Agent 5b181bd840 refactor(hermes): API server OpenAI-compatible unifié, retrait du gateway discord-bridge dédié
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).
2026-09-27 21:23:34 -04:00
Hermes Agent 819a34629f feat(audiobookshelf): serveur de livres audio et podcasts
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).
2026-09-27 21:19:35 -04:00
Hermes Agent 78c257a2a6 feat(ibkr-mcp): serveur MCP lecture seule Interactive Brokers (Flex Web Service)
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.
2026-09-27 21:19:35 -04:00
Hermes Agent 01589109ab feat(vaultwarden-mcp): serveur MCP Vaultwarden (binaire téléchargé, désactivé en attendant l'input flake)
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.
2026-09-27 21:19:35 -04:00
Hermes Agent 9d99233987 feat(gitea-mcp): serveur MCP Gitea officiel (gitea.com/gitea/gitea-mcp v1.6.0)
- 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)
2026-09-27 21:19:20 -04:00
Hermes Agent cb365bdb2f feat(codeberg-mcp): token via sops template (plus de placeholder en clair)
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).
2026-09-27 21:19:20 -04:00
Hermes Agent fb4afea17f feat(gitea): OIDC Zitadel pour l'authentification (auto-discover, registration externe uniquement)
- services.gitea.openid : ENABLE_OPENID_SIGNIN/SIGNUP, whitelist auth.marcpartensky.com
- service oneshot gitea-oidc-init : enregistre la source OAuth2 zitadel (idempotent)
- registration classique désactivée (ALLOW_ONLY_EXTERNAL_REGISTRATION)
- secret client OIDC dans secrets/gitea-oidc.yml (sops)
2026-09-27 21:18:46 -04:00
Hermes Agent 2622780459 feat(discord-hermes-bridge): pont Discord vers un gateway Hermes dédié
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.
2026-09-27 13:00:56 -04:00
Hermes Agent e8ff562d78 feat(gitea): forge locale (postgres, admin, Pangolin SSO)
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é.
2026-09-27 13:00:56 -04:00
Hermes Agent 67b4551b2d feat(hermes-dashboard): terminal web hermes (Pangolin SSO)
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.
2026-09-26 18:14:41 -04:00
Hermes Agent 2149e5f998 feat(hermes): bot Matrix @hermes (env, secret sops, allowlist)
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).
2026-09-26 18:11:54 -04:00
Hermes Agent f55067d0b7 feat(flake): lock updates and protonmail-mcp flake 2026-09-24 21:31:02 -04:00
mazex 355b8c443e feat(tower): configure system stability and enable Roku
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.
2026-09-24 00:41:46 -04:00
mazex 8959a5a910 fix(nextcloud): ensure app migrations run after setup
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.
2026-09-22 09:37:05 -04:00
mazex 00b8247e53 feat(nextcloud): add mcp env secret
Adds the encrypted `nextcloud_mcp_env` secret to `tower.yml`.
2026-09-22 00:47:02 -04:00
mazex 1d4b7bf4b6 feat(hermes): configure custom kimi/moonshot provider
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.
2026-09-21 22:32:06 -04:00
mazex 2ba5a019d7 feat(hermes): switch to moonshot kimi as default model
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.
2026-09-21 21:42:22 -04:00
mazex 730c800124 eternal terminal 2026-09-21 04:37:18 +02:00
mazex 0b452dfdc6 chore(sops): add deck as sops recipient
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.
2026-09-16 17:37:27 -04:00
mazex 41319ffcc0 Merge branch 'master' of github.com:MarcPartensky/nixos 2026-09-13 23:21:28 +02:00
mazex d42a32487b anywhere 2026-09-13 23:21:06 +02:00
mazex 2a6b79d53c feat(discord-bot): add discord bot service
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.
2026-09-13 13:29:38 -04:00
mazex 612090820e feat(hermes): add beeper mcp server configuration
Configures Hermes to connect to a Beeper MCP server.
Updates the `hermes_env` secret to include necessary credentials.
2026-09-12 23:48:01 -04:00
mazex 16b6287c8a feat(hermes): add and configure agent service
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.
2026-09-12 23:15:50 -04:00
mazex 0a4fa11446 refactor: adjust bluetooth settings and enable rtkit 2026-07-30 14:43:28 +02:00
mazex b65f27ac99 chore: add hermes-agent flake input and configuration 2026-07-28 22:24:47 +02:00
mazex 8e9d8b967c chore: update flake inputs and stalwart configuration 2026-07-28 20:19:12 +02:00
mazex 685f1488b5 chore: rotate vaultwarden db password 2026-07-03 17:05:06 +02:00
mazex cd581e5ac5 feat: enable vaultwarden service with secrets management 2026-07-03 16:53:38 +02:00
mazex 7283d384e5 feat: add droplify service and remove gotify password 2026-05-24 21:06:16 +02:00
mazex 103ce12db5 chore: refactor configs and add services 2026-05-24 20:42:07 +02:00