145 lines
2.7 KiB
HCL
145 lines
2.7 KiB
HCL
terraform {
|
|
required_version = ">= 1.0"
|
|
|
|
required_providers {
|
|
hcloud = {
|
|
source = "hetznercloud/hcloud"
|
|
version = "~> 1.60"
|
|
}
|
|
}
|
|
}
|
|
|
|
provider "hcloud" {
|
|
token = var.hcloud_token
|
|
}
|
|
|
|
resource "hcloud_ssh_key" "deploy" {
|
|
name = "trails-cool-deploy"
|
|
public_key = var.ssh_public_key
|
|
}
|
|
|
|
resource "hcloud_server" "trails" {
|
|
name = "trails-cool"
|
|
server_type = "cx23"
|
|
image = "ubuntu-24.04"
|
|
location = "fsn1"
|
|
ssh_keys = [hcloud_ssh_key.deploy.id]
|
|
|
|
labels = {
|
|
project = "trails-cool"
|
|
}
|
|
|
|
user_data = <<-EOF
|
|
#!/bin/bash
|
|
set -euo pipefail
|
|
|
|
# Install Docker
|
|
curl -fsSL https://get.docker.com | sh
|
|
|
|
# Install Docker Compose plugin
|
|
apt-get install -y docker-compose-plugin
|
|
|
|
# Create app directory
|
|
mkdir -p /opt/trails-cool
|
|
EOF
|
|
}
|
|
|
|
resource "hcloud_firewall" "trails" {
|
|
name = "trails-cool"
|
|
|
|
rule {
|
|
direction = "in"
|
|
protocol = "tcp"
|
|
port = "22"
|
|
source_ips = ["0.0.0.0/0", "::/0"]
|
|
}
|
|
|
|
rule {
|
|
direction = "in"
|
|
protocol = "tcp"
|
|
port = "80"
|
|
source_ips = ["0.0.0.0/0", "::/0"]
|
|
}
|
|
|
|
rule {
|
|
direction = "in"
|
|
protocol = "tcp"
|
|
port = "443"
|
|
source_ips = ["0.0.0.0/0", "::/0"]
|
|
}
|
|
}
|
|
|
|
resource "hcloud_firewall_attachment" "trails" {
|
|
firewall_id = hcloud_firewall.trails.id
|
|
server_ids = [hcloud_server.trails.id]
|
|
}
|
|
|
|
# Reverse DNS
|
|
|
|
resource "hcloud_rdns" "trails_ipv4" {
|
|
server_id = hcloud_server.trails.id
|
|
ip_address = hcloud_server.trails.ipv4_address
|
|
dns_ptr = "trails.cool"
|
|
}
|
|
|
|
resource "hcloud_rdns" "trails_ipv6" {
|
|
server_id = hcloud_server.trails.id
|
|
ip_address = hcloud_server.trails.ipv6_address
|
|
dns_ptr = "trails.cool"
|
|
}
|
|
|
|
# DNS
|
|
|
|
resource "hcloud_zone_rrset" "root_a" {
|
|
zone = "trails.cool"
|
|
name = "@"
|
|
type = "A"
|
|
ttl = 300
|
|
records = [{ value = hcloud_server.trails.ipv4_address }]
|
|
}
|
|
|
|
resource "hcloud_zone_rrset" "root_aaaa" {
|
|
zone = "trails.cool"
|
|
name = "@"
|
|
type = "AAAA"
|
|
ttl = 300
|
|
records = [{ value = hcloud_server.trails.ipv6_address }]
|
|
}
|
|
|
|
resource "hcloud_zone_rrset" "planner_a" {
|
|
zone = "trails.cool"
|
|
name = "planner"
|
|
type = "A"
|
|
ttl = 300
|
|
records = [{ value = hcloud_server.trails.ipv4_address }]
|
|
}
|
|
|
|
resource "hcloud_zone_rrset" "planner_aaaa" {
|
|
zone = "trails.cool"
|
|
name = "planner"
|
|
type = "AAAA"
|
|
ttl = 300
|
|
records = [{ value = hcloud_server.trails.ipv6_address }]
|
|
}
|
|
|
|
resource "hcloud_zone_rrset" "www_cname" {
|
|
zone = "trails.cool"
|
|
name = "www"
|
|
type = "CNAME"
|
|
ttl = 300
|
|
records = [{ value = "trails.cool." }]
|
|
}
|
|
|
|
# Outputs
|
|
|
|
output "server_ip" {
|
|
value = hcloud_server.trails.ipv4_address
|
|
}
|
|
|
|
output "domain" {
|
|
value = "trails.cool"
|
|
}
|
|
|
|
output "planner_domain" {
|
|
value = "planner.trails.cool"
|
|
}
|