aboutsummaryrefslogblamecommitdiff
path: root/nix/tofu/dns.nix
blob: df0ed652c9761cac9092561667c283aa08539ca7 (plain) (tree)









































































































































                                                                                                  
{
  pkgs,
}:
let
  zoneId = "6878e48b5cb81c7d789040632153719d";
  zoneName = "fcuny.net";

  # Helper function to create DNS records with common fields
  mkRecord =
    type: name: content: extra:
    {
      inherit name type;
      zone_id = zoneId;
      ttl = 1;
      proxied = false;
      content = content;
    }
    // extra;

  # Helper for A records (typically proxied)
  mkARecord = name: ip: mkRecord "A" name ip { proxied = true; };

  # Helper for CNAME records
  mkCNAME = name: target: mkRecord "CNAME" name target { };

  # Helper for MX records
  mkMXRecord =
    priority: target:
    mkRecord "MX" zoneName target {
      inherit priority;
    };

  # Helper for SRV records with data block
  mkSRVRecord = name: port: target: weight: priority: {
    inherit name;
    type = "SRV";
    zone_id = zoneId;
    ttl = 1;
    proxied = false;
    priority = priority;
    data = {
      inherit
        port
        target
        weight
        priority
        ;
    };
  };

  # Helper for TXT records
  mkTXTRecord = name: content: mkRecord "TXT" name content { };

in
pkgs.writeTextFile {
  name = "cloudflare-dns.tf.json";
  text = builtins.toJSON ([
    {
      terraform = {
        required_providers = {
          cloudflare = {
            source = "cloudflare/cloudflare";
            version = "~> 4.0";
          };
        };
        backend = {
          gcs = {
            bucket = "fcuny-infra-tofu-state";
            prefix = "cloudflare-dns";
          };
        };
      };
    }
    {
      provider = {
        cloudflare = [ { } ];
      };
    }
    {
      # Use data source for existing zone instead of managing it
      data = {
        cloudflare_zone = {
          "main" = {
            name = zoneName;
          };
        };
      };
    }
    {
      resource = {
        cloudflare_record = {
          # A records for root domain
          "cname_root_0" = mkARecord zoneName "185.199.108.153";
          "cname_root_1" = mkARecord zoneName "185.199.110.153";
          "cname_root_2" = mkARecord zoneName "185.199.109.153";
          "cname_root_3" = mkARecord zoneName "185.199.111.153";

          # DKIM CNAME records
          "cname_dkim_0" = mkCNAME "fm1._domainkey" "fm1.fcuny.net.dkim.fmhosted.com" // {
            ttl = 60;
          };
          "cname_dkim_1" = mkCNAME "fm2._domainkey" "fm2.fcuny.net.dkim.fmhosted.com" // {
            ttl = 60;
          };
          "cname_dkim_2" = mkCNAME "fm3._domainkey" "fm3.fcuny.net.dkim.fmhosted.com" // {
            ttl = 60;
          };

          # Git subdomain via Cloudflare tunnel
          "cname_git" = mkCNAME "git" "b5d5071d-3c09-4379-9d6c-0684c478f151.cfargotunnel.com" // {
            proxied = true;
          };

          # MX records
          "mx_0" = mkMXRecord 10 "in1-smtp.messagingengine.com";
          "mx_1" = mkMXRecord 20 "in2-smtp.messagingengine.com";

          # SPF TXT record
          "txt_spf" = mkTXTRecord zoneName "v=spf1 include:spf.messagingengine.com ?all";
        };
      };
    }
    {
      resource = {
        cloudflare_record = {
          # SRV records for email services
          "srv_caldavs" = mkSRVRecord "_caldavs._tcp" 443 "caldav.fastmail.com" 1 0;
          "srv_caldav" = mkSRVRecord "_caldav._tcp" 0 "." 0 0;
          "srv_carddavs" = mkSRVRecord "_carddavs._tcp" 443 "carddav.fastmail.com" 1 0;
          "srv_carddav" = mkSRVRecord "_carddav._tcp" 0 "." 0 0;
          "srv_imaps" = mkSRVRecord "_imaps._tcp" 993 "imap.fastmail.com" 1 0;
          "srv_imap" = mkSRVRecord "_imap._tcp" 0 "." 0 0;
          "srv_smtp" = mkSRVRecord "_submission._tcp" 587 "smtp.fastmail.com" 1 0;
        };
      };
    }
  ]);
}