diff --git a/playbooks/nextcloud-upgrade.yml b/playbooks/nextcloud-upgrade.yml index 97739f6..9c21932 100644 --- a/playbooks/nextcloud-upgrade.yml +++ b/playbooks/nextcloud-upgrade.yml @@ -1,200 +1,130 @@ -- name: Fast-Track Nextcloud Upgrade (Skip Discovery) - hosts: all +--- +- name: Nextcloud Upgrade + hosts: nextcloud become: yes vars: - nextcloud_dir: /var/www/nextcloud - php_cli_path: /usr/bin/php - web_service_name: httpd + ansible_remote_tmp: "/var/tmp/.ansible" + nextcloud_path: "/var/www/nextcloud" + php_bin: "/usr/bin/php" - nc_web_user: apache - - occ_env: - TMPDIR: /tmp - - core_apps: - - activity - - twofactor_nextcloud_notification - - files - - settings - - dav - - updater - - workflowengine - - theming - - user_ldap - - dashboard - - federation - - updatestatus - - accessibility - - serverinfo + pre_tasks: + - name: Ensure remote tmp exists + file: + path: "/var/tmp/.ansible" + state: directory + owner: root + group: root + mode: "0755" tasks: - - name: Reminder - ensure backups exist - debug: - msg: "⚠️ CRITICAL: Ensure you have valid DB + data backups BEFORE proceeding!" - - name: Pause playbook for 3 seconds pause: seconds: 3 - prompt: "Press Ctrl+C then A to abort if no backups exist." - # ---------------------------------------------------------------------- - # VERSION CHECK - # ---------------------------------------------------------------------- - - name: 1.1 - Get current NC status - command: "{{ php_cli_path }} occ status" + - name: 1.1 - Get current Nextcloud status + command: "{{ php_bin }} occ status --output=json" args: - chdir: "{{ nextcloud_dir }}" - become_user: "{{ nc_web_user }}" - register: occ_status - changed_when: false - failed_when: "'installed: true' not in occ_status.stdout" + chdir: "{{ nextcloud_path }}" + register: nc_status_json - name: 1.2 - Parse current version set_fact: - current_version: "{{ occ_status.stdout | regex_search('versionstring: (.*)', '\\1') | first | default('unknown') }}" + nc_current_version: "{{ (nc_status_json.stdout | from_json).versionstring }}" - name: 1.3 - Show current version debug: - msg: "Current Nextcloud version: {{ current_version }}" + msg: "Current Nextcloud version: {{ nc_current_version }}" - # ---------------------------------------------------------------------- - # PRE-UPGRADE PREPARATION - # ---------------------------------------------------------------------- - name: 2.1 - Get list of installed apps - command: "{{ php_cli_path }} occ app:list" + command: "{{ php_bin }} occ app:list --output=json" args: - chdir: "{{ nextcloud_dir }}" - become_user: "{{ nc_web_user }}" + chdir: "{{ nextcloud_path }}" register: app_list - changed_when: false - - name: 2.2 - Disable all non-core 3rd party apps - command: "{{ php_cli_path }} occ app:disable {{ item }}" + - name: 2.2 - Disable 3rd-party apps (non-core) + command: "{{ php_bin }} occ app:disable {{ item }}" args: - chdir: "{{ nextcloud_dir }}" - become_user: "{{ nc_web_user }}" - environment: "{{ occ_env }}" - loop: "{{ app_list.stdout_lines | select('match', '^[ ]*-[ ](.*):[ ]enabled$') | map('regex_replace', '^[ ]*-[ ](.*):[ ]enabled$', '\\1') | list }}" - register: app_disable_result - when: item not in core_apps - ignore_errors: yes + 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: - disabled_apps: "{{ app_disable_result.results | selectattr('changed', 'defined') | selectattr('changed') | map(attribute='item') | list }}" - when: app_disable_result is defined and app_disable_result.results is defined + nc_disabled_apps: "{{ disabled_apps.results | map(attribute='item') | list }}" - # ---------------------------------------------------------------------- - # UPGRADE BLOCK WITH RESCUE + ALWAYS - # ---------------------------------------------------------------------- - - name: 3.0 - Perform Nextcloud Upgrade (Transactional) - block: + - name: 3.1 - Enable maintenance mode + command: "{{ php_bin }} occ maintenance:mode --on" + args: + chdir: "{{ nextcloud_path }}" + register: maintenance_on + changed_when: true - - name: 3.1 - Enable maintenance mode - command: "{{ php_cli_path }} occ maintenance:mode --on" + - block: + + # ─────────────────────────────── + # 3.2 — RUN NEXTCLOUD UPDATER + # ─────────────────────────────── + - name: 3.2 - Run Nextcloud CLI updater + command: "{{ php_bin }} updater/updater.phar --no-interaction" args: - chdir: "{{ nextcloud_dir }}" - become_user: "{{ nc_web_user }}" - environment: "{{ occ_env }}" - - - name: 3.2 - Run Nextcloud CLI updater (retry) - command: "{{ php_cli_path }} updater/updater.phar --no-interaction" - args: - chdir: "{{ nextcloud_dir }}" - become_user: "{{ nc_web_user }}" - environment: "{{ occ_env }}" - register: updater_result - until: - - updater_result.rc == 0 - - "'Update successful' in updater_result.stdout or 'Nextcloud is already latest version' in updater_result.stdout" + chdir: "{{ nextcloud_path }}" + register: updater_output retries: 3 - delay: 10 - failed_when: - - updater_result.rc != 0 - - "'Nextcloud is already latest version' not in updater_result.stdout" + delay: 3 + until: updater_output.rc == 0 - - name: 3.3 - Run occ upgrade (DB update) - command: "{{ php_cli_path }} occ upgrade" - args: - chdir: "{{ nextcloud_dir }}" - become_user: "{{ nc_web_user }}" - environment: "{{ occ_env }}" + - name: Check if update actually happened + set_fact: + update_message: "{{ updater_output.stdout }}" - - name: 3.4 - Cleanup commands - command: "{{ item }}" - args: - chdir: "{{ nextcloud_dir }}" - become_user: "{{ nc_web_user }}" - environment: "{{ occ_env }}" - loop: - - "{{ php_cli_path }} occ db:add-missing-indices" - - "{{ php_cli_path }} occ db:convert-filecache-bigint --no-interaction" - ignore_errors: yes - - - name: 3.5 - Disable maintenance mode (success) - command: "{{ php_cli_path }} occ maintenance:mode --off" - args: - chdir: "{{ nextcloud_dir }}" - become_user: "{{ nc_web_user }}" - environment: "{{ occ_env }}" - - - name: 3.6 - Re-enable disabled apps - command: "{{ php_cli_path }} occ app:enable {{ item }}" - args: - chdir: "{{ nextcloud_dir }}" - become_user: "{{ nc_web_user }}" - environment: "{{ occ_env }}" - loop: "{{ disabled_apps | default([]) }}" - when: disabled_apps is defined and disabled_apps | length > 0 - ignore_errors: yes - - - name: 3.7 - Restart web service - service: - name: "{{ web_service_name }}" - state: restarted - - - name: 3.8 - Verify version after upgrade - command: "{{ php_cli_path }} occ status" - args: - chdir: "{{ nextcloud_dir }}" - become_user: "{{ nc_web_user }}" - environment: "{{ occ_env }}" - register: occ_status_after - changed_when: false - - - name: 3.9 - Final version info + - name: If already newest version, show message debug: - var: occ_status_after.stdout + msg: "Nextcloud is already at the latest version. Nothing to upgrade." + when: "'No update available' in updater_output.stdout" - - name: 3.10 - Upgrade complete - debug: - msg: "Nextcloud successfully upgraded!" + # ─────────────────────────────── + # 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 !!!!!!!!!!!! - Host: {{ inventory_hostname }} - Maintenance mode will be disabled. Check logs: - - {{ nextcloud_dir }}/data/updater.log - - {{ nextcloud_dir }}/data/nextcloud.log + - {{ nextcloud_path }}/data/updater.log + - {{ nextcloud_path }}/data/nextcloud.log + + - name: Mark failure + set_fact: + upgrade_failed: true always: - - name: ALWAYS disable maintenance mode (success or failure) - command: "{{ php_cli_path }} occ maintenance:mode --off" + - name: ALWAYS disable maintenance mode + command: "{{ php_bin }} occ maintenance:mode --off" args: - chdir: "{{ nextcloud_dir }}" - become_user: "{{ nc_web_user }}" - environment: "{{ occ_env }}" - ignore_errors: yes + chdir: "{{ nextcloud_path }}" - - name: Final failure (only triggered if rescue was hit) - fail: - msg: "Nextcloud upgrade failed — maintenance mode disabled." - when: ansible_failed_task is defined + 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