diff --git a/example-deployments/disnix/processes.nix b/example-deployments/disnix/processes-bare.nix similarity index 79% rename from example-deployments/disnix/processes.nix rename to example-deployments/disnix/processes-bare.nix index 631d9a4..a3e84bf 100644 --- a/example-deployments/disnix/processes.nix +++ b/example-deployments/disnix/processes-bare.nix @@ -14,9 +14,13 @@ let constructors = import ../../services-agnostic/constructors.nix { inherit pkgs stateDir runtimeDir logDir tmpDir cacheDir spoolDir forceDisableUserChange processManager; }; + + containerProviderConstructors = import ../../service-containers-agnostic/constructors.nix { + inherit pkgs stateDir runtimeDir logDir tmpDir cacheDir spoolDir forceDisableUserChange processManager; + }; in rec { - sshd = rec { + sshd = { pkg = constructors.sshd { extraSSHDConfig = '' UsePAM yes diff --git a/example-deployments/disnix/processes-with-apache-mysql.nix b/example-deployments/disnix/processes-with-apache-mysql.nix new file mode 100644 index 0000000..4fd2f5c --- /dev/null +++ b/example-deployments/disnix/processes-with-apache-mysql.nix @@ -0,0 +1,51 @@ +{ pkgs ? import { inherit system; } +, system ? builtins.currentSystem +, stateDir ? "/var" +, runtimeDir ? "${stateDir}/run" +, logDir ? "${stateDir}/log" +, spoolDir ? "${stateDir}/spool" +, cacheDir ? "${stateDir}/cache" +, tmpDir ? (if stateDir == "/var" then "/tmp" else "${stateDir}/tmp") +, forceDisableUserChange ? false +, processManager +}: + +let + constructors = import ../../services-agnostic/constructors.nix { + inherit pkgs stateDir runtimeDir logDir tmpDir cacheDir spoolDir forceDisableUserChange processManager; + }; + + containerProviderConstructors = import ../../service-containers-agnostic/constructors.nix { + inherit pkgs stateDir runtimeDir logDir tmpDir cacheDir spoolDir forceDisableUserChange processManager; + }; +in +rec { + sshd = { + pkg = constructors.sshd { + extraSSHDConfig = '' + UsePAM yes + ''; + }; + }; + + dbus-daemon = { + pkg = constructors.dbus-daemon { + packages = [ pkgs.disnix ]; + }; + }; + + apache = containerProviderConstructors.simpleWebappApache { + serverAdmin = "root@localhost"; + documentRoot = "/var/www"; + enablePHP = true; + }; + + mysql = containerProviderConstructors.mysql {}; + + disnix-service = { + pkg = constructors.disnix-service { + inherit dbus-daemon; + containerProviders = [ apache mysql ]; + }; + }; +} diff --git a/service-containers-agnostic/apache-tomcat/simple-appserving-tomcat.nix b/service-containers-agnostic/apache-tomcat/simple-appserving-tomcat.nix index 58f4b5a..dc9b65d 100644 --- a/service-containers-agnostic/apache-tomcat/simple-appserving-tomcat.nix +++ b/service-containers-agnostic/apache-tomcat/simple-appserving-tomcat.nix @@ -1,4 +1,4 @@ -{tomcatConstructorFun, dysnomia, stateDir}: +{tomcatConstructorFun, lib, dysnomia, stateDir}: { instanceSuffix ? "" , instanceName ? "tomcat${instanceSuffix}" @@ -6,7 +6,7 @@ , serverPort ? 8005 , httpPort ? 8080, httpsPort ? 8443, ajpPort ? 8009 , commonLibs ? [] -, type +, type ? null , properties ? {} }: @@ -33,8 +33,10 @@ in rec { name = instanceName; - inherit pkg type catalinaBaseDir; + inherit pkg catalinaBaseDir; tomcatPort = httpPort; providesContainer = containerName; +} // lib.optionalAttrs (type != null) { + inherit type; } // properties diff --git a/service-containers-agnostic/apache/simple-webapp-apache.nix b/service-containers-agnostic/apache/simple-webapp-apache.nix index 6a91717..6ba8b43 100644 --- a/service-containers-agnostic/apache/simple-webapp-apache.nix +++ b/service-containers-agnostic/apache/simple-webapp-apache.nix @@ -1,16 +1,16 @@ -{apacheConstructorFun, dysnomia, forceDisableUserChange}: +{apacheConstructorFun, lib, dysnomia, forceDisableUserChange}: { instanceSuffix ? "", instanceName ? "apache${instanceSuffix}" , containerName ? "apache-webapplication${instanceSuffix}" , port ? 80 , modules ? [], serverName ? "localhost" , serverAdmin -, documentRoot ? ./webapp +, documentRoot ? ../../services-agnostic/http-server-common/webapp , extraConfig ? "" , enableCGI ? false , enablePHP ? false , filesetOwner ? null -, type +, type ? null , properties ? {} }: @@ -33,8 +33,10 @@ let in { name = instanceName; - inherit pkg type port documentRoot; + inherit pkg port documentRoot; providesContainer = containerName; +} // lib.optionalAttrs (type != null) { + inherit type; } // (if forceDisableUserChange || filesetOwner == null then {} else { inherit filesetOwner; }) // properties diff --git a/service-containers-agnostic/constructors.nix b/service-containers-agnostic/constructors.nix index 64f1507..404754a 100644 --- a/service-containers-agnostic/constructors.nix +++ b/service-containers-agnostic/constructors.nix @@ -23,10 +23,12 @@ in enableApacheWebApplication = true; }); inherit forceDisableUserChange; + inherit (pkgs) lib; }; simpleAppservingTomcat = import ./apache-tomcat/simple-appserving-tomcat.nix { inherit stateDir; + inherit (pkgs) lib; tomcatConstructorFun = constructors.simpleAppservingTomcat; dysnomia = pkgs.dysnomia.override (origArgs: { enableTomcatWebApplication = true; @@ -38,6 +40,7 @@ in dysnomia = pkgs.dysnomia.override (origArgs: { enableInfluxDatabase = true; }); + inherit (pkgs) lib; }; simpleMongodb = import ./mongodb/simplemongodb.nix { @@ -49,6 +52,7 @@ in }; mysql = import ./mysql { + inherit (pkgs) lib; inherit runtimeDir; mysqlConstructorFun = constructors.mysql; dysnomia = pkgs.dysnomia.override (origArgs: { @@ -58,6 +62,7 @@ in postgresql = import ./postgresql { inherit runtimeDir; + inherit (pkgs) lib; postgresqlConstructorFun = constructors.postgresql; dysnomia = pkgs.dysnomia.override (origArgs: { enablePostgreSQLDatabase = true; @@ -66,7 +71,7 @@ in extendableSupervisord = import ./supervisord/extendable-supervisord.nix { inherit stateDir; - inherit (pkgs) stdenv; + inherit (pkgs) lib; supervisordConstructorFun = constructors.extendableSupervisord; dysnomia = pkgs.dysnomia.override (origArgs: { enableSupervisordProgram = true; @@ -74,6 +79,7 @@ in }; svnserve = import ./svnserve { + inherit (pkgs) lib; svnserveConstructorFun = constructors.svnserve; dysnomia = pkgs.dysnomia.override (origArgs: { enableSubversionRepository = true; diff --git a/service-containers-agnostic/influxdb/simpleinfluxdb.nix b/service-containers-agnostic/influxdb/simpleinfluxdb.nix index f303ee0..1ebf0bc 100644 --- a/service-containers-agnostic/influxdb/simpleinfluxdb.nix +++ b/service-containers-agnostic/influxdb/simpleinfluxdb.nix @@ -1,5 +1,16 @@ -{influxdbConstructorFun, dysnomia}: -{instanceSuffix ? "", instanceName ? "influxdb${instanceSuffix}", containerName ? "influx-database${instanceSuffix}", rpcBindIP ? "127.0.0.1", rpcPort ? 8088, httpBindIP ? "", httpPort ? 8086, extraConfig ? "", type, properties ? {}}: +{influxdbConstructorFun, lib, dysnomia}: + +{ instanceSuffix ? "" +, instanceName ? "influxdb${instanceSuffix}" +, containerName ? "influx-database${instanceSuffix}" +, rpcBindIP ? "127.0.0.1" +, rpcPort ? 8088 +, httpBindIP ? "" +, httpPort ? 8086 +, extraConfig ? "" +, type ? null +, properties ? {} +}: let pkg = influxdbConstructorFun { @@ -20,8 +31,10 @@ let in rec { name = instanceName; - inherit pkg type; + inherit pkg; influxdbUsername = instanceName; influxdbHttpPort = httpPort; providesContainer = containerName; +} // lib.optionalAttrs (type != null) { + inherit type; } // properties diff --git a/service-containers-agnostic/mongodb/simplemongodb.nix b/service-containers-agnostic/mongodb/simplemongodb.nix index 2f9f3bb..6226e64 100644 --- a/service-containers-agnostic/mongodb/simplemongodb.nix +++ b/service-containers-agnostic/mongodb/simplemongodb.nix @@ -6,7 +6,7 @@ , port ? 27017 , mongoDumpArgs ? null , mongoRestoreArgs ? null -, type +, type ? null , properties ? {} }: @@ -30,9 +30,11 @@ let in { name = instanceName; - inherit pkg type bindIP port; + inherit pkg bindIP port; mongoPort = port; providesContainer = containerName; +} // lib.optionalAttrs (type != null) { + inherit type; } // (if mongoDumpArgs == null then {} else { inherit mongoDumpArgs; }) // (if mongoRestoreArgs == null then {} else { diff --git a/service-containers-agnostic/mysql/default.nix b/service-containers-agnostic/mysql/default.nix index 8ea3372..2ba00a7 100644 --- a/service-containers-agnostic/mysql/default.nix +++ b/service-containers-agnostic/mysql/default.nix @@ -1,9 +1,9 @@ -{mysqlConstructorFun, dysnomia, runtimeDir}: +{mysqlConstructorFun, lib, dysnomia, runtimeDir}: { instanceSuffix ? "", instanceName ? "mysql${instanceSuffix}" , port ? 3306 , containerName ? "mysql-database${instanceSuffix}" -, type +, type ? null , properties ? {} }: @@ -44,7 +44,9 @@ rec { name = instanceName; mysqlPort = port; - inherit pkg type mysqlSocket mysqlUsername; + inherit pkg mysqlSocket mysqlUsername; providesContainer = containerName; +} // lib.optionalAttrs (type != null) { + inherit type; } // properties diff --git a/service-containers-agnostic/postgresql/default.nix b/service-containers-agnostic/postgresql/default.nix index 3a3a486..6eb9b2f 100644 --- a/service-containers-agnostic/postgresql/default.nix +++ b/service-containers-agnostic/postgresql/default.nix @@ -1,9 +1,9 @@ -{postgresqlConstructorFun, dysnomia, runtimeDir}: +{postgresqlConstructorFun, lib, dysnomia, runtimeDir}: { instanceSuffix ? "", instanceName ? "postgresql${instanceSuffix}" , containerName ? "postgresql-database${instanceSuffix}" , port ? 5432 -, type +, type ? null , properties ? {} }: @@ -32,7 +32,9 @@ rec { postgresqlPort = port; postgresqlUsername = username; - inherit pkg type; + inherit pkg; providesContainer = containerName; +} // lib.optionalAttrs (type != null) { + inherit type; } // properties diff --git a/service-containers-agnostic/supervisord/extendable-supervisord.nix b/service-containers-agnostic/supervisord/extendable-supervisord.nix index 85e0ea8..e2a3b2a 100644 --- a/service-containers-agnostic/supervisord/extendable-supervisord.nix +++ b/service-containers-agnostic/supervisord/extendable-supervisord.nix @@ -1,10 +1,10 @@ -{supervisordConstructorFun, stdenv, dysnomia, stateDir}: +{supervisordConstructorFun, lib, dysnomia, stateDir}: { instanceSuffix ? "", instanceName ? "supervisord${instanceSuffix}" , containerName ? "supervisord-program${instanceSuffix}" , inetHTTPServerPort ? 9001 , postInstall ? "" -, type +, type ? null , properties ? {} }: @@ -28,6 +28,8 @@ let in { name = instanceName; - inherit pkg type supervisordTargetDir; + inherit pkg supervisordTargetDir; providesContainer = containerName; +} // lib.optionalAttrs (type != null) { + inherit type; } // properties diff --git a/service-containers-agnostic/svnserve/default.nix b/service-containers-agnostic/svnserve/default.nix index dd09512..39c65fa 100644 --- a/service-containers-agnostic/svnserve/default.nix +++ b/service-containers-agnostic/svnserve/default.nix @@ -1,11 +1,11 @@ -{svnserveConstructorFun, dysnomia}: +{svnserveConstructorFun, lib, dysnomia}: { instanceSuffix ? "", instanceName ? "svnserve${instanceSuffix}" , containerName ? "subversion-repository${instanceSuffix}" , port ? 3690 , svnBaseDir , svnGroup ? "root" -, type +, type ? null , properties ? {} }: @@ -28,6 +28,8 @@ let in { name = instanceName; - inherit pkg type svnGroup svnBaseDir; + inherit pkg svnGroup svnBaseDir; providesContainer = containerName; +} // lib.optionalAttrs (type != null) { + inherit type; } // properties diff --git a/services-agnostic/disnix-service/default.nix b/services-agnostic/disnix-service/default.nix index 986ecdb..ff417a0 100644 --- a/services-agnostic/disnix-service/default.nix +++ b/services-agnostic/disnix-service/default.nix @@ -3,6 +3,8 @@ { dbus-daemon ? null , dysnomiaProperties ? {} , dysnomiaContainers ? {} +, containerProviders ? [] +, extraDysnomiaContainersPath ? [] , processManagerContainerSettings ? {} }: @@ -21,10 +23,11 @@ createManagedProcess { process = "${disnix}/bin/disnix-service"; path = [ nix dysnomiaPkg disnix inetutils ]; environment = import ./dysnomia-env.nix { - inherit stdenv lib writeTextFile nix-processmgmt processManager dysnomiaProperties dysnomiaContainers processManagerContainerSettings; + inherit stdenv lib writeTextFile nix-processmgmt processManager dysnomiaProperties dysnomiaContainers containerProviders extraDysnomiaContainersPath processManagerContainerSettings; }; daemonExtraArgs = [ "--daemon" ]; - dependencies = lib.optional (dbus-daemon != null) dbus-daemon.pkg; + dependencies = lib.optional (dbus-daemon != null) dbus-daemon.pkg + ++ map (containerProvider: containerProvider.pkg) containerProviders; credentials = { groups = { diff --git a/services-agnostic/disnix-service/dysnomia-env.nix b/services-agnostic/disnix-service/dysnomia-env.nix index 6702157..71329bd 100644 --- a/services-agnostic/disnix-service/dysnomia-env.nix +++ b/services-agnostic/disnix-service/dysnomia-env.nix @@ -1,4 +1,15 @@ -{stdenv, lib, writeTextFile, nix-processmgmt, processManager, dysnomiaProperties, dysnomiaContainers, processManagerContainerSettings}: +{ stdenv +, lib +, writeTextFile +, nix-processmgmt + +, processManager +, dysnomiaProperties +, dysnomiaContainers +, containerProviders +, extraDysnomiaContainersPath +, processManagerContainerSettings +}: let # Take some default system properties, override them with the specified Dysnomia properties @@ -22,7 +33,7 @@ let text = printProperties _dysnomiaProperties; }; - # For process manager that manages the disnix-serivce, expose it as a container + # For process managers that manages the disnix-service, expose it as a container processManagerDysnomiaModule = import "${nix-processmgmt}/nixproc/derive-dysnomia-process-type.nix" { inherit processManager; }; @@ -43,6 +54,10 @@ let wrapper = {}; } // processManagerContainer) dysnomiaContainers; + containerProvidersContainerPath = map (containerProvider: "${containerProvider.pkg}/etc/dysnomia/containers") containerProviders; + + containerProvidersModulesPath = map (containerProvider: "${containerProvider.pkg}/libexec/dysnomia") containerProviders; + # Generate container configuration files containersDir = stdenv.mkDerivation { name = "dysnomia-containers"; @@ -66,5 +81,6 @@ let in { DYSNOMIA_PROPERTIES = dysnomiaPropertiesFile; - DYSNOMIA_CONTAINERS_PATH = containersDir; + DYSNOMIA_CONTAINERS_PATH = builtins.concatStringsSep ":" ([containersDir] ++ containerProvidersContainerPath ++ extraDysnomiaContainersPath); + DYSNOMIA_MODULES_PATH = builtins.concatStringsSep ":" containerProvidersModulesPath; }