Skip to content

Commit abd35d6

Browse files
committed
Final Push
1 parent 73d4056 commit abd35d6

File tree

8 files changed

+468
-0
lines changed

8 files changed

+468
-0
lines changed

files/traefik.service

+14
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
[Unit]
2+
Description=Traefik
3+
After=network.target
4+
5+
[Service]
6+
Type=simple
7+
User=root
8+
Group=root
9+
EnvironmentFile=/etc/traefik/cloudflare.env
10+
ExecStart=/usr/local/bin/traefik --configfile=/etc/traefik/traefik.toml
11+
Restart=on-failure
12+
13+
[Install]
14+
WantedBy=multi-user.target

files/traefik.toml

+24
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
[entryPoints]
2+
[entryPoints.web]
3+
address = ":80"
4+
[entryPoints.web.http.redirections.entryPoint]
5+
to = "websecure"
6+
scheme = "https"
7+
8+
[entryPoints.websecure]
9+
address = ":443"
10+
11+
[api]
12+
dashboard = true
13+
insecure = true
14+
15+
[providers.file]
16+
directory = "/etc/traefik/config"
17+
watch = true
18+
19+
[certificatesResolvers.cloudflare.acme]
20+
21+
storage = "/etc/traefik/acme/acme.json"
22+
[certificatesResolvers.cloudflare.acme.dnsChallenge]
23+
provider = "cloudflare"
24+
delayBeforeCheck = 0

main.tf

+173
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,173 @@
1+
terraform {
2+
required_providers {
3+
cloudflare = {
4+
source = "cloudflare/cloudflare"
5+
version = "~> 4.0"
6+
}
7+
null = {
8+
source = "hashicorp/null"
9+
version = "~> 3.0"
10+
}
11+
aws = {
12+
source = "hashicorp/aws"
13+
version = "~> 4.0"
14+
}
15+
}
16+
17+
backend "s3" {
18+
bucket = ""
19+
key = ""
20+
region = ""
21+
22+
endpoints = {
23+
s3 = ""
24+
}
25+
access_key = ""
26+
secret_key = ""
27+
28+
skip_credentials_validation = true
29+
skip_metadata_api_check = true
30+
skip_region_validation = true
31+
skip_requesting_account_id = true
32+
use_path_style = true
33+
}
34+
}
35+
36+
provider "cloudflare" {
37+
email = var.cloudflare_api_email
38+
api_key = var.cloudflare_api_key
39+
}
40+
41+
42+
# AWS Provider for Minio
43+
provider "aws" {
44+
region = "us-east-1"
45+
46+
# Minio-specific settings
47+
skip_credentials_validation = true
48+
skip_metadata_api_check = true
49+
skip_region_validation = true
50+
skip_requesting_account_id = true
51+
52+
# Endpoint configuration
53+
endpoints {
54+
s3 = ""
55+
}
56+
57+
# Access credentials
58+
access_key = ""
59+
secret_key = ""
60+
}
61+
62+
# Create Cloudflare Records
63+
64+
resource "cloudflare_record" "sonarqube" {
65+
zone_id = var.cloudflare_zone_id
66+
name = "sonarqube"
67+
content = var.controller2_server_ip
68+
type = "A"
69+
proxied = false
70+
}
71+
72+
provider "null" {}
73+
74+
# Modules for create Services
75+
76+
module "service_sonarqube" {
77+
source = "./modules/traefik"
78+
79+
cloudflare_email = var.cloudflare_api_email
80+
cloudflare_api_token = var.cloudflare_api_key
81+
82+
server_two_ip = var.controller2_server_ip
83+
ssh_user = var.ssh_user
84+
ssh_private_key_path = var.ssh_private_key_path
85+
86+
service_name = "sonarqube"
87+
domain = "sonarqube.yash.com"
88+
backend_url = "http://192.168.8.1:9000"
89+
entry_points = ["websecure"]
90+
}
91+
92+
# Treafik Deployment
93+
94+
resource "null_resource" "traefik_deployment" {
95+
connection {
96+
type = "ssh"
97+
user = var.ssh_user
98+
private_key = file(var.ssh_private_key_path)
99+
host = var.controller2_server_ip
100+
}
101+
102+
# Copy Treafik Setup Script
103+
provisioner "file" {
104+
source = "${path.module}/scripts/setup_traefik.sh"
105+
destination = "/tmp/setup_traefik.sh"
106+
}
107+
108+
# Copy Treafik cleanup for Terraform Destroy
109+
110+
provisioner "file" {
111+
source = "${path.module}/scripts/clean_treafik.sh"
112+
destination = "/tmp/clean_treafik.sh"
113+
}
114+
115+
# Copy Treafik configuration files
116+
117+
provisioner "file" {
118+
source = "${path.module}/files/traefik.toml"
119+
destination = "/tmp/traefik.toml"
120+
}
121+
122+
provisioner "file" {
123+
source = "${path.module}/files/traefik.service"
124+
destination = "/tmp/traefik.service"
125+
}
126+
127+
# Execute Treafik setup
128+
129+
provisioner "remote-exec" {
130+
inline = [
131+
"chmod +x /tmp/setup_traefik.sh",
132+
"chmod +x /tmp/clean_treafik.sh",
133+
"sudo /tmp/setup_traefik.sh '${var.cloudflare_api_email}' '${var.cloudflare_api_token}' '${var.domain_name}'"
134+
]
135+
}
136+
137+
# Setup Trigger For Cleanup
138+
139+
triggers = {
140+
server_ip = var.controller2_server_ip
141+
ssh_user = var.ssh_user
142+
ssh_private_key = var.ssh_private_key_path
143+
}
144+
}
145+
146+
resource "null_resource" "traefik_cleanup" {
147+
depends_on = [null_resource.traefik_deployment]
148+
149+
triggers = {
150+
deployment_id = null_resource.traefik_deployment.id
151+
server_ip = null_resource.traefik_deployment.triggers.server_ip
152+
ssh_user = null_resource.traefik_deployment.triggers.ssh_user
153+
ssh_private_key = null_resource.traefik_deployment.triggers.ssh_private_key
154+
}
155+
156+
# Run with Terraform Destroy
157+
158+
provisioner "remote-exec" {
159+
when = destroy
160+
161+
connection {
162+
type = "ssh"
163+
user = self.triggers.ssh_user
164+
private_key = file(self.triggers.ssh_private_key)
165+
host = self.triggers.server_ip
166+
}
167+
168+
inline = [
169+
"echo 'Running cleanup script...'",
170+
"sudo /tmp/clean_treafik.sh || echo 'Cleanup script failed, but continuing'"
171+
]
172+
}
173+
}

modules/treafik/main.tf

+117
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,117 @@
1+
# variables For Modules
2+
3+
variable "server_two_ip" {
4+
description = "IP address of the server running Traefik"
5+
type = string
6+
}
7+
8+
variable "ssh_user" {
9+
description = "SSH username to connect to the server"
10+
type = string
11+
}
12+
13+
variable "ssh_private_key_path" {
14+
description = "Path to the SSH private key"
15+
type = string
16+
}
17+
18+
variable "service_name" {
19+
description = "Name of the service"
20+
type = string
21+
}
22+
23+
variable "domain" {
24+
description = "Domain name for the service"
25+
type = string
26+
}
27+
28+
variable "backend_url" {
29+
description = "Backend URL for the service"
30+
type = string
31+
}
32+
33+
variable "entry_points" {
34+
description = "Entry points for the router"
35+
type = list(string)
36+
default = ["websecure"]
37+
}
38+
39+
variable "cert_resolver" {
40+
description = "Certificate resolver to use"
41+
type = string
42+
default = "cloudflare"
43+
}
44+
45+
variable "cloudflare_email" {
46+
description = "Cloudflare email for DNS challenge"
47+
type = string
48+
}
49+
50+
variable "cloudflare_api_token" {
51+
description = "Cloudflare API token for DNS challenge"
52+
type = string
53+
sensitive = true
54+
}
55+
56+
locals {
57+
formatted_entry_points = join(", ", [for ep in var.entry_points : "\"${ep}\""])
58+
}
59+
60+
# Deploy Modules Service
61+
62+
resource "null_resource" "deploy_service" {
63+
connection {
64+
type = "ssh"
65+
user = var.ssh_user
66+
private_key = file(var.ssh_private_key_path)
67+
host = var.server_two_ip
68+
}
69+
70+
# Create Cloudflare ENV File
71+
72+
provisioner "remote-exec" {
73+
inline = [
74+
"sudo mkdir -p /etc/traefik",
75+
"sudo bash -c 'echo \"CF_API_EMAIL=${var.cloudflare_email}\" > /etc/traefik/cloudflare.env'",
76+
"sudo bash -c 'echo \"CF_API_KEY=${var.cloudflare_api_token}\" >> /etc/traefik/cloudflare.env'",
77+
"sudo chown traefik:traefik /etc/traefik/cloudflare.env",
78+
"sudo chmod 600 /etc/traefik/cloudflare.env"
79+
]
80+
}
81+
82+
# Create service configuration
83+
84+
provisioner "remote-exec" {
85+
inline = [
86+
"sudo mkdir -p /etc/traefik/config",
87+
"echo '[http.routers.${var.service_name}]' | sudo tee /etc/traefik/config/${var.service_name}.toml > /dev/null",
88+
"echo ' rule = \"Host(`${var.domain}`)\"' | sudo tee -a /etc/traefik/config/${var.service_name}.toml > /dev/null",
89+
"echo ' service = \"${var.service_name}\"' | sudo tee -a /etc/traefik/config/${var.service_name}.toml > /dev/null",
90+
"echo ' entryPoints = [${local.formatted_entry_points}]' | sudo tee -a /etc/traefik/config/${var.service_name}.toml > /dev/null",
91+
"echo '' | sudo tee -a /etc/traefik/config/${var.service_name}.toml > /dev/null",
92+
"echo '[http.routers.${var.service_name}.tls]' | sudo tee -a /etc/traefik/config/${var.service_name}.toml > /dev/null",
93+
"echo ' certResolver = \"${var.cert_resolver}\"' | sudo tee -a /etc/traefik/config/${var.service_name}.toml > /dev/null",
94+
"echo '' | sudo tee -a /etc/traefik/config/${var.service_name}.toml > /dev/null",
95+
"echo '[http.services.${var.service_name}.loadBalancer]' | sudo tee -a /etc/traefik/config/${var.service_name}.toml > /dev/null",
96+
"echo ' [[http.services.${var.service_name}.loadBalancer.servers]]' | sudo tee -a /etc/traefik/config/${var.service_name}.toml > /dev/null",
97+
"echo ' url = \"${var.backend_url}\"' | sudo tee -a /etc/traefik/config/${var.service_name}.toml > /dev/null"
98+
]
99+
}
100+
101+
# Setup Trigger Replace Value When Changes
102+
103+
triggers = {
104+
service_name = var.service_name
105+
domain = var.domain
106+
backend_url = var.backend_url
107+
entry_points = join(",", var.entry_points)
108+
}
109+
}
110+
111+
output "service_name" {
112+
value = var.service_name
113+
}
114+
115+
output "domain" {
116+
value = var.domain
117+
}

scripts/clean_treafik.sh

+24
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
#!/bin/bash
2+
# cleanup_treafik.sh - Script to remove all Traefik components
3+
4+
# Stop services first
5+
echo "Stopping Traefik service..."
6+
sudo systemctl stop traefik || true
7+
sudo systemctl disable traefik || true
8+
9+
# Stop Docker container if exists
10+
echo "Stopping test containers..."
11+
sudo docker stop whoami || true
12+
sudo docker rm whoami || true
13+
14+
# Remove Traefik files
15+
echo "Removing Traefik configuration files..."
16+
sudo rm -rf /etc/traefik
17+
sudo rm -f /etc/systemd/system/traefik.service
18+
sudo rm -f /usr/local/bin/traefik
19+
20+
# Reload systemd to forget about the service
21+
echo "Reloading systemd..."
22+
sudo systemctl daemon-reload
23+
24+
echo "Cleanup completed successfully!"

0 commit comments

Comments
 (0)