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).
This commit is contained in:
Hermes Agent
2026-09-27 21:19:20 -04:00
parent fb4afea17f
commit cb365bdb2f
2 changed files with 55 additions and 10 deletions
+16
View File
@@ -0,0 +1,16 @@
codeberg_token: ENC[AES256_GCM,data:mRUmsINN1Paq5S7f4sC2sPCoH2//jVYU4b7/SG87o3iI6zyGsAmZ,iv:sPZOonhgduZQQ95N+1yTqBalb20VJhDP3CqB0nh+W6o=,tag:cO12ott6sRnXFjoKPSDaAQ==,type:str]
sops:
age:
- enc: |
-----BEGIN AGE ENCRYPTED FILE-----
YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBzN0RKbyt5NUNHYUljdXlp
a1hFSlJBeDFCZHNabC9lOXFOMXo0SWpsbUJVCnhiWXpBMGprSmhwOE1UbUtJYVNr
OE5PVElIY3dJRGlYT09yR2c3azV5alkKLS0tIGZUVFFYVjhyZXZaRnRnOTExZHoz
TDBUVGlWSkp5TnpabEF5RjlUZ1RRMEkKQGblvT7N5W+Ur9VjRe3s0zY+dZack3IY
6imfbJp9ddbnlx2NnZMQaaUPXO9uatpZ73VNuijCzvSP71GnvkusrA==
-----END AGE ENCRYPTED FILE-----
recipient: age1usm3v0ugducrzcwud60dda7xfnj49fdhecj7kcsfm7dzwzrzeyqq2jc2hm
lastmodified: "2026-09-27T23:31:11Z"
mac: ENC[AES256_GCM,data:ot2NbIHdLchUWNK9vAhJBPpTqYi2iBHnVePfXt8xYXKsGtqgOkHwex1wTioGMLV8kdNaJgaRD7/H/oLV3ZmYhWv1jJKLwtyI3PNtmTeEzTODv2Fl8XXPltRjuBAWG8IpIWzHZ5+QWfJoXRNQ+iVyE6h5yW1iw7adSqdlV0KConI=,iv:6rFTTLO2Wq1f9d7jKoxm5iYnkf9EfhXMb8A/qISynV0=,tag:7vQBBxU/W50NwG1CN/nJ1Q==,type:str]
unencrypted_suffix: _unencrypted
version: 3.13.3
+39 -10
View File
@@ -1,8 +1,19 @@
# services/codeberg-mcp/default.nix
# Serveur MCP Codeberg (effecet/codeberg-mcp) : 49 outils.
# Le package est créé ici ; le mcpServers est configuré dans services/hermes/default.nix.
{ pkgs, lib, ... }:
let
# Le package est créé ici ; le mcpServers est configuré dans
# services/hermes/default.nix (ou ici, l'option est la même).
#
# Le token Codeberg n'est JAMAIS en clair dans le nix store : il vit dans
# secrets/codeberg.yml (sops), est injecté dans un .env généré (sops.templates),
# et le wrapper le "source" avant d'exec le serveur.
# Créer le token : https://codeberg.org/user/settings/applications
# (scopes read/write:repository, read/write:issue, read:user).
{
pkgs,
lib,
config,
...
}: let
python = pkgs.python312;
srcRepo = pkgs.fetchFromGitHub {
owner = "effecet";
@@ -12,22 +23,40 @@ let
# de type et fait échouer TOUTE l'évaluation de la config tower.
hash = "sha256-ElfVEkftD02XHQ6Cu6viaIRvSuw+kFvvmGzvzUPnnb4=";
};
# .env généré depuis sops (contient CODEBERG_ACCOUNTS avec le vrai token),
# lisible par hermes uniquement.
envFile = config.sops.templates."codeberg-mcp.env".path;
# Package Python manuel : le repo n'a pas de build-system valide.
# On crée un binaire qui lance server.py avec le bon python.
# Le wrapper "source" le .env sops puis lance server.py.
codeberg-mcp-bin = pkgs.writeShellScriptBin "codeberg-mcp" ''
set -a
. ${envFile}
set +a
exec ${python.interpreter} ${srcRepo}/server.py "$@"
'';
in {
sops.templates."codeberg-mcp.env" = {
content = ''
CODEBERG_ACCOUNTS={"default": "${config.sops.placeholder."codeberg-mcp/token"}"}
MCP_TRANSPORT=stdio
'';
owner = "hermes";
mode = "0400";
};
sops.secrets."codeberg-mcp/token" = {
key = "codeberg_token";
sopsFile = ../../secrets/codeberg.yml;
owner = "hermes";
};
# Le binaire est disponible sur le PATH.
environment.systemPackages = [ codeberg-mcp-bin ];
environment.systemPackages = [codeberg-mcp-bin];
services.hermes-agent.mcpServers.codeberg = {
command = "${codeberg-mcp-bin}/bin/codeberg-mcp";
env = {
# Remplacer par le JSON du token Codeberg.
CODEBERG_ACCOUNTS = "{\"default\": \"tok_PLACEHOLDER\"}";
MCP_TRANSPORT = "stdio";
};
timeout = 60;
};
}