Skip to content

Instantly share code, notes, and snippets.

@YorikSar
Created April 18, 2024 08:25
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save YorikSar/3b458963f307939b29407436dee0401b to your computer and use it in GitHub Desktop.
Save YorikSar/3b458963f307939b29407436dee0401b to your computer and use it in GitHub Desktop.
Jitsi on Vultr
terraform {
required_providers {
vultr = {
source = "vultr/vultr"
version = "2.19.0"
}
null = {
source = "hashicorp/null"
version = "3.2.2"
}
}
}
variable "domain" {
type = string
description = "Domain name to use for the new VM. Assumes that the domain one-level up is registered in Vultr (example.com for jitsi.ecample.com)."
}
variable "email" {
type = string
description = "email to use for Let's Encrypt certificate registration"
}
data "vultr_application" "jitsi" {
filter {
name = "name"
values = ["Jitsi"]
}
}
data "vultr_region" "ams" {
filter {
name = "id"
values = ["ams"]
}
}
data "vultr_plan" "amd-2gb" {
filter {
name = "vcpu_count"
values = ["1"]
}
filter {
name = "ram"
values = ["2048"]
}
filter {
name = "type"
values = ["vc2"]
}
filter {
name = "locations"
values = [data.vultr_region.ams.id]
}
}
data "vultr_ssh_key" "one" {
filter {
name = "name"
values = ["2024"]
}
}
resource "vultr_instance" "jitsi" {
plan = data.vultr_plan.amd-2gb.id
region = data.vultr_region.ams.id
image_id = data.vultr_application.jitsi.image_id
ssh_key_ids = [data.vultr_ssh_key.one.id]
enable_ipv6 = true
activation_email = false
hostname = var.domain
label = "Jitsi ${var.domain}"
# The script asks for domain, email and whether or not to enable user registration
user_data = <<EOF
#cloud-config
runcmd:
- echo -e "${var.domain}\n${var.email}\nN\n" | /opt/vultr/scripts/configure_jitsi.sh
EOF
}
resource "null_resource" "wait_for_https" {
depends_on = [
vultr_dns_record.A,
vultr_dns_record.AAAA,
]
provisioner "local-exec" {
command = "while ! curl -I https://${var.domain}; do sleep 10; done"
}
}
locals {
domain_parts = split(".", var.domain)
base_domain = join(".", slice(local.domain_parts, 1, length(local.domain_parts)))
sub_domain = local.domain_parts[0]
}
data "vultr_dns_domain" "one" {
domain = local.base_domain
}
resource "vultr_dns_record" "A" {
domain = data.vultr_dns_domain.one.id
type = "A"
name = local.sub_domain
ttl = 60
data = vultr_instance.jitsi.main_ip
}
resource "vultr_dns_record" "AAAA" {
domain = data.vultr_dns_domain.one.id
type = "AAAA"
name = local.sub_domain
ttl = 60
data = vultr_instance.jitsi.v6_main_ip
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment