chris ~ $ 

software_developer devops_engineer ethical_hacker cheshire_uk

...

  Terraform 

devops   server   cloud

Digital Ocean App Platform

resource "digitalocean_certificate" "do_cert" {
  name    = "weav.ovh"
  type    = "lets_encrypt"
  domains = ["weav.ovh", "*.weav.ovh"]
}

# Create a new container registry
resource "digitalocean_container_registry" "aagy_registry" {
  name                   = "aagy-registry"
  subscription_tier_slug = "starter"
}

resource "digitalocean_app" "aagy_app" {
  depends_on = [ docker_registry_image.aagy_registry_image ]
  
  spec {
    name   = "aagy-app"
    region = "lon1"
    domain {
      name = "aagy.weav.ovh"
      zone = "weav.ovh"
    }

    service {
      name               = "aagy"
      instance_count     = 1
      instance_size_slug = "basic-xxs"
      http_port          = 5549

      image {
        registry_type = "DOCR"
        repository    = "aagy"
        tag = "latest"
        deploy_on_push {
          enabled = true
        }
      }
    }

    ingress {
      rule {
        component {
          name = "aagy"
        }
        match {
          path {
            prefix = "/"
          }
        }
        cors {
          allow_origins {
            regex = ".*"
          }
        }
      }     
    }

        
  }
}

Docker Registry

resource "digitalocean_container_registry_docker_credentials" "aagy_registry_docker_credentials" {
  registry_name = "aagy-registry"
  write = true
  depends_on = [ digitalocean_container_registry.aagy_registry ]
}

provider "docker" {
  registry_auth {
    address             = digitalocean_container_registry.aagy_registry.server_url
    config_file_content = digitalocean_container_registry_docker_credentials.aagy_registry_docker_credentials.docker_credentials
  }
}

resource "docker_registry_image" "aagy_registry_image" {
  name          = docker_image.aagy.name
  keep_remotely = false
  depends_on = [ docker_image.aagy, digitalocean_container_registry_docker_credentials.aagy_registry_docker_credentials ]
}

resource "docker_image" "aagy" {
  name         = "registry.digitalocean.com/aagy-registry/aagy"
  build {
    context = "../../"
    dockerfile = ".docker/Dockerfile"
    tag = ["registry.digitalocean.com/aagy-registry/aagy:latest"]
  }
}

Digital Ocean Droplet

terraform {
  required_providers {
    digitalocean = {
      source  = "digitalocean/digitalocean"
      version = "~> 2.0"
    }
  }
}

# Set the variable value in *.tfvars file
# or using -var="do_token=..." CLI option
variable "do_token" {}

# Configure the DigitalOcean Provider
provider "digitalocean" {
  token = var.do_token
}

# Create a web server
resource "digitalocean_droplet" "droppy" {
    name = "droppy"
    image = "ubuntu-23-10-x64"
    size = "s-1vcpu-1gb"
    region = "lon1"
    user_data = file("cloudinit.yaml")
    ssh_keys = ["fa:7c:c5:69:da:f1:42:0a:70:56:53:a8:f6:36:64:1a"]
}

output "ip_addresses" {
  value = [digitalocean_droplet.droppy.ipv4_address]
  description = "Droplet IP addresses"
}