# Input variables variable "do_token" { type = string description = "DigitalOcean API token." } variable "tld" { type = string description = "Root Top-Level Domain. Subdomains will be derived from it." } variable "wallabag_tld_prefix" { type = string description = "DNS prefix used for the Wallabag installation. Does not contain a dot at the end." } variable "nextcloud_tld_prefix" { type = string description = "DNS prefix used for the Nextcloud installation. Does not contain a dot at the end." } # DigitalOcean provider "digitalocean" { token = var.do_token version = "~> 1.1" } resource "digitalocean_ssh_key" "client" { name = "terraform-vps-client" public_key = file("${path.module}/secrets/ssh/vps-box-client.pub") } ## Droplet and volume resource "digitalocean_droplet" "vps" { image = "ubuntu-18-04-x64" name = "sovereignty" region = "nyc3" size = "s-1vcpu-1gb" backups = true ipv6 = true monitoring = true user_data = file("${path.module}/generated/user-data.sh") ssh_keys = [ "${digitalocean_ssh_key.client.fingerprint}", ] connection { user = "root" type = "ssh" private_key = file("${path.module}/secrets/ssh/vps-box-client") timeout = "2m" } provisioner "remote-exec" { inline = ["echo 'SSH is up! Noop remote-exec is done.'"] } } resource "digitalocean_volume" "vps_persistent_volume" { region = "nyc3" name = "vps-persistent-volume" size = 10 initial_filesystem_type = "ext4" description = "Persistent disk to store docker volumes contents across droplets being created and destroyed" } resource "digitalocean_volume_attachment" "foobar" { volume_id = digitalocean_volume.vps_persistent_volume.id droplet_id = digitalocean_droplet.vps.id } ## DNS and IP configuration resource "digitalocean_floating_ip" "vps_public_ip" { region = digitalocean_droplet.vps.region } resource "digitalocean_floating_ip_assignment" "vps_public_ip_assignment" { ip_address = digitalocean_floating_ip.vps_public_ip.id droplet_id = digitalocean_droplet.vps.id } output "public_floating_ip" { value = digitalocean_floating_ip.vps_public_ip.ip_address } resource "digitalocean_domain" "vps_tld" { name = var.tld } resource "digitalocean_record" "at_sign" { domain = digitalocean_domain.vps_tld.name type = "A" name = "@" value = digitalocean_floating_ip.vps_public_ip.ip_address } resource "digitalocean_record" "wallabag" { domain = digitalocean_domain.vps_tld.name type = "CNAME" name = var.wallabag_tld_prefix value = "${digitalocean_domain.vps_tld.name}." } resource "digitalocean_record" "nextcloud" { domain = digitalocean_domain.vps_tld.name type = "CNAME" name = var.nextcloud_tld_prefix value = "${digitalocean_domain.vps_tld.name}." }