From c2a5073339a0f1fbba13648cb93579937c2519db Mon Sep 17 00:00:00 2001 From: Vincent Ambo Date: Sat, 13 Jun 2020 02:11:00 +0100 Subject: [PATCH] feat(nixos/smtprelay): Add derivation & module for SMTP relay This adds a little tool that can be used to relay mail to Gmail (and other SMTP servers). It is intended to be used by Gerrit, which is incompatible with Gmail's SMTP servers. Configuration has been tested by performing a few sends through the tvlbot@tazj.in account. Note that this is using the standard Gmail SMTP server. Using the smtp-relay server relies on IP whitelisting, but camden.tazj.in has a larger number of IPv6 addresses than can be whitelisted (the maximum is 65k). This means that we are limited to 2000 mails per recipient per day, which should be fine. Change-Id: Ie43564d753030f5c800a9cdb4ae98292877d80dc Reviewed-on: https://cl.tvl.fyi/c/depot/+/101 Reviewed-by: edef --- ops/nixos/camden/default.nix | 12 +++++++ ops/nixos/modules/smtprelay.nix | 52 +++++++++++++++++++++++++++++++ third_party/smtprelay/default.nix | 20 ++++++++++++ 3 files changed, 84 insertions(+) create mode 100644 ops/nixos/modules/smtprelay.nix create mode 100644 third_party/smtprelay/default.nix diff --git a/ops/nixos/camden/default.nix b/ops/nixos/camden/default.nix index ea8f0f5ad..46e0a3981 100644 --- a/ops/nixos/camden/default.nix +++ b/ops/nixos/camden/default.nix @@ -18,6 +18,7 @@ in lib.fix(self: { ../modules/depot.nix ../modules/hound.nix ../modules/monorepo-gerrit.nix + ../modules/smtprelay.nix ../modules/tvl-slapd/default.nix "${pkgs.nixpkgsSrc}/nixos/modules/services/web-apps/gerrit.nix" ]; @@ -277,6 +278,17 @@ in lib.fix(self: { }; }; + # Start a local SMTP relay to Gmail (used by gerrit) + services.depot.smtprelay = { + enable = true; + args = { + listen = ":2525"; + remote_host = "smtp.gmail.com:587"; + remote_auth = "plain"; + remote_user = "tvlbot@tazj.in"; + }; + }; + # serve my website(s) services.nginx = { enable = true; diff --git a/ops/nixos/modules/smtprelay.nix b/ops/nixos/modules/smtprelay.nix new file mode 100644 index 000000000..ca960f519 --- /dev/null +++ b/ops/nixos/modules/smtprelay.nix @@ -0,0 +1,52 @@ +# NixOS module for configuring the simple SMTP relay. +{ pkgs, config, lib, ... }: + +let + inherit (builtins) attrValues mapAttrs; + inherit (lib) + concatStringsSep + mkEnableOption + mkOption + types +; + + cfg = config.services.depot.smtprelay; + description = "Simple SMTP relay"; + + # Configuration values that are always overridden. In particular, + # `config` is specified to always load $StateDirectory/secure.config + # (so that passwords can be loaded from there) and logging is pinned + # to stdout for journald compatibility. + overrideArgs = { + logfile = ""; + config = "/var/lib/smtprelay/secure.config"; + }; + + # Creates the command line argument string for the service. + prepareArgs = args: + concatStringsSep " " + (attrValues (mapAttrs (key: value: "-${key} '${toString value}'") + (args // overrideArgs))); +in { + options.services.depot.smtprelay = { + enable = mkEnableOption description; + args = mkOption { + type = types.attrsOf types.str; + description = "Key value pairs for command line arguments"; + }; + }; + + config = { + systemd.services.smtprelay = { + inherit description; + script = "${config.depot.third_party.smtprelay}/bin/smtprelay ${prepareArgs cfg.args}"; + wantedBy = [ "multi-user.target" ]; + + serviceConfig = { + Restart = "always"; + StateDirectory = "smtprelay"; + DynamicUser = true; + }; + }; + }; +} diff --git a/third_party/smtprelay/default.nix b/third_party/smtprelay/default.nix new file mode 100644 index 000000000..6a8b063a5 --- /dev/null +++ b/third_party/smtprelay/default.nix @@ -0,0 +1,20 @@ +# A simple SMTP relay without the kitchen sink. +{ pkgs, lib, ... }: + +pkgs.buildGoModule { + name = "smtprelay"; + vendorSha256 = "0kv9cv2jca2r90qsf40qmqpw84kgxvbxlf39bfw8rvs2lnmqc2dg"; + + src = pkgs.fetchFromGitHub { + owner = "decke"; + repo = "smtprelay"; + rev = "ed1c3a98889e752291aaca6c64149e48452d0583"; + sha256 = "16q2d2ja2cipjvsnfxmdzixkg85sh15rh9r95w6bw2r1gjqr65hr"; + }; + + meta = with lib; { + description = "Simple Golang SMTP relay/proxy server"; + homepage = https://github.com/decke/smtprelay; + license = licenses.mit; + }; +}