diff --git a/nixos/modules/module-list.nix b/nixos/modules/module-list.nix
index 2fbab4a68739..f07de862eacd 100644
--- a/nixos/modules/module-list.nix
+++ b/nixos/modules/module-list.nix
@@ -460,6 +460,7 @@
./services/mail/opensmtpd.nix
./services/mail/pfix-srsd.nix
./services/mail/postfix.nix
+ ./services/mail/postfixadmin.nix
./services/mail/postsrsd.nix
./services/mail/postgrey.nix
./services/mail/spamassassin.nix
diff --git a/nixos/modules/services/mail/postfixadmin.nix b/nixos/modules/services/mail/postfixadmin.nix
new file mode 100644
index 000000000000..9fd6630ee368
--- /dev/null
+++ b/nixos/modules/services/mail/postfixadmin.nix
@@ -0,0 +1,164 @@
+{ lib, config, pkgs, ... }:
+
+with lib;
+
+let
+ cfg = config.services.postfixadmin;
+ fpm = config.services.phpfpm.pools.postfixadmin;
+ localDB = cfg.database.host == "localhost";
+ user = if localDB then cfg.database.username else "nginx";
+in
+{
+ options.services.postfixadmin = {
+ enable = mkOption {
+ type = types.bool;
+ default = false;
+ description = ''
+ Whether to enable postfixadmin.
+
+ Also enables nginx virtual host management.
+ Further nginx configuration can be done by adapting services.nginx.virtualHosts.<name>.
+ See for further information.
+ '';
+ };
+
+ hostName = mkOption {
+ type = types.str;
+ example = "postfixadmin.example.com";
+ description = "Hostname to use for the nginx vhost";
+ };
+
+ adminEmail = mkOption {
+ type = types.str;
+ example = "postfixadmin.example.com";
+ description = ''
+ Define the Site Admin's email address below.
+ This will be used to send emails from to create mailboxes and
+ from Send Email / Broadcast message pages.
+ '';
+ };
+
+ setupPasswordFile = mkOption {
+ type = types.path;
+ description = ''
+ Password file for the admin.
+ Generate with php -r "echo password_hash('some password here', PASSWORD_DEFAULT);"
+ '';
+ };
+
+ database = {
+ username = mkOption {
+ type = types.str;
+ default = "postfixadmin";
+ description = ''
+ Username for the postgresql connection.
+ If database.host is set to localhost, a unix user and group of the same name will be created as well.
+ '';
+ };
+ host = mkOption {
+ type = types.str;
+ default = "localhost";
+ description = ''
+ Host of the postgresql server. If this is not set to
+ localhost, you have to create the
+ postgresql user and database yourself, with appropriate
+ permissions.
+ '';
+ };
+ passwordFile = mkOption {
+ type = types.path;
+ description = "Password file for the postgresql connection. Must be readable by user nginx.";
+ };
+ dbname = mkOption {
+ type = types.str;
+ default = "postfixadmin";
+ description = "Name of the postgresql database";
+ };
+ };
+
+ extraConfig = mkOption {
+ type = types.lines;
+ default = "";
+ description = "Extra configuration for the postfixadmin instance, see postfixadmin's config.inc.php for available options.";
+ };
+ };
+
+ config = mkIf cfg.enable {
+ environment.etc."postfixadmin/config.local.php".text = ''
+