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