From 84543e02280881565d3250dc0efd4499d6cbaae5 Mon Sep 17 00:00:00 2001 From: Jakob Odersky Date: Sun, 9 Dec 2018 14:52:11 -0800 Subject: Add email module --- terraform/main.tf | 9 + terraform/modules/email/main.tf | 268 +++++++++++++++++++++ terraform/modules/email/postfix-master.cf | 120 +++++++++ .../rootfs/etc/nginx/conf.d/server_names.conf | 1 + .../rootfs/etc/nginx/sites-enabled/www.conf | 23 ++ .../rootfs/usr/local/share/www/crashbox.svg | 87 +++++++ .../rootfs/usr/local/share/www/index.html | 21 ++ 7 files changed, 529 insertions(+) create mode 100644 terraform/modules/email/main.tf create mode 100644 terraform/modules/email/postfix-master.cf create mode 100644 terraform/provision/rootfs/etc/nginx/conf.d/server_names.conf create mode 100644 terraform/provision/rootfs/etc/nginx/sites-enabled/www.conf create mode 100755 terraform/provision/rootfs/usr/local/share/www/crashbox.svg create mode 100644 terraform/provision/rootfs/usr/local/share/www/index.html diff --git a/terraform/main.tf b/terraform/main.tf index 9a4bbc7..6f9124c 100644 --- a/terraform/main.tf +++ b/terraform/main.tf @@ -150,3 +150,12 @@ resource "cloudflare_record" "record_keybase" { value = "keybase-site-verification=useVUuHjr-ZoYdIDjzv1JngSiIoHYoGmXHy2BxJcYgE" type = "TXT" } + +module "email" { + source = "./modules/email" + secret_cloudflare_token = "${var.secret_cloudflare_token}" + server_ipv4 = "${hcloud_server.peter.ipv4_address}" + server_ipv6 = "${hcloud_server.peter.ipv6_address}1" + server_id = "${hcloud_server.peter.id}" + domain = "crashbox.io" +} diff --git a/terraform/modules/email/main.tf b/terraform/modules/email/main.tf new file mode 100644 index 0000000..510994e --- /dev/null +++ b/terraform/modules/email/main.tf @@ -0,0 +1,268 @@ +variable "secret_cloudflare_token" {} + +variable "domain" { + description = "Domain name of email addresses." +} + +variable "server_ipv4" { + description = "IP address of primary mail server." +} + +variable "server_ipv6" { + description = "IP address of primary mail server." +} + +variable "server_id" { + description = "Unique server ID that will trigger this module, if changed." +} + +resource "tls_private_key" "tls_mail" { + algorithm = "RSA" +} + +resource "acme_registration" "tls_mail" { + account_key_pem = "${tls_private_key.tls_mail.private_key_pem}" + email_address = "jakob@odersky.com" +} + +resource "acme_certificate" "tls_mail" { + account_key_pem = "${acme_registration.tls_mail.account_key_pem}" + common_name = "mail.${var.domain}" + + dns_challenge { + provider = "cloudflare" + + config { + CLOUDFLARE_EMAIL = "jakob@odersky.com" + CLOUDFLARE_API_KEY = "${var.secret_cloudflare_token}" + } + } +} + +resource "hcloud_rdns" "rdns4" { + server_id = "${var.server_id}" + ip_address = "${var.server_ipv4}" + dns_ptr = "mail.${var.domain}" +} + +resource "hcloud_rdns" "rdns6" { + server_id = "${var.server_id}" + ip_address = "${var.server_ipv6}" + dns_ptr = "mail.${var.domain}" +} + +resource "cloudflare_record" "record_a" { + type = "A" + domain = "${var.domain}" + name = "mail" + value = "${var.server_ipv4}" +} + +resource "cloudflare_record" "record_aaaa" { + type = "AAAA" + domain = "${var.domain}" + name = "mail" + value = "${var.server_ipv6}" +} + +resource "cloudflare_record" "record_mx" { + type = "MX" + domain = "${var.domain}" + name = "@" + value = "mail.${var.domain}" +} + +resource "cloudflare_record" "record_spf" { + type = "TXT" + domain = "${var.domain}" + name = "@" + value = "v=spf1 a mx -all" +} + +resource "cloudflare_record" "record_dmarc" { + type = "TXT" + domain = "${var.domain}" + name = "_dmarc" + value = "v=DMARC1; p=quarantine; rua=mailto:postmaster@${var.domain}" +} + +resource "tls_private_key" "dkim" { + algorithm = "RSA" +} + +resource "cloudflare_record" "record_dkim_txt" { + type = "TXT" + domain = "${var.domain}" + name = "mail._domainkey" + value = "v=DKIM1; k=rsa; p=${replace("${tls_private_key.dkim.public_key_pem}","/-----BEGIN PUBLIC KEY-----|-----END PUBLIC KEY-----|\n/","")};" +} + +resource "null_resource" "config" { + triggers { + server_id = "${var.server_id}" + domain = "${var.domain}" + dkim_private_key = "${tls_private_key.dkim.private_key_pem}" + mail_key = "${acme_certificate.tls_mail.private_key_pem}" + mail_cert = "${acme_certificate.tls_mail.certificate_pem}" + } + + connection { + host = "${var.server_ipv4}" + } + + provisioner "remote-exec" { + inline = ["DEBIAN_FRONTEND=noninteractive apt-get install --yes postfix opendkim bsd-mailx dovecot-core dovecot-imapd"] + } + + provisioner "file" { + content = "${acme_certificate.tls_mail.private_key_pem}" + destination = "/etc/ssl/private/mail.key.pem" + } + + provisioner "file" { + content = "${acme_certificate.tls_mail.certificate_pem}" + destination = "/etc/ssl/mail.cert.pem" + } + + provisioner "file" { + content = "${var.domain}\n" + destination = "/etc/mailname" + } + + provisioner "file" { + source = "${path.module}/postfix-master.cf" + destination = "/etc/postfix/master.cf" + } + + provisioner "file" { + content = < + + + + + + + + + image/svg+xml + + + + + + + + + + + + diff --git a/terraform/provision/rootfs/usr/local/share/www/index.html b/terraform/provision/rootfs/usr/local/share/www/index.html new file mode 100644 index 0000000..57d2c0c --- /dev/null +++ b/terraform/provision/rootfs/usr/local/share/www/index.html @@ -0,0 +1,21 @@ + + + crashbox + + + +
+ dl + git + ip +
+ + -- cgit v1.2.3