From f2aa6375fd0b13c15f2750ab6f56bd269bb72da2 Mon Sep 17 00:00:00 2001 From: Sergei Poljanski Date: Thu, 12 Nov 2026 20:54:22 +0400 Subject: [PATCH] ansible: retire Minecraft Fossils The Fabric server holds 8.8 GB of asxpio-services' 15 GB of RAM, more than everything else on the host together, and the XMPP server moves here next. Save the world, remove its containers and the daily restart timer. The world stays in /opt/minecraft-fossils/data, and in the restic backups, until it is deleted by hand. Assisted-by: Claude:opus-5-5 --- .../services_servers/minecraft.yaml | 4 - .../files/docker-compose.yml | 87 ------------------- .../files/minecraft-fossils-restart.service | 8 -- .../files/minecraft-fossils-restart.timer | 10 --- .../roles/minecraft_fossils/tasks/main.yaml | 76 +++++++--------- .../templates/secrets.env.j2 | 2 - ansible/site.yaml | 2 +- 7 files changed, 34 insertions(+), 155 deletions(-) delete mode 100644 ansible/inventory/group_vars/services_servers/minecraft.yaml delete mode 100644 ansible/roles/minecraft_fossils/files/docker-compose.yml delete mode 100644 ansible/roles/minecraft_fossils/files/minecraft-fossils-restart.service delete mode 100644 ansible/roles/minecraft_fossils/files/minecraft-fossils-restart.timer delete mode 100644 ansible/roles/minecraft_fossils/templates/secrets.env.j2 diff --git a/ansible/inventory/group_vars/services_servers/minecraft.yaml b/ansible/inventory/group_vars/services_servers/minecraft.yaml deleted file mode 100644 index 6914552..0000000 --- a/ansible/inventory/group_vars/services_servers/minecraft.yaml +++ /dev/null @@ -1,4 +0,0 @@ ---- -minecraft_fossils_owner: asxpi -minecraft_fossils_rcon_password: "{{ vault_minecraft_fossils_rcon_password }}" -minecraft_fossils_cf_api_key: "{{ vault_minecraft_fossils_cf_api_key }}" diff --git a/ansible/roles/minecraft_fossils/files/docker-compose.yml b/ansible/roles/minecraft_fossils/files/docker-compose.yml deleted file mode 100644 index c937a27..0000000 --- a/ansible/roles/minecraft_fossils/files/docker-compose.yml +++ /dev/null @@ -1,87 +0,0 @@ -services: - minecraft-fossils: - image: itzg/minecraft-server:java21 - container_name: minecraft-fossils - restart: unless-stopped - stop_grace_period: 2m - stdin_open: true - tty: true - ports: - - "25566:25565" - env_file: - - secrets.env - environment: - EULA: "TRUE" - TYPE: FABRIC - VERSION: "1.20.1" - FABRIC_LOADER_VERSION: "0.18.4" - MEMORY: "8G" - ONLINE_MODE: "FALSE" - ENFORCE_WHITELIST: "TRUE" - ENFORCE_SECURE_PROFILE: "FALSE" - WHITELIST_FILE: /data/whitelist.json - OPS_FILE: /data/ops.json - ENABLE_RCON: "TRUE" - MOTD: "[mc.czsk.dev] Fossils Archaeology Revival: Genesis" - USE_AIKAR_FLAGS: "TRUE" - volumes: - - /opt/minecraft-fossils/data:/data - networks: - - fossils - - whitelist-sync: - image: alpine:3 - container_name: minecraft-fossils-wlsync - restart: unless-stopped - depends_on: - - minecraft-fossils - volumes: - - /opt/minecraft:/src:ro - - /opt/minecraft-fossils/data:/dst - env_file: - - secrets.env - environment: - RCON_HOST: minecraft-fossils - INTERVAL: "15" - command: - - sh - - -c - - | - apk add --no-cache python3 >/dev/null - cat > /rcon.py <<'PY' - import socket, struct, sys, os - host, port, pw, cmd = os.environ["RCON_HOST"], 25575, os.environ["RCON_PASSWORD"], sys.argv[1] - def pkt(i, t, b): p = struct.pack("/dev/null; then - cp /src/$$f /dst/$$f - echo "[wlsync] copied $$f" - case $$f in - whitelist.json) CMD="whitelist reload" ;; - ops.json) CMD="reload" ;; - banned-players.json|banned-ips.json) CMD="kick @a Ban list updated" ;; - esac - python3 /rcon.py "$$CMD" 2>&1 | sed 's/^/[wlsync] rcon: /' || echo "[wlsync] rcon failed" - fi - done - sleep $$INTERVAL - done - networks: - - fossils - -networks: - fossils: - driver: bridge diff --git a/ansible/roles/minecraft_fossils/files/minecraft-fossils-restart.service b/ansible/roles/minecraft_fossils/files/minecraft-fossils-restart.service deleted file mode 100644 index 7798cd6..0000000 --- a/ansible/roles/minecraft_fossils/files/minecraft-fossils-restart.service +++ /dev/null @@ -1,8 +0,0 @@ -[Unit] -Description=Daily restart of minecraft-fossils container -Requires=docker.service -After=docker.service - -[Service] -Type=oneshot -ExecStart=/usr/bin/docker restart minecraft-fossils diff --git a/ansible/roles/minecraft_fossils/files/minecraft-fossils-restart.timer b/ansible/roles/minecraft_fossils/files/minecraft-fossils-restart.timer deleted file mode 100644 index aee390a..0000000 --- a/ansible/roles/minecraft_fossils/files/minecraft-fossils-restart.timer +++ /dev/null @@ -1,10 +0,0 @@ -[Unit] -Description=Restart minecraft-fossils daily at 08:00 Europe/Tallinn - -[Timer] -OnCalendar=*-*-* 08:00:00 Europe/Tallinn -Persistent=true -Unit=minecraft-fossils-restart.service - -[Install] -WantedBy=timers.target diff --git a/ansible/roles/minecraft_fossils/tasks/main.yaml b/ansible/roles/minecraft_fossils/tasks/main.yaml index 1e20de5..3994dcf 100644 --- a/ansible/roles/minecraft_fossils/tasks/main.yaml +++ b/ansible/roles/minecraft_fossils/tasks/main.yaml @@ -1,49 +1,39 @@ --- -# Fabric server plus a sidecar that mirrors the whitelist, ops and ban -# lists from the Paper server. World data in /opt/minecraft-fossils/data -# is not managed here. A compose change recreates the container, so it -# is saved and stopped with time to finish first. -- name: Deploy Minecraft Fossils - ansible.builtin.include_role: - name: docker_service - vars: - service_name: "minecraft-fossils" - service_base_path: "{{ services_base_path }}/minecraft-fossils" - service_templates: - - src: "secrets.env.j2" - dest: "secrets.env" - owner: "{{ minecraft_fossils_owner }}" - group: "{{ minecraft_fossils_owner }}" - mode: "0600" - service_files: - - src: "docker-compose.yml" - dest: "docker-compose.yml" - owner: "{{ minecraft_fossils_owner }}" - group: "{{ minecraft_fossils_owner }}" - # secrets.env only matters at container start; never restart the - # game server as a side effect of a deploy - service_restart_on_change: false - service_graceful_stop: - - container: minecraft-fossils - timeout: 120 - pre_stop: docker exec minecraft-fossils rcon-cli save-all flush - health_check_enabled: false +# Retired: the Fabric server is stopped for good to free its 8 GB of +# RAM. The world stays in /opt/minecraft-fossils/data (and in the restic +# backups) until it is deleted by hand. +- name: Check for the old deployment + ansible.builtin.stat: + path: /opt/minecraft-fossils/docker-compose.yml + register: fossils_compose -- name: Install the daily restart units - ansible.builtin.copy: - src: "{{ item }}" - dest: "/etc/systemd/system/{{ item }}" - mode: "0644" +- name: Save the world + ansible.builtin.command: docker exec minecraft-fossils rcon-cli save-all flush + when: fossils_compose.stat.exists + register: fossils_save + changed_when: fossils_save.rc == 0 + failed_when: false + +- name: Stop and remove the containers (data stays) + community.docker.docker_compose_v2: + project_src: /opt/minecraft-fossils + project_name: minecraft-fossils + state: absent + timeout: 120 + when: fossils_compose.stat.exists + +- name: Disable the daily restart timer + ansible.builtin.systemd: + name: minecraft-fossils-restart.timer + enabled: false + state: stopped + failed_when: false + +- name: Remove the restart units + ansible.builtin.file: + path: "/etc/systemd/system/{{ item }}" + state: absent loop: - minecraft-fossils-restart.service - minecraft-fossils-restart.timer notify: Reload systemd - -- name: Flush handlers - ansible.builtin.meta: flush_handlers - -- name: Enable the daily restart timer - ansible.builtin.systemd: - name: minecraft-fossils-restart.timer - enabled: true - state: started diff --git a/ansible/roles/minecraft_fossils/templates/secrets.env.j2 b/ansible/roles/minecraft_fossils/templates/secrets.env.j2 deleted file mode 100644 index 616eec2..0000000 --- a/ansible/roles/minecraft_fossils/templates/secrets.env.j2 +++ /dev/null @@ -1,2 +0,0 @@ -RCON_PASSWORD={{ minecraft_fossils_rcon_password }} -CF_API_KEY={{ minecraft_fossils_cf_api_key }} diff --git a/ansible/site.yaml b/ansible/site.yaml index f5f7ffa..1c7eb1b 100644 --- a/ansible/site.yaml +++ b/ansible/site.yaml @@ -27,7 +27,7 @@ roles: - { role: sillytavern, tags: [sillytavern] } - { role: minecraft, tags: [minecraft] } - - { role: minecraft_fossils, tags: [minecraft_fossils] } + - { role: minecraft_fossils, tags: [minecraft_fossils] } # retired: stops it # Late: restarting Forgejo briefly cuts the runner off from its job log - name: Forgejo