Skip to content

Service modules

Full-configured AdGuard Home for local gateway / router.

  • enable bool Enable local adguardhome service
darkone.service.adguardhome.enable = false;

Local Artifical Intelligence (open-webui + ollama + llms).

  • enable bool Enable local AI service
darkone.service.ai.enable = false;

Audio services: alsa, pulse (not jack for the moment). Automatically adds users to the audio group when enabled.

  • enable bool Enable sound system
darkone.service.audio.enable = false;

Pre-configured dnsmasq for local gateway / router.

  • enable bool Enable local dnsmasq service
darkone.service.dnsmasq.enable = false;

A full-configured LaSuite Docs module.

  • enable bool Enable local docs service
  • s3Host str S3 backend hostname
  • s3Port port S3 backend port
  • s3Bucket str S3 bucket name for document storage
darkone.service.docs = {
enable = false;
s3Host = "127.0.0.1";
s3Port = dnfConfig.network.ports.garage;
s3Bucket = "docs";
};

Element web client for local matrix service.

  • enable bool Enable local element service
darkone.service.element.enable = false;

Fail2ban DNF specific module.

  • enable bool Enable fail2ban with DNF specificities
darkone.service.fail2ban.enable = false;

A full-configured forgejo git forge.

  • enable bool Enable local forgejo service
darkone.service.forgejo.enable = false;

A full-configured local Garage S3 service.

Provides an internal S3-compatible object storage backend accessible only on 127.0.0.1:3900.

  • enable bool Enable local Garage S3 service
  • srvPort port S3 API port exposed on the internal IP
  • s3Region str S3 region name (must match consumer config)
  • capacity str Node storage capacity hint passed to garage layout assign. Used only at first boot for layout initialization; does not act as a hard quota on the underlying filesystem. Supported suffixes: B, KB, MB, GB, TB, PB.
darkone.service.garage = {
enable = false;
srvPort = srvPort;
s3Region = s3Region;
capacity = "500GB";
};

GeneWeb — Powerful Genealogy Service.

  • enable bool Enable local GeneWeb genealogy service
  • enablePasswords bool Enable sops passwords (not recommanded)
darkone.service.geneweb = {
enable = false;
enablePasswords = false;
};

Harmonia: local Nix binary cache server (serves this host’s /nix/store).

Exposes locally built / realised store paths over plain HTTP (port 5000), signed with the deployment-wide binary-cache key. Enable per host from usr/config.yaml (services.harmonia), like any other DNF service.

  • enable bool Enable a local Harmonia Nix binary cache server
darkone.service.harmonia.enable = false;

A full-configured headscale service for HCS.

  • enable bool Enable headscale DNF service
  • enableGRPC bool Open GRPC TCP port
darkone.service.headscale = {
enable = false;
enableGRPC = false;
};

A Home Assistant with some plugins (wip).

  • enable bool Enable home assitant
darkone.service.home-assistant.enable = false;

Dynamically configured homepage dashboard for your local network.

  • enable bool Enable homepage dashboard + httpd + host
  • localServices listOf attrs Services to add in Local Applications section
  • globalServices listOf attrs Full network common & public-accessible services
  • remoteServices listOf attrs Services to add in Remote Applications section
  • bookmarks listOf attrs Replace default bookmarks (links)
  • widgets listOf attrs Replace default widgets
darkone.service.homepage = {
enable = false;
localServices = [ ];
globalServices = [ ];
remoteServices = [ ];
bookmarks = [ ];
widgets = [ ];
};

Kanidm (identity manager) DNF Service.

  • enable bool Enable local SSO with Kanidm
  • oauth2 attrs OAuth2/OIDC client templates contributed by service modules. Kanidm provisions one client per matching entry in network.services, with clientId = dnfLib.oauth2ClientName.
    • enable bool Whether to provision OAuth2 clients for this template.
    • clientName nullOr str Override the kanidm client name. Defaults to dnfLib.oauth2ClientName.
    • displayName str Human-readable name shown on the kanidm consent screen.
    • imageFile path Application icon. Re-uploaded on every kanidm-provision run.
    • redirectPaths listOf str OAuth2 redirect paths (one per accepted callback URL).
    • landingPath str Auto-connect entry point path on the service.
    • enableLegacyCrypto bool Allow legacy JWT signing algorithms (eg. RS256).
    • allowInsecureClientDisablePkce bool Disable PKCE on the client (only for clients that do not implement it).
    • preferShortUsername nullOr bool Use the short username (no domain) in the preferred_username claim.
    • extra attrs Extra attributes merged into the provisioned client (claimMaps, etc).
darkone.service.idm = {
enable = false;
oauth2.enable = true;
oauth2.clientName = null;
oauth2.displayName = null;
oauth2.imageFile = null;
oauth2.redirectPaths = [ ];
oauth2.landingPath = "/";
oauth2.enableLegacyCrypto = false;
oauth2.allowInsecureClientDisablePkce = false;
oauth2.preferShortUsername = null;
oauth2.extra = { };
};

Immich (photo management) full-configured service.

  • enable bool Enable local immich service
  • enableMachineLearning bool Enable machine learning features (face recognition, object detection)
  • enableRedis bool Enable Redis for caching (recommended for performance)
darkone.service.immich = {
enable = false;
enableMachineLearning = false;
enableRedis = false;
};

A full-configured jellyfin server.

  • enable bool Enable jellyfin service
darkone.service.jellyfin.enable = false;

A full-configured jitsi-meet service.

  • enable bool Enable local jitsi-meet service
darkone.service.jitsi-meet.enable = false;

Loki + Alloy, http stats with grafana.

  • enable bool Deploys the Loki server + Grafana datasource (colocated with Grafana).
  • isClient bool Deploys Alloy to collect local Caddy access logs.
  • retentionTime str Log retention duration in Loki (30 days by default).
darkone.service.loki = {
enable = config.darkone.service.monitoring.enable;
isClient = config.services.caddy.enable;
retentionTime = "720h";
};

DNF matrix (synapse) server.

  • enable bool Enable matrix (synapse) service
darkone.service.matrix.enable = false;

Mealie Recipe Management

  • enable bool Enable mealie service
darkone.service.mealie.enable = false;

A full-configured local MinIO S3 service. (wip)

Provides an internal S3-compatible object storage backend accessible only on 127.0.0.1:9000. The console web UI runs on 127.0.0.1:9001 for administration and debugging.

  • enable bool Enable local MinIO S3 service
darkone.service.minio.enable = false;

Supervision module with prometheus, grafana and node exporter.

  • enable bool Enable monitoring with prometheus, grafana and node exporter
  • isNode bool Is a monitoring node
  • retentionTime str Prometheus metrics retention duration
  • kioskTarget str Target (relative, no /) for the automatic redirect to Grafana from the monitoring domain root. Overridden by the Loki module when active to point to a multi-source home dashboard.
darkone.service.monitoring = {
enable = false;
isNode = lib.hasAttrByPath [ "features" "monitoring-node" ] host;
retentionTime = "30d";
kioskTarget = "d/dnf-monitoring-home/home?kiosk";
};

Nix cache proxy with NCPS module.

This module is activated by core. Server and clients are automatically detected.

  • enable bool Enable nix cache proxy for packages
  • dataPath str Nix cache proxy cache folder
  • extraOptions attrs services.ncps extra options
darkone.service.ncps = {
enable = false;
dataPath = "/var/cache/ncps";
extraOptions = { };
};

Nextcloud full-configured service.

  • enable bool Enable local nextcloud service
  • adminUser str Admin username for Nextcloud
darkone.service.nextcloud = {
enable = false;
adminUser = "admin";
};

NFS server + client for home shares.

  • enable bool Enable NFS DNF server (avoid enable manually)
  • serverDomain str NFS Server FQDN
darkone.service.nfs = {
enable = hasServer && (isServer || isClient);
serverDomain = "nfs";
};

A full-configured outline wiki.

  • enable bool Enable local outline service
darkone.service.outline.enable = false;

OxiCloud — Fast Sovereign Cloud (file storage, WebDAV, CalDAV & CardDAV).

  • enable bool Enable local OxiCloud service
darkone.service.oxicloud.enable = false;

Postfix SMTP Relay.

  • enable bool Enable Postfix SMTP Relay
darkone.service.postfix.enable = false;

Printers and scanners.

  • enable bool Default useful packages
  • loadAll bool Full printers and scanners
  • enableScanners bool Enable scanners
  • enableHpPrinters bool HP printers only
  • enableManualInstall bool Manual drivers installation
darkone.service.printing = {
enable = false;
loadAll = false;
enableScanners = false;
enableHpPrinters = false;
enableManualInstall = false;
};

Restic backup module: REST server + per-host backup targets.

Example (machine config):

darkone.service.restic = {
enable = true;
targets = [
{ name = "main"; root = "rest:http://restic.ag.poncon.fr:8888";
zone = "ag"; categories = [ "system" "nfs" ]; }
];
};

Repository layout per target:

<root>/<hostname>/system <- "system" category (/ minus excludes)
<root>/<hostname>/srv/nfs <- "nfs" category (/srv/nfs/<...>)
<root>/<hostname>/srv/medias <- "medias" category (/srv/medias/<...>)
  • enable bool Enable restic backup client
  • enableDryRun bool Dry Run mode
  • enableWaitRemoteFs bool Run backups only after remote-fs.target
  • enableServer bool Enable restic REST server
  • enableServerPrivateRepos bool Enforce per-host repository isolation (restic —private-repos). Only flip this on once every client deploys with its per-host REST credential.
  • serverDataDir str Local storage root of the REST server (all hosts’ repos)
  • targets listOf ( submodule { options = { name = lib.mkOption { type = str; default = "main"; description = "Target id, used in backup/unit names (<category>-<name>)"; }; root = lib.mkOption { type = str; default = "/mnt/backup/restic"; example = "rest:http://restic.${zone.domain}:${toString srvPort}"; description = "Repository root: local path or REST URL"; }; zone = lib.mkOption { type = str; default = zone.name; description = "Zone selecting the repo passphrase (restic-password-<zone>)"; }; categories = lib.mkOption { type = listOf ( enum [ "system" "nfs" "medias" ] ); default = [ "system" ]; description = "What to back up to this target"; }; }; } ) Backup destinations for this host (local path or REST URL)
    • name str Target id, used in backup/unit names (<category>-<name>)
    • root str Repository root: local path or REST URL
    • zone str Zone selecting the repo passphrase (restic-password-<zone>)
    • categories listOf ( enum [ "system" "nfs" "medias" ] ) What to back up to this target
  • nfsPaths listOf str NFS dirs (/srv/nfs/<xxx>) included in the ‘nfs’ category
  • mediasPaths listOf str Medias dirs (/srv/medias/<xxx>) included in the ‘medias’ category
darkone.service.restic = {
enable = false;
enableDryRun = false;
enableWaitRemoteFs = false;
enableServer = false;
enableServerPrivateRepos = false;
serverDataDir = "/mnt/backup/restic";
targets = [ ];
targets.name = "main";
targets.root = "rest:http://restic.${zone.domain}:${toString srvPort}";
targets.zone = zone.name;
targets.categories = [ ];
nfsPaths = [ ];
mediasPaths = [ ];
};

A full-configured hardened search engine.

  • enable bool Enable local search proxy
darkone.service.searx.enable = false;

Tailscale client service for HCS.

  • enable bool Enable tailscale client to connect HCS
  • isGateway bool This tailscale node is a subnet gateway
  • isExitNode bool Configure this client as exit node
darkone.service.tailscale = {
enable = false;
isGateway = false;
isExitNode = false;
};

Coturn server (matrix).

Add DNS entries to optimize :

Type,Name,Priority,Pds,Port,Target
SRV,_stun._udp,0,0,3478,turn.mydomain.tld
SRV,_stun._tcp,0,0,3478,turn.mydomain.tld
SRV,_turn._udp,0,0,3478,turn.mydomain.tld
SRV,_turn._tcp,0,0,3478,turn.mydomain.tld
SRV,_turns._tcp,0,0,5349,turn.mydomain.tld
  • enable bool Enable local turn service (visio)
darkone.service.turn.enable = false;

A full-configured vaultwarden server (wip).

  • enable bool Enable local Vaultwarden service
  • enableSmtp bool Enable SMTP to send emails (recommended)
darkone.service.vaultwarden = {
enable = false;
enableSmtp = true;
};