From 4ef40b5971ad76eaacfde15941deb5399aeb0565 Mon Sep 17 00:00:00 2001 From: teutat3s Date: Thu, 2 Feb 2023 17:30:01 +0100 Subject: [PATCH 01/11] drone: use official drone-scp image again Our PR got accepted and the flag we needed is available now: https://github.com/appleboy/drone-scp/pull/102 --- .drone.yml | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/.drone.yml b/.drone.yml index 2a9c496d..c554978e 100644 --- a/.drone.yml +++ b/.drone.yml @@ -111,9 +111,8 @@ steps: - nix run nixpkgs#gnused -- --in-place "s/$ISO_NAME/PubSolarOS-latest.iso/" PubSolarOS-latest.iso.sha256 - name: "Publish ISO" - # custom drone-scp image, source: https://git.b12f.io/pub-solar/drone-scp/ - # docker build --tag registry.greenbaum.cloud/library/drone-scp:v1.6.5 --file ./docker/Dockerfile.linux.amd64 . - image: registry.greenbaum.cloud/library/drone-scp:v1.6.5 + # https://github.com/appleboy/drone-scp/pull/141 got merged, yay + image: appleboy/drone-scp:1.6.5-linux-amd64 volumes: - name: file-exchange path: /var/nix/iso-cache @@ -148,6 +147,6 @@ volumes: --- kind: signature -hmac: 0c0994f0878cdb49172772f78c9a772f5c75830b49c1c22bd15db385fe857e17 +hmac: d6187b243c1939eaf2803830e784aa89dd20edda9ba205940cf6caa2c615b6c6 ... -- 2.44.1 From c8435976eb6124ba3d154240806d00e95257534c Mon Sep 17 00:00:00 2001 From: teutat3s Date: Fri, 24 Feb 2023 17:58:21 +0100 Subject: [PATCH 02/11] nvim: fix file preview for names containing spaces --- modules/terminal-life/nvim/preview-file.nix | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/terminal-life/nvim/preview-file.nix b/modules/terminal-life/nvim/preview-file.nix index bc9e9aa5..2a52bdd8 100644 --- a/modules/terminal-life/nvim/preview-file.nix +++ b/modules/terminal-life/nvim/preview-file.nix @@ -31,6 +31,6 @@ with self; '' --style="''${BAT_STYLE:-numbers}" \ --color=always \ --pager=never \ - --file-name=''$FILE \ + --file-name="''$FILE" \ --highlight-line=$CENTER '' -- 2.44.1 From 8f948f70c7b644969764b098a4c730df074d091c Mon Sep 17 00:00:00 2001 From: teutat3s Date: Wed, 1 Feb 2023 18:58:09 +0100 Subject: [PATCH 03/11] mailman wip --- hosts/flora-6/caddy.nix | 7 +- hosts/flora-6/mailman.nix | 207 +++++++++++++++++++--------------- hosts/flora-6/postfix/main.cf | 15 +-- 3 files changed, 124 insertions(+), 105 deletions(-) diff --git a/hosts/flora-6/caddy.nix b/hosts/flora-6/caddy.nix index 648bfe33..75746bc7 100644 --- a/hosts/flora-6/caddy.nix +++ b/hosts/flora-6/caddy.nix @@ -77,12 +77,7 @@ output discard ''; extraConfig = '' - handle_path /static/* { - root * /var/lib/mailman/web - file_server - } - - reverse_proxy :8000 + reverse_proxy :${services.sourcehut.lists.port} ''; }; "obs-portal.pub.solar" = { diff --git a/hosts/flora-6/mailman.nix b/hosts/flora-6/mailman.nix index 2bbc0866..90840234 100644 --- a/hosts/flora-6/mailman.nix +++ b/hosts/flora-6/mailman.nix @@ -49,95 +49,124 @@ in { owner = "mailman"; }; - virtualisation = { - docker = { - enable = true; - }; - - oci-containers = { - backend = "docker"; - containers."mailman-core" = { - image = "maxking/mailman-core:0.4"; - autoStart = true; - user = "993"; - volumes = [ - "/var/lib/mailman/core:/opt/mailman/" - ]; - extraOptions = [ - "--network=mailman-net" - ]; - environment = { - DATABASE_TYPE = "postgres"; - DATABASE_CLASS = "mailman.database.postgresql.PostgreSQLDatabase"; - MTA = "postfix"; - }; - environmentFiles = [ - config.age.secrets.mailman-core-secrets.path - ]; - ports = [ - "127.0.0.1:8001:8001" # API - "127.0.0.1:8024:8024" # LMTP - incoming emails - ]; - }; - - containers."mailman-web" = { - image = "maxking/mailman-web:0.4"; - autoStart = true; - user = "993"; - volumes = [ - "/var/lib/mailman/web:/opt/mailman-web-data" - ]; - extraOptions = [ - "--network=mailman-net" - ]; - environment = { - DATABASE_TYPE = "postgres"; - SERVE_FROM_DOMAIN = "list.pub.solar"; - MAILMAN_ADMIN_USER = "admin"; - MAILMAN_ADMIN_EMAIL = "admins@pub.solar"; - }; - environmentFiles = [ - config.age.secrets.mailman-web-secrets.path - ]; - ports = [ - "127.0.0.1:8000:8000" # HTTP - # "127.0.0.1:8080:8080" # uwsgi - ]; - }; - - containers."mailman-db" = { - image = "postgres:14-alpine"; - autoStart = true; - user = "993"; - extraOptions = [ - "--network=mailman-net" - ]; - volumes = [ - "/var/lib/mailman/database:/var/lib/postgresql/data" - ]; - environmentFiles = [ - config.age.secrets.mailman-db-secrets.path - ]; - }; - - containers."mailman-postfix" = { - image = "mailu/postfix:1.9.46"; - autoStart = true; - user = "993"; - extraOptions = [ - "--network=mailman-net" - ]; - volumes = [ - "/var/lib/mailman/postfix/overrides:/overrides:ro" - "/var/lib/mailman/postfix/mailqueue:/var/spool/postfix" - "/var/lib/mailman/postfix/data:/var/lib/postfix" - "/var/lib/mailman/core:/var/lib/mailman/core" - "${postfixConfig}:/etc/postfix/main.cf" - ]; - environmentFiles = [ - config.age.secrets.mailman-db-secrets.path - ]; - }; + services.postfix = { + enable = true; + relayDomains = ["hash:/var/lib/mailman/data/postfix_domains"]; + #sslCert = config.security.acme.certs."lists.example.org".directory + "/full.pem"; + #sslKey = config.security.acme.certs."lists.example.org".directory + "/key.pem"; + config = { + transport_maps = ["hash:/var/lib/mailman/data/postfix_lmtp"]; + local_recipient_maps = ["hash:/var/lib/mailman/data/postfix_lmtp"]; }; }; + services.mailman = { + enable = true; + #serve.enable = true; + hyperkitty.enable = true; + webHosts = ["list.pub.solar"]; + siteOwner = "admins@pub.solar"; + }; + + #virtualisation = { + # docker = { + # enable = true; + # }; + + # oci-containers = { + # backend = "docker"; + # containers."mailman-core" = { + # image = "maxking/mailman-core:0.4"; + # autoStart = true; + # #user = "993"; + # volumes = [ + # "/var/lib/mailman/core:/opt/mailman/" + # ]; + # extraOptions = [ + # "--network=mailman-net" + # ]; + # environment = { + # DATABASE_TYPE = "postgres"; + # DATABASE_CLASS = "mailman.database.postgresql.PostgreSQLDatabase"; + # MTA = "postfix"; + # }; + # environmentFiles = [ + # config.age.secrets.mailman-core-secrets.path + # ]; + # ports = [ + # "127.0.0.1:8001:8001" # API + # "127.0.0.1:8024:8024" # LMTP - incoming emails + # ]; + # }; + + # containers."mailman-web" = { + # image = "maxking/mailman-web:0.4"; + # autoStart = true; + # #user = "993:992"; + # volumes = [ + # "/var/lib/mailman/web:/opt/mailman-web-data" + # ]; + # extraOptions = [ + # "--network=mailman-net" + # ]; + # environment = { + # DATABASE_TYPE = "postgres"; + # SERVE_FROM_DOMAIN = "list.pub.solar"; + # MAILMAN_ADMIN_USER = "admin"; + # MAILMAN_ADMIN_EMAIL = "admins@pub.solar"; + # }; + # environmentFiles = [ + # config.age.secrets.mailman-web-secrets.path + # ]; + # ports = [ + # "127.0.0.1:8000:8000" # HTTP + # # "127.0.0.1:8080:8080" # uwsgi + # ]; + # }; + + # containers."mailman-db" = { + # image = "postgres:14-alpine"; + # autoStart = true; + # user = "993"; + # extraOptions = [ + # "--network=mailman-net" + # ]; + # volumes = [ + # "/var/lib/mailman/database:/var/lib/postgresql/data" + # ]; + # environmentFiles = [ + # config.age.secrets.mailman-db-secrets.path + # ]; + # }; + + # containers."mailman-postfix" = { + # image = "mailu/postfix:1.9.46"; + # autoStart = true; + # #user = "993"; + # extraOptions = [ + # "--hostname=list.pub.solar" + # "--network=mailman-net" + # ]; + # environment = { + # HOSTNAMES = "list.pub.solar"; + # FRONT_ADDRESS = "localhost"; + # ADMIN_ADDRESS = "localhost"; + # ANTISPAM_MILTER_ADDRESS = "localhost:11332"; + # LMTP_ADDRESS = "localhost:2525"; + # }; + # volumes = [ + # # https://mailu.io/1.9/faq.html#how-can-i-override-settings + # # Docs contain the wrong path to override main.cf, this one works + # "${postfixConfig}:/overrides/postfix.cf" + # # Configured in main.cf + # "/var/lib/mailman/postfix/mailqueue:/var/spool/postfix" + # "/var/lib/mailman/postfix/data:/var/lib/postfix" + # # Contains postfix transport_maps generated by mailman-core + # "/var/lib/mailman/core:/var/lib/mailman/core" + # ]; + # environmentFiles = [ + # config.age.secrets.mailman-db-secrets.path + # ]; + # }; + # }; + #}; } diff --git a/hosts/flora-6/postfix/main.cf b/hosts/flora-6/postfix/main.cf index 56fb7947..b4998618 100644 --- a/hosts/flora-6/postfix/main.cf +++ b/hosts/flora-6/postfix/main.cf @@ -99,7 +99,7 @@ myhostname = list.pub.solar # $mydomain is used as a default value for many other configuration # parameters. # -#mydomain = domain.tld +mydomain = pub.solar # SENDING MAIL # @@ -609,9 +609,7 @@ debug_peer_level = 2 # the process marches on. If you use an X-based debugger, be sure to # set up your XAUTHORITY environment variable before starting Postfix. # -debugger_command = - PATH=/bin:/usr/bin:/usr/local/bin:/usr/X11R6/bin - ddd $daemon_directory/$process_name $process_id & sleep 5 +debugger_command = PATH=/bin:/usr/bin:/usr/local/bin:/usr/X11R6/bin ddd $daemon_directory/$process_name $process_id & sleep 5 # If you can't use X, use this to capture the call stack when a # daemon crashes. The result is in a file in the configuration @@ -684,9 +682,6 @@ recipient_delimiter = + unknown_local_recipient_reject_code = 550 owner_request_special = no -transport_maps = - regexp:/var/lib/mailman/core/var/data/postfix_lmtp -local_recipient_maps = - regexp:/var/lib/mailman/core/var/data/postfix_lmtp -relay_domains = - regexp:/var/lib/mailman/core/var/data/postfix_domains +transport_maps = regexp:/var/lib/mailman/core/var/data/postfix_lmtp +local_recipient_maps = regexp:/var/lib/mailman/core/var/data/postfix_lmtp +relay_domains = regexp:/var/lib/mailman/core/var/data/postfix_domains -- 2.44.1 From bea032ad99abb9b565dbd75264cbbf86829af0e6 Mon Sep 17 00:00:00 2001 From: teutat3s Date: Thu, 2 Feb 2023 22:54:18 +0100 Subject: [PATCH 04/11] flora-6: init mailman with NixOS module Docker containers were too complicated to setup --- hosts/flora-6/README.md | 16 ++++ hosts/flora-6/caddy.nix | 12 ++- hosts/flora-6/mailman.nix | 176 +++++++------------------------------- 3 files changed, 59 insertions(+), 145 deletions(-) create mode 100644 hosts/flora-6/README.md diff --git a/hosts/flora-6/README.md b/hosts/flora-6/README.md new file mode 100644 index 00000000..df71140c --- /dev/null +++ b/hosts/flora-6/README.md @@ -0,0 +1,16 @@ +# Mailman on NixOS docs + +- add reverse DNS record for IP + +Manual setup done for mailman, adapted from https://nixos.wiki/wiki/Mailman: + +``` +# Add DNS records in infra repo using terraform: +# https://git.pub.solar/pub-solar/infra/commit/db234cdb5b55758a3d74387ada0760e06e166b9d + +# Generate initial postfix_domains.db and postfix_lmtp.db databases for Postfix +sudo -u mailman mailman aliases +# Create a django superuser account +sudo -u mailman-web mailman-web createsuperuser +# Followed outlined steps in web UI +``` diff --git a/hosts/flora-6/caddy.nix b/hosts/flora-6/caddy.nix index 75746bc7..145c534c 100644 --- a/hosts/flora-6/caddy.nix +++ b/hosts/flora-6/caddy.nix @@ -5,6 +5,11 @@ self, ... }: { + # Changing the Caddyfile should only trigger a reload, not a restart + systemd.services.caddy.reloadTriggers = [ + config.services.caddy.configFile + ]; + services.caddy = { enable = lib.mkForce true; group = "hakkonaut"; @@ -77,7 +82,12 @@ output discard ''; extraConfig = '' - reverse_proxy :${services.sourcehut.lists.port} + handle_path /static/* { + root * /var/lib/mailman-web-static + file_server + } + + reverse_proxy :18507 ''; }; "obs-portal.pub.solar" = { diff --git a/hosts/flora-6/mailman.nix b/hosts/flora-6/mailman.nix index 90840234..2b423a77 100644 --- a/hosts/flora-6/mailman.nix +++ b/hosts/flora-6/mailman.nix @@ -5,53 +5,16 @@ self, ... }: let - postfixConfig = pkgs.writeTextFile { - name = "main.cf"; - text = builtins.readFile ./postfix/main.cf; - }; + # Source: https://github.com/NixOS/nixpkgs/blob/nixos-22.11/nixos/modules/services/mail/mailman.nix#L9C10-L10 + # webEnv is required by the mailman-uwsgi systemd service + inherit (pkgs.mailmanPackages.buildEnvs {}) webEnv; in { - system.activationScripts.mkMailmanNet = let - docker = config.virtualisation.oci-containers.backend; - dockerBin = "${pkgs.${docker}}/bin/${docker}"; - in '' - ${dockerBin} network inspect mailman-net >/dev/null 2>&1 || ${dockerBin} network create mailman-net --subnet 172.20.1.0/24 - ''; - - users.users.mailman = { - description = "Mailman Service"; - home = "/var/lib/mailman"; - useDefaultShell = true; - uid = 993; - # Group hakkonaut so caddy can serve the static files from mailman-web directly - group = "hakkonaut"; - isSystemUser = true; - }; - - systemd.tmpfiles.rules = [ - "d '/var/lib/mailman' 0750 mailman hakkonaut - -" - ]; - - age.secrets.mailman-core-secrets = { - file = "${self}/secrets/mailman-core-secrets.age"; - mode = "600"; - owner = "mailman"; - }; - - age.secrets.mailman-web-secrets = { - file = "${self}/secrets/mailman-web-secrets.age"; - mode = "600"; - owner = "mailman"; - }; - - age.secrets.mailman-db-secrets = { - file = "${self}/secrets/mailman-db-secrets.age"; - mode = "600"; - owner = "mailman"; - }; + networking.firewall.allowedTCPPorts = [25]; services.postfix = { enable = true; relayDomains = ["hash:/var/lib/mailman/data/postfix_domains"]; + # FIXME: get TLS certs for list.pub.solar from caddy #sslCert = config.security.acme.certs."lists.example.org".directory + "/full.pem"; #sslKey = config.security.acme.certs."lists.example.org".directory + "/key.pem"; config = { @@ -59,114 +22,39 @@ in { local_recipient_maps = ["hash:/var/lib/mailman/data/postfix_lmtp"]; }; }; + services.mailman = { enable = true; + # We use caddy instead of nginx #serve.enable = true; hyperkitty.enable = true; webHosts = ["list.pub.solar"]; siteOwner = "admins@pub.solar"; }; - #virtualisation = { - # docker = { - # enable = true; - # }; - - # oci-containers = { - # backend = "docker"; - # containers."mailman-core" = { - # image = "maxking/mailman-core:0.4"; - # autoStart = true; - # #user = "993"; - # volumes = [ - # "/var/lib/mailman/core:/opt/mailman/" - # ]; - # extraOptions = [ - # "--network=mailman-net" - # ]; - # environment = { - # DATABASE_TYPE = "postgres"; - # DATABASE_CLASS = "mailman.database.postgresql.PostgreSQLDatabase"; - # MTA = "postfix"; - # }; - # environmentFiles = [ - # config.age.secrets.mailman-core-secrets.path - # ]; - # ports = [ - # "127.0.0.1:8001:8001" # API - # "127.0.0.1:8024:8024" # LMTP - incoming emails - # ]; - # }; - - # containers."mailman-web" = { - # image = "maxking/mailman-web:0.4"; - # autoStart = true; - # #user = "993:992"; - # volumes = [ - # "/var/lib/mailman/web:/opt/mailman-web-data" - # ]; - # extraOptions = [ - # "--network=mailman-net" - # ]; - # environment = { - # DATABASE_TYPE = "postgres"; - # SERVE_FROM_DOMAIN = "list.pub.solar"; - # MAILMAN_ADMIN_USER = "admin"; - # MAILMAN_ADMIN_EMAIL = "admins@pub.solar"; - # }; - # environmentFiles = [ - # config.age.secrets.mailman-web-secrets.path - # ]; - # ports = [ - # "127.0.0.1:8000:8000" # HTTP - # # "127.0.0.1:8080:8080" # uwsgi - # ]; - # }; - - # containers."mailman-db" = { - # image = "postgres:14-alpine"; - # autoStart = true; - # user = "993"; - # extraOptions = [ - # "--network=mailman-net" - # ]; - # volumes = [ - # "/var/lib/mailman/database:/var/lib/postgresql/data" - # ]; - # environmentFiles = [ - # config.age.secrets.mailman-db-secrets.path - # ]; - # }; - - # containers."mailman-postfix" = { - # image = "mailu/postfix:1.9.46"; - # autoStart = true; - # #user = "993"; - # extraOptions = [ - # "--hostname=list.pub.solar" - # "--network=mailman-net" - # ]; - # environment = { - # HOSTNAMES = "list.pub.solar"; - # FRONT_ADDRESS = "localhost"; - # ADMIN_ADDRESS = "localhost"; - # ANTISPAM_MILTER_ADDRESS = "localhost:11332"; - # LMTP_ADDRESS = "localhost:2525"; - # }; - # volumes = [ - # # https://mailu.io/1.9/faq.html#how-can-i-override-settings - # # Docs contain the wrong path to override main.cf, this one works - # "${postfixConfig}:/overrides/postfix.cf" - # # Configured in main.cf - # "/var/lib/mailman/postfix/mailqueue:/var/spool/postfix" - # "/var/lib/mailman/postfix/data:/var/lib/postfix" - # # Contains postfix transport_maps generated by mailman-core - # "/var/lib/mailman/core:/var/lib/mailman/core" - # ]; - # environmentFiles = [ - # config.age.secrets.mailman-db-secrets.path - # ]; - # }; - # }; - #}; + systemd.services.mailman-uwsgi = let + uwsgiConfig.uwsgi = { + type = "normal"; + plugins = ["python3"]; + home = webEnv; + manage-script-name = true; + mount = "/=mailman_web.wsgi:application"; + http = "127.0.0.1:18507"; + }; + uwsgiConfigFile = pkgs.writeText "uwsgi-mailman.json" (builtins.toJSON uwsgiConfig); + in { + wantedBy = ["multi-user.target"]; + after = ["postgresql.service"]; + requires = ["mailman-web-setup.service" "postgresql.service"]; + restartTriggers = [config.environment.etc."mailman3/settings.py".source]; + serviceConfig = { + # Since the mailman-web settings.py obstinately creates a logs + # dir in the cwd, change to the (writable) runtime directory before + # starting uwsgi. + ExecStart = "${pkgs.coreutils}/bin/env -C $RUNTIME_DIRECTORY ${pkgs.uwsgi.override {plugins = ["python3"];}}/bin/uwsgi --json ${uwsgiConfigFile}"; + User = "mailman-web"; + Group = "mailman"; + RuntimeDirectory = "mailman-uwsgi"; + }; + }; } -- 2.44.1 From 008e14482f07a2d43730f884f0cb5dc94cdb34ce Mon Sep 17 00:00:00 2001 From: teutat3s Date: Thu, 2 Feb 2023 22:57:41 +0100 Subject: [PATCH 05/11] flora-6: clean up unneeded postfix config file --- hosts/flora-6/postfix/main.cf | 687 ---------------------------------- 1 file changed, 687 deletions(-) delete mode 100644 hosts/flora-6/postfix/main.cf diff --git a/hosts/flora-6/postfix/main.cf b/hosts/flora-6/postfix/main.cf deleted file mode 100644 index b4998618..00000000 --- a/hosts/flora-6/postfix/main.cf +++ /dev/null @@ -1,687 +0,0 @@ -# Global Postfix configuration file. This file lists only a subset -# of all parameters. For the syntax, and for a complete parameter -# list, see the postconf(5) manual page (command: "man 5 postconf"). -# -# For common configuration examples, see BASIC_CONFIGURATION_README -# and STANDARD_CONFIGURATION_README. To find these documents, use -# the command "postconf html_directory readme_directory", or go to -# http://www.postfix.org/BASIC_CONFIGURATION_README.html etc. -# -# For best results, change no more than 2-3 parameters at a time, -# and test if Postfix still works after every change. - -# COMPATIBILITY -# -# The compatibility_level determines what default settings Postfix -# will use for main.cf and master.cf settings. These defaults will -# change over time. -# -# To avoid breaking things, Postfix will use backwards-compatible -# default settings and log where it uses those old backwards-compatible -# default settings, until the system administrator has determined -# if any backwards-compatible default settings need to be made -# permanent in main.cf or master.cf. -# -# When this review is complete, update the compatibility_level setting -# below as recommended in the RELEASE_NOTES file. -# -# The level below is what should be used with new (not upgrade) installs. -# -compatibility_level = 3.6 - -# SOFT BOUNCE -# -# The soft_bounce parameter provides a limited safety net for -# testing. When soft_bounce is enabled, mail will remain queued that -# would otherwise bounce. This parameter disables locally-generated -# bounces, and prevents the SMTP server from rejecting mail permanently -# (by changing 5xx replies into 4xx replies). However, soft_bounce -# is no cure for address rewriting mistakes or mail routing mistakes. -# -#soft_bounce = no - -# LOCAL PATHNAME INFORMATION -# -# The queue_directory specifies the location of the Postfix queue. -# This is also the root directory of Postfix daemons that run chrooted. -# See the files in examples/chroot-setup for setting up Postfix chroot -# environments on different UNIX systems. -# -queue_directory = /var/spool/postfix - -# The command_directory parameter specifies the location of all -# postXXX commands. -# -command_directory = /usr/sbin - -# The daemon_directory parameter specifies the location of all Postfix -# daemon programs (i.e. programs listed in the master.cf file). This -# directory must be owned by root. -# -daemon_directory = /usr/libexec/postfix - -# The data_directory parameter specifies the location of Postfix-writable -# data files (caches, random numbers). This directory must be owned -# by the mail_owner account (see below). -# -data_directory = /var/lib/postfix - -# QUEUE AND PROCESS OWNERSHIP -# -# The mail_owner parameter specifies the owner of the Postfix queue -# and of most Postfix daemon processes. Specify the name of a user -# account THAT DOES NOT SHARE ITS USER OR GROUP ID WITH OTHER ACCOUNTS -# AND THAT OWNS NO OTHER FILES OR PROCESSES ON THE SYSTEM. In -# particular, don't specify nobody or daemon. PLEASE USE A DEDICATED -# USER. -# -mail_owner = postfix - -# The default_privs parameter specifies the default rights used by -# the local delivery agent for delivery to external file or command. -# These rights are used in the absence of a recipient user context. -# DO NOT SPECIFY A PRIVILEGED USER OR THE POSTFIX OWNER. -# -#default_privs = nobody - -# INTERNET HOST AND DOMAIN NAMES -# -# The myhostname parameter specifies the internet hostname of this -# mail system. The default is to use the fully-qualified domain name -# from gethostname(). $myhostname is used as a default value for many -# other configuration parameters. -# -myhostname = list.pub.solar -#myhostname = virtual.domain.tld - -# The mydomain parameter specifies the local internet domain name. -# The default is to use $myhostname minus the first component. -# $mydomain is used as a default value for many other configuration -# parameters. -# -mydomain = pub.solar - -# SENDING MAIL -# -# The myorigin parameter specifies the domain that locally-posted -# mail appears to come from. The default is to append $myhostname, -# which is fine for small sites. If you run a domain with multiple -# machines, you should (1) change this to $mydomain and (2) set up -# a domain-wide alias database that aliases each user to -# user@that.users.mailhost. -# -# For the sake of consistency between sender and recipient addresses, -# myorigin also specifies the default domain name that is appended -# to recipient addresses that have no @domain part. -# -#myorigin = $myhostname -#myorigin = $mydomain - -# RECEIVING MAIL - -# The inet_interfaces parameter specifies the network interface -# addresses that this mail system receives mail on. By default, -# the software claims all active interfaces on the machine. The -# parameter also controls delivery of mail to user@[ip.address]. -# -# See also the proxy_interfaces parameter, for network addresses that -# are forwarded to us via a proxy or network address translator. -# -# Note: you need to stop/start Postfix when this parameter changes. -# -#inet_interfaces = all -#inet_interfaces = $myhostname -#inet_interfaces = $myhostname, localhost - -# The proxy_interfaces parameter specifies the network interface -# addresses that this mail system receives mail on by way of a -# proxy or network address translation unit. This setting extends -# the address list specified with the inet_interfaces parameter. -# -# You must specify your proxy/NAT addresses when your system is a -# backup MX host for other domains, otherwise mail delivery loops -# will happen when the primary MX host is down. -# -#proxy_interfaces = -#proxy_interfaces = 1.2.3.4 - -# The mydestination parameter specifies the list of domains that this -# machine considers itself the final destination for. -# -# These domains are routed to the delivery agent specified with the -# local_transport parameter setting. By default, that is the UNIX -# compatible delivery agent that lookups all recipients in /etc/passwd -# and /etc/aliases or their equivalent. -# -# The default is $myhostname + localhost.$mydomain + localhost. On -# a mail domain gateway, you should also include $mydomain. -# -# Do not specify the names of virtual domains - those domains are -# specified elsewhere (see VIRTUAL_README). -# -# Do not specify the names of domains that this machine is backup MX -# host for. Specify those names via the relay_domains settings for -# the SMTP server, or use permit_mx_backup if you are lazy (see -# STANDARD_CONFIGURATION_README). -# -# The local machine is always the final destination for mail addressed -# to user@[the.net.work.address] of an interface that the mail system -# receives mail on (see the inet_interfaces parameter). -# -# Specify a list of host or domain names, /file/name or type:table -# patterns, separated by commas and/or whitespace. A /file/name -# pattern is replaced by its contents; a type:table is matched when -# a name matches a lookup key (the right-hand side is ignored). -# Continue long lines by starting the next line with whitespace. -# -# See also below, section "REJECTING MAIL FOR UNKNOWN LOCAL USERS". -# -#mydestination = $myhostname, localhost.$mydomain, localhost -#mydestination = $myhostname, localhost.$mydomain, localhost, $mydomain -#mydestination = $myhostname, localhost.$mydomain, localhost, $mydomain, -# mail.$mydomain, www.$mydomain, ftp.$mydomain - -# REJECTING MAIL FOR UNKNOWN LOCAL USERS -# -# The local_recipient_maps parameter specifies optional lookup tables -# with all names or addresses of users that are local with respect -# to $mydestination, $inet_interfaces or $proxy_interfaces. -# -# If this parameter is defined, then the SMTP server will reject -# mail for unknown local users. This parameter is defined by default. -# -# To turn off local recipient checking in the SMTP server, specify -# local_recipient_maps = (i.e. empty). -# -# The default setting assumes that you use the default Postfix local -# delivery agent for local delivery. You need to update the -# local_recipient_maps setting if: -# -# - You define $mydestination domain recipients in files other than -# /etc/passwd, /etc/aliases, or the $virtual_alias_maps files. -# For example, you define $mydestination domain recipients in -# the $virtual_mailbox_maps files. -# -# - You redefine the local delivery agent in master.cf. -# -# - You redefine the "local_transport" setting in main.cf. -# -# - You use the "luser_relay", "mailbox_transport", or "fallback_transport" -# feature of the Postfix local delivery agent (see local(8)). -# -# Details are described in the LOCAL_RECIPIENT_README file. -# -# Beware: if the Postfix SMTP server runs chrooted, you probably have -# to access the passwd file via the proxymap service, in order to -# overcome chroot restrictions. The alternative, having a copy of -# the system passwd file in the chroot jail is just not practical. -# -# The right-hand side of the lookup tables is conveniently ignored. -# In the left-hand side, specify a bare username, an @domain.tld -# wild-card, or specify a user@domain.tld address. -# -#local_recipient_maps = unix:passwd.byname $alias_maps -#local_recipient_maps = proxy:unix:passwd.byname $alias_maps -#local_recipient_maps = - -# The unknown_local_recipient_reject_code specifies the SMTP server -# response code when a recipient domain matches $mydestination or -# ${proxy,inet}_interfaces, while $local_recipient_maps is non-empty -# and the recipient address or address local-part is not found. -# -# The default setting is 550 (reject mail) but it is safer to start -# with 450 (try again later) until you are certain that your -# local_recipient_maps settings are OK. -# -# unknown_local_recipient_reject_code = 550 - -# TRUST AND RELAY CONTROL - -# The mynetworks parameter specifies the list of "trusted" SMTP -# clients that have more privileges than "strangers". -# -# In particular, "trusted" SMTP clients are allowed to relay mail -# through Postfix. See the smtpd_recipient_restrictions parameter -# in postconf(5). -# -# You can specify the list of "trusted" network addresses by hand -# or you can let Postfix do it for you (which is the default). -# -# By default (mynetworks_style = subnet), Postfix "trusts" SMTP -# clients in the same IP subnetworks as the local machine. -# On Linux, this works correctly only with interfaces specified -# with the "ifconfig" command. -# -# Specify "mynetworks_style = class" when Postfix should "trust" SMTP -# clients in the same IP class A/B/C networks as the local machine. -# Don't do this with a dialup site - it would cause Postfix to "trust" -# your entire provider's network. Instead, specify an explicit -# mynetworks list by hand, as described below. -# -# Specify "mynetworks_style = host" when Postfix should "trust" -# only the local machine. -# -#mynetworks_style = class -#mynetworks_style = subnet -#mynetworks_style = host - -# Alternatively, you can specify the mynetworks list by hand, in -# which case Postfix ignores the mynetworks_style setting. -# -# Specify an explicit list of network/netmask patterns, where the -# mask specifies the number of bits in the network part of a host -# address. -# -# You can also specify the absolute pathname of a pattern file instead -# of listing the patterns here. Specify type:table for table-based lookups -# (the value on the table right-hand side is not used). -# -mynetworks = mailman-core,mailman-web -#mynetworks = $config_directory/mynetworks -#mynetworks = hash:/etc/postfix/network_table - -# The relay_domains parameter restricts what destinations this system will -# relay mail to. See the smtpd_recipient_restrictions description in -# postconf(5) for detailed information. -# -# By default, Postfix relays mail -# - from "trusted" clients (IP address matches $mynetworks) to any destination, -# - from "untrusted" clients to destinations that match $relay_domains or -# subdomains thereof, except addresses with sender-specified routing. -# The default relay_domains value is $mydestination. -# -# In addition to the above, the Postfix SMTP server by default accepts mail -# that Postfix is final destination for: -# - destinations that match $inet_interfaces or $proxy_interfaces, -# - destinations that match $mydestination -# - destinations that match $virtual_alias_domains, -# - destinations that match $virtual_mailbox_domains. -# These destinations do not need to be listed in $relay_domains. -# -# Specify a list of hosts or domains, /file/name patterns or type:name -# lookup tables, separated by commas and/or whitespace. Continue -# long lines by starting the next line with whitespace. A file name -# is replaced by its contents; a type:name table is matched when a -# (parent) domain appears as lookup key. -# -# NOTE: Postfix will not automatically forward mail for domains that -# list this system as their primary or backup MX host. See the -# permit_mx_backup restriction description in postconf(5). -# -#relay_domains = $mydestination - -# INTERNET OR INTRANET - -# The relayhost parameter specifies the default host to send mail to -# when no entry is matched in the optional transport(5) table. When -# no relayhost is given, mail is routed directly to the destination. -# -# On an intranet, specify the organizational domain name. If your -# internal DNS uses no MX records, specify the name of the intranet -# gateway host instead. -# -# In the case of SMTP, specify a domain, host, host:port, [host]:port, -# [address] or [address]:port; the form [host] turns off MX lookups. -# -# If you're connected via UUCP, see also the default_transport parameter. -# -#relayhost = $mydomain -#relayhost = [gateway.my.domain] -#relayhost = [mailserver.isp.tld] -#relayhost = uucphost -#relayhost = [an.ip.add.ress] - -# REJECTING UNKNOWN RELAY USERS -# -# The relay_recipient_maps parameter specifies optional lookup tables -# with all addresses in the domains that match $relay_domains. -# -# If this parameter is defined, then the SMTP server will reject -# mail for unknown relay users. This feature is off by default. -# -# The right-hand side of the lookup tables is conveniently ignored. -# In the left-hand side, specify an @domain.tld wild-card, or specify -# a user@domain.tld address. -# -#relay_recipient_maps = hash:/etc/postfix/relay_recipients - -# INPUT RATE CONTROL -# -# The in_flow_delay configuration parameter implements mail input -# flow control. This feature is turned on by default, although it -# still needs further development (it's disabled on SCO UNIX due -# to an SCO bug). -# -# A Postfix process will pause for $in_flow_delay seconds before -# accepting a new message, when the message arrival rate exceeds the -# message delivery rate. With the default 100 SMTP server process -# limit, this limits the mail inflow to 100 messages a second more -# than the number of messages delivered per second. -# -# Specify 0 to disable the feature. Valid delays are 0..10. -# -#in_flow_delay = 1s - -# ADDRESS REWRITING -# -# The ADDRESS_REWRITING_README document gives information about -# address masquerading or other forms of address rewriting including -# username->Firstname.Lastname mapping. - -# ADDRESS REDIRECTION (VIRTUAL DOMAIN) -# -# The VIRTUAL_README document gives information about the many forms -# of domain hosting that Postfix supports. - -# "USER HAS MOVED" BOUNCE MESSAGES -# -# See the discussion in the ADDRESS_REWRITING_README document. - -# TRANSPORT MAP -# -# See the discussion in the ADDRESS_REWRITING_README document. - -# ALIAS DATABASE -# -# The alias_maps parameter specifies the list of alias databases used -# by the local delivery agent. The default list is system dependent. -# -# On systems with NIS, the default is to search the local alias -# database, then the NIS alias database. See aliases(5) for syntax -# details. -# -# If you change the alias database, run "postalias /etc/aliases" (or -# wherever your system stores the mail alias file), or simply run -# "newaliases" to build the necessary DBM or DB file. -# -# It will take a minute or so before changes become visible. Use -# "postfix reload" to eliminate the delay. -# -#alias_maps = dbm:/etc/aliases -#alias_maps = hash:/etc/aliases -#alias_maps = hash:/etc/aliases, nis:mail.aliases -#alias_maps = netinfo:/aliases - -# The alias_database parameter specifies the alias database(s) that -# are built with "newaliases" or "sendmail -bi". This is a separate -# configuration parameter, because alias_maps (see above) may specify -# tables that are not necessarily all under control by Postfix. -# -#alias_database = dbm:/etc/aliases -#alias_database = dbm:/etc/mail/aliases -#alias_database = hash:/etc/aliases -#alias_database = hash:/etc/aliases, hash:/opt/majordomo/aliases - -# ADDRESS EXTENSIONS (e.g., user+foo) -# -# The recipient_delimiter parameter specifies the separator between -# user names and address extensions (user+foo). See canonical(5), -# local(8), relocated(5) and virtual(5) for the effects this has on -# aliases, canonical, virtual, relocated and .forward file lookups. -# Basically, the software tries user+foo and .forward+foo before -# trying user and .forward. -# -#recipient_delimiter = + - -# DELIVERY TO MAILBOX -# -# The home_mailbox parameter specifies the optional pathname of a -# mailbox file relative to a user's home directory. The default -# mailbox file is /var/spool/mail/user or /var/mail/user. Specify -# "Maildir/" for qmail-style delivery (the / is required). -# -#home_mailbox = Mailbox -#home_mailbox = Maildir/ - -# The mail_spool_directory parameter specifies the directory where -# UNIX-style mailboxes are kept. The default setting depends on the -# system type. -# -#mail_spool_directory = /var/mail -#mail_spool_directory = /var/spool/mail - -# The mailbox_command parameter specifies the optional external -# command to use instead of mailbox delivery. The command is run as -# the recipient with proper HOME, SHELL and LOGNAME environment settings. -# Exception: delivery for root is done as $default_user. -# -# Other environment variables of interest: USER (recipient username), -# EXTENSION (address extension), DOMAIN (domain part of address), -# and LOCAL (the address localpart). -# -# Unlike other Postfix configuration parameters, the mailbox_command -# parameter is not subjected to $parameter substitutions. This is to -# make it easier to specify shell syntax (see example below). -# -# Avoid shell meta characters because they will force Postfix to run -# an expensive shell process. Procmail alone is expensive enough. -# -# IF YOU USE THIS TO DELIVER MAIL SYSTEM-WIDE, YOU MUST SET UP AN -# ALIAS THAT FORWARDS MAIL FOR ROOT TO A REAL USER. -# -#mailbox_command = /some/where/procmail -#mailbox_command = /some/where/procmail -a "$EXTENSION" - -# The mailbox_transport specifies the optional transport in master.cf -# to use after processing aliases and .forward files. This parameter -# has precedence over the mailbox_command, fallback_transport and -# luser_relay parameters. -# -# Specify a string of the form transport:nexthop, where transport is -# the name of a mail delivery transport defined in master.cf. The -# :nexthop part is optional. For more details see the sample transport -# configuration file. -# -# NOTE: if you use this feature for accounts not in the UNIX password -# file, then you must update the "local_recipient_maps" setting in -# the main.cf file, otherwise the SMTP server will reject mail for -# non-UNIX accounts with "User unknown in local recipient table". -# -# Cyrus IMAP over LMTP. Specify ``lmtpunix cmd="lmtpd" -# listen="/var/imap/socket/lmtp" prefork=0'' in cyrus.conf. -#mailbox_transport = lmtp:unix:/var/imap/socket/lmtp -# -# Cyrus IMAP via command line. Uncomment the "cyrus...pipe" and -# subsequent line in master.cf. -#mailbox_transport = cyrus - -# The fallback_transport specifies the optional transport in master.cf -# to use for recipients that are not found in the UNIX passwd database. -# This parameter has precedence over the luser_relay parameter. -# -# Specify a string of the form transport:nexthop, where transport is -# the name of a mail delivery transport defined in master.cf. The -# :nexthop part is optional. For more details see the sample transport -# configuration file. -# -# NOTE: if you use this feature for accounts not in the UNIX password -# file, then you must update the "local_recipient_maps" setting in -# the main.cf file, otherwise the SMTP server will reject mail for -# non-UNIX accounts with "User unknown in local recipient table". -# -#fallback_transport = lmtp:unix:/file/name -#fallback_transport = cyrus -#fallback_transport = - -# The luser_relay parameter specifies an optional destination address -# for unknown recipients. By default, mail for unknown@$mydestination, -# unknown@[$inet_interfaces] or unknown@[$proxy_interfaces] is returned -# as undeliverable. -# -# The following expansions are done on luser_relay: $user (recipient -# username), $shell (recipient shell), $home (recipient home directory), -# $recipient (full recipient address), $extension (recipient address -# extension), $domain (recipient domain), $local (entire recipient -# localpart), $recipient_delimiter. Specify ${name?value} or -# ${name:value} to expand value only when $name does (does not) exist. -# -# luser_relay works only for the default Postfix local delivery agent. -# -# NOTE: if you use this feature for accounts not in the UNIX password -# file, then you must specify "local_recipient_maps =" (i.e. empty) in -# the main.cf file, otherwise the SMTP server will reject mail for -# non-UNIX accounts with "User unknown in local recipient table". -# -#luser_relay = $user@other.host -#luser_relay = $local@other.host -#luser_relay = admin+$local - -# JUNK MAIL CONTROLS -# -# The controls listed here are only a very small subset. The file -# SMTPD_ACCESS_README provides an overview. - -# The header_checks parameter specifies an optional table with patterns -# that each logical message header is matched against, including -# headers that span multiple physical lines. -# -# By default, these patterns also apply to MIME headers and to the -# headers of attached messages. With older Postfix versions, MIME and -# attached message headers were treated as body text. -# -# For details, see "man header_checks". -# -#header_checks = regexp:/etc/postfix/header_checks - -# FAST ETRN SERVICE -# -# Postfix maintains per-destination logfiles with information about -# deferred mail, so that mail can be flushed quickly with the SMTP -# "ETRN domain.tld" command, or by executing "sendmail -qRdomain.tld". -# See the ETRN_README document for a detailed description. -# -# The fast_flush_domains parameter controls what destinations are -# eligible for this service. By default, they are all domains that -# this server is willing to relay mail to. -# -#fast_flush_domains = $relay_domains - -# SHOW SOFTWARE VERSION OR NOT -# -# The smtpd_banner parameter specifies the text that follows the 220 -# code in the SMTP server's greeting banner. Some people like to see -# the mail version advertised. By default, Postfix shows no version. -# -# You MUST specify $myhostname at the start of the text. That is an -# RFC requirement. Postfix itself does not care. -# -#smtpd_banner = $myhostname ESMTP $mail_name -#smtpd_banner = $myhostname ESMTP $mail_name ($mail_version) - -# PARALLEL DELIVERY TO THE SAME DESTINATION -# -# How many parallel deliveries to the same user or domain? With local -# delivery, it does not make sense to do massively parallel delivery -# to the same user, because mailbox updates must happen sequentially, -# and expensive pipelines in .forward files can cause disasters when -# too many are run at the same time. With SMTP deliveries, 10 -# simultaneous connections to the same domain could be sufficient to -# raise eyebrows. -# -# Each message delivery transport has its XXX_destination_concurrency_limit -# parameter. The default is $default_destination_concurrency_limit for -# most delivery transports. For the local delivery agent the default is 2. - -#local_destination_concurrency_limit = 2 -#default_destination_concurrency_limit = 20 - -# DEBUGGING CONTROL -# -# The debug_peer_level parameter specifies the increment in verbose -# logging level when an SMTP client or server host name or address -# matches a pattern in the debug_peer_list parameter. -# -debug_peer_level = 2 - -# The debug_peer_list parameter specifies an optional list of domain -# or network patterns, /file/name patterns or type:name tables. When -# an SMTP client or server host name or address matches a pattern, -# increase the verbose logging level by the amount specified in the -# debug_peer_level parameter. -# -#debug_peer_list = 127.0.0.1 -#debug_peer_list = some.domain - -# The debugger_command specifies the external command that is executed -# when a Postfix daemon program is run with the -D option. -# -# Use "command .. & sleep 5" so that the debugger can attach before -# the process marches on. If you use an X-based debugger, be sure to -# set up your XAUTHORITY environment variable before starting Postfix. -# -debugger_command = PATH=/bin:/usr/bin:/usr/local/bin:/usr/X11R6/bin ddd $daemon_directory/$process_name $process_id & sleep 5 - -# If you can't use X, use this to capture the call stack when a -# daemon crashes. The result is in a file in the configuration -# directory, and is named after the process name and the process ID. -# -# debugger_command = -# PATH=/bin:/usr/bin:/usr/local/bin; export PATH; (echo cont; -# echo where) | gdb $daemon_directory/$process_name $process_id 2>&1 -# >$config_directory/$process_name.$process_id.log & sleep 5 -# -# Another possibility is to run gdb under a detached screen session. -# To attach to the screen session, su root and run "screen -r -# " where uniquely matches one of the detached -# sessions (from "screen -list"). -# -# debugger_command = -# PATH=/bin:/usr/bin:/sbin:/usr/sbin; export PATH; screen -# -dmS $process_name gdb $daemon_directory/$process_name -# $process_id & sleep 1 - -# INSTALL-TIME CONFIGURATION INFORMATION -# -# The following parameters are used when installing a new Postfix version. -# -# sendmail_path: The full pathname of the Postfix sendmail command. -# This is the Sendmail-compatible mail posting interface. -# -sendmail_path = /usr/sbin/sendmail - -# newaliases_path: The full pathname of the Postfix newaliases command. -# This is the Sendmail-compatible command to build alias databases. -# -newaliases_path = /usr/bin/newaliases - -# mailq_path: The full pathname of the Postfix mailq command. This -# is the Sendmail-compatible mail queue listing command. -# -mailq_path = /usr/bin/mailq - -# setgid_group: The group for mail submission and queue management -# commands. This must be a group name with a numerical group ID that -# is not shared with other accounts, not even with the Postfix account. -# -setgid_group = postdrop - -# html_directory: The location of the Postfix HTML documentation. -# -html_directory = no - -# manpage_directory: The location of the Postfix on-line manual pages. -# -manpage_directory = /usr/share/man - -# sample_directory: The location of the Postfix sample configuration files. -# This parameter is obsolete as of Postfix 2.1. -# -sample_directory = /etc/postfix - -# readme_directory: The location of the Postfix README files. -# -readme_directory = /usr/share/doc/postfix/readme -inet_protocols = ipv4 -meta_directory = /etc/postfix -shlib_directory = /usr/lib/postfix - - -# Config below taken and adapted from -# https://github.com/maxking/docker-mailman#postfix -recipient_delimiter = + -unknown_local_recipient_reject_code = 550 -owner_request_special = no - -transport_maps = regexp:/var/lib/mailman/core/var/data/postfix_lmtp -local_recipient_maps = regexp:/var/lib/mailman/core/var/data/postfix_lmtp -relay_domains = regexp:/var/lib/mailman/core/var/data/postfix_domains -- 2.44.1 From 5e5fb64ddec04087d2a678dd314f5f4f72b4e2e1 Mon Sep 17 00:00:00 2001 From: teutat3s Date: Fri, 3 Feb 2023 14:19:04 +0100 Subject: [PATCH 06/11] flora-6: postfix should use list.pub.solar as hostname - Send postmaster and root mails to admins@pub.solar - Add TODO comment about django-keycloak --- hosts/flora-6/mailman.nix | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/hosts/flora-6/mailman.nix b/hosts/flora-6/mailman.nix index 2b423a77..a007c971 100644 --- a/hosts/flora-6/mailman.nix +++ b/hosts/flora-6/mailman.nix @@ -21,6 +21,9 @@ in { transport_maps = ["hash:/var/lib/mailman/data/postfix_lmtp"]; local_recipient_maps = ["hash:/var/lib/mailman/data/postfix_lmtp"]; }; + rootAlias = "admins@pub.solar"; + postmasterAlias = "admins@pub.solar"; + hostname = "list.pub.solar"; }; services.mailman = { @@ -32,6 +35,17 @@ in { siteOwner = "admins@pub.solar"; }; + # TODO add django-keycloak as auth provider + # https://django-keycloak.readthedocs.io/en/latest/ + ## Extend settings.py directly since this can't be done via JSON + ## settings (services.mailman.webSettings) + #environment.etc."mailman3/settings.py".text = '' + # INSTALLED_APPS.extend([ + # "allauth.socialaccount.providers.github", + # "allauth.socialaccount.providers.gitlab" + # ]) + #''; + systemd.services.mailman-uwsgi = let uwsgiConfig.uwsgi = { type = "normal"; -- 2.44.1 From 1199820574ac1735a2939875e8ee001bcf57fa2c Mon Sep 17 00:00:00 2001 From: teutat3s Date: Wed, 8 Feb 2023 20:29:53 +0100 Subject: [PATCH 07/11] postfix: use caddy's certs for STARTTLS on port 25 --- hosts/flora-6/mailman.nix | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/hosts/flora-6/mailman.nix b/hosts/flora-6/mailman.nix index a007c971..2ac2dbc7 100644 --- a/hosts/flora-6/mailman.nix +++ b/hosts/flora-6/mailman.nix @@ -14,9 +14,12 @@ in { services.postfix = { enable = true; relayDomains = ["hash:/var/lib/mailman/data/postfix_domains"]; - # FIXME: get TLS certs for list.pub.solar from caddy - #sslCert = config.security.acme.certs."lists.example.org".directory + "/full.pem"; - #sslKey = config.security.acme.certs."lists.example.org".directory + "/key.pem"; + # get TLS certs for list.pub.solar from caddy + # TODO: when caddy renews certs, postfix doesn't know about it + # implement custom built caddy with events exec handler or systemd-reload + # hook so postfix reloads, too + sslCert = "/var/lib/caddy/.local/share/caddy/certificates/acme-v02.api.letsencrypt.org-directory/list.pub.solar/list.pub.solar.crt"; + sslKey = "/var/lib/caddy/.local/share/caddy/certificates/acme-v02.api.letsencrypt.org-directory/list.pub.solar/list.pub.solar.key"; config = { transport_maps = ["hash:/var/lib/mailman/data/postfix_lmtp"]; local_recipient_maps = ["hash:/var/lib/mailman/data/postfix_lmtp"]; -- 2.44.1 From 94cc00572e43ab847fa7dc3eff798fb63108379d Mon Sep 17 00:00:00 2001 From: teutat3s Date: Sat, 25 Feb 2023 17:53:47 +0100 Subject: [PATCH 08/11] drone: ensure docker starts before trying to create docker network drone-net with systemd dependencies --- hosts/flora-6/drone.nix | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/hosts/flora-6/drone.nix b/hosts/flora-6/drone.nix index 8b7dd693..0aad276a 100644 --- a/hosts/flora-6/drone.nix +++ b/hosts/flora-6/drone.nix @@ -31,12 +31,16 @@ "d '/var/lib/drone-db' 0750 drone drone - -" ]; - system.activationScripts.mkDroneNet = let + systemd.services."docker-network-drone" = let docker = config.virtualisation.oci-containers.backend; dockerBin = "${pkgs.${docker}}/bin/${docker}"; - in '' - ${dockerBin} network inspect drone-net >/dev/null 2>&1 || ${dockerBin} network create drone-net --subnet 172.20.0.0/24 - ''; + in { + serviceConfig.Type = "oneshot"; + before = ["docker-drone-server.service"]; + script = '' + ${dockerBin} network inspect drone-net >/dev/null 2>&1 || ${dockerBin} network create drone-net --subnet 172.20.0.0/24 + ''; + }; virtualisation = { docker = { -- 2.44.1 From a1cb0717730f775f4150aac23b9aab5285a2c2cb Mon Sep 17 00:00:00 2001 From: teutat3s Date: Sat, 25 Feb 2023 17:54:47 +0100 Subject: [PATCH 09/11] mailman: trigger postfix reload when caddy renews TLS Let's Encrypt certificates --- hosts/flora-6/mailman.nix | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/hosts/flora-6/mailman.nix b/hosts/flora-6/mailman.nix index 2ac2dbc7..955723d4 100644 --- a/hosts/flora-6/mailman.nix +++ b/hosts/flora-6/mailman.nix @@ -29,6 +29,31 @@ in { hostname = "list.pub.solar"; }; + systemd.paths.watcher-caddy-ssl-file = { + description = "Watches for changes in caddy's TLS cert file (after renewals) to reload postfix"; + documentation = ["systemd.path(5)"]; + partOf = ["postfix-reload.service"]; + pathConfig = { + PathChanged = "/var/lib/caddy/.local/share/caddy/certificates/acme-v02.api.letsencrypt.org-directory/list.pub.solar/list.pub.solar.crt"; + Unit = "postfix-reload.service"; + }; + wantedBy = ["multi-user.target"]; + }; + + systemd.services."postfix-reload" = { + description = "Reloads postfix config, e.g. after TLS certs change, notified by watcher-caddy-ssl-file.path"; + documentation = ["systemd.path(5)"]; + requires = ["postfix.service"]; + after = ["postfix.service"]; + startLimitIntervalSec = 10; + startLimitBurst = 5; + serviceConfig.Type = "oneshot"; + script = '' + ${pkgs.systemd}/bin/systemctl reload postfix + ''; + wantedBy = ["multi-user.target"]; + }; + services.mailman = { enable = true; # We use caddy instead of nginx -- 2.44.1 From 078441af963cfd14a6dc9dbc1ae333072742588b Mon Sep 17 00:00:00 2001 From: teutat3s Date: Sat, 25 Feb 2023 17:55:17 +0100 Subject: [PATCH 10/11] Bump flake.lock --- flake.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/flake.lock b/flake.lock index e9fd4734..fd0544e0 100644 --- a/flake.lock +++ b/flake.lock @@ -260,11 +260,11 @@ "utils": "utils_2" }, "locked": { - "lastModified": 1676257154, - "narHash": "sha256-eW3jymNLpdxS5fkp9NWKyNtgL0Gqtgg1vCTofKXDF1g=", + "lastModified": 1677284824, + "narHash": "sha256-I3gDxmGjyXdtOR5S8sIeCO8pT+5OR69f/g5EVoQUdsY=", "owner": "nix-community", "repo": "home-manager", - "rev": "2cb27c79117a2a75ff3416c3199a2dc57af6a527", + "rev": "29280978234b73423f4eb708cbb999295f76b42a", "type": "github" }, "original": { -- 2.44.1 From 20b70c248161b830be17dbefb6e4889611e13289 Mon Sep 17 00:00:00 2001 From: teutat3s Date: Sun, 26 Feb 2023 00:24:02 +0100 Subject: [PATCH 11/11] ci: fix drone.yml signature --- .drone.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.drone.yml b/.drone.yml index 03c3ff5a..0d6ea82c 100644 --- a/.drone.yml +++ b/.drone.yml @@ -147,6 +147,6 @@ volumes: --- kind: signature -hmac: d6187b243c1939eaf2803830e784aa89dd20edda9ba205940cf6caa2c615b6c6 +hmac: 907568d64c1560d414768dd453138911ebe0f922658335d1d5120482784b1426 ... -- 2.44.1