--- - name: Upgrade Nextcloud to 31-apache (pull + recreate + occ) hosts: proxmox become: true vars: nc_container: nextcloud nc_image_tag: "31-apache" # change to 32-apache when you step to next major # Ports/volumes/env exactly as you use: nc_root: /data/compose/nextcloud nc_http_port: "8080:80" tasks: - name: Gather nextcloud container info community.docker.docker_container_info: name: "{{ nc_container }}" register: nc_info - name: Derive compose project & network from existing container ansible.builtin.set_fact: nc_project: "{{ nc_info.container.Config.Labels['com.docker.compose.project'] | default('nextcloud') }}" nc_networks: "{{ (nc_info.container.NetworkSettings.Networks | default({})).keys() | list }}" nc_net_primary: "{{ (nc_info.container.NetworkSettings.Networks | default({})).keys() | list | first }}" when: nc_info.exists - name: Enable maintenance mode community.docker.docker_container_exec: container: "{{ nc_container }}" user: "www-data" command: php occ maintenance:mode --on - name: Render one-off compose for nextcloud (single-service) ansible.builtin.copy: dest: /tmp/nc.yml mode: '0644' content: | name: {{ nc_project }} services: nextcloud: image: nextcloud:{{ nc_image_tag }} container_name: {{ nc_container }} restart: unless-stopped networks: [cloud] ports: ["{{ nc_http_port }}"] volumes: - {{ nc_root }}/config:/var/www/html/config - {{ nc_root }}/data:/var/www/html/data - {{ nc_root }}/custom_apps:/var/www/html/custom_apps environment: TZ: Europe/Prague MYSQL_DATABASE: nextcloud MYSQL_USER: nextcloud MYSQL_PASSWORD: dbpassword MYSQL_HOST: nextclouddb REDIS_HOST: redis NEXTCLOUD_ADMIN_USER: root NEXTCLOUD_ADMIN_PASSWORD: '1234SilneHeslo.-.' networks: cloud: external: true name: {{ nc_net_primary }} - name: Pull the new Nextcloud image community.docker.docker_compose_v2: project_name: "{{ nc_project }}" files: ["/tmp/nc.yml"] pull: always state: present - name: Recreate Nextcloud with the new image community.docker.docker_compose_v2: project_name: "{{ nc_project }}" files: ["/tmp/nc.yml"] recreate: always state: present - name: Run occ upgrade community.docker.docker_container_exec: container: "{{ nc_container }}" user: "www-data" command: php occ upgrade - name: Recommended DB maintenance (safe to run) community.docker.docker_container_exec: container: "{{ nc_container }}" user: "www-data" command: php occ db:add-missing-indices ignore_errors: true - name: Convert filecache bigint (safe) community.docker.docker_container_exec: container: "{{ nc_container }}" user: "www-data" command: php occ db:convert-filecache-bigint --no-interaction ignore_errors: true - name: Disable maintenance mode community.docker.docker_container_exec: container: "{{ nc_container }}" user: "www-data" command: php occ maintenance:mode --off - name: Show status community.docker.docker_container_exec: container: "{{ nc_container }}" user: "www-data" command: php occ status register: nc_status - name: Print status ansible.builtin.debug: msg: "{{ nc_status.stdout | default('no output') }}"