--- # NEXTCLOUD D'UNE INCARNATION PRECEDENTE (2026-09-30) # # EN FIN DE ROLE, PAS AVANT L'INSTALLATION. Le code des applications ajoutees # (`user_oidc`, `richdocuments`) n'est pas sauvegarde : il se reinstalle. Restauree # AVANT, la base les dirait installees sans qu'elles le soient, et `occ app:install` # refuserait (« already installed »). On laisse donc le role tout poser a neuf, puis on # remplace, ENSEMBLE, la base, les fichiers et la configuration — les secrets de # l'instance (`instanceid`, `passwordsalt`, `secret`) voyagent avec ses donnees. # C'est la procedure faite a la main sur Technolibre le 2026-09-30. # # LA BASE N'EST REMISE QUE SI ELLE ETAIT VIDE AU DEPART. Une configuration absente sur une # base deja peuplee, c'est une machine refaite seule a cote d'une base vivante : la # remplacer effacerait ce qui a ete ecrit depuis la sauvegarde. On refuse, et on dit quoi # faire. - name: Restauration — Nextcloud d'une incarnation precedente ? ansible.builtin.include_role: name: client_backup tasks_from: restaurer.yml vars: client_backup_restaurer_jeu: serveur_nextcloud client_backup_restaurer_vierge: "{{ not serveur_nextcloud_config_initiale.stat.exists }}" - name: Restauration — remettre Nextcloud when: client_backup_restauration.etat == 'a_restaurer' block: - name: Restauration — refuser d'ecraser une base vivante ansible.builtin.assert: that: - serveur_nextcloud_tables_initiales.rc | default(1) == 0 - (serveur_nextcloud_tables_initiales.stdout | default('1') | int) == 0 fail_msg: >- Nextcloud n'avait pas de configuration, mais sa base {{ serveur_nextcloud_nom_bd }} sur {{ serveur_nextcloud_hote_bd }} n'etait pas vide (ou illisible). Ce n'est pas une reconstruction complete : ne remettre que les fichiers, a la main — `setops-restaurer fichiers --remplacer ...` —, ou ecarter cet etat : make restauration-renoncer HOTE={{ inventory_hostname }} JEU=nextcloud CONFIRMER=true - name: Restauration — mode maintenance changed_when: true ansible.builtin.command: argv: [php, "{{ serveur_nextcloud_racine }}/occ", maintenance:mode, --on] become: true become_user: "{{ serveur_nextcloud_utilisateur }}" - name: Restauration — arreter PHP et les taches de fond ansible.builtin.systemd: name: "{{ item }}" state: stopped loop: ["php{{ serveur_nextcloud_php_version }}-fpm", cron] # La base D'ABORD, et on lit ce qu'elle repond : un « RIEN » (pas d'incarnation # precedente cote base) ne doit pas laisser remettre des fichiers qui ne lui # correspondraient plus. - name: Restauration — remettre la base (sur son serveur, avec SON instantane) changed_when: true ansible.builtin.command: argv: - /usr/local/sbin/setops-restaurer - base - --remplacer - "{{ serveur_nextcloud_nom_bd }}" delegate_to: "{{ serveur_nextcloud_hote_bd }}" register: serveur_nextcloud_base_remise failed_when: >- serveur_nextcloud_base_remise.rc != 0 or 'RESTAURE' not in serveur_nextcloud_base_remise.stdout - name: Restauration — remettre les fichiers et la configuration changed_when: true ansible.builtin.command: argv: >- {{ ['/usr/local/sbin/setops-restaurer', 'fichiers', '--remplacer', '--instantane', client_backup_restauration.instantane, '--proprietaire', serveur_nextcloud_utilisateur + ':' + serveur_nextcloud_utilisateur] + client_backup_restauration.chemins }} - name: Restauration — relancer PHP et les taches de fond ansible.builtin.systemd: name: "{{ item }}" state: started loop: ["php{{ serveur_nextcloud_php_version }}-fpm", cron] - name: Restauration — l'etat restaure demande-t-il une mise a niveau ? ansible.builtin.command: argv: [php, "{{ serveur_nextcloud_racine }}/occ", status, --output=json] become: true become_user: "{{ serveur_nextcloud_utilisateur }}" register: serveur_nextcloud_statut_restaure changed_when: false # L'installation neuve porte des applications parfois plus recentes que l'instantane # (richdocuments, le 2026-09-30) : `occ upgrade` aligne leurs schemas. - name: Restauration — mise a niveau des schemas changed_when: true ansible.builtin.command: argv: [php, "{{ serveur_nextcloud_racine }}/occ", upgrade] become: true become_user: "{{ serveur_nextcloud_utilisateur }}" # Le JSON est la DERNIERE ligne : quand une mise a niveau est due, `occ` l'annonce # d'abord en clair. when: >- (serveur_nextcloud_statut_restaure.stdout_lines | last | default('{}') | from_json).needsDbUpgrade | default(false) - name: Restauration — sortir du mode maintenance changed_when: true ansible.builtin.command: argv: [php, "{{ serveur_nextcloud_racine }}/occ", maintenance:mode, --off] become: true become_user: "{{ serveur_nextcloud_utilisateur }}" - name: Restauration — Nextcloud est-il revenu ? ansible.builtin.command: argv: [php, "{{ serveur_nextcloud_racine }}/occ", status, --output=json] become: true become_user: "{{ serveur_nextcloud_utilisateur }}" register: serveur_nextcloud_statut_final changed_when: false failed_when: >- not ((serveur_nextcloud_statut_final.stdout_lines | last | default('{}') | from_json).installed | default(false)) or ((serveur_nextcloud_statut_final.stdout_lines | last | default('{}') | from_json).needsDbUpgrade | default(true)) - name: Restauration — acter Nextcloud remis ansible.builtin.include_role: name: client_backup tasks_from: acter.yml vars: client_backup_acter_etat: restaure