From 7e527b21133e94d72e30b4aac04a47245c854f28 Mon Sep 17 00:00:00 2001 From: "martin.fencl" Date: Tue, 10 Feb 2026 15:33:56 +0100 Subject: [PATCH] add minecraft --- docker-compose/docker-compose-minecraft.yml | 42 +++++++ update_minecraft.yml | 130 ++++++++++++++++++++ 2 files changed, 172 insertions(+) create mode 100644 docker-compose/docker-compose-minecraft.yml create mode 100644 update_minecraft.yml diff --git a/docker-compose/docker-compose-minecraft.yml b/docker-compose/docker-compose-minecraft.yml new file mode 100644 index 0000000..341c2f1 --- /dev/null +++ b/docker-compose/docker-compose-minecraft.yml @@ -0,0 +1,42 @@ +services: + mc: + image: itzg/minecraft-server:latest + container_name: mc-futurecraft + restart: unless-stopped + ports: + - "25565:25565" + environment: + EULA: "TRUE" + TYPE: "AUTO_CURSEFORGE" + CF_API_KEY: "${CF_API_KEY}" + CF_SLUG: "futurecraft-5-0" + + MEMORY: "${MEMORY:-8G}" + LEVEL: "world" + DIFFICULTY: "normal" + VIEW_DISTANCE: "10" + MAX_PLAYERS: "10" + + ENABLE_RCON: "true" + RCON_PASSWORD: "${RCON_PASSWORD}" + volumes: + - mc_data:/data + + backup: + image: itzg/mc-backup:latest + container_name: mc-futurecraft-backup + restart: unless-stopped + depends_on: + - mc + environment: + SRC_DIR: /data + DEST_DIR: /data/backups + BACKUP_INTERVAL: "12h" + INITIAL_DELAY: "5m" + RCON_HOST: mc + RCON_PASSWORD: "${RCON_PASSWORD}" + volumes: + - mc_data:/data + +volumes: + mc_data: diff --git a/update_minecraft.yml b/update_minecraft.yml new file mode 100644 index 0000000..7324701 --- /dev/null +++ b/update_minecraft.yml @@ -0,0 +1,130 @@ +# update_minecraft.yml + +- name: Update Minecraft (Futurecraft) + hosts: pve2_vm + gather_facts: false + + vars: + # Compose sync (controller -> target) + compose_local_dir: "{{ playbook_dir }}/docker-compose" + compose_remote_base: "/home/{{ ansible_user }}/.ansible-compose" + compose_remote_dir: "{{ compose_remote_base }}/docker-compose" + compose_remote_archive: "{{ compose_remote_base }}/docker-compose.tar.gz" + + # Minecraft settings + mc_project: minecraft + mc_compose_filename: "docker-compose-minecraft.yml" + mc_service: mc + mc_port: 25565 + + # Persistent env file on the VM (NOT in git) + # Must contain: CF_API_KEY, RCON_PASSWORD, optionally MEMORY + mc_env_persistent: "{{ compose_remote_base }}/env/minecraft.env" + + # Container name from your compose file (used for log readiness check) + mc_container_name: "mc-futurecraft" + + tasks: + - name: Ensure remote base directory exists + ansible.builtin.file: + path: "{{ compose_remote_base }}" + state: directory + mode: "0755" + + - name: Ensure remote env directory exists + ansible.builtin.file: + path: "{{ compose_remote_base }}/env" + state: directory + mode: "0755" + + - name: Fail if persistent Minecraft env file is missing + ansible.builtin.stat: + path: "{{ mc_env_persistent }}" + register: mc_env_stat + + - name: Abort when Minecraft env is missing + ansible.builtin.fail: + msg: >- + Missing persistent env file: {{ mc_env_persistent }}. + Create it on the VM with at least: + CF_API_KEY=... + RCON_PASSWORD=... + Optional: + MEMORY=8G + when: not mc_env_stat.stat.exists + + - name: Create local archive of docker-compose directory (controller) + ansible.builtin.archive: + path: "{{ compose_local_dir }}/" + dest: "/tmp/docker-compose.tar.gz" + format: gz + delegate_to: localhost + run_once: true + + - name: Upload archive to remote host + ansible.builtin.copy: + src: "/tmp/docker-compose.tar.gz" + dest: "{{ compose_remote_archive }}" + mode: "0644" + + - name: Recreate remote compose directory + ansible.builtin.file: + path: "{{ compose_remote_dir }}" + state: absent + + - name: Ensure remote compose directory exists + ansible.builtin.file: + path: "{{ compose_remote_dir }}" + state: directory + mode: "0755" + + - name: Extract archive on remote host + ansible.builtin.unarchive: + src: "{{ compose_remote_archive }}" + dest: "{{ compose_remote_dir }}" + remote_src: true + + - name: Deploy Minecraft .env into compose directory + ansible.builtin.copy: + src: "{{ mc_env_persistent }}" + dest: "{{ compose_remote_dir }}/.env" + remote_src: true + mode: "0600" + + - name: Pull latest Minecraft images + community.docker.docker_compose_v2: + project_name: "{{ mc_project }}" + project_src: "{{ compose_remote_dir }}" + files: + - "{{ mc_compose_filename }}" + pull: always + + - name: Recreate Minecraft stack + community.docker.docker_compose_v2: + project_name: "{{ mc_project }}" + project_src: "{{ compose_remote_dir }}" + files: + - "{{ mc_compose_filename }}" + state: present + recreate: always + + - name: Wait for Minecraft port + ansible.builtin.wait_for: + host: 127.0.0.1 + port: "{{ mc_port }}" + timeout: 180 + + - name: Wait until server reports "Done" in logs (ready) + community.docker.docker_container_logs: + container: "{{ mc_container_name }}" + tail: 200 + register: mc_logs + retries: 60 + delay: 5 + until: > + (mc_logs.logs is defined) and + ( + 'Done (' in mc_logs.logs or + 'Done (' in (mc_logs.log | default('')) + ) + changed_when: false