├── packer ├── minecraft │ ├── java │ │ └── local │ │ │ ├── files │ │ │ ├── eula.txt │ │ │ ├── stop_server.sh │ │ │ ├── ops.json │ │ │ ├── start_server.sh │ │ │ ├── mcjava.service │ │ │ ├── original.server.properties │ │ │ └── server.properties │ │ │ ├── plugins.pkr.hcl │ │ │ ├── locals.pkr.hcl │ │ │ ├── variables.pkrvars.hcl │ │ │ ├── variables.pkr.hcl │ │ │ ├── azure.pkr.hcl │ │ │ └── build.pkr.hcl │ └── bedrock │ │ ├── local │ │ ├── plugins.pkr.hcl │ │ ├── files │ │ │ ├── stop_server.sh │ │ │ ├── start_server.sh │ │ │ └── mcbedrock.service │ │ ├── local.pkr.hcl │ │ ├── variables.pkr.hcl │ │ ├── azure.pkr.hcl │ │ └── build.pkr.hcl │ │ └── blobfuse │ │ ├── plugins.pkr.hcl │ │ ├── files │ │ ├── minecraft-fileshare.cred │ │ ├── stop_server.sh │ │ ├── mcbedrock.conf │ │ ├── start_server.sh │ │ └── mcbedrock.service │ │ ├── local.pkr.hcl │ │ ├── variables.pkr.hcl │ │ ├── azure.pkr.hcl │ │ └── build.pkr.hcl └── minecraft-bedrock-ubuntu │ └── files │ ├── backup-minecraft.sh │ └── upgrade-minecraft.sh ├── terraform ├── java │ ├── minecraft │ │ ├── modules │ │ │ └── house │ │ │ │ ├── main.tf │ │ │ │ ├── versions.tf │ │ │ │ ├── floor.tf │ │ │ │ ├── ceiling.tf │ │ │ │ ├── variables.tf │ │ │ │ └── walls.tf │ │ ├── terraform.tfvars │ │ ├── variables.tf │ │ ├── versions.tf │ │ └── main.tf │ └── azure │ │ ├── modules │ │ ├── kv │ │ │ ├── outputs.tf │ │ │ ├── variables.tf │ │ │ ├── versions.tf │ │ │ └── main.tf │ │ ├── network │ │ │ └── bastion │ │ │ │ ├── outputs.tf │ │ │ │ ├── variables.tf │ │ │ │ ├── versions.tf │ │ │ │ ├── bastion.tf │ │ │ │ └── network.tf │ │ └── vm │ │ │ ├── linux-private │ │ │ ├── versions.tf │ │ │ ├── variables.tf │ │ │ └── main.tf │ │ │ ├── linux-public │ │ │ ├── versions.tf │ │ │ ├── outputs.tf │ │ │ ├── variables.tf │ │ │ └── main.tf │ │ │ └── windows-private │ │ │ ├── versions.tf │ │ │ ├── variables.tf │ │ │ └── main.tf │ │ ├── kv.tf │ │ ├── main.tf │ │ ├── outputs.tf │ │ ├── scripts │ │ └── minecraft-postprov.sh │ │ ├── terraform.tfvars │ │ ├── versions.tf │ │ ├── variables.tf │ │ ├── ssh.tf │ │ ├── README.md │ │ ├── network.tf │ │ └── compute.tf └── bedrock │ ├── modules │ ├── kv │ │ ├── outputs.tf │ │ ├── variables.tf │ │ ├── versions.tf │ │ └── main.tf │ ├── vm │ │ ├── linux-public │ │ │ ├── outputs.tf │ │ │ ├── versions.tf │ │ │ ├── variables.tf │ │ │ └── main.tf │ │ └── windows │ │ │ ├── versions.tf │ │ │ ├── variables.tf │ │ │ └── main.tf │ └── network │ │ └── bastion │ │ ├── outputs.tf │ │ ├── variables.tf │ │ ├── versions.tf │ │ ├── bastion.tf │ │ └── network.tf │ └── azure │ ├── terraform.tfvars │ ├── .debug.tfvars │ ├── variables.tf │ ├── versions.tf │ ├── kv.tf │ ├── main.tf │ ├── ssh.tf │ ├── storage.tf │ ├── scripts │ └── setup-fileshare.sh │ ├── network.tf │ ├── vm-local.tf │ └── vm-blobfuse.tf ├── .gitignore └── README.md /packer/minecraft/java/local/files/eula.txt: -------------------------------------------------------------------------------- 1 | eula=true -------------------------------------------------------------------------------- /terraform/java/minecraft/modules/house/main.tf: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /packer/minecraft/java/local/plugins.pkr.hcl: -------------------------------------------------------------------------------- 1 | packer { 2 | required_plugins { 3 | } 4 | } -------------------------------------------------------------------------------- /packer/minecraft/bedrock/local/plugins.pkr.hcl: -------------------------------------------------------------------------------- 1 | packer { 2 | required_plugins { 3 | } 4 | } 5 | -------------------------------------------------------------------------------- /terraform/bedrock/modules/kv/outputs.tf: -------------------------------------------------------------------------------- 1 | output id { 2 | value = azurerm_key_vault.main.id 3 | } -------------------------------------------------------------------------------- /packer/minecraft/bedrock/blobfuse/plugins.pkr.hcl: -------------------------------------------------------------------------------- 1 | packer { 2 | required_plugins { 3 | } 4 | } 5 | -------------------------------------------------------------------------------- /terraform/bedrock/modules/vm/linux-public/outputs.tf: -------------------------------------------------------------------------------- 1 | output id { 2 | value = azurerm_linux_virtual_machine.main.id 3 | } -------------------------------------------------------------------------------- /packer/minecraft/bedrock/blobfuse/files/minecraft-fileshare.cred: -------------------------------------------------------------------------------- 1 | username=AZURE_FILES_USERNAME 2 | password=AZURE_FILES_PASSWORD -------------------------------------------------------------------------------- /packer/minecraft/bedrock/local/files/stop_server.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | /usr/bin/screen -Rd mcbedrock -X stuff "stop \r" -------------------------------------------------------------------------------- /packer/minecraft/java/local/files/stop_server.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | /usr/bin/screen -Rd mcserver -X stuff "stop \r" -------------------------------------------------------------------------------- /packer/minecraft/bedrock/blobfuse/files/stop_server.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | /usr/bin/screen -Rd mcbedrock -X stuff "stop \r" -------------------------------------------------------------------------------- /terraform/java/azure/modules/kv/outputs.tf: -------------------------------------------------------------------------------- 1 | output id { 2 | value = azurerm_key_vault_access_policy.terraform_user.key_vault_id 3 | } -------------------------------------------------------------------------------- /terraform/bedrock/azure/terraform.tfvars: -------------------------------------------------------------------------------- 1 | location = "West US" 2 | gallery_name = "" 3 | gallery_resource_group = "" -------------------------------------------------------------------------------- /packer/minecraft/bedrock/local/local.pkr.hcl: -------------------------------------------------------------------------------- 1 | locals { 2 | execute_command = "chmod +x {{ .Path }}; {{ .Vars }} sudo -E sh '{{ .Path }}'" 3 | } -------------------------------------------------------------------------------- /packer/minecraft/bedrock/blobfuse/local.pkr.hcl: -------------------------------------------------------------------------------- 1 | locals { 2 | execute_command = "chmod +x {{ .Path }}; {{ .Vars }} sudo -E sh '{{ .Path }}'" 3 | } -------------------------------------------------------------------------------- /terraform/java/minecraft/terraform.tfvars: -------------------------------------------------------------------------------- 1 | minecraft_server = "4.227.86.48" 2 | rcon_port = 25575 3 | rcon_password = "hashiconf2024" 4 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | **/.debug.sh 2 | **/.debug.pkrvars.hcl 3 | **/.DS_Store 4 | **/.terraform* 5 | **/terraform.tfstate* 6 | terraform/packer-tester/.debug.tfvars 7 | -------------------------------------------------------------------------------- /terraform/bedrock/azure/.debug.tfvars: -------------------------------------------------------------------------------- 1 | location = "West US" 2 | gallery_name = "galaztfmachineimagesdev" 3 | gallery_resource_group = "rg-aztf-machine-images-dev" -------------------------------------------------------------------------------- /terraform/bedrock/modules/kv/variables.tf: -------------------------------------------------------------------------------- 1 | variable location { 2 | type = string 3 | } 4 | variable name { 5 | type = string 6 | } 7 | variable resource_group_name { 8 | type = string 9 | } -------------------------------------------------------------------------------- /terraform/java/azure/modules/kv/variables.tf: -------------------------------------------------------------------------------- 1 | variable location { 2 | type = string 3 | } 4 | variable name { 5 | type = string 6 | } 7 | variable resource_group_name { 8 | type = string 9 | } -------------------------------------------------------------------------------- /terraform/bedrock/azure/variables.tf: -------------------------------------------------------------------------------- 1 | variable location { 2 | type = string 3 | } 4 | variable gallery_name { 5 | type = string 6 | } 7 | variable gallery_resource_group { 8 | type = string 9 | } -------------------------------------------------------------------------------- /terraform/bedrock/modules/kv/versions.tf: -------------------------------------------------------------------------------- 1 | terraform { 2 | required_providers { 3 | azurerm = { 4 | source = "hashicorp/azurerm" 5 | version = "~> 3.41.0" 6 | } 7 | } 8 | } -------------------------------------------------------------------------------- /terraform/bedrock/modules/network/bastion/outputs.tf: -------------------------------------------------------------------------------- 1 | output subnet_id { 2 | value = azurerm_subnet.default.id 3 | } 4 | output nsg_name { 5 | value = azurerm_network_security_group.default.name 6 | } -------------------------------------------------------------------------------- /terraform/java/azure/modules/kv/versions.tf: -------------------------------------------------------------------------------- 1 | terraform { 2 | required_providers { 3 | azurerm = { 4 | source = "hashicorp/azurerm" 5 | version = ">= 3.41.0" 6 | } 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /terraform/bedrock/modules/network/bastion/variables.tf: -------------------------------------------------------------------------------- 1 | variable location { 2 | type = string 3 | } 4 | variable name { 5 | type = string 6 | } 7 | variable resource_group_name { 8 | type = string 9 | } -------------------------------------------------------------------------------- /terraform/bedrock/modules/vm/windows/versions.tf: -------------------------------------------------------------------------------- 1 | terraform { 2 | required_providers { 3 | azurerm = { 4 | source = "hashicorp/azurerm" 5 | version = "~> 3.41.0" 6 | } 7 | } 8 | } -------------------------------------------------------------------------------- /terraform/java/azure/modules/network/bastion/outputs.tf: -------------------------------------------------------------------------------- 1 | output subnet_id { 2 | value = azurerm_subnet.default.id 3 | } 4 | output nsg_name { 5 | value = azurerm_network_security_group.default.name 6 | } -------------------------------------------------------------------------------- /terraform/bedrock/modules/network/bastion/versions.tf: -------------------------------------------------------------------------------- 1 | terraform { 2 | required_providers { 3 | azurerm = { 4 | source = "hashicorp/azurerm" 5 | version = "~> 3.41.0" 6 | } 7 | } 8 | } -------------------------------------------------------------------------------- /terraform/java/azure/modules/network/bastion/variables.tf: -------------------------------------------------------------------------------- 1 | variable location { 2 | type = string 3 | } 4 | variable name { 5 | type = string 6 | } 7 | variable resource_group_name { 8 | type = string 9 | } -------------------------------------------------------------------------------- /terraform/java/minecraft/modules/house/versions.tf: -------------------------------------------------------------------------------- 1 | terraform { 2 | required_providers { 3 | minecraft = { 4 | source = "HashiCraft/minecraft" 5 | version = ">= 0.1.1" 6 | } 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /terraform/bedrock/modules/vm/linux-public/versions.tf: -------------------------------------------------------------------------------- 1 | terraform { 2 | required_providers { 3 | azurerm = { 4 | source = "hashicorp/azurerm" 5 | version = "~> 3.41.0" 6 | } 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /terraform/java/azure/modules/network/bastion/versions.tf: -------------------------------------------------------------------------------- 1 | terraform { 2 | required_providers { 3 | azurerm = { 4 | source = "hashicorp/azurerm" 5 | version = ">= 3.41.0" 6 | } 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /terraform/java/azure/modules/vm/linux-private/versions.tf: -------------------------------------------------------------------------------- 1 | terraform { 2 | required_providers { 3 | azurerm = { 4 | source = "hashicorp/azurerm" 5 | version = "~> 3.41.0" 6 | } 7 | } 8 | } -------------------------------------------------------------------------------- /terraform/java/azure/modules/vm/linux-public/versions.tf: -------------------------------------------------------------------------------- 1 | terraform { 2 | required_providers { 3 | azurerm = { 4 | source = "hashicorp/azurerm" 5 | version = ">= 3.41.0" 6 | } 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /terraform/java/minecraft/variables.tf: -------------------------------------------------------------------------------- 1 | variable "minecraft_server" { 2 | type = string 3 | } 4 | variable "rcon_port" { 5 | type = number 6 | } 7 | variable "rcon_password" { 8 | type = string 9 | } 10 | -------------------------------------------------------------------------------- /terraform/java/azure/modules/vm/linux-public/outputs.tf: -------------------------------------------------------------------------------- 1 | output "id" { 2 | value = azurerm_linux_virtual_machine.main.id 3 | } 4 | 5 | output "public_ip_address" { 6 | value = azurerm_public_ip.main.ip_address 7 | } 8 | -------------------------------------------------------------------------------- /terraform/java/azure/modules/vm/windows-private/versions.tf: -------------------------------------------------------------------------------- 1 | terraform { 2 | required_providers { 3 | azurerm = { 4 | source = "hashicorp/azurerm" 5 | version = "~> 3.41.0" 6 | } 7 | } 8 | } -------------------------------------------------------------------------------- /packer/minecraft/java/local/files/ops.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "uuid": "6a0d662e-c278-4fde-ab30-3633a207cc69", 4 | "name": "markti22", 5 | "level": 4, 6 | "bypassesPlayerLimit": true 7 | } 8 | ] -------------------------------------------------------------------------------- /packer/minecraft/java/local/locals.pkr.hcl: -------------------------------------------------------------------------------- 1 | locals { 2 | execute_command = "chmod +x {{ .Path }}; {{ .Vars }} sudo -E sh '{{ .Path }}'" 3 | service_name = "mcjava" 4 | server_folder_name = "minecraft_java" 5 | } -------------------------------------------------------------------------------- /terraform/bedrock/azure/versions.tf: -------------------------------------------------------------------------------- 1 | terraform { 2 | required_providers { 3 | azurerm = { 4 | source = "hashicorp/azurerm" 5 | version = "~> 3.41.0" 6 | } 7 | } 8 | } 9 | 10 | provider "azurerm" { 11 | features { 12 | } 13 | } -------------------------------------------------------------------------------- /terraform/java/azure/kv.tf: -------------------------------------------------------------------------------- 1 | 2 | module "kv" { 3 | 4 | source = "./modules/kv" 5 | 6 | name = random_string.main.result 7 | resource_group_name = azurerm_resource_group.main.name 8 | location = azurerm_resource_group.main.location 9 | 10 | } 11 | -------------------------------------------------------------------------------- /terraform/java/azure/main.tf: -------------------------------------------------------------------------------- 1 | resource "random_string" "main" { 2 | length = 8 3 | upper = false 4 | special = false 5 | } 6 | 7 | resource "azurerm_resource_group" "main" { 8 | name = "rg-${var.name}-${random_string.main.result}" 9 | location = var.location 10 | } -------------------------------------------------------------------------------- /terraform/bedrock/azure/kv.tf: -------------------------------------------------------------------------------- 1 | 2 | module "kv" { 3 | 4 | source = "../modules/kv" 5 | 6 | name = random_string.main.result 7 | resource_group_name = azurerm_resource_group.main.name 8 | location = azurerm_resource_group.main.location 9 | 10 | } 11 | -------------------------------------------------------------------------------- /packer/minecraft/bedrock/blobfuse/files/mcbedrock.conf: -------------------------------------------------------------------------------- 1 | [Service] 2 | Environment="AZURE_STORAGE_ACCOUNT=NULL" 3 | Environment="AZURE_STORAGE_ACCOUNT_TYPE=block" 4 | Environment="AZURE_STORAGE_ACCOUNT_CONTAINER=NULL" 5 | Environment="AZURE_STORAGE_AUTH_TYPE=Key" 6 | Environment="AZURE_STORAGE_ACCESS_KEY=NULL" -------------------------------------------------------------------------------- /terraform/java/azure/outputs.tf: -------------------------------------------------------------------------------- 1 | 2 | output "public_ip_address" { 3 | value = can(module.minecraft_server[0].public_ip_address) ? module.minecraft_server[0].public_ip_address : null 4 | } 5 | output "minecraft_password" { 6 | value = random_password.minecraft.result 7 | sensitive = true 8 | } 9 | -------------------------------------------------------------------------------- /terraform/bedrock/azure/main.tf: -------------------------------------------------------------------------------- 1 | resource random_string main { 2 | length = 8 3 | upper = false 4 | special = false 5 | } 6 | 7 | resource azurerm_resource_group main { 8 | name = "rg-minecraft-${random_string.main.result}" 9 | location = var.location 10 | } 11 | -------------------------------------------------------------------------------- /packer/minecraft/bedrock/local/files/start_server.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | SERVER_PATH=/home/mcserver/minecraft_bedrock/ 4 | 5 | /usr/bin/screen -dmS mcbedrock /bin/bash -c "LD_LIBRARY_PATH=$SERVER_PATH ${SERVER_PATH}bedrock_server" 6 | /usr/bin/screen -rD mcbedrock -X multiuser on 7 | /usr/bin/screen -rD mcbedrock -X acladd root -------------------------------------------------------------------------------- /packer/minecraft/java/local/files/start_server.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | SERVER_PATH=/home/mcserver/minecraft_java/ 4 | 5 | /usr/bin/screen -dmS mcserver /bin/bash -c "cd $SERVER_PATH; java -Xmx1024M -Xms1024M -jar server.jar nogui" 6 | /usr/bin/screen -rD mcserver -X multiuser on 7 | /usr/bin/screen -rD mcserver -X acladd root -------------------------------------------------------------------------------- /packer/minecraft/bedrock/blobfuse/files/start_server.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | SERVER_PATH=/home/mcserver/minecraft_bedrock/ 4 | 5 | /usr/bin/screen -dmS mcbedrock /bin/bash -c "LD_LIBRARY_PATH=$SERVER_PATH ${SERVER_PATH}bedrock_server" 6 | /usr/bin/screen -rD mcbedrock -X multiuser on 7 | /usr/bin/screen -rD mcbedrock -X acladd root -------------------------------------------------------------------------------- /terraform/java/minecraft/versions.tf: -------------------------------------------------------------------------------- 1 | terraform { 2 | required_providers { 3 | minecraft = { 4 | source = "HashiCraft/minecraft" 5 | version = "~> 0.1.1" 6 | } 7 | } 8 | } 9 | 10 | provider "minecraft" { 11 | address = "${var.minecraft_server}:${var.rcon_port}" 12 | password = var.rcon_password 13 | } 14 | -------------------------------------------------------------------------------- /terraform/bedrock/modules/vm/windows/variables.tf: -------------------------------------------------------------------------------- 1 | variable location { 2 | type = string 3 | } 4 | variable name { 5 | type = string 6 | } 7 | variable resource_group_name { 8 | type = string 9 | } 10 | variable subnet_id { 11 | type = string 12 | } 13 | variable vm_image_id { 14 | type = string 15 | } 16 | variable admin_password { 17 | type = string 18 | } -------------------------------------------------------------------------------- /terraform/java/azure/scripts/minecraft-postprov.sh: -------------------------------------------------------------------------------- 1 | systemctl enable mcjava 2 | systemctl start mcjava 3 | # Define the new RCON password 4 | NEW_PASSWORD="$minecraft_password" 5 | # File to be modified 6 | FILE_PATH="/home/mcserver/minecraft_java/server.properties" 7 | # Use sed to replace the line 8 | sed -i "s/^rcon\.password=REPLACE_ME$/rcon.password=$NEW_PASSWORD/" "$FILE_PATH" -------------------------------------------------------------------------------- /terraform/bedrock/modules/vm/linux-public/variables.tf: -------------------------------------------------------------------------------- 1 | variable location { 2 | type = string 3 | } 4 | variable name { 5 | type = string 6 | } 7 | variable resource_group_name { 8 | type = string 9 | } 10 | variable subnet_id { 11 | type = string 12 | } 13 | variable vm_image_id { 14 | type = string 15 | } 16 | variable ssh_public_key { 17 | type = string 18 | } -------------------------------------------------------------------------------- /terraform/java/azure/modules/vm/linux-private/variables.tf: -------------------------------------------------------------------------------- 1 | variable location { 2 | type = string 3 | } 4 | variable name { 5 | type = string 6 | } 7 | variable resource_group_name { 8 | type = string 9 | } 10 | variable subnet_id { 11 | type = string 12 | } 13 | variable vm_image_id { 14 | type = string 15 | } 16 | variable ssh_public_key { 17 | type = string 18 | } -------------------------------------------------------------------------------- /terraform/java/azure/modules/vm/windows-private/variables.tf: -------------------------------------------------------------------------------- 1 | variable location { 2 | type = string 3 | } 4 | variable name { 5 | type = string 6 | } 7 | variable resource_group_name { 8 | type = string 9 | } 10 | variable subnet_id { 11 | type = string 12 | } 13 | variable vm_image_id { 14 | type = string 15 | } 16 | variable admin_password { 17 | type = string 18 | } -------------------------------------------------------------------------------- /terraform/java/azure/terraform.tfvars: -------------------------------------------------------------------------------- 1 | name = "hashiconf24" 2 | location = "westus3" 3 | gallery_resource_group = "rg-hashiconf24-images-hdu87ail" 4 | image_name = "minecraft-java-local" 5 | image_version = "1.0.10" 6 | minecraft_server_enabled = true 7 | minecraft_port = 25565 8 | rcon_port = 25575 9 | -------------------------------------------------------------------------------- /packer/minecraft-bedrock-ubuntu/files/backup-minecraft.sh: -------------------------------------------------------------------------------- 1 | now=`date +"%Y-%m-%d"` 2 | 3 | # stop minecraft server 4 | sudo systemctl stop mcbedrock 5 | 6 | # backup entire minecraft directory 7 | tar -cvpzf minecraft-backup${now}.tar.gz /home/mcserver/minecraft_bedrock/worlds 8 | sudo cp minecraft-backup${now}.tar.gz /mnt/homenas/minecraft/backups/ 9 | 10 | sudo systemctl start mcbedrock 11 | -------------------------------------------------------------------------------- /terraform/java/azure/versions.tf: -------------------------------------------------------------------------------- 1 | terraform { 2 | required_providers { 3 | azurerm = { 4 | source = "hashicorp/azurerm" 5 | version = "~> 4.4.0" 6 | } 7 | random = { 8 | source = "hashicorp/random" 9 | version = "~> 3.6.3" 10 | } 11 | } 12 | } 13 | 14 | provider "azurerm" { 15 | features { 16 | resource_group { 17 | prevent_deletion_if_contains_resources = false 18 | } 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /terraform/java/azure/modules/vm/linux-public/variables.tf: -------------------------------------------------------------------------------- 1 | variable "location" { 2 | type = string 3 | } 4 | variable "name" { 5 | type = string 6 | } 7 | variable "resource_group_name" { 8 | type = string 9 | } 10 | variable "subnet_id" { 11 | type = string 12 | } 13 | variable "vm_image_id" { 14 | type = string 15 | } 16 | variable "ssh_public_key" { 17 | type = string 18 | } 19 | variable "managed_identity_id" { 20 | type = string 21 | } 22 | -------------------------------------------------------------------------------- /packer/minecraft/java/local/variables.pkrvars.hcl: -------------------------------------------------------------------------------- 1 | tenant_id = "4d21d610-d7ef-413c-b647-f6f57aee320b" 2 | subscription_id = "32cfe0af-c5cf-4a55-9d85-897b85a8f07c" 3 | primary_location = "westus3" 4 | image_name = "minecraft-java-local" 5 | image_version = "1.0.11" 6 | gallery_resource_group = "rg-hashiconf24-images-hdu87ail" 7 | agent_ipaddress = "107.77.226.37" 8 | vm_size = "Standard_DS2_v2" 9 | 10 | # 107.77.226.37 -------------------------------------------------------------------------------- /packer/minecraft/java/local/variables.pkr.hcl: -------------------------------------------------------------------------------- 1 | variable subscription_id { 2 | type = string 3 | } 4 | variable tenant_id { 5 | type = string 6 | } 7 | variable primary_location { 8 | type = string 9 | } 10 | variable image_name { 11 | type = string 12 | } 13 | variable image_version { 14 | type = string 15 | } 16 | variable gallery_resource_group { 17 | type = string 18 | } 19 | variable agent_ipaddress { 20 | type = string 21 | } 22 | variable vm_size { 23 | type = string 24 | } -------------------------------------------------------------------------------- /terraform/java/azure/variables.tf: -------------------------------------------------------------------------------- 1 | variable "location" { 2 | type = string 3 | } 4 | variable "name" { 5 | type = string 6 | } 7 | variable "gallery_resource_group" { 8 | type = string 9 | } 10 | variable "image_name" { 11 | type = string 12 | } 13 | variable "image_version" { 14 | type = string 15 | } 16 | variable "minecraft_server_enabled" { 17 | type = bool 18 | } 19 | variable "minecraft_port" { 20 | type = number 21 | } 22 | variable "rcon_port" { 23 | type = number 24 | } 25 | -------------------------------------------------------------------------------- /terraform/bedrock/azure/ssh.tf: -------------------------------------------------------------------------------- 1 | resource tls_private_key main { 2 | algorithm = "RSA" 3 | rsa_bits = 2048 4 | } 5 | 6 | resource azurerm_key_vault_secret ssh_public_key { 7 | key_vault_id = module.kv.id 8 | name = "ssh-public" 9 | value = tls_private_key.main.public_key_openssh 10 | } 11 | 12 | resource azurerm_key_vault_secret ssh_private_key { 13 | key_vault_id = module.kv.id 14 | name = "ssh-private" 15 | value = tls_private_key.main.private_key_pem 16 | } -------------------------------------------------------------------------------- /packer/minecraft/java/local/files/mcjava.service: -------------------------------------------------------------------------------- 1 | [Unit] 2 | Description=Minecraft Bedrock Server 3 | Wants=network-online.target 4 | After=network-online.target 5 | 6 | [Service] 7 | Type=forking 8 | User=mcserver 9 | Group=mcserver 10 | ExecStart=/bin/bash /home/mcserver/minecraft_java/start_server.sh 11 | ExecStop=/bin/bash /home/mcserver/minecraft_java/stop_server.sh 12 | WorkingDirectory=/home/mcserver/minecraft_java/ 13 | Restart=always 14 | TimeoutStartSec=600 15 | 16 | [Install] 17 | WantedBy=multi-user.target -------------------------------------------------------------------------------- /terraform/java/azure/ssh.tf: -------------------------------------------------------------------------------- 1 | resource "tls_private_key" "main" { 2 | algorithm = "RSA" 3 | rsa_bits = 2048 4 | } 5 | 6 | resource "azurerm_key_vault_secret" "ssh_public_key" { 7 | key_vault_id = module.kv.id 8 | name = "ssh-public" 9 | value = tls_private_key.main.public_key_openssh 10 | } 11 | 12 | resource "azurerm_key_vault_secret" "ssh_private_key" { 13 | key_vault_id = module.kv.id 14 | name = "ssh-private" 15 | value = tls_private_key.main.private_key_pem 16 | } 17 | -------------------------------------------------------------------------------- /packer/minecraft/bedrock/local/files/mcbedrock.service: -------------------------------------------------------------------------------- 1 | [Unit] 2 | Description=Minecraft Bedrock Server 3 | Wants=network-online.target 4 | After=network-online.target 5 | 6 | [Service] 7 | Type=forking 8 | User=mcserver 9 | Group=mcserver 10 | ExecStart=/bin/bash /home/mcserver/minecraft_bedrock/start_server.sh 11 | ExecStop=/bin/bash /home/mcserver/minecraft_bedrock/stop_server.sh 12 | WorkingDirectory=/home/mcserver/minecraft_bedrock/ 13 | Restart=always 14 | TimeoutStartSec=600 15 | 16 | [Install] 17 | WantedBy=multi-user.target -------------------------------------------------------------------------------- /terraform/bedrock/azure/storage.tf: -------------------------------------------------------------------------------- 1 | resource azurerm_storage_account main { 2 | name = "st${random_string.main.result}" 3 | resource_group_name = azurerm_resource_group.main.name 4 | location = azurerm_resource_group.main.location 5 | account_tier = "Standard" 6 | account_replication_type = "GRS" 7 | } 8 | 9 | resource azurerm_storage_share minecraft { 10 | name = "minecraft" 11 | storage_account_name = azurerm_storage_account.main.name 12 | quota = 50 13 | } -------------------------------------------------------------------------------- /packer/minecraft/bedrock/blobfuse/files/mcbedrock.service: -------------------------------------------------------------------------------- 1 | [Unit] 2 | Description=Minecraft Bedrock Server 3 | Wants=network-online.target 4 | After=network-online.target 5 | 6 | [Service] 7 | Type=forking 8 | User=mcserver 9 | Group=mcserver 10 | ExecStart=/bin/bash /home/mcserver/minecraft_bedrock/start_server.sh 11 | ExecStop=/bin/bash /home/mcserver/minecraft_bedrock/stop_server.sh 12 | WorkingDirectory=/home/mcserver/minecraft_bedrock/ 13 | Restart=always 14 | TimeoutStartSec=600 15 | EnvironmentFile=/etc/systemd/system/mcbedrock.service.d/mcbedrock.conf 16 | 17 | [Install] 18 | WantedBy=multi-user.target -------------------------------------------------------------------------------- /packer/minecraft/bedrock/local/variables.pkr.hcl: -------------------------------------------------------------------------------- 1 | variable subscription_id { 2 | type = string 3 | } 4 | variable tenant_id { 5 | type = string 6 | } 7 | variable client_id { 8 | type = string 9 | } 10 | variable client_secret { 11 | type = string 12 | } 13 | variable primary_location { 14 | type = string 15 | } 16 | variable image_name { 17 | type = string 18 | } 19 | variable image_version { 20 | type = string 21 | } 22 | variable gallery_resource_group { 23 | type = string 24 | } 25 | variable gallery_name { 26 | type = string 27 | } 28 | variable agent_ipaddress { 29 | type = string 30 | } -------------------------------------------------------------------------------- /packer/minecraft/bedrock/blobfuse/variables.pkr.hcl: -------------------------------------------------------------------------------- 1 | variable subscription_id { 2 | type = string 3 | } 4 | variable tenant_id { 5 | type = string 6 | } 7 | variable client_id { 8 | type = string 9 | } 10 | variable client_secret { 11 | type = string 12 | } 13 | variable primary_location { 14 | type = string 15 | } 16 | variable image_name { 17 | type = string 18 | } 19 | variable image_version { 20 | type = string 21 | } 22 | variable gallery_resource_group { 23 | type = string 24 | } 25 | variable gallery_name { 26 | type = string 27 | } 28 | variable agent_ipaddress { 29 | type = string 30 | } -------------------------------------------------------------------------------- /terraform/java/minecraft/modules/house/floor.tf: -------------------------------------------------------------------------------- 1 | locals { 2 | floor_positions = flatten([ 3 | for x in range(var.start_x, var.start_x + var.house_width) : [ 4 | for z in range(var.start_z, var.start_z + var.house_length) : { 5 | x = x 6 | y = var.start_y 7 | z = z 8 | } 9 | ] 10 | ]) 11 | } 12 | 13 | resource "minecraft_block" "floor" { 14 | for_each = { for pos in local.floor_positions : "${pos.x}_${pos.y}_${pos.z}" => pos } 15 | 16 | material = var.floor_type 17 | 18 | position = { 19 | x = each.value.x 20 | y = each.value.y 21 | z = each.value.z 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /terraform/java/minecraft/modules/house/ceiling.tf: -------------------------------------------------------------------------------- 1 | locals { 2 | ceiling_y = 68 + var.wall_height + 1 3 | 4 | ceiling_positions = flatten([ 5 | for x in range(-5, 0) : [ 6 | for z in range(-15, -10) : { 7 | x = x 8 | y = local.ceiling_y 9 | z = z 10 | } 11 | ] 12 | ]) 13 | } 14 | 15 | resource "minecraft_block" "ceiling" { 16 | for_each = { for pos in local.ceiling_positions : "${pos.x}_${pos.y}_${pos.z}" => pos } 17 | 18 | material = var.ceiling_type 19 | 20 | position = { 21 | x = each.value.x 22 | y = each.value.y 23 | z = each.value.z 24 | } 25 | 26 | depends_on = [minecraft_block.walls] 27 | } 28 | -------------------------------------------------------------------------------- /terraform/java/minecraft/main.tf: -------------------------------------------------------------------------------- 1 | 2 | # -5, 67, -15 3 | /* 4 | resource "minecraft_block" "stone" { 5 | material = "minecraft:stone" 6 | 7 | position = { 8 | x = -5 9 | y = 68 10 | z = -15 11 | } 12 | 13 | depends_on = [azurerm_network_security_rule.rcon] 14 | }*/ 15 | 16 | 17 | module "house" { 18 | source = "./modules/house" 19 | 20 | start_x = 70 21 | start_y = 71 22 | start_z = -28 23 | 24 | house_width = 5 25 | house_length = 5 26 | wall_height = 3 27 | 28 | ceiling_type = "minecraft:gold_block" 29 | wall_type = "minecraft:gold_block" 30 | floor_type = "minecraft:gold_block" 31 | 32 | } 33 | 34 | 35 | # minecraft:gold_block 36 | -------------------------------------------------------------------------------- /terraform/bedrock/modules/network/bastion/bastion.tf: -------------------------------------------------------------------------------- 1 | resource azurerm_public_ip bastion { 2 | name = "pip-${var.name}" 3 | location = var.location 4 | resource_group_name = var.resource_group_name 5 | allocation_method = "Static" 6 | sku = "Standard" 7 | } 8 | 9 | resource azurerm_bastion_host main { 10 | name = "bas-${var.name}" 11 | location = var.location 12 | resource_group_name = var.resource_group_name 13 | 14 | ip_configuration { 15 | name = "configuration" 16 | subnet_id = azurerm_subnet.bastion.id 17 | public_ip_address_id = azurerm_public_ip.bastion.id 18 | } 19 | } -------------------------------------------------------------------------------- /terraform/java/azure/modules/network/bastion/bastion.tf: -------------------------------------------------------------------------------- 1 | resource azurerm_public_ip bastion { 2 | name = "pip-${var.name}" 3 | location = var.location 4 | resource_group_name = var.resource_group_name 5 | allocation_method = "Static" 6 | sku = "Standard" 7 | } 8 | 9 | resource azurerm_bastion_host main { 10 | name = "bas-${var.name}" 11 | location = var.location 12 | resource_group_name = var.resource_group_name 13 | 14 | ip_configuration { 15 | name = "configuration" 16 | subnet_id = azurerm_subnet.bastion.id 17 | public_ip_address_id = azurerm_public_ip.bastion.id 18 | } 19 | } -------------------------------------------------------------------------------- /terraform/java/azure/README.md: -------------------------------------------------------------------------------- 1 | 2 | ``` 3 | sudo systemctl status mcbedrock 4 | ``` 5 | 6 | https://pimylifeup.com/ubuntu-minecraft-bedrock-server/ 7 | 8 | if [ ! -f "/home/mcserver/minecraft_java/server.properties" ]; then echo "File '/home/mcserver/minecraft_java/server.properties' does not exist."; exit 1; fi; az storage blob upload --account-name stmc54251059 --container-name drop --name server.properties --file /home/mcserver/minecraft_java/server.properties --auth-mode login --overwrite 9 | 10 | https://minecraft-ids.grahamedgecombe.com 11 | 12 | /* 13 | start_x = 70 14 | start_y = 71 15 | start_z = -28 16 | */ 17 | 18 | /* 19 | start_x = 65 20 | start_y = 71 21 | start_z = -22 22 | */ -------------------------------------------------------------------------------- /packer/minecraft/java/local/azure.pkr.hcl: -------------------------------------------------------------------------------- 1 | source "azure-arm" "vm" { 2 | subscription_id = var.subscription_id 3 | use_azure_cli_auth = true 4 | 5 | location = var.primary_location 6 | managed_image_name = "${var.image_name}-${var.image_version}" 7 | managed_image_resource_group_name = var.gallery_resource_group 8 | communicator = "ssh" 9 | os_type = "Linux" 10 | image_publisher = "Canonical" 11 | image_offer = "0001-com-ubuntu-server-focal" 12 | image_sku = "20_04-lts" 13 | vm_size = var.vm_size 14 | allowed_inbound_ip_addresses = [var.agent_ipaddress] 15 | 16 | } -------------------------------------------------------------------------------- /terraform/bedrock/modules/kv/main.tf: -------------------------------------------------------------------------------- 1 | resource azurerm_key_vault main { 2 | name = "kv-${var.name}" 3 | location = var.location 4 | resource_group_name = var.resource_group_name 5 | tenant_id = data.azurerm_client_config.current.tenant_id 6 | purge_protection_enabled = false 7 | 8 | sku_name = "standard" 9 | } 10 | 11 | data azurerm_client_config current {} 12 | 13 | resource azurerm_key_vault_access_policy terraform_user { 14 | key_vault_id = azurerm_key_vault.main.id 15 | tenant_id = data.azurerm_client_config.current.tenant_id 16 | object_id = data.azurerm_client_config.current.object_id 17 | 18 | secret_permissions = [ 19 | "Backup", "Delete", "Get", "List", "Purge", "Recover", "Restore", "Set" 20 | ] 21 | 22 | } -------------------------------------------------------------------------------- /terraform/bedrock/azure/scripts/setup-fileshare.sh: -------------------------------------------------------------------------------- 1 | echo "Storage Account Name: "${storage_account_name} 2 | echo "Storage Account Key: "${storage_account_key} 3 | 4 | storageAccountName=${storage_account_name} 5 | storageAccountKey=${storage_account_key} 6 | 7 | echo "Storage Account Name: "$storageAccountName 8 | echo "Storage Account Key: "$storageAccountKey 9 | 10 | sed -i 's@AZURE_FILES_USERNAME@'"$storageAccountName"'@' /etc/smbcredentials/minecraft-fileshare.cred 11 | sed -i 's@AZURE_FILES_PASSWORD@'"$storageAccountKey"'@' /etc/smbcredentials/minecraft-fileshare.cred 12 | 13 | sed -i 's@STORAGE_ACCOUNT_NAME@'"$storageAccountName"'@' /etc/fstab 14 | 15 | sed -i 's/level-name=Bedrock level/level-name=DEFAULT/' /home/mcserver/minecraft_bedrock/server.properties 16 | 17 | mount -a 18 | 19 | systemctl enable mcbedrock -------------------------------------------------------------------------------- /terraform/java/azure/modules/kv/main.tf: -------------------------------------------------------------------------------- 1 | resource azurerm_key_vault main { 2 | name = "kv-${var.name}" 3 | location = var.location 4 | resource_group_name = var.resource_group_name 5 | tenant_id = data.azurerm_client_config.current.tenant_id 6 | purge_protection_enabled = false 7 | 8 | sku_name = "standard" 9 | } 10 | 11 | data azurerm_client_config current {} 12 | 13 | resource azurerm_key_vault_access_policy terraform_user { 14 | key_vault_id = azurerm_key_vault.main.id 15 | tenant_id = data.azurerm_client_config.current.tenant_id 16 | object_id = data.azurerm_client_config.current.object_id 17 | 18 | secret_permissions = [ 19 | "Backup", "Delete", "Get", "List", "Purge", "Recover", "Restore", "Set" 20 | ] 21 | 22 | } -------------------------------------------------------------------------------- /terraform/java/minecraft/modules/house/variables.tf: -------------------------------------------------------------------------------- 1 | variable "start_x" { 2 | description = "The starting X-coordinate for the house." 3 | type = number 4 | } 5 | variable "start_y" { 6 | description = "The starting Y-coordinate (ground level) for the house." 7 | type = number 8 | } 9 | variable "start_z" { 10 | description = "The starting Z-coordinate for the house." 11 | type = number 12 | } 13 | variable "floor_type" { 14 | type = string 15 | } 16 | variable "wall_type" { 17 | type = string 18 | } 19 | variable "ceiling_type" { 20 | type = string 21 | } 22 | variable "house_width" { 23 | type = number 24 | default = 5 25 | } 26 | variable "house_length" { 27 | type = number 28 | default = 5 29 | } 30 | variable "wall_height" { 31 | type = number 32 | default = 5 33 | } 34 | -------------------------------------------------------------------------------- /terraform/bedrock/azure/network.tf: -------------------------------------------------------------------------------- 1 | 2 | module "network" { 3 | 4 | source = "../modules/network/bastion" 5 | 6 | name = random_string.main.result 7 | resource_group_name = azurerm_resource_group.main.name 8 | location = azurerm_resource_group.main.location 9 | 10 | } 11 | 12 | resource azurerm_network_security_rule minecraft { 13 | name = "minecraft-port" 14 | priority = 100 15 | direction = "Inbound" 16 | access = "Allow" 17 | protocol = "*" 18 | source_port_range = "*" 19 | destination_port_range = "19132-19133" 20 | source_address_prefix = "*" 21 | destination_address_prefix = "*" 22 | resource_group_name = azurerm_resource_group.main.name 23 | network_security_group_name = module.network.nsg_name 24 | } -------------------------------------------------------------------------------- /terraform/bedrock/modules/vm/windows/main.tf: -------------------------------------------------------------------------------- 1 | 2 | resource azurerm_network_interface main { 3 | name = "nic-vm${var.name}" 4 | resource_group_name = var.resource_group_name 5 | location = var.location 6 | 7 | ip_configuration { 8 | name = "internal" 9 | subnet_id = var.subnet_id 10 | private_ip_address_allocation = "Dynamic" 11 | } 12 | } 13 | 14 | resource azurerm_windows_virtual_machine main { 15 | name = "vm${var.name}" 16 | resource_group_name = var.resource_group_name 17 | location = var.location 18 | size = "Standard_DS2_v2" 19 | admin_username = "adminuser" 20 | admin_password = var.admin_password 21 | 22 | network_interface_ids = [ 23 | azurerm_network_interface.main.id, 24 | ] 25 | 26 | os_disk { 27 | caching = "ReadWrite" 28 | storage_account_type = "Standard_LRS" 29 | } 30 | 31 | source_image_id = var.vm_image_id 32 | 33 | } -------------------------------------------------------------------------------- /terraform/java/azure/modules/vm/windows-private/main.tf: -------------------------------------------------------------------------------- 1 | 2 | resource azurerm_network_interface main { 3 | name = "nic-vm${var.name}" 4 | resource_group_name = var.resource_group_name 5 | location = var.location 6 | 7 | ip_configuration { 8 | name = "internal" 9 | subnet_id = var.subnet_id 10 | private_ip_address_allocation = "Dynamic" 11 | } 12 | } 13 | 14 | resource azurerm_windows_virtual_machine main { 15 | name = "vm${var.name}" 16 | resource_group_name = var.resource_group_name 17 | location = var.location 18 | size = "Standard_DS2_v2" 19 | admin_username = "adminuser" 20 | admin_password = var.admin_password 21 | 22 | network_interface_ids = [ 23 | azurerm_network_interface.main.id, 24 | ] 25 | 26 | os_disk { 27 | caching = "ReadWrite" 28 | storage_account_type = "Standard_LRS" 29 | } 30 | 31 | source_image_id = var.vm_image_id 32 | 33 | } -------------------------------------------------------------------------------- /terraform/java/azure/modules/vm/linux-private/main.tf: -------------------------------------------------------------------------------- 1 | 2 | resource azurerm_network_interface main { 3 | name = "nic-vm${var.name}" 4 | resource_group_name = var.resource_group_name 5 | location = var.location 6 | 7 | ip_configuration { 8 | name = "internal" 9 | subnet_id = var.subnet_id 10 | private_ip_address_allocation = "Dynamic" 11 | } 12 | } 13 | 14 | resource azurerm_linux_virtual_machine main { 15 | name = "vm${var.name}" 16 | resource_group_name = var.resource_group_name 17 | location = var.location 18 | size = "Standard_DS2_v2" 19 | admin_username = "adminuser" 20 | 21 | network_interface_ids = [ 22 | azurerm_network_interface.main.id, 23 | ] 24 | 25 | admin_ssh_key { 26 | username = "adminuser" 27 | public_key = var.ssh_public_key 28 | } 29 | 30 | os_disk { 31 | caching = "ReadWrite" 32 | storage_account_type = "Standard_LRS" 33 | } 34 | 35 | source_image_id = var.vm_image_id 36 | 37 | } -------------------------------------------------------------------------------- /terraform/bedrock/modules/network/bastion/network.tf: -------------------------------------------------------------------------------- 1 | 2 | resource azurerm_virtual_network main { 3 | name = "vnet-${var.name}" 4 | location = var.location 5 | resource_group_name = var.resource_group_name 6 | address_space = ["10.0.0.0/16"] 7 | 8 | } 9 | 10 | resource azurerm_subnet bastion { 11 | name = "AzureBastionSubnet" 12 | resource_group_name = var.resource_group_name 13 | virtual_network_name = azurerm_virtual_network.main.name 14 | address_prefixes = ["10.0.0.0/24"] 15 | } 16 | 17 | resource azurerm_subnet default { 18 | name = "snet-default" 19 | resource_group_name = var.resource_group_name 20 | virtual_network_name = azurerm_virtual_network.main.name 21 | address_prefixes = ["10.0.1.0/24"] 22 | } 23 | 24 | resource azurerm_network_security_group default { 25 | name = "nsg-default" 26 | location = var.location 27 | resource_group_name = var.resource_group_name 28 | } 29 | 30 | resource azurerm_subnet_network_security_group_association default_rule1 { 31 | subnet_id = azurerm_subnet.default.id 32 | network_security_group_id = azurerm_network_security_group.default.id 33 | } -------------------------------------------------------------------------------- /terraform/java/azure/modules/network/bastion/network.tf: -------------------------------------------------------------------------------- 1 | 2 | resource azurerm_virtual_network main { 3 | name = "vnet-${var.name}" 4 | location = var.location 5 | resource_group_name = var.resource_group_name 6 | address_space = ["10.0.0.0/16"] 7 | 8 | } 9 | 10 | resource azurerm_subnet bastion { 11 | name = "AzureBastionSubnet" 12 | resource_group_name = var.resource_group_name 13 | virtual_network_name = azurerm_virtual_network.main.name 14 | address_prefixes = ["10.0.0.0/24"] 15 | } 16 | 17 | resource azurerm_subnet default { 18 | name = "snet-default" 19 | resource_group_name = var.resource_group_name 20 | virtual_network_name = azurerm_virtual_network.main.name 21 | address_prefixes = ["10.0.1.0/24"] 22 | } 23 | 24 | resource azurerm_network_security_group default { 25 | name = "nsg-default" 26 | location = var.location 27 | resource_group_name = var.resource_group_name 28 | } 29 | 30 | resource azurerm_subnet_network_security_group_association default_rule1 { 31 | subnet_id = azurerm_subnet.default.id 32 | network_security_group_id = azurerm_network_security_group.default.id 33 | } -------------------------------------------------------------------------------- /terraform/bedrock/azure/vm-local.tf: -------------------------------------------------------------------------------- 1 | data azurerm_shared_image_version minecraft_local { 2 | name = "latest" 3 | image_name = "minecraft-bedrock-local" 4 | gallery_name = var.gallery_name 5 | resource_group_name = var.gallery_resource_group 6 | } 7 | 8 | module bedrock_local { 9 | 10 | source = "../modules/vm/linux-public" 11 | 12 | name = "local${random_string.main.result}" 13 | resource_group_name = azurerm_resource_group.main.name 14 | location = azurerm_resource_group.main.location 15 | subnet_id = module.network.subnet_id 16 | vm_image_id = data.azurerm_shared_image_version.minecraft_local.id 17 | ssh_public_key = tls_private_key.main.public_key_openssh 18 | 19 | } 20 | 21 | resource azurerm_virtual_machine_extension local_cse { 22 | 23 | count = 0 24 | 25 | name = "Minecraft-Final-Setup" 26 | virtual_machine_id = module.bedrock_local.id 27 | publisher = "Microsoft.Azure.Extensions" 28 | type = "CustomScript" 29 | type_handler_version = "2.0" 30 | 31 | settings = < pos } 27 | 28 | material = "minecraft:gold_block" 29 | 30 | position = { 31 | x = each.value.x 32 | y = each.value.y 33 | z = each.value.z 34 | } 35 | 36 | depends_on = [minecraft_block.floor] 37 | } 38 | -------------------------------------------------------------------------------- /terraform/bedrock/modules/vm/linux-public/main.tf: -------------------------------------------------------------------------------- 1 | 2 | resource azurerm_public_ip main { 3 | name = "pip-vm${var.name}" 4 | resource_group_name = var.resource_group_name 5 | location = var.location 6 | allocation_method = "Static" 7 | } 8 | 9 | resource azurerm_network_interface main { 10 | name = "nic-vm${var.name}" 11 | resource_group_name = var.resource_group_name 12 | location = var.location 13 | 14 | ip_configuration { 15 | name = "public" 16 | subnet_id = var.subnet_id 17 | private_ip_address_allocation = "Dynamic" 18 | public_ip_address_id = azurerm_public_ip.main.id 19 | } 20 | } 21 | 22 | resource azurerm_linux_virtual_machine main { 23 | name = "vm${var.name}" 24 | resource_group_name = var.resource_group_name 25 | location = var.location 26 | size = "Standard_DS2_v2" 27 | admin_username = "adminuser" 28 | 29 | network_interface_ids = [ 30 | azurerm_network_interface.main.id, 31 | ] 32 | 33 | admin_ssh_key { 34 | username = "adminuser" 35 | public_key = var.ssh_public_key 36 | } 37 | 38 | os_disk { 39 | caching = "ReadWrite" 40 | storage_account_type = "Standard_LRS" 41 | } 42 | 43 | source_image_id = var.vm_image_id 44 | 45 | } -------------------------------------------------------------------------------- /terraform/java/azure/network.tf: -------------------------------------------------------------------------------- 1 | 2 | module "network" { 3 | 4 | source = "./modules/network/bastion" 5 | 6 | name = random_string.main.result 7 | resource_group_name = azurerm_resource_group.main.name 8 | location = azurerm_resource_group.main.location 9 | 10 | } 11 | 12 | resource "azurerm_network_security_rule" "minecraft" { 13 | name = "minecraft-port" 14 | priority = 100 15 | direction = "Inbound" 16 | access = "Allow" 17 | protocol = "*" 18 | source_port_range = "*" 19 | destination_port_range = "${var.minecraft_port}-${var.minecraft_port}" 20 | source_address_prefix = "*" 21 | destination_address_prefix = "*" 22 | resource_group_name = azurerm_resource_group.main.name 23 | network_security_group_name = module.network.nsg_name 24 | } 25 | 26 | resource "azurerm_network_security_rule" "rcon" { 27 | name = "rcon-port" 28 | priority = 101 29 | direction = "Inbound" 30 | access = "Allow" 31 | protocol = "*" 32 | source_port_range = "*" 33 | destination_port_range = "${var.rcon_port}-${var.rcon_port}" 34 | source_address_prefix = "*" 35 | destination_address_prefix = "*" 36 | resource_group_name = azurerm_resource_group.main.name 37 | network_security_group_name = module.network.nsg_name 38 | } 39 | -------------------------------------------------------------------------------- /terraform/java/azure/modules/vm/linux-public/main.tf: -------------------------------------------------------------------------------- 1 | 2 | resource "azurerm_public_ip" "main" { 3 | name = "pip-vm${var.name}" 4 | resource_group_name = var.resource_group_name 5 | location = var.location 6 | allocation_method = "Static" 7 | } 8 | 9 | resource "azurerm_network_interface" "main" { 10 | name = "nic-vm${var.name}" 11 | resource_group_name = var.resource_group_name 12 | location = var.location 13 | 14 | ip_configuration { 15 | name = "public" 16 | subnet_id = var.subnet_id 17 | private_ip_address_allocation = "Dynamic" 18 | public_ip_address_id = azurerm_public_ip.main.id 19 | } 20 | } 21 | 22 | resource "azurerm_linux_virtual_machine" "main" { 23 | name = "vm${var.name}" 24 | resource_group_name = var.resource_group_name 25 | location = var.location 26 | size = "Standard_DS2_v2" 27 | admin_username = "adminuser" 28 | 29 | identity { 30 | type = "UserAssigned" 31 | identity_ids = [ 32 | var.managed_identity_id 33 | ] 34 | } 35 | 36 | network_interface_ids = [ 37 | azurerm_network_interface.main.id, 38 | ] 39 | 40 | admin_ssh_key { 41 | username = "adminuser" 42 | public_key = var.ssh_public_key 43 | } 44 | 45 | os_disk { 46 | caching = "ReadWrite" 47 | storage_account_type = "Standard_LRS" 48 | } 49 | 50 | source_image_id = var.vm_image_id 51 | 52 | } 53 | -------------------------------------------------------------------------------- /packer/minecraft/java/local/files/original.server.properties: -------------------------------------------------------------------------------- 1 | #Minecraft server properties 2 | #Sun Oct 13 11:53:59 UTC 2024 3 | accepts-transfers=false 4 | allow-flight=false 5 | allow-nether=true 6 | broadcast-console-to-ops=true 7 | broadcast-rcon-to-ops=true 8 | bug-report-link= 9 | difficulty=easy 10 | enable-command-block=false 11 | enable-jmx-monitoring=false 12 | enable-query=false 13 | enable-rcon=false 14 | enable-status=true 15 | enforce-secure-profile=true 16 | enforce-whitelist=false 17 | entity-broadcast-range-percentage=100 18 | force-gamemode=false 19 | function-permission-level=2 20 | gamemode=survival 21 | generate-structures=true 22 | generator-settings={} 23 | hardcore=false 24 | hide-online-players=false 25 | initial-disabled-packs= 26 | initial-enabled-packs=vanilla 27 | level-name=world 28 | level-seed= 29 | level-type=minecraft\:normal 30 | log-ips=true 31 | max-chained-neighbor-updates=1000000 32 | max-players=20 33 | max-tick-time=60000 34 | max-world-size=29999984 35 | motd=A Minecraft Server 36 | network-compression-threshold=256 37 | online-mode=true 38 | op-permission-level=4 39 | player-idle-timeout=0 40 | prevent-proxy-connections=false 41 | pvp=true 42 | query.port=25565 43 | rate-limit=0 44 | rcon.password= 45 | rcon.port=25575 46 | region-file-compression=deflate 47 | require-resource-pack=false 48 | resource-pack= 49 | resource-pack-id= 50 | resource-pack-prompt= 51 | resource-pack-sha1= 52 | server-ip= 53 | server-port=25565 54 | simulation-distance=10 55 | spawn-animals=true 56 | spawn-monsters=true 57 | spawn-npcs=true 58 | spawn-protection=16 59 | sync-chunk-writes=true 60 | text-filtering-config= 61 | use-native-transport=true 62 | view-distance=10 63 | white-list=false 64 | -------------------------------------------------------------------------------- /packer/minecraft/java/local/files/server.properties: -------------------------------------------------------------------------------- 1 | #Minecraft server properties 2 | #Sun Oct 13 11:53:59 UTC 2024 3 | accepts-transfers=false 4 | allow-flight=false 5 | allow-nether=true 6 | broadcast-console-to-ops=true 7 | broadcast-rcon-to-ops=true 8 | bug-report-link= 9 | difficulty=easy 10 | enable-command-block=false 11 | enable-jmx-monitoring=false 12 | enable-query=false 13 | enable-rcon=true 14 | enable-status=true 15 | enforce-secure-profile=true 16 | enforce-whitelist=false 17 | entity-broadcast-range-percentage=100 18 | force-gamemode=false 19 | function-permission-level=2 20 | gamemode=survival 21 | generate-structures=true 22 | generator-settings={} 23 | hardcore=false 24 | hide-online-players=false 25 | initial-disabled-packs= 26 | initial-enabled-packs=vanilla 27 | level-name=world 28 | level-seed=-867903255 29 | level-type=minecraft\:normal 30 | log-ips=true 31 | max-chained-neighbor-updates=1000000 32 | max-players=20 33 | max-tick-time=60000 34 | max-world-size=29999984 35 | motd=A Minecraft Server 36 | network-compression-threshold=256 37 | online-mode=true 38 | op-permission-level=4 39 | player-idle-timeout=0 40 | prevent-proxy-connections=false 41 | pvp=true 42 | query.port=25565 43 | rate-limit=0 44 | rcon.password=hashiconf2024 45 | rcon.port=25575 46 | region-file-compression=deflate 47 | require-resource-pack=false 48 | resource-pack= 49 | resource-pack-id= 50 | resource-pack-prompt= 51 | resource-pack-sha1= 52 | server-ip= 53 | server-port=25565 54 | simulation-distance=10 55 | spawn-animals=true 56 | spawn-monsters=true 57 | spawn-npcs=true 58 | spawn-protection=16 59 | sync-chunk-writes=true 60 | text-filtering-config= 61 | use-native-transport=true 62 | view-distance=10 63 | white-list=false 64 | reducedDebugInfo=false -------------------------------------------------------------------------------- /packer/minecraft-bedrock-ubuntu/files/upgrade-minecraft.sh: -------------------------------------------------------------------------------- 1 | now=`date +"%Y-%m-%d"` 2 | 3 | DOWNLOAD_URL=$(curl -H "Accept-Encoding: identity" -H "Accept-Language: en" -s -L -A "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; BEDROCK-UPDATER)" https://minecraft.net/en-us/download/server/bedrock/ | grep -o 'https://minecraft.azureedge.net/bin-linux/[^"]*') 4 | sudo wget $DOWNLOAD_URL -O bedrock-server.zip 5 | 6 | # stop minecraft server 7 | sudo systemctl stop mcbedrock 8 | 9 | # backup entire minecraft directory 10 | tar -cvpzf minecraft-full-backup${now}.tar.gz /home/mcserver/minecraft_bedrock 11 | sudo cp minecraft-full-backup${now}.tar.gz /mnt/homenas/minecraft/backups/ 12 | 13 | # copy config files to temporary backup folder 14 | sudo mkdir /home/mcserver/minecraft_backup${now} 15 | sudo mkdir /home/mcserver/minecraft_backup${now}/worlds 16 | # copy server config file 17 | sudo cp /home/mcserver/minecraft_bedrock/server.properties /home/mcserver/minecraft_backup${now}/ 18 | # copy worlds 19 | sudo cp -r /home/mcserver/minecraft_bedrock/worlds /home/mcserver/minecraft_backup${now}/worlds/ 20 | # copy allow list 21 | sudo cp /home/mcserver/minecraft_bedrock/allowlist.json /home/mcserver/minecraft_backup${now}/ 22 | 23 | sudo unzip -o ./bedrock-server.zip -d /home/mcserver/minecraft_bedrock/ 24 | 25 | # restore server config 26 | sudo cp /home/mcserver/minecraft_backup${now}/server.properties /home/mcserver/minecraft_bedrock/ 27 | # restore worlds 28 | sudo cp -r /home/mcserver/minecraft_backup${now}/worlds /home/mcserver/minecraft_bedrock/worlds/ 29 | # restore allow list 30 | sudo cp /home/mcserver/minecraft_backup${now}/allowlist.json /home/mcserver/minecraft_bedrock/ 31 | 32 | sudo chown -R mcserver: /home/mcserver 33 | 34 | sudo systemctl start mcbedrock 35 | -------------------------------------------------------------------------------- /terraform/bedrock/azure/vm-blobfuse.tf: -------------------------------------------------------------------------------- 1 | data azurerm_shared_image_version minecraft_blobfuse { 2 | name = "latest" 3 | image_name = "minecraft-bedrock-local" 4 | gallery_name = var.gallery_name 5 | resource_group_name = var.gallery_resource_group 6 | } 7 | 8 | module bedrock_blobfuse { 9 | 10 | source = "../modules/vm/linux-public" 11 | 12 | name = "fuse${random_string.main.result}" 13 | resource_group_name = azurerm_resource_group.main.name 14 | location = azurerm_resource_group.main.location 15 | subnet_id = module.network.subnet_id 16 | vm_image_id = data.azurerm_shared_image_version.minecraft_blobfuse.id 17 | ssh_public_key = tls_private_key.main.public_key_openssh 18 | 19 | } 20 | 21 | ################### 22 | # /etc/smbcredentials/minecraft-fileshare.cred 23 | ################### 24 | # username=STORAGE_ACCOUNT_NAME 25 | # password=STORAGE_ACCOUNT_KEY 26 | 27 | ################### 28 | # /etc/fstab 29 | ################### 30 | # //STORAGE_ACCOUNT_NAME.file.core.windows.net/minecraft /mount/STORAGE_ACCOUNT_NAME/minecraft cifs nofail,credentials=/etc/smbcredentials/minecraft-fileshare.cred,serverino,nosharesock,actimeo=30 31 | 32 | resource azurerm_virtual_machine_extension blobfuse_cse { 33 | 34 | count = 0 35 | 36 | name = "Minecraft-Final-Setup" 37 | virtual_machine_id = module.bedrock_blobfuse.id 38 | publisher = "Microsoft.Azure.Extensions" 39 | type = "CustomScript" 40 | type_handler_version = "2.0" 41 | 42 | settings = < /dev/null" 174 | ] 175 | } 176 | 177 | provisioner "shell" { 178 | execute_command = local.execute_command 179 | inline = ["chown -R mcserver: /home/mcserver/"] 180 | } 181 | 182 | provisioner "shell" { 183 | execute_command = local.execute_command 184 | inline = ["/usr/sbin/waagent -force -deprovision+user && export HISTSIZE=0 && sync"] 185 | only = ["azure-arm"] 186 | } 187 | 188 | } --------------------------------------------------------------------------------