diff --git a/async-server-provisioner/config/custom-environment-variables.yml b/async-server-provisioner/config/custom-environment-variables.yml index 8caab7d..9ef986d 100644 --- a/async-server-provisioner/config/custom-environment-variables.yml +++ b/async-server-provisioner/config/custom-environment-variables.yml @@ -1,3 +1,4 @@ +env: NODE_ENV terraform_path: TERRAFORM_PATH mysql: database: MYSQL_DATABASE @@ -20,3 +21,4 @@ cloudGame: ansibleBranch: CLOUD_GAME_ANSIBLE_BRANCH apiUrl: CLOUD_GAME_API_URL apiToken: CLOUD_GAME_API_TOKEN + backupS3Bucket: CLOUD_GAME_BACKUP_S3_BUCKET diff --git a/async-server-provisioner/config/default.yml b/async-server-provisioner/config/default.yml index 56f2fa9..4dd15de 100644 --- a/async-server-provisioner/config/default.yml +++ b/async-server-provisioner/config/default.yml @@ -1,3 +1,4 @@ +env: dev terraform_path: ./terraform/02-game-server mysql: database: strapi @@ -19,6 +20,7 @@ datadog: api_key: placeholder cloudGame: - ansibleBranch: main + ansibleBranch: create-dedicated-dev-env apiUrl: http://host.docker.internal:1337 apiToken: placeholder + backupS3Bucket: cloud-game-dev diff --git a/async-server-provisioner/src/entities/GameDeployment.ts b/async-server-provisioner/src/entities/GameDeployment.ts index 52c24cf..46df1b6 100644 --- a/async-server-provisioner/src/entities/GameDeployment.ts +++ b/async-server-provisioner/src/entities/GameDeployment.ts @@ -1,5 +1,8 @@ import { CloudInstance, cloudInstanceFactory } from './CloudInstance'; import { GameInstance, gameInstanceFactory } from './GameInstance'; +import * as config from 'config'; + +const env = config.get('env'); export enum GameDeploymentStatus { STARTING = 'STARTING', @@ -15,8 +18,11 @@ export interface GameDeployment { } export function generateTFWorkspaceName(deploy: GameDeployment): string { - const rawString = `${deploy.id}-${deploy.gameInstance.name}`; - return rawString.replace(/([\s-_])/g, '-').toLowerCase(); + const rawString = `${env}-${deploy.gameInstance.id}-${deploy.gameInstance.name}`; + return rawString + .replace(/[^a-zA-Z0-9-]/g, '') + .toLowerCase() + .slice(0, 50); } export function gameDeploymentFactory(consumerUid: string, row: any): GameDeployment { diff --git a/async-server-provisioner/src/entities/MinecraftTFConfig.ts b/async-server-provisioner/src/entities/MinecraftTFConfig.ts index 8a772e0..675a3ff 100644 --- a/async-server-provisioner/src/entities/MinecraftTFConfig.ts +++ b/async-server-provisioner/src/entities/MinecraftTFConfig.ts @@ -18,6 +18,7 @@ export interface MinecraftTFConfig { port: string; description: string; }[]; + backup_s3_bucket: string; backup_paths: { path: string; }[]; @@ -52,6 +53,7 @@ export function createMinecraftTFConfigFromGameConfig(mfConfig: GameDeployment): port: `${port.port}`, description: port.name, })), + backup_s3_bucket: config.get('cloudGame.backupS3Bucket'), backup_paths: mfConfig.gameInstance.backupPaths.map((p) => ({ path: p.path, })), diff --git a/backend/.strapi-updater.json b/backend/.strapi-updater.json index cce03c3..690584a 100644 --- a/backend/.strapi-updater.json +++ b/backend/.strapi-updater.json @@ -1,5 +1,5 @@ { "latest": "4.24.1", - "lastUpdateCheck": 1714740073758, + "lastUpdateCheck": 1714910701412, "lastNotification": 1714740179673 } diff --git a/infrastructure/ansible/roles/game-server-start/tasks/fetch-backup.yml b/infrastructure/ansible/roles/game-server-start/tasks/fetch-backup.yml index b633d9b..82311bf 100644 --- a/infrastructure/ansible/roles/game-server-start/tasks/fetch-backup.yml +++ b/infrastructure/ansible/roles/game-server-start/tasks/fetch-backup.yml @@ -2,7 +2,7 @@ - include_tasks: ../../../generic/bucket.yaml - name: List all backups amazon.aws.aws_s3: - bucket: cloud-game + bucket: "{{ server.backup_s3_bucket }}" mode: list prefix: "{{ backup_folder_path.stdout }}" register: all_backups @@ -13,7 +13,7 @@ msg: "{{ backup_path }}" - name: Download backup amazon.aws.s3_object: - bucket: cloud-game + bucket: "{{ server.backup_s3_bucket }}" object: "{{ backup_path }}" dest: /root/backup.tar.gz mode: get diff --git a/infrastructure/ansible/roles/game-server-start/vars/main.yml b/infrastructure/ansible/roles/game-server-start/vars/main.yml index c5c63ab..99c566b 100644 --- a/infrastructure/ansible/roles/game-server-start/vars/main.yml +++ b/infrastructure/ansible/roles/game-server-start/vars/main.yml @@ -3,6 +3,7 @@ game_instance: id: placeholder server: docker_image: placeholder + backup_s3_bucket: placeholder backup_paths: - path: placeholder datadog: diff --git a/infrastructure/ansible/roles/shutdown-server/tasks/main.yml b/infrastructure/ansible/roles/shutdown-server/tasks/main.yml index cf43877..5890e0f 100644 --- a/infrastructure/ansible/roles/shutdown-server/tasks/main.yml +++ b/infrastructure/ansible/roles/shutdown-server/tasks/main.yml @@ -4,7 +4,7 @@ shell: tar -czf /root/backup.tar.gz -C /mnt/backup . - name: Upload Backup File to S3 amazon.aws.s3_object: - bucket: cloud-game + bucket: "{{ server.backup_s3_bucket }}" object: "{{ backup_folder_path.stdout }}{{ backup_name.stdout }}" src: /root/backup.tar.gz mode: put diff --git a/infrastructure/ansible/roles/shutdown-server/vars/main.yml b/infrastructure/ansible/roles/shutdown-server/vars/main.yml index 3d7bbbf..281a08f 100644 --- a/infrastructure/ansible/roles/shutdown-server/vars/main.yml +++ b/infrastructure/ansible/roles/shutdown-server/vars/main.yml @@ -1,3 +1,5 @@ --- +server: + backup_s3_bucket: placeholder game_instance: id: placeholder diff --git a/infrastructure/terraform/00-aws-platform/identity/files/backup.json b/infrastructure/terraform/00-aws-platform/identity/files/backup.json index 63a48e3..8513d8a 100644 --- a/infrastructure/terraform/00-aws-platform/identity/files/backup.json +++ b/infrastructure/terraform/00-aws-platform/identity/files/backup.json @@ -11,7 +11,12 @@ "s3:ListBucket", "s3:GetObjectTagging" ], - "Resource": ["arn:aws:s3:::cloud-game/*", "arn:aws:s3:::cloud-game"] + "Resource": [ + "arn:aws:s3:::cloud-game/*", + "arn:aws:s3:::cloud-game", + "arn:aws:s3:::cloud-game-dev", + "arn:aws:s3:::cloud-game-dev/*" + ] } ] } diff --git a/infrastructure/terraform/01-game-cloud-platform/cloud-game-server/main.tf b/infrastructure/terraform/01-game-cloud-platform/cloud-game-server/main.tf index c9411c1..7972360 100644 --- a/infrastructure/terraform/01-game-cloud-platform/cloud-game-server/main.tf +++ b/infrastructure/terraform/01-game-cloud-platform/cloud-game-server/main.tf @@ -66,7 +66,7 @@ module "cloud_game_server" { firewall_ids = [module.firewall.id] volume = var.cloud_game_server.volume network = { - attach = true - subnet_id = var.subnet_id + attach = true + network_id = var.network_id } } diff --git a/infrastructure/terraform/01-game-cloud-platform/cloud-game-server/variables.tf b/infrastructure/terraform/01-game-cloud-platform/cloud-game-server/variables.tf index 45de099..0246ab2 100644 --- a/infrastructure/terraform/01-game-cloud-platform/cloud-game-server/variables.tf +++ b/infrastructure/terraform/01-game-cloud-platform/cloud-game-server/variables.tf @@ -2,7 +2,7 @@ variable "name" { type = string } -variable "subnet_id" { +variable "network_id" { type = string } diff --git a/infrastructure/terraform/01-game-cloud-platform/main.tf b/infrastructure/terraform/01-game-cloud-platform/main.tf index f543091..b39513c 100644 --- a/infrastructure/terraform/01-game-cloud-platform/main.tf +++ b/infrastructure/terraform/01-game-cloud-platform/main.tf @@ -41,7 +41,7 @@ module "cloud_game_server" { source = "./cloud-game-server" name = var.name - subnet_id = module.network.subnet_ids[0] + network_id = module.network.net_id location = var.location ssh_keys = module.ssh_keys.ids cloud_game_server = var.cloud_game_server diff --git a/infrastructure/terraform/02-game-server/files/startup.sh b/infrastructure/terraform/02-game-server/files/startup.sh index 131cfb7..1b58186 100644 --- a/infrastructure/terraform/02-game-server/files/startup.sh +++ b/infrastructure/terraform/02-game-server/files/startup.sh @@ -12,6 +12,7 @@ game_instance: # game server start varibales server: docker_image: ${game_server_image} + backup_s3_bucket: ${backup_s3_bucket} backup_paths: %{ for p in backup_paths } - path: ${p.path} diff --git a/infrastructure/terraform/02-game-server/main.tf b/infrastructure/terraform/02-game-server/main.tf index 66566b8..60bc060 100644 --- a/infrastructure/terraform/02-game-server/main.tf +++ b/infrastructure/terraform/02-game-server/main.tf @@ -13,13 +13,16 @@ data "terraform_remote_state" "aws_platform" { } } -data "terraform_remote_state" "game_cloud" { - backend = "s3" - config = { - bucket = "cloud-game-tf-states" - key = "terraform/01-game-cloud-platform" - region = "eu-central-1" - } +data "hcloud_ssh_keys" "all_keys" { +} + +data "hcloud_network" "cloud_game" { + name = "cloud-game" +} + +data "hcloud_image" "latest_game_server_image" { + with_selector = "application=basic-gameserver" + most_recent = true } module "firewall" { @@ -32,22 +35,6 @@ module "firewall" { description = rule.description source_ips = ["0.0.0.0/0"] }] - # rules = [ - # { - # proto = "tcp" - # port = "22" - # }, - # { - # proto = "tcp" - # port = "25565" - # source_ips = ["0.0.0.0/0"] - # }, - # { - # proto = "tcp" - # port = "8080" - # source_ips = ["0.0.0.0/0"] - # } - # ] } module "game_server" { @@ -57,15 +44,15 @@ module "game_server" { location = var.metadata.location server_type = var.server.type - image = var.server.image + image = data.hcloud_image.latest_game_server_image.id firewall_ids = [module.firewall.id] - ssh_keys = data.terraform_remote_state.game_cloud.outputs.ssh_key_ids + ssh_keys = data.hcloud_ssh_keys.all_keys.*.id tags = local.tags network = { - attach = true - subnet_id = data.terraform_remote_state.game_cloud.outputs.network.subnet_ids.game_server + attach = true + network_id = data.hcloud_network.cloud_game.id } user_data = { @@ -79,7 +66,8 @@ module "game_server" { ansible_branch = var.ansible_branch game_instance_id = var.metadata.game_instance.id - backup_paths = [for path in var.server.backup_paths : { path = path.path }] + backup_s3_bucket = var.server.backup_s3_bucket + backup_paths = [for path in var.server.backup_paths : { path = path.path }] } } } diff --git a/infrastructure/terraform/02-game-server/variables.tf b/infrastructure/terraform/02-game-server/variables.tf index 7ffb554..f22997e 100644 --- a/infrastructure/terraform/02-game-server/variables.tf +++ b/infrastructure/terraform/02-game-server/variables.tf @@ -20,6 +20,7 @@ variable "server" { description = string })) + backup_s3_bucket = string backup_paths = list(object({ path = string })) diff --git a/infrastructure/terraform/02-game-server/vars/test.tfvars b/infrastructure/terraform/02-game-server/vars/test.tfvars index abd2732..b3a3af0 100644 --- a/infrastructure/terraform/02-game-server/vars/test.tfvars +++ b/infrastructure/terraform/02-game-server/vars/test.tfvars @@ -7,11 +7,12 @@ metadata = { } server = { - type = "cx31" - image = "68074861" - docker_image = "cloudgame/minecraft:vanilla-1.18.2" - ports = [] - backup_paths = [{ path = "isso" }] + type = "cx31" + image = "placeholder" + docker_image = "cloudgame/minecraft:vanilla-1.18.2" + ports = [] + backup_s3_bucket = "cloud-game-dev" + backup_paths = [{ path = "isso" }] } datadog = { diff --git a/infrastructure/terraform/modules/server/main.tf b/infrastructure/terraform/modules/server/main.tf index fcb35df..909bca5 100644 --- a/infrastructure/terraform/modules/server/main.tf +++ b/infrastructure/terraform/modules/server/main.tf @@ -41,6 +41,6 @@ resource "hcloud_volume_attachment" "attach" { resource "hcloud_server_network" "network_attach" { count = var.network.attach ? 1 : 0 - server_id = hcloud_server.node.id - subnet_id = var.network.subnet_id + server_id = hcloud_server.node.id + network_id = var.network.network_id } diff --git a/infrastructure/terraform/modules/server/variables.tf b/infrastructure/terraform/modules/server/variables.tf index f7a3182..012c1f5 100644 --- a/infrastructure/terraform/modules/server/variables.tf +++ b/infrastructure/terraform/modules/server/variables.tf @@ -35,12 +35,12 @@ variable "volume" { variable "network" { type = object({ - attach = bool - subnet_id = string + attach = bool + network_id = string }) default = { - attach = false - subnet_id = "" + attach = false + network_id = "" } }