Set-OPS-Public/roles/serveur_nextcloud/tasks/restaurer.yml
Daniel Allaire 8a9da0c31a restauration : la reconstruction remet l'etat de l'incarnation precedente
Chaque role proprietaire (AC, bases, annuaire, Nextcloud, rspamd/DKIM,
courriel, forge, web) remet son etat au moment ou il le creerait neuf,
depuis le dernier instantane anterieur a la naissance de la machine.
La sauvegarde refuse de deposer tant qu'un etat d'avant attend.
Outil de noeud setops-restaurer ; cibles sauvegarder-maintenant,
restauration-etat, restauration-renoncer ; test_restauration.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-30 02:39:22 -04:00

129 lines
5.8 KiB
YAML

---
# 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