initial commit of infrastructure

This commit is contained in:
2026-06-29 16:48:13 +00:00
commit 66c3d67e18
3 changed files with 379 additions and 0 deletions
+2
View File
@@ -0,0 +1,2 @@
*.tfvars
terraform
+132
View File
@@ -0,0 +1,132 @@
terraform {
required_providers {
proxmox = {
source = "bpg/proxmox"
version = "0.111.0"
}
}
# backend "http" {
# address = "https://gitea.oyacoi.ru/api/packages/pyrschtjag/terraform/state/proxmox"
# lock_address = "https://gitea.oyacoi.ru/api/packages/pyrschtjag/terraform/state/proxmox/lock"
# unlock_address = "https://gitea.oyacoi.ru/api/packages/pyrschtjag/terraform/state/proxmox/lock"
# lock_method = "POST"
# unlock_method = "DELETE"
# }
}
provider "proxmox" {
endpoint = "https://firebat.lan:8006/"
api_token = var.proxmox_api_token
insecure = true
}
locals {
processed_containers = {
for k, v in var.containers : k => {
vmid = v.vmid
tags = (floor(v.vmid / 100) == 10) ? "general" : (floor(v.vmid / 100) == 11) ? "services" : "games"
vlan = floor(v.vmid / 100) % 100
ip = "10.${floor(v.vmid / 100) % 100}.0.${v.vmid % 100}"
gw = "10.${floor(v.vmid / 100) % 100}.0.1"
nameserver = "10.${floor(v.vmid / 100) % 100}.0.1"
memory = v.memory
swap = v.swap
cores = v.cores
size = v.size
started = v.started
start_on_boot = v.start_on_boot
unprivileged = v.unprivileged
features = v.features
mount_point = v.mount_point
device_passthrough = v.device_passthrough
operating_system = v.operating_system
}
}
}
resource "proxmox_virtual_environment_container" "all_containers" {
for_each = local.processed_containers
node_name = "firebat"
vm_id = each.value.vmid
initialization {
hostname = each.key
ip_config {
ipv4 {
address = "${each.value.ip}/24"
gateway = each.value.gw
}
}
dns {
servers = [each.value.nameserver]
domain = "lan"
}
}
cpu {
#architecture = "amd64"
cores = each.value.cores
#limit = 0
}
memory {
dedicated = each.value.memory
swap = each.value.swap
}
network_interface {
name = "eth0"
bridge = "vmbr0"
vlan_id = each.value.vlan
firewall = true
}
disk {
datastore_id = "local-zfs"
size = each.value.size
}
features {
fuse = each.value.features.fuse
keyctl = each.value.features.keyctl
mknod = each.value.features.mknod
nesting = each.value.features.nesting
mount = each.value.features.mount
}
console {
enabled = null
tty_count = null
type = null
}
dynamic "mount_point" {
for_each = each.value.mount_point
content {
volume = mount_point.value.volume
path = mount_point.value.path
}
}
dynamic "device_passthrough" {
for_each = each.value.device_passthrough
content {
path = device_passthrough.value.path
gid = device_passthrough.value.gid
uid = device_passthrough.value.uid
mode = device_passthrough.value.mode
deny_write = device_passthrough.value.deny_write
}
}
operating_system {
type = each.value.operating_system.type
template_file_id = each.value.operating_system.template_file_id
}
unprivileged = each.value.unprivileged
started = each.value.started
start_on_boot = each.value.start_on_boot
tags = [each.value.tags]
}
+245
View File
@@ -0,0 +1,245 @@
variable "proxmox_api_token" {
type = string
sensitive = true
}
variable "containers" {
type = map(object({
vmid = number
memory = optional(number, 128)
swap = optional(number, 64)
cores = optional(number, 1)
size = optional(number, 1)
started = optional(bool, true)
start_on_boot = optional(bool, true)
unprivileged = optional(bool, true)
features = optional(object({
fuse = optional(bool, false)
keyctl = optional(bool, false)
mknod = optional(bool, false)
nesting = optional(bool, true)
mount = optional(list(string), [])
}), {
fuse = false
keyctl = false
mknod = false
nesting = true
mount = []
})
mount_point = optional(list(object({
volume = string
path = string
})), [])
device_passthrough = optional(list(object({
path = string
gid = optional(number, 0)
uid = optional(number, 0)
mode = optional(string, "0660")
deny_write = optional(bool, false)
})), [])
operating_system = optional(object({
type = optional(string, "alpine")
template_file_id = optional(string, "")
}), {
type = "alpine"
template_file_id = ""
})
}))
default = {
"nginx" = {
vmid = 1002
cores = 2
memory = 256
swap = 64
}
"pgsql" = {
vmid = 1003
cores = 2
memory = 512
swap = 256
size = 16
}
"nfs" = {
vmid = 1004
unprivileged = false
features = {
mount = ["nfs"]
}
mount_point = [
{ volume = "/mnt/media1", path = "/mnt/media1" },
{ volume = "/mnt/media2", path = "/mnt/media2" }
]
}
"ntfy" = {
vmid = 1005
cores = 2
}
"zabbix" = {
vmid = 1006
memory = 256
swap = 128
}
"smb" = {
vmid = 1007
mount_point = [
{ volume = "/mnt/media1", path = "/mnt/media1" },
{ volume = "/mnt/media2", path = "/mnt/media2" }
]
}
"vaultwarden" = {
vmid = 1102
cores = 2
}
"gitea" = {
vmid = 1103
memory = 512
swap = 256
size = 8
}
"radicale" = {
vmid = 1104
}
"slskd" = {
vmid = 1105
memory = 256
swap = 128
size = 2
mount_point = [
{ volume = "/mnt/media1", path = "/mnt/media1" },
{ volume = "/mnt/media2", path = "/mnt/media2" }
]
}
"asf" = {
vmid = 1106
memory = 256
swap = 128
size = 2
}
"rtorrent" = {
vmid = 1107
memory = 1024
swap = 512
cores = 2
mount_point = [
{ volume = "/mnt/media1", path = "/mnt/media1" },
{ volume = "/mnt/media2", path = "/mnt/media2" }
]
}
"jellyfin" = {
vmid = 1108
memory = 4096
swap = 2048
cores = 8
size = 10
mount_point = [
{ volume = "/mnt/media1", path = "/mnt/media1" },
{ volume = "/mnt/media2", path = "/mnt/media2" }
]
}
"prosody" = {
vmid = 1109
memory = 512
swap = 256
size = 12
}
"coturn" = {
vmid = 1110
memory = 512
swap = 256
}
"rclone" = {
vmid = 1111
memory = 512
swap = 256
mount_point = [
{ volume = "/var/lib/vz/dump/", path = "/mnt/backup/proxmox" },
{ volume = "/mnt/media1/backup/", path = "/mnt/backup/bananawrt" }
]
}
"obs" = {
vmid = 1112
memory = 2048
swap = 1024
cores = 4
size = 5
start_on_boot = false
started = false
device_passthrough = [
#{ path = "/dev/dri/card0", gid = 983, uid = 0, mode = "0660" },
#{ path = "/dev/dri/renderD128", gid = 987, uid = 0, mode = "0660" },
#{ path = "/dev/video0", gid = 983, uid = 0, mode = "0660" },
#{ path = "/dev/video1", gid = 983, uid = 0, mode = "0660" },
#{ path = "/dev/video3", gid = 983, uid = 0, mode = "0660" },
#{ path = "/dev/video4", gid = 983, uid = 0, mode = "0660" },
#{ path = "/dev/snd/controlC2", gid = 995, uid = 0, mode = "0660" },
#{ path = "/dev/snd/controlC3", gid = 995, uid = 0, mode = "0660" },
#{ path = "/dev/snd/controlC4", gid = 995, uid = 0, mode = "0660" },
#{ path = "/dev/snd/pcmC2D0c", gid = 995, uid = 0, mode = "0660" },
#{ path = "/dev/snd/pcmC3D0c", gid = 995, uid = 0, mode = "0660" },
#{ path = "/dev/snd/pcmC4D0c", gid = 995, uid = 0, mode = "0660" },
#{ path = "/dev/snd/pcmC4D0p", gid = 995, uid = 0, mode = "0660" }
]
operating_system = {
type = "archlinux"
}
}
"torrserver" = {
vmid = 1113
memory = 2048
swap = 1024
cores = 1
}
"prowlarr" = {
vmid = 1114
memory = 512
swap = 256
}
"bylampa" = {
vmid = 1115
memory = 512
swap = 256
}
"flaresolverr" = {
vmid = 1116
memory = 1024
swap = 512
cores = 2
size = 2
}
"gitearunner" = {
vmid = 1117
memory = 1024
swap = 512
cores = 2
operating_system = {
type = "alpine"
template_file_id = "local:vztmpl/alpine-3.23-default_20260116_amd64.tar.xz"
}
}
"ps3netsrv" = {
vmid = 1202
mount_point = [
{ volume = "/mnt/media1", path = "/mnt/media1" },
{ volume = "/mnt/media2", path = "/mnt/media2" }
]
}
"mcsmanager" = {
vmid = 1203
memory = 6144
swap = 3072
cores = 8
size = 20
}
"steamcmd" = {
vmid = 1204
memory = 6144
swap = 3072
cores = 8
size = 32
operating_system = {
type = "debian"
}
}
}
}