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>
129 lines
5.8 KiB
YAML
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
|