diff --git a/deployments/docker-swarm-terraform/main.tf b/deployments/docker-swarm-terraform/main.tf index cd44d56..795f020 100644 --- a/deployments/docker-swarm-terraform/main.tf +++ b/deployments/docker-swarm-terraform/main.tf @@ -1,59 +1,27 @@ -data "docker_registry_image" "app-image" { - name = "capcom6/${var.app-name}:${var.app-version}" -} +module "core" { + source = "./modules/service" -data "docker_network" "proxy" { - name = "proxy" -} + service-name = "service-monitor-core" + service-version = var.app-version + + config-b64 = var.core-config-b64 + env-json-b64 = var.core-env-json-b64 + network-id = docker_network.private.id -resource "docker_image" "app" { - name = data.docker_registry_image.app-image.name - pull_triggers = [data.docker_registry_image.app-image.sha256_digest] - keep_locally = true + depends_on = [docker_service.redis] } -resource "docker_config" "app" { - name = "${var.app-name}-config.yml-${replace(timestamp(), ":", ".")}" - data = var.app-config-b64 +module "bot" { + source = "./modules/service" - lifecycle { - ignore_changes = [name] - create_before_destroy = true - } -} + service-name = "service-monitor-bot" + service-version = var.app-version + + config-b64 = var.bot-config-b64 + env-json-b64 = var.bot-env-json-b64 + + network-id = docker_network.private.id -resource "docker_service" "app" { - name = var.app-name - - task_spec { - container_spec { - image = docker_image.app.image_id - - configs { - config_id = docker_config.app.id - config_name = docker_config.app.name - file_name = "/app/config.yml" - file_uid = 405 - file_gid = 100 - } - - env = jsondecode(base64decode(var.app-env-json-b64)) - } - networks_advanced { - name = data.docker_network.proxy.id - } - - resources { - limits { - # nano_cpus = var.cpu-limit - memory_bytes = var.memory-limit - } - - reservation { - # nano_cpus = 10 * 10000000 - memory_bytes = 16 * 1024 * 1024 - } - } - } + depends_on = [docker_service.redis] } diff --git a/deployments/docker-swarm-terraform/modules/service/main.tf b/deployments/docker-swarm-terraform/modules/service/main.tf new file mode 100644 index 0000000..0829d0c --- /dev/null +++ b/deployments/docker-swarm-terraform/modules/service/main.tf @@ -0,0 +1,78 @@ +variable "service-name" { + type = string +} +variable "service-version" { + type = string +} + +variable "config-b64" { + type = string +} +variable "env-json-b64" { + type = string +} + +variable "network-id" { + type = string +} + +variable "memory-limit" { + default = 32 * 1024 * 1024 +} + +variable "memory-reserve" { + default = 16 * 1024 * 1024 +} + +data "docker_registry_image" "app-image" { + name = "capcom6/${var.service-name}:${var.service-version}" +} + +resource "docker_image" "app" { + name = data.docker_registry_image.app-image.name + pull_triggers = [data.docker_registry_image.app-image.sha256_digest] + keep_locally = true +} + +resource "docker_config" "app" { + name = "${var.service-name}-config.yml-${replace(timestamp(), ":", ".")}" + data = var.config-b64 + + lifecycle { + ignore_changes = [name] + create_before_destroy = true + } +} + +resource "docker_service" "app" { + name = var.service-name + + task_spec { + container_spec { + image = docker_image.app.image_id + + configs { + config_id = docker_config.app.id + config_name = docker_config.app.name + file_name = "/app/config.yml" + file_uid = 405 + file_gid = 100 + } + + env = jsondecode(base64decode(var.env-json-b64)) + } + networks_advanced { + name = var.network-id + } + + resources { + limits { + memory_bytes = var.memory-limit + } + + reservation { + memory_bytes = 16 * 1024 * 1024 + } + } + } +} diff --git a/deployments/docker-swarm-terraform/modules/service/providers.tf b/deployments/docker-swarm-terraform/modules/service/providers.tf new file mode 100644 index 0000000..a238e2d --- /dev/null +++ b/deployments/docker-swarm-terraform/modules/service/providers.tf @@ -0,0 +1,8 @@ +terraform { + required_providers { + docker = { + source = "kreuzwerker/docker" + version = "3.0.2" + } + } +} diff --git a/deployments/docker-swarm-terraform/network.tf b/deployments/docker-swarm-terraform/network.tf new file mode 100644 index 0000000..7af44cb --- /dev/null +++ b/deployments/docker-swarm-terraform/network.tf @@ -0,0 +1,4 @@ +resource "docker_network" "private" { + name = "${var.app-name}-network" + driver = "overlay" +} diff --git a/deployments/docker-swarm-terraform/redis.tf b/deployments/docker-swarm-terraform/redis.tf new file mode 100644 index 0000000..d386581 --- /dev/null +++ b/deployments/docker-swarm-terraform/redis.tf @@ -0,0 +1,32 @@ +data "docker_registry_image" "redis" { + name = "redis:7-alpine" +} + +resource "docker_image" "redis" { + name = data.docker_registry_image.redis.name + pull_triggers = [data.docker_registry_image.redis.sha256_digest] + keep_locally = true +} + +resource "docker_service" "redis" { + name = "${var.app-name}-redis" + + task_spec { + container_spec { + image = docker_image.redis.image_id + } + networks_advanced { + name = docker_network.private.id + } + + # resources { + # limits { + # memory_bytes = var.memory-limit + # } + + # reservation { + # memory_bytes = 16 * 1024 * 1024 + # } + # } + } +} diff --git a/deployments/docker-swarm-terraform/variables.tf b/deployments/docker-swarm-terraform/variables.tf index 86e08eb..ddf3730 100644 --- a/deployments/docker-swarm-terraform/variables.tf +++ b/deployments/docker-swarm-terraform/variables.tf @@ -12,29 +12,25 @@ variable "app-name" { variable "app-version" { type = string description = "Version of Docker image of app" - default = "1.0" + default = "master" } -variable "app-config-b64" { - type = string - description = "Application config file" - sensitive = true +variable "core-config-b64" { + type = string + sensitive = true } -variable "app-env-json-b64" { - type = string - description = "Application env file in JSON format" - sensitive = true +variable "bot-config-b64" { + type = string + sensitive = true } -variable "cpu-limit" { - type = number - description = "CPU limit in nanoseconds" - default = 100 * 10000000 +variable "core-env-json-b64" { + type = string + sensitive = true } -variable "memory-limit" { - type = number - description = "Memory limit in bytes" - default = 32 * 1024 * 1024 +variable "bot-env-json-b64" { + type = string + sensitive = true }