From d0fc18d22885cc1e2a92714f363993c063909db2 Mon Sep 17 00:00:00 2001
From: makefu <github@syntax-fehler.de>
Date: Mon, 8 Mar 2021 21:52:41 +0100
Subject: [PATCH 01/38] k 3 ma: remove dot lan

---
 krebs/3modules/makefu/default.nix | 19 -------------------
 1 file changed, 19 deletions(-)

diff --git a/krebs/3modules/makefu/default.nix b/krebs/3modules/makefu/default.nix
index c8e1e0386..f9fa037d3 100644
--- a/krebs/3modules/makefu/default.nix
+++ b/krebs/3modules/makefu/default.nix
@@ -108,12 +108,6 @@ in {
       ci = false;
       cores = 1;
       nets = {
-        lan = {
-          ip4.addr = "192.168.1.12";
-          aliases = [
-            "filepimp.lan"
-          ];
-        };
         retiolum.ip4.addr = "10.243.153.102";
       };
     };
@@ -123,12 +117,6 @@ in {
       cores = 2;
 
       nets = {
-        lan = {
-          ip4.addr = "192.168.1.11";
-          aliases = [
-            "omo.lan"
-          ];
-        };
         retiolum = {
           ip4.addr = "10.243.0.89";
           aliases = [
@@ -143,13 +131,6 @@ in {
       ci = true;
       cores = 4;
       nets = {
-        lan = {
-          ip4.addr = "192.168.8.11";
-          aliases = [
-            "wbob.lan"
-            "log.wbob.lan"
-          ];
-        };
         retiolum = {
           ip4.addr = "10.243.214.15";
           aliases = [

From 914163cec3b89e2abcbc58e535e648ac9788b305 Mon Sep 17 00:00:00 2001
From: makefu <github@syntax-fehler.de>
Date: Mon, 8 Mar 2021 23:41:47 +0100
Subject: [PATCH 02/38] ma ham: proxy pass via nginx

---
 makefu/2configs/ham/default.nix | 79 ++++++++++++++++++++++++---------
 makefu/2configs/ham/nginx.nix   | 10 +++++
 2 files changed, 69 insertions(+), 20 deletions(-)
 create mode 100644 makefu/2configs/ham/nginx.nix

diff --git a/makefu/2configs/ham/default.nix b/makefu/2configs/ham/default.nix
index d610fa5c1..8ed5f8f3c 100644
--- a/makefu/2configs/ham/default.nix
+++ b/makefu/2configs/ham/default.nix
@@ -7,10 +7,20 @@ let
   prefix = (import ./lib).prefix;
   firetv_stick = "192.168.1.24";
   hassdir = "/var/lib/hass";
+  unstable = import (pkgs.fetchFromGitHub {
+    owner = "nixos";
+    repo = "nixpkgs";
+    rev = (lib.importJSON ../../../krebs/nixpkgs-unstable.json).rev;
+    sha256 = (lib.importJSON ../../../krebs/nixpkgs-unstable.json).sha256;
+  }) {};
+
+
 in {
   imports = [
+    ./nginx.nix
     ./mqtt.nix
-    ./zigbee2mqtt/default.nix
+    ./zigbee2mqtt
+    ./signal-rest
 
     # hass config
     ./zigbee2mqtt/hass.nix
@@ -25,11 +35,13 @@ in {
 
     ./calendar/nextcloud.nix
 
+    ./automation/fenster_auf.nix
     ./automation/firetv_restart.nix
     ./automation/light_buttons.nix
     ./automation/wohnzimmer_rf_fernbedienung.nix
     ./automation/giesskanne.nix
-    ./automation/urlaub.nix
+    #./automation/urlaub.nix
+    ./automation/moodlight.nix
 
     ./light/arbeitszimmer.nix
     ./light/schlafzimmer.nix
@@ -37,6 +49,15 @@ in {
   ];
 
   services.home-assistant = {
+    package = (unstable.home-assistant.overrideAttrs (old: {
+      doInstallCheck = false;
+    })).override {
+      extraPackages = p: [ 
+        (p.callPackage ./deps/dwdwfsapi.nix {}) 
+        (p.callPackage ./deps/pykodi.nix {}) 
+        p.APScheduler ];
+    };
+
     config = {
       influxdb = {
         database = "ham";
@@ -53,6 +74,13 @@ in {
         latitude = "48.7687";
         longitude = "9.2478";
         elevation = 247;
+        auth_providers = [
+          { type = "trusted_networks";
+            trusted_networks = [ "192.168.1.0/24" ];
+            allow_bypass_login = true;
+          }
+          { type = "homeassistant"; }
+        ];
       };
       discovery = {};
       conversation = {};
@@ -72,33 +100,39 @@ in {
       api = {};
       esphome = {};
       camera = [];
-      telegram_bot = [
-        # secrets file: {
-        #  "platform": "broadcast",
-        #  "api_key": "", # talk to Botfather /newbot
-        #  "allowed_chat_ids": [ ID ] # curl -X GET #  https://api.telegram.org/bot<YOUR_API_TOKEN>/getUpdates
-        # }
-        (builtins.fromJSON
-          (builtins.readFile <secrets/hass/telegram-bot.json>))
-      ];
+      #telegram_bot = [
+      #  # secrets file: {
+      #  #  "platform": "broadcast",
+      #  #  "api_key": "", # talk to Botfather /newbot
+      #  #  "allowed_chat_ids": [ ID ] # curl -X GET #  https://api.telegram.org/bot<YOUR_API_TOKEN>/getUpdates
+      #  # }
+      #  (builtins.fromJSON
+      #    (builtins.readFile <secrets/hass/telegram-bot.json>))
+      #];
       notify = [
         {
           platform = "kodi";
-          name = "wohnzimmer";
+          name = "Kodi Wohnzimmer";
           host = firetv_stick;
         }
         {
-          platform = "telegram";
-          name = "telegrambot";
-          chat_id = builtins.elemAt
-            (builtins.fromJSON (builtins.readFile
-              <secrets/hass/telegram-bot.json>)).allowed_chat_ids 0;
-            }
+          platform = "nfandroidtv";
+          name = "FireTV Wohnzimmer";
+          host = firetv_stick;
+        }
+        #{
+        #  platform = "telegram";
+        #  name = "telegrambot";
+        #  chat_id = builtins.elemAt
+        #    (builtins.fromJSON (builtins.readFile
+        #      <secrets/hass/telegram-bot.json>)).allowed_chat_ids 0;
+        #}
           ];
       sun.elevation = 247;
       recorder = {};
       media_player = [
-        { platform = "FireTV Stick kodi";
+        { platform = "kodi";
+          name = "FireTV Stick kodi";
           host = firetv_stick;
         }
         { platform = "androidtv";
@@ -146,7 +180,12 @@ in {
         # https://www.home-assistant.io/cookbook/automation_for_rainy_days/
       ];
       frontend = { };
-      http = { };
+      http = {
+        use_x_forwarded_for = true;
+        server_host = "127.0.0.1";
+        trusted_proxies = [ "127.0.0.1" ];
+        #trusted_proxies = [ "192.168.1.0/24" ];
+      };
       switch = [];
       automation = [];
       script = { };
diff --git a/makefu/2configs/ham/nginx.nix b/makefu/2configs/ham/nginx.nix
new file mode 100644
index 000000000..2048ff215
--- /dev/null
+++ b/makefu/2configs/ham/nginx.nix
@@ -0,0 +1,10 @@
+let
+  internal-ip = "192.168.1.11";
+in {
+  services.nginx.recommendedProxySettings = true;
+  services.nginx.virtualHosts."hass" = {
+    serverAliases = [ "hass.lan" "ha" "ha.lan" ];
+    locations."/".proxyPass = "http://localhost:8123";
+    locations."/".proxyWebsockets = true;
+  };
+}

From ce2aadff1c8d1d44a51c3be27570c64e14fd13c1 Mon Sep 17 00:00:00 2001
From: makefu <github@syntax-fehler.de>
Date: Tue, 9 Mar 2021 22:14:51 +0100
Subject: [PATCH 03/38] ma ham -> ma home/ham

---
 makefu/2configs/{ => home}/ham/automation/firetv_restart.nix      | 0
 makefu/2configs/{ => home}/ham/automation/giesskanne.nix          | 0
 makefu/2configs/{ => home}/ham/automation/light_buttons.nix       | 0
 makefu/2configs/{ => home}/ham/automation/moodlight.nix           | 0
 makefu/2configs/{ => home}/ham/automation/urlaub.nix              | 0
 .../{ => home}/ham/automation/wohnzimmer_rf_fernbedienung.nix     | 0
 makefu/2configs/{ => home}/ham/calendar/nextcloud.nix             | 0
 makefu/2configs/{ => home}/ham/default.nix                        | 0
 makefu/2configs/{ => home}/ham/deps/dwdwfsapi.nix                 | 0
 makefu/2configs/{ => home}/ham/deps/pykodi.nix                    | 0
 makefu/2configs/{ => home}/ham/device_tracker/openwrt.nix         | 0
 makefu/2configs/{ => home}/ham/lib/default.nix                    | 0
 makefu/2configs/{ => home}/ham/light/arbeitszimmer.nix            | 0
 makefu/2configs/{ => home}/ham/light/schlafzimmer.nix             | 0
 makefu/2configs/{ => home}/ham/light/wohnzimmer.nix               | 0
 makefu/2configs/{ => home}/ham/mqtt.nix                           | 0
 makefu/2configs/{ => home}/ham/multi/fliegen-couter.nix           | 0
 makefu/2configs/{ => home}/ham/multi/flurlicht.nix                | 0
 makefu/2configs/{ => home}/ham/multi/kurzzeitwecker.nix           | 0
 makefu/2configs/{ => home}/ham/multi/the_playlist.nix             | 0
 makefu/2configs/{ => home}/ham/nginx.nix                          | 0
 makefu/2configs/{ => home}/ham/sensor/outside.nix                 | 0
 makefu/2configs/{ => home}/ham/zigbee2mqtt/default.nix            | 0
 makefu/2configs/{ => home}/ham/zigbee2mqtt/hass.nix               | 0
 makefu/2configs/{ => home}/ham/zigbee2mqtt/osram.nix              | 0
 25 files changed, 0 insertions(+), 0 deletions(-)
 rename makefu/2configs/{ => home}/ham/automation/firetv_restart.nix (100%)
 rename makefu/2configs/{ => home}/ham/automation/giesskanne.nix (100%)
 rename makefu/2configs/{ => home}/ham/automation/light_buttons.nix (100%)
 rename makefu/2configs/{ => home}/ham/automation/moodlight.nix (100%)
 rename makefu/2configs/{ => home}/ham/automation/urlaub.nix (100%)
 rename makefu/2configs/{ => home}/ham/automation/wohnzimmer_rf_fernbedienung.nix (100%)
 rename makefu/2configs/{ => home}/ham/calendar/nextcloud.nix (100%)
 rename makefu/2configs/{ => home}/ham/default.nix (100%)
 rename makefu/2configs/{ => home}/ham/deps/dwdwfsapi.nix (100%)
 rename makefu/2configs/{ => home}/ham/deps/pykodi.nix (100%)
 rename makefu/2configs/{ => home}/ham/device_tracker/openwrt.nix (100%)
 rename makefu/2configs/{ => home}/ham/lib/default.nix (100%)
 rename makefu/2configs/{ => home}/ham/light/arbeitszimmer.nix (100%)
 rename makefu/2configs/{ => home}/ham/light/schlafzimmer.nix (100%)
 rename makefu/2configs/{ => home}/ham/light/wohnzimmer.nix (100%)
 rename makefu/2configs/{ => home}/ham/mqtt.nix (100%)
 rename makefu/2configs/{ => home}/ham/multi/fliegen-couter.nix (100%)
 rename makefu/2configs/{ => home}/ham/multi/flurlicht.nix (100%)
 rename makefu/2configs/{ => home}/ham/multi/kurzzeitwecker.nix (100%)
 rename makefu/2configs/{ => home}/ham/multi/the_playlist.nix (100%)
 rename makefu/2configs/{ => home}/ham/nginx.nix (100%)
 rename makefu/2configs/{ => home}/ham/sensor/outside.nix (100%)
 rename makefu/2configs/{ => home}/ham/zigbee2mqtt/default.nix (100%)
 rename makefu/2configs/{ => home}/ham/zigbee2mqtt/hass.nix (100%)
 rename makefu/2configs/{ => home}/ham/zigbee2mqtt/osram.nix (100%)

diff --git a/makefu/2configs/ham/automation/firetv_restart.nix b/makefu/2configs/home/ham/automation/firetv_restart.nix
similarity index 100%
rename from makefu/2configs/ham/automation/firetv_restart.nix
rename to makefu/2configs/home/ham/automation/firetv_restart.nix
diff --git a/makefu/2configs/ham/automation/giesskanne.nix b/makefu/2configs/home/ham/automation/giesskanne.nix
similarity index 100%
rename from makefu/2configs/ham/automation/giesskanne.nix
rename to makefu/2configs/home/ham/automation/giesskanne.nix
diff --git a/makefu/2configs/ham/automation/light_buttons.nix b/makefu/2configs/home/ham/automation/light_buttons.nix
similarity index 100%
rename from makefu/2configs/ham/automation/light_buttons.nix
rename to makefu/2configs/home/ham/automation/light_buttons.nix
diff --git a/makefu/2configs/ham/automation/moodlight.nix b/makefu/2configs/home/ham/automation/moodlight.nix
similarity index 100%
rename from makefu/2configs/ham/automation/moodlight.nix
rename to makefu/2configs/home/ham/automation/moodlight.nix
diff --git a/makefu/2configs/ham/automation/urlaub.nix b/makefu/2configs/home/ham/automation/urlaub.nix
similarity index 100%
rename from makefu/2configs/ham/automation/urlaub.nix
rename to makefu/2configs/home/ham/automation/urlaub.nix
diff --git a/makefu/2configs/ham/automation/wohnzimmer_rf_fernbedienung.nix b/makefu/2configs/home/ham/automation/wohnzimmer_rf_fernbedienung.nix
similarity index 100%
rename from makefu/2configs/ham/automation/wohnzimmer_rf_fernbedienung.nix
rename to makefu/2configs/home/ham/automation/wohnzimmer_rf_fernbedienung.nix
diff --git a/makefu/2configs/ham/calendar/nextcloud.nix b/makefu/2configs/home/ham/calendar/nextcloud.nix
similarity index 100%
rename from makefu/2configs/ham/calendar/nextcloud.nix
rename to makefu/2configs/home/ham/calendar/nextcloud.nix
diff --git a/makefu/2configs/ham/default.nix b/makefu/2configs/home/ham/default.nix
similarity index 100%
rename from makefu/2configs/ham/default.nix
rename to makefu/2configs/home/ham/default.nix
diff --git a/makefu/2configs/ham/deps/dwdwfsapi.nix b/makefu/2configs/home/ham/deps/dwdwfsapi.nix
similarity index 100%
rename from makefu/2configs/ham/deps/dwdwfsapi.nix
rename to makefu/2configs/home/ham/deps/dwdwfsapi.nix
diff --git a/makefu/2configs/ham/deps/pykodi.nix b/makefu/2configs/home/ham/deps/pykodi.nix
similarity index 100%
rename from makefu/2configs/ham/deps/pykodi.nix
rename to makefu/2configs/home/ham/deps/pykodi.nix
diff --git a/makefu/2configs/ham/device_tracker/openwrt.nix b/makefu/2configs/home/ham/device_tracker/openwrt.nix
similarity index 100%
rename from makefu/2configs/ham/device_tracker/openwrt.nix
rename to makefu/2configs/home/ham/device_tracker/openwrt.nix
diff --git a/makefu/2configs/ham/lib/default.nix b/makefu/2configs/home/ham/lib/default.nix
similarity index 100%
rename from makefu/2configs/ham/lib/default.nix
rename to makefu/2configs/home/ham/lib/default.nix
diff --git a/makefu/2configs/ham/light/arbeitszimmer.nix b/makefu/2configs/home/ham/light/arbeitszimmer.nix
similarity index 100%
rename from makefu/2configs/ham/light/arbeitszimmer.nix
rename to makefu/2configs/home/ham/light/arbeitszimmer.nix
diff --git a/makefu/2configs/ham/light/schlafzimmer.nix b/makefu/2configs/home/ham/light/schlafzimmer.nix
similarity index 100%
rename from makefu/2configs/ham/light/schlafzimmer.nix
rename to makefu/2configs/home/ham/light/schlafzimmer.nix
diff --git a/makefu/2configs/ham/light/wohnzimmer.nix b/makefu/2configs/home/ham/light/wohnzimmer.nix
similarity index 100%
rename from makefu/2configs/ham/light/wohnzimmer.nix
rename to makefu/2configs/home/ham/light/wohnzimmer.nix
diff --git a/makefu/2configs/ham/mqtt.nix b/makefu/2configs/home/ham/mqtt.nix
similarity index 100%
rename from makefu/2configs/ham/mqtt.nix
rename to makefu/2configs/home/ham/mqtt.nix
diff --git a/makefu/2configs/ham/multi/fliegen-couter.nix b/makefu/2configs/home/ham/multi/fliegen-couter.nix
similarity index 100%
rename from makefu/2configs/ham/multi/fliegen-couter.nix
rename to makefu/2configs/home/ham/multi/fliegen-couter.nix
diff --git a/makefu/2configs/ham/multi/flurlicht.nix b/makefu/2configs/home/ham/multi/flurlicht.nix
similarity index 100%
rename from makefu/2configs/ham/multi/flurlicht.nix
rename to makefu/2configs/home/ham/multi/flurlicht.nix
diff --git a/makefu/2configs/ham/multi/kurzzeitwecker.nix b/makefu/2configs/home/ham/multi/kurzzeitwecker.nix
similarity index 100%
rename from makefu/2configs/ham/multi/kurzzeitwecker.nix
rename to makefu/2configs/home/ham/multi/kurzzeitwecker.nix
diff --git a/makefu/2configs/ham/multi/the_playlist.nix b/makefu/2configs/home/ham/multi/the_playlist.nix
similarity index 100%
rename from makefu/2configs/ham/multi/the_playlist.nix
rename to makefu/2configs/home/ham/multi/the_playlist.nix
diff --git a/makefu/2configs/ham/nginx.nix b/makefu/2configs/home/ham/nginx.nix
similarity index 100%
rename from makefu/2configs/ham/nginx.nix
rename to makefu/2configs/home/ham/nginx.nix
diff --git a/makefu/2configs/ham/sensor/outside.nix b/makefu/2configs/home/ham/sensor/outside.nix
similarity index 100%
rename from makefu/2configs/ham/sensor/outside.nix
rename to makefu/2configs/home/ham/sensor/outside.nix
diff --git a/makefu/2configs/ham/zigbee2mqtt/default.nix b/makefu/2configs/home/ham/zigbee2mqtt/default.nix
similarity index 100%
rename from makefu/2configs/ham/zigbee2mqtt/default.nix
rename to makefu/2configs/home/ham/zigbee2mqtt/default.nix
diff --git a/makefu/2configs/ham/zigbee2mqtt/hass.nix b/makefu/2configs/home/ham/zigbee2mqtt/hass.nix
similarity index 100%
rename from makefu/2configs/ham/zigbee2mqtt/hass.nix
rename to makefu/2configs/home/ham/zigbee2mqtt/hass.nix
diff --git a/makefu/2configs/ham/zigbee2mqtt/osram.nix b/makefu/2configs/home/ham/zigbee2mqtt/osram.nix
similarity index 100%
rename from makefu/2configs/ham/zigbee2mqtt/osram.nix
rename to makefu/2configs/home/ham/zigbee2mqtt/osram.nix

From 833e7455b3d7f0e90553d229e0cac0b391474745 Mon Sep 17 00:00:00 2001
From: makefu <github@syntax-fehler.de>
Date: Tue, 9 Mar 2021 22:15:34 +0100
Subject: [PATCH 04/38] ma home: init photoprism

---
 makefu/0tests/data/secrets/photoprism.nix |   4 +
 makefu/2configs/home/photoprism.nix       | 146 ++++++++++++++++++++++
 2 files changed, 150 insertions(+)
 create mode 100644 makefu/0tests/data/secrets/photoprism.nix
 create mode 100644 makefu/2configs/home/photoprism.nix

diff --git a/makefu/0tests/data/secrets/photoprism.nix b/makefu/0tests/data/secrets/photoprism.nix
new file mode 100644
index 000000000..17811ec5f
--- /dev/null
+++ b/makefu/0tests/data/secrets/photoprism.nix
@@ -0,0 +1,4 @@
+{
+  db.username = "photoprism";
+  db.password = "photoprism";
+}
diff --git a/makefu/2configs/home/photoprism.nix b/makefu/2configs/home/photoprism.nix
new file mode 100644
index 000000000..aaccd7350
--- /dev/null
+++ b/makefu/2configs/home/photoprism.nix
@@ -0,0 +1,146 @@
+{ pkgs, lib, ...}:
+# Start    | docker-compose up -d
+# Stop     | docker-compose stop
+# Update   | docker-compose pull
+# Logs     | docker-compose logs --tail=25 -f
+# Terminal | docker-compose exec photoprism bash
+# Help     | docker-compose exec photoprism photoprism help
+# Config   | docker-compose exec photoprism photoprism config
+# Reset    | docker-compose exec photoprism photoprism reset
+# Backup   | docker-compose exec photoprism photoprism backup -a -i
+# Restore  | docker-compose exec photoprism photoprism restore -a -i
+# Index    | docker-compose exec photoprism photoprism index
+# Reindex  | docker-compose exec photoprism photoprism index -a
+# Import   | docker-compose exec photoprism photoprism import
+# -------------------------------------------------------------------
+let
+  port = "2347";
+  photodir = "/media/cryptX/photos";
+  statedir = "/var/lib/photoprism/appsrv";
+  db-dir = "/var/lib/photoprism/mysql";
+  internal-ip = "192.168.1.11";
+  sec = import <secrets/photoprism.nix>;
+in
+{
+  virtualisation.oci-containers.backend = "docker";
+
+  services.nginx.virtualHosts."photos" = {
+    serverAliases = [
+              "photos.lan"
+      "foto"  "foto.lan"
+      "fotos" "fotos.lan"
+    ];
+
+    locations."/".proxyPass = "http://localhost:${port}";
+    locations."/".proxyWebsockets = true;
+    extraConfig = ''
+      if ( $server_addr != "${internal-ip}" ) {
+        return 403;
+      }
+    '';
+  };
+
+  systemd.services.workadventure-network = {
+    enable = true;
+    wantedBy = [ "multi-user.target" ];
+    script = ''
+      ${pkgs.docker}/bin/docker network create --driver bridge photoprism ||:
+    '';
+    after = [ "docker" ];
+    before = [
+      "docker-photoprism.service"
+      "docker-mysql-photoprism.service"
+    ];
+  };
+
+
+  virtualisation.oci-containers.containers.photoprism = {
+    image = "photoprism/photoprism:preview";
+    ports = ["${port}:${port}" ];
+    volumes = [
+      "${photodir}:/photoprism/originals"
+      "${statedir}:/photoprism/storage"
+    ];
+    extraOptions = [
+      "--security-opt" "seccomp=unconfined"
+      "--security-opt" "apparmor=unconfined"
+      "--network=photoprism"
+    ];
+    environment = {
+      PHOTOPRISM_HTTP_PORT = port;                     # Built-in Web server port
+      PHOTOPRISM_HTTP_COMPRESSION = "gzip";            # Improves transfer speed and bandwidth utilization (none or gzip)
+      PHOTOPRISM_DEBUG = "false";                      # Run in debug mode (shows additional log messages)
+      PHOTOPRISM_PUBLIC = "true";                      # No authentication required (disables password protection)
+      PHOTOPRISM_READONLY = "false";                   # Don't modify originals directory (reduced functionality)
+      PHOTOPRISM_EXPERIMENTAL = "true";                # Enables experimental features
+      PHOTOPRISM_DISABLE_WEBDAV = "false";             # Disables built-in WebDAV server
+      PHOTOPRISM_DISABLE_SETTINGS = "false";           # Disables Settings in Web UI
+      PHOTOPRISM_DISABLE_TENSORFLOW = "false";         # Disables using TensorFlow for image classification
+      PHOTOPRISM_DARKTABLE_PRESETS = "false";          # Enables Darktable presets and disables concurrent RAW conversion
+      PHOTOPRISM_DETECT_NSFW = "false";                # Flag photos as private that MAY be offensive (requires TensorFlow)
+      PHOTOPRISM_UPLOAD_NSFW = "true";                 # Allow uploads that MAY be offensive
+
+      #PHOTOPRISM_DATABASE_DRIVER = "postgres";
+      #PHOTOPRISM_DATABASE_SERVER = "postgres-prism:5432";
+      #PHOTOPRISM_DATABASE_NAME = "photoprism";
+      #PHOTOPRISM_DATABASE_USER = "photoprism";
+      #PHOTOPRISM_DATABASE_PASSWORD = "photoprism";
+
+      PHOTOPRISM_DATABASE_DRIVER= "mysql";           # Use MariaDB (or MySQL) instead of SQLite for improved performance
+      PHOTOPRISM_DATABASE_SERVER= "mysql-photoprism:3306" ;   # MariaDB database server (hostname:port)
+      PHOTOPRISM_DATABASE_NAME= "photoprism";        # MariaDB database schema name
+      PHOTOPRISM_DATABASE_USER= sec.db.username;        # MariaDB database user name
+      PHOTOPRISM_DATABASE_PASSWORD= sec.db.password;      # MariaDB database user password
+
+      PHOTOPRISM_SITE_URL = "http://localhost:2342/";  # Public PhotoPrism URL
+      PHOTOPRISM_SITE_TITLE = "PhotoPrism";
+      PHOTOPRISM_SITE_CAPTION = "FeMi Fotos";
+      PHOTOPRISM_SITE_DESCRIPTION = "Unsere Fotos";
+      PHOTOPRISM_SITE_AUTHOR = "FeMi";
+
+    };
+  };
+
+  virtualisation.oci-containers.containers.mysql-photoprism = {
+    image = "mariadb:10.5";
+    extraOptions = [
+      "--security-opt" "seccomp=unconfined"
+      "--security-opt" "apparmor=unconfined"
+      "--network=photoprism"
+    ];
+    ports = [ "3306:3306" ]; # no need to expose the database
+    #cmd = [ "mysqld"
+    #  "--transaction-isolation=READ-COMMITTED"
+    #  "--character-set-server=utf8mb4"
+    #  "--collation-server=utf8mb4_unicode_ci"
+    #  "--max-connections=512"
+    #  "--innodb-rollback-on-timeout=OFF"
+    #  "--innodb-lock-wait-timeout=50"
+    #];
+    volumes= [ "${db-dir}:/var/lib/mysql" ];
+    environment = {
+      MYSQL_ROOT_PASSWORD = "dickidibutt";
+      MYSQL_DATABASE= "photoprism";
+      MYSQL_USER = sec.db.username;
+      MYSQL_PASSWORD = sec.db.password;
+    };
+  };
+  #virtualisation.oci-containers.containers.postgres-prism = {
+  #  image = "postgres:12-alpine";
+  #  ports = [ "5432" ]; # no need to expose the database
+  #  environment = {
+  #    POSTGRES_DB = "photoprism";
+  #    POSTGRES_USER = "photoprism";
+  #    POSTGRES_PASSWORD = "photoprism";
+  #  };
+  #};
+
+  systemd.services.photoprism.serviceConfig = {
+    StandardOutput = lib.mkForce "journal";
+    StandardError = lib.mkForce "journal";
+  };
+  systemd.services.mysql-photoprism.serviceConfig = {
+    StandardOutput = lib.mkForce "journal";
+    StandardError = lib.mkForce "journal";
+  };
+}

From 52035a5ce4b7d0ff71826e6e63c0a5a410e69e12 Mon Sep 17 00:00:00 2001
From: makefu <github@syntax-fehler.de>
Date: Tue, 9 Mar 2021 22:16:13 +0100
Subject: [PATCH 05/38] ma ham/zigbee2mqtt: add secrets

---
 makefu/0tests/data/secrets/zigbee2mqtt.nix    |  6 +++
 .../2configs/home/ham/zigbee2mqtt/default.nix | 49 +++++++++++++++++--
 2 files changed, 52 insertions(+), 3 deletions(-)
 create mode 100644 makefu/0tests/data/secrets/zigbee2mqtt.nix

diff --git a/makefu/0tests/data/secrets/zigbee2mqtt.nix b/makefu/0tests/data/secrets/zigbee2mqtt.nix
new file mode 100644
index 000000000..c67ff3865
--- /dev/null
+++ b/makefu/0tests/data/secrets/zigbee2mqtt.nix
@@ -0,0 +1,6 @@
+{
+  mqtt.password = "hass";
+  mqtt.username = "hass";
+  zigbee.network_key = [ 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 ];
+}
+
diff --git a/makefu/2configs/home/ham/zigbee2mqtt/default.nix b/makefu/2configs/home/ham/zigbee2mqtt/default.nix
index a75075273..83c3c187c 100644
--- a/makefu/2configs/home/ham/zigbee2mqtt/default.nix
+++ b/makefu/2configs/home/ham/zigbee2mqtt/default.nix
@@ -2,23 +2,66 @@
 
 let
   dataDir = "/var/lib/zigbee2mqtt";
+  sec = import <secrets/zigbee2mqtt.nix>;
 in
   {
   # symlink the zigbee controller
+  #services.udev.extraRules = ''
+  #  SUBSYSTEM=="tty", ATTRS{idVendor}=="0451", ATTRS{idProduct}=="16a8", SYMLINK+="cc2531", MODE="0660", GROUP="dialout"
+  #'';
   services.udev.extraRules = ''
-    SUBSYSTEM=="tty", ATTRS{idVendor}=="0451", ATTRS{idProduct}=="16a8", SYMLINK+="cc2531", MODE="0660", GROUP="dialout"
+    SUBSYSTEM=="tty", ATTRS{idVendor}=="10c4", ATTRS{idProduct}=="ea60", SYMLINK+="cc2531", MODE="0660", GROUP="dialout"
   '';
 
   services.zigbee2mqtt = {
     enable = true;
     inherit dataDir;
+    config = {
+      permit_join = true;
+      serial.port = "/dev/cc2531";
+      homeassistant = true;
+      mqtt = {
+        server = "mqtt://omo.lan:1883";
+        base_topic = "/ham/zigbee";
+        user = sec.mqtt.username;
+        password = sec.mqtt.password;
+        include_device_information = true;
+        client_id = "zigbee2mqtt";
+      };
+      advanced = {
+        log_level = "debug";
+        log_output = [ "console" ];
+        last_seen = "ISO_8601";
+        elapsed = true;
+        reporting = true; # TODO test if it is better with groups
+        pan_id = 6755;
+        inherit (sec.zigbee) network_key;
+      };
+      map_options.graphviz.colors = {
+        fill = {
+          enddevice =  "#fff8ce" ;
+          coordinator = "#e04e5d";
+          router = "#4ea3e0";
+        };
+        font = {
+          coordinator= "#ffffff";
+          router = "#ffffff";
+          enddevice = "#000000";
+        };
+        line = {
+          active = "#009900";
+          inactive = "#994444";
+        };
+      };
+    };
   };
 
-  state = [ "${dataDir}/configuration.yaml" "${dataDir}/state.json" ];
+  state = [ "${dataDir}/devices.yaml" "${dataDir}/state.json" ];
 
   systemd.services.zigbee2mqtt = {
     # override automatic configuration.yaml deployment
-    serviceConfig.ExecStartPre = lib.mkForce "${pkgs.coreutils}/bin/true";
+    environment.ZIGBEE2MQTT_DATA = dataDir;
+    #serviceConfig.ExecStartPre = lib.mkForce "${pkgs.coreutils}/bin/true";
     after = [
       "home-assistant.service"
       "mosquitto.service"

From 07147023ddf7796562017a62369348a6a1b02fdc Mon Sep 17 00:00:00 2001
From: makefu <github@syntax-fehler.de>
Date: Tue, 9 Mar 2021 22:16:33 +0100
Subject: [PATCH 06/38] ma ham: use <nixpkgs-unstable>

---
 makefu/2configs/home/ham/default.nix | 7 +------
 1 file changed, 1 insertion(+), 6 deletions(-)

diff --git a/makefu/2configs/home/ham/default.nix b/makefu/2configs/home/ham/default.nix
index 8ed5f8f3c..e164b177f 100644
--- a/makefu/2configs/home/ham/default.nix
+++ b/makefu/2configs/home/ham/default.nix
@@ -7,12 +7,7 @@ let
   prefix = (import ./lib).prefix;
   firetv_stick = "192.168.1.24";
   hassdir = "/var/lib/hass";
-  unstable = import (pkgs.fetchFromGitHub {
-    owner = "nixos";
-    repo = "nixpkgs";
-    rev = (lib.importJSON ../../../krebs/nixpkgs-unstable.json).rev;
-    sha256 = (lib.importJSON ../../../krebs/nixpkgs-unstable.json).sha256;
-  }) {};
+  unstable = import <nixpkgs-unstable> {};
 
 
 in {

From 64bc6f1f6578de055ebdec5748f9af7c6a7d875c Mon Sep 17 00:00:00 2001
From: makefu <github@syntax-fehler.de>
Date: Tue, 9 Mar 2021 22:17:00 +0100
Subject: [PATCH 07/38] ma ham: add fenster_auf automation

---
 .../home/ham/automation/fenster_auf.nix       | 33 +++++++++++++++++++
 1 file changed, 33 insertions(+)
 create mode 100644 makefu/2configs/home/ham/automation/fenster_auf.nix

diff --git a/makefu/2configs/home/ham/automation/fenster_auf.nix b/makefu/2configs/home/ham/automation/fenster_auf.nix
new file mode 100644
index 000000000..ccebd5b00
--- /dev/null
+++ b/makefu/2configs/home/ham/automation/fenster_auf.nix
@@ -0,0 +1,33 @@
+let
+  min = 20;
+  fenster_offen = name: entity:
+    { alias = "${name} seit ${toString min} Minuten offen";
+      trigger = [
+          {
+            platform = "state";
+            entity_id = entity;
+            to = "on";
+            for.minutes = min;
+          }
+      ];
+      action =
+      [
+        {
+          service = "notify.firetv_wohnzimmer";
+          data = {
+            title = "${name} seit ${toString min} Minuten offen";
+            message = "Bitte einmal checken ob das ok ist :)";
+            data = {
+              interrupt = 1;
+              duration = 300;
+            };
+          };
+        }
+      ];
+    };
+in {
+  services.home-assistant.config.automation = [
+    (fenster_offen "Badezimmerfenster" "binary_sensor.badezimmer_fenster_contact")
+    (fenster_offen "Duschfenster" "binary_sensor.dusche_fenster_contact")
+  ];
+}

From cf0cdbc33d6751bd5c8d48ec0433b7db299a292d Mon Sep 17 00:00:00 2001
From: makefu <github@syntax-fehler.de>
Date: Fri, 12 Mar 2021 20:08:43 +0100
Subject: [PATCH 08/38] ma filepimp.r: clean up hardware, add disk

---
 makefu/1systems/filepimp/config.nix | 77 +++-----------------------
 makefu/1systems/filepimp/hw.nix     | 83 +++++++++++++++++++++++++++++
 makefu/1systems/filepimp/source.nix |  1 +
 3 files changed, 90 insertions(+), 71 deletions(-)
 create mode 100644 makefu/1systems/filepimp/hw.nix

diff --git a/makefu/1systems/filepimp/config.nix b/makefu/1systems/filepimp/config.nix
index e023c2885..346de10ba 100644
--- a/makefu/1systems/filepimp/config.nix
+++ b/makefu/1systems/filepimp/config.nix
@@ -1,26 +1,13 @@
 { config, pkgs, lib, ... }:
+# nix-shell -p wol --run 'wol C8:CB:B8:CF:E4:DC --passwd=CA-FE-BA-BE-13-37'
 let
-  byid = dev: "/dev/disk/by-id/" + dev;
-  part1 = disk: disk + "-part1";
-  rootDisk = byid "ata-SanDisk_SDSSDP064G_140237402890";
-  primary-interface = "enp3s0"; # c8:cb:b8:cf:e4:dc
-  # N54L Chassis:
-  # ____________________
-  # |______FRONT_______|
-  # |   [             ]|
-  # |   [ d1 ** d3 d4 ]|
-  # |___[_____________]|
-  jDisk1 = byid "ata-ST4000DM000-1F2168_Z3040NEA";
-
-  # transfer to omo
-  # jDisk0 = byid "ata-ST4000DM000-1F2168_Z303HVSG";
-  jDisk2 = byid "ata-WDC_WD40EFRX-68WT0N0_WD-WCC4E0621363";
-  jDisk3 = byid "ata-TOSHIBA_MD04ACA400_156GK89OFSBA";
-  allDisks = [ rootDisk jDisk1 jDisk2 jDisk3 ];
+  itf = config.makefu.server.primary-itf;
 in {
   imports =
     [ # Include the results of the hardware scan.
+      ./hw.nix
       <stockholm/makefu>
+      <stockholm/makefu/2configs/home-manager>
       <stockholm/makefu/2configs/fs/single-partition-ext4.nix>
       <stockholm/makefu/2configs/smart-monitor.nix>
       <stockholm/makefu/2configs/tinc/retiolum.nix>
@@ -28,64 +15,12 @@ in {
     ];
 
   krebs.build.host = config.krebs.hosts.filepimp;
-  # AMD N54L
-  boot = {
-    loader.grub.device = rootDisk;
 
-    initrd.availableKernelModules = [
-      "ahci"
-      "ohci_pci"
-      "ehci_pci"
-      "pata_atiixp"
-      "usb_storage"
-      "usbhid"
-    ];
-
-    kernelModules = [ "kvm-amd" ];
-    extraModulePackages = [ ];
-  };
-  hardware.enableRedistributableFirmware = true;
-  hardware.cpu.amd.updateMicrocode = true;
-
-  zramSwap.enable = true;
-
-  makefu.snapraid = let
-    toMedia = name: "/media/" + name;
-  in {
-    enable = true;
-    # todo combine creation when enabling the mount point
-    disks = map toMedia [
-                        # "j0"
-                          "j1"
-                          "j2"
-                        ];
-    parity = toMedia "par0";
-  };
-  # TODO: refactor, copy-paste from omo
-  services.smartd.devices = builtins.map (x: { device = x; }) allDisks;
-  powerManagement.powerUpCommands = lib.concatStrings (map (disk: ''
-      ${pkgs.hdparm}/sbin/hdparm -S 100 ${disk}
-      ${pkgs.hdparm}/sbin/hdparm -B 127 ${disk}
-      ${pkgs.hdparm}/sbin/hdparm -y ${disk}
-    '') allDisks);
-  fileSystems = let
-    xfsmount = name: dev:
-      { "/media/${name}" = {
-        device = dev; fsType = "xfs";
-        options = [ "nofail" ];
-      }; };
-  in
-  # (xfsmount "j0" (part1 jDisk0)) //
-    (xfsmount "j1" (part1 jDisk1)) //
-    (xfsmount "j2" (part1 jDisk2)) //
-    (xfsmount "par0" (part1 jDisk3))
-    ;
-
-  networking.firewall.trustedInterfaces = [ primary-interface ];
+  networking.firewall.trustedInterfaces = [ itf ];
 
   services.wakeonlan.interfaces = [
     {
-      interface = primary-interface;
+      interface = itf ;
       method = "password";
       password = "CA:FE:BA:BE:13:37";
     }
diff --git a/makefu/1systems/filepimp/hw.nix b/makefu/1systems/filepimp/hw.nix
new file mode 100644
index 000000000..6f02d9b1b
--- /dev/null
+++ b/makefu/1systems/filepimp/hw.nix
@@ -0,0 +1,83 @@
+{ config, pkgs, lib, ... }:
+
+let
+  byid = dev: "/dev/disk/by-id/" + dev;
+  part1 = disk: disk + "-part1";
+  rootDisk = byid "ata-SanDisk_SDSSDP064G_140237402890";
+  primary-interface = "enp3s0"; # c8:cb:b8:cf:e4:dc
+  # N54L Chassis:
+  # ____________________
+  # |______FRONT_______|
+  # |   [             ]|
+  # |   [ d1 d0 d3 d4 ]|
+  # |___[_____________]|
+  jDisk1 = byid "ata-ST4000DM000-1F2168_Z3040NEA";
+
+  # transfer to omo
+  jDisk0 = byid "ata-ST4000DM000-1F2168_Z303HVSG";
+  jDisk2 = byid "ata-WDC_WD40EFRX-68WT0N0_WD-WCC4E0621363";
+  jDisk3 = byid "ata-TOSHIBA_MD04ACA400_156GK89OFSBA";
+  allDisks = [ rootDisk jDisk0 jDisk1 jDisk2 jDisk3 ];
+in {
+  boot = {
+    loader.grub.device = rootDisk;
+
+    initrd.availableKernelModules = [
+      "ahci"
+      "ohci_pci"
+      "ehci_pci"
+      "pata_atiixp"
+      "usb_storage"
+      "usbhid"
+    ];
+
+    kernelModules = [ "kvm-amd" ];
+    extraModulePackages = [ ];
+  };
+  makefu.server.primary-itf = primary-interface;
+
+  hardware.enableRedistributableFirmware = true;
+  hardware.cpu.amd.updateMicrocode = true;
+
+  zramSwap.enable = true;
+
+  makefu.snapraid = let
+    toMedia = name: "/media/" + name;
+  in {
+    enable = true;
+    # todo combine creation when enabling the mount point
+    disks = map toMedia [
+                          "j0"
+                          "j1"
+                          "j2"
+                        ];
+    parity = toMedia "par0";
+  };
+  # TODO: refactor, copy-paste from omo
+  services.smartd.devices = builtins.map (x: { device = x; }) allDisks;
+  powerManagement.powerUpCommands = lib.concatStrings (map (disk: ''
+      ${pkgs.hdparm}/sbin/hdparm -S 100 ${disk}
+      ${pkgs.hdparm}/sbin/hdparm -B 127 ${disk}
+      ${pkgs.hdparm}/sbin/hdparm -y ${disk}
+    '') allDisks);
+  fileSystems = let
+    xfsmount = name: dev:
+      { "/media/${name}" = {
+        device = dev; fsType = "xfs";
+        options = [ "nofail" ];
+      }; };
+    tomedia = id: "/media/${id}";
+  in
+    (xfsmount "j0" (part1 jDisk0)) //
+    (xfsmount "j1" (part1 jDisk1)) //
+    (xfsmount "j2" (part1 jDisk2)) //
+    (xfsmount "par0" (part1 jDisk3)) //
+    { "/media/jX" = {
+        device = (lib.concatMapStringsSep ":" (d: (tomedia d)) ["j0" "j1" "j2" ]);
+        fsType = "mergerfs";
+        noCheck = true;
+        options = [ "defaults" "allow_other" "nofail" "nonempty" ];
+      };
+    };
+  environment.systemPackages = [ pkgs.mergerfs ];
+}
diff --git a/makefu/1systems/filepimp/source.nix b/makefu/1systems/filepimp/source.nix
index b81a2bf4a..9930f0e42 100644
--- a/makefu/1systems/filepimp/source.nix
+++ b/makefu/1systems/filepimp/source.nix
@@ -1,3 +1,4 @@
 {
   name="filepimp";
+  home-manager = true;
 }

From 27e182f7f878721c665b92b287e0d5f8da5bd06a Mon Sep 17 00:00:00 2001
From: makefu <github@syntax-fehler.de>
Date: Fri, 12 Mar 2021 20:09:10 +0100
Subject: [PATCH 09/38] ma: deploy storj on omo, forward via gum

---
 makefu/1systems/gum/config.nix         |  7 ++++++-
 makefu/2configs/storj/client.nix       | 27 ++++++++++++++++++++++++++
 makefu/2configs/storj/forward-port.nix | 22 +++++++++++++++++++++
 3 files changed, 55 insertions(+), 1 deletion(-)
 create mode 100644 makefu/2configs/storj/client.nix
 create mode 100644 makefu/2configs/storj/forward-port.nix

diff --git a/makefu/1systems/gum/config.nix b/makefu/1systems/gum/config.nix
index 2fd99122a..d81aefb67 100644
--- a/makefu/1systems/gum/config.nix
+++ b/makefu/1systems/gum/config.nix
@@ -43,6 +43,7 @@ in {
 
       <stockholm/makefu/2configs/zsh-user.nix>
       <stockholm/makefu/2configs/mosh.nix>
+      <stockholm/makefu/2configs/storj/forward-port.nix>
       # <stockholm/makefu/2configs/gui/xpra.nix>
 
       # networking
@@ -156,6 +157,7 @@ in {
       <stockholm/makefu/2configs/bgt/download.binaergewitter.de.nix>
       <stockholm/makefu/2configs/bgt/hidden_service.nix>
       <stockholm/makefu/2configs/bgt/backup.nix>
+      <stockholm/makefu/2configs/bgt/social-to-irc.nix>
 
       # <stockholm/makefu/2configs/logging/client.nix>
 
@@ -203,7 +205,10 @@ in {
   # Network
   networking = {
     firewall = {
-        allowedTCPPorts = [ 80 443 ];
+        allowedTCPPorts = [
+          80 443
+          28967  # storj
+        ];
         allowPing = true;
         logRefusedConnections = false;
     };
diff --git a/makefu/2configs/storj/client.nix b/makefu/2configs/storj/client.nix
new file mode 100644
index 000000000..e37e2ce23
--- /dev/null
+++ b/makefu/2configs/storj/client.nix
@@ -0,0 +1,27 @@
+{ lib, ... }:
+{
+  networking.firewall.allowedTCPPorts = [ 28967 ];
+  virtualisation.oci-containers.containers.storj-storagenode = {
+    image = "storjlabs/storagenode:latest";
+    ports = [
+      # TODO: omo ip
+      "0.0.0.0:28967:28967"
+      "127.0.0.1:14002:14002"
+    ];
+    environment = {
+      # SETUP = "true"; # must be run only once ...
+      WALLET = "0xeD0d2a2B33F6812b45d2D9FF7a139A3fF65a24C0";
+      EMAIL = "storj.io@syntax-fehler.de";
+      ADDRESS = "euer.krebsco.de:28967";
+      STORAGE = "3TB";
+    };
+    volumes = [
+      "/media/cryptX/lib/storj/identity:/app/identity"
+      "/media/cryptX/lib/storj/storage:/app/config"
+    ];
+  };
+  systemd.services.docker-storj-storagenode.serviceConfig = {
+    StandardOutput = lib.mkForce "journal";
+    StandardError = lib.mkForce "journal";
+  };
+}
diff --git a/makefu/2configs/storj/forward-port.nix b/makefu/2configs/storj/forward-port.nix
new file mode 100644
index 000000000..213f77470
--- /dev/null
+++ b/makefu/2configs/storj/forward-port.nix
@@ -0,0 +1,22 @@
+{
+  networking.firewall.allowedTCPPorts = [ 28967 ];
+  #networking.nat.forwardPorts = [
+  #  { # storj
+  #    destination = "10.243.0.89:28967";
+  #    proto = "tcp";
+  #    sourcePort = 28967;
+  #  }
+  #];
+  services.nginx.appendConfig = ''
+    stream {
+      upstream storj {
+          server omo.r:28967;
+      }
+
+      server {
+          listen 28967;
+          proxy_pass storj;
+      }
+  }
+    '';
+}

From ba614307cdc027dddd9aee2fecdaac86336957eb Mon Sep 17 00:00:00 2001
From: makefu <github@syntax-fehler.de>
Date: Fri, 12 Mar 2021 20:10:27 +0100
Subject: [PATCH 10/38] ma omo.r: deploy airsonic,photoprism,metube

---
 makefu/1systems/omo/config.nix      | 28 +++++++++++++++--------
 makefu/1systems/omo/hw/omo.nix      |  4 ++++
 makefu/2configs/home/airsonic.nix   | 29 ++++++++++++++++++++++++
 makefu/2configs/home/metube.nix     | 35 +++++++++++++++++++++++++++++
 makefu/2configs/home/photoprism.nix |  9 ++++----
 5 files changed, 92 insertions(+), 13 deletions(-)
 create mode 100644 makefu/2configs/home/airsonic.nix
 create mode 100644 makefu/2configs/home/metube.nix

diff --git a/makefu/1systems/omo/config.nix b/makefu/1systems/omo/config.nix
index a9e307ddf..a04593715 100644
--- a/makefu/1systems/omo/config.nix
+++ b/makefu/1systems/omo/config.nix
@@ -28,9 +28,11 @@ in {
       <stockholm/makefu/2configs/home-manager>
       <stockholm/makefu/2configs/home-manager/cli.nix>
       <stockholm/makefu/2configs/editor/neovim>
+      <stockholm/makefu/2configs/storj/client.nix>
 
 
       <stockholm/makefu/2configs/backup/state.nix>
+      <stockholm/makefu/2configs/backup/server.nix>
       <stockholm/makefu/2configs/exim-retiolum.nix>
       # <stockholm/makefu/2configs/smart-monitor.nix>
       <stockholm/makefu/2configs/mail-client.nix>
@@ -68,7 +70,7 @@ in {
       <stockholm/makefu/2configs/tinc/retiolum.nix>
 
       # statistics
-      <stockholm/makefu/2configs/stats/client.nix>
+      # <stockholm/makefu/2configs/stats/client.nix>
       # Logging
       #influx + grafana
       <stockholm/makefu/2configs/stats/server.nix>
@@ -91,13 +93,18 @@ in {
       <stockholm/makefu/2configs/virtualisation/docker.nix>
       <stockholm/makefu/2configs/bluetooth-mpd.nix>
 
-      <stockholm/makefu/2configs/ham>
+      <stockholm/makefu/2configs/home/ham>
+      <stockholm/makefu/2configs/home/airsonic.nix>
+      <stockholm/makefu/2configs/home/photoprism.nix>
+      <stockholm/makefu/2configs/home/metube.nix>
       {
         makefu.ps3netsrv = {
           enable = true;
           servedir = "/media/cryptX/emu/ps3";
         };
       }
+
+
       {
         hardware.pulseaudio.systemWide = true;
         makefu.mpd.musicDirectory = "/media/cryptX/music";
@@ -107,7 +114,15 @@ in {
       <stockholm/makefu/2configs/sshd-totp.nix>
       # <stockholm/makefu/2configs/logging/central-logging-client.nix>
 
-      <stockholm/makefu/2configs/torrent.nix>
+      # <stockholm/makefu/2configs/torrent.nix>
+      {
+        #krebs.rtorrent = {
+        #  downloadDir = lib.mkForce "/media/cryptX/torrent";
+        #  extraConfig = ''
+        #    upload_rate = 500
+        #  '';
+        #};
+      }
 
       # <stockholm/makefu/2configs/elchos/search.nix>
       # <stockholm/makefu/2configs/elchos/log.nix>
@@ -118,16 +133,11 @@ in {
 
       # Temporary:
       # <stockholm/makefu/2configs/temp/rst-issue.nix>
+      <stockholm/makefu/2configs/bgt/social-to-irc.nix>
 
     ];
   makefu.full-populate =  true;
   nixpkgs.config.allowUnfree = true;
-  krebs.rtorrent = {
-    downloadDir = lib.mkForce "/media/cryptX/torrent";
-    extraConfig = ''
-      upload_rate = 500
-    '';
-  };
   users.groups.share = {
     gid = (import <stockholm/lib>).genid "share";
     members = [ "makefu" "misa" ];
diff --git a/makefu/1systems/omo/hw/omo.nix b/makefu/1systems/omo/hw/omo.nix
index 586ad98c4..ae5b778bf 100644
--- a/makefu/1systems/omo/hw/omo.nix
+++ b/makefu/1systems/omo/hw/omo.nix
@@ -51,6 +51,10 @@ in {
     enable = true;
     disks = map toMapper [ 0 1 3 ];
     parity = toMapper 2; # find -name PARITY_PARTITION
+    extraConfig = ''
+      exclude /lib/storj/
+      exclude /.bitcoin/blocks/
+    '';
   };
   fileSystems = let
     cryptMount = name:
diff --git a/makefu/2configs/home/airsonic.nix b/makefu/2configs/home/airsonic.nix
new file mode 100644
index 000000000..15e77438d
--- /dev/null
+++ b/makefu/2configs/home/airsonic.nix
@@ -0,0 +1,29 @@
+{ config, ... }:
+let
+  internal-ip = "192.168.1.11";
+  port = 4040;
+in
+{
+  # networking.firewall.allowedTCPPorts = [ 4040 ];
+  services.airsonic = {
+    enable = true;
+    listenAddress = "0.0.0.0";
+    inherit port;
+  };
+  state = [ config.services.airsonic.home ];
+  services.nginx.virtualHosts."airsonic" = {
+    serverAliases = [
+              "airsonic.lan"
+      "music"  "music.lan"
+      "musik" "musik.lan"
+    ];
+
+    locations."/".proxyPass = "http://localhost:${toString port}";
+    locations."/".proxyWebsockets = true;
+    extraConfig = ''
+      if ( $server_addr != "${internal-ip}" ) {
+        return 403;
+      }
+    '';
+  };
+}
diff --git a/makefu/2configs/home/metube.nix b/makefu/2configs/home/metube.nix
new file mode 100644
index 000000000..c872bea08
--- /dev/null
+++ b/makefu/2configs/home/metube.nix
@@ -0,0 +1,35 @@
+{ pkgs, lib, ...}:
+# docker run -d -p 8081:8081 -v /path/to/downloads:/downloads --user 1001:1001 alexta69/metube
+with import <stockholm/lib>;
+let
+  port = "2348";
+  dl-dir = "/media/cryptX/youtube/music";
+  uid = 20421;
+  internal-ip = "192.168.1.11";
+in
+  {
+  systemd.tmpfiles.rules = [
+    "d ${dl-dir} metube nogroup - -"
+  ];
+  virtualisation.oci-containers.backend = "docker";
+
+  services.nginx.virtualHosts."tube" = {
+    serverAliases = [ "tube.lan" ];
+    locations."/".proxyPass = "http://localhost:${port}";
+  };
+
+  virtualisation.oci-containers.containers.metube = {
+    image = "alexta69/metube:latest";
+    ports = [ "${port}:8081" ];
+    volumes = [
+      "${dl-dir}:/downloads"
+    ];
+    user = "metube";
+  };
+  users.users.metube.uid = uid;
+
+  systemd.services.docker-metube.serviceConfig = {
+    StandardOutput = lib.mkForce "journal";
+    StandardError = lib.mkForce "journal";
+  };
+}
diff --git a/makefu/2configs/home/photoprism.nix b/makefu/2configs/home/photoprism.nix
index aaccd7350..ef4200576 100644
--- a/makefu/2configs/home/photoprism.nix
+++ b/makefu/2configs/home/photoprism.nix
@@ -16,8 +16,8 @@
 let
   port = "2347";
   photodir = "/media/cryptX/photos";
-  statedir = "/var/lib/photoprism/appsrv";
-  db-dir = "/var/lib/photoprism/mysql";
+  statedir = "/media/cryptX/lib/photoprism/appsrv";
+  db-dir = "/media/cryptX/lib/photoprism/mysql";
   internal-ip = "192.168.1.11";
   sec = import <secrets/photoprism.nix>;
 in
@@ -97,6 +97,7 @@ in
       PHOTOPRISM_SITE_CAPTION = "FeMi Fotos";
       PHOTOPRISM_SITE_DESCRIPTION = "Unsere Fotos";
       PHOTOPRISM_SITE_AUTHOR = "FeMi";
+      PHOTOPRISM_SPONSOR = "true";
 
     };
   };
@@ -135,11 +136,11 @@ in
   #  };
   #};
 
-  systemd.services.photoprism.serviceConfig = {
+  systemd.services.docker-photoprism.serviceConfig = {
     StandardOutput = lib.mkForce "journal";
     StandardError = lib.mkForce "journal";
   };
-  systemd.services.mysql-photoprism.serviceConfig = {
+  systemd.services.docker-mysql-photoprism.serviceConfig = {
     StandardOutput = lib.mkForce "journal";
     StandardError = lib.mkForce "journal";
   };

From 1ceb7c79fe6038059a85e094446e129f4408d7b6 Mon Sep 17 00:00:00 2001
From: makefu <github@syntax-fehler.de>
Date: Fri, 12 Mar 2021 20:11:00 +0100
Subject: [PATCH 11/38] ma bgt/social-to-irc: init

---
 makefu/2configs/bgt/social-to-irc.nix | 32 +++++++++++++++++++++++++++
 1 file changed, 32 insertions(+)
 create mode 100644 makefu/2configs/bgt/social-to-irc.nix

diff --git a/makefu/2configs/bgt/social-to-irc.nix b/makefu/2configs/bgt/social-to-irc.nix
new file mode 100644
index 000000000..ce89451c1
--- /dev/null
+++ b/makefu/2configs/bgt/social-to-irc.nix
@@ -0,0 +1,32 @@
+{
+  # systemd.services.brockman.environment."BROCKMAN_LOG_LEVEL" = "DEBUG";
+  krebs.brockman = {
+    enable = true;
+    config = {
+      channel = "#binaergewitter";
+      irc = {
+        host = "irc.freenode.net";
+        port = 6667;
+      };
+      #controller = {
+      #  nick = "brockman-systemdultras";
+      #  channels = [];
+      #};
+      bots = {
+        bgt-mastodon-rss = {
+          feed = "https://jit.social/users/binaergewitter.rss";
+          channels = [ "#binaergewitter" ];
+          delay = 180;
+          notifyErrors = false;
+        };
+        bgt-blog-rss = {
+          feed = "https://blog.binaergewitter.de/rss.xml";
+          channels = [ "#binaergewitter" ];
+          delay = 180;
+          notifyErrors = false;
+        };
+      };
+    };
+
+  };
+}

From b30e99dfb2d040ec47e2e772ca0d25b97cf54e21 Mon Sep 17 00:00:00 2001
From: makefu <github@syntax-fehler.de>
Date: Fri, 12 Mar 2021 20:11:43 +0100
Subject: [PATCH 12/38] ma wbob.r: split config and hardware

---
 makefu/1systems/wbob/config.nix      | 70 +++-------------------------
 makefu/1systems/wbob/nuc/default.nix | 23 +++++++++
 2 files changed, 30 insertions(+), 63 deletions(-)
 create mode 100644 makefu/1systems/wbob/nuc/default.nix

diff --git a/makefu/1systems/wbob/config.nix b/makefu/1systems/wbob/config.nix
index 32dedbde2..b70b48449 100644
--- a/makefu/1systems/wbob/config.nix
+++ b/makefu/1systems/wbob/config.nix
@@ -1,14 +1,15 @@
 { config, pkgs, lib, ... }:
 let
-  rootdisk = "/dev/disk/by-id/ata-TS256GMTS800_C613840115";
-  datadisk = "/dev/disk/by-id/ata-HGST_HTS721010A9E630_JR10006PH3A02F";
   user = config.makefu.gui.user;
   primaryIP = "192.168.8.11";
 in {
 
   imports =
-    [ # Include the results of the hardware scan.
+    [
       <stockholm/makefu>
+      # Include the results of the hardware scan.
+      ./nuc
+
       <stockholm/makefu/2configs/home-manager>
       <stockholm/makefu/2configs/support-nixos.nix>
       <stockholm/makefu/2configs/zsh-user.nix>
@@ -37,13 +38,13 @@ in {
 
       # Sensors
       # <stockholm/makefu/2configs/stats/client.nix>
-      <stockholm/makefu/2configs/stats/collectd-client.nix>
+      # <stockholm/makefu/2configs/stats/collectd-client.nix>
       <stockholm/makefu/2configs/stats/telegraf>
       <stockholm/makefu/2configs/stats/telegraf/airsensor.nix>
       <stockholm/makefu/2configs/stats/telegraf/europastats.nix>
       <stockholm/makefu/2configs/stats/external/aralast.nix>
       <stockholm/makefu/2configs/stats/arafetch.nix>
-      <stockholm/makefu/2configs/hw/mceusb.nix>
+      # <stockholm/makefu/2configs/hw/mceusb.nix>
       # <stockholm/makefu/2configs/stats/telegraf/bamstats.nix>
       { environment.systemPackages = [ pkgs.vlc ]; }
 
@@ -94,44 +95,6 @@ in {
       build.host = config.krebs.hosts.wbob;
   };
 
-  swapDevices = [ { device = "/var/swap"; } ];
-  services.collectd.extraConfig = lib.mkAfter ''
-
-    #LoadPlugin ping
-    # does not work because it requires privileges
-    #<Plugin "ping">
-    #  Host "google.de"
-    #  Host "heise.de"
-    #</Plugin>
-
-    LoadPlugin curl
-    <Plugin curl>
-      Interval 300
-      TotalTime true
-      NamelookupTime true
-      ConnectTime true
-
-      <Page "google">
-        MeasureResponseTime true
-        MeasureResponseCode true
-        URL "https://google.de"
-      </Page>
-
-      <Page "webde">
-        MeasureResponseTime true
-        MeasureResponseCode true
-        URL "http://web.de"
-      </Page>
-
-    </Plugin>
-    #LoadPlugin netlink
-    #<Plugin "netlink">
-    #  Interface "enp0s25"
-    #  Interface "wlp2s0"
-    #  IgnoreSelected false
-    #</Plugin>
-  '';
-
   networking.firewall.allowedUDPPorts = [ 655 ];
   networking.firewall.allowedTCPPorts = [
     655
@@ -146,7 +109,7 @@ in {
   #    Port = 1655
   #  '';
   #};
-
+  boot.kernelPackages = pkgs.linuxPackages_latest;
   # rt2870.bin wifi card, part of linux-unfree
   hardware.enableRedistributableFirmware = true;
   nixpkgs.config.allowUnfree = true;
@@ -156,24 +119,5 @@ in {
     address = "10.8.8.11";
     prefixLength = 24;
   }];
-
-
   # nuc hardware
-  boot.loader.grub.device = rootdisk;
-  hardware.cpu.intel.updateMicrocode = true;
-  boot.initrd.availableKernelModules = [ "xhci_pci" "ehci_pci" "ahci" "usbhid" "usb_storage" "sd_mod" ];
-
-  boot.kernelModules = [
-    "kvm-intel" "snd-seq" "snd-rawmidi"
-  ];
-  fileSystems = {
-    "/" = {
-      device = rootdisk + "-part1";
-      fsType = "ext4";
-    };
-    "/data" = {
-      device = datadisk + "-part1";
-      fsType = "ext4";
-    };
-  };
 }
diff --git a/makefu/1systems/wbob/nuc/default.nix b/makefu/1systems/wbob/nuc/default.nix
new file mode 100644
index 000000000..d4993dfd0
--- /dev/null
+++ b/makefu/1systems/wbob/nuc/default.nix
@@ -0,0 +1,23 @@
+let
+  rootdisk = "/dev/disk/by-id/ata-TS256GMTS800_C613840115";
+  datadisk = "/dev/disk/by-id/ata-HGST_HTS721010A9E630_JR10006PH3A02F";
+in {
+  boot.loader.grub.device = rootdisk;
+  hardware.cpu.intel.updateMicrocode = true;
+  boot.initrd.availableKernelModules = [ "xhci_pci" "ehci_pci" "ahci" "usbhid" "usb_storage" "sd_mod" ];
+
+  boot.kernelModules = [
+    "kvm-intel" "snd-seq" "snd-rawmidi"
+  ];
+  fileSystems = {
+    "/" = {
+      device = rootdisk + "-part1";
+      fsType = "ext4";
+    };
+    "/data" = {
+      device = datadisk + "-part1";
+      fsType = "ext4";
+    };
+  };
+  swapDevices = [ { device = "/var/swap"; } ];
+}

From f20695084ed681adecb9fbfa459ffb46591812f2 Mon Sep 17 00:00:00 2001
From: makefu <github@syntax-fehler.de>
Date: Fri, 12 Mar 2021 20:12:04 +0100
Subject: [PATCH 13/38] ma tsp.r: refactor

---
 makefu/1systems/tsp/config.nix   | 11 ++++++++---
 makefu/1systems/tsp/hardware.nix |  9 +++++++++
 2 files changed, 17 insertions(+), 3 deletions(-)
 create mode 100644 makefu/1systems/tsp/hardware.nix

diff --git a/makefu/1systems/tsp/config.nix b/makefu/1systems/tsp/config.nix
index 7c65737f7..9586578d3 100644
--- a/makefu/1systems/tsp/config.nix
+++ b/makefu/1systems/tsp/config.nix
@@ -6,21 +6,26 @@
 {
   imports =
     [ # Include the results of the hardware scan.
+      ./hardware.nix
       <stockholm/makefu>
+      <stockholm/makefu/2configs/nur.nix>
       <stockholm/makefu/2configs/home-manager>
       <stockholm/makefu/2configs/main-laptop.nix>
+      <stockholm/makefu/2configs/editor/neovim>
+      <stockholm/makefu/2configs/tools/core.nix>
       # <stockholm/makefu/2configs/tools/all.nix>
       <stockholm/makefu/2configs/fs/single-partition-ext4.nix>
       # hardware specifics are in here
-      # imports tp-x2x0.nix
-      <stockholm/makefu/2configs/hw/tp-x230.nix>
       <stockholm/makefu/2configs/hw/bluetooth.nix>
       <stockholm/makefu/2configs/hw/network-manager.nix>
 
+
       # <stockholm/makefu/2configs/rad1o.nix>
 
       <stockholm/makefu/2configs/zsh-user.nix>
-      <stockholm/makefu/2configs/exim-retiolum.nix>
+      <stockholm/makefu/2configs/home-manager>
+      <stockholm/makefu/2configs/home-manager/desktop.nix>
+      <stockholm/makefu/2configs/home-manager/cli.nix>
       <stockholm/makefu/2configs/tinc/retiolum.nix>
 
       <stockholm/makefu/2configs/sshd-totp.nix>
diff --git a/makefu/1systems/tsp/hardware.nix b/makefu/1systems/tsp/hardware.nix
new file mode 100644
index 000000000..2788eae04
--- /dev/null
+++ b/makefu/1systems/tsp/hardware.nix
@@ -0,0 +1,9 @@
+{ lib, ... }:
+{
+  imports = [
+    # laptop is an acer aspire, but close enough i'd say
+    <stockholm/makefu/2configs/hw/tp-x2x0.nix>
+  ];
+  # the laptop only has the touchpad
+  services.xserver.synaptics.additionalOptions = lib.mkForce ''Option "TouchpadOff" "0"'';
+}

From e377be755fa38b0ea4936b4c55dedfab4200bf21 Mon Sep 17 00:00:00 2001
From: makefu <github@syntax-fehler.de>
Date: Fri, 12 Mar 2021 20:12:56 +0100
Subject: [PATCH 14/38] ma x.r: cleanup input

---
 makefu/1systems/x/config.nix      |  3 ++-
 makefu/1systems/x/x13/default.nix | 22 +++------------------
 makefu/1systems/x/x13/input.nix   | 33 +++++++++++++++++++++++++++++++
 3 files changed, 38 insertions(+), 20 deletions(-)

diff --git a/makefu/1systems/x/config.nix b/makefu/1systems/x/config.nix
index 6c0388e59..80655f998 100644
--- a/makefu/1systems/x/config.nix
+++ b/makefu/1systems/x/config.nix
@@ -158,7 +158,8 @@
 
       # temporary
       # { services.redis.enable = true; }
-      # <stockholm/makefu/2configs/pyload.nix>
+      { services.mongodb.enable = true; }
+      # <stockholm/makefu/2configs/home/photoprism.nix>
       # <stockholm/makefu/2configs/dcpp/airdcpp.nix>
       # <stockholm/makefu/2configs/nginx/rompr.nix>
       # <stockholm/makefu/2configs/lanparty/lancache.nix>
diff --git a/makefu/1systems/x/x13/default.nix b/makefu/1systems/x/x13/default.nix
index b0400232e..ac601845a 100644
--- a/makefu/1systems/x/x13/default.nix
+++ b/makefu/1systems/x/x13/default.nix
@@ -8,6 +8,7 @@
     <nixos-hardware/lenovo/thinkpad/l14/amd> # close enough
     # <stockholm/makefu/2configs/hw/tpm.nix>
     <stockholm/makefu/2configs/hw/ssd.nix>
+    <stockholm/makefu/2configs/hw/xmm7360.nix>
   ];
   boot.zfs.requestEncryptionCredentials = true;
   networking.hostId = "f8b8e0a2";
@@ -19,32 +20,15 @@
   services.xserver.videoDrivers = [
     "amdgpu"
   ];
-  hardware.opengl.extraPackages = [ pkgs.amdvlk ];
+  hardware.opengl.extraPackages = [ pkgs.amdvlk pkgs.rocm-opencl-icd ];
   # is required for amd graphics support ( xorg wont boot otherwise )
   boot.kernelPackages = pkgs.linuxPackages_latest;
+
   environment.variables.VK_ICD_FILENAMES =
     "/run/opengl-driver/share/vulkan/icd.d/amd_icd64.json";
 
 
   programs.light.enable = true;
-  services.actkbd = {
-    enable = true;
-    bindings = [
-      { keys = [ 225 ]; events = [ "key" ]; command = "${pkgs.light}/bin/light -A 10"; }
-      { keys = [ 224 ]; events = [ "key" ]; command = "${pkgs.light}/bin/light -U 10"; }
-      { keys = [ 227 ]; events = [ "key" ]; command = builtins.toString (
-        pkgs.writers.writeDash "toggle_lcdshadow" ''
-          proc=/proc/acpi/ibm/lcdshadow
-          status=$(${pkgs.gawk}/bin/awk '/status:/{print $2}' "$proc")
-          if [ "$status" -eq 0 ];then
-            echo 1 > "$proc"
-          else
-            echo 0 > "$proc"
-          fi
-        '');
-      }
-    ];
-  };
 
   users.groups.video = {};
   users.users.makefu.extraGroups = [ "video" ];
diff --git a/makefu/1systems/x/x13/input.nix b/makefu/1systems/x/x13/input.nix
index 68b855d8e..775e19303 100644
--- a/makefu/1systems/x/x13/input.nix
+++ b/makefu/1systems/x/x13/input.nix
@@ -1,3 +1,4 @@
+{ pkgs, lib, ... }:
 {
   # current issues:
   #  1. for pressing insert hold shift+fn+Fin
@@ -9,5 +10,37 @@
       xinput set-prop "ETPS/2 Elantech TrackPoint" "Evdev Wheel Emulation Axes" 6 7 4 5
       # configure timeout of pressing and holding middle button
       # xinput set-int-prop "ETPS/2 Elantech TrackPoint" "Evdev Wheel Emulation Timeout" 8 200
+      xinput disable 'ETPS/2 Elantech Touchpad'
   '';
+  boot.kernelParams = [
+    #"psmouse.proto=imps"
+    #"psmouse.proto=bare"
+    #"psmouse.resetafter=0"
+    "psmouse.synaptics_intertouch=1" # echo 1 > /sys/devices/platform/i8042/serio1/reg_07
+  ];
+
+  programs.light.enable = true;
+  services.actkbd = {
+    enable = true;
+    bindings = [
+      { keys = [ 225 ]; events = [ "key" ]; command = "${pkgs.light}/bin/light -A 10"; } # fn - F5
+      { keys = [ 224 ]; events = [ "key" ]; command = "${pkgs.light}/bin/light -U 10"; } # fn - F6
+      # fn - 4 => suspend
+      # fn - d => lcdshadow
+      { keys = [ 227 ]; events = [ "key" ]; command = builtins.toString ( # fn - F7
+        pkgs.writers.writeDash "toggle_touchpad" ''
+          PATH=${lib.makeBinPath [ pkgs.xorg.xinput pkgs.gnugrep ]}
+          DISPLAY=:0
+          export DISPLAY PATH
+
+          device=$(xinput list --name-only | grep Touchpad)
+          if [ "$(xinput list-props "$device" | grep -P ".*Device Enabled.*\K.(?=$)" -o)" -eq 1 ];then
+              xinput disable "$device"
+          else
+              xinput enable "$device"
+          fi
+        '');
+      }
+    ];
+  };
 }

From ca37236a537b980066205a6d2f5309fa3eb8e0e0 Mon Sep 17 00:00:00 2001
From: makefu <github@syntax-fehler.de>
Date: Fri, 12 Mar 2021 20:13:23 +0100
Subject: [PATCH 15/38] ma backup/server: init backup server repo option

---
 makefu/2configs/backup/server.nix | 20 ++++++++++++++------
 1 file changed, 14 insertions(+), 6 deletions(-)

diff --git a/makefu/2configs/backup/server.nix b/makefu/2configs/backup/server.nix
index f157e715f..26e53b8c3 100644
--- a/makefu/2configs/backup/server.nix
+++ b/makefu/2configs/backup/server.nix
@@ -1,11 +1,19 @@
-{lib, ... }:
+{lib,config, ... }:
 let
   hosts = lib.mapAttrsToList (f: _: lib.removeSuffix ".pub" f) (builtins.readDir ./ssh );
 in {
   # TODO: for all enabled machines
-  services.borgbackup.repos = lib.genAttrs hosts (host: {
-    authorizedKeys = [ (builtins.readFile (./ssh + "/${host}.pub") ) ];
-    path = "/var/lib/borgbackup/${host}";
-    user = "borg-${host}";
-  }) ;
+  options = {
+    makefu.backup.server.repo = lib.mkOption {
+      type = lib.types.str;
+      default = "/var/lib/borgbackup";
+    };
+  };
+  config = {
+    services.borgbackup.repos = lib.genAttrs hosts (host: {
+      authorizedKeys = [ (builtins.readFile (./ssh + "/${host}.pub") ) ];
+      path = "${config.makefu.backup.server.repo}/${host}";
+      user = "borg-${host}";
+    }) ;
+  };
 }

From e5472e178a115935e7405c1df99e13e8102c3f0b Mon Sep 17 00:00:00 2001
From: makefu <github@syntax-fehler.de>
Date: Fri, 12 Mar 2021 20:13:49 +0100
Subject: [PATCH 16/38] ma binary-cache/server: add port to nix-serve

---
 makefu/2configs/binary-cache/server.nix | 1 +
 1 file changed, 1 insertion(+)

diff --git a/makefu/2configs/binary-cache/server.nix b/makefu/2configs/binary-cache/server.nix
index 1d729b9bb..2e05fd52e 100644
--- a/makefu/2configs/binary-cache/server.nix
+++ b/makefu/2configs/binary-cache/server.nix
@@ -5,6 +5,7 @@
   # nix-store --generate-binary-cache-key gum nix-serve.key nix-serve.pub
   services.nix-serve = {
     enable = true;
+    port = 5001;
     secretKeyFile = config.krebs.secret.files.nix-serve-key.path;
   };
 

From 821239422fe86973e37acb05e50e76b748c77d0c Mon Sep 17 00:00:00 2001
From: makefu <github@syntax-fehler.de>
Date: Fri, 12 Mar 2021 20:24:09 +0100
Subject: [PATCH 17/38] ma wbob.r: deploy bureautomation with unstable branch

---
 makefu/1systems/wbob/source.nix            |  1 +
 makefu/2configs/bureautomation/default.nix | 10 ++++++++++
 2 files changed, 11 insertions(+)

diff --git a/makefu/1systems/wbob/source.nix b/makefu/1systems/wbob/source.nix
index 6568b8a45..36c7b67bb 100644
--- a/makefu/1systems/wbob/source.nix
+++ b/makefu/1systems/wbob/source.nix
@@ -2,4 +2,5 @@
   name="wbob";
   # musnix = true;
   home-manager = true;
+  unstable = true;
 }
diff --git a/makefu/2configs/bureautomation/default.nix b/makefu/2configs/bureautomation/default.nix
index 7e8b6a4d3..7ac90f5c5 100644
--- a/makefu/2configs/bureautomation/default.nix
+++ b/makefu/2configs/bureautomation/default.nix
@@ -1,12 +1,15 @@
 { config, pkgs, lib, ... }:
 let
   kodi-host = "192.168.8.11";
+  unstable = import <nixpkgs-unstable> {};
 in {
   imports = [
     ./ota.nix
     ./comic-updater.nix
     ./puppy-proxy.nix
 
+    ./zigbee2mqtt
+
     # hass config
     ## complex configs
     ./multi/daily-standup.nix
@@ -39,15 +42,22 @@ in {
     ./automation/bureau-shutdown.nix
     ./automation/nachtlicht.nix
     ./automation/schlechteluft.nix
+    ./automation/philosophische-tuer.nix
     ./automation/hass-restart.nix
     ./device_tracker/openwrt.nix
     ./person/team.nix
   ];
+
   networking.firewall.allowedTCPPorts = [ 8123 ];
   state = [ "/var/lib/hass/known_devices.yaml" ];
 
   services.home-assistant = {
     enable = true;
+    package = (unstable.home-assistant.overrideAttrs (old: {
+      doInstallCheck = false;
+    })).override {
+      extraPackages = p: [ p.APScheduler ];
+    };
     autoExtraComponents = true;
     config = {
       config = {};

From fe38a7cd7ebdaca847bf209a30139182be1d1e83 Mon Sep 17 00:00:00 2001
From: makefu <github@syntax-fehler.de>
Date: Fri, 12 Mar 2021 20:24:40 +0100
Subject: [PATCH 18/38] ma defaulat: alias ip -> ip -c -br

---
 makefu/2configs/default.nix | 1 +
 1 file changed, 1 insertion(+)

diff --git a/makefu/2configs/default.nix b/makefu/2configs/default.nix
index 695e8fee6..be64e402e 100644
--- a/makefu/2configs/default.nix
+++ b/makefu/2configs/default.nix
@@ -57,6 +57,7 @@ with import <stockholm/lib>;
   environment.shellAliases = {
     # TODO: see .aliases
     lsl = "ls -lAtr";
+    ip = "ip -c -br";
     dmesg = "dmesg -L --reltime";
     psg = "ps -ef | grep";
     nmap = "nmap -oN $HOME/loot/scan-`date +\%s`.nmap -oX $HOME/loot/scan-`date +%s`.xml";

From 80ca19617389d628087e9e4a271bae43e5dfbf74 Mon Sep 17 00:00:00 2001
From: makefu <github@syntax-fehler.de>
Date: Fri, 12 Mar 2021 20:25:37 +0100
Subject: [PATCH 19/38] ma etherpad: increase timeouts to 30 minutes

---
 .../2configs/deployment/docker/etherpad.euer.krebsco.de.nix   | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/makefu/2configs/deployment/docker/etherpad.euer.krebsco.de.nix b/makefu/2configs/deployment/docker/etherpad.euer.krebsco.de.nix
index 172e69c4d..48b947c58 100644
--- a/makefu/2configs/deployment/docker/etherpad.euer.krebsco.de.nix
+++ b/makefu/2configs/deployment/docker/etherpad.euer.krebsco.de.nix
@@ -6,7 +6,7 @@ in {
   services.nginx.virtualHosts."etherpad.euer.krebsco.de" = {
     # useACMEHost = "euer.krebsco.de";
     extraConfig = ''
-      ssl_session_timeout  5m;
+      ssl_session_timeout  30m;
     '';
     enableACME = true;
     forceSSL = true;
@@ -27,7 +27,7 @@ in {
         # WebSocket proxying - from https://nginx.org/en/docs/http/websocket.html
         proxy_set_header  Upgrade $http_upgrade;
         proxy_set_header  Connection "upgrade";
-        proxy_read_timeout 61s;
+        proxy_read_timeout 1799s;
     '';
   };
   docker-containers."etherpad-lite" = {

From ca13f21f885b608138779282013caf20ee92ddad Mon Sep 17 00:00:00 2001
From: makefu <github@syntax-fehler.de>
Date: Fri, 12 Mar 2021 20:26:27 +0100
Subject: [PATCH 20/38] ma etherpad: mv to bgt

---
 makefu/1systems/gum/config.nix                                  | 2 +-
 .../{deployment/docker => bgt}/etherpad.euer.krebsco.de.nix     | 0
 2 files changed, 1 insertion(+), 1 deletion(-)
 rename makefu/2configs/{deployment/docker => bgt}/etherpad.euer.krebsco.de.nix (100%)

diff --git a/makefu/1systems/gum/config.nix b/makefu/1systems/gum/config.nix
index d81aefb67..83fbd8f83 100644
--- a/makefu/1systems/gum/config.nix
+++ b/makefu/1systems/gum/config.nix
@@ -148,7 +148,7 @@ in {
       <stockholm/makefu/2configs/deployment/boot-euer.nix>
       <stockholm/makefu/2configs/deployment/gecloudpad>
       <stockholm/makefu/2configs/deployment/docker/archiveteam-warrior.nix>
-      <stockholm/makefu/2configs/deployment/docker/etherpad.euer.krebsco.de.nix>
+      <stockholm/makefu/2configs/bgt/etherpad.euer.krebsco.de.nix>
       # <stockholm/makefu/2configs/deployment/systemdultras-rss.nix>
 
       <stockholm/makefu/2configs/shiori.nix>
diff --git a/makefu/2configs/deployment/docker/etherpad.euer.krebsco.de.nix b/makefu/2configs/bgt/etherpad.euer.krebsco.de.nix
similarity index 100%
rename from makefu/2configs/deployment/docker/etherpad.euer.krebsco.de.nix
rename to makefu/2configs/bgt/etherpad.euer.krebsco.de.nix

From 806da70f35564c1fbc1f4f2a16c1c18cb729a5ff Mon Sep 17 00:00:00 2001
From: makefu <github@syntax-fehler.de>
Date: Fri, 12 Mar 2021 20:27:16 +0100
Subject: [PATCH 21/38] ma wbob-kiosk: use gnome instead of xfce

---
 makefu/2configs/gui/wbob-kiosk.nix | 15 ++++++++++-----
 1 file changed, 10 insertions(+), 5 deletions(-)

diff --git a/makefu/2configs/gui/wbob-kiosk.nix b/makefu/2configs/gui/wbob-kiosk.nix
index 1a5e6d04f..2f6a26d82 100644
--- a/makefu/2configs/gui/wbob-kiosk.nix
+++ b/makefu/2configs/gui/wbob-kiosk.nix
@@ -10,13 +10,14 @@
   };
   services.xserver = {
 
-    windowManager = lib.mkForce {
-      awesome.enable = false;
-    };
-    desktopManager.xfce = {
+    windowManager = lib.mkForce { awesome.enable = false; };
+    displayManager.gdm.enable = true;
+    displayManager.autoLogin = {
       enable = true;
+      user = "makefu";
     };
-    displayManager.defaultSession = "xfce";
+    displayManager.defaultSession = "gnome";
+    desktopManager.gnome3.enable = true;
     displayManager.sessionCommands = ''
         ${pkgs.xlibs.xset}/bin/xset -display :0 s off -dpms
         ${pkgs.xlibs.xrandr}/bin/xrandr --output HDMI2 --right-of HDMI1
@@ -25,6 +26,10 @@
     # prevent screen from turning off, disable dpms
   };
 
+
+  environment.systemPackages = [ pkgs.gnomeExtensions.appindicator ];
+  services.dbus.packages = with pkgs; [ gnome2.GConf gnome3.gnome-settings-daemon ];
+
   systemd.services.xset-off = {
     after = [ "display-manager.service" ];
     wantedBy = [ "multi-user.target" ];

From cd6a3637d4ca727b0f3277e1478130a8aa1fd8c0 Mon Sep 17 00:00:00 2001
From: makefu <github@syntax-fehler.de>
Date: Fri, 12 Mar 2021 20:27:57 +0100
Subject: [PATCH 22/38] ma ham: protect application server from external
 requests

---
 makefu/2configs/home/ham/nginx.nix | 5 +++++
 1 file changed, 5 insertions(+)

diff --git a/makefu/2configs/home/ham/nginx.nix b/makefu/2configs/home/ham/nginx.nix
index 2048ff215..e166b2a4b 100644
--- a/makefu/2configs/home/ham/nginx.nix
+++ b/makefu/2configs/home/ham/nginx.nix
@@ -6,5 +6,10 @@ in {
     serverAliases = [ "hass.lan" "ha" "ha.lan" ];
     locations."/".proxyPass = "http://localhost:8123";
     locations."/".proxyWebsockets = true;
+    extraConfig = ''
+      if ( $server_addr != "${internal-ip}" ) {
+        return 403;
+      }
+    '';
   };
 }

From 31cb697190ea6d5c50925048a897880278eaf511 Mon Sep 17 00:00:00 2001
From: makefu <github@syntax-fehler.de>
Date: Fri, 12 Mar 2021 20:28:20 +0100
Subject: [PATCH 23/38] ma ham/zigbee2mqtt: enable frontend

---
 .../2configs/home/ham/zigbee2mqtt/default.nix | 20 +++++++++++++++++++
 1 file changed, 20 insertions(+)

diff --git a/makefu/2configs/home/ham/zigbee2mqtt/default.nix b/makefu/2configs/home/ham/zigbee2mqtt/default.nix
index 83c3c187c..6ccf8b241 100644
--- a/makefu/2configs/home/ham/zigbee2mqtt/default.nix
+++ b/makefu/2configs/home/ham/zigbee2mqtt/default.nix
@@ -3,12 +3,16 @@
 let
   dataDir = "/var/lib/zigbee2mqtt";
   sec = import <secrets/zigbee2mqtt.nix>;
+  internal-ip = "192.168.1.11";
+  webport = 8521;
 in
   {
   # symlink the zigbee controller
   #services.udev.extraRules = ''
   #  SUBSYSTEM=="tty", ATTRS{idVendor}=="0451", ATTRS{idProduct}=="16a8", SYMLINK+="cc2531", MODE="0660", GROUP="dialout"
   #'';
+
+  # /dev/serial/by-id/usb-Silicon_Labs_slae.sh_cc2652rb_stick_-_slaesh_s_iot_stuff_00_12_4B_00_21_CC_45_BD-if00-port0
   services.udev.extraRules = ''
     SUBSYSTEM=="tty", ATTRS{idVendor}=="10c4", ATTRS{idProduct}=="ea60", SYMLINK+="cc2531", MODE="0660", GROUP="dialout"
   '';
@@ -28,6 +32,9 @@ in
         include_device_information = true;
         client_id = "zigbee2mqtt";
       };
+      frontend = {
+        port = webport;
+      };
       advanced = {
         log_level = "debug";
         log_output = [ "console" ];
@@ -56,6 +63,19 @@ in
     };
   };
 
+  services.nginx.recommendedProxySettings = true;
+  services.nginx.virtualHosts."zigbee" = {
+    serverAliases = [ "zigbee.lan" ];
+    locations."/".proxyPass = "http://localhost:${toString webport}";
+    locations."/api".proxyPass = "http://localhost:${toString webport}";
+    locations."/api".proxyWebsockets = true;
+    extraConfig = ''
+      if ( $server_addr != "${internal-ip}" ) {
+        return 403;
+      }
+    '';
+  };
+
   state = [ "${dataDir}/devices.yaml" "${dataDir}/state.json" ];
 
   systemd.services.zigbee2mqtt = {

From 355b3fe650f449bd808df7fdc8e7a99e1fc68544 Mon Sep 17 00:00:00 2001
From: makefu <github@syntax-fehler.de>
Date: Fri, 12 Mar 2021 20:28:56 +0100
Subject: [PATCH 24/38] ma hw/x230: enable manual fan_control

---
 makefu/2configs/hw/tp-x230.nix | 8 +++++++-
 1 file changed, 7 insertions(+), 1 deletion(-)

diff --git a/makefu/2configs/hw/tp-x230.nix b/makefu/2configs/hw/tp-x230.nix
index 37d1affb7..69fe7adce 100644
--- a/makefu/2configs/hw/tp-x230.nix
+++ b/makefu/2configs/hw/tp-x230.nix
@@ -1,6 +1,5 @@
 { config, lib, pkgs, ... }:
 
-with import <stockholm/lib>;
 {
 
   imports = [ ./tp-x2x0.nix  <nixos-hardware/lenovo/thinkpad/x230> ];
@@ -11,6 +10,13 @@ with import <stockholm/lib>;
   # possible i915 powersave options:
   #  options i915 enable_rc6=1 enable_fbc=1 semaphores=1
 
+  boot.extraModprobeConfig = ''
+    options thinkpad_acpi fan_control=1
+    options i915 enable_rc6=1 enable_fbc=1 semaphores=1
+  '';
+
+  boot.initrd.availableKernelModules = [ "thinkpad_acpi" ];
+
   services.xserver.displayManager.sessionCommands =''
     xinput set-int-prop "TPPS/2 IBM TrackPoint" "Evdev Wheel Emulation" 8 1
     xinput set-int-prop "TPPS/2 IBM TrackPoint" "Evdev Wheel Emulation Button" 8 2

From c66ebb2e4d706e3b8948231d10d0f33016804af2 Mon Sep 17 00:00:00 2001
From: makefu <github@syntax-fehler.de>
Date: Fri, 12 Mar 2021 20:29:23 +0100
Subject: [PATCH 25/38] ma printer: use new ip

---
 makefu/2configs/printer.nix | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/makefu/2configs/printer.nix b/makefu/2configs/printer.nix
index 6fd1c1858..7e29b1c6f 100644
--- a/makefu/2configs/printer.nix
+++ b/makefu/2configs/printer.nix
@@ -14,17 +14,17 @@ in {
     ];
   };
 
-  # scanners are printers just in reverse anyway
-  services.saned.enable = true;
   users.users."${mainUser}".extraGroups = [ "scanner" "lp" ];
 
+  # scanners are printers just in reverse anyway
+  services.saned.enable = true;
   hardware.sane = {
     enable = true;
     extraBackends = [ ];
     netConf =
       # drucker.lan SCX-3205W
       ''
-        192.168.1.6''
+        192.168.1.16''
       # uhrenkind.shack magicolor 1690mf
     + ''
         10.42.20.30'';

From a66821f6a730cb5ae3dc3b22f41c5085d80e0c41 Mon Sep 17 00:00:00 2001
From: makefu <github@syntax-fehler.de>
Date: Fri, 12 Mar 2021 20:29:35 +0100
Subject: [PATCH 26/38] ma stats/server: disable reporting

---
 makefu/2configs/stats/server.nix | 1 +
 1 file changed, 1 insertion(+)

diff --git a/makefu/2configs/stats/server.nix b/makefu/2configs/stats/server.nix
index a2d0693ab..52fb28a03 100644
--- a/makefu/2configs/stats/server.nix
+++ b/makefu/2configs/stats/server.nix
@@ -27,6 +27,7 @@ in {
     http.suppress-write-log = true;
     data.trace-logging-enabled = false;
     data.query-log-enabled = false;
+    reporting-disabled = true;
 
     http.bind-address = ":${toString influx-port}";
     admin.bind-address = ":8083";

From 72019707d4c09e0066dd0b07e589a1bb42c64e2e Mon Sep 17 00:00:00 2001
From: makefu <github@syntax-fehler.de>
Date: Fri, 12 Mar 2021 20:30:35 +0100
Subject: [PATCH 27/38] ma systemdultras/ircbot: disable notifications

---
 makefu/2configs/systemdultras/ircbot.nix | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/makefu/2configs/systemdultras/ircbot.nix b/makefu/2configs/systemdultras/ircbot.nix
index c5f1bbed2..3229d14f2 100644
--- a/makefu/2configs/systemdultras/ircbot.nix
+++ b/makefu/2configs/systemdultras/ircbot.nix
@@ -1,7 +1,9 @@
 {
+  systemd.services.brockman.environment."BROCKMAN_LOG_LEVEL" = "DEBUG";
   krebs.brockman = {
     enable = true;
     config = {
+      channel = "#systemdultras";
       irc = {
         host = "irc.freenode.net";
         port = 6667;
@@ -11,11 +13,13 @@
           feed = "https://www.reddit.com/r/systemdultras/.rss";
           delay = 136;
           channels = [ "#systemdultras" ];
+          notifyErrors = false;
         };
         r-systemd-rss = {
           feed = "https://www.reddit.com/r/systemd/.rss";
           delay = 172;
           channels = [ "#systemdultras" ];
+          notifyErrors = false;
         };
       };
     };

From 851ea9fef4d4e5351f73d7655721fcfcea85a69a Mon Sep 17 00:00:00 2001
From: makefu <github@syntax-fehler.de>
Date: Fri, 12 Mar 2021 20:30:51 +0100
Subject: [PATCH 28/38] ma tools/core: add rename

---
 makefu/2configs/tools/core.nix | 1 +
 1 file changed, 1 insertion(+)

diff --git a/makefu/2configs/tools/core.nix b/makefu/2configs/tools/core.nix
index 8339c9328..bce461e9e 100644
--- a/makefu/2configs/tools/core.nix
+++ b/makefu/2configs/tools/core.nix
@@ -17,6 +17,7 @@ ${gnused}/bin/sed -i "''${1}d" ~/.ssh/known_hosts
     which
     binutils
     screen
+    rename # rename 's/^/hello/' *.txt
 
     # fs
     cifs-utils

From c5e6e6ba31d67c148068ae14ab06d54e65ae495b Mon Sep 17 00:00:00 2001
From: makefu <github@syntax-fehler.de>
Date: Fri, 12 Mar 2021 20:31:06 +0100
Subject: [PATCH 29/38] ma wireguard/server: enable persistentKeepalive

---
 makefu/2configs/wireguard/server.nix | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/makefu/2configs/wireguard/server.nix b/makefu/2configs/wireguard/server.nix
index 76fea1d6d..c8fbfe6fb 100644
--- a/makefu/2configs/wireguard/server.nix
+++ b/makefu/2configs/wireguard/server.nix
@@ -39,11 +39,13 @@ in { # wireguard server
     }
     {
       # work-router
+      persistentKeepalive = 25;
       allowedIPs = [ "10.244.0.5/32" ];
       publicKey = "QJMwwYu/92koCASbHnR/vqe/rN00EV6/o7BGwLockDw=";
     }
     {
       # workr
+      persistentKeepalive = 25;
       allowedIPs = [ "10.244.0.6/32" ];
       publicKey = "OFhCF56BrV9tjqW1sxqXEKH/GdqamUT1SqZYSADl5GA=";
     }

From 1da12adf038e962af76228b3e53d2eb8c0d367b2 Mon Sep 17 00:00:00 2001
From: makefu <github@syntax-fehler.de>
Date: Fri, 12 Mar 2021 20:32:34 +0100
Subject: [PATCH 30/38] ma bureautomation/zigbee2mqtt: init

---
 .../bureautomation/zigbee2mqtt/default.nix    |  33 +++++
 .../bureautomation/zigbee2mqtt/hass.nix       | 130 ++++++++++++++++++
 2 files changed, 163 insertions(+)
 create mode 100644 makefu/2configs/bureautomation/zigbee2mqtt/default.nix
 create mode 100644 makefu/2configs/bureautomation/zigbee2mqtt/hass.nix

diff --git a/makefu/2configs/bureautomation/zigbee2mqtt/default.nix b/makefu/2configs/bureautomation/zigbee2mqtt/default.nix
new file mode 100644
index 000000000..ba10ae74b
--- /dev/null
+++ b/makefu/2configs/bureautomation/zigbee2mqtt/default.nix
@@ -0,0 +1,33 @@
+{config, pkgs, lib, ...}:
+
+let
+  dataDir = "/var/lib/zigbee2mqtt";
+in
+  {
+  # symlink the zigbee controller
+  services.udev.extraRules = ''
+    SUBSYSTEM=="tty", ATTRS{idVendor}=="0451", ATTRS{idProduct}=="16a8", SYMLINK+="cc2531", MODE="0660", GROUP="dialout"
+  '';
+
+  services.zigbee2mqtt = {
+    enable = true;
+    inherit dataDir;
+    config = {
+      permit_join = true;
+      serial.port = "/dev/cc2531";
+      homeassistant = true;
+    };
+  };
+
+  state = [ "${dataDir}/devices.yaml" "${dataDir}/state.json" ];
+
+  systemd.services.zigbee2mqtt = {
+    # override automatic configuration.yaml deployment
+    environment.ZIGBEE2MQTT_DATA = dataDir;
+    after = [
+      "home-assistant.service"
+      "mosquitto.service"
+      "network-online.target"
+    ];
+  };
+}
diff --git a/makefu/2configs/bureautomation/zigbee2mqtt/hass.nix b/makefu/2configs/bureautomation/zigbee2mqtt/hass.nix
new file mode 100644
index 000000000..faf864ba6
--- /dev/null
+++ b/makefu/2configs/bureautomation/zigbee2mqtt/hass.nix
@@ -0,0 +1,130 @@
+# provides:
+#   switch
+#   automation
+#   binary_sensor
+#   sensor
+#   input_select
+#   timer
+let
+  inherit (import ../lib) zigbee;
+  prefix = zigbee.prefix;
+in
+{
+  services.home-assistant.config = {
+    sensor =
+
+      [
+      # Sensor for monitoring the bridge state
+      {
+        platform = "mqtt";
+        name = "Zigbee2mqtt Bridge state";
+        state_topic = "${prefix}/bridge/state";
+        icon = "mdi:router-wireless";
+      }
+      # Sensor for Showing the Zigbee2mqtt Version
+      {
+        platform = "mqtt";
+        name = "Zigbee2mqtt Version";
+        state_topic = "${prefix}/bridge/config";
+        value_template = "{{ value_json.version }}";
+        icon = "mdi:zigbee";
+      }
+      # Sensor for Showing the Coordinator Version
+      {
+        platform = "mqtt";
+        name = "Coordinator Version";
+        state_topic = "${prefix}/bridge/config";
+        value_template = "{{ value_json.coordinator }}";
+        icon = "mdi:chip";
+      }
+    ];
+    switch = [
+    {
+      platform = "mqtt";
+      name = "Zigbee2mqtt Main join";
+      state_topic = "${prefix}/bridge/config/permit_join";
+      command_topic = "${prefix}/bridge/config/permit_join";
+      payload_on = "true";
+      payload_off = "false";
+    }
+    ];
+    automation = [
+      {
+        alias = "Zigbee2mqtt Log Level";
+        initial_state = "on";
+        trigger = {
+          platform = "state";
+          entity_id = "input_select.zigbee2mqtt_log_level";
+        };
+        action = [
+          {
+            service =  "mqtt.publish";
+            data = {
+              payload_template = "{{ states('input_select.zigbee2mqtt_log_level') }}";
+              topic =  "${prefix}/bridge/config/log_level";
+            };
+          }
+        ];
+      }
+  # Automation to start timer when enable join is turned on
+      {
+        id = "zigbee_join_enabled";
+        alias = "Zigbee Join Enabled";
+        trigger =
+        {
+          platform = "state";
+          entity_id = "switch.zigbee2mqtt_main_join";
+          to = "on";
+        };
+        action =
+        {
+          service = "timer.start";
+          entity_id = "timer.zigbee_permit_join";
+        };
+      }
+  #  # Automation to stop timer when switch turned off and turn off switch when timer finished
+      {
+        id = "zigbee_join_disabled";
+        alias = "Zigbee Join Disabled";
+        trigger = [
+          {
+            platform = "event";
+            event_type = "timer.finished";
+            event_data.entity_id = "timer.zigbee_permit_join";
+          }
+          {
+            platform = "state";
+            entity_id = "switch.zigbee2mqtt_main_join";
+            to = "off";
+          }
+        ];
+        action = [
+          { service = "timer.cancel";
+            data.entity_id = "timer.zigbee_permit_join";
+          }
+          { service = "switch.turn_off";
+            entity_id = "switch.zigbee2mqtt_main_join";
+          }
+        ];
+      }
+    ];
+    input_select.zigbee2mqtt_log_level =
+    {
+      name = "Zigbee2mqtt Log Level";
+      options = [
+        "debug"
+        "info"
+        "warn"
+        "error"
+      ];
+      initial = "info";
+      icon = "mdi:format-list-bulleted";
+    };
+
+    timer.zigbee_permit_join =
+    {
+      name = "Zigbee Time remaining";
+      duration = 120;
+    };
+  };
+}

From 46c9132c5a0b94427bee5ad8bf7d41f421d0208d Mon Sep 17 00:00:00 2001
From: makefu <github@syntax-fehler.de>
Date: Fri, 12 Mar 2021 20:32:54 +0100
Subject: [PATCH 31/38] ma ham/signal-rest: init

---
 .../2configs/home/ham/signal-rest/default.nix  | 18 ++++++++++++++++++
 1 file changed, 18 insertions(+)
 create mode 100644 makefu/2configs/home/ham/signal-rest/default.nix

diff --git a/makefu/2configs/home/ham/signal-rest/default.nix b/makefu/2configs/home/ham/signal-rest/default.nix
new file mode 100644
index 000000000..250a3596d
--- /dev/null
+++ b/makefu/2configs/home/ham/signal-rest/default.nix
@@ -0,0 +1,18 @@
+
+let
+  port = 8631;
+  image = "bbernhard/signal-cli-rest-api:latest";
+  config = "/var/lib/signal-cli-config";
+in {
+  systemd.tmpfiles.rules = [
+    "d ${config} docker docker - -"
+  ];
+  state = [ config ];
+  virtualisation.oci-containers.containers.signal-rest = {
+    image = image;
+    ports = [ "127.0.0.1:${toString port}:8080" ];
+    volumes = [
+      "${config}:/home/.local/share/signal-cli"
+    ];
+  };
+}

From 281fd57f5b29318f2d8dab86c3312b2e5ed16151 Mon Sep 17 00:00:00 2001
From: makefu <github@syntax-fehler.de>
Date: Fri, 12 Mar 2021 20:33:08 +0100
Subject: [PATCH 32/38] ma hw/xmm7360: init

---
 makefu/2configs/hw/xmm7360.nix | 11 +++++++++++
 1 file changed, 11 insertions(+)
 create mode 100644 makefu/2configs/hw/xmm7360.nix

diff --git a/makefu/2configs/hw/xmm7360.nix b/makefu/2configs/hw/xmm7360.nix
new file mode 100644
index 000000000..951dcaa0b
--- /dev/null
+++ b/makefu/2configs/hw/xmm7360.nix
@@ -0,0 +1,11 @@
+{ pkgs, config, ... }:
+let
+  pkg = (pkgs.callPackage ../../5pkgs/xmm7360 { kernel = config.boot.kernelPackages.kernel; });
+in
+{
+  boot.extraModulePackages = [
+    pkg
+  ];
+  boot.initrd.availableKernelModules = [ "xmm7360" ];
+  users.users.makefu.packages = [ pkg ];
+}

From 60706778704c425b69415ec40436cd61a35e87d1 Mon Sep 17 00:00:00 2001
From: makefu <github@syntax-fehler.de>
Date: Fri, 12 Mar 2021 20:33:21 +0100
Subject: [PATCH 33/38] ma share/omo-client: init

---
 makefu/2configs/share/omo-client.nix | 28 ++++++++++++++++++++++++++++
 1 file changed, 28 insertions(+)
 create mode 100644 makefu/2configs/share/omo-client.nix

diff --git a/makefu/2configs/share/omo-client.nix b/makefu/2configs/share/omo-client.nix
new file mode 100644
index 000000000..4ad32bdd6
--- /dev/null
+++ b/makefu/2configs/share/omo-client.nix
@@ -0,0 +1,28 @@
+{ config, lib, pkgs, ... }:
+
+let
+  automount_opts =
+  [ "x-systemd.automount"
+    "noauto" "x-systemd.idle-timeout=600"
+    "x-systemd.device-timeout=5s"
+    "x-systemd.mount-timeout=5s"
+  ];
+  host = "omo.lan"; #TODO
+  path = "/media/omo/photos";
+in {
+  systemd.tmpfiles.rules = [
+    "d ${path} root root - -"
+  ];
+  fileSystems."${path}" = {
+      device = "//${host}/photos";
+      fsType = "cifs";
+      options = automount_opts ++
+      [ "credentials=/var/src/secrets/omo-client.smb"
+        "file_mode=0775"
+        "dir_mode=0775"
+        "uid=9001"
+        "vers=3"
+      ];
+  };
+
+}

From fe393ec4e753f2b84439eb719613a9fa79ec0c15 Mon Sep 17 00:00:00 2001
From: makefu <github@syntax-fehler.de>
Date: Fri, 12 Mar 2021 20:34:01 +0100
Subject: [PATCH 34/38] puyak.r: rename interface, use correct subnet

---
 krebs/1systems/puyak/net.nix | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/krebs/1systems/puyak/net.nix b/krebs/1systems/puyak/net.nix
index 4cb8d247c..8dab11e16 100644
--- a/krebs/1systems/puyak/net.nix
+++ b/krebs/1systems/puyak/net.nix
@@ -1,11 +1,11 @@
 let
-  ext-if = "enp0s25";
+  ext-if = "et0";
   shack-ip = "10.42.22.184";
   shack-gw = "10.42.20.1";
 in {
   services.udev.extraRules = ''
     SUBSYSTEM=="net", ATTR{address}=="8c:70:5a:b2:84:58", NAME="wl0"
-    SUBSYSTEM=="net", ATTR{address}=="3c:97:0e:07:b9:14", NAME="et0"
+    SUBSYSTEM=="net", ATTR{address}=="3c:97:0e:07:b9:14", NAME="${ext-if}"
   '';
   networking = {
     firewall.enable = false;
@@ -13,7 +13,7 @@ in {
     interfaces."${ext-if}".ipv4.addresses = [
       {
         address = shack-ip;
-        prefixLength = 20;
+        prefixLength = 22;
       }
     ];
 

From aa1b8ed563f9df4d6d9f4793c27e149f1e23a942 Mon Sep 17 00:00:00 2001
From: makefu <github@syntax-fehler.de>
Date: Fri, 12 Mar 2021 20:35:48 +0100
Subject: [PATCH 35/38] ma krops: add buildTarget

---
 makefu/krops.nix | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/makefu/krops.nix b/makefu/krops.nix
index a03fea029..12c003b24 100644
--- a/makefu/krops.nix
+++ b/makefu/krops.nix
@@ -1,4 +1,4 @@
-{ config ? config, name, target ? name }: let
+{ config ? config, name, target ? name , buildTarget ? target }: let
   krops = ../submodules/krops;
   nixpkgs-src = lib.importJSON ../krebs/nixpkgs.json;
 
@@ -87,6 +87,7 @@ in {
   deploy = pkgs.krops.writeDeploy "${name}-deploy" {
     source = source { test = false; };
     target = "root@${target}/var/src";
+    buildTarget = if target == buildTarget then "root@${target}/var/src" else "root@${buildTarget}/tmp/";
   };
 
   # usage: $(nix-build --no-out-link --argstr name HOSTNAME --argstr target PATH -A test)

From 7c3e55fafcecf1fc2c88c99b51d0d723ef9a0bf0 Mon Sep 17 00:00:00 2001
From: makefu <github@syntax-fehler.de>
Date: Fri, 12 Mar 2021 20:52:14 +0100
Subject: [PATCH 36/38] =?UTF-8?q?ma=20bureautiomation:=20init=20philosophi?=
 =?UTF-8?q?sche=20t=C3=BCr?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../automation/philosophische-tuer.nix        | 108 ++++++++++++++++++
 1 file changed, 108 insertions(+)
 create mode 100644 makefu/2configs/bureautomation/automation/philosophische-tuer.nix

diff --git a/makefu/2configs/bureautomation/automation/philosophische-tuer.nix b/makefu/2configs/bureautomation/automation/philosophische-tuer.nix
new file mode 100644
index 000000000..9ccb81348
--- /dev/null
+++ b/makefu/2configs/bureautomation/automation/philosophische-tuer.nix
@@ -0,0 +1,108 @@
+{ config, pkgs, lib, ... }:
+
+let
+  short_threshold = 30; #seconds
+  long_threshold = 30; #minutes
+  sensor = "binary_sensor.buerotuer_contact";
+
+  # get the list of all
+  name = "tueraudio";
+  prefix = "http://localhost:8123/local/${name}";
+  audiodir = "${config.services.home-assistant.configDir}/www/${name}";
+  recordrepo = pkgs.fetchFromGitHub {
+    owner = "makefu";
+    repo = "philosophische_tuer";
+    rev = "17544c6";
+    sha256 = "0bm0697fyf6s05c6yw6y25cyck04rlxj1dgazkq8mfqk6756v2bq";
+  };
+  samples = user: lib.mapAttrsToList
+    (file: _: ''"${prefix}/${name}/${user}/${file}"'')
+    (builtins.readDir (toString ( recordrepo+ "/recordings/${user}")));
+  random_tuerspruch = ''{{'' + (lib.concatStringsSep "," ((samples "Felix") ++ (samples "Sofia") ++ (samples "Markus"))) + ''| random}}''; # TODO read from derivation
+in
+{
+  systemd.tmpfiles.rules = [
+    "d ${audiodir} - hass hass - -"
+  ];
+
+  systemd.services.copy-philosophische-tuersounds = {
+    description = "copy philosophische tuer";
+    wantedBy = [ "multi-user.target"  ];
+    serviceConfig = {
+      Type = "oneshot";
+      User = "hass";
+      WorkingDirectory = audiodir;
+      ExecStart = pkgs.writeDash "update-samples" ''
+        cp -vr ${recordrepo} ${audiodir}
+      '';
+    };
+  };
+
+  services.home-assistant.config.media_extractor = { };
+  services.home-assistant.config.script."philosophische_tuer" = {
+    alias = "Durchsage der philosophischen Tür";
+    sequence = [
+      { service = "media_player.play_media";
+        data = {
+          entity_id = "media_player.mpd";
+          media_content_type = "playlist";
+          media_content_id = "ansage";
+        };
+      }
+      { delay.seconds = 5; }
+      { service = "media_extractor.play_media";
+        entity_id =  "media_player.mpd";
+        data_template = {
+          media_content_id = random_tuerspruch;
+          media_content_type = "MUSIC";
+        };
+      }
+    ];
+  };
+  services.home-assistant.config.automation =
+  [
+    {
+      alias = "Tür offen seit ${toString short_threshold} sekunden";
+      trigger =
+      { platform = "state";
+        entity_id = sensor;
+        to = "on";
+        for.seconds = 60;
+      };
+      condition = { };
+
+      action = [
+        { service = "homeassistant.turn_on";
+          entity_id = [
+            "script.philosophische_tuer"
+          ];
+        }
+      ];
+    }
+    {
+      alias = "Tür offen seit ${toString long_threshold} minuten";
+      trigger =
+      { platform = "state";
+        entity_id = sensor;
+        to = "on";
+        for.minutes = long_threshold;
+      };
+      condition = { };
+
+      action = [
+        { service = "homeassistant.turn_on";
+          entity_id = [
+            "script.philosophische_tuer"
+          ];
+        }
+        { service = "tts.google_say";
+          entity_id =  "media_player.mpd";
+          data_template = {
+            message = "BEEP BOOP - Die Tür ist schon seit ${toString long_threshold} Minuten offen! Student Nummer {{ range(1,500) | random }}, bitte schliesse die Tür";
+            language = "de";
+          };
+        }
+      ];
+    }
+  ];
+}

From 921e46c16a8dc60f5f5679dffb269aad8f472cc5 Mon Sep 17 00:00:00 2001
From: makefu <github@syntax-fehler.de>
Date: Fri, 12 Mar 2021 20:54:06 +0100
Subject: [PATCH 37/38] ma etherpad: also move template.md

---
 makefu/2configs/{deployment/docker => bgt}/template.md | 0
 1 file changed, 0 insertions(+), 0 deletions(-)
 rename makefu/2configs/{deployment/docker => bgt}/template.md (100%)

diff --git a/makefu/2configs/deployment/docker/template.md b/makefu/2configs/bgt/template.md
similarity index 100%
rename from makefu/2configs/deployment/docker/template.md
rename to makefu/2configs/bgt/template.md

From 2044ad632b68ce173463287a9f437aae699bda83 Mon Sep 17 00:00:00 2001
From: makefu <github@syntax-fehler.de>
Date: Fri, 12 Mar 2021 20:54:40 +0100
Subject: [PATCH 38/38] ma pkgs.xmm7360: init

---
 makefu/5pkgs/xmm7360/default.nix | 47 ++++++++++++++++++++++++++++++++
 1 file changed, 47 insertions(+)
 create mode 100644 makefu/5pkgs/xmm7360/default.nix

diff --git a/makefu/5pkgs/xmm7360/default.nix b/makefu/5pkgs/xmm7360/default.nix
new file mode 100644
index 000000000..5e423b5af
--- /dev/null
+++ b/makefu/5pkgs/xmm7360/default.nix
@@ -0,0 +1,47 @@
+{ stdenv, fetchFromGitHub, python3, kernel, kmod }:
+let
+  py = python3.withPackages (p: [ p.ConfigArgParse p.pyroute2 ]);
+in
+stdenv.mkDerivation rec {
+  name = "xmm7360-pci-${version}-${kernel.version}";
+  version = "1.0";
+
+  src = fetchFromGitHub {
+    owner = "xmm7360";
+    repo = "xmm7360-pci";
+    rev = "0060149";
+    sha256 = "0nr7adlwglpw6hp44x0pq8xhv7kik7nsb8yzbxllvy2v1pinyflv";
+  };
+
+  #sourceRoot = "source/linux/v4l2loopback";
+
+  buildTargets = "default";
+  hardeningDisable = [ "pic" ];
+
+  nativeBuildInputs = kernel.moduleBuildDependencies;
+  buildInputs = [ kmod ];
+
+
+  makeFlags = [
+    "KVERSION=${kernel.modDirVersion}"
+    "KDIR=${kernel.dev}/lib/modules/${kernel.modDirVersion}/build"
+    "INSTALL_MOD_PATH=$(out)"
+  ];
+  postInstall = ''
+    install -d $out/lib/xmm7360/
+    cp -r rpc/ $out/lib/xmm7360/
+    cat > open_xdatachannel <<EOF
+    cd $out/lib/xmm7360
+    exec ${py}/bin/python3 rpc/open_xdatachannel.py $@
+    EOF
+    install -D open_xdatachannel $out/bin/open_xdatachannel
+  '';
+
+  meta = with stdenv.lib; {
+    description = "A kernel module to create V4L2 loopback devices";
+    homepage = "https://github.com/aramg/droidcam";
+    license = licenses.gpl2;
+    maintainers = [ maintainers.makefu ];
+    platforms = platforms.linux;
+  };
+}