diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000000000000000000000000000000000000..89b3a77de6cffa8876648bed1c8630d92aab72f9 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +secrets.nix diff --git a/clients/faecherstadt-consulting.nix b/clients/faecherstadt-consulting.nix new file mode 100644 index 0000000000000000000000000000000000000000..03f69f2562308e2e1de28abaa5771c89720569eb --- /dev/null +++ b/clients/faecherstadt-consulting.nix @@ -0,0 +1,232 @@ +{ 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 new file mode 100644 index 0000000000000000000000000000000000000000..244c1196b89eb5212cbcdaa53d4373a96ae6ebea --- /dev/null +++ b/configuration.nix @@ -0,0 +1,162 @@ +{ config, lib, pkgs, ... }: +let + + 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 + ]; + + networking = { + + hostName = "piproxy"; + domain = "project-insanity.org"; + + firewall = { + enable = true; + allowedTCPPorts = [ 53 80 443 8008 8080 ]; # dns, caddy, dendrite nginx/nextcloud + allowedUDPPorts = [ 53 51821 ]; # dns, wireguard + }; + + interfaces = { + wg0.mtu = 1384; # dont know why lol + ens3.ipv6.addresses = [{ + address = "2a01:4f8:1c1c:2c16::"; + prefixLength = 64; + }]; + }; + + defaultGateway6 = { + address = "fe80::1"; + interface = "ens3"; + }; + + wireguard.interfaces.wg0 = { + ips = [ "10.100.0.1/24" ]; + listenPort = 51821; + generatePrivateKeyFile = true; + privateKeyFile = "/etc/wireguard/private_key"; + peers = [ + # picloud + { + publicKey = "rX4Gb44rErdsqeTlKtYv3owTKMrFsWWqt+7kyX/MbHU="; + allowedIPs = [ "10.100.0.2/32" ]; + } + # piroot + { + publicKey = "zEGTPdM5l+ZoN/LzpPVtXqMnu1Dl7qW3kP2JtnN84T0="; + allowedIPs = [ "10.100.0.3/32" ]; + } + ]; + }; + + nat = { + enable = true; + internalInterfaces = ["ve-+"]; + externalInterface = "ens3"; + }; + + }; + + 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" ]; + }; + + "${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 + } + ''; + + }; + }; + + }; + + system.stateVersion = "22.05"; + +} diff --git a/experimental.nix b/experimental.nix new file mode 100644 index 0000000000000000000000000000000000000000..98690d684735bebd88f2feacca98d6d0d6d740ad --- /dev/null +++ b/experimental.nix @@ -0,0 +1,140 @@ +{ 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 new file mode 100644 index 0000000000000000000000000000000000000000..dfd35d58d92a0b8175a8f4e40c1c3b773827b918 --- /dev/null +++ b/hardware-configuration.nix @@ -0,0 +1,9 @@ +{ modulesPath, ... }: +{ + imports = [ (modulesPath + "/profiles/qemu-guest.nix") ]; + boot.loader.grub.device = "/dev/sda"; + 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 new file mode 100644 index 0000000000000000000000000000000000000000..62240204e6cb3b68e59725f4a8cd8fe304907ac7 --- /dev/null +++ b/wordpress/plugins.nix @@ -0,0 +1,44 @@ +{ 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 new file mode 100644 index 0000000000000000000000000000000000000000..c72ef83aa95e5a374cdcae1d89533470a53f89ec --- /dev/null +++ b/wordpress/themes.nix @@ -0,0 +1,45 @@ +{ 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/"; + }; + +} + +