From 99db807e3ccbda7c0c48d2b0bc74fda3b08d2125 Mon Sep 17 00:00:00 2001 From: ineszang44 Date: Fri, 18 Sep 2026 15:41:54 +0200 Subject: [PATCH] =?UTF-8?q?feat:=20cr=C3=A9ation=20auto=20de=20l'image=20e?= =?UTF-8?q?t=20du=20conteneur?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- infra/terraform/environments/dev/frontend.tf | 129 ++++++++++++------ infra/terraform/environments/dev/variables.tf | 18 +++ 2 files changed, 108 insertions(+), 39 deletions(-) diff --git a/infra/terraform/environments/dev/frontend.tf b/infra/terraform/environments/dev/frontend.tf index 1af27ad..e766fc7 100644 --- a/infra/terraform/environments/dev/frontend.tf +++ b/infra/terraform/environments/dev/frontend.tf @@ -6,69 +6,120 @@ locals { } } + frontend_dir = "../../../../apps/frontend" + image_name = "enervision-front" + image_tag = "latest" + container_name = "enervision-frontend" + selected_frontend = local.frontend_environments[var.deployment_environment] } provider "docker" { - host = "npipe:////.//pipe//docker_cli" + host = var.docker_host } -resource "docker_image" "frontend" { - name = "enervision-front:latest" - keep_locally = false - - depends_on = [module.k3s] - +# Build le front +resource "null_resource" "build_frontend" { triggers = { - environment = var.deployment_environment - - build_hash = sha256(join("", [ - for file in fileset(local.selected_frontend.source_dir, "**") : - filesha256("${local.selected_frontend.source_dir}/${file}") + frontend_files = sha256(join("", [ + for file in fileset(local.frontend_dir, "src/**,package.json") : + filesha256("${local.frontend_dir}/${file}") ])) } - // Variables pour la connexion SSH + provisioner "local-exec" { + command = "cd ${local.frontend_dir} && npm ci && npm run build" + } +} + +# Build l'image docker du front +resource "docker_image" "frontend" { + name = "${local.image_name}:${local.image_tag}" + + build { + context = local.frontend_dir + dockerfile = "Dockerfile" + } + + triggers = { + build_hash = sha256(join("", [ + for file in fileset(local.frontend_dir, "**") : + filesha256("${local.frontend_dir}/${file}") + ])) + } + + depends_on = [null_resource.build_frontend] +} + +# Création du container Docker +resource "docker_container" "frontend" { + image = docker_image.frontend.image_id + name = local.container_name + + ports { + internal = 3000 + external = var.frontend_port + } + + # Volume pour les logs + volumes { + host_path = "/var/log/enervision" + container_path = "/var/log/nginx" + } + + depends_on = [docker_image.frontend] +} + +# Déploiement du container sur le serveur via SSH +resource "null_resource" "deploy_to_server" { + depends_on = [docker_image.frontend] + + triggers = { + image_id = docker_image.frontend.image_id + } + connection { type = "ssh" host = var.ssh_host port = var.ssh_port user = var.ssh_user password = var.ssh_password - private_key = file(pathexpand(var.ssh_private_key_path)) + private_key = try(file(pathexpand(var.ssh_private_key_path)), null) + timeout = "5m" } - // Lancement de script en SSH avec remote-exec - // Installation de Nginx et initialisation du répertoire du frontend - provisioner "remote-exec" { - inline = [ - "sudo apt-get update", - "sudo apt-get install -y nginx", - "sudo mkdir -p /var/www/enervision", - "sudo rm -rf /var/www/enervision/*" - ] - } - - // Copie des fichiers vers le serveur + # Copie le Dockerfile et nginx.conf provisioner "file" { - source = "${local.selected_frontend.source_dir}/" - destination = "/tmp/enervision-frontend" + source = "${local.frontend_dir}/Dockerfile" + destination = "/tmp/Dockerfile" } - // Déplacement des fichiers + provisioner "file" { + source = "${local.frontend_dir}/nginx.conf" + destination = "/tmp/nginx.conf" + } + + # Copie les sources pour le build + provisioner "file" { + source = "${local.frontend_dir}/" + destination = "/tmp/frontend/" + } + + # Build et lance le container sur le serveur provisioner "remote-exec" { inline = [ - "sudo cp -r /tmp/enervision-frontend/ /var/www/enervision/", - "sudo chown -R www-data:www-data /var/www/enervision" + "cd /tmp/frontend", + "sudo docker stop ${local.container_name} 2>/dev/null || true", + "sudo docker rm ${local.container_name} 2>/dev/null || true", + "sudo docker build -t ${local.image_name}:${local.image_tag} .", + "sudo docker run -d \\", + " --name ${local.container_name} \\", + " -p ${var.frontend_port}:3000 \\", + " --restart always \\", + " -v /var/log/enervision:/var/log/nginx \\", + " ${local.image_name}:${local.image_tag}" ] } } -resource "docker_container" "nginx" { - image = "enervision-front:latest" - name = "front" - ports { - internal = 4200 - external = 3000 - } -} + diff --git a/infra/terraform/environments/dev/variables.tf b/infra/terraform/environments/dev/variables.tf index 0ff8e38..4cb6e7e 100644 --- a/infra/terraform/environments/dev/variables.tf +++ b/infra/terraform/environments/dev/variables.tf @@ -26,6 +26,24 @@ variable "ssh_password" { sensitive = true } +variable "remote_path" { + type = string + description = "Chemin distant sur le serveur pour le deploiement." + default = "/var/www/enervision" +} + +variable "docker_host" { + type = string + default = "npipe:////.//pipe//docker_engine" + description = "Host Docker (local ou distant)" +} + +variable "frontend_port" { + type = number + default = 3000 + description = "Port externe du frontend" +} + variable "k3s_version" { type = string description = "Version k3s a epingler pour un deploiement reproductible (ex: v1.31.5+k3s1). Voir https://github.com/k3s-io/k3s/releases."