fix: déploiement pour le frontend
This commit is contained in:
@@ -30,12 +30,19 @@ COPY --chown=root:root nginx.conf /etc/nginx/nginx.conf
|
|||||||
RUN chmod 755 /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 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
|
RUN chmod 755 /usr/share/nginx/html
|
||||||
|
|
||||||
|
|
||||||
# Create necessary directories with proper permissions for nginx
|
# Create necessary directories with proper permissions for nginx
|
||||||
RUN mkdir -p /var/log/nginx /var/cache/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
|
# Use a non-root user for security best practices
|
||||||
USER nginx
|
USER nginx
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
worker_processes auto;
|
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;
|
pid /tmp/nginx.pid;
|
||||||
|
|
||||||
events {
|
events {
|
||||||
@@ -9,15 +9,14 @@ events {
|
|||||||
http {
|
http {
|
||||||
include /etc/nginx/mime.types;
|
include /etc/nginx/mime.types;
|
||||||
default_type application/octet-stream;
|
default_type application/octet-stream;
|
||||||
|
access_log /dev/null; # ← Idem pour access logs
|
||||||
|
|
||||||
sendfile on;
|
sendfile on;
|
||||||
keepalive_timeout 65;
|
keepalive_timeout 65;
|
||||||
|
|
||||||
|
|
||||||
server {
|
server {
|
||||||
listen 3000;
|
listen 3000;
|
||||||
server_name _;
|
server_name _;
|
||||||
|
|
||||||
root /usr/share/nginx/html;
|
root /usr/share/nginx/html;
|
||||||
index index.html;
|
index index.html;
|
||||||
|
|
||||||
@@ -29,4 +28,4 @@ http {
|
|||||||
deny all;
|
deny all;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -70,6 +70,24 @@ resource "docker_container" "frontend" {
|
|||||||
depends_on = [docker_image.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
|
# Déploiement du container sur le serveur via SSH
|
||||||
resource "null_resource" "deploy_to_server" {
|
resource "null_resource" "deploy_to_server" {
|
||||||
depends_on = [docker_image.frontend]
|
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 build -t ${local.image_name}:${local.image_tag} .",
|
||||||
"sudo docker run -d \\",
|
"sudo docker run -d \\",
|
||||||
" --name ${local.container_name} \\",
|
" --name ${local.container_name} \\",
|
||||||
|
" --network enervision_default \\",
|
||||||
|
" --network-alias frontend \\",
|
||||||
" -p ${var.frontend_port}:3000 \\",
|
" -p ${var.frontend_port}:3000 \\",
|
||||||
" --restart always \\",
|
" --restart always \\",
|
||||||
" -v /var/log/enervision:/var/log/nginx \\",
|
" -v /var/log/enervision:/var/log/nginx \\",
|
||||||
|
|||||||
@@ -1,57 +1,125 @@
|
|||||||
locals {
|
locals {
|
||||||
frontend_environments = {
|
frontend_environments = {
|
||||||
prod = {
|
prod = {
|
||||||
source_dir = "${path.root}/../../../apps/frontend/dist/frontend-prod/browser"
|
source_dir = "${path.root}/../../../apps/frontend/dist/frontend/browser"
|
||||||
domain = "enervision"
|
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]
|
selected_frontend = local.frontend_environments[var.deployment_environment]
|
||||||
}
|
}
|
||||||
|
|
||||||
resource "null_resource" "frontend" {
|
provider "docker" {
|
||||||
depends_on = [module.k3s]
|
host = var.docker_host
|
||||||
|
}
|
||||||
|
|
||||||
|
# Build le front
|
||||||
|
resource "null_resource" "build_frontend" {
|
||||||
triggers = {
|
triggers = {
|
||||||
environment = var.deployment_environment
|
frontend_files = sha256(join("", [
|
||||||
|
for file in fileset(local.frontend_dir, "src/**,package.json") :
|
||||||
build_hash = sha256(join("", [
|
filesha256("${local.frontend_dir}/${file}")
|
||||||
for file in fileset("${path.root}/../../../apps/frontend/dist/frontend/browser", "**") :
|
|
||||||
filesha256("${path.root}/../../../apps/frontend/dist/frontend/browser/${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 {
|
connection {
|
||||||
type = "ssh"
|
type = "ssh"
|
||||||
host = var.ssh_host
|
host = var.ssh_host
|
||||||
port = var.ssh_port
|
port = var.ssh_port
|
||||||
user = var.ssh_user
|
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
|
# Copie le Dockerfile et nginx.conf
|
||||||
// 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
|
|
||||||
provisioner "file" {
|
provisioner "file" {
|
||||||
source = "${path.root}/../../../apps/frontend/dist/frontend/browser/"
|
source = "${local.frontend_dir}/Dockerfile"
|
||||||
destination = "/tmp/enervision-frontend"
|
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" {
|
provisioner "remote-exec" {
|
||||||
inline = [
|
inline = [
|
||||||
"sudo cp -r /tmp/enervision-frontend/* /var/www/enervision/",
|
"cd /tmp/frontend",
|
||||||
"sudo chown -R www-data:www-data /var/www/enervision"
|
"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}"
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user