Skip to content

Commit 2772461

Browse files
authored
feature: implement create/restore backups (#113)
* feature: implement create/restore backups * create shutdown service * create shutdown andible role
1 parent 8a0260e commit 2772461

File tree

21 files changed

+123
-36
lines changed

21 files changed

+123
-36
lines changed

async-server-provisioner/config/default.yml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,14 +11,14 @@ hetzner:
1111

1212
hcloudServer:
1313
type: cx31
14-
image: '162606073'
14+
image: '162785630'
1515
location: nbg1
1616

1717
datadog:
1818
enabled: false
1919
api_key: placeholder
2020

2121
cloudGame:
22-
ansibleBranch: main
22+
ansibleBranch: create-restore-backups
2323
apiUrl: http://host.docker.internal:1337
2424
apiToken: placeholder

async-server-provisioner/src/entities/GameInstance.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
export interface GameInstance {
2+
id: number;
23
name: string;
34
dockerImage: string;
45
ports: GameInstancePort[];
@@ -24,6 +25,7 @@ export interface GameInstanceBackupPath {
2425
export function gameInstanceFactory(row: any): GameInstance {
2526
const gameVersion = row.data.attributes.game_version;
2627
return {
28+
id: row.data.id,
2729
name: row.data.attributes.name,
2830
dockerImage: gameVersion.data.attributes.docker_image,
2931
ports: gameVersion.data.attributes.ports.map(parseGameInstancePort),

async-server-provisioner/src/entities/MinecraftTFConfig.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,9 @@ export interface MinecraftTFConfig {
55
metadata: {
66
name: string;
77
location: string;
8+
game_instance: {
9+
id: number;
10+
};
811
};
912
server: {
1013
type: string;
@@ -36,6 +39,9 @@ export function createMinecraftTFConfigFromGameConfig(mfConfig: GameDeployment):
3639
metadata: {
3740
name: generateTFWorkspaceName(mfConfig),
3841
location: mfConfig.cloudInstance.region,
42+
game_instance: {
43+
id: mfConfig.gameInstance.id,
44+
},
3945
},
4046
server: {
4147
type: mfConfig.cloudInstance.apiName,

async-server-provisioner/src/repositories/GameDeploymentRepository.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ query($id: ID) {
2323
}
2424
game_instance {
2525
data {
26+
id
2627
attributes {
2728
name
2829
game_version {
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
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

infrastructure/ansible/roles/game-server-start/handlers/main.yml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,3 +11,7 @@
1111
service:
1212
name: game-server-watcher
1313
state: started
14+
- name: Start Game Shutdown Service
15+
service:
16+
name: game-shutdown
17+
state: started
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
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
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
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 != ""

infrastructure/ansible/roles/game-server-start/tasks/main.yml

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,18 @@
33
when: datadog.enabled
44
- include_tasks: game-server-watcher.yml
55

6+
- name: Create mount path
7+
file:
8+
path: "/mnt/backup/"
9+
state: directory
10+
mode: "0777"
11+
- include_tasks: fetch-backup.yml
12+
613
- name: Fetch docker image
714
shell: /usr/bin/docker pull {{ server.docker_image }}
815
- name: Create mount paths
916
file:
10-
path: "/mnt/bakup/{{ item.path }}"
17+
path: "/mnt/backup/{{ item.path }}"
1118
state: directory
1219
mode: "0777"
1320
loop: "{{ server.backup_paths }}"
@@ -19,6 +26,8 @@
1926
group: root
2027
notify: Start Game Server
2128

29+
- include_tasks: create-server-shutdown-service.yaml
30+
2231
- name: Reload Systmed
2332
systemd:
2433
daemon_reload: yes

infrastructure/ansible/roles/game-server-start/templates/.gitkeep

Whitespace-only changes.

infrastructure/ansible/roles/game-server-start/templates/game-server.service

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ ExecStartPre=-/usr/bin/docker rm -f game-server
1010
ExecStart=/usr/bin/docker run -i --name game-server \
1111
--net host \
1212
{% for p in server.backup_paths %}
13-
-v /mnt/bakup/{{ p.path }}:{{p.path}} \
13+
-v /mnt/backup/{{ p.path }}:{{p.path}} \
1414
{% endfor %}
1515
{{ server.docker_image }}
1616
TimeoutStopSec=300
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
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

infrastructure/ansible/roles/game-server-start/vars/main.yml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
11
---
2+
game_instance:
3+
id: placeholder
24
server:
35
docker_image: placeholder
46
backup_paths:
Lines changed: 7 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,10 @@
11
---
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 .
125
- 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
1710
mode: put
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1 +1,3 @@
11
---
2+
game_instance:
3+
id: placeholder

infrastructure/packer/provisioners/common/install-ansible.sh

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,10 @@ set -ex
55
# Install ansible
66
apt-get update
77
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
912

1013
# Move ansible files from temp to proper folder
1114
mv /tmp/ansible /root
Lines changed: 15 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,17 @@
11
{
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+
]
1917
}

infrastructure/terraform/02-game-server/files/startup.sh

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@ aws:
77
aws_secret_access_key: ${aws_secret_access_key}
88
aws_default_region: eu-central-1
99
10+
game_instance:
11+
id: ${game_instance_id}
1012
# game server start varibales
1113
server:
1214
docker_image: ${game_server_image}

infrastructure/terraform/02-game-server/main.tf

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,7 @@ module "game_server" {
7777
aws_access_key_id = data.terraform_remote_state.aws_platform.outputs.access_keys["game_user.cloud-game"].access_key_id
7878
aws_secret_access_key = data.terraform_remote_state.aws_platform.outputs.access_keys["game_user.cloud-game"].secret_access_key
7979
ansible_branch = var.ansible_branch
80+
game_instance_id = var.metadata.game_instance.id
8081

8182
backup_paths = [for path in var.server.backup_paths : { path = path.path }]
8283
}

infrastructure/terraform/02-game-server/variables.tf

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,9 @@ variable "metadata" {
22
type = object({
33
name = string
44
location = string
5+
game_instance = object({
6+
id = number
7+
})
58
})
69
}
710

infrastructure/terraform/02-game-server/vars/test.tfvars

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
11
metadata = {
22
name = "minecraft-test"
33
location = "nbg1"
4+
game_instance = {
5+
id = 2
6+
}
47
}
58

69
server = {

0 commit comments

Comments
 (0)