diff --git a/apps/frontend/Dockerfile b/apps/frontend/Dockerfile index 3d6088b..43e3634 100644 --- a/apps/frontend/Dockerfile +++ b/apps/frontend/Dockerfile @@ -30,12 +30,19 @@ COPY --chown=root:root nginx.conf /etc/nginx/nginx.conf RUN chmod 755 /etc/nginx/nginx.conf # Copy the static build output from the build stage to Nginx's default HTML serving directory -COPY --chown=root:root --from=builder /app/dist/*/browser /usr/share/nginx/html +COPY --chown=root:root --from=builder /app/dist/frontend/browser /usr/share/nginx/html RUN chmod 755 /usr/share/nginx/html + # Create necessary directories with proper permissions for nginx RUN mkdir -p /var/log/nginx /var/cache/nginx && \ - chown -R nginx:nginx /var/log/nginx /var/cache/nginx /usr/share/nginx/html + chown -R nginx:nginx /var/log/nginx /var/cache/nginx /usr/share/nginx/html &&\ + chmod 755 /var/log/nginx /var/log + +# Permissions appropriées +RUN find /usr/share/nginx/html -type f -exec chmod 644 {} \; && \ + find /usr/share/nginx/html -type d -exec chmod 755 {} \; && \ + chown -R nginx:nginx /var/log/nginx /var/cache/nginx # Use a non-root user for security best practices USER nginx diff --git a/apps/frontend/nginx.conf b/apps/frontend/nginx.conf index 08e703d..13b1816 100644 --- a/apps/frontend/nginx.conf +++ b/apps/frontend/nginx.conf @@ -1,5 +1,5 @@ worker_processes auto; -error_log /var/log/nginx/error.log warn; +error_log /dev/null warn; # ← Envoyer les logs vers /dev/null pid /tmp/nginx.pid; events { @@ -9,15 +9,14 @@ events { http { include /etc/nginx/mime.types; default_type application/octet-stream; + access_log /dev/null; # ← Idem pour access logs sendfile on; keepalive_timeout 65; - server { listen 3000; server_name _; - root /usr/share/nginx/html; index index.html; @@ -29,4 +28,4 @@ http { deny all; } } -} +} \ No newline at end of file diff --git a/infra/terraform/environments/dev/frontend.tf b/infra/terraform/environments/dev/frontend.tf index 1aaaad4..298d7e0 100644 --- a/infra/terraform/environments/dev/frontend.tf +++ b/infra/terraform/environments/dev/frontend.tf @@ -70,6 +70,24 @@ resource "docker_container" "frontend" { depends_on = [docker_image.frontend] } +resource "null_resource" "create_network" { + provisioner "remote-exec" { + connection { + type = "ssh" + host = var.ssh_host + port = var.ssh_port + user = var.ssh_user + password = var.ssh_password + private_key = try(file(pathexpand(var.ssh_private_key_path)), null) + timeout = "5m" + } + + inline = [ + "sudo docker network create enervision_default 2>/dev/null || true" + ] + } +} + # Déploiement du container sur le serveur via SSH resource "null_resource" "deploy_to_server" { depends_on = [docker_image.frontend] @@ -114,6 +132,8 @@ resource "null_resource" "deploy_to_server" { "sudo docker build -t ${local.image_name}:${local.image_tag} .", "sudo docker run -d \\", " --name ${local.container_name} \\", + " --network enervision_default \\", + " --network-alias frontend \\", " -p ${var.frontend_port}:3000 \\", " --restart always \\", " -v /var/log/enervision:/var/log/nginx \\", diff --git a/infra/terraform/environments/prod/frontend.tf b/infra/terraform/environments/prod/frontend.tf index 8d55bdb..e28a678 100644 --- a/infra/terraform/environments/prod/frontend.tf +++ b/infra/terraform/environments/prod/frontend.tf @@ -1,57 +1,125 @@ locals { frontend_environments = { prod = { - source_dir = "${path.root}/../../../apps/frontend/dist/frontend-prod/browser" + source_dir = "${path.root}/../../../apps/frontend/dist/frontend/browser" domain = "enervision" } } + frontend_dir = "../../../../apps/frontend" + image_name = "enervision-front" + image_tag = "latest" + container_name = "enervision-frontend" + selected_frontend = local.frontend_environments[var.deployment_environment] } -resource "null_resource" "frontend" { - depends_on = [module.k3s] +provider "docker" { + host = var.docker_host +} +# Build le front +resource "null_resource" "build_frontend" { triggers = { - environment = var.deployment_environment - - build_hash = sha256(join("", [ - for file in fileset("${path.root}/../../../apps/frontend/dist/frontend/browser", "**") : - filesha256("${path.root}/../../../apps/frontend/dist/frontend/browser/${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 && chmod -R +x node_modules/@angular/cli/bin && chmod -R +x node_modules/.bin && npm exec ng 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 - private_key = file(pathexpand(var.ssh_private_key_path)) + password = var.ssh_password + 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 = "${path.root}/../../../apps/frontend/dist/frontend/browser/" - 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} \\", + " --network enervision_default \\", + " --network-alias frontend \\", + " -p ${var.frontend_port}:3000 \\", + " --restart always \\", + " -v /var/log/enervision:/var/log/nginx \\", + " ${local.image_name}:${local.image_tag}" ] } } \ No newline at end of file