- serveur_nextcloud : tasks/monter.yml (maintenance, ancien code mis de côté, data/config/ajouts repris, occ upgrade) ; signature PGP vérifiée - serveur_forgejo : 16.0.5 ; une montée se simule - serveur_artefacts : le site sert aussi la signature de Nextcloud - CHANGELOG 68 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
175 lines
7.8 KiB
YAML
175 lines
7.8 KiB
YAML
---
|
|
# Le chemin de destination PORTE la version : cet artefact est immuable une fois pose.
|
|
# Sans garde, `get_url` recontacte le serveur distant a CHAQUE deploiement — et un
|
|
# serveur tiers lent suffit alors a faire tomber un deploiement de flotte. Constate le
|
|
# 2026-08-09 sur le binaire Forgejo, meme motif ici.
|
|
- name: L artefact de cette version est-il deja pose ?
|
|
ansible.builtin.stat:
|
|
path: "/tmp/nextcloud-{{ serveur_nextcloud_version }}.tar.bz2"
|
|
register: serveur_nextcloud_archive_present
|
|
|
|
# LE CONTROLEUR TELECHARGE, PUIS POUSSE — la cible ne tire jamais d'Internet.
|
|
#
|
|
# Inventaire du 2026-08-10 : une reconstruction de tenant telecharge ~1,5 Gio, dont
|
|
# 490 Mio pour quatre archives EPINGLEES EN VERSION (Nextcloud 230, Keycloak 140,
|
|
# Forgejo 101, oauth2-proxy 18) qui vont chacune sur UN SEUL hote. Les retelecharger a
|
|
# chaque reconstruction est un pur gaspillage, et une dependance de plus sur le chemin
|
|
# critique — un serveur tiers lent a deja fait tomber un deploiement de flotte le
|
|
# 2026-08-09.
|
|
#
|
|
# POURQUOI POUSSER PLUTOT QUE SERVIR UN CACHE. Un cache HTTP sur le poste exigerait que
|
|
# les VM du tenant l'atteignent — donc de ROUVRIR un flux vers le plan d'administration,
|
|
# que les regles sortantes `!SETOPS_INTERNES` ferment depuis ce matin. Ici, rien de tel :
|
|
# on emprunte le canal SSH qui existe deja, aucun port, aucun service, aucune regle.
|
|
#
|
|
# Effet de bord recherche : ces artefacts deviennent deployables HORS LIGNE une fois le
|
|
# cache rempli. Sur une plateforme qui se veut souveraine, ce n'est pas un detail.
|
|
- name: Cache d artefacts du contrôleur
|
|
ansible.builtin.file:
|
|
path: "{{ serveur_nextcloud_cache_local }}"
|
|
state: directory
|
|
mode: "0700"
|
|
delegate_to: localhost
|
|
become: false
|
|
when: not serveur_nextcloud_archive_present.stat.exists
|
|
|
|
# --- LE DEPOT DU SITE D'ABORD, L'INTERNET ENSUITE (2026-09-12) ----------------
|
|
#
|
|
# Le site tient ces artefacts dans son cache (`serveur_artefacts`, LocalDirs). Un runner
|
|
# qui les y trouve ne sort pas du tout : c'est le meme principe que le cache apt, applique
|
|
# aux publications qui ne vivent dans aucun depot apt.
|
|
#
|
|
# PLACEE AVANT LE `stat` DU CACHE DU CONTROLEUR, ET C'EST TOUT LE MONTAGE : si le depot
|
|
# sert le fichier, le `stat` qui suit le voit, et la tache de telechargement amont se
|
|
# saute d'elle-meme. Aucune tache existante n'a change.
|
|
#
|
|
# `failed_when: false` — le depot est une COMMODITE. Site sans depot, depot qui n'a pas
|
|
# encore cette version, cache du site tout neuf : on retombe sur l'amont, comme avant.
|
|
- name: Prendre l'archive Nextcloud au dépôt du site, avant de sortir sur Internet
|
|
ansible.builtin.get_url:
|
|
url: "{{ setops_depot_binaires }}/nextcloud-{{ serveur_nextcloud_version }}.tar.bz2"
|
|
dest: "{{ serveur_nextcloud_cache_local }}/nextcloud-{{ serveur_nextcloud_version }}.tar.bz2"
|
|
mode: "0644"
|
|
timeout: 30
|
|
delegate_to: localhost
|
|
become: false
|
|
failed_when: false
|
|
when:
|
|
- setops_depot_binaires | default('') | length > 0
|
|
- not serveur_nextcloud_archive_present.stat.exists
|
|
|
|
- name: L artefact est-il déjà dans le cache du contrôleur ?
|
|
ansible.builtin.stat:
|
|
path: "{{ serveur_nextcloud_cache_local }}/nextcloud-{{ serveur_nextcloud_version }}.tar.bz2"
|
|
register: serveur_nextcloud_cache_present
|
|
delegate_to: localhost
|
|
become: false
|
|
when: not serveur_nextcloud_archive_present.stat.exists
|
|
|
|
- name: Télécharger le tarball Nextcloud dans le cache du contrôleur (une seule fois)
|
|
ansible.builtin.get_url:
|
|
url: "{{ serveur_nextcloud_url }}"
|
|
dest: "{{ serveur_nextcloud_cache_local }}/nextcloud-{{ serveur_nextcloud_version }}.tar.bz2"
|
|
mode: "0644"
|
|
delegate_to: localhost
|
|
become: false
|
|
when:
|
|
- not serveur_nextcloud_archive_present.stat.exists
|
|
- not (serveur_nextcloud_cache_present.stat.exists | default(false))
|
|
|
|
# LA SIGNATURE, MEME CHEMIN QUE L'ARCHIVE : le depot du site d'abord, l'amont ensuite.
|
|
- name: Prendre la signature Nextcloud au dépôt du site, avant de sortir sur Internet
|
|
ansible.builtin.get_url:
|
|
url: "{{ setops_depot_binaires }}/nextcloud-{{ serveur_nextcloud_version }}.tar.bz2.asc"
|
|
dest: "{{ serveur_nextcloud_cache_local }}/nextcloud-{{ serveur_nextcloud_version }}.tar.bz2.asc"
|
|
mode: "0644"
|
|
timeout: 30
|
|
force: true
|
|
delegate_to: localhost
|
|
become: false
|
|
failed_when: false
|
|
when:
|
|
- setops_depot_binaires | default('') | length > 0
|
|
- not serveur_nextcloud_archive_present.stat.exists
|
|
|
|
- name: La signature Nextcloud est-elle dans le cache du contrôleur ?
|
|
ansible.builtin.stat:
|
|
path: "{{ serveur_nextcloud_cache_local }}/nextcloud-{{ serveur_nextcloud_version }}.tar.bz2.asc"
|
|
register: serveur_nextcloud_asc_present
|
|
delegate_to: localhost
|
|
become: false
|
|
when: not serveur_nextcloud_archive_present.stat.exists
|
|
|
|
- name: Récupérer la signature détachée de l archive Nextcloud
|
|
ansible.builtin.get_url:
|
|
url: "{{ serveur_nextcloud_signature_url }}"
|
|
dest: "{{ serveur_nextcloud_cache_local }}/nextcloud-{{ serveur_nextcloud_version }}.tar.bz2.asc"
|
|
mode: "0644"
|
|
force: true
|
|
delegate_to: localhost
|
|
become: false
|
|
when:
|
|
- not serveur_nextcloud_archive_present.stat.exists
|
|
- not ((serveur_nextcloud_asc_present.stat.exists | default(false))
|
|
and (serveur_nextcloud_asc_present.stat.size | default(0)) > 0)
|
|
|
|
- name: Vérifier la signature de l archive Nextcloud contre l empreinte épinglée
|
|
ansible.builtin.command:
|
|
argv:
|
|
- python3
|
|
- "{{ role_path }}/../../scripts/verifier_signature.py"
|
|
- --artefact
|
|
- "{{ serveur_nextcloud_cache_local }}/nextcloud-{{ serveur_nextcloud_version }}.tar.bz2"
|
|
- --signature
|
|
- "{{ serveur_nextcloud_cache_local }}/nextcloud-{{ serveur_nextcloud_version }}.tar.bz2.asc"
|
|
- --cle
|
|
- "{{ role_path }}/files/nextcloud-release.asc"
|
|
- --empreinte
|
|
- "{{ serveur_nextcloud_signature_empreinte }}"
|
|
delegate_to: localhost
|
|
become: false
|
|
changed_when: false
|
|
when: not serveur_nextcloud_archive_present.stat.exists
|
|
|
|
- name: Déposer le tarball Nextcloud sur l hôte depuis le cache
|
|
ansible.builtin.copy:
|
|
src: "{{ serveur_nextcloud_cache_local }}/nextcloud-{{ serveur_nextcloud_version }}.tar.bz2"
|
|
dest: "/tmp/nextcloud-{{ serveur_nextcloud_version }}.tar.bz2"
|
|
mode: "0644"
|
|
when: not serveur_nextcloud_archive_present.stat.exists
|
|
|
|
# UNE AUTRE VERSION EN PLACE ? Alors on MONTE, avant que l'extraction ci-dessous ne
|
|
# constate un `occ` present et ne fasse rien — ce qu'elle faisait jusqu'au 2026-10-03,
|
|
# laissant le code de l'ancienne version sous le numero de la nouvelle.
|
|
- name: Monter Nextcloud si une autre version est en place
|
|
ansible.builtin.include_tasks: monter.yml
|
|
|
|
- name: Extraire Nextcloud dans /var/www (si absent)
|
|
ansible.builtin.unarchive:
|
|
src: "/tmp/nextcloud-{{ serveur_nextcloud_version }}.tar.bz2"
|
|
dest: "/var/www/"
|
|
remote_src: true
|
|
owner: "{{ serveur_nextcloud_utilisateur }}"
|
|
group: "{{ serveur_nextcloud_utilisateur }}"
|
|
creates: "{{ serveur_nextcloud_racine }}/occ"
|
|
|
|
- name: Installer Nextcloud (occ maintenance:install, PG en TLS ; une seule fois)
|
|
ansible.builtin.command:
|
|
cmd: >-
|
|
php {{ serveur_nextcloud_racine }}/occ maintenance:install
|
|
--database pgsql
|
|
--database-host {{ serveur_nextcloud_db_host }}
|
|
--database-name {{ serveur_nextcloud_db_name }}
|
|
--database-user {{ serveur_nextcloud_db_user }}
|
|
--database-pass {{ serveur_nextcloud_db_password }}
|
|
--admin-user {{ serveur_nextcloud_admin_user }}
|
|
--admin-pass {{ serveur_nextcloud_admin_password }}
|
|
--data-dir {{ serveur_nextcloud_data_dir }}
|
|
creates: "{{ serveur_nextcloud_racine }}/config/config.php"
|
|
become: true
|
|
become_user: "{{ serveur_nextcloud_utilisateur }}"
|
|
environment:
|
|
PGSSLMODE: "{{ serveur_nextcloud_pg_sslmode }}"
|
|
PGSSLROOTCERT: "{{ serveur_nextcloud_ca_racine }}"
|
|
no_log: true
|
|
when: not ansible_check_mode
|