--- - name: Nextcloud Upgrade hosts: nextcloud become: yes vars: ansible_remote_tmp: "/var/tmp/.ansible" nextcloud_path: "/var/www/nextcloud" php_bin: "/usr/bin/php" pre_tasks: - name: Ensure remote tmp exists file: path: "/var/tmp/.ansible" state: directory owner: root group: root mode: "0755" tasks: - name: Pause playbook for 3 seconds pause: seconds: 3 - name: 1.1 - Get current Nextcloud status command: "{{ php_bin }} occ status --output=json" args: chdir: "{{ nextcloud_path }}" register: nc_status_json - name: 1.2 - Parse current version set_fact: nc_current_version: "{{ (nc_status_json.stdout | from_json).versionstring }}" - name: 1.3 - Show current version debug: msg: "Current Nextcloud version: {{ nc_current_version }}" - name: 2.1 - Get list of installed apps command: "{{ php_bin }} occ app:list --output=json" args: chdir: "{{ nextcloud_path }}" register: app_list - name: 2.2 - Disable 3rd-party apps (non-core) command: "{{ php_bin }} occ app:disable {{ item }}" args: chdir: "{{ nextcloud_path }}" loop: "{{ (app_list.stdout | from_json).enabled | difference(['files','activity','dav','federation','files_external','files_sharing','files_trashbin','files_versions','lookup_server_connector','notifications','provisioning_api','settings','systemtags','theming','updatenotification','user_status']) }}" register: disabled_apps changed_when: "'Disabled' in disabled_apps.stdout" when: false # Optional: Disabled if you want. - name: 2.3 - Save disabled apps list set_fact: nc_disabled_apps: "{{ disabled_apps.results | map(attribute='item') | list }}" - name: 3.1 - Enable maintenance mode command: "{{ php_bin }} occ maintenance:mode --on" args: chdir: "{{ nextcloud_path }}" register: maintenance_on changed_when: true - block: # ─────────────────────────────── # 3.2 — RUN NEXTCLOUD UPDATER # ─────────────────────────────── - name: 3.2 - Run Nextcloud CLI updater command: "{{ php_bin }} updater/updater.phar --no-interaction" args: chdir: "{{ nextcloud_path }}" register: updater_output retries: 3 delay: 3 until: updater_output.rc == 0 - name: Check if update actually happened set_fact: update_message: "{{ updater_output.stdout }}" - name: If already newest version, show message debug: msg: "Nextcloud is already at the latest version. Nothing to upgrade." when: "'No update available' in updater_output.stdout" # ─────────────────────────────── # 3.3 — DATABASE UPGRADE # ─────────────────────────────── - name: 3.3 - Run occ upgrade (only if update occurred) command: "{{ php_bin }} occ upgrade" args: chdir: "{{ nextcloud_path }}" register: occ_upgrade_output when: "'No update available' not in updater_output.stdout" rescue: - name: ❌ UPGRADE FAILED - Details debug: msg: | !!!!!!!!!!! NEXTCLOUD UPGRADE FAILED !!!!!!!!!!!! Check logs: - {{ nextcloud_path }}/data/updater.log - {{ nextcloud_path }}/data/nextcloud.log - name: Mark failure set_fact: upgrade_failed: true always: - name: ALWAYS disable maintenance mode command: "{{ php_bin }} occ maintenance:mode --off" args: chdir: "{{ nextcloud_path }}" post_tasks: - name: Final status debug: msg: >- Upgrade finished successfully (or nothing to update). when: upgrade_failed is not defined - name: Final failure debug: msg: "Nextcloud upgrade failed — maintenance mode disabled." when: upgrade_failed is defined