Set up a recovery script for MC servers

this shit happens to goddamn often-
This commit is contained in:
Salt 2020-06-25 08:42:29 -05:00
parent 4b9e2503d6
commit d698f0b588
3 changed files with 70 additions and 4 deletions

View File

@ -47,6 +47,14 @@
dest: "/var/minecraft/{{ mcname }}/modpack.zip"
url: "{{ mczip }}"
register: get_mcpack
- name: Template out scripts
template:
src: "{{ item.src }}"
dest: "/var/minecraft/{{ mcname }}/{{ item.dest }}"
mode: "{{ item.mode }}"
loop:
- { src: "install.sh", dest: "install.sh", mode: "0755" }
- { src: "recover.sh", dest: "recover.sh", mode: "0755" }
- name: Install modpack
block:
- name: Disable service
@ -71,10 +79,6 @@
remote_src: yes
dest: "/var/minecraft/{{ mcname }}"
notify: "restart minecraft {{ mcname }}"
- name: Template out install script
template:
src: "install.sh"
dest: "/var/minecraft/{{ mcname }}/install.sh"
- name: Run install script
command:
chdir: "/var/minecraft/{{ mcname }}"
@ -123,6 +127,19 @@
state: link
when: not stat_mcroot_newjar.stat.exists
when: not stat_mcroot_forgejar.stat.exists
- name: Check for world
stat:
path: "/var/minecraft/{{ mcname }}/world"
register: stat_mcroot_world
- name: Recover world, if available
block:
- name: Run recover script
command:
chdir: "/var/minecraft/{{ mcname }}"
argv:
- bash
- "./recover.sh"
notify: "restart minecraft {{ mcname }}"
- name: Configure server
block:
- name: Template out server.properties

View File

@ -0,0 +1,42 @@
#! /bin/sh
#
# recover.sh
# Recover a Minecraft world save from our S3 bucket
# Copyright (C) 2020 Vintage Salt <rehashedsalt@cock.li>
#
# Distributed under terms of the MIT license.
#
set -e
# Get to our magic dir
export MINECRAFT_DIR="/var/minecraft/{{ mcname }}"
cd "$MINECRAFT_DIR" || exit 50
# If the world directory exists, we need to ensure that we don't clobber it
if [ -d "world" ]; then
echo "Backing up current world"
tar czf "recover-world-$(date -Iseconds).tar.gz" world --remove-files
fi
# If it STILL exists, then we have a problem
if [ -d "world" ]; then
echo "World was found to exist after tarring; bailing"
exit 51
fi
# Get our latest good backup
backup="$(aws s3 ls "s3://{{ aws_backup_bucket }}/{{ mcname }}/" | tail -n 1 | awk '{print $4}')"
echo "Restoring backup: $backup"
aws s3 cp "s3://{{ aws_backup_bucket }}/{{ mcname }}/$backup" world.tgz
# Decompress it
tar xzf world.tgz
# Find the world
worlddir="$(find . -type d -name "world" | head -n 1)"
# Move it in place
mv "$worlddir" .
# Verify our work
if [ -f "world/level.dat" ]; then
echo "Recovered from backup: $backup"
else
echo "Failed to recover from backup: $backup"
fi

View File

@ -7,6 +7,13 @@
apt:
name:
- mono-complete
- name: Disable bundled services
systemd:
name: "{{ item }}"
enabled: no
state: stopped
loop:
- "mono-xsp4"
- name: Assure terraria admin group
group:
name: ter-admin