Saltar al contenido principal

Módulo: Daemon (almenad)

El daemon es el servicio en segundo plano principal de Almena Network. Proporciona la API gRPC y gestiona la red P2P.

Visión General

PropiedadValor
Nombre del cratealmenad
LenguajeRust 2021
Versión2026.1.1-develop
LicenciaApache-2.0 OR MIT
Repositorioalmena-network/daemon

Estructura del Código

daemon/
├── src/
│ ├── main.rs # Servidor gRPC, args CLI, handlers de servicio
│ ├── p2p.rs # Swarm libp2p, descubrimiento mDNS, PeerStore
│ └── path.rs # Directorios de datos específicos por plataforma
├── proto/
│ └── almena/daemon/v1/
│ └── service.proto # Contrato de servicio gRPC (fuente de verdad)
├── scripts/
│ ├── dev.sh # Lanzador modo desarrollo
│ └── package.sh # Script de empaquetado
├── assets/
│ ├── macos/ # LaunchAgent, postinstall, desinstalar
│ ├── debian/ # Servicio systemd, postinst/postrm
│ └── wix/ # Configuración MSI de Windows
├── build.rs # Compilación proto con tonic-build
├── Cargo.toml # Dependencias
└── Taskfile.yml # Orquestación de tareas

Dependencias Principales

DependenciaVersiónPropósito
tonic0.12Framework de servidor gRPC
prost0.13Serialización Protocol Buffer
libp2p0.56Red peer-to-peer
tokio1Runtime asíncrono
clap4Parseo de argumentos CLI
reqwest0.12Cliente HTTP (API de geolocalización)
sysinfo0.31Información del SO
tracing0.1Logging estructurado

Arquitectura

Servidor gRPC (main.rs)

El struct DaemonServiceImpl implementa 5 handlers RPC:

  1. Ping — Retorna "pong" (verificación de salud)
  2. GetVersion — Retorna CARGO_PKG_VERSION
  3. GetSystemInfo — Usa el crate sysinfo para nombre/versión del SO
  4. GetGeolocation — Llamada HTTP a ipapi.co, retorna IP/ciudad/coordenadas
  5. ListPeers — Lee del PeerStore compartido

El servidor inicia con reflexión gRPC habilitada, permitiendo que herramientas como Postman y grpcurl descubran métodos automáticamente.

Red P2P (p2p.rs)

La capa P2P usa libp2p con:

  • Transporte: TCP
  • Cifrado: Protocolo Noise
  • Multiplexación: Yamux
  • Comportamientos: Ping + mDNS (descubrimiento de peers en LAN)

El PeerStore es un Arc<RwLock<HashMap<PeerId, PeerEntry>>> thread-safe compartido entre los handlers gRPC y el loop de eventos del swarm.

Manejo de eventos:

  • NewListenAddr — Registra las direcciones propias del daemon
  • ConnectionEstablished — Agrega peer, marca conectado, detecta LAN vs internet
  • ConnectionClosed — Marca peer como desconectado
  • Mdns::Discovered — Agrega nuevos peers e intenta conectar
  • Mdns::Expired — Marca peers como desconectados

Directorios de Datos (path.rs)

ModomacOSLinuxWindows
Producción~/Library/Application Support/network.almena.daemon~/.local/share/network.almena.daemon%APPDATA%\network.almena.daemon
Desarrollo./workspace./workspace./workspace

Subdirectorios: data/, config/, logs/

Desarrollo

# Instalar dependencias
task install

# Ejecutar con recarga en caliente
task dev

# Ejecutar tests
task test

# Lint
task clippy

# Formatear
task fmt

Empaquetado

El daemon puede empaquetarse como un instalador nativo para cada plataforma:

task package          # Auto-detectar plataforma
task package:darwin # macOS .pkg (firmado + notarizado)
task package:linux # Linux .deb
task package:windows # Windows .msi

Integración con Plataformas

  • macOS: LaunchAgent en ~/Library/LaunchAgents/network.almena.daemon.plist (auto-inicio al iniciar sesión)
  • Linux: Servicio de usuario systemd (systemctl --user start almenad)
  • Windows: Servicio de Windows (sc start AlmenaD)