File tree Expand file tree Collapse file tree 21 files changed +123
-36
lines changed
packer/provisioners/common
00-aws-platform/identity/files Expand file tree Collapse file tree 21 files changed +123
-36
lines changed Original file line number Diff line number Diff line change @@ -11,14 +11,14 @@ hetzner:
11
11
12
12
hcloudServer :
13
13
type : cx31
14
- image : ' 162606073 '
14
+ image : ' 162785630 '
15
15
location : nbg1
16
16
17
17
datadog :
18
18
enabled : false
19
19
api_key : placeholder
20
20
21
21
cloudGame :
22
- ansibleBranch : main
22
+ ansibleBranch : create-restore-backups
23
23
apiUrl : http://host.docker.internal:1337
24
24
apiToken : placeholder
Original file line number Diff line number Diff line change 1
1
export interface GameInstance {
2
+ id : number ;
2
3
name : string ;
3
4
dockerImage : string ;
4
5
ports : GameInstancePort [ ] ;
@@ -24,6 +25,7 @@ export interface GameInstanceBackupPath {
24
25
export function gameInstanceFactory ( row : any ) : GameInstance {
25
26
const gameVersion = row . data . attributes . game_version ;
26
27
return {
28
+ id : row . data . id ,
27
29
name : row . data . attributes . name ,
28
30
dockerImage : gameVersion . data . attributes . docker_image ,
29
31
ports : gameVersion . data . attributes . ports . map ( parseGameInstancePort ) ,
Original file line number Diff line number Diff line change @@ -5,6 +5,9 @@ export interface MinecraftTFConfig {
5
5
metadata : {
6
6
name : string ;
7
7
location : string ;
8
+ game_instance : {
9
+ id : number ;
10
+ } ;
8
11
} ;
9
12
server : {
10
13
type : string ;
@@ -36,6 +39,9 @@ export function createMinecraftTFConfigFromGameConfig(mfConfig: GameDeployment):
36
39
metadata : {
37
40
name : generateTFWorkspaceName ( mfConfig ) ,
38
41
location : mfConfig . cloudInstance . region ,
42
+ game_instance : {
43
+ id : mfConfig . gameInstance . id ,
44
+ } ,
39
45
} ,
40
46
server : {
41
47
type : mfConfig . cloudInstance . apiName ,
Original file line number Diff line number Diff line change @@ -23,6 +23,7 @@ query($id: ID) {
23
23
}
24
24
game_instance {
25
25
data {
26
+ id
26
27
attributes {
27
28
name
28
29
game_version {
Original file line number Diff line number Diff line change
1
+ ---
2
+ - name : Generate bucket path
3
+ shell : echo "game_instances/{{ game_instance.id }}/backups/"
4
+ register : backup_folder_path
5
+ - name : Generate Backup name
6
+ shell : echo "backup-$(date +"%Y-%m-%d_%H_%M_%S").tar.gz"
7
+ register : backup_name
Original file line number Diff line number Diff line change 11
11
service :
12
12
name : game-server-watcher
13
13
state : started
14
+ - name : Start Game Shutdown Service
15
+ service :
16
+ name : game-shutdown
17
+ state : started
Original file line number Diff line number Diff line change
1
+ ---
2
+ - name : Create server shutdown systemd service
3
+ template :
4
+ src : game-shutdown.service
5
+ dest : /etc/systemd/system/game-shutdown.service
6
+ owner : root
7
+ group : root
8
+ notify : Start Game Shutdown Service
9
+
10
+ - name : Reload Systmed
11
+ systemd :
12
+ daemon_reload : yes
Original file line number Diff line number Diff line change
1
+ ---
2
+ - include_tasks : ../../../generic/bucket.yaml
3
+ - name : List all backups
4
+ amazon.aws.aws_s3 :
5
+ bucket : cloud-game
6
+ mode : list
7
+ prefix : " {{ backup_folder_path.stdout }}"
8
+ register : all_backups
9
+ - set_fact :
10
+ backup_path : " {{ all_backups.s3_keys[0] if all_backups.s3_keys | length > 0 else '' }}"
11
+ - name : " Debug print backup path"
12
+ debug :
13
+ msg : " {{ backup_path }}"
14
+ - name : Download backup
15
+ amazon.aws.s3_object :
16
+ bucket : cloud-game
17
+ object : " {{ backup_path }}"
18
+ dest : /root/backup.tar.gz
19
+ mode : get
20
+ when : backup_path != ""
21
+ - name : Unzip archive
22
+ unarchive :
23
+ src : /root/backup.tar.gz
24
+ dest : /mnt/backup/
25
+ when : backup_path != ""
Original file line number Diff line number Diff line change 3
3
when : datadog.enabled
4
4
- include_tasks : game-server-watcher.yml
5
5
6
+ - name : Create mount path
7
+ file :
8
+ path : " /mnt/backup/"
9
+ state : directory
10
+ mode : " 0777"
11
+ - include_tasks : fetch-backup.yml
12
+
6
13
- name : Fetch docker image
7
14
shell : /usr/bin/docker pull {{ server.docker_image }}
8
15
- name : Create mount paths
9
16
file :
10
- path : " /mnt/bakup /{{ item.path }}"
17
+ path : " /mnt/backup /{{ item.path }}"
11
18
state : directory
12
19
mode : " 0777"
13
20
loop : " {{ server.backup_paths }}"
19
26
group : root
20
27
notify : Start Game Server
21
28
29
+ - include_tasks : create-server-shutdown-service.yaml
30
+
22
31
- name : Reload Systmed
23
32
systemd :
24
33
daemon_reload : yes
Original file line number Diff line number Diff line change @@ -10,7 +10,7 @@ ExecStartPre=-/usr/bin/docker rm -f game-server
10
10
ExecStart =/usr/bin/docker run -i --name game-server \
11
11
--net host \
12
12
{% for p in server.backup_paths %}
13
- -v /mnt/bakup /{{ p.path }}:{{p.path}} \
13
+ -v /mnt/backup /{{ p.path }}:{{p.path}} \
14
14
{% endfor %}
15
15
{{ server.docker_image }}
16
16
TimeoutStopSec =300
Original file line number Diff line number Diff line change
1
+ [Unit]
2
+ Description =Game Shutdown
3
+ After =network-online.target
4
+ Before =game-server.service
5
+ Requires =docker.service network-online.target game-server.service
6
+
7
+ [Service]
8
+ User =root
9
+ RemainAfterExit =true
10
+ ExecStop =/usr/local/bin/ansible-playbook /tmp/cloud-gameserver/infrastructure/ansible/shutdown-server.yml --extra-vars "@/root/ansible/vars/game-server.yaml"
11
+ TimeoutStopSec =600
12
+
13
+ [Install]
14
+ WantedBy =multi-user.target
Original file line number Diff line number Diff line change 1
1
---
2
+ game_instance :
3
+ id : placeholder
2
4
server :
3
5
docker_image : placeholder
4
6
backup_paths :
Original file line number Diff line number Diff line change 1
1
---
2
- - name : Generate Backup name
3
- shell : echo "backup-$(date +"%Y-%m-%d_%H_%M_%S").tar.gz"
4
- register : backup_name
5
-
6
- - name : Archive Game Files
7
- archive :
8
- format : gz
9
- path : /root/game-server/
10
- dest : /tmp/{{ backup_name.stdout }}
11
-
2
+ - include_tasks : ../../../generic/bucket.yaml
3
+ - name : Create a tar.gz archive of a single file.
4
+ shell : tar -czf /root/backup.tar.gz -C /mnt/backup .
12
5
- name : Upload Backup File to S3
13
- amazon.aws.aws_s3 :
14
- bucket : " {{ bucket_name }} "
15
- object : /{{base_path}}/ {{ backup_name.stdout }}
16
- src : /tmp/{{ backup_name.stdout }}
6
+ amazon.aws.s3_object :
7
+ bucket : cloud-game
8
+ object : " {{ backup_folder_path.stdout }} {{ backup_name.stdout }}"
9
+ src : /root/backup.tar.gz
17
10
mode : put
Original file line number Diff line number Diff line change 1
1
---
2
+ game_instance :
3
+ id : placeholder
Original file line number Diff line number Diff line change 5
5
# Install ansible
6
6
apt-get update
7
7
apt-get install -y python3 python3-pip
8
- pip3 install -I ansible==5.6.0
8
+ pip3 install -I ansible==8.7.0 boto3
9
+
10
+ # Install ansible dependencies
11
+ ansible-galaxy collection install amazon.aws
9
12
10
13
# Move ansible files from temp to proper folder
11
14
mv /tmp/ansible /root
Original file line number Diff line number Diff line change 1
1
{
2
- "Version" : " 2012-10-17" ,
3
- "Statement" : [
4
- {
5
- "Sid" : " VisualEditor0" ,
6
- "Effect" : " Allow" ,
7
- "Action" : [
8
- " s3:PutObject" ,
9
- " s3:GetObject" ,
10
- " s3:PutObjectAcl" ,
11
- " s3:ListBucket"
12
- ],
13
- "Resource" : [
14
- " arn:aws:s3:::cloud-game/*" ,
15
- " arn:aws:s3:::cloud-game"
16
- ]
17
- }
18
- ]
2
+ "Version" : " 2012-10-17" ,
3
+ "Statement" : [
4
+ {
5
+ "Sid" : " VisualEditor0" ,
6
+ "Effect" : " Allow" ,
7
+ "Action" : [
8
+ " s3:PutObject" ,
9
+ " s3:GetObject" ,
10
+ " s3:PutObjectAcl" ,
11
+ " s3:ListBucket" ,
12
+ " s3:GetObjectTagging"
13
+ ],
14
+ "Resource" : [" arn:aws:s3:::cloud-game/*" , " arn:aws:s3:::cloud-game" ]
15
+ }
16
+ ]
19
17
}
Original file line number Diff line number Diff line change 7
7
aws_secret_access_key: ${aws_secret_access_key}
8
8
aws_default_region: eu-central-1
9
9
10
+ game_instance:
11
+ id: ${game_instance_id}
10
12
# game server start varibales
11
13
server:
12
14
docker_image: ${game_server_image}
Original file line number Diff line number Diff line change @@ -77,6 +77,7 @@ module "game_server" {
77
77
aws_access_key_id = data.terraform_remote_state.aws_platform.outputs.access_keys[" game_user.cloud-game" ].access_key_id
78
78
aws_secret_access_key = data.terraform_remote_state.aws_platform.outputs.access_keys[" game_user.cloud-game" ].secret_access_key
79
79
ansible_branch = var.ansible_branch
80
+ game_instance_id = var.metadata.game_instance.id
80
81
81
82
backup_paths = [for path in var . server . backup_paths : { path = path.path }]
82
83
}
Original file line number Diff line number Diff line change @@ -2,6 +2,9 @@ variable "metadata" {
2
2
type = object ({
3
3
name = string
4
4
location = string
5
+ game_instance = object ({
6
+ id = number
7
+ })
5
8
})
6
9
}
7
10
Original file line number Diff line number Diff line change 1
1
metadata = {
2
2
name = " minecraft-test"
3
3
location = " nbg1"
4
+ game_instance = {
5
+ id = 2
6
+ }
4
7
}
5
8
6
9
server = {
You can’t perform that action at this time.
0 commit comments