dns update with moving providers

This commit is contained in:
Graham McIntire 2025-12-16 13:44:58 -06:00
parent 6afa79fe7f
commit 7e4e2250bb
No known key found for this signature in database
20 changed files with 1979 additions and 1751 deletions

2
.gitignore vendored
View file

@ -1,6 +1,6 @@
# Terraform directories
**/.terraform/
**/terraform/
#**/terraform/
# Terraform state files
**/terraform.tfstate

View file

@ -1,184 +0,0 @@
#cloud-config
# Users
users:
- name: graham
groups: [wheel, adm]
shell: /bin/bash
sudo: ALL=(ALL) NOPASSWD:ALL
ssh_authorized_keys:
- ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIGthwaOgNUPMl1P3yXLBdKYXXvxUvlm4/BShLOm9hqRO
- ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIHLyVSEEAEbGZZqwPwEup0XrlTpu3x3iF9ExvvQPA4xN graham@mcintire.me
- name: ansible
uid: 10001
groups: [wheel, adm]
shell: /bin/bash
sudo: ALL=(ALL) NOPASSWD:ALL
ssh_authorized_keys:
- ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIGthwaOgNUPMl1P3yXLBdKYXXvxUvlm4/BShLOm9hqRO
- ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIHLyVSEEAEbGZZqwPwEup0XrlTpu3x3iF9ExvvQPA4xN graham@mcintire.me
# Package management
package_update: true
package_upgrade: true
packages:
- curl
- wget
- bash
- sudo
- python3
- py3-pip
- openrc
- iptables
# Write files
write_files:
# Caddy binary installation script
- path: /usr/local/bin/install-caddy.sh
permissions: '0755'
content: |
#!/bin/bash
set -e
echo "Installing Caddy..."
# Download and install Caddy
curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/setup.alpine.sh' | bash
apk add caddy
# Create caddy user and directories
adduser -D -s /sbin/nologin caddy || true
mkdir -p /etc/caddy /var/log/caddy /var/lib/caddy
chown -R caddy:caddy /etc/caddy /var/log/caddy /var/lib/caddy
chmod 755 /etc/caddy
# Tailscale installation script
- path: /usr/local/bin/install-tailscale.sh
permissions: '0755'
content: |
#!/bin/bash
set -e
echo "Installing Tailscale..."
# Download and install Tailscale
curl -fsSL https://tailscale.com/install.sh | sh
# Enable IP forwarding
echo 'net.ipv4.ip_forward = 1' >> /etc/sysctl.conf
echo 'net.ipv6.conf.all.forwarding = 1' >> /etc/sysctl.conf
sysctl -p
# Caddy configuration file
- path: /etc/caddy/Caddyfile
permissions: '0644'
owner: caddy:caddy
content: |
# Default catch-all for unconfigured domains
:80 {
respond "Service temporarily unavailable - Tailscale backend not configured" 503
}
# Example configuration for blog.w5isp.com
# This will need to be updated once you have the actual Tailscale IPs
blog.w5isp.com {
# Replace with actual Tailscale IP when available
# reverse_proxy 100.64.x.x:port
respond "Backend not configured yet" 503
}
# Add more domains here as needed:
example.w5isp.com {
reverse_proxy 100.64.x.x:port
}
# Caddy OpenRC service file
- path: /etc/init.d/caddy
permissions: '0755'
content: |
#!/sbin/openrc-run
name="Caddy web server"
description="Fast, multi-platform web server with automatic HTTPS"
command="/usr/bin/caddy"
command_args="run --config /etc/caddy/Caddyfile --adapter caddyfile"
command_user="caddy:caddy"
command_background="yes"
pidfile="/run/caddy.pid"
start_stop_daemon_args="--stdout /var/log/caddy/access.log --stderr /var/log/caddy/error.log"
depend() {
need net
after firewall
}
# Tailscale startup script
- path: /usr/local/bin/tailscale-setup.sh
permissions: '0755'
content: |
#!/bin/bash
set -e
# Wait for tailscaled to be ready
sleep 5
# Get auth key from environment or metadata
AUTH_KEY="${TAILSCALE_AUTH_KEY}"
if [ -z "$AUTH_KEY" ]; then
echo "No Tailscale auth key found, skipping authentication"
exit 0
fi
echo "Authenticating with Tailscale..."
tailscale up --authkey="$AUTH_KEY" --accept-routes
echo "Tailscale setup complete"
tailscale status
# Environment file for services
- path: /etc/environment
permissions: '0644'
content: |
PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
# Run commands during cloud-init
runcmd:
# Update package cache
- apk update
# Install Caddy
- /usr/local/bin/install-caddy.sh
# Install Tailscale
- /usr/local/bin/install-tailscale.sh
# Configure firewall (basic Alpine firewall)
- iptables -I INPUT -p tcp --dport 22 -j ACCEPT
- iptables -I INPUT -p tcp --dport 80 -j ACCEPT
- iptables -I INPUT -p tcp --dport 443 -j ACCEPT
- iptables -I INPUT -i lo -j ACCEPT
- iptables -I INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
- rc-service iptables save
# Enable and start services
- rc-update add caddy default
- rc-service caddy start
# Start tailscaled
- rc-service tailscale start
- rc-update add tailscale default
# Set up Tailscale (this will need the auth key passed via user-data or metadata)
- sleep 10
- /usr/local/bin/tailscale-setup.sh || true
# Final message
final_message: |
Cloud-init setup complete!
- Caddy web server installed and running
- Tailscale VPN installed (needs auth key for setup)
- Users: graham, ansible (both with sudo access)
- Services managed via OpenRC
To complete Tailscale setup, run:
tailscale up --authkey=YOUR_AUTH_KEY --accept-routes

View file

@ -0,0 +1,39 @@
# DNS configuration for aprs.me domain
# Points to Traefik ingress on k3s cluster for APRS application
resource "powerdns_record" "aprs_me_soa" {
depends_on = [powerdns_zone.aprs_me]
zone = "aprs.me."
name = "aprs.me."
type = "SOA"
ttl = 3600
records = ["ns1.as393837.net. graham.mcintire.me. 0 10800 3600 604800 3600"]
}
resource "powerdns_record" "aprs_me_root" {
depends_on = [powerdns_zone.aprs_me]
zone = "aprs.me."
name = "aprs.me."
type = "A"
ttl = 3600
records = ["204.110.191.2"] # Traefik ingress on k3s cluster
}
resource "powerdns_record" "aprs_me_www" {
depends_on = [powerdns_zone.aprs_me]
zone = "aprs.me."
name = "www.aprs.me."
type = "A"
ttl = 3600
records = ["204.110.191.2"] # Traefik ingress on k3s cluster
}
# CAA record for Let's Encrypt SSL certificates
resource "powerdns_record" "aprs_me_caa" {
depends_on = [powerdns_zone.aprs_me]
zone = "aprs.me."
name = "aprs.me."
type = "CAA"
ttl = 3600
records = ["0 issue \"letsencrypt.org\""]
}

View file

@ -1,3 +0,0 @@
resource "dnsimple_domain" "w5isp_com" {
name = "w5isp.com"
}

View file

@ -1,6 +1,3 @@
resource "dnsimple_zone" "w5isp_com" {
name = "w5isp.com"
}
resource "dnsimple_zone" "gridmap_org" {
name = "gridmap.org"

View file

@ -1,89 +1,79 @@
resource "porkbun_dns_record" "manero_root_a_1" {
domain = "manero.org"
name = ""
content = "185.199.108.153"
resource "dnsimple_zone_record" "manero_root_a_1" {
zone_name = "manero.org"
name = "@"
value = "185.199.108.153"
type = "A"
ttl = 3600
priority = 0
}
resource "porkbun_dns_record" "manero_root_a_2" {
domain = "manero.org"
name = ""
content = "185.199.109.153"
resource "dnsimple_zone_record" "manero_root_a_2" {
zone_name = "manero.org"
name = "@"
value = "185.199.109.153"
type = "A"
ttl = 3600
priority = 0
}
resource "porkbun_dns_record" "manero_root_a_3" {
domain = "manero.org"
name = ""
content = "185.199.110.153"
resource "dnsimple_zone_record" "manero_root_a_3" {
zone_name = "manero.org"
name = "@"
value = "185.199.110.153"
type = "A"
ttl = 3600
priority = 0
}
resource "porkbun_dns_record" "manero_root_a_4" {
domain = "manero.org"
name = ""
content = "185.199.111.153"
resource "dnsimple_zone_record" "manero_root_a_4" {
zone_name = "manero.org"
name = "@"
value = "185.199.111.153"
type = "A"
ttl = 3600
priority = 0
}
resource "porkbun_dns_record" "manero_irc_a" {
domain = "manero.org"
resource "dnsimple_zone_record" "manero_irc_a" {
zone_name = "manero.org"
name = "irc"
content = "149.28.242.178"
value = "149.28.242.178"
type = "A"
ttl = 3600
priority = 0
}
resource "porkbun_dns_record" "manero_us_a" {
domain = "manero.org"
resource "dnsimple_zone_record" "manero_us_a" {
zone_name = "manero.org"
name = "us"
content = "149.28.242.178"
value = "149.28.242.178"
type = "A"
ttl = 3600
priority = 0
}
resource "porkbun_dns_record" "manero_us_aaaa" {
domain = "manero.org"
resource "dnsimple_zone_record" "manero_us_aaaa" {
zone_name = "manero.org"
name = "us"
content = "2001:19f0:6401:19e6:5400:5ff:fe45:5701"
value = "2001:19f0:6401:19e6:5400:5ff:fe45:5701"
type = "AAAA"
ttl = 3600
priority = 0
}
resource "porkbun_dns_record" "manero_ca_a" {
domain = "manero.org"
resource "dnsimple_zone_record" "manero_ca_a" {
zone_name = "manero.org"
name = "ca"
content = "167.114.209.151"
value = "167.114.209.151"
type = "A"
ttl = 3600
priority = 0
}
resource "porkbun_dns_record" "manero_tankfox_a" {
domain = "manero.org"
resource "dnsimple_zone_record" "manero_tankfox_a" {
zone_name = "manero.org"
name = "tankfox"
content = "137.184.202.89"
value = "137.184.202.89"
type = "A"
ttl = 3600
priority = 0
}
resource "porkbun_dns_record" "manero_404" {
domain = "manero.org"
resource "dnsimple_zone_record" "manero_404" {
zone_name = "manero.org"
name = "404"
content = "404.al"
value = "404.al"
type = "CNAME"
ttl = 3600
priority = 0
}

View file

@ -1,118 +1,136 @@
# DNS configuration for mcintire.me domain
# Mail records point to Mailcow on mail.w5isp.com
# Mailcow MX record
resource "dnsimple_zone_record" "mcintire_mx_mailcow" {
zone_name = "mcintire.me"
name = ""
priority = 10
value = "mail.w5isp.com"
type = "MX"
resource "powerdns_record" "mcintire_soa" {
depends_on = [powerdns_zone.mcintire_me]
zone = "mcintire.me."
name = "mcintire.me."
type = "SOA"
ttl = 3600
records = ["ns1.as393837.net. graham.mcintire.me. 0 10800 3600 604800 3600"]
}
resource "dnsimple_zone_record" "mcintire_mx_backup" {
zone_name = "mcintire.me"
name = ""
priority = 20
value = "mail.nsnw.ca"
# Mailcow MX records
resource "powerdns_record" "mcintire_mx_mailcow" {
depends_on = [powerdns_zone.mcintire_me]
zone = "mcintire.me."
name = "mcintire.me."
type = "MX"
ttl = 3600
records = ["10 mail.w5isp.com."]
}
resource "powerdns_record" "mcintire_mx_backup" {
depends_on = [powerdns_zone.mcintire_me]
zone = "mcintire.me."
name = "mcintire.me."
type = "MX"
ttl = 3600
records = ["20 mail.nsnw.ca."]
}
resource "dnsimple_zone_record" "mcintire_cname_test" {
zone_name = "mcintire.me"
name = "*.test"
value = "cname.bookappt.link."
resource "powerdns_record" "mcintire_cname_test" {
depends_on = [powerdns_zone.mcintire_me]
zone = "mcintire.me."
name = "*.test.mcintire.me."
type = "CNAME"
ttl = 14400
records = ["cname.bookappt.link."]
}
# Mail server
resource "dnsimple_zone_record" "mcintire_mail" {
zone_name = "mcintire.me"
name = "mail"
value = "204.110.191.5"
resource "powerdns_record" "mcintire_mail" {
depends_on = [powerdns_zone.mcintire_me]
zone = "mcintire.me."
name = "mail.mcintire.me."
type = "A"
ttl = 3600
records = ["204.110.191.5"]
}
# Autodiscover for mail clients (CNAME to mail server)
resource "dnsimple_zone_record" "mcintire_autodiscover" {
zone_name = "mcintire.me"
name = "autodiscover"
value = "mail.w5isp.com"
# Autodiscover for mail clients
resource "powerdns_record" "mcintire_autodiscover" {
depends_on = [powerdns_zone.mcintire_me]
zone = "mcintire.me."
name = "autodiscover.mcintire.me."
type = "CNAME"
ttl = 3600
records = ["mail.w5isp.com."]
}
# Autodiscover SRV record
resource "dnsimple_zone_record" "mcintire_autodiscover_srv" {
zone_name = "mcintire.me"
name = "_autodiscover._tcp"
value = "0 443 mail.w5isp.com"
resource "powerdns_record" "mcintire_autodiscover_srv" {
depends_on = [powerdns_zone.mcintire_me]
zone = "mcintire.me."
name = "_autodiscover._tcp.mcintire.me."
type = "SRV"
priority = 0
ttl = 3600
records = ["0 0 443 mail.w5isp.com."]
}
# Autoconfig for mail clients
resource "dnsimple_zone_record" "mcintire_autoconfig" {
zone_name = "mcintire.me"
name = "autoconfig"
value = "mail.w5isp.com"
resource "powerdns_record" "mcintire_autoconfig" {
depends_on = [powerdns_zone.mcintire_me]
zone = "mcintire.me."
name = "autoconfig.mcintire.me."
type = "CNAME"
ttl = 3600
records = ["mail.w5isp.com."]
}
# SPF record for Mailcow
resource "dnsimple_zone_record" "mcintire_spf_mailcow" {
zone_name = "mcintire.me"
name = ""
value = "\"v=spf1 mx a ip4:204.110.191.5 ~all\""
resource "powerdns_record" "mcintire_spf_mailcow" {
depends_on = [powerdns_zone.mcintire_me]
zone = "mcintire.me."
name = "mcintire.me."
type = "TXT"
ttl = 3600
records = ["\"v=spf1 mx a ip4:204.110.191.5 ~all\""]
}
# DMARC record for Mailcow
resource "dnsimple_zone_record" "mcintire_dmarc_mailcow" {
zone_name = "mcintire.me"
name = "_dmarc"
value = "\"v=DMARC1; p=quarantine; rua=mailto:postmaster@mcintire.me; ruf=mailto:postmaster@mcintire.me; fo=1\""
resource "powerdns_record" "mcintire_dmarc_mailcow" {
depends_on = [powerdns_zone.mcintire_me]
zone = "mcintire.me."
name = "_dmarc.mcintire.me."
type = "TXT"
ttl = 3600
records = ["\"v=DMARC1; p=quarantine; rua=mailto:postmaster@mcintire.me; ruf=mailto:postmaster@mcintire.me; fo=1\""]
}
# DKIM record from Mailcow
resource "dnsimple_zone_record" "mcintire_dkim_mailcow" {
zone_name = "mcintire.me"
name = "dkim._domainkey"
value = "v=DKIM1;k=rsa;t=s;s=email;p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0rQie7Hz5AmDbVUX+rKNgp6Hf7crtWyfy6qKbqnrxmmernz1rQ6HyOrHhFAlc8nVLNKr8XP2DOROb1jAnrjndZo9I/ymbrrrCBsi9w6zAht2BheijO/R9k5CDRjeSafm6bg0oMKihtNMIdXvEj9ND8hDpZZKxtOrKFH7zLm4CPmm7jf0gqZH2yK+AA3OYUGSYa1OT0LtdMXadk0IVOI2VYf37Hzb3RUvGOYMVkT0xi+23DiyFk7AyCiyv3LQVBMT+/bwyd4k3yVVn2cr9+Nor+HXVjqASLtqcFLMf1SuX0ezSAjBG7BbqQr5G6Jz+n5YglqEIUKVYzJFE7JdDmqQYQIDAQAB"
resource "powerdns_record" "mcintire_dkim_mailcow" {
depends_on = [powerdns_zone.mcintire_me]
zone = "mcintire.me."
name = "dkim._domainkey.mcintire.me."
type = "TXT"
ttl = 3600
records = ["\"v=DKIM1;k=rsa;t=s;s=email;p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0rQie7Hz5AmDbVUX+rKNgp6Hf7crtWyfy6qKbqnrxmmernz1rQ6HyOrHhFAlc8nVLNKr8XP2DOROb1jAnrjndZo9I/ymbrrrCBsi9w6zAht2BheijO/R9k5CDRjeSafm6bg0oMKihtNMIdXvEj9ND8hDpZZKxtOrKFH7zLm4CPmm7jf0gqZH2yK+AA3OYUGSYa1OT0LtdMXadk0IVOI2VYf37Hzb3RUvGOYMVkT0xi+23DiyFk7AyCiyv3LQVBMT+/bwyd4k3yVVn2cr9+Nor+HXVjqASLtqcFLMf1SuX0ezSAjBG7BbqQr5G6Jz+n5YglqEIUKVYzJFE7JdDmqQYQIDAQAB\""]
}
resource "dnsimple_zone_record" "mcintire_photos" {
zone_name = "mcintire.me"
name = "photos"
value = "204.110.191.8"
resource "powerdns_record" "mcintire_photos" {
depends_on = [powerdns_zone.mcintire_me]
zone = "mcintire.me."
name = "photos.mcintire.me."
type = "A"
ttl = 3600
records = ["204.110.191.8"]
}
resource "dnsimple_zone_record" "mcintire_headscale" {
zone_name = "mcintire.me"
name = "headscale"
value = "66.206.18.166"
resource "powerdns_record" "mcintire_headscale" {
depends_on = [powerdns_zone.mcintire_me]
zone = "mcintire.me."
name = "headscale.mcintire.me."
type = "A"
ttl = 3600
records = ["66.206.18.166"]
}
resource "dnsimple_zone_record" "mcintire_hs" {
zone_name = "mcintire.me"
name = "hs"
value = "66.206.18.166"
resource "powerdns_record" "mcintire_hs" {
depends_on = [powerdns_zone.mcintire_me]
zone = "mcintire.me."
name = "hs.mcintire.me."
type = "A"
ttl = 3600
records = ["66.206.18.166"]
}

View file

@ -0,0 +1,118 @@
# DNS configuration for mcintire.me domain (DNSimple)
# Mail records point to Mailcow on mail.w5isp.com
# Note: DNSimple manages SOA automatically, no need to define it
# Mailcow MX records
resource "dnsimple_zone_record" "mcintire_mx_mailcow" {
zone_name = "mcintire.me"
name = ""
value = "mail.w5isp.com."
type = "MX"
ttl = 3600
priority = 10
}
resource "dnsimple_zone_record" "mcintire_mx_backup" {
zone_name = "mcintire.me"
name = ""
value = "mail.nsnw.ca."
type = "MX"
ttl = 3600
priority = 20
}
resource "dnsimple_zone_record" "mcintire_cname_test" {
zone_name = "mcintire.me"
name = "*.test"
value = "cname.bookappt.link."
type = "CNAME"
ttl = 14400
}
# Mail server
resource "dnsimple_zone_record" "mcintire_mail" {
zone_name = "mcintire.me"
name = "mail"
value = "204.110.191.5"
type = "A"
ttl = 3600
}
# Autodiscover for mail clients
resource "dnsimple_zone_record" "mcintire_autodiscover" {
zone_name = "mcintire.me"
name = "autodiscover"
value = "mail.w5isp.com."
type = "CNAME"
ttl = 3600
}
# Autodiscover SRV record
resource "dnsimple_zone_record" "mcintire_autodiscover_srv" {
zone_name = "mcintire.me"
name = "_autodiscover._tcp"
value = "0 0 443 mail.w5isp.com."
type = "SRV"
ttl = 3600
}
# Autoconfig for mail clients
resource "dnsimple_zone_record" "mcintire_autoconfig" {
zone_name = "mcintire.me"
name = "autoconfig"
value = "mail.w5isp.com."
type = "CNAME"
ttl = 3600
}
# SPF record for Mailcow
resource "dnsimple_zone_record" "mcintire_spf_mailcow" {
zone_name = "mcintire.me"
name = ""
value = "v=spf1 mx a ip4:204.110.191.5 ~all"
type = "TXT"
ttl = 3600
}
# DMARC record for Mailcow
resource "dnsimple_zone_record" "mcintire_dmarc_mailcow" {
zone_name = "mcintire.me"
name = "_dmarc"
value = "v=DMARC1; p=quarantine; rua=mailto:postmaster@mcintire.me; ruf=mailto:postmaster@mcintire.me; fo=1"
type = "TXT"
ttl = 3600
}
# DKIM record from Mailcow
resource "dnsimple_zone_record" "mcintire_dkim_mailcow" {
zone_name = "mcintire.me"
name = "dkim._domainkey"
value = "v=DKIM1;k=rsa;t=s;s=email;p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0rQie7Hz5AmDbVUX+rKNgp6Hf7crtWyfy6qKbqnrxmmernz1rQ6HyOrHhFAlc8nVLNKr8XP2DOROb1jAnrjndZo9I/ymbrrrCBsi9w6zAht2BheijO/R9k5CDRjeSafm6bg0oMKihtNMIdXvEj9ND8hDpZZKxtOrKFH7zLm4CPmm7jf0gqZH2yK+AA3OYUGSYa1OT0LtdMXadk0IVOI2VYf37Hzb3RUvGOYMVkT0xi+23DiyFk7AyCiyv3LQVBMT+/bwyd4k3yVVn2cr9+Nor+HXVjqASLtqcFLMf1SuX0ezSAjBG7BbqQr5G6Jz+n5YglqEIUKVYzJFE7JdDmqQYQIDAQAB"
type = "TXT"
ttl = 3600
}
resource "dnsimple_zone_record" "mcintire_photos" {
zone_name = "mcintire.me"
name = "photos"
value = "204.110.191.8"
type = "A"
ttl = 3600
}
resource "dnsimple_zone_record" "mcintire_headscale" {
zone_name = "mcintire.me"
name = "headscale"
value = "66.206.18.166"
type = "A"
ttl = 3600
}
resource "dnsimple_zone_record" "mcintire_hs" {
zone_name = "mcintire.me"
name = "hs"
value = "66.206.18.166"
type = "A"
ttl = 3600
}

View file

@ -0,0 +1,52 @@
# Vultr PowerDNS Zones
# All zones managed on the Vultr PowerDNS instance
resource "powerdns_zone" "w5isp" {
name = "w5isp.com."
kind = "Native"
soa_edit_api = "DEFAULT"
nameservers = ["ns1.as393837.net.", "ns-global.kjsl.com."]
}
resource "powerdns_zone" "aprs_me" {
name = "aprs.me."
kind = "Native"
soa_edit_api = "DEFAULT"
nameservers = ["ns1.as393837.net.", "ns-global.kjsl.com."]
}
resource "powerdns_zone" "mcintire_me" {
name = "mcintire.me."
kind = "Native"
soa_edit_api = "DEFAULT"
nameservers = ["ns1.as393837.net.", "ns-global.kjsl.com."]
}
# Reverse DNS zones
resource "powerdns_zone" "vntx1" {
name = "188.110.204.in-addr.arpa."
kind = "Native"
soa_edit_api = "DEFAULT"
nameservers = ["ns1.as393837.net.", "ns-global.kjsl.com."]
}
resource "powerdns_zone" "vntx2" {
name = "189.110.204.in-addr.arpa."
kind = "Native"
soa_edit_api = "DEFAULT"
nameservers = ["ns1.as393837.net.", "ns-global.kjsl.com."]
}
resource "powerdns_zone" "vntx3" {
name = "190.110.204.in-addr.arpa."
kind = "Native"
soa_edit_api = "DEFAULT"
nameservers = ["ns1.as393837.net.", "ns-global.kjsl.com."]
}
resource "powerdns_zone" "vntx4" {
name = "191.110.204.in-addr.arpa."
kind = "Native"
soa_edit_api = "DEFAULT"
nameservers = ["ns1.as393837.net.", "ns-global.kjsl.com."]
}

View file

@ -1,32 +1,44 @@
resource "powerdns_zone" "vntx1" {
# Reverse DNS zones are defined in dns_powerdns_zones.tf
# SOA records for reverse zones
resource "powerdns_record" "vntx1_soa" {
depends_on = [powerdns_zone.vntx1]
zone = "188.110.204.in-addr.arpa."
name = "188.110.204.in-addr.arpa."
kind = "Native"
soa_edit_api = "DEFAULT"
nameservers = ["ns1.vntx.net.", "ns2.vntx.net.", "ns-global.kjsl.com."]
type = "SOA"
ttl = 3600
records = ["ns1.as393837.net. graham.mcintire.me. 0 10800 3600 604800 3600"]
}
resource "powerdns_zone" "vntx2" {
resource "powerdns_record" "vntx2_soa" {
depends_on = [powerdns_zone.vntx2]
zone = "189.110.204.in-addr.arpa."
name = "189.110.204.in-addr.arpa."
kind = "Native"
soa_edit_api = "DEFAULT"
nameservers = ["ns1.vntx.net.", "ns2.vntx.net.", "ns-global.kjsl.com."]
type = "SOA"
ttl = 3600
records = ["ns1.as393837.net. graham.mcintire.me. 0 10800 3600 604800 3600"]
}
resource "powerdns_zone" "vntx3" {
resource "powerdns_record" "vntx3_soa" {
depends_on = [powerdns_zone.vntx3]
zone = "190.110.204.in-addr.arpa."
name = "190.110.204.in-addr.arpa."
kind = "Native"
soa_edit_api = "DEFAULT"
nameservers = ["ns1.vntx.net.", "ns2.vntx.net.", "ns-global.kjsl.com."]
type = "SOA"
ttl = 3600
records = ["ns1.as393837.net. graham.mcintire.me. 0 10800 3600 604800 3600"]
}
resource "powerdns_zone" "vntx4" {
resource "powerdns_record" "vntx4_soa" {
depends_on = [powerdns_zone.vntx4]
zone = "191.110.204.in-addr.arpa."
name = "191.110.204.in-addr.arpa."
kind = "Native"
soa_edit_api = "DEFAULT"
nameservers = ["ns1.vntx.net.", "ns2.vntx.net.", "ns-global.kjsl.com."]
type = "SOA"
ttl = 3600
records = ["ns1.as393837.net. graham.mcintire.me. 0 10800 3600 604800 3600"]
}
resource "powerdns_record" "ptr_records1" {
depends_on = [powerdns_zone.vntx1]
for_each = {
for i in range(256) : tostring(i) => {
name = "${i}.188.110.204.in-addr.arpa."
@ -42,6 +54,7 @@ resource "powerdns_record" "ptr_records1" {
}
resource "powerdns_record" "ptr_records2" {
depends_on = [powerdns_zone.vntx2]
for_each = {
for i in range(256) : tostring(i) => {
name = "${i}.189.110.204.in-addr.arpa."
@ -57,6 +70,7 @@ resource "powerdns_record" "ptr_records2" {
}
resource "powerdns_record" "ptr_records3" {
depends_on = [powerdns_zone.vntx3]
for_each = {
for i in range(256) : tostring(i) => {
name = "${i}.190.110.204.in-addr.arpa."
@ -72,6 +86,7 @@ resource "powerdns_record" "ptr_records3" {
}
resource "powerdns_record" "ptr_records4" {
depends_on = [powerdns_zone.vntx4]
for_each = {
for i in range(256) : tostring(i) => {
name = "${i}.191.110.204.in-addr.arpa."

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,85 @@
# TEMPORARY FILE - vntx.net Porkbun configuration
# Forward records for reverse DNS zones removed (*.client A records)
# Contains TXT and CNAME records only
resource "porkbun_dns_record" "vntx_txt_records" {
for_each = {
"_twilio" = "twilio-domain-verification=12bf63d61b86412618bdb4ab6c2b287a"
"_dmarc" = "v=DMARC1; p=none"
"_updown" = "updown-page=p/34yuc"
"_github-challenge-vntx" = "34ea2705e4"
"_github-pages-challenge-gmcintire" = "d125f4244edd0120ee0fa073d3acf1"
"krs._domainkey.mg" = "k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDHbWtJ5uPGEOPmJrT36WBXKxVL0b4fqjIM4n6oXK4zaUucqYp7jeoKG+FTO5XEjyja7hsP9WahntUrVb8WI5V6Cj0CznesMrM7oQRntcyuy8mSD1zilmZe4q2Kc65gj2MRrkg3tkJfogXHNz2rxmquNu/DxsFLeQP8a2E5tYXVFwIDAQAB"
"mandrill._domainkey" = "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCrLHiExVd55zd/IQ/J/mRwSRMAocV/hMB3jXwaHH36d9NaVynQFYV8NaWi69c1veUtRzGt7yAioXqLj7Z4TeEUoOLgrKsn8YnckGs9i3B3tVFB+Ch/4mPhXWiNfNdynHWBcPcbJ8kjEQ2U8y78dHZj1YeRXXVvWob2OaKynO8/lQIDAQAB;"
"mg" = "v=spf1 include:mailgun.org ~all"
"o365" = "v=spf1 include:spf.protection.outlook.com -all"
"spf" = "v=spf1 include:_spf.google.com include:spf.mandrillapp.com ~all"
"@" = "google-site-verification=RD-gYkKRPw1TSIzHRAuJljZ7Xee6uDGGkFvL6XmSjs0"
"detectify-verification" = "7c06e001f2f39c59564baabd497360e2"
"keybase-site-verification" = "xNV8FawC3MsGF70UNFKaKQUUOyQvjeL0DMK_RMQQ-_Q"
"MS" = "ms84271221"
"have-i-been-pwned-verification" = "beb9c178a27aaaaa007c4c84d64dccf5"
}
domain = "vntx.net"
name = each.key
content = each.value
type = "TXT"
ttl = 3600
priority = 0
}
# resource "porkbun_dns_record" "vntx_srv1" {
# domain = "vntx.net"
# name = "_sipfederationtls._tcp.o365"
# type = "SRV"
# priority = 100
# content = "5061 sipfed.online.lync.com."
# ttl = 3600
# }
# SRV("_sip._tls.o365", 100, 1, 443, "sipdir.online.lync.com.", TTL(3600)),
resource "porkbun_dns_record" "vntx_cname_records" {
for_each = {
"mte1._domainkey" = "dkim1.mandrillapp.com."
"mte2._domainkey" = "dkim2.mandrillapp.com."
"em924886" = "return.smtp2go.net."
"s924886._domainkey" = "dkim.smtp2go.net."
"link" = "track.smtp2go.net."
"_83337805c305955c6823504cc5e6ca29" = "_baf97cdcc7b6458fa5719e4261e9932f.sdgjtdhdhz.acm-validations.aws."
"activate" = "verona-networks-checkout.gaiia-consumer.com."
"portal" = "verona-networks-clientportal.gaiia-consumer.com."
"url9812" = "sendgrid.net."
"url62" = "sendgrid.net."
"177982" = "sendgrid.net."
"_4080c249b6e72dd04f2a9508aa1a1b7f.kivrak" = "_de3e5d511f3869bbd271b935a3b4f973.tljzshvwok.acm-validations.aws."
"4809fce066c3da4d14197c7276ba083f.irc" = "b58bf151af520d34d8fad99d05274cb536893031.comodoca.com."
"9p83fpanfdgs8xdgcnzd" = "verify.squarespace.com."
"autodiscover.o365" = "autodiscover.outlook.com."
"autodiscover" = "autodiscover.outlook.com."
"_bc1077259b1fbbb11c1e16756e1883f9.irc" = "793f217a963b25f361ec1975e0fd7d54.dc2ec86a36550aed25a0011c0b2b044b.62f7abe714ec1.comodoca.com."
"em9279" = "u177982.wl233.sendgrid.net."
"email.mg" = "mailgun.org."
"email" = "mandrillapp.com."
"enterpriseenrollment.o365" = "enterpriseenrollment.manage.microsoft.com."
"enterpriseregistration.o365" = "enterpriseregistration.windows.net."
"lyncdiscover.o365" = "webdir.online.lync.com."
"s1._domainkey" = "s1.domainkey.u177982.wl233.sendgrid.net."
"s2._domainkey" = "s2.domainkey.u177982.wl233.sendgrid.net."
"sip.o365" = "sipdir.online.lync.com."
"www" = "ext-cust.squarespace.com."
"uptime" = "page.updown.io."
"status" = "stats.uptimerobot.com."
"ntp" = "0.us.pool.ntp.org."
"iptrack" = "dokku.w5isp.com."
}
domain = "vntx.net"
name = each.key
content = each.value
type = "CNAME"
ttl = 3600
priority = 0
}

View file

@ -1,245 +1,253 @@
resource "porkbun_dns_record" "w5isp_root" {
domain = "w5isp.com"
name = ""
content = "204.110.191.5"
type = "A"
resource "powerdns_record" "w5isp_soa" {
depends_on = [powerdns_zone.w5isp]
zone = "w5isp.com."
name = "w5isp.com."
type = "SOA"
ttl = 3600
priority = 0
records = ["ns1.as393837.net. graham.mcintire.me. 0 10800 3600 604800 3600"]
}
resource "porkbun_dns_record" "w5isp_git" {
domain = "w5isp.com"
name = "git"
content = "66.206.18.163"
resource "powerdns_record" "w5isp_root" {
depends_on = [powerdns_zone.w5isp]
zone = "w5isp.com."
name = "w5isp.com."
type = "A"
ttl = 3600
priority = 0
records = ["204.110.191.5"]
}
resource "porkbun_dns_record" "w5isp_home" {
domain = "w5isp.com"
name = "home"
content = "204.110.191.1"
resource "powerdns_record" "w5isp_git" {
depends_on = [powerdns_zone.w5isp]
zone = "w5isp.com."
name = "git.w5isp.com."
type = "A"
ttl = 3600
priority = 0
records = ["66.206.18.163"]
}
resource "porkbun_dns_record" "w5isp_photos" {
domain = "w5isp.com"
name = "photos"
content = "204.110.191.8"
resource "powerdns_record" "w5isp_home" {
depends_on = [powerdns_zone.w5isp]
zone = "w5isp.com."
name = "home.w5isp.com."
type = "A"
ttl = 3600
priority = 0
records = ["204.110.191.1"]
}
resource "porkbun_dns_record" "w5isp_skippy" {
domain = "w5isp.com"
name = "skippy"
content = "204.110.191.8"
resource "powerdns_record" "w5isp_photos" {
depends_on = [powerdns_zone.w5isp]
zone = "w5isp.com."
name = "photos.w5isp.com."
type = "A"
ttl = 3600
priority = 0
records = ["204.110.191.8"]
}
resource "porkbun_dns_record" "w5isp_ha" {
domain = "w5isp.com"
name = "ha"
content = "q1l09qiycnaagngmjsg1qas0rhqcfoou.ui.nabu.casa"
resource "powerdns_record" "w5isp_skippy" {
depends_on = [powerdns_zone.w5isp]
zone = "w5isp.com."
name = "skippy.w5isp.com."
type = "A"
ttl = 3600
records = ["204.110.191.8"]
}
resource "powerdns_record" "w5isp_ha" {
depends_on = [powerdns_zone.w5isp]
zone = "w5isp.com."
name = "ha.w5isp.com."
type = "CNAME"
ttl = 3600
priority = 0
records = ["q1l09qiycnaagngmjsg1qas0rhqcfoou.ui.nabu.casa."]
}
resource "porkbun_dns_record" "w5isp_mx1" {
domain = "w5isp.com"
name = ""
priority = 10
content = "mail.w5isp.com"
resource "powerdns_record" "w5isp_mx1" {
depends_on = [powerdns_zone.w5isp]
zone = "w5isp.com."
name = "w5isp.com."
type = "MX"
ttl = 3600
records = ["10 mail.w5isp.com."]
}
resource "porkbun_dns_record" "w5isp_txt" {
domain = "w5isp.com"
name = ""
content = "v=spf1 mx a ip4:204.110.191.5 ~all"
resource "powerdns_record" "w5isp_txt" {
depends_on = [powerdns_zone.w5isp]
zone = "w5isp.com."
name = "w5isp.com."
type = "TXT"
ttl = 3600
priority = 0
records = ["\"v=spf1 mx a ip4:204.110.191.5 ~all\""]
}
# DKIM record
resource "porkbun_dns_record" "w5isp_dkim" {
domain = "w5isp.com"
name = "dkim._domainkey"
content = "v=DKIM1;k=rsa;t=s;s=email;p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAxti2t8TvzIqKF9BpKn3rQExKg3sS1SyQuwtQgL0r/ELEJ0D9cKU/iM+eB1ROJctKHoMqKDJoRCMP6eibFcgq2kLKqf+aceEOIBx2OK2WCXML+CNqQZA6yO+A8/Jq7iFZPq8D5FmOoxbwRZkso7CkSennSz/+F7nBPI/OfyEiiI4xJzWH3t8SaAkkcy46O+1K0iCkTpsthon7E2PHa3SPkrjbep/5NImTJLK5LuffiLJtLsiK+73mvsAYCDmrNxPTaDjXkj0TWdKl/d/TnlVJl+YloqWIDt/7LtZQM0C7GZ9flIr7z9hHpSWERXAA5Gj5NQ0/hcY3nF4dPoqWs3VeeQIDAQAB"
resource "powerdns_record" "w5isp_dkim" {
depends_on = [powerdns_zone.w5isp]
zone = "w5isp.com."
name = "dkim._domainkey.w5isp.com."
type = "TXT"
ttl = 3600
priority = 0
records = ["\"v=DKIM1;k=rsa;t=s;s=email;p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAxti2t8TvzIqKF9BpKn3rQExKg3sS1SyQuwtQgL0r/ELEJ0D9cKU/iM+eB1ROJctKHoMqKDJoRCMP6eibFcgq2kLKqf+aceEOIBx2OK2WCXML+CNqQZA6yO+A8/Jq7iFZPq8D5FmOoxbwRZkso7CkSennSz/+F7nBPI/OfyEiiI4xJzWH3t8SaAkkcy46O+1K0iCkTpsthon7E2PHa3SPkrjbep/5NImTJLK5LuffiLJtLsiK+73mvsAYCDmrNxPTaDjXkj0TWdKl/d/TnlVJl+YloqWIDt/7LtZQM0C7GZ9flIr7z9hHpSWERXAA5Gj5NQ0/hcY3nF4dPoqWs3VeeQIDAQAB\""]
}
resource "porkbun_dns_record" "w5isp_g" {
domain = "w5isp.com"
name = "g"
content = "204.110.191.5"
resource "powerdns_record" "w5isp_g" {
depends_on = [powerdns_zone.w5isp]
zone = "w5isp.com."
name = "g.w5isp.com."
type = "A"
ttl = 3600
priority = 0
records = ["204.110.191.5"]
}
resource "porkbun_dns_record" "w5isp_truck" {
domain = "w5isp.com"
name = "truck"
content = "g.w5isp.com."
resource "powerdns_record" "w5isp_truck" {
depends_on = [powerdns_zone.w5isp]
zone = "w5isp.com."
name = "truck.w5isp.com."
type = "CNAME"
ttl = 3600
priority = 0
records = ["g.w5isp.com."]
}
resource "porkbun_dns_record" "w5isp_sendgrid1" {
domain = "w5isp.com"
name = "em40"
content = "u177982.wl233.sendgrid.net"
resource "powerdns_record" "w5isp_sendgrid1" {
depends_on = [powerdns_zone.w5isp]
zone = "w5isp.com."
name = "em40.w5isp.com."
type = "CNAME"
ttl = 3600
priority = 0
records = ["u177982.wl233.sendgrid.net."]
}
resource "porkbun_dns_record" "w5isp_sendgrid2" {
domain = "w5isp.com"
name = "s1._domainkey"
content = "s1.domainkey.u177982.wl233.sendgrid.net."
resource "powerdns_record" "w5isp_sendgrid2" {
depends_on = [powerdns_zone.w5isp]
zone = "w5isp.com."
name = "s1._domainkey.w5isp.com."
type = "CNAME"
ttl = 3600
priority = 0
records = ["s1.domainkey.u177982.wl233.sendgrid.net."]
}
resource "porkbun_dns_record" "w5isp_sendgrid3" {
domain = "w5isp.com"
name = "s2._domainkey"
content = "s2.domainkey.u177982.wl233.sendgrid.net."
resource "powerdns_record" "w5isp_sendgrid3" {
depends_on = [powerdns_zone.w5isp]
zone = "w5isp.com."
name = "s2._domainkey.w5isp.com."
type = "CNAME"
ttl = 3600
priority = 0
records = ["s2.domainkey.u177982.wl233.sendgrid.net."]
}
resource "porkbun_dns_record" "w5isp_dmarc" {
domain = "w5isp.com"
name = "_dmarc"
content = "v=DMARC1; p=quarantine; rua=mailto:postmaster@w5isp.com; ruf=mailto:postmaster@w5isp.com; fo=1"
resource "powerdns_record" "w5isp_dmarc" {
depends_on = [powerdns_zone.w5isp]
zone = "w5isp.com."
name = "_dmarc.w5isp.com."
type = "TXT"
ttl = 3600
priority = 0
records = ["\"v=DMARC1; p=quarantine; rua=mailto:postmaster@w5isp.com; ruf=mailto:postmaster@w5isp.com; fo=1\""]
}
# Mail server
resource "porkbun_dns_record" "w5isp_mail" {
domain = "w5isp.com"
name = "mail"
content = "204.110.191.5"
resource "powerdns_record" "w5isp_mail" {
depends_on = [powerdns_zone.w5isp]
zone = "w5isp.com."
name = "mail.w5isp.com."
type = "A"
ttl = 3600
priority = 0
records = ["204.110.191.5"]
}
resource "porkbun_dns_record" "w5isp_sync" {
domain = "w5isp.com"
name = "sync"
content = "204.110.191.216"
resource "powerdns_record" "w5isp_sync" {
depends_on = [powerdns_zone.w5isp]
zone = "w5isp.com."
name = "sync.w5isp.com."
type = "A"
ttl = 3600
priority = 0
records = ["204.110.191.216"]
}
resource "porkbun_dns_record" "w5isp_log" {
domain = "w5isp.com"
name = "log"
content = "g.w5isp.com"
resource "powerdns_record" "w5isp_log" {
depends_on = [powerdns_zone.w5isp]
zone = "w5isp.com."
name = "log.w5isp.com."
type = "CNAME"
ttl = 3600
priority = 0
records = ["g.w5isp.com."]
}
resource "porkbun_dns_record" "w5isp_autodiscover" {
domain = "w5isp.com"
name = "autodiscover"
content = "mail.w5isp.com"
resource "powerdns_record" "w5isp_autodiscover" {
depends_on = [powerdns_zone.w5isp]
zone = "w5isp.com."
name = "autodiscover.w5isp.com."
type = "CNAME"
ttl = 3600
priority = 0
records = ["mail.w5isp.com."]
}
resource "porkbun_dns_record" "w5isp_autodiscover_srv" {
domain = "w5isp.com"
name = "_autodiscover._tcp"
content = "0 443 mail.w5isp.com"
resource "powerdns_record" "w5isp_autodiscover_srv" {
depends_on = [powerdns_zone.w5isp]
zone = "w5isp.com."
name = "_autodiscover._tcp.w5isp.com."
type = "SRV"
priority = 0
ttl = 3600
records = ["0 0 443 mail.w5isp.com."]
}
resource "porkbun_dns_record" "w5isp_autoconfig" {
domain = "w5isp.com"
name = "autoconfig"
content = "mail.w5isp.com"
resource "powerdns_record" "w5isp_autoconfig" {
depends_on = [powerdns_zone.w5isp]
zone = "w5isp.com."
name = "autoconfig.w5isp.com."
type = "CNAME"
ttl = 3600
priority = 0
records = ["mail.w5isp.com."]
}
resource "porkbun_dns_record" "w5isp_n8n" {
domain = "w5isp.com"
name = "n8n"
content = "204.110.191.2" # Traefik ingress on k3s cluster
resource "powerdns_record" "w5isp_n8n" {
depends_on = [powerdns_zone.w5isp]
zone = "w5isp.com."
name = "n8n.w5isp.com."
type = "A"
ttl = 3600
priority = 0
records = ["204.110.191.2"] # Traefik ingress on k3s cluster
}
resource "porkbun_dns_record" "w5isp_nodered" {
domain = "w5isp.com"
name = "nodered"
content = "204.110.191.2" # Node-RED via Traefik on k3s cluster
resource "powerdns_record" "w5isp_nodered" {
depends_on = [powerdns_zone.w5isp]
zone = "w5isp.com."
name = "nodered.w5isp.com."
type = "A"
ttl = 3600
priority = 0
records = ["204.110.191.2"] # Node-RED via Traefik on k3s cluster
}
resource "porkbun_dns_record" "w5isp_headscale" {
domain = "w5isp.com"
name = "headscale"
content = "66.206.18.166"
resource "powerdns_record" "w5isp_headscale" {
depends_on = [powerdns_zone.w5isp]
zone = "w5isp.com."
name = "headscale.w5isp.com."
type = "A"
ttl = 3600
priority = 0
records = ["66.206.18.166"]
}
resource "porkbun_dns_record" "w5isp_hs" {
domain = "w5isp.com"
name = "hs"
content = "66.206.18.166"
resource "powerdns_record" "w5isp_hs" {
depends_on = [powerdns_zone.w5isp]
zone = "w5isp.com."
name = "hs.w5isp.com."
type = "A"
ttl = 3600
priority = 0
records = ["66.206.18.166"]
}
resource "porkbun_dns_record" "w5isp_dokku" {
domain = "w5isp.com"
name = "dokku"
content = "204.110.191.218"
resource "powerdns_record" "w5isp_dokku" {
depends_on = [powerdns_zone.w5isp]
zone = "w5isp.com."
name = "dokku.w5isp.com."
type = "A"
ttl = 3600
priority = 0
records = ["204.110.191.218"]
}
resource "porkbun_dns_record" "w5isp_camper" {
domain = "w5isp.com"
name = "camper"
content = "skippy.w5isp.com."
resource "powerdns_record" "w5isp_camper" {
depends_on = [powerdns_zone.w5isp]
zone = "w5isp.com."
name = "camper.w5isp.com."
type = "CNAME"
ttl = 3600
priority = 0
records = ["skippy.w5isp.com."]
}

View file

@ -0,0 +1,226 @@
# TEMPORARY FILE - w5isp.com DNSimple configuration
# This is a backup/reference of w5isp.com in DNSimple format
resource "dnsimple_zone" "w5isp_com" {
name = "w5isp.com"
}
resource "dnsimple_zone_record" "w5isp_root" {
zone_name = "w5isp.com"
name = ""
value = "204.110.191.5"
type = "A"
ttl = 3600
}
resource "dnsimple_zone_record" "w5isp_git" {
zone_name = "w5isp.com"
name = "git"
value = "66.206.18.163"
type = "A"
ttl = 3600
}
resource "dnsimple_zone_record" "w5isp_home" {
zone_name = "w5isp.com"
name = "home"
value = "204.110.191.1"
type = "A"
ttl = 3600
}
resource "dnsimple_zone_record" "w5isp_photos" {
zone_name = "w5isp.com"
name = "photos"
value = "204.110.191.8"
type = "A"
ttl = 3600
}
resource "dnsimple_zone_record" "w5isp_skippy" {
zone_name = "w5isp.com"
name = "skippy"
value = "204.110.191.8"
type = "A"
ttl = 3600
}
resource "dnsimple_zone_record" "w5isp_ha" {
zone_name = "w5isp.com"
name = "ha"
value = "q1l09qiycnaagngmjsg1qas0rhqcfoou.ui.nabu.casa"
type = "CNAME"
ttl = 3600
}
resource "dnsimple_zone_record" "w5isp_mx1" {
zone_name = "w5isp.com"
name = ""
priority = 10
value = "mail.w5isp.com"
type = "MX"
ttl = 3600
}
resource "dnsimple_zone_record" "w5isp_txt" {
zone_name = "w5isp.com"
name = ""
value = "v=spf1 mx a ip4:204.110.191.5 ~all"
type = "TXT"
ttl = 3600
}
# DKIM record
resource "dnsimple_zone_record" "w5isp_dkim" {
zone_name = "w5isp.com"
name = "dkim._domainkey"
value = "v=DKIM1;k=rsa;t=s;s=email;p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAxti2t8TvzIqKF9BpKn3rQExKg3sS1SyQuwtQgL0r/ELEJ0D9cKU/iM+eB1ROJctKHoMqKDJoRCMP6eibFcgq2kLKqf+aceEOIBx2OK2WCXML+CNqQZA6yO+A8/Jq7iFZPq8D5FmOoxbwRZkso7CkSennSz/+F7nBPI/OfyEiiI4xJzWH3t8SaAkkcy46O+1K0iCkTpsthon7E2PHa3SPkrjbep/5NImTJLK5LuffiLJtLsiK+73mvsAYCDmrNxPTaDjXkj0TWdKl/d/TnlVJl+YloqWIDt/7LtZQM0C7GZ9flIr7z9hHpSWERXAA5Gj5NQ0/hcY3nF4dPoqWs3VeeQIDAQAB"
type = "TXT"
ttl = 3600
}
resource "dnsimple_zone_record" "w5isp_g" {
zone_name = "w5isp.com"
name = "g"
value = "204.110.191.5"
type = "A"
ttl = 3600
}
resource "dnsimple_zone_record" "w5isp_truck" {
zone_name = "w5isp.com"
name = "truck"
value = "g.w5isp.com."
type = "CNAME"
ttl = 3600
}
resource "dnsimple_zone_record" "w5isp_sendgrid1" {
zone_name = "w5isp.com"
name = "em40"
value = "u177982.wl233.sendgrid.net"
type = "CNAME"
ttl = 3600
}
resource "dnsimple_zone_record" "w5isp_sendgrid2" {
zone_name = "w5isp.com"
name = "s1._domainkey"
value = "s1.domainkey.u177982.wl233.sendgrid.net."
type = "CNAME"
ttl = 3600
}
resource "dnsimple_zone_record" "w5isp_sendgrid3" {
zone_name = "w5isp.com"
name = "s2._domainkey"
value = "s2.domainkey.u177982.wl233.sendgrid.net."
type = "CNAME"
ttl = 3600
}
resource "dnsimple_zone_record" "w5isp_dmarc" {
zone_name = "w5isp.com"
name = "_dmarc"
value = "v=DMARC1; p=quarantine; rua=mailto:postmaster@w5isp.com; ruf=mailto:postmaster@w5isp.com; fo=1"
type = "TXT"
ttl = 3600
}
# Mail server
resource "dnsimple_zone_record" "w5isp_mail" {
zone_name = "w5isp.com"
name = "mail"
value = "204.110.191.5"
type = "A"
ttl = 3600
}
resource "dnsimple_zone_record" "w5isp_sync" {
zone_name = "w5isp.com"
name = "sync"
value = "204.110.191.216"
type = "A"
ttl = 3600
}
resource "dnsimple_zone_record" "w5isp_log" {
zone_name = "w5isp.com"
name = "log"
value = "g.w5isp.com"
type = "CNAME"
ttl = 3600
}
resource "dnsimple_zone_record" "w5isp_autodiscover" {
zone_name = "w5isp.com"
name = "autodiscover"
value = "mail.w5isp.com"
type = "CNAME"
ttl = 3600
}
resource "dnsimple_zone_record" "w5isp_autodiscover_srv" {
zone_name = "w5isp.com"
name = "_autodiscover._tcp"
value = "0 443 mail.w5isp.com"
type = "SRV"
priority = 0
ttl = 3600
}
resource "dnsimple_zone_record" "w5isp_autoconfig" {
zone_name = "w5isp.com"
name = "autoconfig"
value = "mail.w5isp.com"
type = "CNAME"
ttl = 3600
}
resource "dnsimple_zone_record" "w5isp_n8n" {
zone_name = "w5isp.com"
name = "n8n"
value = "204.110.191.2" # Traefik ingress on k3s cluster
type = "A"
ttl = 3600
}
resource "dnsimple_zone_record" "w5isp_nodered" {
zone_name = "w5isp.com"
name = "nodered"
value = "204.110.191.2" # Node-RED via Traefik on k3s cluster
type = "A"
ttl = 3600
}
resource "dnsimple_zone_record" "w5isp_headscale" {
zone_name = "w5isp.com"
name = "headscale"
value = "66.206.18.166"
type = "A"
ttl = 3600
}
resource "dnsimple_zone_record" "w5isp_hs" {
zone_name = "w5isp.com"
name = "hs"
value = "66.206.18.166"
type = "A"
ttl = 3600
}
resource "dnsimple_zone_record" "w5isp_dokku" {
zone_name = "w5isp.com"
name = "dokku"
value = "204.110.191.218"
type = "A"
ttl = 3600
}
resource "dnsimple_zone_record" "w5isp_camper" {
zone_name = "w5isp.com"
name = "camper"
value = "skippy.w5isp.com."
type = "CNAME"
ttl = 3600
}

View file

@ -37,15 +37,10 @@ provider "porkbun" {
secret_api_key = var.prokbun_secret_api_key
}
provider "powerdns" {
api_key = var.pdns_api_key
server_url = var.pdns_server_url
}
provider "vultr" {
# API key should be set via VULTR_KEY environment variable
api_key = var.vultr_api_key
}
# provider "powerdns" {
# api_key = var.pdns_api_key
# server_url = var.pdns_server_url
# }
provider "cloudflare" {
# API token is read from CLOUDFLARE_API_TOKEN environment variable
@ -58,3 +53,9 @@ provider "cloudflare" {
# password = var.proxmox_password
# insecure = var.proxmox_tls_insecure
# }
provider "powerdns" {
# alias = "vultr"
api_key = var.pdns_vultr_api_key
server_url = "http://100.93.123.98:8081"
}

View file

@ -1,103 +0,0 @@
# Proxmox K3s Control Plane Nodes
# resource "proxmox_virtual_environment_vm" "k3s_control" {
# count = var.control_plane_count
# name = "${var.cluster_name}-control-${count.index + 1}"
# node_name = var.proxmox_nodes[count.index % length(var.proxmox_nodes)]
# vm_id = 1100 + count.index
# cpu {
# cores = var.control_plane_cores
# type = "host"
# }
# memory {
# dedicated = var.control_plane_memory
# }
# disk {
# datastore_id = var.storage_pool
# file_id = "${var.storage_pool}:${var.vm_template}"
# interface = "scsi0"
# size = var.control_plane_disk_size
# }
# network_device {
# bridge = var.network_bridge
# }
# operating_system {
# type = "l26"
# }
# initialization {
# ip_config {
# ipv4 {
# address = "${cidrhost(var.network_cidr, var.control_plane_ip_start + count.index)}/22"
# gateway = var.network_gateway
# }
# }
# user_account {
# username = var.ssh_user
# keys = [var.ssh_public_key]
# }
# }
# lifecycle {
# ignore_changes = [
# initialization[0].user_data_file_id,
# ]
# }
# }
# Proxmox K3s Worker Nodes
# resource "proxmox_virtual_environment_vm" "k3s_worker" {
# count = var.worker_count
# name = "${var.cluster_name}-worker-${count.index + 1}"
# node_name = var.proxmox_nodes[count.index % length(var.proxmox_nodes)]
# vm_id = 1200 + count.index
# cpu {
# cores = var.worker_cores
# type = "host"
# }
# memory {
# dedicated = var.worker_memory
# }
# disk {
# datastore_id = var.storage_pool
# file_id = "${var.storage_pool}:${var.vm_template}"
# interface = "scsi0"
# size = var.worker_disk_size
# }
# network_device {
# bridge = var.network_bridge
# }
# operating_system {
# type = "l26"
# }
# initialization {
# ip_config {
# ipv4 {
# address = "${cidrhost(var.network_cidr, var.worker_ip_start + count.index)}/22"
# gateway = var.network_gateway
# }
# }
# user_account {
# username = var.ssh_user
# keys = [var.ssh_public_key]
# }
# }
# lifecycle {
# ignore_changes = [
# initialization[0].user_data_file_id,
# ]
# }
# }

View file

@ -1,34 +0,0 @@
#!/bin/bash
# OPTIONAL: Setup SSH tunnel for PowerDNS API access through vpn.vntx.net
# This is only needed if you cannot directly reach ns1.vntx.net:8081
# This forwards local port 18081 to ns1.vntx.net:8081 via vpn.vntx.net
TUNNEL_HOST="vpn.vntx.net"
LOCAL_PORT="18081"
REMOTE_HOST="ns1.vntx.net"
REMOTE_PORT="8081"
echo "Setting up SSH tunnel for PowerDNS API access..."
echo "NOTE: Update vars.tf to use pdns_server_url = \"http://localhost:18081\" when using this tunnel"
echo "Local port: ${LOCAL_PORT} -> ${TUNNEL_HOST} -> ${REMOTE_HOST}:${REMOTE_PORT}"
# Kill any existing tunnel on this port
pkill -f "ssh.*${LOCAL_PORT}:${REMOTE_HOST}:${REMOTE_PORT}"
# Create SSH tunnel in background
ssh -fN -L ${LOCAL_PORT}:${REMOTE_HOST}:${REMOTE_PORT} ${TUNNEL_HOST}
if [ $? -eq 0 ]; then
echo "SSH tunnel established successfully"
echo "PowerDNS API should now be accessible at http://localhost:${LOCAL_PORT}"
echo ""
echo "Test with: curl -H 'X-API-Key: \$TF_VAR_pdns_api_key' http://localhost:${LOCAL_PORT}/api/v1/servers/localhost"
echo ""
echo "Run 'tofu plan' or 'tofu apply' now"
echo ""
echo "To stop tunnel later: pkill -f 'ssh.*${LOCAL_PORT}:${REMOTE_HOST}:${REMOTE_PORT}'"
else
echo "Failed to establish SSH tunnel"
exit 1
fi

BIN
home/terraform/tfplan Normal file

Binary file not shown.

View file

@ -146,3 +146,9 @@ variable "ssh_public_key" {
type = string
default = "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIHLyVSEEAEbGZZqwPwEup0XrlTpu3x3iF9ExvvQPA4xN graham@mcintire.me"
}
variable "pdns_vultr_api_key" {
description = "PowerDNS API key"
type = string
default = "eyyMkv7dpDE0gQz1N2FeyUWGRa9FBHGcqcdSCMaaoe"
}

BIN
home/terraform/w5isp.tfplan Normal file

Binary file not shown.