diff --git a/nextcloud/update_collabora.yml b/nextcloud/update_collabora.yml index 0f758f3..1313213 100644 --- a/nextcloud/update_collabora.yml +++ b/nextcloud/update_collabora.yml @@ -31,9 +31,14 @@ # Flip to true if Docker needs sudo on the VM use_sudo: false - # ---------- Collabora settings ---------- + # ---------- Collabora defaults (can be overridden by detection) ---------- collabora_project: "nextcloud-collabora" - collabora_compose_file: "/data/compose/nextcloud/collabora-only.yml" + collabora_candidate_files: + # English comments: ordered list of likely compose file locations + - "/data/compose/nextcloud/collabora-only.yml" + - "/data/compose/nextcloud/collabora.yml" + - "/data/compose/collabora/docker-compose.yml" + - "/data/compose/collabora/compose.yml" # ---------- Nextcloud commands ---------- vm_commands: @@ -44,15 +49,6 @@ # English comments: run health script non-interactively with a timeout and xtrace for debugging - "set -o pipefail; timeout 180s bash -x /data/compose/nextcloud/stack-health.sh + if {{ 'sudo ' if use_sudo else '' }}docker compose version >/dev/null 2>&1; then + echo "docker compose"; + elif {{ 'sudo ' if use_sudo else '' }}docker-compose version >/dev/null 2>&1; then + echo "docker-compose"; + else + echo "none"; + fi + register: compose_cli changed_when: false + failed_when: false - - name: Show outputs for each Collabora command + - name: Collabora | Set compose command fact # English comments + ansible.builtin.set_fact: + docker_compose_cmd: "{{ (compose_cli.stdout | trim) if (compose_cli.stdout | trim) else 'none' }}" + + - name: Collabora | Warn if compose CLI not found + ansible.builtin.debug: + msg: "Collabora update skipped: no docker compose CLI found on VM." + when: docker_compose_cmd == 'none' + + - name: Collabora | Find first existing compose file on VM # English comments + ansible.builtin.command: + argv: + - sshpass + - -p + - "{{ vm_pass }}" + - ssh + - -o + - StrictHostKeyChecking=no + - -o + - ConnectTimeout=15 + - "{{ vm_user }}@{{ vm_ip }}" + - bash + - -lc + - | + set -euo pipefail + for f in {{ collabora_candidate_files | map('quote') | join(' ') }}; do + if {{ 'sudo ' if use_sudo else '' }}test -f "$f"; then + echo "$f" + exit 0 + fi + done + exit 3 + register: collab_file_probe + changed_when: false + failed_when: false + when: docker_compose_cmd != 'none' + + - name: Collabora | Set resolved compose file fact + ansible.builtin.set_fact: + collabora_compose_file_resolved: "{{ (collab_file_probe.stdout | trim) if (collab_file_probe.rc == 0) else '' }}" + when: docker_compose_cmd != 'none' + + - name: Collabora | Warn if compose file not found + ansible.builtin.debug: + msg: "Collabora update skipped: no compose file found in candidates: {{ collabora_candidate_files }}" + when: + - docker_compose_cmd != 'none' + - collabora_compose_file_resolved | default('') == '' + + - name: Collabora | Verify 'collabora' service exists in compose # English comments + ansible.builtin.command: + argv: + - sshpass + - -p + - "{{ vm_pass }}" + - ssh + - -o + - StrictHostKeyChecking=no + - -o + - ConnectTimeout=15 + - "{{ vm_user }}@{{ vm_ip }}" + - bash + - -lc + - > + {{ ('sudo ' if use_sudo else '') }}{{ docker_compose_cmd }} -p {{ collabora_project }} + -f {{ collabora_compose_file_resolved }} config --services | grep -qx collabora + register: collab_service_check + changed_when: false + failed_when: false + when: + - docker_compose_cmd != 'none' + - collabora_compose_file_resolved | default('') != '' + + - name: Collabora | Warn if service 'collabora' missing + ansible.builtin.debug: + msg: "Collabora update skipped: service 'collabora' not found in compose file {{ collabora_compose_file_resolved }}." + when: + - docker_compose_cmd != 'none' + - collabora_compose_file_resolved | default('') != '' + - collab_service_check.rc != 0 + + - name: Collabora | Run update commands (pull + up -d) # English comments + ansible.builtin.command: + argv: + - sshpass + - -p + - "{{ vm_pass }}" + - ssh + - -o + - StrictHostKeyChecking=no + - -o + - ConnectTimeout=15 + - -o + - ServerAliveInterval=15 + - -o + - ServerAliveCountMax=2 + - "{{ vm_user }}@{{ vm_ip }}" + - bash + - -lc + - > + set -o pipefail; + {{ ('sudo ' if use_sudo else '') }}timeout 600s docker pull collabora/code:latest; + {{ ('sudo ' if use_sudo else '') }}timeout 600s {{ docker_compose_cmd }} -p {{ collabora_project }} + -f {{ collabora_compose_file_resolved }} pull collabora; + {{ ('sudo ' if use_sudo else '') }}timeout 600s {{ docker_compose_cmd }} -p {{ collabora_project }} + -f {{ collabora_compose_file_resolved }} up -d --no-deps --force-recreate collabora + register: collab_update + changed_when: false + failed_when: false + when: + - docker_compose_cmd != 'none' + - collabora_compose_file_resolved | default('') != '' + - collab_service_check.rc == 0 + + - name: Collabora | Show update output ansible.builtin.debug: msg: | - CMD: {{ item.item }} - RC: {{ item.rc }} + Collabora update output: + RC: {{ collab_update.rc | default('n/a') }} STDOUT: - {{ (item.stdout | default('')).strip() }} + {{ (collab_update.stdout | default('')).strip() }} STDERR: - {{ (item.stderr | default('')).strip() }} - loop: "{{ collab_cmds.results }}" + {{ (collab_update.stderr | default('')).strip() }} + when: + - docker_compose_cmd != 'none' + - collabora_compose_file_resolved | default('') != '' + - collab_service_check.rc == 0 - - name: Fail play if any Collabora command failed + - name: Collabora | Fail if update command failed ansible.builtin.assert: - that: "item.rc == 0" - fail_msg: "Collabora update failed on VM: {{ item.item }} (rc={{ item.rc }}) {{ ' -- likely timeout' if item.rc == 124 else '' }}" + that: "collab_update.rc == 0" + fail_msg: "Collabora update failed (rc={{ collab_update.rc }}) {{ ' -- likely timeout' if collab_update.rc == 124 else '' }}" success_msg: "Collabora updated successfully." - loop: "{{ collab_cmds.results }}" + when: + - docker_compose_cmd != 'none' + - collabora_compose_file_resolved | default('') != '' + - collab_service_check.rc == 0 \ No newline at end of file