Initial commit: Terraform module for Nexus on Docker
Deploys Sonatype Nexus Repository Manager with: - Traefik ingress with TLS (production certresolver) - Persistent storage at /opt/nexus-data - Health checks and memory limits
This commit is contained in:
commit
68c762ee03
25
.gitignore
vendored
Normal file
25
.gitignore
vendored
Normal file
@ -0,0 +1,25 @@
|
|||||||
|
# Local .terraform directories
|
||||||
|
**/.terraform/*
|
||||||
|
|
||||||
|
# .tfstate files
|
||||||
|
*.tfstate
|
||||||
|
*.tfstate.*
|
||||||
|
|
||||||
|
# Crash log files
|
||||||
|
crash.log
|
||||||
|
|
||||||
|
# Exclude all .tfvars files, which are likely to contain sensitive data
|
||||||
|
# *.tfvars
|
||||||
|
|
||||||
|
# Ignore override files as they are usually used to override resources locally
|
||||||
|
override.tf
|
||||||
|
override.tf.json
|
||||||
|
*_override.tf
|
||||||
|
*_override.tf.json
|
||||||
|
|
||||||
|
# Ignore CLI configuration files
|
||||||
|
.terraformrc
|
||||||
|
terraform.rc
|
||||||
|
|
||||||
|
# Ignore lock file
|
||||||
|
.terraform.lock.hcl
|
||||||
3
README.md
Normal file
3
README.md
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
# Terraform Docker Nexus
|
||||||
|
|
||||||
|
Deploys Sonatype Nexus Repository Manager on Docker with Traefik ingress.
|
||||||
20
backend.tf
Normal file
20
backend.tf
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
terraform {
|
||||||
|
backend "s3" {
|
||||||
|
endpoints = {
|
||||||
|
s3 = "https://minio.bsdserver.nl:443"
|
||||||
|
}
|
||||||
|
|
||||||
|
bucket = "home-terraform"
|
||||||
|
key = "home/docker/nexus/nexus.tfstate"
|
||||||
|
|
||||||
|
access_key = "R9lCycfEO8qJ2dxlQT1S"
|
||||||
|
secret_key = "6rtVLjDIjx7U9ecNRkdbS3idSBNWsfNhN6wB20sJ"
|
||||||
|
|
||||||
|
region = "main"
|
||||||
|
skip_credentials_validation = true
|
||||||
|
skip_metadata_api_check = true
|
||||||
|
skip_requesting_account_id = true
|
||||||
|
skip_region_validation = true
|
||||||
|
use_path_style = true
|
||||||
|
}
|
||||||
|
}
|
||||||
88
main.tf
Normal file
88
main.tf
Normal file
@ -0,0 +1,88 @@
|
|||||||
|
# Description: This file contains the main Terraform configuration for the Nexus Docker container configuration.
|
||||||
|
|
||||||
|
# Define the local variables
|
||||||
|
locals {
|
||||||
|
app_name = "nexus"
|
||||||
|
app_version = "latest"
|
||||||
|
app_src_port = "8081"
|
||||||
|
}
|
||||||
|
|
||||||
|
# Get the ID of the traefik_network
|
||||||
|
data "docker_network" "traefik_network" {
|
||||||
|
name = "traefik_network"
|
||||||
|
}
|
||||||
|
|
||||||
|
# Create Docker image for Nexus
|
||||||
|
resource "docker_image" "application" {
|
||||||
|
name = "sonatype/nexus3:${local.app_version}"
|
||||||
|
}
|
||||||
|
|
||||||
|
# Create Docker container for Nexus
|
||||||
|
resource "docker_container" "application" {
|
||||||
|
image = docker_image.application.image_id
|
||||||
|
name = local.app_name
|
||||||
|
hostname = local.app_name
|
||||||
|
user = "200:200"
|
||||||
|
restart = "unless-stopped"
|
||||||
|
|
||||||
|
networks_advanced {
|
||||||
|
name = data.docker_network.traefik_network.name
|
||||||
|
}
|
||||||
|
|
||||||
|
env = [
|
||||||
|
"INSTALL4J_ADD_VM_PARAMS=-Xms1024m -Xmx2048m -XX:MaxDirectMemorySize=2g -Djava.util.prefs.userRoot=/nexus-data/javaprefs"
|
||||||
|
]
|
||||||
|
|
||||||
|
# Mount host path for persistent data (existing data from previous deployment)
|
||||||
|
volumes {
|
||||||
|
host_path = "/opt/nexus-data"
|
||||||
|
container_path = "/nexus-data"
|
||||||
|
}
|
||||||
|
|
||||||
|
# Traefik labels for ingress
|
||||||
|
labels {
|
||||||
|
label = "traefik.enable"
|
||||||
|
value = "true"
|
||||||
|
}
|
||||||
|
|
||||||
|
labels {
|
||||||
|
label = "traefik.http.routers.nexus.entrypoints"
|
||||||
|
value = "websecure"
|
||||||
|
}
|
||||||
|
|
||||||
|
labels {
|
||||||
|
label = "traefik.http.routers.nexus.rule"
|
||||||
|
value = "Host(`nexus.${var.domain}`)"
|
||||||
|
}
|
||||||
|
|
||||||
|
labels {
|
||||||
|
label = "traefik.http.services.nexus.loadBalancer.server.port"
|
||||||
|
value = local.app_src_port
|
||||||
|
}
|
||||||
|
|
||||||
|
labels {
|
||||||
|
label = "traefik.http.routers.nexus.tls"
|
||||||
|
value = "true"
|
||||||
|
}
|
||||||
|
|
||||||
|
labels {
|
||||||
|
label = "traefik.http.routers.nexus.tls.certresolver"
|
||||||
|
value = "production"
|
||||||
|
}
|
||||||
|
|
||||||
|
# Health check
|
||||||
|
healthcheck {
|
||||||
|
test = ["CMD", "curl", "-f", "http://localhost:8081/service/rest/v1/status"]
|
||||||
|
interval = "30s"
|
||||||
|
timeout = "10s"
|
||||||
|
retries = 5
|
||||||
|
start_period = "120s"
|
||||||
|
}
|
||||||
|
|
||||||
|
# Resource limits
|
||||||
|
memory = 4096
|
||||||
|
|
||||||
|
lifecycle {
|
||||||
|
ignore_changes = [network_mode]
|
||||||
|
}
|
||||||
|
}
|
||||||
11
outputs.tf
Normal file
11
outputs.tf
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
# Purpose: This file is used to output the values of the resources created in the main.tf file.
|
||||||
|
|
||||||
|
output "container_id" {
|
||||||
|
description = "The ID of the Nexus container"
|
||||||
|
value = docker_container.application.id
|
||||||
|
}
|
||||||
|
|
||||||
|
output "container_name" {
|
||||||
|
description = "The name of the Nexus container"
|
||||||
|
value = docker_container.application.name
|
||||||
|
}
|
||||||
33
provider.tf
Normal file
33
provider.tf
Normal file
@ -0,0 +1,33 @@
|
|||||||
|
# Description: This file is used to configure the Docker and Vault providers.
|
||||||
|
terraform {
|
||||||
|
required_providers {
|
||||||
|
docker = {
|
||||||
|
source = "abh80/docker"
|
||||||
|
version = "1.0.1"
|
||||||
|
}
|
||||||
|
|
||||||
|
vault = {
|
||||||
|
source = "hashicorp/vault"
|
||||||
|
version = "5.5.0"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
# Configure the Docker provider
|
||||||
|
provider "docker" {
|
||||||
|
host = "tcp://192.168.2.170:2376"
|
||||||
|
|
||||||
|
cert_path = pathexpand("~/.docker")
|
||||||
|
}
|
||||||
|
|
||||||
|
# Configure the Vault provider
|
||||||
|
provider "vault" {
|
||||||
|
address = "https://wbyc-srv-docker01.bsdserver.lan:8200"
|
||||||
|
auth_login {
|
||||||
|
path = "auth/approle/login"
|
||||||
|
parameters = {
|
||||||
|
role_id = var.role_id
|
||||||
|
secret_id = var.secret_id
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
6
renovate.json
Normal file
6
renovate.json
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
{
|
||||||
|
"$schema": "https://docs.renovatebot.com/renovate-schema.json",
|
||||||
|
"extends": [
|
||||||
|
"config:base"
|
||||||
|
]
|
||||||
|
}
|
||||||
3
terraform.tfvars
Normal file
3
terraform.tfvars
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
domain = "bsdserver.nl"
|
||||||
|
role_id = "599bed98-baee-57d8-0ff6-9e6dff214ceb"
|
||||||
|
secret_id = "89ca5f5c-f4fa-9034-5261-c4b7593a6541"
|
||||||
17
variables.tf
Normal file
17
variables.tf
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
variable "domain" {
|
||||||
|
description = "Domain name for the application"
|
||||||
|
type = string
|
||||||
|
default = "bsdserver.nl"
|
||||||
|
}
|
||||||
|
|
||||||
|
variable "role_id" {
|
||||||
|
description = "Role ID for Vault AppRole authentication"
|
||||||
|
type = string
|
||||||
|
sensitive = true
|
||||||
|
}
|
||||||
|
|
||||||
|
variable "secret_id" {
|
||||||
|
description = "Secret ID for Vault AppRole authentication"
|
||||||
|
type = string
|
||||||
|
sensitive = true
|
||||||
|
}
|
||||||
Loading…
x
Reference in New Issue
Block a user