20 Commits
Author SHA1 Message Date
pi-ux-ce 85026544e8 can create new entries with random password not erased after new excution 2025-05-26 23:35:23 +01:00
pi-ux-ce 810fa2951a Update module.tf 2025-05-26 22:07:55 +00:00
pi-ux-ce 9f83ec215b try some bitwarden function 2025-05-20 23:56:32 +01:00
pi-ux-ce cbf2a33440 adding 2025-05-20 23:22:26 +01:00
pi-ux-ce 3ff155e3e6 multiport + naming 2025-05-18 00:29:58 +01:00
pi-ux-ce a53852b0c6 conflict solved 2025-05-18 00:12:37 +01:00
pi-ux-ce aa5826f6a4 multi port working 2025-05-18 00:01:43 +01:00
pi-ux-ce d40c4569e4 work on stash external + deploy wikijs 2025-05-17 23:45:35 +01:00
pi-ux-ce b8480cc1fb improve stash downloading script 2025-05-15 20:24:47 +01:00
pi-ux-ce 48cc59e735 try the port 2025-05-12 12:02:02 +01:00
pi-ux-ce 1ba0438b38 add gitignore 2025-05-12 11:57:26 +01:00
pi-ux-ce ba746c9c41 try poste.io 2025-05-12 11:55:18 +01:00
pi-ux-ce 13c8ebe109 adding servarr but needs to de-authorise prowlarr before doing backuo/restore due to prowlarr not accesible as localhost:9696 anymore 2025-05-08 15:36:40 +01:00
pi-ux-ce 0327588463 find a way to add gluetun as proxy instead as a sidecar container 2025-05-08 00:28:18 +01:00
pi-ux-ce b094e78620 enable PVC as well and redis/db 2025-05-06 13:40:57 +01:00
pi-ux-ce fcdcb0102d find a way to connect to another namespace without conflict found yet 2025-05-06 12:00:37 +01:00
pi-ux-ce 2b168e5e34 change not working 2025-04-24 22:55:17 +01:00
pi-ux-ce edea22d4d1 method to avoid create duplicate namespace 2025-04-24 22:37:03 +01:00
pi-ux-ce 6f7ae0e523 reverting as it's not working 2025-04-24 15:35:11 +01:00
pi-ux-ce e742931489 trying to avoid duplicate namespace 2025-04-24 15:34:47 +01:00
20 changed files with 13575 additions and 98 deletions
+4
View File
@@ -35,3 +35,7 @@ override.tf.json
# Ignore CLI configuration files
.terraformrc
terraform.rc
module.tf.save*
terraform.tfstate*
.terraform.lock.hcl
@@ -0,0 +1,12 @@
apiVersion: v1
data:
VPN_DNS_IP: MTAuMi4wLjE=
VPN_ENDPOINT_IP: MjEyLjguMjUzLjEzNw==
VPN_ENDPOINT_PORT: NTE4MjA=
WIREGUARD_PRIVATE_KEY: Y0grY0hLd3FMeXV3UlVlZy8wRjFYWVlDQVM4bkQwWGsxNmVOQlVLc2tYbz0=
WIREGUARD_PUBLIC_KEY: VVJwZVp4dHlVWEFVVUEwTVdjRmRDU2E3RitNdmNoSjRlTlNKVWV0S0VHaz0=
kind: Secret
metadata:
creationTimestamp: null
name: gluetun-secret-netherland
namespace: gluetun
@@ -0,0 +1,16 @@
apiVersion: v1
data:
DB_DATABASE: Ym9va3N0YWNrYXBw
# DB_HOST: ZGIuYm9va3N0YWNrLnN2Yw==
DB_HOST: Ym9va3N0YWNrLWRiLXN2Yw==
DB_PASS: VW5oYXBweS1Db21tZW5jZS1FdmVyeW9uZTQ=
DB_USER: Ym9va3N0YWNrX3VzZXJuYW1l
APP_KEY: "N3dvdmU3ZDQwbjlyNm90YW43ZGEyODQ5am10ajlqNHU="
kind: Secret
metadata:
# creationTimestamp: "2024-06-13T07:37:49Z"
name: bookstack-credentials
namespace: bookstack
# resourceVersion: "20756717"
# uid: 66d4cc7d-741a-49cc-979d-a8b95ffb983a
type: Opaque
@@ -0,0 +1,12 @@
apiVersion: v1
data:
VPN_DNS_IP: MTAuMi4wLjE=
VPN_ENDPOINT_IP: MjEyLjguMjUzLjEzNw==
VPN_ENDPOINT_PORT: NTE4MjA=
WIREGUARD_PRIVATE_KEY: Y0grY0hLd3FMeXV3UlVlZy8wRjFYWVlDQVM4bkQwWGsxNmVOQlVLc2tYbz0=
WIREGUARD_PUBLIC_KEY: VVJwZVp4dHlVWEFVVUEwTVdjRmRDU2E3RitNdmNoSjRlTlNKVWV0S0VHaz0=
kind: Secret
metadata:
creationTimestamp: null
name: gluetun-secret-netherland
namespace: tservarr
@@ -0,0 +1,17 @@
apiVersion: v1
kind: Service
metadata:
name: database
namespace: servarr
annotations:
spec:
ipFamilyPolicy: PreferDualStack
ports:
- name: tcp
port: 5432
targetPort: 5432
protocol: TCP
type: LoadBalancer
selector:
app: prowlarr-db
@@ -0,0 +1,11 @@
apiVersion: v1
data:
DB_DATABASE: cHJvd2xhcnItbWFpbg==
DB_HOST: cHJvd2xhcnItZGItc3Zj
DB_PASS: R29saWF0aC1EZWVwZW4tRGl2aWRpbmc3
DB_USER: cHJvd2xhcnJfdXNlcm5hbWU=
kind: Secret
metadata:
creationTimestamp: null
name: prowlarr-credentials
namespace: bookstack
@@ -0,0 +1,47 @@
apiVersion: v1
data:
prowlarr_add_bulk_indexer.sh: |
#!/bin/sh
# install package with apk
apk add curl jq
# Base URL and API key
BASE_URL="https://tprowlarr.tryton.geeraert.eu"
API_KEY="c5655e0b915d46dbb68d80f40a2daae4"
APP_PROFILE_ID=1 # Set this to a valid App Profile Id
# Get the list of all available indexers
available_indexers=$(curl -s -X GET "$BASE_URL/api/v1/indexer/schema" \
-H "accept: application/json" \
-H "X-Api-Key: $API_KEY")
# Loop through each indexer and add it to Prowlarr
echo "$available_indexers" | jq -c '.[]' | while read -r indexer; do
indexer_name=$(echo "$indexer" | jq -r '.name')
indexer_settings=$(echo "$indexer" | jq -c '.')
# Add the AppProfileId to the indexer settings
indexer_settings=$(echo "$indexer_settings" | jq --argjson appProfileId "$APP_PROFILE_ID" '. + {AppProfileId: $appProfileId}')
echo "Adding indexer: $indexer_name"
curl -s -X POST "$BASE_URL/api/v1/indexer" \
-H "accept: application/json" \
-H "X-Api-Key: $API_KEY" \
-H "Content-Type: application/json" \
-d "$indexer_settings"
echo "Indexer $indexer_name added."
done
return 0
kind: ConfigMap
metadata:
annotations:
kubectl.kubernetes.io/last-applied-configuration: |
{"apiVersion":"v1","data":{"prowlarr_add_bulk_indexer.sh":"#!/bin/bash\n\n# Base URL and API key\nBASE_URL=\"https://prowlarr.tryton.geeraert.eu\"\nAPI_KEY=\"0cb77d794ab74f158daaae044ab850ee\"\n\nAPP_PROFILE_ID=1 # Set this to a valid App Profile Id\n\n# Get the list of all available indexers\navailable_indexers=$(curl -s -X GET \"$BASE_URL/api/v1/indexer/schema\" \\\n -H \"accept: application/json\" \\\n -H \"X-Api-Key: $API_KEY\")\n\n# Loop through each indexer and add it to Prowlarr\necho \"$available_indexers\" | jq -c '.[]' | while read -r indexer; do\n indexer_name=$(echo \"$indexer\" | jq -r '.name')\n indexer_settings=$(echo \"$indexer\" | jq -c '.')\n\n # Add the AppProfileId to the indexer settings\n indexer_settings=$(echo \"$indexer_settings\" | jq --argjson appProfileId \"$APP_PROFILE_ID\" '. + {AppProfileId: $appProfileId}')\n\n echo \"Adding indexer: $indexer_name\"\n\n curl -s -X POST \"$BASE_URL/api/v1/indexer\" \\\n -H \"accept: application/json\" \\\n -H \"X-Api-Key: $API_KEY\" \\\n -H \"Content-Type: application/json\" \\\n -d \"$indexer_settings\"\n\n echo \"Indexer $indexer_name added.\"\ndone\n"},"kind":"ConfigMap","metadata":{"annotations":{},"creationTimestamp":null,"name":"prowlarr-add-bulk-indexer","namespace":"servarr"}}
creationTimestamp: "2025-02-24T14:53:38Z"
name: prowlarr-add-bulk-indexer
namespace: tservarr
resourceVersion: "101531049"
uid: daa8c869-779c-49f2-a2ca-bad2d6d77035
@@ -0,0 +1,28 @@
apiVersion: batch/v1
kind: Job
metadata:
name: prowlarr-bulk-add-indexers
namespace: tservarr
spec:
template:
spec:
containers:
- name: prowlarr-bulk-add-indexers
image: alpine
imagePullPolicy: Always
volumeMounts:
- mountPath: /config
name: scripts
command:
- /bin/sh
- -c
- /config/prowlarr_add_bulk_indexer.sh
# command: ["chmod","+x","/config/prowlarr_add_bulk_indexer.sh",";","./config/prowlarr_add_bulk_indexer.sh"]
restartPolicy: Never
volumes:
- configMap:
defaultMode: 365
name: prowlarr-add-bulk-indexer
name: scripts
backoffLimit: 4
@@ -0,0 +1,11 @@
apiVersion: v1
data:
DB_DATABASE: cHJvd2xhcnItbWFpbg==
DB_HOST: cHJvd2xhcnItZGItc3Zj
DB_PASS: R29saWF0aC1EZWVwZW4tRGl2aWRpbmc3
DB_USER: c2VydmFycl91c2VybmFtZQ==
kind: Secret
metadata:
creationTimestamp: null
name: servarr-db-credentials
namespace: servarr
+76
View File
@@ -0,0 +1,76 @@
#!/bin/bash
#install required packages
apk add curl wget
#named argument generation
skip_searching_gallery="${skip_searching_gallery:-false}"
while [ $# -gt 0 ]; do
if [[ $1 == "--"* ]]; then
v="${1/--/}"
declare "$v"="$2"
shift
fi
shift
done
#check if we will use a HTTP proxy or not
if [[ -z $http_proxy ]]; then
echo "not using proxy"
curl_command="curl"
else
echo "using proxy"
curl_command="curl -x $http_proxy"
fi
#dowload from https://www.pornpics.com/pornstars/eiby-shine/
DESTINATION_FOLDER="/data"
PROXY_HTTP="http://gluetun-svc.gluetun.svc:8888"
#BASE_URL="https://www.pornpics.com/pornstars/eiby-shine/"
#pornstars="eiby-shine"
BASE_URL="https://www.pornpics.com/?q=shy+imp"
pornstars="shy-imp"
#BASE_URL="https://www.pornpics.com/pornstars/becky-summer"
#pornstars="becky-summer"
#clear files beforehand
mkdir -p $DESTINATION_FOLDER/$pornstars
if [[ $skip_searching_gallery == true ]]; then
echo "not looping through galleries"
echo "using existing file instead"
#because we need to keep the file $DESTINATION_FOLDER/$pornstars-urls_of_galleries.txt with the existing URL , in this condition,
#no deletion of this file
else
echo "looping through galleries"
#because we will re-generate this file, can be emptied
echo "" > $DESTINATION_FOLDER/$pornstars-urls_of_galleries.txt
$curl_command -s $BASE_URL | grep -Eo "(http|https)://[a-zA-Z0-9./?=_%:-]*" | grep "https://www.pornpics.com/galleries/" |sort -u >> $DESTINATION_FOLDER/$pornstars-urls_of_galleries.txt
fi
echo "" > $DESTINATION_FOLDER/$pornstars-image_to_download.txt
for f in $(cat $DESTINATION_FOLDER/$pornstars-urls_of_galleries.txt ); do
$curl_command $f | grep -Eo "(http|https)://[a-zA-Z0-9./?=_%:-]*" | grep "https://cdni.pornpics.com/1280" >> $DESTINATION_FOLDER/$pornstars-image_to_download.txt
echo $f
done
for g in $(cat $DESTINATION_FOLDER/$pornstars-image_to_download.txt ); do
$curl_command -O --output-dir $DESTINATION_FOLDER/$pornstars $g
# wget -e use_proxy=yes -e http_proxy=$PROXY_HTTP $g -P $DESTINATION_FOLDER/$pornstars
echo $g
done
exit 0
@@ -0,0 +1,12 @@
apiVersion: v1
data:
VPN_DNS_IP: MTAuMi4wLjE=
VPN_ENDPOINT_IP: MjEyLjguMjUzLjEzNw==
VPN_ENDPOINT_PORT: NTE4MjA=
WIREGUARD_PRIVATE_KEY: Y0grY0hLd3FMeXV3UlVlZy8wRjFYWVlDQVM4bkQwWGsxNmVOQlVLc2tYbz0=
WIREGUARD_PUBLIC_KEY: VVJwZVp4dHlVWEFVVUEwTVdjRmRDU2E3RitNdmNoSjRlTlNKVWV0S0VHaz0=
kind: Secret
metadata:
creationTimestamp: null
name: gluetun-secret-netherland
namespace: stash
@@ -0,0 +1,32 @@
apiVersion: v1
data:
download.sh: "#!/bin/bash\n\n#install required packages\napk add curl wget\n\n#named
argument generation\nskip_searching_gallery=\"${skip_searching_gallery:-false}\"\n\n\nwhile
[ $# -gt 0 ]; do\n if [[ $1 == \"--\"* ]]; then\n v=\"${1/--/}\"\n declare
\"$v\"=\"$2\"\n shift\n fi\n shift\ndone\n\n#check if we will use
a HTTP proxy or not\n\nif [[ -z $http_proxy ]]; then\n echo \"not using
proxy\"\n curl_command=\"curl\"\nelse\n echo \"using proxy\"\n curl_command=\"curl
-x $http_proxy\"\n\nfi\n\n\n#dowload from https://www.pornpics.com/pornstars/eiby-shine/\nDESTINATION_FOLDER=\"/data\"\nPROXY_HTTP=\"http://gluetun-svc.gluetun.svc:8888\"\n\n#BASE_URL=\"https://www.pornpics.com/pornstars/eiby-shine/\"\n#pornstars=\"eiby-shine\"\n\nBASE_URL=\"https://www.pornpics.com/?q=shy+imp\"\npornstars=\"shy-imp\"\n\n#BASE_URL=\"https://www.pornpics.com/pornstars/becky-summer\"\n#pornstars=\"becky-summer\"\n\n\n#clear
files beforehand\n\n\nmkdir -p $DESTINATION_FOLDER/$pornstars\n\nif [[ $skip_searching_gallery
== true ]]; then\n echo \"not looping through galleries\"\n\t\techo \"using
existing file instead\"\n\t\t#because we need to keep the file $DESTINATION_FOLDER/$pornstars-urls_of_galleries.txt
with the existing URL , in this condition, \n\t\t#no deletion of this file\necho
\"https://www.pornpics.com/galleries/onlyfans-shy-imp-starring-shy-imp-naked-porn-pics-90263490/\nhttps://www.pornpics.com/galleries/onlyfans-shy-imp-featuring-shy-imp-xxx-porn-pics-15741579/\nhttps://www.pornpics.com/galleries/onlyfans-shy-imp-starring-shy-imp-naked-photos-68925414/\nhttps://www.pornpics.com/galleries/onlyfans-shy-imp-shy-imp-20862921/\nhttps://www.pornpics.com/galleries/skinny-girl-with-pink-hair-shy-imp-shows-her-small-tits-during-a-solo-show-50988369/\nhttps://www.pornpics.com/galleries/onlyfans-shy-imp-featuring-shy-imp-hot-gallery-86312934/\"
>> $DESTINATION_FOLDER/$pornstars-urls_of_galleries.txt\n\nelse\n echo
\"looping through galleries\"\n\t\t#because we will re-generate this file, can
be emptied\n\t\techo \"\" > $DESTINATION_FOLDER/$pornstars-urls_of_galleries.txt\n
\ $curl_command -s $BASE_URL | grep -Eo \"(http|https)://[a-zA-Z0-9./?=_%:-]*\"
| grep \"https://www.pornpics.com/galleries/\" |sort -u >> $DESTINATION_FOLDER/$pornstars-urls_of_galleries.txt\nfi\n\necho
\"\" > $DESTINATION_FOLDER/$pornstars-image_to_download.txt\n\n\nfor f in $(cat
$DESTINATION_FOLDER/$pornstars-urls_of_galleries.txt ); do\n\t$curl_command $f
| grep -Eo \"(http|https)://[a-zA-Z0-9./?=_%:-]*\" | grep \"https://cdni.pornpics.com/1280\"
>> $DESTINATION_FOLDER/$pornstars-image_to_download.txt\n\techo $f\ndone\n\n\nfor
g in $(cat $DESTINATION_FOLDER/$pornstars-image_to_download.txt ); do \n\t$curl_command
-O --output-dir $DESTINATION_FOLDER/$pornstars $g\n# wget -e use_proxy=yes
-e http_proxy=$PROXY_HTTP $g -P $DESTINATION_FOLDER/$pornstars\n echo $g
\ndone\nexit 0\n"
kind: ConfigMap
metadata:
creationTimestamp: null
name: pornpic-dowloader
namespace: stash
@@ -0,0 +1,37 @@
apiVersion: batch/v1
kind: Job
metadata:
name: stash-pornpics-dowloader
namespace: stash
spec:
template:
spec:
containers:
- name: stash-pornpics-dowloader
image: bash
imagePullPolicy: Always
volumeMounts:
- mountPath: /config
name: scripts
- mountPath: /data
mountPropagation: None
name: data-pvc
command:
# - /bin/bash
# - -c
# - sleep 3600
- bash
- /config/download.sh
- --http_proxy
- "http://gluetun-svc.gluetun.svc:8888"
restartPolicy: Never
volumes:
- configMap:
defaultMode: 0744
name: pornpic-dowloader
name: scripts
- name: data-pvc
persistentVolumeClaim:
claimName: data-pvc
backoffLimit: 4
+36
View File
@@ -0,0 +1,36 @@
#!/bin/sh
skip_searching_gallery="${skip_searching_gallery:-false}"
#echo "$skip_searching_gallery"
while [ $# -gt 0 ]; do
if [[ $1 == "--"* ]]; then
v="${1/--/}"
#declare "$v"="$2"
"$v"="$2"
shift
fi
shift
done
#echo "$skip_searching_gallery"
#if [[ -z $skip_searching_gallery ]]; then
if [[ $skip_searching_gallery == true ]]; then
echo "not looping through galleries"
else
echo "looping through galleries"
fi
if [[ -z $http_proxy ]]; then
echo "not using proxy"
curl_command="curl"
else
echo "using proxy"
curl_command="curl -x $http_proxy"
fi
echo $curl_command
$curl_command https://cdni.pornpics.com/460/7/424/83105958/83105958_010_388f.jpg -O
@@ -0,0 +1,11 @@
apiVersion: v1
data:
DB_DATABASE: d2lraQ==
DB_HOST: d2lraWpzLWRiLXN2Yw==
DB_PASS: VmVzdDctUHJvZHVjdC1VbnN0ZWFkeQ==
DB_USER: d2lraWpzX3VzZXJuYW1l
kind: Secret
metadata:
creationTimestamp: null
name: wikijs-db-credentials
namespace: wikijs
+120 -29
View File
@@ -1,11 +1,59 @@
terraform {
required_version = "> 0.8.0"
required_providers {
bitwarden = {
source = "maxlaverse/bitwarden"
version = ">= 0.13.6"
}
}
}
provider "kubernetes" {
config_path = "~/.kube/config"
}
provider "bitwarden" {
email = "pierre@geeraert.eu"
master_password = ""
server = "https://bitwarden.tryton.geeraert.eu"
experimental {
embedded_client = true
}
}
#https://stackoverflow.com/questions/66670949/how-to-tell-terraform-to-skip-the-secret-manager-resource-if-it-exists
#for the secret not overwritten (not tested)
data "bitwarden_item_login" "example" {
search = "bookstack.zeus.geeraert.eu"
}
data "bitwarden_item_secure_note" "vpn_preshared_key" {
search = "terraform testing"
}
output "pgpin" {
value = nonsensitive(coalesce(data.bitwarden_item_secure_note.vpn_preshared_key.field.1.hidden,1234))
sensitive = true
}
resource "random_password" "password" {
length = 16
special = true
override_special = "!#$%&*()-_=+[]{}<>:?"
}
resource "bitwarden_item_secure_note" "terraform_upload_testing" {
name = "terraform upload testing"
# notes = <<EOT
#[global]
#secret = "<something sensitive>"
#EOT
organization_id = "a6361589-badd-4bde-9cb4-af8901161c0d"
collection_ids = ["3fa902cd-8244-46bc-a4ea-af8901262d94"]
field {
name = "category"
hidden = random_password.password.result
}
}
variable "kubernetes" {
type = map(object({
@@ -30,9 +78,12 @@ variable "kubernetes" {
})
}))
})))
replicas = optional(number, 1)
namespace = optional(string)
service_port = optional(number)
replicas = optional(number, 1)
namespace = optional(string)
connected_namespace = optional(string, "")
# namespace = optional(string,coalesce(connected_namespace,""))
#block_namespace_creation = optional(bool, false)
service_port = optional(list(number))
service_type = optional(string, "ClusterIP")
service_name = optional(string)
liveness_tcp_socket = optional(number)
@@ -44,13 +95,16 @@ variable "kubernetes" {
secret_ref = optional(list(string))
config_map_ref = optional(list(string))
extra_manifest = optional(list(string))
requirements = optional(map(string), {
limits-cpu = "800m"
limits-memory = "500Mi"
requests-cpu = "200m"
requests-memory = "200Mi"
})
requirements = optional(map(string))
# requirements = optional(map(string), {
# limits-cpu = "800m"
# limits-memory = "500Mi"
# requests-cpu = "200m"
# requests-memory = "200Mi"
# })
dns_nameservers = optional(string)
environment_variables = optional(map(string), { name = "value" })
security_context = optional(bool, false)
}))
}
@@ -65,7 +119,7 @@ locals {
pvc_size = pvc.pvc_size
mount_path = pvc.mount_path
storage_class_name = pvc.storage_class_name
namespace = coalesce(value.namespace, key)
namespace = coalesce(value.namespace, value.connected_namespace, key)
}] if value.enabled == true && value.pvc != null
])
}
@@ -84,7 +138,7 @@ locals {
data "kubernetes_all_namespaces" "allns" {}
resource "kubernetes_namespace" "automatic" {
for_each = { for key, value in var.kubernetes : key => value if value.enabled == true }
for_each = { for key, value in var.kubernetes : key => value if value.enabled == true && value.connected_namespace == "" }
metadata {
annotations = {
name = coalesce(each.value.namespace, each.key)
@@ -112,7 +166,7 @@ locals {
])
}
resource "kubernetes_manifest" "service" {
resource "kubernetes_manifest" "manifest" {
for_each = { for item in local.kubernetes_manifests : item.key => item }
manifest = yamldecode(file(each.value.manifest))
@@ -122,10 +176,9 @@ resource "kubernetes_manifest" "service" {
resource "kubernetes_persistent_volume_claim" "automatic-pvc" {
# for_each = { for key, value in var.kubernetes : key => value if value.enabled == true }
for_each = { for key, value in local.pvc_details : "${value.index}" => merge(value, { mew_key = value.index }) if value.pvc }
metadata {
namespace = each.value.namespace
namespace = coalesce(each.value.namespace, each.key)
name = "${each.value.name}-pvc"
labels = {
deployment_method = "Terraform"
@@ -144,7 +197,7 @@ resource "kubernetes_persistent_volume_claim" "automatic-pvc" {
resource "kubernetes_persistent_volume_claim" "automatic-pvc-database" {
for_each = { for key, value in var.kubernetes : key => value if value.database != null && value.enabled == true }
metadata {
namespace = each.value.namespace
namespace = coalesce(each.value.namespace, each.value.connected_namespace, each.key)
name = "${each.key}-db-pvc"
labels = {
deployment_method = "Terraform"
@@ -164,7 +217,7 @@ resource "kubernetes_persistent_volume_claim" "automatic-pvc-database" {
resource "kubernetes_persistent_volume_claim" "automatic-pvc-redis" {
for_each = { for key, value in var.kubernetes : key => value if value.redis != null && value.enabled == true }
metadata {
namespace = each.value.namespace
namespace = coalesce(each.value.namespace, each.value.connected_namespace, each.key)
name = "${each.key}-redis-pvc"
labels = {
deployment_method = "Terraform"
@@ -185,7 +238,7 @@ resource "kubernetes_service" "automatic_service" {
for_each = { for key, value in var.kubernetes : key => value if value.service_port != null && value.enabled == true }
metadata {
name = "${each.key}-svc"
namespace = coalesce(each.value.namespace, each.key)
namespace = coalesce(each.value.namespace, each.value.connected_namespace, each.key)
labels = {
deployment_method = "Terraform"
}
@@ -200,10 +253,20 @@ resource "kubernetes_service" "automatic_service" {
selector = {
app = each.key
}
port {
port = each.value.service_port
target_port = each.value.service_port
dynamic "port" {
for_each = each.value.service_port != null ? each.value.service_port : []
content {
port = port.value
target_port = port.value
name = replace("${each.key}${port.value}", "/(.{0,15})(.*)/", "$1")
}
}
# port {
# port = each.value.service_port
# target_port = each.value.service_port
# }
type = each.value.service_type
@@ -216,7 +279,7 @@ resource "kubernetes_service" "automatic_service_database" {
for_each = { for key, value in var.kubernetes : key => value if value.database != null && value.enabled == true }
metadata {
name = "${each.key}-db-svc"
namespace = coalesce(each.value.namespace, each.key)
namespace = coalesce(each.value.namespace, each.value.connected_namespace, each.key)
labels = {
deployment_method = "Terraform"
}
@@ -241,7 +304,7 @@ resource "kubernetes_service" "automatic_service_redis" {
for_each = { for key, value in var.kubernetes : key => value if value.redis != null && value.enabled == true }
metadata {
name = "${each.key}-redis-svc"
namespace = coalesce(each.value.namespace, each.key)
namespace = coalesce(each.value.namespace, each.value.connected_namespace, each.key)
labels = {
deployment_method = "Terraform"
}
@@ -262,7 +325,7 @@ resource "kubernetes_service" "automatic_service_redis" {
resource "kubernetes_deployment_v1" "automatic" {
for_each = { for key, value in var.kubernetes : key => value if value.enabled == true }
metadata {
namespace = coalesce(each.value.namespace, each.key)
namespace = coalesce(each.value.namespace, each.value.connected_namespace, each.key)
name = coalesce(each.value.name, each.key)
labels = {
@@ -293,10 +356,11 @@ resource "kubernetes_deployment_v1" "automatic" {
image = each.value.image
name = coalesce(each.value.name, each.key)
dynamic "port" {
for_each = each.value.service_port != null ? [""] : []
for_each = each.value.service_port != null ? each.value.service_port : []
content {
container_port = each.value.service_port
name = each.key
container_port = port.value
# name = "${each.key}-${port.value}"
name = replace("${each.key}${port.value}", "/(.{0,15})(.*)/", "$1")
}
}
@@ -355,7 +419,20 @@ resource "kubernetes_deployment_v1" "automatic" {
}
}
dynamic "resources" {
for_each = each.value.requirements != null ? [1] : []
content {
limits = {
cpu = each.value.requirements.limits-cpu
memory = each.value.requirements.limits-memory
}
requests = {
cpu = each.value.requirements.requests-cpu
memory = each.value.requirements.requests-memory
}
}
}
# resources {
# limits = {
@@ -368,6 +445,15 @@ resource "kubernetes_deployment_v1" "automatic" {
# }
# }
dynamic "security_context" {
for_each = each.value.security_context == true ? [1] : []
content {
privileged = true
#capabilities = {
# add : ["NET_ADMIN", "NET_RAW"]
#}
}
}
dynamic "liveness_probe" {
for_each = each.value.liveness_tcp_socket != null || each.value.liveness_http_get != null ? [""] : []
content {
@@ -378,7 +464,6 @@ resource "kubernetes_deployment_v1" "automatic" {
}
}
dynamic "http_get" {
for_each = each.value.liveness_http_get != null ? [""] : []
content {
@@ -392,7 +477,13 @@ resource "kubernetes_deployment_v1" "automatic" {
}
}
}
dynamic "dns_config" {
for_each = each.value.dns_nameservers != null ? [1] : []
content {
nameservers = [each.value.dns_nameservers]
}
}
dynamic "volume" {
for_each = each.value.pvc != null ? each.value.pvc : {}
@@ -436,7 +527,7 @@ resource "kubernetes_deployment_v1" "database-automatic" {
metadata {
namespace = coalesce(each.value.namespace, each.key)
namespace = coalesce(each.value.namespace, each.value.connected_namespace, each.key)
name = "${coalesce(each.value.namespace, each.key)}-db"
labels = {
app = each.key
@@ -561,7 +652,7 @@ resource "kubernetes_deployment_v1" "redis-automatic" {
metadata {
namespace = coalesce(each.value.namespace, each.key)
namespace = coalesce(each.value.namespace, each.value.connected_namespace, each.key)
name = "${coalesce(each.value.namespace, each.key)}-redis"
labels = {
app = each.key
+6265 -3
View File
File diff suppressed because it is too large Load Diff
+6263 -10
View File
File diff suppressed because it is too large Load Diff
+565 -56
View File
@@ -1,22 +1,23 @@
kubernetes = {
bookstack = {
namespace = "bookstack"
enabled = true
namespace = "bookstack"
# enabled = false
replicas = 01
extra_manifest = ["/opt/kubernetes/Bookstack_kube/Bookstack.configmap.yaml", "/opt/kubernetes/Bookstack_kube/Bookstack.secret.yaml"]
image = "linuxserver/bookstack:24.10.3"
service_port = 80
#image = "linuxserver/bookstack:24.10.3"
image = "linuxserver/bookstack:latest"
service_port = [80, 443]
database = {
"image" = "lscr.io/linuxserver/mariadb"
"port" = 3306
"mountPath" = "/config"
}
requirements = {
limits-cpu = "500m"
limits-memory = "200Mi"
requests-cpu = "300m"
requests-memory = "100Mi"
}
# requirements = {
# limits-cpu = "18m"
# limits-memory = "100Mi"
# requests-cpu = "10m"
# requests-memory = "70Mi"
# }
secret_ref = ["bookstack-credentials"]
config_map_ref = ["config"]
@@ -73,10 +74,10 @@ kubernetes = {
screeps = {
# enabled = false
enabled = false
name = "screeps-server"
image = "screepers/screeps-launcher"
service_port = 21025
service_port = [21025]
service_type = "LoadBalancer"
environment = {
@@ -85,13 +86,13 @@ kubernetes = {
}
}
requirements = {
limits-cpu = "900m"
limits-memory = "600Mi"
requests-cpu = "300m"
limits-cpu = "1000m"
limits-memory = "1Gi"
requests-cpu = "500m"
requests-memory = "400Mi"
}
pvc = {
volume = {
screeps-volume = {
name = "screeps"
pvc_size = "1Gi"
pvc = true
@@ -106,7 +107,7 @@ kubernetes = {
enabled = false
name = "stirling-pdf"
image = "docker.stirlingpdf.com/stirlingtools/stirling-pdf:latest"
service_port = 8080
service_port = [8080]
environment = {
LANGS = {
@@ -120,7 +121,7 @@ kubernetes = {
requests-memory = "150Mi"
}
pvc = {
volume = {
stirling-volume = {
name = "stirling-pdf"
pvc_size = "100Mi"
pvc = true
@@ -133,10 +134,11 @@ kubernetes = {
stash = {
# enabled = false
replicas = 0
name = "stash"
image = "stashapp/stash:latest"
service_port = 9999
service_port = [9999]
#extra_manifest = ["/opt/kubernetes/Terraform_kube/external_manifests/stash/stash-reddit-dowloader.configmap.yml"]
environment = {
STASH_STASH = {
@@ -191,11 +193,115 @@ kubernetes = {
}
gluetun = {
#enabled = false
dns_nameservers = "10.2.0.1"
replicas = 01
image = "qmcgaw/gluetun:latest"
service_port = [8888]
extra_manifest = ["/opt/kubernetes/Terraform_kube/external_manifests/gluetun/gluetun-secret-netherland.yaml"]
security_context = true
# requirements = {
# limits-cpu = "800Mi"
# limits-memory = "800Mi"
# requests-cpu = "800Mi"
# requests-memory = "800Mi"
# }
environment = {
DNS_ADDRESS = {
value_from = {
secret_key_ref = {
name = "gluetun-secret-netherland"
key = "VPN_DNS_IP"
}
}
}
WIREGUARD_ENDPOINT_IP = {
value_from = {
secret_key_ref = {
name = "gluetun-secret-netherland"
key = "VPN_ENDPOINT_IP"
}
}
}
WIREGUARD_ENDPOINT_PORT = {
value_from = {
secret_key_ref = {
name = "gluetun-secret-netherland"
key = "VPN_ENDPOINT_PORT"
}
}
}
WIREGUARD_PRIVATE_KEY = {
value_from = {
secret_key_ref = {
name = "gluetun-secret-netherland"
key = "WIREGUARD_PRIVATE_KEY"
}
}
}
WIREGUARD_PUBLIC_KEY = {
value_from = {
secret_key_ref = {
name = "gluetun-secret-netherland"
key = "WIREGUARD_PUBLIC_KEY"
}
}
}
# SHADOWSOCKS = {
HTTPPROXY = {
value = "on"
}
#SHADOWSOCKS_LOG = {
HTTPPROXY_LOG = {
value = "on"
}
HTTPPROXY_LISTENING_ADDRESS = {
#SHADOWSOCKS_LISTENING_ADDRESS = {
value = "0.0.0.0:8888"
}
# HTTPPROXY_USER = {
# value = "user"
# }
#SHADOWSOCKS_PASSWORD = {
# HTTPPROXY_PASSWORD = {
# value = "user"
#}
DNS_KEEP_NAMESERVER = {
value = "off"
}
VPN_SERVICE_PROVIDER = {
value = "custom"
}
VPN_TYPE = {
value = "wireguard"
}
WIREGUARD_ADDRESSES = {
value = "10.2.0.2/32"
}
FIREWALL_INPUT_PORTS = {
value = "8081,7878,9696,9091,51413,8080,6881,8989,8191,8888,8000"
}
PUBLICIP_API = {
value = "ip2location"
}
HEALTH_TARGET_ADDRESS = {
value = "protonvpn.com"
}
}
}
onitama = {
enabled = true
enabled = false
namespace = "onitama"
image = "ghcr.io/jackadamson/onitama:latest"
service_port = 8080
service_port = [8080]
requirements = {
limits-cpu = "50m"
limits-memory = "50Mi"
@@ -249,7 +355,7 @@ kubernetes = {
redis = {
enabled = false
image = "redis"
service_port = 6379
service_port = [6379]
liveness_tcp_socket = 6379
# environment_variables = [{
# "name" : "redis_PORT",
@@ -260,7 +366,7 @@ kubernetes = {
vulcan = {
enabled = false
image = "localhost:31795/vulcan-frontend:latest"
service_port = 80
service_port = [80]
requirements = {
limits-cpu = "50m"
limits-memory = "50Mi"
@@ -288,7 +394,7 @@ kubernetes = {
requests-cpu = "50m"
requests-memory = "50Mi"
}
service_port = 3000
service_port = [3000]
pvc_size = "1Gi"
mount_path = "/data"
}
@@ -301,7 +407,7 @@ kubernetes = {
requests-cpu = "50m"
requests-memory = "50Mi"
}
service_port = 3000
service_port = [3000]
pvc_size = "1Gi"
mount_path = "/data"
}
@@ -309,7 +415,7 @@ kubernetes = {
notmuch = {
enabled = false
image = "kalbasit/notmuch"
service_port = 80
service_port = [80]
}
spider = {
@@ -322,7 +428,7 @@ kubernetes = {
requests-cpu = "50m"
requests-memory = "50Mi"
}
service_port = 8080
service_port = [8080]
pvc = {
spider-data = {
pvc = true
@@ -342,7 +448,7 @@ kubernetes = {
requests-cpu = "50m"
requests-memory = "50Mi"
}
service_port = 80
service_port = [80]
}
@@ -350,16 +456,16 @@ kubernetes = {
enabled = false
namespace = "paper"
image = "ghcr.io/paperless-ngx/paperless-ngx:latest"
service_port = 8000
service_port = [8000]
database = {
image = "docker.io/library/postgres:15" }
redis = {
image = "docker.io/library/redis:7" }
requirements = {
limits-cpu = "800Mi"
limits-cpu = "800m"
limits-memory = "800Mi"
requests-cpu = "800Mi"
requests-memory = "800Mi"
requests-cpu = "10m"
requests-memory = "300Mi"
}
extra_manifest = ["/opt/kubernetes/Terraform_kube/external_manifests/paperless/Paperless.secret.yaml"]
#config_map_ref = ["config"]
@@ -393,13 +499,13 @@ kubernetes = {
value = "https://paper.tryton.geeraert.eu"
}
PAPERLESS_TIKA_ENABLED = {
value = "1"
value = "0"
}
PAPERLESS_TIKA_GOTENBERG_ENDPOINT = {
value = "http://gotenberg-svc.gotenberg.svc:3000"
value = "http://gotenberg-svc.paper.svc:3000"
}
PAPERLESS_TIKA_ENDPOINT = {
value = "http://tika-svc.tika.svc:9998"
value = "http://tika-svc.paper.svc:9998"
}
@@ -451,12 +557,12 @@ kubernetes = {
pvc_size = "2Mi"
mount_path = "/usr/src/paperless/data"
}
export = {
host_path = "/tmp"
name = "export"
pvc_size = "2Mi"
mount_path = "/usr/src/paperless/export"
}
# export = {
# host_path = "/tmp"
# name = "export"
# pvc_size = "2Mi"
# mount_path = "/usr/src/paperless/export"
# }
consume = {
pvc = true
name = "consume"
@@ -466,10 +572,11 @@ kubernetes = {
}
}
gotenberg = {
enabled = false
name = "gotenberg"
image = "gotenberg/gotenberg:7.9.2"
service_port = 3000
enabled = false
name = "gotenberg"
connected_namespace = "paper"
image = "gotenberg/gotenberg:7.9.2"
service_port = [3000]
requirements = {
limits-cpu = "100m"
@@ -481,10 +588,11 @@ kubernetes = {
}
tika = {
enabled = false
name = "tika"
image = "ghcr.io/paperless-ngx/tika"
service_port = 9998
enabled = false
name = "tika"
connected_namespace = "paper"
image = "ghcr.io/paperless-ngx/tika"
service_port = [9998]
requirements = {
limits-cpu = "100m"
@@ -505,7 +613,7 @@ kubernetes = {
namespace = "next"
replicas = 01
image = "nextcloud:29.0.3-apache"
service_port = 80
service_port = [80]
extra_manifest = ["/opt/kubernetes/Nextcloud_kube/next.secret.yaml"]
database = {
image = "docker.io/library/postgres:14" }
@@ -597,7 +705,7 @@ kubernetes = {
enabled = false
name = "neko"
image = "ghcr.io/m1k1o/neko/firefox:latest"
service_port = 8080
service_port = [8080]
environment = {
@@ -627,7 +735,7 @@ kubernetes = {
homeassistant = {
enabled = false
image = "ghcr.io/home-assistant/home-assistant:stable"
service_port = 8123
service_port = [8123]
environment = {
@@ -659,9 +767,10 @@ kubernetes = {
}
jellyfin = {
enabled = false
# enabled = false
replicas = 0
image = "jellyfin/jellyfin:latest"
service_port = 8096
service_port = [8096]
environment = {
@@ -698,9 +807,9 @@ kubernetes = {
}
dupeguru = {
# enabled = false
enabled = false
image = "jlesage/dupeguru"
service_port = 5800
service_port = [5800]
pvc = {
dupeguru-config = {
@@ -730,4 +839,404 @@ kubernetes = {
}
}
pinchflat = {
enabled = false
connected_namespace = "screeps"
image = "ghcr.io/kieraneglin/pinchflat:latest"
service_port = [8945]
pvc = {
pinchflat-config = {
pvc = true
name = "pinchflat-config"
pvc_size = "2Mi"
mount_path = "/config"
}
pinchflat-storage = {
pvc = true
name = "pinchflat-storage"
pvc_size = "2Mi"
mount_path = "/downloads"
}
}
requirements = {
limits-cpu = "900m"
limits-memory = "600Mi"
requests-cpu = "300m"
requests-memory = "400Mi"
}
}
jobspy = {
enabled = false
connected_namespace = "stash"
image = "rainmanjam/jobspy-api:latest"
service_port = [8000]
environment = {
ENABLE_API_KEY_AUTH = {
value = "true"
}
API_KEYS = {
value = "true"
}
}
requirements = {
limits-cpu = "900m"
limits-memory = "600Mi"
requests-cpu = "300m"
requests-memory = "400Mi"
}
}
prowlarr = {
# enabled = false
image = "linuxserver/prowlarr:latest"
namespace = "servarr"
#replicas = 0
# dns_nameservers = "10.2.0.1"
service_port = [9696]
extra_manifest = ["/opt/kubernetes/Terraform_kube/external_manifests/servarr/servarr-db.secret.yaml"]
database = {}
environment = {
PUID = {
value = "1000"
}
PGID = {
value = "1000"
}
TZ = {
value = "Etc/UTC"
}
POSTGRES_DB = {
value_from = {
secret_key_ref = {
name = "servarr-db-credentials"
key = "DB_DATABASE"
}
}
}
POSTGRES_USER = {
value_from = {
secret_key_ref = {
name = "servarr-db-credentials"
key = "DB_USER"
}
}
}
POSTGRES_PASSWORD = {
value_from = {
secret_key_ref = {
name = "servarr-db-credentials"
key = "DB_PASS"
}
}
}
}
pvc = {
prowlarr-config = {
name = "prowlarr-config"
pvc_size = "10Mi"
pvc = true
mount_path = "/config"
}
servarr-data = {
name = "servarr-data"
pvc_size = "10Mi"
pvc = false
host_path = "/data"
mount_path = "/disk"
}
}
}
radarr = {
#enabled = false
image = "lscr.io/linuxserver/radarr:latest"
connected_namespace = "servarr"
#replicas = 0
service_port = [7878]
environment = {
PUID = {
value = "1000"
}
PGID = {
value = "1000"
}
TZ = {
value = "Etc/UTC"
}
}
# requirements = {
# limits-cpu = "1000m"
# limits-memory = "1Gi"
# requests-cpu = "500m"
# requests-memory = "400Mi"
# }
pvc = {
radarr-config = {
name = "radarr-config"
pvc_size = "10Mi"
pvc = true
mount_path = "/config"
}
servarr-data = {
name = "servarr-data"
pvc_size = "10Mi"
pvc = false
host_path = "/data"
mount_path = "/disk"
}
}
}
sonarr = {
#enabled = false
image = "lscr.io/linuxserver/sonarr:latest"
connected_namespace = "servarr"
#replicas = 0
service_port = [8989]
environment = {
PUID = {
value = "1000"
}
PGID = {
value = "1000"
}
TZ = {
value = "Etc/UTC"
}
}
# requirements = {
# limits-cpu = "1000m"
# limits-memory = "1Gi"
# requests-cpu = "500m"
# requests-memory = "400Mi"
# }
pvc = {
sonarr-config = {
name = "sonarr-config"
pvc_size = "10Mi"
pvc = true
mount_path = "/config"
}
servarr-data = {
name = "servarr-data"
pvc_size = "10Mi"
pvc = false
host_path = "/data"
mount_path = "/disk"
}
}
}
qbittorrent = {
#enabled = false
image = "lscr.io/linuxserver/qbittorrent:latest"
connected_namespace = "servarr"
service_port = [8080]
environment = {
PUID = {
value = "1000"
}
PGID = {
value = "1000"
}
TZ = {
value = "Etc/UTC"
}
WEBUI_PORT = {
value = "8080"
}
}
requirements = {
limits-cpu = "200m"
limits-memory = "250Mi"
requests-cpu = "100m"
requests-memory = "100Mi"
}
pvc = {
qbittorrent-config = {
name = "qbittorrent-config"
pvc_size = "10Mi"
pvc = true
mount_path = "/config"
}
servarr-data = {
name = "servarr-data"
pvc_size = "10Mi"
pvc = false
host_path = "/data"
mount_path = "/disk"
}
}
}
flaresolverr = {
#image = "ghcr.io/flaresolverr/flaresolverr:latest"
image = "alexfozor/flaresolverr:pr-1300-experimental"
connected_namespace = "servarr"
enabled = false
image = "ghcr.io/flaresolverr/flaresolverr:latest"
connected_namespace = "tservarr"
service_port = [8191]
environment = {
PUID = {
value = "1000"
}
PGID = {
value = "1000"
}
TZ = {
value = "Etc/UTC"
}
CAPTCHA_SOLVER = { value = "hcaptcha-solver"
}
}
# requirements = {
# limits-cpu = "1000m"
# limits-memory = "1Gi"
# requests-cpu = "500m"
# requests-memory = "400Mi"
# }
}
poste = {
enabled = false
image = "analogic/poste.io:latest"
service_port = [25,80,110,143,443,465,587,993,995,4190]
environment = {
PUID = {
value = "1000"
}
PGID = {
value = "1000"
}
TZ = {
value = "Etc/UTC"
}
}
# requirements = {
# limits-cpu = "1000m"
# limits-memory = "1Gi"
# requests-cpu = "500m"
# requests-memory = "400Mi"
# }
pvc = {
poste-data = {
name = "poste-data"
pvc_size = "10Mi"
pvc = true
mount_path = "/data"
}
}
}
wikijs = {
#enabled = false
image = "ghcr.io/requarks/wiki:2.5"
service_port = [3000]
extra_manifest = ["/opt/kubernetes/Terraform_kube/external_manifests/wikijs/wikijs-db.secret.yaml"]
database = {}
environment = {
PUID = {
value = "1000"
}
PGID = {
value = "1000"
}
TZ = {
value = "Etc/UTC"
}
DB_TYPE = { value = "postgres" }
DB_PORT = { value = "5432" }
POSTGRES_DB = {
value_from = {
secret_key_ref = {
name = "wikijs-db-credentials"
key = "DB_DATABASE"
}
}
}
POSTGRES_USER = {
value_from = {
secret_key_ref = {
name = "wikijs-db-credentials"
key = "DB_USER"
}
}
}
POSTGRES_PASSWORD = {
value_from = {
secret_key_ref = {
name = "wikijs-db-credentials"
key = "DB_PASS"
}
}
}
DB_NAME = {
value_from = {
secret_key_ref = {
name = "wikijs-db-credentials"
key = "DB_DATABASE"
}
}
}
DB_USER = {
value_from = {
secret_key_ref = {
name = "wikijs-db-credentials"
key = "DB_USER"
}
}
}
DB_PASS = {
value_from = {
secret_key_ref = {
name = "wikijs-db-credentials"
key = "DB_PASS"
}
}
}
DB_HOST = {
value_from = {
secret_key_ref = {
name = "wikijs-db-credentials"
key = "DB_HOST"
}
}
}
}
}
}