diff --git a/Jenkins/Terraform/conf/cloud-init.packages.yaml b/Jenkins/Terraform/conf/cloud-init.packages.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..62c3a501b56816cea5233c45b5f620338182c24b
--- /dev/null
+++ b/Jenkins/Terraform/conf/cloud-init.packages.yaml
@@ -0,0 +1,31 @@
+#cloud-config
+---
+
+# package_update: true
+# package_upgrade: true
+
+groups:
+  - docker
+
+system_info:
+  default_user:
+    groups: [docker]
+
+# add any basic packages here:
+packages:
+  - curl
+  - nano
+  - ripgrep
+  - docker.io
+  - bash-completion
+
+# SH commands to install jenkns
+runcmd:
+  - sudo yum update -y  # updates the package list and upgrades installed packages on the system
+  - sudo wget -O /etc/yum.repos.d/jenkins.repo https://pkg.jenkins.io/redhat-stable/jenkins.repo  #downloads the Jenkins repository configuration file and saves it to /etc/yum.repos.d/jenkins.repo
+  - sudo rpm --import https://pkg.jenkins.io/redhat-stable/jenkins.io-2023.key  #imports the GPG key for the Jenkins repository. This key is used to verify the authenticity of the Jenkins packages
+  - sudo yum upgrade -y #  upgrades packages again, which might be necessary to ensure that any new dependencies required by Jenkins are installed
+  - sudo dnf install java-11-amazon-corretto -y  # installs Amazon Corretto 11, which is a required dependency for Jenkins.
+  - sudo yum install jenkins -y  #installs Jenkins itself
+  - sudo systemctl enable jenkins  #enables the Jenkins service to start automatically at boot time
+  - sudo systemctl start jenkins   #starts the Jenkins service immediately
diff --git a/Jenkins/Terraform/conf/cloud-init.users.yaml b/Jenkins/Terraform/conf/cloud-init.users.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..201c6c0f3e1f9aff03126232dc297b7639755392
--- /dev/null
+++ b/Jenkins/Terraform/conf/cloud-init.users.yaml
@@ -0,0 +1,15 @@
+#cloud-config
+---
+groups:
+  - terraform
+
+system_info:
+  default_user:
+    name: terraform
+    gecos: terraform
+    primary_group: terraform
+    groups: [users, admin, sudo]
+    shell: /bin/bash
+    sudo: ALL=(ALL) NOPASSWD:ALL
+    ssh_authorized_keys:
+      - ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAICd2om++e154/EKtD66CaRELfJ/lbzum44EqLbRKjjuQ terraform@TF-lab
diff --git a/Jenkins/Terraform/main.tf b/Jenkins/Terraform/main.tf
new file mode 100644
index 0000000000000000000000000000000000000000..2a2903daa365d253d45f4fdf474d5e2a1d1d15dd
--- /dev/null
+++ b/Jenkins/Terraform/main.tf
@@ -0,0 +1,164 @@
+# terraform apply -var-file="terraform.tfvars" -auto-approve
+
+terraform {
+  required_providers {
+    openstack = {
+      source  = "terraform-provider-openstack/openstack"
+      version = "~> 3.0.0"
+    }
+    aws = {
+      source  = "hashicorp/aws"
+      version = "~> 5.0.0"
+    }
+    local = {
+      source  = "hashicorp/local"
+      version = "~> 2.0"
+    }
+  }
+  required_version = ">= 1.9.0"
+}
+
+# Configure the OpenStack Provider
+provider "openstack" {
+  cloud = "engines"
+}
+
+resource "tls_private_key" "my_generated_key" {
+  algorithm = "RSA"
+  rsa_bits  = 2048
+}
+
+resource "openstack_compute_keypair_v2" "my_keypair" {
+  name       = "my-keypair"
+  public_key = tls_private_key.my_generated_key.public_key_openssh
+}
+
+resource "local_file" "private_key" {
+  content  = tls_private_key.my_generated_key.private_key_pem
+  filename = "${path.module}/private_key.pem"
+}
+
+resource "openstack_compute_instance_v2" "app_server" {
+  name        = var.instance_name
+  image_id    = "654bf798-579b-47aa-a7f7-8a8798c9779d"
+  flavor_name = "m1.medium"
+  key_pair    = openstack_compute_keypair_v2.my_keypair.name
+
+  security_groups = ["default", "secgrp_1"]
+  user_data = data.cloudinit_config.my_config.rendered
+}
+
+# Network configuration
+resource "openstack_networking_secgroup_v2" "secgrp_1" {
+  name = "secgrp_1"
+}
+
+resource "openstack_networking_secgroup_rule_v2" "secgroup_rule_1" {
+  direction         = "ingress"
+  ethertype         = "IPv4"
+  protocol          = "icmp"
+  remote_ip_prefix  = "0.0.0.0/0"
+  security_group_id = openstack_networking_secgroup_v2.secgrp_1.id
+}
+
+resource "openstack_networking_secgroup_rule_v2" "secgroup_rule_2" {
+  direction         = "ingress"
+  ethertype         = "IPv4"
+  protocol          = "tcp"
+  port_range_min    = 22
+  port_range_max    = 22
+  remote_ip_prefix  = "0.0.0.0/0"
+  security_group_id = openstack_networking_secgroup_v2.secgrp_1.id
+}
+
+resource "openstack_networking_secgroup_rule_v2" "secgroup_rule_3" {
+  direction         = "ingress"
+  ethertype         = "IPv4"
+  protocol          = "tcp"
+  port_range_min    = 443
+  port_range_max    = 443
+  remote_ip_prefix  = "0.0.0.0/0"
+  security_group_id = openstack_networking_secgroup_v2.secgrp_1.id
+}
+
+resource "openstack_networking_secgroup_rule_v2" "secgroup_rule_4" {
+  direction         = "ingress"
+  ethertype         = "IPv4"
+  protocol          = "tcp"
+  port_range_min    = 8080
+  port_range_max    = 8080
+  remote_ip_prefix  = "0.0.0.0/0"
+  security_group_id = openstack_networking_secgroup_v2.secgrp_1.id
+}
+
+resource "openstack_networking_floatingip_v2" "fip_1" {
+  pool        = "public"
+  description = "TF-Lab"
+}
+
+data "openstack_networking_port_v2" "port" {
+  device_id  = openstack_compute_instance_v2.app_server.id
+  network_id = openstack_compute_instance_v2.app_server.network.0.uuid
+}
+
+resource "openstack_networking_floatingip_associate_v2" "fip_associate" {
+  floating_ip = openstack_networking_floatingip_v2.fip_1.address
+  port_id     = data.openstack_networking_port_v2.port.id
+}
+
+data "cloudinit_config" "my_config" {
+  gzip          = false
+  base64_encode = false
+
+  part {
+    filename     = "file-1"
+    content_type = "text/cloud-config"
+    content      = file("conf/cloud-init.users.yaml")
+    merge_type   = "list(append)+dict(no_replace,recurse_list)"
+  }
+
+  part {
+    filename     = "file-2"
+    content_type = "text/cloud-config"
+    content      = file("conf/cloud-init.packages.yaml")
+    merge_type   = "list(append)+dict(no_replace,recurse_list)"
+  }
+}
+
+# Configuration du provider AWS pour OpenStack Swift (S3-compatible)
+provider "aws" {
+  region                      = "us-east-1"
+  skip_credentials_validation = true
+  skip_requesting_account_id  = true
+  access_key                  = var.os_access_key
+  secret_key                  = var.os_secret_key
+
+  endpoints {
+    s3 = "https://os.zhdk.cloud.switch.ch"
+  }
+}
+
+# Création d'un conteneur (équivalent à un bucket S3)
+resource "aws_s3_bucket" "bucket" {
+  bucket = var.container_name
+}
+
+resource "aws_s3_bucket_policy" "public_policy" {
+  bucket = aws_s3_bucket.bucket.id
+
+  policy = jsonencode({
+    Version = "2012-10-17"
+    Statement = [
+      {
+        Effect = "Allow"
+        Principal = "*"
+        Action = [
+          "s3:GetObject",
+          "s3:PutObject",
+          "s3:DeleteObject"
+        ]
+        Resource = "${aws_s3_bucket.bucket.arn}/*"
+      }
+    ]
+  })
+}
\ No newline at end of file
diff --git a/Jenkins/Terraform/terraform.tfvars b/Jenkins/Terraform/terraform.tfvars
new file mode 100644
index 0000000000000000000000000000000000000000..6192502d2f4213dd3b4cafc46ecd987488577baa
--- /dev/null
+++ b/Jenkins/Terraform/terraform.tfvars
@@ -0,0 +1,5 @@
+# openstack --os-cloud=engines ec2 credential list
+
+os_access_key = "3d134a2f61fd4fd8a1e73cbf54058c69"
+os_secret_key = "ed64900428d64167b3d021a0a33e5f7d"
+
diff --git a/Jenkins/Terraform/varables.tf b/Jenkins/Terraform/varables.tf
new file mode 100644
index 0000000000000000000000000000000000000000..3100dfec80e4184fd66cb74d8ad9bc8297d0f30e
--- /dev/null
+++ b/Jenkins/Terraform/varables.tf
@@ -0,0 +1,22 @@
+variable "instance_name" {
+  description = "Value of the instance's name tag"
+  type        = string
+  default     = "Jenkins"
+}
+
+variable "container_name" {
+  description = "Name of the OpenStack Swift container"
+  type        = string
+  default     = "Jenkins-Server"
+}
+
+# Variables nécessaires
+variable "os_access_key" {
+  description = "OpenStack Swift Access Key"
+  type        = string
+}
+
+variable "os_secret_key" {
+  description = "OpenStack Swift Secret Key"
+  type        = string
+}