875 lines
18 KiB
Terraform
875 lines
18 KiB
Terraform
provider "kubernetes" {
|
|
config_path = "~/.kube/config"
|
|
}
|
|
|
|
variable "domain" {
|
|
type = string
|
|
}
|
|
|
|
variable "smtp" {
|
|
type = object({
|
|
host = string
|
|
username = string
|
|
password = string
|
|
from = string
|
|
})
|
|
}
|
|
|
|
variable "stoat" {
|
|
type = object({
|
|
subdomain = string
|
|
api = object({
|
|
name = optional(string, "stoat-api")
|
|
port = optional(number, 14702)
|
|
image = string
|
|
version = string
|
|
})
|
|
events = object({
|
|
name = optional(string, "stoat-events")
|
|
port = optional(number, 14703)
|
|
image = string
|
|
version = string
|
|
})
|
|
autumn = object({
|
|
name = optional(string, "stoat-autumn")
|
|
port = optional(number, 14704)
|
|
image = string
|
|
version = string
|
|
})
|
|
january = object({
|
|
name = optional(string, "stoat-january")
|
|
port = optional(number, 14705)
|
|
image = string
|
|
version = string
|
|
})
|
|
gifbox = object({
|
|
name = optional(string, "stoat-gifbox")
|
|
port = optional(number, 14706)
|
|
image = string
|
|
version = string
|
|
})
|
|
pushd = object({
|
|
name = optional(string, "stoat-pushd")
|
|
image = string
|
|
version = string
|
|
})
|
|
crond = object({
|
|
name = optional(string, "stoat-crond")
|
|
image = string
|
|
version = string
|
|
})
|
|
voice_ingress = object({
|
|
name = optional(string, "stoat-voice-ingress")
|
|
port = optional(number, 8500)
|
|
image = string
|
|
version = string
|
|
})
|
|
web = object({
|
|
name = optional(string, "stoat-webapp")
|
|
port = optional(number, 80)
|
|
image = string
|
|
version = string
|
|
})
|
|
})
|
|
}
|
|
|
|
resource "kubernetes_namespace_v1" "stoat" {
|
|
metadata {
|
|
name = "stoat"
|
|
}
|
|
}
|
|
|
|
resource "kubernetes_config_map_v1" "Revolt" {
|
|
metadata {
|
|
name = "revolt"
|
|
namespace = kubernetes_namespace_v1.stoat.metadata[0].name
|
|
}
|
|
|
|
data = {
|
|
"Revolt.toml" = templatefile("${path.module}/templates/Revolt.toml.tftpl",
|
|
{
|
|
domain = var.domain
|
|
hostname = "${var.stoat.subdomain}.${var.domain}"
|
|
smtp = var.smtp
|
|
livekit_api_key = var.livekit.api_key
|
|
livekit_secret_key = random_password.livekit_api_secret.result
|
|
minio_host = var.minio.app_name
|
|
minio_user = var.minio.user
|
|
minio_pass = random_password.minio.result
|
|
mongo_host = var.mongo.app_name
|
|
rabbit_host = var.rabbit.app_name
|
|
rabbit_port = var.rabbit.port
|
|
rabbit_user = var.rabbit.user
|
|
rabbit_passwd = random_password.rabbit.result
|
|
redis_host = var.redis.app_name
|
|
})
|
|
"Caddyfile" = templatefile("${path.module}/templates/Caddyfile.tftpl",
|
|
{
|
|
hostname = "${var.stoat.subdomain}.${var.domain}"
|
|
stoat = var.stoat
|
|
})
|
|
}
|
|
}
|
|
|
|
resource "kubernetes_config_map_v1" "env_web" {
|
|
metadata {
|
|
name = "env-web"
|
|
namespace = kubernetes_namespace_v1.stoat.metadata[0].name
|
|
}
|
|
|
|
data = {
|
|
NGINX_HOST = "chat.ruan.fr"
|
|
}
|
|
}
|
|
|
|
resource "kubernetes_ingress_v1" "stoat" {
|
|
metadata {
|
|
name = "stoat"
|
|
namespace = kubernetes_namespace_v1.stoat.metadata[0].name
|
|
|
|
annotations = {
|
|
"cert-manager.io/cluster-issuer" = "letsencrypt"
|
|
}
|
|
}
|
|
|
|
spec {
|
|
tls {
|
|
hosts = [
|
|
"${var.stoat.subdomain}.${var.domain}",
|
|
"api.${var.stoat.subdomain}.${var.domain}",
|
|
"file.${var.stoat.subdomain}.${var.domain}",
|
|
"proxy.${var.stoat.subdomain}.${var.domain}",
|
|
"events.${var.stoat.subdomain}.${var.domain}",
|
|
"gifbox.${var.stoat.subdomain}.${var.domain}",
|
|
]
|
|
secret_name = "stoat-tls"
|
|
}
|
|
|
|
rule {
|
|
host = "${var.stoat.subdomain}.${var.domain}"
|
|
http {
|
|
path {
|
|
path = "/"
|
|
path_type = "Prefix"
|
|
backend {
|
|
service {
|
|
name = kubernetes_service_v1.stoat_caddy.metadata[0].name
|
|
port {
|
|
number = 80
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
rule {
|
|
host = "api.${var.stoat.subdomain}.${var.domain}"
|
|
http {
|
|
path {
|
|
path = "/"
|
|
path_type = "Prefix"
|
|
backend {
|
|
service {
|
|
name = kubernetes_service_v1.stoat_api.metadata[0].name
|
|
port {
|
|
number = var.stoat.api.port
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
rule {
|
|
host = "events.${var.stoat.subdomain}.${var.domain}"
|
|
http {
|
|
path {
|
|
path = "/"
|
|
path_type = "Exact"
|
|
backend {
|
|
service {
|
|
name = kubernetes_service_v1.stoat_events.metadata[0].name
|
|
port {
|
|
number = var.stoat.events.port
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
rule {
|
|
host = "file.${var.stoat.subdomain}.${var.domain}"
|
|
http {
|
|
path {
|
|
path = "/"
|
|
path_type = "Prefix"
|
|
backend {
|
|
service {
|
|
name = kubernetes_service_v1.stoat_autumn.metadata[0].name
|
|
port {
|
|
number = var.stoat.autumn.port
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
rule {
|
|
host = "proxy.${var.stoat.subdomain}.${var.domain}"
|
|
http {
|
|
path {
|
|
path = "/"
|
|
path_type = "Prefix"
|
|
backend {
|
|
service {
|
|
name = kubernetes_service_v1.stoat_january.metadata[0].name
|
|
port {
|
|
number = var.stoat.january.port
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
rule {
|
|
host = "gifbox.${var.stoat.subdomain}.${var.domain}"
|
|
http {
|
|
path {
|
|
path = "/"
|
|
path_type = "Prefix"
|
|
backend {
|
|
service {
|
|
name = kubernetes_service_v1.stoat_gifbox.metadata[0].name
|
|
port {
|
|
number = var.stoat.gifbox.port
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
resource "kubernetes_service_v1" "stoat_caddy" {
|
|
metadata {
|
|
name = "caddy"
|
|
namespace = kubernetes_namespace_v1.stoat.metadata[0].name
|
|
}
|
|
|
|
spec {
|
|
selector = {
|
|
app = "caddy"
|
|
}
|
|
|
|
port {
|
|
port = 80
|
|
target_port = 80
|
|
}
|
|
}
|
|
}
|
|
|
|
resource "kubernetes_deployment_v1" "stoat_caddy" {
|
|
metadata {
|
|
name = "caddy"
|
|
namespace = kubernetes_namespace_v1.stoat.metadata[0].name
|
|
}
|
|
|
|
spec {
|
|
replicas = 1
|
|
selector {
|
|
match_labels = {
|
|
app = "caddy"
|
|
}
|
|
}
|
|
|
|
template {
|
|
metadata {
|
|
labels = {
|
|
"app" = "caddy"
|
|
}
|
|
}
|
|
|
|
spec {
|
|
container {
|
|
name = "caddy"
|
|
image = "docker.io/caddy"
|
|
|
|
port {
|
|
container_port = 80
|
|
}
|
|
|
|
env_from {
|
|
config_map_ref {
|
|
name = kubernetes_config_map_v1.env_web.metadata[0].name
|
|
optional = false
|
|
}
|
|
}
|
|
|
|
volume_mount {
|
|
name = "revolt"
|
|
mount_path = "/etc/caddy/Caddyfile"
|
|
sub_path = "Caddyfile"
|
|
}
|
|
}
|
|
|
|
volume {
|
|
name = "revolt"
|
|
config_map {
|
|
name = kubernetes_config_map_v1.Revolt.metadata[0].name
|
|
optional = false
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
resource "kubernetes_service_v1" "stoat_api" {
|
|
metadata {
|
|
name = var.stoat.api.name
|
|
namespace = kubernetes_namespace_v1.stoat.metadata[0].name
|
|
}
|
|
|
|
spec {
|
|
selector = {
|
|
app = var.stoat.api.name
|
|
}
|
|
|
|
port {
|
|
port = var.stoat.api.port
|
|
target_port = var.stoat.api.port
|
|
}
|
|
}
|
|
}
|
|
|
|
resource "kubernetes_deployment_v1" "stoat_api" {
|
|
metadata {
|
|
name = var.stoat.api.name
|
|
namespace = kubernetes_namespace_v1.stoat.metadata[0].name
|
|
}
|
|
|
|
spec {
|
|
replicas = 1
|
|
selector {
|
|
match_labels = {
|
|
app = var.stoat.api.name
|
|
}
|
|
}
|
|
|
|
template {
|
|
metadata {
|
|
labels = {
|
|
"app" = var.stoat.api.name
|
|
}
|
|
}
|
|
|
|
spec {
|
|
container {
|
|
name = var.stoat.api.name
|
|
image = "${var.stoat.api.image}:${var.stoat.api.version}"
|
|
|
|
port {
|
|
container_port = var.stoat.api.port
|
|
}
|
|
|
|
volume_mount {
|
|
name = "revolt-toml"
|
|
mount_path = "/Revolt.toml"
|
|
sub_path = "Revolt.toml"
|
|
}
|
|
}
|
|
|
|
volume {
|
|
name = "revolt-toml"
|
|
config_map {
|
|
name = kubernetes_config_map_v1.Revolt.metadata[0].name
|
|
optional = false
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
resource "kubernetes_service_v1" "stoat_events" {
|
|
metadata {
|
|
name = var.stoat.events.name
|
|
namespace = kubernetes_namespace_v1.stoat.metadata[0].name
|
|
}
|
|
|
|
spec {
|
|
selector = {
|
|
app = var.stoat.events.name
|
|
}
|
|
|
|
port {
|
|
port = var.stoat.events.port
|
|
target_port = var.stoat.events.port
|
|
}
|
|
}
|
|
}
|
|
|
|
resource "kubernetes_deployment_v1" "stoat_events" {
|
|
metadata {
|
|
name = var.stoat.events.name
|
|
namespace = kubernetes_namespace_v1.stoat.metadata[0].name
|
|
}
|
|
|
|
spec {
|
|
replicas = 1
|
|
selector {
|
|
match_labels = {
|
|
app = var.stoat.events.name
|
|
}
|
|
}
|
|
|
|
template {
|
|
metadata {
|
|
labels = {
|
|
"app" = var.stoat.events.name
|
|
}
|
|
}
|
|
|
|
spec {
|
|
container {
|
|
name = var.stoat.events.name
|
|
image = "${var.stoat.events.image}:${var.stoat.events.version}"
|
|
|
|
port {
|
|
container_port = var.stoat.events.port
|
|
}
|
|
|
|
volume_mount {
|
|
name = "revolt-toml"
|
|
mount_path = "/Revolt.toml"
|
|
sub_path = "Revolt.toml"
|
|
}
|
|
}
|
|
|
|
volume {
|
|
name = "revolt-toml"
|
|
config_map {
|
|
name = kubernetes_config_map_v1.Revolt.metadata[0].name
|
|
optional = false
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
resource "kubernetes_service_v1" "stoat_autumn" {
|
|
metadata {
|
|
name = var.stoat.autumn.name
|
|
namespace = kubernetes_namespace_v1.stoat.metadata[0].name
|
|
}
|
|
|
|
spec {
|
|
selector = {
|
|
app = var.stoat.autumn.name
|
|
}
|
|
|
|
port {
|
|
port = var.stoat.autumn.port
|
|
target_port = var.stoat.autumn.port
|
|
}
|
|
}
|
|
}
|
|
|
|
resource "kubernetes_deployment_v1" "stoat_autumn" {
|
|
metadata {
|
|
name = var.stoat.autumn.name
|
|
namespace = kubernetes_namespace_v1.stoat.metadata[0].name
|
|
}
|
|
|
|
spec {
|
|
replicas = 1
|
|
selector {
|
|
match_labels = {
|
|
app = var.stoat.autumn.name
|
|
}
|
|
}
|
|
|
|
template {
|
|
metadata {
|
|
labels = {
|
|
"app" = var.stoat.autumn.name
|
|
}
|
|
}
|
|
|
|
spec {
|
|
container {
|
|
name = var.stoat.autumn.name
|
|
image = "${var.stoat.autumn.image}:${var.stoat.autumn.version}"
|
|
|
|
port {
|
|
container_port = var.stoat.autumn.port
|
|
}
|
|
|
|
volume_mount {
|
|
name = "revolt-toml"
|
|
mount_path = "/Revolt.toml"
|
|
sub_path = "Revolt.toml"
|
|
}
|
|
}
|
|
|
|
volume {
|
|
name = "revolt-toml"
|
|
config_map {
|
|
name = kubernetes_config_map_v1.Revolt.metadata[0].name
|
|
optional = false
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
resource "kubernetes_service_v1" "stoat_january" {
|
|
metadata {
|
|
name = var.stoat.january.name
|
|
namespace = kubernetes_namespace_v1.stoat.metadata[0].name
|
|
}
|
|
|
|
spec {
|
|
selector = {
|
|
app = var.stoat.january.name
|
|
}
|
|
|
|
port {
|
|
port = var.stoat.january.port
|
|
target_port = var.stoat.january.port
|
|
}
|
|
}
|
|
}
|
|
|
|
resource "kubernetes_deployment_v1" "stoat_january" {
|
|
metadata {
|
|
name = var.stoat.january.name
|
|
namespace = kubernetes_namespace_v1.stoat.metadata[0].name
|
|
}
|
|
|
|
spec {
|
|
replicas = 1
|
|
selector {
|
|
match_labels = {
|
|
app = var.stoat.january.name
|
|
}
|
|
}
|
|
|
|
template {
|
|
metadata {
|
|
labels = {
|
|
"app" = var.stoat.january.name
|
|
}
|
|
}
|
|
|
|
spec {
|
|
container {
|
|
name = var.stoat.january.name
|
|
image = "${var.stoat.january.image}:${var.stoat.january.version}"
|
|
|
|
port {
|
|
container_port = var.stoat.january.port
|
|
}
|
|
|
|
volume_mount {
|
|
name = "revolt-toml"
|
|
mount_path = "/Revolt.toml"
|
|
sub_path = "Revolt.toml"
|
|
}
|
|
}
|
|
|
|
volume {
|
|
name = "revolt-toml"
|
|
config_map {
|
|
name = kubernetes_config_map_v1.Revolt.metadata[0].name
|
|
optional = false
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
resource "kubernetes_service_v1" "stoat_gifbox" {
|
|
metadata {
|
|
name = var.stoat.gifbox.name
|
|
namespace = kubernetes_namespace_v1.stoat.metadata[0].name
|
|
}
|
|
|
|
spec {
|
|
selector = {
|
|
app = var.stoat.gifbox.name
|
|
}
|
|
|
|
port {
|
|
port = var.stoat.gifbox.port
|
|
target_port = var.stoat.gifbox.port
|
|
}
|
|
}
|
|
}
|
|
|
|
resource "kubernetes_deployment_v1" "stoat_gifbox" {
|
|
metadata {
|
|
name = var.stoat.gifbox.name
|
|
namespace = kubernetes_namespace_v1.stoat.metadata[0].name
|
|
}
|
|
|
|
spec {
|
|
replicas = 1
|
|
selector {
|
|
match_labels = {
|
|
app = var.stoat.gifbox.name
|
|
}
|
|
}
|
|
|
|
template {
|
|
metadata {
|
|
labels = {
|
|
"app" = var.stoat.gifbox.name
|
|
}
|
|
}
|
|
|
|
spec {
|
|
container {
|
|
name = var.stoat.gifbox.name
|
|
image = "${var.stoat.gifbox.image}:${var.stoat.gifbox.version}"
|
|
|
|
port {
|
|
container_port = var.stoat.gifbox.port
|
|
}
|
|
|
|
volume_mount {
|
|
name = "revolt-toml"
|
|
mount_path = "/Revolt.toml"
|
|
sub_path = "Revolt.toml"
|
|
}
|
|
}
|
|
|
|
volume {
|
|
name = "revolt-toml"
|
|
config_map {
|
|
name = kubernetes_config_map_v1.Revolt.metadata[0].name
|
|
optional = false
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
resource "kubernetes_deployment_v1" "stoat_pushd" {
|
|
metadata {
|
|
name = var.stoat.pushd.name
|
|
namespace = kubernetes_namespace_v1.stoat.metadata[0].name
|
|
}
|
|
|
|
spec {
|
|
replicas = 1
|
|
selector {
|
|
match_labels = {
|
|
app = var.stoat.pushd.name
|
|
}
|
|
}
|
|
|
|
template {
|
|
metadata {
|
|
labels = {
|
|
"app" = var.stoat.pushd.name
|
|
}
|
|
}
|
|
|
|
spec {
|
|
container {
|
|
name = var.stoat.pushd.name
|
|
image = "${var.stoat.pushd.image}:${var.stoat.pushd.version}"
|
|
|
|
volume_mount {
|
|
name = "revolt-toml"
|
|
mount_path = "/Revolt.toml"
|
|
sub_path = "Revolt.toml"
|
|
}
|
|
}
|
|
|
|
volume {
|
|
name = "revolt-toml"
|
|
config_map {
|
|
name = kubernetes_config_map_v1.Revolt.metadata[0].name
|
|
optional = false
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
resource "kubernetes_deployment_v1" "stoat_crond" {
|
|
metadata {
|
|
name = var.stoat.crond.name
|
|
namespace = kubernetes_namespace_v1.stoat.metadata[0].name
|
|
}
|
|
|
|
spec {
|
|
replicas = 1
|
|
selector {
|
|
match_labels = {
|
|
app = var.stoat.crond.name
|
|
}
|
|
}
|
|
|
|
template {
|
|
metadata {
|
|
labels = {
|
|
"app" = var.stoat.crond.name
|
|
}
|
|
}
|
|
|
|
spec {
|
|
container {
|
|
name = var.stoat.crond.name
|
|
image = "${var.stoat.crond.image}:${var.stoat.crond.version}"
|
|
|
|
volume_mount {
|
|
name = "revolt-toml"
|
|
mount_path = "/Revolt.toml"
|
|
sub_path = "Revolt.toml"
|
|
}
|
|
}
|
|
|
|
volume {
|
|
name = "revolt-toml"
|
|
config_map {
|
|
name = kubernetes_config_map_v1.Revolt.metadata[0].name
|
|
optional = false
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
resource "kubernetes_service_v1" "stoat_voice_ingress" {
|
|
metadata {
|
|
name = var.stoat.voice_ingress.name
|
|
namespace = kubernetes_namespace_v1.stoat.metadata[0].name
|
|
}
|
|
|
|
spec {
|
|
selector = {
|
|
app = var.stoat.voice_ingress.name
|
|
}
|
|
|
|
port {
|
|
port = var.stoat.voice_ingress.port
|
|
target_port = var.stoat.voice_ingress.port
|
|
}
|
|
}
|
|
}
|
|
|
|
resource "kubernetes_deployment_v1" "stoat_voice_ingress" {
|
|
metadata {
|
|
name = var.stoat.voice_ingress.name
|
|
namespace = kubernetes_namespace_v1.stoat.metadata[0].name
|
|
}
|
|
|
|
spec {
|
|
replicas = 1
|
|
selector {
|
|
match_labels = {
|
|
app = var.stoat.voice_ingress.name
|
|
}
|
|
}
|
|
|
|
template {
|
|
metadata {
|
|
labels = {
|
|
"app" = var.stoat.voice_ingress.name
|
|
}
|
|
}
|
|
|
|
spec {
|
|
container {
|
|
name = var.stoat.voice_ingress.name
|
|
image = "${var.stoat.voice_ingress.image}:${var.stoat.voice_ingress.version}"
|
|
|
|
volume_mount {
|
|
name = "revolt-toml"
|
|
mount_path = "/Revolt.toml"
|
|
sub_path = "Revolt.toml"
|
|
}
|
|
}
|
|
|
|
volume {
|
|
name = "revolt-toml"
|
|
config_map {
|
|
name = kubernetes_config_map_v1.Revolt.metadata[0].name
|
|
optional = false
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
resource "kubernetes_service_v1" "stoat_web" {
|
|
metadata {
|
|
name = var.stoat.web.name
|
|
namespace = kubernetes_namespace_v1.stoat.metadata[0].name
|
|
}
|
|
|
|
spec {
|
|
selector = {
|
|
app = var.stoat.web.name
|
|
}
|
|
|
|
port {
|
|
port = var.stoat.web.port
|
|
target_port = var.stoat.web.port
|
|
}
|
|
}
|
|
}
|
|
|
|
resource "kubernetes_deployment_v1" "stoat_web" {
|
|
metadata {
|
|
name = var.stoat.web.name
|
|
namespace = kubernetes_namespace_v1.stoat.metadata[0].name
|
|
}
|
|
|
|
spec {
|
|
replicas = 1
|
|
selector {
|
|
match_labels = {
|
|
app = var.stoat.web.name
|
|
}
|
|
}
|
|
|
|
template {
|
|
metadata {
|
|
labels = {
|
|
"app" = var.stoat.web.name
|
|
}
|
|
}
|
|
|
|
spec {
|
|
container {
|
|
name = var.stoat.web.name
|
|
image = "${var.stoat.web.image}:${var.stoat.web.version}"
|
|
image_pull_policy = "Always"
|
|
|
|
port {
|
|
container_port = var.stoat.web.port
|
|
}
|
|
|
|
env_from {
|
|
config_map_ref {
|
|
name = kubernetes_config_map_v1.env_web.metadata[0].name
|
|
optional = false
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|