124 lines
2.8 KiB
HCL
124 lines
2.8 KiB
HCL
terraform {
|
|
backend "consul" {
|
|
path = "nidito/state/service/club-patito"
|
|
}
|
|
|
|
required_providers {
|
|
acme = {
|
|
source = "vancluever/acme"
|
|
version = "~> 2.15.1"
|
|
}
|
|
|
|
digitalocean = {
|
|
source = "digitalocean/digitalocean"
|
|
version = "~> 2.29.0"
|
|
}
|
|
|
|
vault = {
|
|
source = "hashicorp/vault"
|
|
version = "~> 4.2.0"
|
|
}
|
|
}
|
|
|
|
required_version = ">= 1.0.0"
|
|
}
|
|
|
|
locals {
|
|
policies = {
|
|
"sys/capabilities-self" = ["update"]
|
|
"auth/token/renew-self" = ["update"]
|
|
"config/kv/provider:cdn" = ["read"]
|
|
"config/kv/pati.to:club" = ["read"]
|
|
"cfg/infra/tree/provider:cdn" = ["read"]
|
|
"cfg/svc/tree/pati.to:club" = ["read"]
|
|
}
|
|
|
|
mx_servers = {
|
|
"mxa.mailgun.org." = 10,
|
|
"mxb.mailgun.org." = 10,
|
|
}
|
|
}
|
|
|
|
provider "acme" {
|
|
server_url = "https://acme-v02.api.letsencrypt.org/directory"
|
|
}
|
|
|
|
// DO tokens for compute resources
|
|
data "vault_generic_secret" "DO" {
|
|
path = "cfg/infra/tree/provider:digitalocean"
|
|
}
|
|
|
|
provider "digitalocean" {
|
|
token = data.vault_generic_secret.DO.data.patito
|
|
}
|
|
|
|
data "terraform_remote_state" "rob_mx" {
|
|
backend = "consul"
|
|
workspace = "default"
|
|
config = {
|
|
datacenter = "casa"
|
|
path = "nidito/state/rob.mx"
|
|
}
|
|
}
|
|
|
|
resource "vault_policy" "service" {
|
|
name = "club-patito"
|
|
policy = <<-HCL
|
|
%{ for path in sort(keys(local.policies)) }path "${path}" {
|
|
capabilities = ${jsonencode(local.policies[path])}
|
|
}
|
|
|
|
%{ endfor }
|
|
HCL
|
|
}
|
|
|
|
resource "vault_jwt_auth_backend_role" "service" {
|
|
backend = "nomad-workload"
|
|
role_type = "jwt"
|
|
role_name = "club-patito"
|
|
bound_audiences = ["vault.io"]
|
|
user_claim = "/nomad_job_id"
|
|
user_claim_json_pointer = true
|
|
claim_mappings = {
|
|
nomad_namespace = "nomad_namespace"
|
|
nomad_job_id = "nomad_job_id"
|
|
nomad_task = "nomad_task"
|
|
}
|
|
token_type = "service"
|
|
token_policies = [vault_policy.service.name]
|
|
token_period = 60 * 60 * 6
|
|
token_explicit_max_ttl = 0
|
|
}
|
|
|
|
resource "digitalocean_record" "to_pati_club" {
|
|
domain = "pati.to"
|
|
type = "A"
|
|
ttl = 3600
|
|
name = "club"
|
|
value = data.terraform_remote_state.rob_mx.outputs.bernal.ip
|
|
}
|
|
|
|
resource "digitalocean_record" "txt_smtp_domainkey" {
|
|
domain = "pati.to"
|
|
type = "TXT"
|
|
name = "mailo._domainkey.mail.club"
|
|
value = "k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDG2sUJLqDOqMnjMy3+fNI0rdrGb8VrI84yloaXE9R8aLEXkm0jlANiFEmVF7s7ZvoDoKm0v5Lm/JsvM/Rl8n9TS2QYMqhmVsEmuBHwOVhekUDW/LKvfDxfNhmbquvU4z+/fn2WBx19dLG3Ctao7pbL7B9TKR+sPJUNoFWRseucMQIDAQAB"
|
|
}
|
|
|
|
resource "digitalocean_record" "txt_spf" {
|
|
domain = "pati.to"
|
|
type = "TXT"
|
|
name = "mail.club"
|
|
value = "v=spf1 include:mailgun.org ~all;"
|
|
}
|
|
|
|
resource "digitalocean_record" "mx" {
|
|
for_each = local.mx_servers
|
|
domain = "pati.to"
|
|
type = "MX"
|
|
name = "mail.club"
|
|
value = each.key
|
|
priority = each.value
|
|
}
|
|
|