154 lines
3.3 KiB
HCL
154 lines
3.3 KiB
HCL
terraform {
|
|
required_providers {
|
|
digitalocean = {
|
|
source = "digitalocean/digitalocean"
|
|
version = ">= 2.0.0"
|
|
}
|
|
}
|
|
}
|
|
|
|
provider "digitalocean" {
|
|
token = var.do_token
|
|
}
|
|
|
|
locals {
|
|
balance_json = jsondecode(data.http.do_balance.response_body)
|
|
}
|
|
|
|
data "http" "do_balance" {
|
|
url = "https://api.digitalocean.com/v2/customers/my/balance"
|
|
|
|
request_headers = {
|
|
Authorization = "Bearer ${var.do_token}"
|
|
}
|
|
}
|
|
|
|
variable "do_token" {
|
|
description = "DigitalOcean API Token"
|
|
type = string
|
|
sensitive = true
|
|
}
|
|
|
|
variable "project_name" {
|
|
description = "Project name"
|
|
type = string
|
|
default = "terraform-project"
|
|
}
|
|
|
|
variable "region" {
|
|
description = "DigitalOcean region"
|
|
type = string
|
|
default = "nyc3"
|
|
}
|
|
|
|
variable "droplet_size" {
|
|
description = "Droplet size slug"
|
|
type = string
|
|
default = "s-1vcpu-1gb"
|
|
}
|
|
|
|
variable "droplet_image" {
|
|
description = "Droplet image slug"
|
|
type = string
|
|
default = "ubuntu-22-04-x64"
|
|
}
|
|
|
|
variable "ssh_public_key_path" {
|
|
description = "Path to SSH public key file"
|
|
type = string
|
|
default = ""
|
|
}
|
|
|
|
variable "expiration_date" {
|
|
description = "Expiration date in YYYY-MM-DD format. Use with destroy script"
|
|
type = string
|
|
default = "2026-03-03"
|
|
}
|
|
|
|
resource "digitalocean_project" "main" {
|
|
name = var.project_name
|
|
description = "Managed by Terraform"
|
|
purpose = "Web Application"
|
|
environment = "Development"
|
|
}
|
|
|
|
resource "digitalocean_ssh_key" "main" {
|
|
count = var.ssh_public_key_path != "" ? 1 : 0
|
|
name = "${var.project_name}-ssh-key"
|
|
public_key = file(var.ssh_public_key_path)
|
|
}
|
|
|
|
resource "digitalocean_droplet" "web" {
|
|
image = var.droplet_image
|
|
name = "${var.project_name}-web-1"
|
|
region = var.region
|
|
size = var.droplet_size
|
|
|
|
ssh_keys = var.ssh_public_key_path != "" ? [digitalocean_ssh_key.main[0].fingerprint] : []
|
|
|
|
tags = ["${var.project_name}-web"]
|
|
|
|
monitoring = true
|
|
}
|
|
|
|
resource "digitalocean_loadbalancer" "public" {
|
|
name = "${var.project_name}-lb"
|
|
region = var.region
|
|
|
|
forwarding_rule {
|
|
entry_port = 80
|
|
entry_protocol = "http"
|
|
|
|
target_port = 80
|
|
target_protocol = "http"
|
|
}
|
|
|
|
healthcheck {
|
|
port = 80
|
|
protocol = "http"
|
|
path = "/"
|
|
}
|
|
|
|
droplet_ids = [digitalocean_droplet.web.id]
|
|
}
|
|
|
|
resource "digitalocean_floating_ip" "main" {
|
|
droplet_id = digitalocean_droplet.web.id
|
|
region = var.region
|
|
}
|
|
|
|
output "droplet_ip" {
|
|
description = "Public IP of the droplet"
|
|
value = digitalocean_droplet.web.ipv4_address
|
|
}
|
|
|
|
output "droplet_name" {
|
|
description = "Name of the droplet"
|
|
value = digitalocean_droplet.web.name
|
|
}
|
|
|
|
output "loadbalancer_ip" {
|
|
description = "Public IP of the load balancer"
|
|
value = digitalocean_loadbalancer.public.ip
|
|
}
|
|
|
|
output "floating_ip" {
|
|
description = "Floating IP address"
|
|
value = digitalocean_floating_ip.main.ip_address
|
|
}
|
|
|
|
output "account_balance" {
|
|
description = "DigitalOcean account balance"
|
|
value = local.balance_json.account_balance
|
|
}
|
|
|
|
output "month_to_date_balance" {
|
|
description = "Month to date balance"
|
|
value = local.balance_json.month_to_date_balance
|
|
}
|
|
|
|
output "month_to_date_usage" {
|
|
description = "Month to date usage"
|
|
value = local.balance_json.month_to_date_usage
|
|
}
|