feat(ygg-mesh): client macOS (nix-darwin)

Paquets yggdrasil + tor et deux launchd.daemons (tor SOCKS 127.0.0.1:9050,
yggdrasil sur /etc/yggdrasil.conf) pour faire entrer le Mac dans le mesh.
/etc/yggdrasil.conf (mot de passe partagé) reste hors du store, à créer
une fois à la main ; le torrc ne contient aucun secret.
This commit is contained in:
Hermes Agent
2026-10-23 10:31:36 -04:00
parent ab03b394a0
commit 1435174674
2 changed files with 62 additions and 0 deletions
+4
View File
@@ -30,6 +30,10 @@ in {
imports = [
inputs.home-manager.darwinModules.home-manager
# Réseau privé ygg-mesh sur macOS (daemon yggdrasil + client tor) :
# voir services/ygg-mesh/darwin.nix ; /etc/yggdrasil.conf à créer une fois.
../../services/ygg-mesh/darwin.nix
# inputs.sops.nixosModules.sops # Inclus dans sopswarden
+58
View File
@@ -0,0 +1,58 @@
# services/ygg-mesh/darwin.nix
#
# Côté macOS (nix-darwin) du réseau ygg-mesh : paquet + client Tor + daemon.
# Importé par profiles/macos/configuration.nix. Le module NixOS de ce réseau
# vit dans services/ygg-mesh/default.nix ; le fichier de config Yggdrasil
# (/etc/yggdrasil.conf) est décrit dans son en-tête et n'est PAS posé par le
# nix store (il contient le mot de passe partagé).
#
# Ce que ce module installe :
# - yggdrasil + tor (paquets nixpkgs, 0.5.13 / 0.4.9 comme les nœuds Linux) ;
# - tor en client SOCKS (127.0.0.1:9050) : sortie vers les onions du mesh et
# des nœuds quand le Mac est hors du LAN ;
# - le daemon yggdrasil qui lit /etc/yggdrasil.conf (à créer une fois,
# root:wheel 0600). Sur le LAN, le lien direct multicast prend le relais.
#
# Le torrc ne contient aucun secret (juste des ports) : il peut vivre dans le
# store, contrairement à /etc/yggdrasil.conf.
#
# Config minimale de /etc/yggdrasil.conf (voir l'en-tête du module NixOS pour
# les valeurs à jour) : Listen = [], Peers = les URIs socks://…@127.0.0.1:9050
# vers les onions des nœuds, MulticastInterfaces { Beacon=false; Listen=true;
# Port=12346; Password=<mot de passe> }, AllowedPublicKeys = les clés des nœuds.
{ pkgs, lib, ... }:
let
torrc = pkgs.writeText "ygg-mesh-torrc" ''
SocksPort 127.0.0.1:9050 IsolateDestAddr IsolateSOCKSAuth
AvoidDiskWrites 1
SafeLogging 1
'';
in
{
environment.systemPackages = [ pkgs.yggdrasil pkgs.tor ];
# Daemons système (root) : yggdrasil crée une interface utun, tor ouvre le
# SOCKS en loopback. nix-darwin attend le montage du store au boot avant de
# lancer la commande (wait4path).
launchd.daemons.ygg-mesh-tor = {
command = "${pkgs.tor}/bin/tor -f ${torrc}";
serviceConfig = {
KeepAlive = true;
RunAtLoad = true;
StandardOutPath = "/var/log/ygg-mesh-tor.log";
StandardErrorPath = "/var/log/ygg-mesh-tor.log";
};
};
launchd.daemons.yggdrasil = {
command = "${pkgs.yggdrasil}/bin/yggdrasil -useconffile /etc/yggdrasil.conf";
serviceConfig = {
KeepAlive = true;
RunAtLoad = true;
StandardOutPath = "/var/log/yggdrasil.log";
StandardErrorPath = "/var/log/yggdrasil.log";
};
};
}