diff --git a/clients/faecherstadt-consulting.nix b/clients/faecherstadt-consulting.nix deleted file mode 100644 index 03f69f2562308e2e1de28abaa5771c89720569eb..0000000000000000000000000000000000000000 --- a/clients/faecherstadt-consulting.nix +++ /dev/null @@ -1,232 +0,0 @@ -{ config, pkgs, lib, options, ... }: -let - - secrets = import ../secrets.nix; - - wordpressPackages = { - themes = lib.recurseIntoAttrs (pkgs.callPackage ../wordpress/themes.nix { }); - plugins = lib.recurseIntoAttrs (pkgs.callPackage ../wordpress/plugins.nix { }); - }; - - language-de = pkgs.stdenv.mkDerivation { - name = "language-de"; - src = pkgs.fetchurl { - url = "https://de.wordpress.org/wordpress-5.9.3-de_DE.tar.gz"; - sha256 = "sha256-FFQfn0vVaPEaIT0qI0fvbO5BgpHoyVaYj4N6Plp51fM="; - }; - installPhase = "mkdir -p $out; cp -r ./wp-content/languages/* $out/"; - }; - -in { - -containers ={ - - faecherstadt-consulting = { - config = { config, pkgs, ... }: { - - disabledModules = [ - "services/web-apps/wordpress.nix" - ]; - - imports = [ - "${fetchTarball "https://github.com/onny/nixpkgs/archive/wordpress-lang.tar.gz"}/nixos/modules/services/web-apps/wordpress.nix" - ]; - - services.nextcloud = { - enable = true; - package = pkgs.nextcloud24; - hostName = "nextcloud.faecherstadt-consulting.de"; - config.adminpassFile = "${pkgs.writeText "adminpass" secrets.faecherstadt-consulting.nextcloud.adminPassword}"; - https = true; - }; - - nixpkgs.config = { - allowUnfree = true; - packageOverrides = pkgs: { - unstable = import <nixos-unstable> { - config = config.nixpkgs.config; - }; - }; - }; - - services.wordpress = { - webserver = "nginx"; - sites."faecherstadt-consulting.de" = { - themes = with wordpressPackages.themes; [ faecherstadt-consulting ]; - plugins = with wordpressPackages.plugins; [ jetpack ]; - languages = [ language-de ]; - package = pkgs.unstable.wordpress; - extraConfig = '' - define ('WPLANG', 'de_DE'); - define ('WP_DEFAULT_THEME', 'faecherstadt-consulting'); - // Needed to run behind reverse proxy - define('FORCE_SSL_ADMIN', true); - $_SERVER['HTTPS']='on'; - ''; - }; - }; - - system.stateVersion = "22.05"; - - networking = { - firewall = { - enable = true; - allowedTCPPorts = [ 80 ]; - }; - }; - - environment.etc."resolv.conf".text = "nameserver 8.8.8.8"; - - }; - autoStart = true; - privateNetwork = true; - hostAddress = "192.168.100.10"; - localAddress = "192.168.100.12"; - }; - - -}; - -services = { - - postfix.enable = lib.mkForce false; - - maddy = { - enable = true; - openFirewall = true; - hostname = "mx1.faecherstadt-consulting.de"; - primaryDomain = "faecherstadt-consulting.de"; - tls = { - certPath = "/etc/letsencrypt/live/mx1.faecherstadt-consulting.de/fullchain.pem"; - keyPath = "/etc/letsencrypt/live/mx1.faecherstadt-consulting.de/privkey.pem"; - }; - imap = { - port = 143; - tlsEnable = true; - tlsPort = 993; - }; - submission.tlsEnable = true; - config = builtins.replaceStrings ["msgpipeline local_routing {"] [''msgpipeline local_routing { - check { - rspamd - } - ''] options.services.maddy.config.default; - }; - - rspamd.enable = true; - - go-autoconfig = { - enable = true; - settings = { - service_addr = ":1323"; - domain = "autoconfig.faecherstadt-consulting.de"; - imap = { - server = "mx1.faecherstadt-consulting.de"; - port = 993; - }; - smtp = { - server = "mx1.faecherstadt-consulting.de"; - port = 465; - }; - }; - }; - - nsd = { - enable = false; - interfaces = [ - "0.0.0.0" - "::" - ]; - zones."faecherstadt-consulting.de.".data = let - domainkey = '' - v=DKIM1; k=rsa; p=${ - lib.fileContents( /var/lib/maddy/dkim_keys/faecherstadt-consulting.de_default.dns ) - }''; - segments = ((lib.stringLength domainkey) / 255); - domainkeySplitted = map (x: lib.substring (x*255) 255 domainkey) (lib.range 0 segments); - in '' - @ SOA ns1.faecherstadt-consulting.de noc.faecherstadt-consulting.de 666 7200 3600 1209600 3600 - @ A 159.69.9.150 - @ AAAA 2a01:4f8:1c1c:2c16:: - @ MX 10 mx1 - mx1 A 159.69.9.150 - mx1 AAAA 2a01:4f8:1c1c:2c16:: - ns1 A 159.69.9.150 - ns1 AAAA 2a01:4f8:1c1c:2c16:: - @ TXT "v=spf1 mx ~all" - mx1 TXT "v=spf1 mx ~all" - _dmarc TXT "v=DMARC1; p=quarantine; ruf=mailto:postmaster@faecherstadt-consulting.de" - _mta-sts TXT "v=STSv1; id=1" - _smtp._tls TXT "v=TLSRPTv1;rua=mailto:postmaster@faecherstadt-consulting.de" - default._domainkey TXT "${lib.concatStringsSep "\" \"" domainkeySplitted}" - _autodiscover._tcp SRV 0 0 443 autoconfig - ''; - }; - - caddy = { - enable = true; - virtualHosts = { - - # Fächerstadt-Consulting Wordpress - "fächerstadt-consulting.de" = { - extraConfig = '' - redir https://faecherstadt-consulting.de - ''; - serverAliases = [ - "xn--fcherstadt-consulting-51b.de" - "fcg-faecherstadt-consulting.de" - "xn--fcg-fcherstadt-consulting-pec.de" - ]; - }; - "faecherstadt-consulting.de".extraConfig = '' - reverse_proxy http://192.168.100.12 - ''; - - # Fächerstadt-Consulting Mail Setup - "autoconfig.faecherstadt-consulting.de" = { - extraConfig = '' - reverse_proxy http://localhost:1323 - ''; - serverAliases = [ - "mx1.faecherstadt-consulting.de" - ]; - }; - "mta-sts.faecherstadt-consulting.de".extraConfig = '' - encode gzip - file_server - root * ${ - pkgs.runCommand "testdir" {} '' - mkdir -p "$out/.well-known" - echo " - version: STSv1 - mode: enforce - max_age: 604800 - mx: mx1.faecherstadt-consulting.de - " > "$out/.well-known/mta-sts.txt" - '' - } - ''; - "mailadm.faecherstadt-consulting.de".extraConfig = '' - reverse_proxy http://localhost:8000 - ''; - - - # Fächerstadt-Consulting Nextcloud - "nextcloud.fächerstadt-consulting.de" = { - extraConfig = '' - redir https://nextcloud.faecherstadt-consulting.de - ''; - serverAliases = [ "nextcloud.xn--fcherstadt-consulting-51b.de" ]; - }; - "nextcloud.faecherstadt-consulting.de".extraConfig = '' - reverse_proxy http://192.168.100.12 - ''; - - }; - }; - - }; - - systemd.services.maddy.serviceConfig.SupplementaryGroups = [ "acme" ]; - -} diff --git a/configuration.nix b/configuration.nix index 244c1196b89eb5212cbcdaa53d4373a96ae6ebea..1b7a842d1fb48dca0ea9da9430e52baedc054895 100644 --- a/configuration.nix +++ b/configuration.nix @@ -1,162 +1,170 @@ -{ config, lib, pkgs, ... }: -let +{ pkgs, config, lib, ... }: { - secrets = import ./secrets.nix; - -in { - - disabledModules = [ - "services/mail/maddy.nix" - "services/web-apps/nextcloud.nix" - ]; imports = [ ./hardware-configuration.nix - ./clients/faecherstadt-consulting.nix - ./experimental.nix - "${fetchTarball { - url = "https://github.com/NixOS/nixpkgs/archive/master.tar.gz"; - sha256 = "0zndp3pisaxp33268jd3hw9d69qdcnbxwlq63wiy0i14gwkf7vk1"; - }}/nixos/modules/services/web-apps/onlyoffice.nix" - "${fetchTarball { - url = "https://github.com/NixOS/nixpkgs/archive/master.tar.gz"; - sha256 = "0zndp3pisaxp33268jd3hw9d69qdcnbxwlq63wiy0i14gwkf7vk1"; - }}/nixos/modules/services/web-apps/nextcloud.nix" - "${fetchTarball { - url = "https://github.com/NixOS/nixpkgs/archive/master.tar.gz"; - sha256 = "0zndp3pisaxp33268jd3hw9d69qdcnbxwlq63wiy0i14gwkf7vk1"; - }}/nixos/modules/services/web-apps/outline.nix" - "${fetchTarball "https://github.com/onny/nixpkgs/archive/maddytls.tar.gz"}/nixos/modules/services/mail/maddy.nix" - "${fetchTarball "https://github.com/onny/nixpkgs/archive/e884b832f6cb4e4d781d7fb7679b076c5275e35a.tar.gz"}/nixos/modules/services/networking/go-autoconfig.nix" ]; - nixpkgs.overlays = [ - (self: super: { - onlyoffice-documentserver = (import (builtins.fetchTarball { - url = "https://github.com/NixOS/nixpkgs/archive/master.tar.gz"; - }) { config = { allowUnfree = true; }; }).onlyoffice-documentserver; - }) - (self: super: { - outline = (import (builtins.fetchTarball { - url = "https://github.com/yrd/nixpkgs/archive/outline.tar.gz"; - }) { config = { allowUnfree = true; }; }).outline; - }) - (self: super: { - maddy = (import (builtins.fetchTarball { - url = "https://github.com/NixOS/nixpkgs/archive/master.tar.gz"; - }) { config = { allowUnfree = true; }; }).maddy; - }) - (self: super: { - go-autoconfig = (import (builtins.fetchTarball { - url = "https://github.com/onny/nixpkgs/archive/go-autoconfig.tar.gz"; - }) { config = { allowUnfree = true; }; }).go-autoconfig; - }) - ]; - - boot.cleanTmpDir = true; - zramSwap.enable = true; - - users.users.root.openssh.authorizedKeys.keys = [ - secrets.onny.pubkey - ]; + boot.tmp.cleanOnBoot = true; networking = { hostName = "piproxy"; domain = "project-insanity.org"; - + # FIXME + useNetworkd = true; + # FIXME + nftables = { + enable = true; + ruleset = '' + table ip nat { + chain POSTROUTING { + type nat hook postrouting priority srcnat; policy accept; + oifname "enp1s0" masquerade + oifname "wg0" masquerade + } + } + table ip6 nat6 { + chain POSTROUTING { + type nat hook postrouting priority 0; policy accept; + oifname "enp1s0" masquerade + oifname "wg0" masquerade + } + } + ''; + }; firewall = { enable = true; - allowedTCPPorts = [ 53 80 443 8008 8080 ]; # dns, caddy, dendrite nginx/nextcloud - allowedUDPPorts = [ 53 51821 ]; # dns, wireguard + allowedTCPPorts = [ + 22 80 443 + 25 143 993 465 587 # mail + 2223 # kängu.ru + ]; + # FIXME + allowedUDPPorts = [ 51821 ]; # wireguard + trustedInterfaces = [ "wg0" ]; }; interfaces = { - wg0.mtu = 1384; # dont know why lol - ens3.ipv6.addresses = [{ - address = "2a01:4f8:1c1c:2c16::"; - prefixLength = 64; - }]; + # FIXME + #wg0.mtu = 1340; + enp1s0 = { + ipv6.addresses = [{ + address = "2a01:4f8:1c17:47c6::"; + prefixLength = 64; + }]; + ipv4.addresses = [{ + address = "5.75.249.131"; + prefixLength = 32; + }]; + }; }; defaultGateway6 = { address = "fe80::1"; - interface = "ens3"; + interface = "enp1s0"; }; wireguard.interfaces.wg0 = { - ips = [ "10.100.0.1/24" ]; - listenPort = 51821; + mtu = 1340; + ips = [ + "10.250.0.1/24" + "fdc9:281f:04d7:9ee9::1/64" + ]; generatePrivateKeyFile = true; privateKeyFile = "/etc/wireguard/private_key"; + listenPort = 51821; peers = [ # picloud + { + publicKey = "aFDN/DI7cUmGsqooxmEGbu73cMmmHX05PwJsw95UBjk="; + allowedIPs = [ "10.250.0.2/32" "fdc9:281f:04d7:9ee9::2/128" ]; + } + # kängu.ru + { + publicKey = "1Tz1oAOT0Qs1ZGuZPbPfRjprM1e4YE8GnznXpWQUhnA="; + allowedIPs = [ "10.250.0.3/32" "fdc9:281f:04d7:9ee9::3/128"]; + } + # picloudbackup stuttgart { publicKey = "rX4Gb44rErdsqeTlKtYv3owTKMrFsWWqt+7kyX/MbHU="; - allowedIPs = [ "10.100.0.2/32" ]; + allowedIPs = [ "10.250.0.4/32" "fdc9:281f:04d7:9ee9::4/128"]; + } + # kängu.ru2 + { + publicKey = "vEOtYJZYyMbccj6p3TmRQ20gMm0yv4hJm2Gbv4eQUx8="; + allowedIPs = [ "10.250.0.5/32" "fdc9:281f:04d7:9ee9::5/128"]; } - # piroot + # neutrino { - publicKey = "zEGTPdM5l+ZoN/LzpPVtXqMnu1Dl7qW3kP2JtnN84T0="; - allowedIPs = [ "10.100.0.3/32" ]; + publicKey = "I/TdKfHGTYa52+9yfZdAf02ffCbQovoVdtrq0AW3iWw="; + allowedIPs = [ "10.250.0.6/32" "fdc9:281f:04d7:9ee9::6/128"]; } + # st + { + publicKey = "mEI7WKDn9p0DVUlvN25UKa2GTKPl1kowGHt3ywiyMwY="; + allowedIPs = [ "10.250.0.7/32" "fdc9:281f:04d7:9ee9::7/128"]; + } + # picloudrv + { + publicKey = "QmykoFuo3k18YFP/SJBMr/RBcSBMOpj3XcGGYVsotyg="; + allowedIPs = [ "10.250.0.8/32" ]; + } + # onny + { + publicKey = "PWj8jkuEjmXSg14PSJ3KTwur7tE0fZHPIsr0MFpPznY="; + allowedIPs = [ "10.250.0.9/32" ]; + } + ]; }; nat = { enable = true; - internalInterfaces = ["ve-+"]; - externalInterface = "ens3"; + internalInterfaces = [ "wg0" ]; + externalInterface = "enp1s0"; + enableIPv6 = true; + forwardPorts = let + forwardPortsToDest = ports: destination: map (port: { + sourcePort = port; + proto = "tcp"; + destination = "${destination}:${toString port}"; + }) ports; + in + forwardPortsToDest [ 22 25 80 143 443 465 587 993 ] "10.250.0.2" + ++ forwardPortsToDest [ 22 25 80 143 443 465 587 993 ] "[fdc9:281f:4d7:9ee9::2]" + ++ [{ + sourcePort = 2223; + proto = "tcp"; + destination = "10.250.0.5:22"; + }]; }; - }; - documentation.man.enable = false; - - services = { - - resolved.enable = true; - - openssh = { - enable = true; - openFirewall = true; - }; - - caddy = { - enable = true; - virtualHosts = { - - "lecker-company.de".extraConfig = '' - reverse_proxy http://10.100.0.2 - ''; - - "invoice.turbotux.de".extraConfig = '' - reverse_proxy http://10.100.0.2 - ''; - "turbotux.de".extraConfig = '' - reverse_proxy http://10.100.0.2:8096 - ''; - - "fachwerk-sauna.de" = { - extraConfig = '' - reverse_proxy http://10.100.0.2 - ''; - serverAliases = [ "www.fachwerk-sauna.de" ]; - }; + services.openssh = { + enable = true; + openFirewall = true; + # FIXME + settings.PermitRootLogin = "yes"; + ports = [ 2222 ]; + }; - "${secrets.jhartung.url}".extraConfig = '' - reverse_proxy ${secrets.jhartung.fritzURL}:46190 - ''; - "${secrets.jhartung.url}/ipp".extraConfig = '' - reverse_proxy ${secrets.jhartung.fritzURL}:631 { - header_up Host 192.168.178.220 - } - ''; + # FIXME + systemd.network.networks."40-enp1s0" = { + networkConfig.DHCP = "no"; + routes = [ + { Destination = "172.31.1.1"; } + { Gateway = "172.31.1.1"; GatewayOnLink = true; } + #{ Gateway = "fe80::1"; } + ]; + }; - }; - }; + environment.systemPackages = with pkgs; [ bat neovim ]; - }; + users.users.root.openssh.authorizedKeys.keyFiles = [ + "/etc/ssh/ssh-pubkey-onny" + "/etc/ssh/ssh-pubkey-benibr" + ]; - system.stateVersion = "22.05"; + system.stateVersion = "24.11"; } diff --git a/experimental.nix b/experimental.nix deleted file mode 100644 index 98690d684735bebd88f2feacca98d6d0d6d740ad..0000000000000000000000000000000000000000 --- a/experimental.nix +++ /dev/null @@ -1,140 +0,0 @@ -{ pkgs, lib, config, ... }: -let - - secrets = import ./secrets.nix; - -in { - - containers ={ - - onlyoffice = { - config = { config, pkgs, ... }: { - - imports = [ /root/nixpkgs/nixos/modules/services/web-apps/onlyoffice.nix ]; - - nixpkgs.overlays = [ - (self: super: { - onlyoffice-documentserver = (import (builtins.fetchTarball { - url = "https://github.com/NixOS/nixpkgs/archive/master.tar.gz"; - }) { config = { allowUnfree = true; }; }).onlyoffice-documentserver; - }) - ]; - - services.onlyoffice = { - enable = true; - hostname = "office.turbotux.de"; - }; - - system.stateVersion = "22.05"; - - networking.firewall = { - enable = true; - allowedTCPPorts = [ 80 ]; - }; - - }; - autoStart = true; - privateNetwork = true; - hostAddress = "192.168.100.10"; - localAddress = "192.168.100.11"; - }; - - }; - - - services = { - - #dendrite = { - # enable = true; - # openRegistration = true; - # settings = { - # global.server_name = "turbotux.de"; - # global.private_key = ""; - # client_api.registration_disabled = false; - # }; - #}; - - #outline = { - # enable = true; - # storage = { - # uploadBucketUrl = "http://localhost:9000"; - # uploadBucketName = "outline-bucket"; - # secretKeyFile = builtins.toPath( pkgs.writeText "secretKeyFile" "12345678" ); - # accessKey = "12345"; - # }; - #}; - - minio = { - enable = true; - secretKey = "12345678"; - accessKey = "12345"; - }; - - gitlab = { - enable = true; - #databaseHost = "10.25.40.6"; - databasePasswordFile = pkgs.writeText "dbPassword" secrets.gitlab.dbPassword; - initialRootPasswordFile = pkgs.writeText "rootPassword" secrets.gitlab.initialRootPassword; - smtp.enable = true; - secrets = { - secretFile = pkgs.writeText "secret" secrets.gitlab.secret; - otpFile = pkgs.writeText "otpsecret" secrets.gitlab.optsecret; - dbFile = pkgs.writeText "dbsecret" secrets.gitlab.dbsecret; - jwsFile = pkgs.runCommand "oidcKeyBase" { } "${pkgs.openssl}/bin/openssl genrsa 2048 > $out"; - }; - }; - - nextcloud = { - enable = false; - package = pkgs.nextcloud24; - hostName = "nextcloud.${config.networking.domain}"; - # FIXME: Configure apps - config = { - adminpassFile = "${pkgs.writeText "adminpass" secrets.nextcloud.adminPassword}"; - dbhost = "10.100.0.2"; - dbpassFile = "${pkgs.writeText "dbpass" secrets.nextcloud.dbpass}"; - dbtype = "mysql"; - overwriteProtocol = "https"; - }; - extraOptions = { - passwordsalt = secrets.nextcloud.passwordSalt; - secret = secrets.nextcloud.secret; - instanceid = secrets.nextcloud.instanceId; - installed = true; - }; - }; - #nginx.virtualHosts."nextcloud.project-insanity.org".listen = [ { addr = "127.0.0.1"; port = 8080; } ]; - - caddy = { - enable = true; - virtualHosts = { - - #"wiki.project-insanity.org".extraConfig = '' - # reverse_proxy http://10.100.0.2 - #''; - - #"project-insanity.org" = { - # serverAliases = [ - # "www.project-insanity.org" - # "blog.project-insanity.org" - # "wiki.project-insanity.org" - # "nextcloud.project-insanity.org" - # ]; - # extraConfig = '' - # reverse_proxy http://10.100.0.2 - # ''; - #}; - - "office.turbotux.de".extraConfig = '' - @insecure { - header X-Forwarded-Proto http - } - redir @insecure https://{host}{uri} permanent - reverse_proxy http://192.168.100.11 - ''; - }; - }; - - }; - -} diff --git a/hardware-configuration.nix b/hardware-configuration.nix index dfd35d58d92a0b8175a8f4e40c1c3b773827b918..6b0bc5d15419a14d7939857b0346b10741adbd81 100644 --- a/hardware-configuration.nix +++ b/hardware-configuration.nix @@ -1,7 +1,12 @@ { modulesPath, ... }: { imports = [ (modulesPath + "/profiles/qemu-guest.nix") ]; - boot.loader.grub.device = "/dev/sda"; + boot.loader.grub = { + efiSupport = true; + efiInstallAsRemovable = true; + device = "nodev"; + }; + fileSystems."/boot" = { device = "/dev/disk/by-uuid/06F4-7777"; fsType = "vfat"; }; boot.initrd.availableKernelModules = [ "ata_piix" "uhci_hcd" "xen_blkfront" ]; boot.initrd.kernelModules = [ "nvme" ]; fileSystems."/" = { device = "/dev/sda1"; fsType = "ext4"; }; diff --git a/wordpress/plugins.nix b/wordpress/plugins.nix deleted file mode 100644 index 62240204e6cb3b68e59725f4a8cd8fe304907ac7..0000000000000000000000000000000000000000 --- a/wordpress/plugins.nix +++ /dev/null @@ -1,44 +0,0 @@ -{ lib -, pkgs -, fetchurl -, stdenv -}: - -let - - mkWordpressPlugin = a@{ - pluginName, - namePrefix ? "wordpressplugin-", - src, - unpackPhase ? "", - configurePhase ? ":", - buildPhase ? ":", - addonInfo ? null, - preInstall ? "", - postInstall ? "", - path ? lib.getName pluginName, - ... - }: - stdenv.mkDerivation (a // { - pname = namePrefix + pluginName; - - inherit pluginName unpackPhase configurePhase buildPhase addonInfo preInstall postInstall; - - installPhase = "mkdir -p $out; cp -R * $out/"; - }); - -in rec { - inherit mkWordpressPlugin; - - jetpack = mkWordpressPlugin { - pluginName = "jetpack"; - version = "10.9.1"; - src = fetchurl { - url = "https://downloads.wordpress.org/plugin/jetpack.10.9.1.zip"; - sha256 = "sha256-R4kBpMQ7TJcf0ClqgmeXzzmjRFEqTD+QFnRfAdfBnr8="; - }; - buildInputs = [ pkgs.unzip ]; - installPhase = "mkdir -p $out; cp -R * $out/"; - }; - -} diff --git a/wordpress/themes.nix b/wordpress/themes.nix deleted file mode 100644 index c72ef83aa95e5a374cdcae1d89533470a53f89ec..0000000000000000000000000000000000000000 --- a/wordpress/themes.nix +++ /dev/null @@ -1,45 +0,0 @@ -{ lib -, pkgs -, fetchurl -, stdenv -}: - -let - - mkWordpressTheme = a@{ - themeName, - namePrefix ? "wordpresstheme-", - src, - unpackPhase ? "", - configurePhase ? ":", - buildPhase ? ":", - addonInfo ? null, - preInstall ? "", - postInstall ? "", - path ? lib.getName themeName, - ... - }: - stdenv.mkDerivation (a // { - pname = namePrefix + themeName; - - inherit themeName unpackPhase configurePhase buildPhase addonInfo preInstall postInstall; - - installPhase = "mkdir -p $out; cp -R * $out/"; - }); - -in rec { - inherit mkWordpressTheme; - - faecherstadt-consulting = mkWordpressTheme { - themeName = "faecherstadt-consulting"; - version = "1.2"; - src = fetchurl { - url = "https://git.project-insanity.org/onny/client-faecherstadt-consulting/-/archive/main/client-faecherstadt-consulting-main.tar.bz2"; - sha256 = "sha256-9ebhyMdgYzAtw/aZt9VijyQzegIXMbPmVm8JqcEtArc="; - }; - installPhase = "mkdir -p $out/faecherstadt-consulting; cp -R * $out/faecherstadt-consulting/"; - }; - -} - -