first commit

This commit is contained in:
Khwezi Mngoma
2026-02-22 16:43:17 +02:00
commit 0410dc3950
94 changed files with 9739 additions and 0 deletions

7
minecraft/config.ini Normal file
View File

@@ -0,0 +1,7 @@
[all:vars]
ansible_python_interpreter=/usr/bin/python3
ansible_user=ansible
ansible_ssh_private_key_file=~/.ssh/id_ed25519
[gameservers]
minecraft ansible_host=minecraft.mngoma.lab

View File

@@ -0,0 +1,105 @@
---
- name: Full Minecraft Server Setup (Paper + Geyser + Floodgate)
hosts: gameservers
become: yes
vars:
minecraft_user: minecraft
minecraft_home: /opt/minecraft
paper_version: "1.21.1"
paper_build: "130"
java_opts: "-Xms1G -Xmx3G -XX:+UseG1GC -XX:+ParallelRefProcEnabled -XX:MaxGCPauseMillis=200 -XX:+UnlockExperimentalVMOptions -XX:+DisableExplicitGC -XX:G1NewSizePercent=30 -XX:G1MaxNewSizePercent=40 -XX:G1HeapRegionSize=8M -XX:G1ReservePercent=20 -XX:G1HeapWastePercent=5 -XX:G1MixedGCCountTarget=4 -XX:InitiatingHeapOccupancyPercent=15 -XX:G1MixedGCLiveThresholdPercent=90 -XX:G1RSetUpdatingPauseTimePercent=5 -XX:SurvivorRatio=32 -XX:+PerfDisableSharedMem -XX:MaxTenuringThreshold=1"
tasks:
- name: Ensure required packages
apt:
name:
- openjdk-21-jdk
- curl
- unzip
state: present
update_cache: yes
- name: Create minecraft user
user:
name: "{{ minecraft_user }}"
shell: /bin/bash
create_home: yes
home: "{{ minecraft_home }}"
- name: Create server directory
file:
path: "{{ minecraft_home }}"
state: directory
owner: "{{ minecraft_user }}"
group: "{{ minecraft_user }}"
mode: '0755'
- name: Download PaperMC server
get_url:
url: "https://api.papermc.io/v2/projects/paper/versions/{{ paper_version }}/builds/{{ paper_build }}/downloads/paper-{{ paper_version }}-{{ paper_build }}.jar"
dest: "{{ minecraft_home }}/paper.jar"
owner: "{{ minecraft_user }}"
group: "{{ minecraft_user }}"
mode: '0755'
- name: Download Geyser-Spigot plugin
get_url:
url: "https://ci.opencollab.dev/job/GeyserMC/job/Geyser/job/master/lastSuccessfulBuild/artifact/bootstrap/spigot/target/Geyser-Spigot.jar"
dest: "{{ minecraft_home }}/plugins/Geyser-Spigot.jar"
owner: "{{ minecraft_user }}"
group: "{{ minecraft_user }}"
mode: '0644'
- name: Download Floodgate plugin
get_url:
url: "https://ci.opencollab.dev/job/GeyserMC/job/Floodgate/job/master/lastSuccessfulBuild/artifact/spigot/build/libs/floodgate-spigot.jar"
dest: "{{ minecraft_home }}/plugins/floodgate-spigot.jar"
owner: "{{ minecraft_user }}"
group: "{{ minecraft_user }}"
mode: '0644'
- name: Create start.sh script
copy:
dest: "{{ minecraft_home }}/start.sh"
content: |
#!/bin/bash
cd {{ minecraft_home }}
exec java {{ java_opts }} -jar paper.jar nogui
owner: "{{ minecraft_user }}"
group: "{{ minecraft_user }}"
mode: '0755'
- name: Accept EULA
copy:
dest: "{{ minecraft_home }}/eula.txt"
content: "eula=true"
owner: "{{ minecraft_user }}"
group: "{{ minecraft_user }}"
mode: '0644'
- name: Create systemd service
copy:
dest: /etc/systemd/system/minecraft.service
content: |
[Unit]
Description=Minecraft Server
After=network.target
[Service]
User={{ minecraft_user }}
WorkingDirectory={{ minecraft_home }}
ExecStart={{ minecraft_home }}/start.sh
Restart=on-failure
RestartSec=10
[Install]
WantedBy=multi-user.target
mode: '0644'
- name: Reload systemd and enable Minecraft service
systemd:
daemon_reload: yes
name: minecraft
enabled: yes
state: started

View File

@@ -0,0 +1,80 @@
---
- name: Update Minecraft Server
hosts: minecraft
become: true
vars:
minecraft_user: minecraft
minecraft_home: /opt/minecraft
mc_service_name: minecraft
mc_version_manifest: https://piston-meta.mojang.com/mc/game/version_manifest.json
backup_dir: "{{ minecraft_home }}/backup"
timestamp: "{{ lookup('pipe', 'date +%Y%m%d%H%M%S') }}"
tasks:
- name: Ensure jq and wget are installed
apt:
name: [ wget, jq ]
state: present
update_cache: true
- name: Stop Minecraft service
systemd:
name: "{{ mc_service_name }}"
state: stopped
- name: Create backup directory
file:
path: "{{ backup_dir }}"
state: directory
owner: "{{ minecraft_user }}"
group: "{{ minecraft_user }}"
mode: "0755"
- name: Backup current server.jar
copy:
src: "{{ minecraft_home }}/server.jar"
dest: "{{ backup_dir }}/server.jar.{{ timestamp }}"
remote_src: true
ignore_errors: yes # in case it's missing (first run)
- name: Backup world data folder
archive:
path: "{{ minecraft_home }}/world"
dest: "{{ backup_dir }}/world-{{ timestamp }}.tar.gz"
format: gz
become_user: "{{ minecraft_user }}"
when: ansible.builtin.stat.path is not none
ignore_errors: yes
- name: Download latest Minecraft server JAR
shell: |
set -e
cd "{{ minecraft_home }}"
latest_url=$(wget -qO- {{ mc_version_manifest }} | jq -r '.latest.release as $v | .versions[] | select(.id == $v) | .url')
server_url=$(wget -qO- "$latest_url" | jq -r '.downloads.server.url')
wget -qO server.jar "$server_url"
args:
executable: /bin/bash
- name: Ensure correct ownership of files
file:
path: "{{ minecraft_home }}"
owner: "{{ minecraft_user }}"
group: "{{ minecraft_user }}"
recurse: true
- name: Start Minecraft service
systemd:
name: "{{ mc_service_name }}"
state: started
- name: Verify service is running
systemd:
name: "{{ mc_service_name }}"
state: started
enabled: true
- name: Display success message
debug:
msg: "Minecraft server updated and restarted successfully on {{ inventory_hostname }}"