diff --git a/modules/apps/arr/default.nix b/modules/apps/arr/default.nix index 7b530c3..5f69663 100644 --- a/modules/apps/arr/default.nix +++ b/modules/apps/arr/default.nix @@ -87,8 +87,7 @@ in { }; # Make sure the Docker network exists. - systemd.services."docker-${networkName}-create-network" = lib.mkIf inUse { - description = "Create Docker network for ${networkName}"; + homelab.dockerNetworks."${networkName}" = lib.mkIf inUse { requiredBy = [ "docker-bazarr.service" "docker-prowlarr.service" @@ -96,15 +95,6 @@ in { "docker-radarr.service" "docker-sonarr.service" ]; - serviceConfig = { - Type = "oneshot"; - RemainAfterExit = true; - }; - script = '' - if ! ${pkgs.docker}/bin/docker network ls | grep -q ${networkName}; then - ${pkgs.docker}/bin/docker network create ${networkName} - fi - ''; }; # Create a user for each app. diff --git a/modules/apps/calibre/default.nix b/modules/apps/calibre/default.nix index bddf5c8..9018f1e 100644 --- a/modules/apps/calibre/default.nix +++ b/modules/apps/calibre/default.nix @@ -57,19 +57,10 @@ in { }; # Make sure the Docker network exists. - systemd.services."docker-${networkName}-create-network" = { + homelab.dockerNetworks."${networkName}" = { requiredBy = [ "docker-calibre.service" ]; - serviceConfig = { - Type = "oneshot"; - RemainAfterExit = true; - }; - script = '' - if ! ${pkgs.docker}/bin/docker network ls | grep -q ${networkName}; then - ${pkgs.docker}/bin/docker network create ${networkName} - fi - ''; }; }) diff --git a/modules/apps/freshrss/default.nix b/modules/apps/freshrss/default.nix index 4f4456f..bf6af85 100644 --- a/modules/apps/freshrss/default.nix +++ b/modules/apps/freshrss/default.nix @@ -35,20 +35,10 @@ in { ]; }; - systemd.services."docker-${networkName}-create-network" = { - description = "Create Docker network for ${networkName}"; + homelab.dockerNetworks."${networkName}" = { requiredBy = [ "docker-freshrss.service" ]; - serviceConfig = { - Type = "oneshot"; - RemainAfterExit = true; - }; - script = '' - if ! ${pkgs.docker}/bin/docker network ls | grep -q ${networkName}; then - ${pkgs.docker}/bin/docker network create ${networkName} - fi - ''; }; virtualisation.oci-containers.containers.freshrss = { diff --git a/modules/apps/gitea/default.nix b/modules/apps/gitea/default.nix index 0361bd5..95feea5 100644 --- a/modules/apps/gitea/default.nix +++ b/modules/apps/gitea/default.nix @@ -70,21 +70,11 @@ in { }; # Make sure the Docker network exists. - systemd.services."docker-${networkName}-create-network" = { - description = "Create Docker network for ${networkName}"; + homelab.dockerNetworks."${networkName}" = { requiredBy = [ "docker-gitea-db.service" "docker-gitea.service" ]; - serviceConfig = { - Type = "oneshot"; - RemainAfterExit = true; - }; - script = '' - if ! ${pkgs.docker}/bin/docker network ls | grep -q ${networkName}; then - ${pkgs.docker}/bin/docker network create ${networkName} - fi - ''; }; virtualisation.oci-containers.containers = { diff --git a/modules/apps/jellyfin/default.nix b/modules/apps/jellyfin/default.nix index 011f56b..6e422b2 100644 --- a/modules/apps/jellyfin/default.nix +++ b/modules/apps/jellyfin/default.nix @@ -75,21 +75,11 @@ in { }; # Make sure the Docker network exists. - systemd.services."docker-${networkName}-create-network" = { - description = "Create Docker network for ${networkName}"; + homelab.dockerNetworks."${networkName}" = { requiredBy = [ "docker-jellyfin.service" "docker-feishin.service" ]; - serviceConfig = { - Type = "oneshot"; - RemainAfterExit = true; - }; - script = '' - if ! ${pkgs.docker}/bin/docker network ls | grep -q ${networkName}; then - ${pkgs.docker}/bin/docker network create ${networkName} - fi - ''; }; virtualisation.oci-containers.containers = { diff --git a/modules/apps/solidtime/default.nix b/modules/apps/solidtime/default.nix index 725d32d..80202b0 100644 --- a/modules/apps/solidtime/default.nix +++ b/modules/apps/solidtime/default.nix @@ -92,24 +92,13 @@ in { homelab.virtualisation.containers.enable = true; # Make sure the Docker network exists. - systemd.services = { - "docker-${networkName}-create-network" = { - description = "Create Docker network for ${networkName}"; + homelab.dockerNetworks = { + "${networkName}" = { requiredBy = [ "${containers.solidtime.serviceName}.service" ]; - serviceConfig = { - Type = "oneshot"; - RemainAfterExit = true; - }; - script = '' - if ! ${pkgs.docker}/bin/docker network ls | grep -q ${networkName}; then - ${pkgs.docker}/bin/docker network create ${networkName} - fi - ''; }; - "docker-${internalNetworkName}-create-network" = { - description = "Create Docker network for ${internalNetworkName}"; + "${internalNetworkName}" = { requiredBy = [ "${containers.solidtime.serviceName}.service" "${containers.solidtimeScheduler.serviceName}.service" @@ -117,15 +106,6 @@ in { "${containers.solidtimeDb.serviceName}.service" "${containers.solidtimeGotenberg.serviceName}.service" ]; - serviceConfig = { - Type = "oneshot"; - RemainAfterExit = true; - }; - script = '' - if ! ${pkgs.docker}/bin/docker network ls | grep -q ${internalNetworkName}; then - ${pkgs.docker}/bin/docker network create ${internalNetworkName} - fi - ''; }; }; diff --git a/modules/apps/traefik/default.nix b/modules/apps/traefik/default.nix index 7f6ce38..6623955 100644 --- a/modules/apps/traefik/default.nix +++ b/modules/apps/traefik/default.nix @@ -18,20 +18,10 @@ in { homelab.virtualisation.containers.enable = true; # Make sure the Docker network exists. - systemd.services."docker-${cfg.sharedNetworkName}-create-network" = { - description = "Create Docker network for ${cfg.sharedNetworkName}"; + homelab.dockerNetworks."${cfg.sharedNetworkName}" = { requiredBy = [ "docker-traefik.service" ]; - serviceConfig = { - Type = "oneshot"; - RemainAfterExit = true; - }; - script = '' - if ! ${pkgs.docker}/bin/docker network ls | grep -q ${cfg.sharedNetworkName}; then - ${pkgs.docker}/bin/docker network create ${cfg.sharedNetworkName} - fi - ''; }; virtualisation.oci-containers.containers.traefik = { diff --git a/modules/apps/vaultwarden/default.nix b/modules/apps/vaultwarden/default.nix index 4510299..5e9b891 100644 --- a/modules/apps/vaultwarden/default.nix +++ b/modules/apps/vaultwarden/default.nix @@ -33,21 +33,11 @@ in { }; # Make sure the Docker network exists. - systemd.services."docker-${networkName}-create-network" = { - description = "Create Docker network for ${networkName}"; + homelab.dockerNetworks."${networkName}" = { requiredBy = [ "docker-vaultwarden-db.service" "docker-vaultwarden.service" ]; - serviceConfig = { - Type = "oneshot"; - RemainAfterExit = true; - }; - script = '' - if ! ${pkgs.docker}/bin/docker network ls | grep -q ${networkName}; then - ${pkgs.docker}/bin/docker network create ${networkName} - fi - ''; }; virtualisation.oci-containers.containers = let diff --git a/modules/common/default.nix b/modules/common/default.nix index be4b3d3..5d4b801 100644 --- a/modules/common/default.nix +++ b/modules/common/default.nix @@ -1,5 +1,6 @@ { imports = [ + ./docker.nix ./monitoring.nix ]; diff --git a/modules/common/docker.nix b/modules/common/docker.nix new file mode 100644 index 0000000..293da32 --- /dev/null +++ b/modules/common/docker.nix @@ -0,0 +1,38 @@ +{ config, lib, pkgs, ... }: + +{ + options.homelab.dockerNetworks = lib.mkOption { + description = "Declarative Docker networks to create before containers start."; + default = {}; + type = lib.types.attrsOf (lib.types.submodule { + options = { + requiredBy = lib.mkOption { + type = lib.types.listOf lib.types.str; + default = []; + description = "List of systemd services that require this network (e.g., docker-containerName.service)."; + }; + }; + }); + }; + + config = { + systemd.services = lib.mapAttrs' (networkName: cfg: + lib.nameValuePair "docker-${networkName}-create-network" { + description = "Create Docker network for ${networkName}"; + requiredBy = cfg.requiredBy; + after = [ "network.target" "docker.service" ]; + requires = [ "docker.service" ]; + wantedBy = [ "multi-user.target" ]; + serviceConfig = { + Type = "oneshot"; + RemainAfterExit = true; + ExecStart = pkgs.writeShellScript "create-${networkName}-docker-network" '' + if ! ${pkgs.docker}/bin/docker network ls | grep -q ${networkName}; then + ${pkgs.docker}/bin/docker network create ${networkName} + fi + ''; + }; + } + ) config.homelab.dockerNetworks; + }; +}