For AI agents: the complete documentation index is available at https://docs.ovhcloud.com/fr/llms.txt, the full documentation bundle is available at https://docs.ovhcloud.com/fr/llms-full.txt, and this page is available as Markdown at https://docs.ovhcloud.com/fr/guides/public-cloud/cross-functional/disaster-recovery-plan-implementation.md.
Déployez Nextcloud sur deux régions Public Cloud avec des services managés, et basculez vers le site de secours lorsque la région de production tombe
Objectif
Faire tourner Nextcloud sur une seule instance est simple, mais n'offre aucune protection : dès que cette instance, ou l'hôte qui l'exécute, tombe en panne, le service devient indisponible pour tous les utilisateurs. Rendre le déploiement résilient à l'intérieur d'une seule région ne résout qu'une partie du problème. Cela ne couvre pas la perte de la région elle-même.
Ce guide construit un déploiement qui répond à trois exigences :
Nextcloud est en haute disponibilité, avec l'indisponibilité la plus courte possible.
Le moins d'infrastructure possible est administré à la main : les services managés sont donc utilisés partout où ils existent.
Un site de secours prend le relais en cas de panne globale du site de production, avec les RTO et RPO les plus faibles possibles.
Ce guide explique comment déployer Nextcloud sur deux régions OVHcloud Public Cloud avec des services managés, maintenir les deux sites synchronisés, et basculer de l'un vers l'autre.
La plupart des commandes de ce guide utilisent la CLI OVHcloud. Installez-la et créez vos identifiants d'API comme expliqué dans Premiers pas avec la CLI OVHcloud :
ovhcloud login
Aucune des commandes ci-dessous ne passe d'identifiant de projet : la CLI doit donc savoir sur quel projet Public Cloud travailler. Listez vos projets :
ovhcloud cloud project list
Définissez ensuite celui que vous souhaitez comme projet par défaut, soit avec la variable d'environnement OVH_CLOUD_PROJECT_SERVICE, soit avec la clé default_cloud_project de la section [ovh-cli] de votre fichier ~/.ovh.conf. Remplacez <YOUR_PROJECT_ID> par l'identifiant renvoyé par la commande précédente :
Téléchargez le fichier openrc.sh de votre projet depuis l'espace client OVHcloud et chargez-le, comme décrit dans Charger les variables d'environnement OpenStack. Il s'agit de la commande source openrc.sh au début du déploiement.
Info
Les commandes openstack share utilisées dans ce guide proviennent du client Manila, qui n'est pas toujours installé avec le client OpenStack. Si la commande n'est pas reconnue, installez python-manilaclient dans le même environnement.
Accès à l'espace client OVHcloud
Lien direct :
Pour accéder à vos services :Network > Load Balancer > Sélectionnez votre service
En pratique
Comprendre le problème
Un déploiement sur une seule instance tombe avec son hôte
La façon la plus rapide de déployer Nextcloud consiste à faire tourner tous les composants (reverse proxy, application, cache, base de données et volume de données) sur une seule instance Public Cloud ou un seul VPS. Si cette instance, ou l'hôte qui l'exécute, tombe en panne, Nextcloud tombe avec elle :
L'instance reste indisponible jusqu'à ce que l'hôte soit réparé ou que l'instance soit redémarrée sur un autre hôte. Pendant toute cette durée, vos utilisateurs finaux n'ont plus accès au service.
Un déploiement résilient survit à la perte d'un nœud
Nextcloud peut être déployé de façon beaucoup plus résiliente : en rendant chaque composant applicatif hautement disponible (base de données, cache, Nextcloud lui-même), et en rendant également l'infrastructure sous-jacente redondante (plusieurs instances réparties sur des hôtes différents, ingress redondant).
Les produits Public Cloud suivants couvrent ces besoins :
Un cluster Managed Kubernetes Service (MKS) pour exécuter Nextcloud
Un cluster Managed Databases pour PostgreSQL ou MySQL
Un volume Public Cloud File Storage, partagé entre les réplicas Nextcloud
Un Public Cloud Load Balancer pour le trafic entrant
Une Public Cloud Gateway pour exposer publiquement le load balancer
L'infrastructure obtenue ressemble à ceci :
Ici, l'hôte qui exécute l'un des nœuds MKS s'arrête brutalement. Comme l'infrastructure a été conçue pour ce risque, Nextcloud continue de fonctionner et les utilisateurs finaux poursuivent leur travail.
Survivre à la perte d'une région
Un déploiement résilient reste hébergé dans un seul emplacement, et cet emplacement peut tomber dans son ensemble, lors d'une panne réseau majeure du Public Cloud, par exemple :
Tous les composants perdent leur connectivité réseau en même temps et Nextcloud devient injoignable. C'est précisément contre cela qu'un site de secours protège. En construire un soulève trois questions, auxquelles répondent les sections suivantes : comment gérer l'ingress sur deux sites, comment maintenir la base de données synchronisée, et comment répliquer les fichiers des utilisateurs finaux.
Ingress : IP Load Balancer
Le trafic doit continuer à circuler lorsqu'un site entier disparaît. L'IP Load Balancer OVHcloud (IPLB) répond à ce besoin : il peut être rattaché à des backends situés dans deux sites différents en même temps (Gravelines et Strasbourg, par exemple), si bien que la même IP publique peut servir l'un ou l'autre site.
Info
L'IP Load Balancer est le seul produit de répartition de charge OVHcloud capable de couvrir deux régions en même temps. Tous les autres produits Public Cloud utilisés ici sont régionaux ou zonaux : une ressource dédiée doit donc être créée dans chaque région.
Base de données : réplication logique PostgreSQL
Managed Databases for MySQL ne propose pas de réplication de données entre régions, ce qui ne laisserait que la sauvegarde/restauration comme option, avec des RTO/RPO loin d'être optimaux. Nextcloud prend également en charge PostgreSQL, et PostgreSQL fournit un mécanisme de réplication logique intégré : ce guide utilise donc Managed Databases for PostgreSQL.
Warning
La réplication logique ne réplique pas la base de données dans son ensemble : elle réplique table par table. Vous devez vous assurer que toutes les tables Nextcloud sont incluses dans la publication, et que le schéma de ces tables est identique sur les deux sites.
Fichiers des utilisateurs finaux : réplication Object Storage
File Storage ne peut pas répliquer les données entre régions : les fichiers des utilisateurs finaux sont donc stockés dans Object Storage, qui dispose d'un mécanisme de réplication intégré. Nextcloud peut être configuré pour utiliser un bucket Object Storage comme stockage principal, ce qui permet aux deux sites de partager le même contenu de fichiers.
Architecture cible
En rassemblant le tout, on obtient l'architecture sur deux régions suivante. La région A sert le trafic, la région B héberge un site de secours entièrement provisionné, et une troisième région héberge le bucket de sauvegarde :
Si la région A tombe, le trafic est redirigé vers l'infrastructure déjà provisionnée dans la région B :
Déployer l'infrastructure
La suite de ce guide déploie cette architecture avec GRA11 comme région de production et SBG5 comme région de secours.
Commencez par charger vos identifiants OpenStack et par définir les variables utilisées tout au long du guide. Adaptez les valeurs suivantes à votre propre déploiement :
REGION_PROD et REGION_DRP : les régions de production et de secours. Si vous les changez, adaptez en conséquence le --nodes-pattern.region des bases de données, les régions des buckets et les points de terminaison Object Storage utilisés dans les commandes Nextcloud.
VLAN_ID : le VLAN du vRack partagé par les deux réseaux privés.
Chaque étape ci-dessous est exécutée deux fois, une fois par région. Gardez le même shell ouvert du début à la fin : les variables définies au fil des commandes sont réutilisées par les suivantes.
Réseau
Créez les réseaux privés. Les deux utilisent le même identifiant de VLAN afin d'appartenir au même vRack :
Créez les sous-réseaux. Ils partagent le même CIDR mais le découpent en deux moitiés, afin que chaque région attribue des adresses issues de sa propre plage :
Trois buckets sont nécessaires : un pour les fichiers de production, un pour leur réplica sur le site de secours, et un dans une troisième région pour les sauvegardes Velero. Chacun dispose de son propre utilisateur et de ses propres identifiants S31.
Créez les utilisateurs et leurs clés d'accès :
USER_ID_PROD=$(ovhcloud cloud user create \ --description "user-prod that is used to create S3 access key" \ --roles objectstore_operator \ --output json | jq 'select(.details.id != null) | .details.id')sleep 1 && CRED_PROD=$(ovhcloud cloud storage object credentials create "$USER_ID_PROD" --output json)S3_ACCESS_KEY_PROD=$(jq -r '.access' <<<"$CRED_PROD")S3_SECRET_KEY_PROD=$(jq -r '.secret' <<<"$CRED_PROD")USER_ID_DRP=$(ovhcloud cloud user create \ --description "user-drp that is used to create S3 access key" \ --roles objectstore_operator \ --output json | jq 'select(.details.id != null) | .details.id')sleep 1 && CRED_DRP=$(ovhcloud cloud storage object credentials create "$USER_ID_DRP" --output json)S3_ACCESS_KEY_DRP=$(jq -r '.access' <<<"$CRED_DRP")S3_SECRET_KEY_DRP=$(jq -r '.secret' <<<"$CRED_DRP")USER_ID_BACKUP=$(ovhcloud cloud user create \ --description "user-backup that is used to create S3 access key" \ --roles objectstore_operator \ --output json | jq 'select(.details.id != null) | .details.id')sleep 1 && CRED_BACKUP=$(ovhcloud cloud storage object credentials create "$USER_ID_BACKUP" --output json)S3_ACCESS_KEY_BACKUP=$(jq -r '.access' <<<"$CRED_BACKUP")S3_SECRET_KEY_BACKUP=$(jq -r '.secret' <<<"$CRED_BACKUP")
Créez les buckets. Le versioning est activé sur les deux buckets Nextcloud, car la réplication l'exige :
Créez une règle de réplication sur chaque bucket Nextcloud, comme décrit dans Object Storage - Maîtrisez la réplication asynchrone sur vos buckets. Les deux règles sont créées dès maintenant, mais seule celle de production est active. La seconde est le chemin de retour utilisé lors d'une bascule :
Bucket
Identifiant de la règle
Statut
Cible
Bucket de production
nextcloud
activée
Bucket de secours
Bucket de secours
nextcloud
désactivée
Bucket de production
Attachez une politique S3 à chaque utilisateur, en ne lui donnant accès qu'à son propre bucket :
Nextcloud stocke les fichiers des utilisateurs finaux dans Object Storage, mais ses réplicas partagent malgré tout un volume ReadWriteMany pour les données applicatives. Ce volume est fourni par File Storage à travers le driver CSI Manila.
Comme les deux clusters servent le même nom d'hôte, les certificats Let's Encrypt sont émis via un challenge DNS-01. Créez des clés d'application des API OVHcloud avec les droits suivants :
GET sur /domain/zone
GET sur /domain/zone/*/record
GET sur /domain/zone/*/record/*
POST sur /domain/zone/*/record
DELETE sur /domain/zone/*/record/*
POST sur /domain/zone/*/refresh
Installez le webhook OVH sur les deux clusters. Remplacez les paramètres suivants avant d'exécuter les commandes :
<YOUR_DNS_DOMAIN> : le nom de domaine dont la zone DNS est hébergée chez OVHcloud, par exemple example.com.
<APP_KEY>, <APP_SECRET> et <CONSUMER_KEY> : la clé d'application, le secret d'application et la clé de consommateur créés précédemment.
<YOUR_EMAIL> : l'adresse e-mail utilisée pour le compte Let's Encrypt.
Velero copie les objets Kubernetes et les volumes du cluster de production dans le bucket de sauvegarde, afin qu'ils puissent être restaurés sur le cluster de secours :
Dans l'onglet Fermes de serveurs, cliquez sur Ajouter une ferme de serveurs et utilisez les paramètres suivants :
Paramètre
Valeur
Protocole
TCP
Port
443
Datacenter
ALL
Réseau privé
Identifiant de votre réseau privé
Récupérez l'adresse IP externe du Public Cloud Load Balancer de chaque cluster :
kubectl --kubeconfig $KUBECONFIG_PROD get svc -n haproxy-controller \ -o jsonpath='{.items[0].status.loadBalancer.ingress[0].ip}'kubectl --kubeconfig $KUBECONFIG_DRP get svc -n haproxy-controller \ -o jsonpath='{.items[0].status.loadBalancer.ingress[0].ip}'
Ajoutez les deux comme serveurs de la ferme, en remplaçant <EXTERNAL_IP_PUBLIC_CLOUD_LB_PROD> et <EXTERNAL_IP_PUBLIC_CLOUD_LB_DRP> par les deux adresses renvoyées ci-dessus :
Nom
Adresse IPv4
Port
prod
<EXTERNAL_IP_PUBLIC_CLOUD_LB_PROD>
443
drp
<EXTERNAL_IP_PUBLIC_CLOUD_LB_DRP>
443
Désactivez ensuite le serveur drp avec son interrupteur, afin que seul le site de production reçoive du trafic.
Frontend
Dans l'onglet Frontends, cliquez sur Ajouter un frontend et utilisez les paramètres suivants :
Paramètre
Valeur
Protocole
TCP
Port
443
Datacenter
ALL
Ferme de serveurs par défaut
Identifiant de la ferme de serveurs créée ci-dessus
Appliquez la configuration de l'IP Load Balancer pour la rendre effective.
Enregistrement DNS
Créez un enregistrement A nextcloud dans votre zone DNS, pointant vers l'adresse IP publique de l'IP Load Balancer.
Déployer Nextcloud sur le cluster de production
Remplacez les paramètres suivants avant d'exécuter la commande :
<YOUR_DNS_DOMAIN> : le nom de domaine dont la zone DNS est hébergée chez OVHcloud. L'enregistrement A créé précédemment rend Nextcloud accessible à l'adresse nextcloud.<YOUR_DNS_DOMAIN>.
<YOUR_ADMIN_PASSWORD> : le mot de passe du compte administrateur admin-demo de Nextcloud.
54ghne6d.eu-west-par.container-registry.ovh.net : le registre qui héberge l'image Nextcloud. Faites pointer image.registry et image.repository vers votre propre registre, ou supprimez les deux options pour récupérer l'image depuis le registre par défaut du chart.
Warning
Le mot de passe administrateur est passé en ligne de commande : il se retrouve donc dans l'historique de votre shell et dans les valeurs de la release Helm. Utilisez un mot de passe dédié et changez-le après la première connexion.
Les bases de données ne sont joignables que depuis le réseau privé : chaque région reçoit donc une instance bastion disposant du client PostgreSQL. Le bastion de production met également en place la réplication logique vers le site de secours via son script cloud-init : il liste les tables Nextcloud (oc_*), crée une publication pour celles-ci, copie leur schéma vers la base de secours, et crée l'abonnement correspondant.
Relevez l'adresse IP publique de chaque bastion dans l'espace client OVHcloud, puis stockez-les. Remplacez les paramètres suivants avant d'exécuter les commandes :
<BASTION_PUBLIC_IP_PROD> : la Floating IP de l'instance bastion-prod.
<BASTION_PUBLIC_IP_DRP> : la Floating IP de l'instance bastion-drp.
Répliquer la configuration Nextcloud vers le cluster de secours
Nextcloud génère sa propre configuration au premier démarrage. Pour donner la même configuration au cluster de secours, sauvegardez-la sur le cluster de production avec Velero, puis restaurez-la de l'autre côté.
La commande est la même que pour la production, à trois différences près : les points de terminaison et identifiants du site de secours, le bucket de secours à Strasbourg, et --take-ownership, qui permet à Helm d'adopter les ressources restaurées par Velero.
Remplacez les paramètres suivants avant d'exécuter la commande, en utilisant les mêmes valeurs que sur le cluster de production :
<YOUR_DNS_DOMAIN> : le nom de domaine dont la zone DNS est hébergée chez OVHcloud.
<YOUR_ADMIN_PASSWORD> : le mot de passe du compte administrateur admin-demo de Nextcloud.
54ghne6d.eu-west-par.container-registry.ovh.net : le registre qui héberge l'image Nextcloud.
Le site de secours est désormais entièrement provisionné et maintenu synchronisé. Basculer consiste à inverser le sens des deux réplications et à changer le backend de l'IP Load Balancer.
Bascule
Simulez un incident en réduisant le déploiement de production à zéro réplica :
Pour une formation ou une assistance technique sur la mise en œuvre de nos solutions, contactez votre commercial ou consultez la page Professional Services pour obtenir un devis et faire analyser votre projet par nos experts.
Votre avis nous intéresse !
N’hésitez pas à nous faire part de vos questions, retours et suggestions pour améliorer le service :
1 : S3 est une marque déposée appartenant à Amazon Technologies, Inc. Les services OVHcloud ne sont pas sponsorisés, approuvés, ou affiliés de quelque manière que ce soit.