diff --git a/maintainers/maintainer-list.nix b/maintainers/maintainer-list.nix
index d2faca2e87a0..b7ee71285138 100644
--- a/maintainers/maintainer-list.nix
+++ b/maintainers/maintainer-list.nix
@@ -4071,6 +4071,16 @@
github = "klntsky";
githubId = 18447310;
};
+ kloenk = {
+ email = "me@kloenk.de";
+ name = "Finn Behrens";
+ github = "kloenk";
+ githubId = 12898828;
+ keys = [{
+ longkeyid = "ed25519/0xB92445CFC9546F9D";
+ fingerprint = "6881 5A95 D715 D429 659B 48A4 B924 45CF C954 6F9D";
+ }];
+ };
kmcopper = {
email = "kmcopper@danwin1210.me";
name = "Kyle Copperfield";
diff --git a/nixos/modules/module-list.nix b/nixos/modules/module-list.nix
index daa0f6cc2eee..9f9bf3bc5329 100644
--- a/nixos/modules/module-list.nix
+++ b/nixos/modules/module-list.nix
@@ -830,6 +830,7 @@
./services/web-apps/cryptpad.nix
./services/web-apps/documize.nix
./services/web-apps/dokuwiki.nix
+ ./services/web-apps/engelsystem.nix
./services/web-apps/frab.nix
./services/web-apps/gerrit.nix
./services/web-apps/gotify-server.nix
diff --git a/nixos/modules/services/web-apps/engelsystem.nix b/nixos/modules/services/web-apps/engelsystem.nix
new file mode 100644
index 000000000000..899582a20304
--- /dev/null
+++ b/nixos/modules/services/web-apps/engelsystem.nix
@@ -0,0 +1,186 @@
+{ config, lib, pkgs, utils, ... }:
+
+let
+ inherit (lib) mkDefault mkEnableOption mkIf mkOption types literalExample;
+ cfg = config.services.engelsystem;
+in {
+ options = {
+ services.engelsystem = {
+ enable = mkOption {
+ default = false;
+ example = true;
+ description = ''
+ Whether to enable engelsystem, an online tool for coordinating helpers
+ and shifts on large events.
+ '';
+ type = lib.types.bool;
+ };
+
+ domain = mkOption {
+ type = types.str;
+ example = "engelsystem.example.com";
+ description = "Domain to serve on.";
+ };
+
+ package = mkOption {
+ type = types.package;
+ example = literalExample "pkgs.engelsystem";
+ description = "Engelsystem package used for the service.";
+ default = pkgs.engelsystem;
+ };
+
+ createDatabase = mkOption {
+ type = types.bool;
+ default = true;
+ description = ''
+ Whether to create a local database automatically.
+ This will override every database setting in .
+ '';
+ };
+ };
+
+ services.engelsystem.config = mkOption {
+ type = types.attrs;
+ default = {
+ database = {
+ host = "localhost";
+ database = "engelsystem";
+ username = "engelsystem";
+ };
+ };
+ example = {
+ maintenance = false;
+ database = {
+ host = "database.example.com";
+ database = "engelsystem";
+ username = "engelsystem";
+ password._secret = "/var/keys/engelsystem/database";
+ };
+ email = {
+ driver = "smtp";
+ host = "smtp.example.com";
+ port = 587;
+ from.address = "engelsystem@example.com";
+ from.name = "example engelsystem";
+ encryption = "tls";
+ username = "engelsystem@example.com";
+ password._secret = "/var/keys/engelsystem/mail";
+ };
+ autoarrive = true;
+ min_password_length = 6;
+ default_locale = "de_DE";
+ };
+ description = ''
+ Options to be added to config.php, as a nix attribute set. Options containing secret data
+ should be set to an attribute set containing the attribute _secret - a string pointing to a
+ file containing the value the option should be set to. See the example to get a better
+ picture of this: in the resulting config.php file, the email.password key will be set to
+ the contents of the /var/keys/engelsystem/mail file.
+
+ See https://engelsystem.de/doc/admin/configuration/ for available options.
+
+ Note that the admin user login credentials cannot be set here - they always default to
+ admin:asdfasdf. Log in and change them immediately.
+ '';
+ };
+ };
+
+ config = mkIf cfg.enable {
+ # create database
+ services.mysql = mkIf cfg.createDatabase {
+ enable = true;
+ package = mkDefault pkgs.mysql;
+ ensureUsers = [{
+ name = "engelsystem";
+ ensurePermissions = { "engelsystem.*" = "ALL PRIVILEGES"; };
+ }];
+ ensureDatabases = [ "engelsystem" ];
+ };
+
+ environment.etc."engelsystem/config.php".source =
+ pkgs.writeText "config.php" ''
+ login"
+ )
+ engelsystem.succeed(
+ "xml sel -T -t -m \"html/head/meta[@name='csrf-token']\" -v @content login >token"
+ )
+ engelsystem.succeed(
+ "curl engelsystem/login -sS -f -b cookie -F 'login=admin' -F 'password=asdfasdf' -F '_token=news"
+ )
+ engelsystem.succeed(
+ "test 'News - Engelsystem' = \"$(xml sel -T -t -c html/head/title news)\""
+ )
+ '';
+ })
diff --git a/pkgs/servers/web-apps/engelsystem/default.nix b/pkgs/servers/web-apps/engelsystem/default.nix
new file mode 100644
index 000000000000..8ef6a9afa0e8
--- /dev/null
+++ b/pkgs/servers/web-apps/engelsystem/default.nix
@@ -0,0 +1,52 @@
+{ stdenv, fetchzip, php, writeText, nixosTests }:
+
+let
+ phpExt = php.withExtensions
+ ({ enabled, all }: with all; [ json filter mysqlnd mysqli pdo pdo_mysql ]);
+in stdenv.mkDerivation rec {
+ pname = "engelsystem";
+ version = "3.1.0";
+
+ src = fetchzip {
+ url =
+ "https://github.com/engelsystem/engelsystem/releases/download/v3.1.0/engelsystem-v3.1.0.zip";
+ sha256 = "01wra7li7n5kn1l6xkrmw4vlvvyqh089zs43qzn98hj0mw8gw7ai";
+ # This is needed, because the zip contains a directory with world write access, which is not allowed in nix
+ extraPostFetch = "chmod -R a-w $out";
+ };
+
+ buildInputs = [ phpExt ];
+
+ installPhase = ''
+ runHook preInstall
+
+ # prepare
+ rm -r ./storage/
+ rm -r ./docker/
+
+ ln -sf /etc/engelsystem/config.php ./config/config.php
+ ln -sf /var/lib/engelsystem/storage/ ./storage
+
+ mkdir -p $out/share/engelsystem
+ mkdir -p $out/bin
+ cp -r . $out/share/engelsystem
+
+ echo $(command -v php)
+ # The patchShebangAuto function always used the php without extensions, so path the shebang manually
+ sed -i -e "1 s|.*|#\!${phpExt}/bin/php|" "$out/share/engelsystem/bin/migrate"
+ ln -s "$out/share/engelsystem/bin/migrate" "$out/bin/migrate"
+
+ runHook postInstall
+ '';
+
+ passthru.tests = nixosTests.engelsystem;
+
+ meta = with stdenv.lib; {
+ description =
+ "Coordinate your helpers in teams, assign them to work shifts or let them decide for themselves when and where they want to help with what";
+ license = licenses.gpl2;
+ homepage = "https://engelsystem.de";
+ maintainers = with maintainers; [ kloenk ];
+ platforms = platforms.all;
+ };
+}
diff --git a/pkgs/top-level/all-packages.nix b/pkgs/top-level/all-packages.nix
index 2c4b18f7ac7c..553dc51b3362 100644
--- a/pkgs/top-level/all-packages.nix
+++ b/pkgs/top-level/all-packages.nix
@@ -15591,6 +15591,8 @@ in
dspam = callPackage ../servers/mail/dspam { };
+ engelsystem = callPackage ../servers/web-apps/engelsystem { };
+
etcd = callPackage ../servers/etcd { };
etcd_3_4 = callPackage ../servers/etcd/3.4.nix { };