feat: création auto de l'image et du conteneur

This commit is contained in:
ineszang44
2026-09-18 15:41:54 +02:00
parent 47c4fd445b
commit 99db807e3c
2 changed files with 108 additions and 39 deletions
+90 -39
View File
@@ -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
}
}