nixos-config/infra/cloudflare.tf

220 lines
5.7 KiB
Terraform
Raw Normal View History

2024-12-01 16:16:09 +08:00
provider "cloudflare" {
api_token = local.secrets.cloudflare.api_token
}
locals {
cloudflare_main_account_id = local.secrets.cloudflare.account_id
cloudflare_workers_zone_id = local.secrets.cloudflare.zone_id
}
# ------------------------------------
# authenticated origin pulls - common
resource "tls_private_key" "cloudflare_aop_ca" {
algorithm = "ECDSA"
ecdsa_curve = "P384"
}
resource "tls_self_signed_cert" "cloudflare_aop_ca" {
is_ca_certificate = true
private_key_pem = tls_private_key.cloudflare_aop_ca.private_key_pem
subject {
common_name = "workers.moe"
organization = "rebmit"
}
validity_period_hours = 8760 # 1 year
early_renewal_hours = 4320 # 6 months
allowed_uses = [
"cert_signing",
"crl_signing"
]
}
output "cloudflare_aop_ca_certificate" {
value = tls_self_signed_cert.cloudflare_aop_ca.cert_pem
sensitive = false
}
resource "tls_private_key" "cloudflare_aop_leaf" {
algorithm = "ECDSA"
ecdsa_curve = "P384"
}
resource "tls_cert_request" "cloudflare_aop_leaf" {
private_key_pem = tls_private_key.cloudflare_aop_leaf.private_key_pem
dns_names = ["*.rebmit.workers.moe", "*.rebmit.moe"]
subject {
common_name = "workers.moe"
organization = "rebmit"
}
}
resource "tls_locally_signed_cert" "cloudflare_aop_leaf" {
cert_request_pem = tls_cert_request.cloudflare_aop_leaf.cert_request_pem
ca_private_key_pem = tls_private_key.cloudflare_aop_ca.private_key_pem
ca_cert_pem = tls_self_signed_cert.cloudflare_aop_ca.cert_pem
validity_period_hours = 4320 # 6 months
early_renewal_hours = 2160 # 3 months
allowed_uses = [
"client_auth"
]
}
resource "cloudflare_authenticated_origin_pulls" "default" {
zone_id = local.cloudflare_workers_zone_id
enabled = true
}
resource "cloudflare_authenticated_origin_pulls_certificate" "zone" {
zone_id = local.cloudflare_workers_zone_id
certificate = tls_locally_signed_cert.cloudflare_aop_leaf.cert_pem
private_key = tls_private_key.cloudflare_aop_leaf.private_key_pem
type = "per-zone"
}
resource "cloudflare_authenticated_origin_pulls" "zone" {
zone_id = local.cloudflare_workers_zone_id
authenticated_origin_pulls_certificate = cloudflare_authenticated_origin_pulls_certificate.zone.id
enabled = true
}
# ------------------------------------
# custom hostname ssl - common
resource "cloudflare_record" "fallback_a" {
for_each = toset(module.hosts["suwako-vie1"].endpoints_v4)
name = "fallback"
proxied = true
ttl = 1
type = "A"
content = each.value
zone_id = local.cloudflare_workers_zone_id
}
resource "cloudflare_record" "fallback_aaaa" {
for_each = toset(module.hosts["suwako-vie1"].endpoints_v6)
name = "fallback"
proxied = true
ttl = 1
type = "AAAA"
content = each.value
zone_id = local.cloudflare_workers_zone_id
2024-12-01 16:16:09 +08:00
}
resource "cloudflare_custom_hostname_fallback_origin" "fallback" {
2024-12-01 16:16:09 +08:00
zone_id = local.cloudflare_workers_zone_id
origin = "fallback.workers.moe"
}
# ------------------------------------
# zero trust - common
resource "cloudflare_zero_trust_access_policy" "default" {
account_id = local.cloudflare_main_account_id
name = "Default Policy"
decision = "allow"
include {
email = [
"rebmit@rebmit.moe",
"rebmit233@outlook.com",
]
}
}
resource "cloudflare_zero_trust_access_identity_provider" "pin_login" {
account_id = local.cloudflare_main_account_id
name = "PIN login"
type = "onetimepin"
}
# ------------------------------------
# workers - mirror
resource "cloudflare_record" "mirror_cname" {
name = "mirror.rebmit"
proxied = true
ttl = 1
type = "CNAME"
content = "fallback.workers.moe"
zone_id = local.cloudflare_workers_zone_id
}
2024-12-01 16:16:09 +08:00
module "cloudflare_workers_mirror" {
source = "./modules/cloudflare-workers"
name = "mirror"
hostname = ["mirror.rebmit.workers.moe"]
2024-12-01 16:16:09 +08:00
script = file("${path.module}/resources/cloudflare-workers/mirror.js")
account_id = local.cloudflare_main_account_id
zone_id = local.cloudflare_workers_zone_id
}
# ------------------------------------
# zero trust - prom
resource "cloudflare_record" "prom_a" {
name = "prom.rebmit"
for_each = toset(module.hosts["suwako-vie1"].endpoints_v4)
proxied = true
ttl = 1
type = "A"
content = each.value
zone_id = local.cloudflare_workers_zone_id
}
resource "cloudflare_record" "prom_aaaa" {
name = "prom.rebmit"
for_each = toset(module.hosts["suwako-vie1"].endpoints_v6)
proxied = true
ttl = 1
type = "AAAA"
content = each.value
zone_id = local.cloudflare_workers_zone_id
}
module "cloudflare_zero_trust_prom" {
source = "./modules/cloudflare-zero-trust"
name = "prom"
hostname = ["prom.rebmit.workers.moe", "prom.rebmit.moe"]
policies = [cloudflare_zero_trust_access_policy.default.id]
zone_id = local.cloudflare_workers_zone_id
}
2024-12-22 16:10:16 +08:00
# ------------------------------------
# dns only - push
resource "cloudflare_record" "push_a" {
name = "push.rebmit"
for_each = toset(module.hosts["suwako-vie1"].endpoints_v4)
proxied = false
ttl = 1
type = "A"
content = each.value
2024-12-22 16:10:16 +08:00
zone_id = local.cloudflare_workers_zone_id
}
resource "cloudflare_record" "push_aaaa" {
name = "push.rebmit"
for_each = toset(module.hosts["suwako-vie1"].endpoints_v6)
proxied = false
ttl = 1
type = "AAAA"
content = each.value
2024-12-22 16:10:16 +08:00
zone_id = local.cloudflare_workers_zone_id
}
resource "cloudflare_record" "push_https" {
name = "push.rebmit"
proxied = false
ttl = 1
type = "HTTPS"
zone_id = local.cloudflare_workers_zone_id
2024-12-22 16:10:16 +08:00
data {
priority = 1
target = "."
value = "alpn=\"h3,h2\""
2024-12-22 16:10:16 +08:00
}
}