From b5976d49b0d2e2f75d0ee4a766643410414a279c Mon Sep 17 00:00:00 2001 From: Antonin G <98969594+agoude@users.noreply.github.com> Date: Tue, 29 Jul 2025 10:22:43 +0200 Subject: [PATCH 01/17] Create EN Migration guide.en-gb.md New repo for S3-compatible migration guide --- .../object_storage/s3_migration/guide.en-gb.md | 1 + 1 file changed, 1 insertion(+) create mode 100644 pages/storage_and_backup/object_storage/s3_migration/guide.en-gb.md diff --git a/pages/storage_and_backup/object_storage/s3_migration/guide.en-gb.md b/pages/storage_and_backup/object_storage/s3_migration/guide.en-gb.md new file mode 100644 index 00000000000..8b137891791 --- /dev/null +++ b/pages/storage_and_backup/object_storage/s3_migration/guide.en-gb.md @@ -0,0 +1 @@ + From 21f83c1dc6f31cf6c1b24c3ba7e6f921aff03355 Mon Sep 17 00:00:00 2001 From: Antonin G <98969594+agoude@users.noreply.github.com> Date: Tue, 29 Jul 2025 14:27:45 +0200 Subject: [PATCH 02/17] Update EN S3 migration rclone guide.en-gb.md New guide on how to migrate from S3-compatible Object Storage to OVHcloud one. - details on architecture - configuration and execution of rclone --- .../s3_migration/guide.en-gb.md | 165 ++++++++++++++++++ 1 file changed, 165 insertions(+) diff --git a/pages/storage_and_backup/object_storage/s3_migration/guide.en-gb.md b/pages/storage_and_backup/object_storage/s3_migration/guide.en-gb.md index 8b137891791..907ad53aa3a 100644 --- a/pages/storage_and_backup/object_storage/s3_migration/guide.en-gb.md +++ b/pages/storage_and_backup/object_storage/s3_migration/guide.en-gb.md @@ -1 +1,166 @@ +--- +title: Object Storage - How to migrate from an S3-compatible object storage provider to OVHcloud Object Storage +excerpt: This guide provides details on how to migrate from an S3-compatible object storage provider to OVHcloud Object Storage using Rclone. +updated: 2025-07-31 +--- + +## Objective + +This guide provides detailed steps to help you migrate from a third-party S3-compatible object storage provider to OVHcloud Object Storage using the popular [Rclone](https://rclone.org/){.external} tool, a command-line tool that can be used to manage cloud storage resources. +> [!warning] +> +> OVHcloud provides services which you are responsible for with regard to their configuration and management. You are therefore responsible for ensuring they function correctly. +> +> This guide is designed to assist you in common tasks as much as possible. If you encounter any difficulties performing these actions, please contact a [specialist service provider](/links/partner) and/or discuss the issue with our [community of users](/links/community). OVHcloud cannot provide you with technical support in this regard. +> + +## Requirements + +- An **S3-compatible source bucket** in your current object storage with: + - Your bucket name + - Your associated access and secret keys + - The associated region ID + +- An **OVHcloud Object Storage destination bucket** with: + - Your bucket name + - Your associated access and secret keys + - The associated region ID + +- An **OVHcloud virtual machine** with Rclone installed working ats the management workstation in our scenario. To get the best results, within your budget, we suggest at least the following specifications: + - b3-16: 4 v-cores and 16 GB of RAM + - c3-16: 8 v-cores and 16 GB of RAM + +> [!primary] +> +> If this is your first time creating an Object Storage bucket, see [Getting Started with Object Storage](/pages/storage_and_backup/object_storage/s3_getting_started_with_object_storage). +> + +## Migration Process + +![Bucket details](images/Move to cloud - Object Storage.png){.thumbnail} + +See the diagram above for an illustration of the architecture. An OVHcloud Public Cloud virtual machine acts as an entry point, on which Rclone (installed with SSH and sudo access enabled) moves data to OVHcloud Object Storage. + +## Considerations + +### Egress +Egress fees may apply when migrating from your current platform, depending on your provider. The term “egress” describes the volume of data transferred from the provider’s network. **We highly recommend reviewing your current provider’s egress pricing** before starting migration. + +### Migration speed optimisation +Keep in mind that several factors could affect how long migration takes. Consider not only the volume of data you plan to migrate but also the quantity and size of individual objects. Infrastructure and network limitations (bandwidth, computing power, network interfaces, etc.) could also affect performance. + +### Data volume +This guide mainly **focuses on data migration for small to medium volumes (generally under 200 TB)**. For applications needing migration of hundreds or thousands of terabytes, we suggest contacting our professional services team for identifying the best approaches for migrating your data. + +## Instructions + +### Step 1 - Preparing your S3-compatible source bucket + +As explained before you will need your `access key`, `secret key` but also the `region ID` in which your bucket is. Connect to your source bucket provider console to get those details. + +### Step 2 - Preparing your OVHcloud destination bucket + +Similar to your source bucket, you will need your `access key`, `secret key` but also the `region ID` for your destination bucket. Log in to the [OVHcloud Control Panel](/links/manager) and Navigate to the `Object Storage`{.action} section to collect those details. + +### Step 3 - Installing, configuring and running Rclone + +#### Step 3.1 - Installing Rclone +If you haven’t already, install **Rclone** by following the instructions in the [documentation](https://rclone.org/install/){.external}, based on your OS configuration. + +#### Step 3.2 - Configuring Rclone +After installing **Rclone** on your virtual machine, configure its connection to both the source and destination buckets. + +```bash +$ rclone config +``` +This command will open the configuration menu and will guide you step by step with the configuration. You can also create/modify the configuration file by yourself with the following command: +```bash +$ rclone config file +``` +If the configuration file doesn’t exist, you’ll be prompted to add the following configuration using your preferred editor. For example, on linux you can use `nano` : +```bash +$ nano /home//.config/rclone/rclone.conf +``` +Then, add your configuration blocks: + +```bash +[] +type = s3 +provider = +env_auth = false +access_key_id = +secret_access_key = +region = + +[ovhcloud] +type = s3 +provider = OVHcloud +env_auth = false +access_key_id = OVH-ACCESS-KEY +secret_access_key = OVH-SECRET-KEY +endpoint = s3.rbx.io.cloud.ovh.net +region = rbx +``` + +> [!primary] +> +> To get the list of supported providers, access the [Rclone Supported Providers](https://rclone.org/#providers){.external} documentation. This will help you filling out the `` field. +> + +You can then test your source provider and your OVHcloud connections using the `rclone config` command by as below: +```bash +$ rclone config +``` +#### Step 3.3 - Running Rclone +Depending on your strategy you can use two different commands to start the migration. Either you use the `rclone sync` command to start the migration of one or all buckets. As detailed in the documentation, the `rclone sync`command will make source and destination identical. Be careful then when using it. +You can also use the `rclone copy` command that will copy files from your source to your destination. +In both cases, remember to change `source-bucket-name` and `ovh-bucket-name` to your S3-compatible source provider and OVHcloud Object Storage bucket names, respectively: + +```bash +$ rclone sync :source-bucket-name/ ovhcloud:ovh-bucket-name/ --progress +``` +or +```bash +$ rclone copy :source-bucket-name/ ovhcloud:ovh-bucket-name/ --progress +``` +`--progress` shows progress during transfer + +In order to leverage the rclone WebUI GUI you can also use the following command: + +```bash +$ rclone copy :source-bucket-name/ ovhcloud:ovh-bucket-name/ --transfers 50 --rc --rc-addr :5572 --rc-web-gui --rc-user USERNAME --rc-pass PASSWORD +``` +In this command we added specific flags to optimize and monitor the copy: + +- `--transfers` int represents the number of file transfers to run in parallel (default 4). Test different value based on your use case and your configuration as high values may increase CPU usage for example. +- `--rc` enables the remote control server +- `--rc-addr :5572` represents the address and the port used to access rclone’s WebUI GUI. Port 5572 is the default port used rclone to securely access the WebUI. +- `--rc-web-gui` launches WebGUI on localhost +- `--rc-user USERNAME` `--rc-pass PASSWORD` are your user and password for authentication Be sure to enter the right credentials. + +> [!primary] +> +> Many other flags are available with rclone. You can get them on the [Rclone documentation](https://rclone.org/commands/rclone/){.external}. +> + +With the copy process set up, you can now begin monitoring the migration process using rclone’s WebUI GUI. + +In your preferred web browser, use port 5572 to reach your instance’s address: `http://IP-ADDRESS:5572`{.action} + +You’ll need to log in using your rclone credentials: `--rc-user` and `–rc-pass`. +Once you’re logged in, you can track the `rclone copy` command’s progress: check job status, throughput, bandwidth, object count, and total data volume. From the GUI, you can also manage new remotes and new actions. + +#### MIgration status + +We recommend comparing the source and destination buckets after migration. Your source and OVHcloud destination buckets can be compared via command line or their respective control panels. + +You can check the size of both buckets and number of objects using this command line: +```bash +rclone size :source-bucket-name/ +rclone size ovhcloud:ovh-bucket-name/ +``` + +## Go further + +Join our [community of users](/links/community). From 938be020edfd06cf50e40f1faab13584481f9a5c Mon Sep 17 00:00:00 2001 From: Antonin G <98969594+agoude@users.noreply.github.com> Date: Tue, 29 Jul 2025 15:42:25 +0200 Subject: [PATCH 03/17] Create test.txt --- .../object_storage/s3_migration/images/test.txt | 1 + 1 file changed, 1 insertion(+) create mode 100644 pages/storage_and_backup/object_storage/s3_migration/images/test.txt diff --git a/pages/storage_and_backup/object_storage/s3_migration/images/test.txt b/pages/storage_and_backup/object_storage/s3_migration/images/test.txt new file mode 100644 index 00000000000..8b137891791 --- /dev/null +++ b/pages/storage_and_backup/object_storage/s3_migration/images/test.txt @@ -0,0 +1 @@ + From 157f1352544e27804babc2d0ec1d61dab49c0a78 Mon Sep 17 00:00:00 2001 From: Antonin G <98969594+agoude@users.noreply.github.com> Date: Tue, 29 Jul 2025 15:42:52 +0200 Subject: [PATCH 04/17] Adding image for move2cloud --- .../images/Move to cloud - Object Storage.png | Bin 0 -> 67786 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 pages/storage_and_backup/object_storage/s3_migration/images/Move to cloud - Object Storage.png diff --git a/pages/storage_and_backup/object_storage/s3_migration/images/Move to cloud - Object Storage.png b/pages/storage_and_backup/object_storage/s3_migration/images/Move to cloud - Object Storage.png new file mode 100644 index 0000000000000000000000000000000000000000..993d3e65ecf7b1836d94f188c2e40872c76fd40f GIT binary patch literal 67786 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 literal 0 HcmV?d00001 From 8f5bf97f1082eb74b6dd5b74dc5176eeddbf0303 Mon Sep 17 00:00:00 2001 From: Antonin G <98969594+agoude@users.noreply.github.com> Date: Tue, 29 Jul 2025 15:46:44 +0200 Subject: [PATCH 05/17] Create meta.yaml --- pages/storage_and_backup/object_storage/s3_migration/meta.yaml | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 pages/storage_and_backup/object_storage/s3_migration/meta.yaml diff --git a/pages/storage_and_backup/object_storage/s3_migration/meta.yaml b/pages/storage_and_backup/object_storage/s3_migration/meta.yaml new file mode 100644 index 00000000000..aab491720bf --- /dev/null +++ b/pages/storage_and_backup/object_storage/s3_migration/meta.yaml @@ -0,0 +1,2 @@ +id: copy here a version4 UUID you can generate using 12e429d2-c515-42c8-b160-19484a51d449 +full_slug: public-cloud-storage-object-storage-migrate-from-s3-to-ovhcloud From c8b323aee44c0f36bddaea46eb662cc049b443c0 Mon Sep 17 00:00:00 2001 From: Antonin G <98969594+agoude@users.noreply.github.com> Date: Tue, 29 Jul 2025 15:49:25 +0200 Subject: [PATCH 06/17] Update index.md Adding storage_and_backup/object_storage/s3_migration --- pages/index.md | 1 + 1 file changed, 1 insertion(+) diff --git a/pages/index.md b/pages/index.md index 5308f897ea5..522d97d8f3a 100644 --- a/pages/index.md +++ b/pages/index.md @@ -1852,6 +1852,7 @@ + [Object Storage - Use Object Storage with Owncloud](storage_and_backup/object_storage/s3_owncloud) + [Object Storage - Use Object Storage with Cohesity NetBackup](storage_and_backup/object_storage/s3_cohesity_netbackup) + [Object Storage - Manage an Object Storage bucket with Terraform](storage_and_backup/object_storage/s3_terraform) + + [Object Storage - How to migrate from an S3-compatible object storage provider to OVHcloud Object Storage](storage_and_backup/object_storage/s3_migration) + [Cold Archive Storage Class Specifics](storage-object-storage-cold-archive-storage-class-specifics) + [Cold Archive - Getting started with Cold Archive](storage_and_backup/object_storage/cold_archive_getting_started) + [Cold Archive - Overview](storage_and_backup/object_storage/cold_archive_overview) From 3093935c7faa675a82f34a5dbbf29f2545b155f2 Mon Sep 17 00:00:00 2001 From: Antonin G <98969594+agoude@users.noreply.github.com> Date: Tue, 29 Jul 2025 15:51:33 +0200 Subject: [PATCH 07/17] Update guide.en-gb.md alternative text for image update --- .../object_storage/s3_migration/guide.en-gb.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pages/storage_and_backup/object_storage/s3_migration/guide.en-gb.md b/pages/storage_and_backup/object_storage/s3_migration/guide.en-gb.md index 907ad53aa3a..cfb73525176 100644 --- a/pages/storage_and_backup/object_storage/s3_migration/guide.en-gb.md +++ b/pages/storage_and_backup/object_storage/s3_migration/guide.en-gb.md @@ -38,7 +38,7 @@ This guide provides detailed steps to help you migrate from a third-party S3-com ## Migration Process -![Bucket details](images/Move to cloud - Object Storage.png){.thumbnail} +![Architecture](images/Move to cloud - Object Storage.png){.thumbnail} See the diagram above for an illustration of the architecture. An OVHcloud Public Cloud virtual machine acts as an entry point, on which Rclone (installed with SSH and sudo access enabled) moves data to OVHcloud Object Storage. From 82f1a49da71ea2f2b7804572d01164d634f84c71 Mon Sep 17 00:00:00 2001 From: Antonin G <98969594+agoude@users.noreply.github.com> Date: Wed, 30 Jul 2025 08:36:38 +0200 Subject: [PATCH 08/17] Update EN guide.en-gb.md Fix typo + new internal link --- .../object_storage/s3_migration/guide.en-gb.md | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/pages/storage_and_backup/object_storage/s3_migration/guide.en-gb.md b/pages/storage_and_backup/object_storage/s3_migration/guide.en-gb.md index cfb73525176..1da3c5ae730 100644 --- a/pages/storage_and_backup/object_storage/s3_migration/guide.en-gb.md +++ b/pages/storage_and_backup/object_storage/s3_migration/guide.en-gb.md @@ -61,7 +61,7 @@ As explained before you will need your `access key`, `secret key` but also the ` ### Step 2 - Preparing your OVHcloud destination bucket -Similar to your source bucket, you will need your `access key`, `secret key` but also the `region ID` for your destination bucket. Log in to the [OVHcloud Control Panel](/links/manager) and Navigate to the `Object Storage`{.action} section to collect those details. +Similar to your source bucket, you will need your `access key`, `secret key` but also the `region ID` for your destination bucket. Log in to the [OVHcloud Control Panel](/links/manager) and navigate to the `Object Storage`{.action} section to collect those details. ### Step 3 - Installing, configuring and running Rclone @@ -99,13 +99,14 @@ provider = OVHcloud env_auth = false access_key_id = OVH-ACCESS-KEY secret_access_key = OVH-SECRET-KEY -endpoint = s3.rbx.io.cloud.ovh.net -region = rbx +endpoint = [s3.rbx.io.cloud.ovh.net](https://s3..io.cloud.ovh.net) +region = ``` + > [!primary] > -> To get the list of supported providers, access the [Rclone Supported Providers](https://rclone.org/#providers){.external} documentation. This will help you filling out the `` field. +> To get the list of OVHcloud region endpoints, see [Object Storage - Endpoints and Object Storage geoavailability](/pages/storage_and_backup/object_storage/s3_locations). > You can then test your source provider and your OVHcloud connections using the `rclone config` command by as below: From 1600ec6487245474f2ed94d8dd48a3cdc5d6bbd4 Mon Sep 17 00:00:00 2001 From: Antonin G <98969594+agoude@users.noreply.github.com> Date: Wed, 30 Jul 2025 08:37:30 +0200 Subject: [PATCH 09/17] Update guide.en-gb.md --- .../object_storage/s3_migration/guide.en-gb.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pages/storage_and_backup/object_storage/s3_migration/guide.en-gb.md b/pages/storage_and_backup/object_storage/s3_migration/guide.en-gb.md index 1da3c5ae730..ed4a61238af 100644 --- a/pages/storage_and_backup/object_storage/s3_migration/guide.en-gb.md +++ b/pages/storage_and_backup/object_storage/s3_migration/guide.en-gb.md @@ -99,7 +99,7 @@ provider = OVHcloud env_auth = false access_key_id = OVH-ACCESS-KEY secret_access_key = OVH-SECRET-KEY -endpoint = [s3.rbx.io.cloud.ovh.net](https://s3..io.cloud.ovh.net) +endpoint = s3..io.cloud.ovh.net region = ``` From 7b64890299b21450cc98097f07db65e665b4b9c0 Mon Sep 17 00:00:00 2001 From: Antonin G <98969594+agoude@users.noreply.github.com> Date: Thu, 4 Sep 2025 10:51:27 +0200 Subject: [PATCH 10/17] Update EN guide.en-gb.md Changelog: - adding details about the new OVH provider available on rclone.org --- .../object_storage/s3_migration/guide.en-gb.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/pages/storage_and_backup/object_storage/s3_migration/guide.en-gb.md b/pages/storage_and_backup/object_storage/s3_migration/guide.en-gb.md index ed4a61238af..15b1e7dee84 100644 --- a/pages/storage_and_backup/object_storage/s3_migration/guide.en-gb.md +++ b/pages/storage_and_backup/object_storage/s3_migration/guide.en-gb.md @@ -1,7 +1,7 @@ --- title: Object Storage - How to migrate from an S3-compatible object storage provider to OVHcloud Object Storage excerpt: This guide provides details on how to migrate from an S3-compatible object storage provider to OVHcloud Object Storage using Rclone. -updated: 2025-07-31 +updated: 2025-09-08 --- ## Objective @@ -74,7 +74,8 @@ After installing **Rclone** on your virtual machine, configure its connection to ```bash $ rclone config ``` -This command will open the configuration menu and will guide you step by step with the configuration. You can also create/modify the configuration file by yourself with the following command: +This command will open the configuration menu and will guide you step by step with the configuration. The OVHcloud provider configuration is available and will guide you step by step. Follow the steps available [here](https://rclone.org/s3/#ovhcloud){.external}. +You can also create/modify the configuration file by yourself with the following command: ```bash $ rclone config file ``` @@ -103,7 +104,6 @@ endpoint = s3..io.cloud.ovh.net region = ``` - > [!primary] > > To get the list of OVHcloud region endpoints, see [Object Storage - Endpoints and Object Storage geoavailability](/pages/storage_and_backup/object_storage/s3_locations). @@ -152,7 +152,7 @@ In your preferred web browser, use port 5572 to reach your instance’s address: You’ll need to log in using your rclone credentials: `--rc-user` and `–rc-pass`. Once you’re logged in, you can track the `rclone copy` command’s progress: check job status, throughput, bandwidth, object count, and total data volume. From the GUI, you can also manage new remotes and new actions. -#### MIgration status +#### Migration status We recommend comparing the source and destination buckets after migration. Your source and OVHcloud destination buckets can be compared via command line or their respective control panels. From d186fda0a1fb1eb65ead25be5ce8779f1446a2ad Mon Sep 17 00:00:00 2001 From: Antonin G <98969594+agoude@users.noreply.github.com> Date: Thu, 4 Sep 2025 11:00:18 +0200 Subject: [PATCH 11/17] Create guide.fr-fr.md create guide FR file --- .../object_storage/s3_migration/guide.fr-fr.md | 1 + 1 file changed, 1 insertion(+) create mode 100644 pages/storage_and_backup/object_storage/s3_migration/guide.fr-fr.md diff --git a/pages/storage_and_backup/object_storage/s3_migration/guide.fr-fr.md b/pages/storage_and_backup/object_storage/s3_migration/guide.fr-fr.md new file mode 100644 index 00000000000..8b137891791 --- /dev/null +++ b/pages/storage_and_backup/object_storage/s3_migration/guide.fr-fr.md @@ -0,0 +1 @@ + From dc4615c9c395d75649c1bdf34add0d3204698693 Mon Sep 17 00:00:00 2001 From: Antonin G <98969594+agoude@users.noreply.github.com> Date: Thu, 4 Sep 2025 11:37:58 +0200 Subject: [PATCH 12/17] Update FR guide.fr-fr.md Guide now available in FR --- .../s3_migration/guide.fr-fr.md | 178 ++++++++++++++++++ 1 file changed, 178 insertions(+) diff --git a/pages/storage_and_backup/object_storage/s3_migration/guide.fr-fr.md b/pages/storage_and_backup/object_storage/s3_migration/guide.fr-fr.md index 8b137891791..3c9c26d6e82 100644 --- a/pages/storage_and_backup/object_storage/s3_migration/guide.fr-fr.md +++ b/pages/storage_and_backup/object_storage/s3_migration/guide.fr-fr.md @@ -1 +1,179 @@ +--- +title: Object Storage - Comment migrer d'un fournisseur de stockage objet compatible S3 vers OVHcloud Object Storage +excerpt: Ce guide fournit des détails sur la façon de migrer d'un fournisseur de stockage objet compatible S3 vers OVHcloud Object Storage en utilisant l(outil Rclone. +updated: 2025-09-08 +--- + +## Objectif + +Ce guide fournit des étapes détaillées pour vous aider à migrer d'un fournisseur de stockage objet tiers compatible S3 vers OVHcloud Object Storage en utilisant [Rclone](https://rclone.org/){.external}, un outil en ligne de commande très populaire qui peut être utilisé pour gérer les ressources de stockage cloud. + +> [!warning] +> +> OVHcloud fournit des services dont vous êtes responsable en ce qui concerne leur configuration et leur gestion. Vous êtes donc responsable de vous assurer qu'ils fonctionnent correctement. +> +> Ce guide est conçu pour vous aider dans les tâches courantes autant que possible. Si vous rencontrez des difficultés pour effectuer ces actions, veuillez contacter un [fournisseur de services spécialisés](/links/partner) et/ou discuter du problème avec notre [communauté d'utilisateurs](/links/community). OVHcloud ne peut pas vous fournir de support technique à cet égard. +> + +## Exigences + +- Un **bucket source compatible S3** dans votre stockage objet actuel avec : + - Le nom de votre bucket + - Les clés d'accès et secrètes associées + - L'ID de la région associée + +- Un **bucket de destination OVHcloud Object Storage** avec : + - Le nom de votre bucket + - Les clés d'accès et secrètes associées + - L'ID de la région associée + +- **Une machine virtuelle OVHcloud** avec Rclone installé en tant que station de contrôle dans notre scénario. Pour obtenir les meilleurs résultats, et en prenant en compte votre budget, nous suggérons au moins les spécifications suivantes : + + - b3-16 : 4 v-cores et 16 Go de RAM + - c3-16 : 8 v-cores et 16 Go de RAM + + +> [!primary] +> +> Si c'est la première fois que vous créez un bucket Object Storage, consultez [Premiers pas avec Object Storage](/pages/storage_and_backup/object_storage/s3_getting_started_with_object_storage). +> + +## Processus de migration + +![Architecture](images/Move to cloud - Object Storage.png){.thumbnail} + +Voir le diagramme ci-dessus pour une illustration de l'architecture. Une machine virtuelle OVHcloud Public Cloud agit en tant que point d'entrée, sur laquelle Rclone (installé avec SSH et sudo activé) déplace les données vers OVHcloud Object Storage. + +## Considérations + +### Egress +Des frais d'egress peuvent s'appliquer lors de la migration de votre plateforme actuelle, selon votre fournisseur source. Le terme « egress » décrit le volume de données transférées du réseau de ce fournisseur. **Nous vous recommandons vivement de consulter les tarifs d'egress de votre fournisseur actuel** avant de commencer la migration. + +### Optimisation de la vitesse de migration +Gardez à l'esprit que plusieurs facteurs peuvent impacter la durée de la migration. Considérez non seulement le volume de données que vous prévoyez de migrer, mais également la quantité et la taille des objets individuels. Les limitations d'infrastructure et de réseau (bande passante, puissance de calcul, interfaces réseau, etc.) peuvent également affecter les performances. + +### Volume de données +Ce guide se concentre principalement sur la **migration de données pour des volumes petits à moyens (généralement inférieurs à 200 To)**. Pour les applications nécessitant la migration de centaines ou de milliers de téraoctets, nous suggérons de contacter notre équipe de services professionnels pour identifier les meilleures approches pour migrer vos données. + +## Instructions + +### Étape 1 - Préparation de votre bucket source S3-compatible + +Comme expliqué précédemment, vous aurez besoin de votre `access key`, `secret key` mais également du `region ID` de la région dans laquelle se trouve votre bucket. Connectez-vous à la console de votre fournisseur de bucket source pour obtenir ces détails. + + +### Étape 2 - Préparation de votre bucket de destination OVHcloud + +De même que pour votre bucket source, vous aurez besoin de votre clé d'accès, clé secrète mais également du `region ID` de la région dans laquelle se trouve votre bucket de destination. Connectez-vous à la [console OVHcloud](/links/manager) et accédez à la section `Object Storage`{.action} pour collecter ces détails. + +### Étape 3 - Installation, configuration et exécution de Rclone + +#### Étape 3.1 - Installation de Rclone +Si vous ne l'avez pas déjà fait, installez **Rclone** en suivant les instructions de la [documentation](https://rclone.org/install/){.external}, en fonction de votre configuration de système d'exploitation. + +#### Étape 3.2 - Configuration de Rclone +Après avoir installé **Rclone** sur votre machine virtuelle, configurez sa connexion aux buckets source et de destination. + +```bash +$ rclone config +``` +Cette commande ouvrira le menu de configuration et vous guidera étape par étape pour la configuration. La configuration du fournisseur OVHcloud est disponible et vous guidera étape par étape. Suivez les étapes disponibles [ici](https://rclone.org/s3/#ovhcloud){.external}. Vous pouvez également créer/modifier le fichier de configuration vous-même avec la commande suivante : + +```bash +$ rclone config file +``` +Si le fichier de configuration n'existe pas, vous serez invité à ajouter les blocs de configuration suivants en utilisant votre éditeur préféré. Par exemple, sous Linux, vous pouvez utiliser `nano` : + +```bash +$ nano /home//.config/rclone/rclone.conf +``` +Ajoutez ensuite vos blocs de configuration : + +```bash +[] +type = s3 +provider = +env_auth = false +access_key_id = +secret_access_key = +region = + +[ovhcloud] +type = s3 +provider = OVHcloud +env_auth = false +access_key_id = OVH-ACCESS-KEY +secret_access_key = OVH-SECRET-KEY +endpoint = s3..io.cloud.ovh.net +region = +``` + +> [!primary] +> +> Pour obtenir la liste des endpoints des régions OVHcloud, consultez [Object Storage - Endpoints and disponibilités géographiques](/pages/storage_and_backup/object_storage/s3_locations). +> + +Vous pouvez ensuite tester vos connexions source et OVHcloud en utilisant la commande `rclone config` comme suit : + +```bash +$ rclone config +``` +#### Étape 3.3 - Exécution de Rclone + +En fonction de votre stratégie, vous pouvez utiliser deux commandes différentes pour démarrer la migration. Vous pouvez utiliser la commande `rclone sync` pour démarrer la migration d'un ou de plusieurs buckets. Comme expliqué dans la documentation, la commande `rclone sync` rendra les buckets source et de destination identiques. +Vous pouvez également utiliser la commande `rclone copy` pour copier les fichiers de votre source vers votre destination. +Dans les deux cas, n'oubliez pas de remplacer `source-bucket-name` et `ovh-bucket-name` par les noms de vos buckets source et de destination, respectivement : + + +```bash +$ rclone sync :source-bucket-name/ ovhcloud:ovh-bucket-name/ --progress +``` +ou + +```bash +$ rclone copy :source-bucket-name/ ovhcloud:ovh-bucket-name/ --progress +``` +`--progress` affiche la progression pendant le transfert + +Pour utiliser la WebUI de Rclone, vous pouvez également utiliser la commande suivante : + +```bash +$ rclone copy :source-bucket-name/ ovhcloud:ovh-bucket-name/ --transfers 50 --rc --rc-addr :5572 --rc-web-gui --rc-user USERNAME --rc-pass PASSWORD +``` +Dans cette commande, nous avons ajouté des options spécifiques pour optimiser et surveiller la copie : + +- `--transfers` représente le nombre de transferts de fichiers à exécuter en parallèle (par défaut 4). Testez différentes valeurs en fonction de votre cas d'utilisation et de votre configuration, car des valeurs élevées peuvent augmenter l'utilisation du processeur, par exemple. +- `--rc` active le serveur de contrôle à distance +- `--rc-addr :5572` représente l'adresse et le port utilisés pour accéder à l'interface web de Rclone. Le port 5572 est le port par défaut utilisé par Rclone pour accéder de manière sécurisée à l'interface web. +- `--rc-web-gui` lance l'interface web sur localhost +- `--rc-user USERNAME` `--rc-pass PASSWORD` sont vos identifiants et mot de passe pour l'authentification. Assurez-vous de saisir les informations d'identification correctes. + +> [!primary] +> +> De nombreuses autres options sont disponibles avec Rclone. Vous pouvez les consulter dans la [documentation](https://rclone.org/commands/rclone/){.external}. +> + +Avec le processus désormais configuré, vous pouvez maintenant commencer à surveiller le processus de migration en utilisant l'interface web de Rclone. + +Dans votre navigateur web préféré, utilisez le port 5572 pour accéder à l'adresse de votre instance : `http://IP-ADDRESS:5572`{.action} + +Vous devrez vous connecter en utilisant vos identifiants Rclone : `--rc-user` and `–rc-pass`. +Une fois connecté, vous pouvez suivre la progression de la commande `rclone copy` : vérifiez le statut de la tâche, le débit, la bande passante, le nombre d'objets et le volume total de données. À partir de l'interface web, vous pouvez également gérer de nouveaux remotes et de nouvelles actions. + +#### État de la migration + +Nous vous recommandons de comparer les buckets source et de destination après la migration. Vos buckets source et de destination OVHcloud peuvent être comparés via la ligne de commande ou leurs consoles respectives. + +Vous pouvez également vérifier la taille des deux buckets et le nombre d'objets en utilisant cette commande : + +```bash +rclone size :source-bucket-name/ +rclone size ovhcloud:ovh-bucket-name/ +``` + +## Allez plus loin + +Si vous avez besoin d'une formation ou d'une assistance technique pour la mise en oeuvre de nos solutions, contactez votre commercial ou cliquez sur [ce lien](/links/professional-services) pour obtenir un devis et demander une analyse personnalisée de votre projet à nos experts de l’équipe Professional Services. + +Échangez avec notre [communauté d'utilisateurs](/links/community). From ed5012f572f36b1056a3174ff2d7efb353042e04 Mon Sep 17 00:00:00 2001 From: Antonin G <98969594+agoude@users.noreply.github.com> Date: Thu, 4 Sep 2025 11:38:51 +0200 Subject: [PATCH 13/17] Update guide.fr-fr.md small typo --- .../object_storage/s3_migration/guide.fr-fr.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pages/storage_and_backup/object_storage/s3_migration/guide.fr-fr.md b/pages/storage_and_backup/object_storage/s3_migration/guide.fr-fr.md index 3c9c26d6e82..a56aa09714d 100644 --- a/pages/storage_and_backup/object_storage/s3_migration/guide.fr-fr.md +++ b/pages/storage_and_backup/object_storage/s3_migration/guide.fr-fr.md @@ -42,7 +42,7 @@ Ce guide fournit des étapes détaillées pour vous aider à migrer d'un fournis ![Architecture](images/Move to cloud - Object Storage.png){.thumbnail} -Voir le diagramme ci-dessus pour une illustration de l'architecture. Une machine virtuelle OVHcloud Public Cloud agit en tant que point d'entrée, sur laquelle Rclone (installé avec SSH et sudo activé) déplace les données vers OVHcloud Object Storage. +Voir le diagramme ci-dessus pour une illustration de l'architecture. Une machine virtuelle OVHcloud agit en tant que point d'entrée, sur laquelle Rclone (installé avec SSH et sudo activé) déplace les données vers OVHcloud Object Storage. ## Considérations From 87734131715b94dc49c863d3b54cf81f7efe3af4 Mon Sep 17 00:00:00 2001 From: Antonin G <98969594+agoude@users.noreply.github.com> Date: Mon, 8 Sep 2025 09:21:03 +0200 Subject: [PATCH 14/17] Update EN migration guide.en-gb.md Changelog - typos --- .../object_storage/s3_migration/guide.en-gb.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pages/storage_and_backup/object_storage/s3_migration/guide.en-gb.md b/pages/storage_and_backup/object_storage/s3_migration/guide.en-gb.md index 15b1e7dee84..cb570378282 100644 --- a/pages/storage_and_backup/object_storage/s3_migration/guide.en-gb.md +++ b/pages/storage_and_backup/object_storage/s3_migration/guide.en-gb.md @@ -27,7 +27,7 @@ This guide provides detailed steps to help you migrate from a third-party S3-com - Your associated access and secret keys - The associated region ID -- An **OVHcloud virtual machine** with Rclone installed working ats the management workstation in our scenario. To get the best results, within your budget, we suggest at least the following specifications: +- An **OVHcloud virtual machine** with Rclone installed working as the management workstation in our scenario. To get the best results, within your budget, we suggest at least the following specifications: - b3-16: 4 v-cores and 16 GB of RAM - c3-16: 8 v-cores and 16 GB of RAM @@ -74,7 +74,7 @@ After installing **Rclone** on your virtual machine, configure its connection to ```bash $ rclone config ``` -This command will open the configuration menu and will guide you step by step with the configuration. The OVHcloud provider configuration is available and will guide you step by step. Follow the steps available [here](https://rclone.org/s3/#ovhcloud){.external}. +This command will open the configuration menu and will guide you step by step with the configuration. The official OVHcloud provider configuration is available and will guide you step by step. Follow the steps available [here](https://rclone.org/s3/#ovhcloud){.external}. You can also create/modify the configuration file by yourself with the following command: ```bash $ rclone config file From 6607b07f6d504b2c24fdfdf42ddd9195d1543c06 Mon Sep 17 00:00:00 2001 From: Antonin G <98969594+agoude@users.noreply.github.com> Date: Mon, 8 Sep 2025 09:22:32 +0200 Subject: [PATCH 15/17] Update FR migration guide.fr-fr.md typos --- .../object_storage/s3_migration/guide.fr-fr.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pages/storage_and_backup/object_storage/s3_migration/guide.fr-fr.md b/pages/storage_and_backup/object_storage/s3_migration/guide.fr-fr.md index a56aa09714d..9bce192a91f 100644 --- a/pages/storage_and_backup/object_storage/s3_migration/guide.fr-fr.md +++ b/pages/storage_and_backup/object_storage/s3_migration/guide.fr-fr.md @@ -77,7 +77,7 @@ Après avoir installé **Rclone** sur votre machine virtuelle, configurez sa con ```bash $ rclone config ``` -Cette commande ouvrira le menu de configuration et vous guidera étape par étape pour la configuration. La configuration du fournisseur OVHcloud est disponible et vous guidera étape par étape. Suivez les étapes disponibles [ici](https://rclone.org/s3/#ovhcloud){.external}. Vous pouvez également créer/modifier le fichier de configuration vous-même avec la commande suivante : +Cette commande ouvrira le menu de configuration et vous guidera étape par étape pour la configuration. Le provider officiel OVHcloud est disponible et vous guidera étape par étape, pour le consulter c'est [ici](https://rclone.org/s3/#ovhcloud){.external}. Vous pouvez également créer/modifier le fichier de configuration vous-même avec la commande suivante : ```bash $ rclone config file From 3a3ffdc73c98a8eabc40de34cc1bc0f3a80d3b23 Mon Sep 17 00:00:00 2001 From: Yoann Cosse Date: Mon, 8 Sep 2025 11:00:42 +0200 Subject: [PATCH 16/17] Fixes and cleanup --- pages/index.md | 1 + .../object_storage/s3_migration/guide.en-gb.md | 2 +- .../object_storage/s3_migration/guide.fr-fr.md | 2 +- ...Storage.png => move-to-cloud-object-storage.png} | Bin .../object_storage/s3_migration/images/test.txt | 1 - .../object_storage/s3_migration/meta.yaml | 3 ++- 6 files changed, 5 insertions(+), 4 deletions(-) rename pages/storage_and_backup/object_storage/s3_migration/images/{Move to cloud - Object Storage.png => move-to-cloud-object-storage.png} (100%) delete mode 100644 pages/storage_and_backup/object_storage/s3_migration/images/test.txt diff --git a/pages/index.md b/pages/index.md index 522d97d8f3a..8fbb36f6685 100644 --- a/pages/index.md +++ b/pages/index.md @@ -715,6 +715,7 @@ + [Object Storage - Shared Responsibility RACI](storage_and_backup/object_storage/s3_object_storage_responsibility_model) + [Object Storage - FAQ](storage_and_backup/object_storage/s3_faq) + [Object Storage - Local Zones specifications](storage_and_backup/object_storage/s3_local_zones_limitations) + + [Object Storage - How to migrate from an S3-compatible object storage provider to OVHcloud Object Storage](storage_and_backup/object_storage/s3_migration) + [General guides to start](public-cloud-storage-object-storage-general-guides-to-start) + [Object Storage - Getting started with Object Storage](storage_and_backup/object_storage/s3_getting_started_with_object_storage) + [Object Storage - Identity and access management](storage_and_backup/object_storage/s3_identity_and_access_management) diff --git a/pages/storage_and_backup/object_storage/s3_migration/guide.en-gb.md b/pages/storage_and_backup/object_storage/s3_migration/guide.en-gb.md index cb570378282..c223ffeeef8 100644 --- a/pages/storage_and_backup/object_storage/s3_migration/guide.en-gb.md +++ b/pages/storage_and_backup/object_storage/s3_migration/guide.en-gb.md @@ -38,7 +38,7 @@ This guide provides detailed steps to help you migrate from a third-party S3-com ## Migration Process -![Architecture](images/Move to cloud - Object Storage.png){.thumbnail} +![Architecture](images/move-to-cloud-object-storage.png){.thumbnail} See the diagram above for an illustration of the architecture. An OVHcloud Public Cloud virtual machine acts as an entry point, on which Rclone (installed with SSH and sudo access enabled) moves data to OVHcloud Object Storage. diff --git a/pages/storage_and_backup/object_storage/s3_migration/guide.fr-fr.md b/pages/storage_and_backup/object_storage/s3_migration/guide.fr-fr.md index 9bce192a91f..a0a528ff5ed 100644 --- a/pages/storage_and_backup/object_storage/s3_migration/guide.fr-fr.md +++ b/pages/storage_and_backup/object_storage/s3_migration/guide.fr-fr.md @@ -40,7 +40,7 @@ Ce guide fournit des étapes détaillées pour vous aider à migrer d'un fournis ## Processus de migration -![Architecture](images/Move to cloud - Object Storage.png){.thumbnail} +![Architecture](images/move-to-cloud-object-storage.png){.thumbnail} Voir le diagramme ci-dessus pour une illustration de l'architecture. Une machine virtuelle OVHcloud agit en tant que point d'entrée, sur laquelle Rclone (installé avec SSH et sudo activé) déplace les données vers OVHcloud Object Storage. diff --git a/pages/storage_and_backup/object_storage/s3_migration/images/Move to cloud - Object Storage.png b/pages/storage_and_backup/object_storage/s3_migration/images/move-to-cloud-object-storage.png similarity index 100% rename from pages/storage_and_backup/object_storage/s3_migration/images/Move to cloud - Object Storage.png rename to pages/storage_and_backup/object_storage/s3_migration/images/move-to-cloud-object-storage.png diff --git a/pages/storage_and_backup/object_storage/s3_migration/images/test.txt b/pages/storage_and_backup/object_storage/s3_migration/images/test.txt deleted file mode 100644 index 8b137891791..00000000000 --- a/pages/storage_and_backup/object_storage/s3_migration/images/test.txt +++ /dev/null @@ -1 +0,0 @@ - diff --git a/pages/storage_and_backup/object_storage/s3_migration/meta.yaml b/pages/storage_and_backup/object_storage/s3_migration/meta.yaml index aab491720bf..5b6a12bfffc 100644 --- a/pages/storage_and_backup/object_storage/s3_migration/meta.yaml +++ b/pages/storage_and_backup/object_storage/s3_migration/meta.yaml @@ -1,2 +1,3 @@ -id: copy here a version4 UUID you can generate using 12e429d2-c515-42c8-b160-19484a51d449 +id: 12e429d2-c515-42c8-b160-19484a51d449 full_slug: public-cloud-storage-object-storage-migrate-from-s3-to-ovhcloud +reference_category: public-cloud-storage-object-storage-general-information \ No newline at end of file From d066ee52f4fc44ee55f36a39e86a842ac54c633b Mon Sep 17 00:00:00 2001 From: Yoann Cosse Date: Mon, 8 Sep 2025 14:10:05 +0200 Subject: [PATCH 17/17] Proofreading --- .../s3_migration/guide.en-gb.md | 93 ++++++++++++------- .../s3_migration/guide.fr-fr.md | 78 +++++++++------- 2 files changed, 101 insertions(+), 70 deletions(-) diff --git a/pages/storage_and_backup/object_storage/s3_migration/guide.en-gb.md b/pages/storage_and_backup/object_storage/s3_migration/guide.en-gb.md index c223ffeeef8..b89c663385b 100644 --- a/pages/storage_and_backup/object_storage/s3_migration/guide.en-gb.md +++ b/pages/storage_and_backup/object_storage/s3_migration/guide.en-gb.md @@ -1,12 +1,12 @@ --- -title: Object Storage - How to migrate from an S3-compatible object storage provider to OVHcloud Object Storage -excerpt: This guide provides details on how to migrate from an S3-compatible object storage provider to OVHcloud Object Storage using Rclone. +title: Object Storage - How to migrate from an S3-compatible object storage provider to OVHcloud Object Storage +excerpt: This guide provides details on how to migrate from an S3-compatible object storage provider to OVHcloud Object Storage using Rclone updated: 2025-09-08 --- - + ## Objective - -This guide provides detailed steps to help you migrate from a third-party S3-compatible object storage provider to OVHcloud Object Storage using the popular [Rclone](https://rclone.org/){.external} tool, a command-line tool that can be used to manage cloud storage resources. + +This guide provides detailed steps to help you migrate from a third-party S3-compatible object storage provider to OVHcloud Object Storage using the popular [Rclone](https://rclone.org/) tool, a command-line tool that can be used to manage cloud storage resources. > [!warning] > @@ -17,48 +17,49 @@ This guide provides detailed steps to help you migrate from a third-party S3-com ## Requirements -- An **S3-compatible source bucket** in your current object storage with: - - Your bucket name - - Your associated access and secret keys - - The associated region ID - -- An **OVHcloud Object Storage destination bucket** with: - - Your bucket name - - Your associated access and secret keys - - The associated region ID - -- An **OVHcloud virtual machine** with Rclone installed working as the management workstation in our scenario. To get the best results, within your budget, we suggest at least the following specifications: +- An **S3-compatible source bucket** in your current object storage with: + - Your bucket name + - Your associated access and secret keys + - The associated region ID +- An **OVHcloud Object Storage destination bucket** with: + - Your bucket name + - Your associated access and secret keys + - The associated region ID +- An **OVHcloud virtual machine** with Rclone installed working as the management workstation in our scenario. To get the best results, within your budget, we suggest at least the following specifications: - b3-16: 4 v-cores and 16 GB of RAM - c3-16: 8 v-cores and 16 GB of RAM > [!primary] > -> If this is your first time creating an Object Storage bucket, see [Getting Started with Object Storage](/pages/storage_and_backup/object_storage/s3_getting_started_with_object_storage). +> If this is your first time creating an Object Storage bucket, read our guide [Getting Started with Object Storage](/pages/storage_and_backup/object_storage/s3_getting_started_with_object_storage). > - + ## Migration Process ![Architecture](images/move-to-cloud-object-storage.png){.thumbnail} See the diagram above for an illustration of the architecture. An OVHcloud Public Cloud virtual machine acts as an entry point, on which Rclone (installed with SSH and sudo access enabled) moves data to OVHcloud Object Storage. - + ## Considerations ### Egress -Egress fees may apply when migrating from your current platform, depending on your provider. The term “egress” describes the volume of data transferred from the provider’s network. **We highly recommend reviewing your current provider’s egress pricing** before starting migration. + +Egress fees may apply when migrating from your current platform, depending on your provider. The term “egress” describes the volume of data transferred from the provider’s network. **We highly recommend reviewing your current provider’s egress pricing** before starting the migration. ### Migration speed optimisation + Keep in mind that several factors could affect how long migration takes. Consider not only the volume of data you plan to migrate but also the quantity and size of individual objects. Infrastructure and network limitations (bandwidth, computing power, network interfaces, etc.) could also affect performance. ### Data volume -This guide mainly **focuses on data migration for small to medium volumes (generally under 200 TB)**. For applications needing migration of hundreds or thousands of terabytes, we suggest contacting our professional services team for identifying the best approaches for migrating your data. + +This guide mainly **focuses on data migration for small to medium volumes (generally under 200 TB)**. For applications needing migration of hundreds or thousands of terabytes, we suggest contacting our [Professional Services](/links/professional-services) team for identifying the best approaches for migrating your data. ## Instructions ### Step 1 - Preparing your S3-compatible source bucket As explained before you will need your `access key`, `secret key` but also the `region ID` in which your bucket is. Connect to your source bucket provider console to get those details. - + ### Step 2 - Preparing your OVHcloud destination bucket Similar to your source bucket, you will need your `access key`, `secret key` but also the `region ID` for your destination bucket. Log in to the [OVHcloud Control Panel](/links/manager) and navigate to the `Object Storage`{.action} section to collect those details. @@ -66,23 +67,31 @@ Similar to your source bucket, you will need your `access key`, `secret key` but ### Step 3 - Installing, configuring and running Rclone #### Step 3.1 - Installing Rclone -If you haven’t already, install **Rclone** by following the instructions in the [documentation](https://rclone.org/install/){.external}, based on your OS configuration. + +If you haven’t done it already, install **Rclone** by following the instructions from its [documentation](https://rclone.org/install/), based on your OS configuration. #### Step 3.2 - Configuring Rclone + After installing **Rclone** on your virtual machine, configure its connection to both the source and destination buckets. ```bash $ rclone config ``` -This command will open the configuration menu and will guide you step by step with the configuration. The official OVHcloud provider configuration is available and will guide you step by step. Follow the steps available [here](https://rclone.org/s3/#ovhcloud){.external}. -You can also create/modify the configuration file by yourself with the following command: + +This command will open the configuration menu and will guide you step by step with the configuration. The official OVHcloud provider configuration is available and will guide you step by step. Follow the steps available [here](https://rclone.org/s3/#ovhcloud). + +You can also create/modify the configuration file yourself with the following command: + ```bash $ rclone config file ``` -If the configuration file doesn’t exist, you’ll be prompted to add the following configuration using your preferred editor. For example, on linux you can use `nano` : + +If the configuration file doesn’t exist, you’ll be prompted to add the following configuration using your preferred editor. For example, on Linux you can use `nano` : + ```bash $ nano /home//.config/rclone/rclone.conf ``` + Then, add your configuration blocks: ```bash @@ -110,46 +119,55 @@ region = > You can then test your source provider and your OVHcloud connections using the `rclone config` command by as below: + ```bash $ rclone config ``` + #### Step 3.3 - Running Rclone + Depending on your strategy you can use two different commands to start the migration. Either you use the `rclone sync` command to start the migration of one or all buckets. As detailed in the documentation, the `rclone sync`command will make source and destination identical. Be careful then when using it. + You can also use the `rclone copy` command that will copy files from your source to your destination. In both cases, remember to change `source-bucket-name` and `ovh-bucket-name` to your S3-compatible source provider and OVHcloud Object Storage bucket names, respectively: ```bash $ rclone sync :source-bucket-name/ ovhcloud:ovh-bucket-name/ --progress ``` -or + +or: + ```bash $ rclone copy :source-bucket-name/ ovhcloud:ovh-bucket-name/ --progress ``` -`--progress` shows progress during transfer + +`--progress` shows progress during transfer. In order to leverage the rclone WebUI GUI you can also use the following command: ```bash $ rclone copy :source-bucket-name/ ovhcloud:ovh-bucket-name/ --transfers 50 --rc --rc-addr :5572 --rc-web-gui --rc-user USERNAME --rc-pass PASSWORD ``` + In this command we added specific flags to optimize and monitor the copy: -- `--transfers` int represents the number of file transfers to run in parallel (default 4). Test different value based on your use case and your configuration as high values may increase CPU usage for example. +- `--transfers` represents the number of file transfers to run in parallel (default 4). Test different value based on your use case and your configuration as high values may increase CPU usage for example. - `--rc` enables the remote control server -- `--rc-addr :5572` represents the address and the port used to access rclone’s WebUI GUI. Port 5572 is the default port used rclone to securely access the WebUI. +- `--rc-addr :5572` represents the address and the port used to access rclone’s WebUI GUI. Port 5572 is the default port used by Rclone to securely access the WebUI. - `--rc-web-gui` launches WebGUI on localhost -- `--rc-user USERNAME` `--rc-pass PASSWORD` are your user and password for authentication Be sure to enter the right credentials. +- `--rc-user USERNAME` `--rc-pass PASSWORD` are your user and password for authentication. Make sure to enter the right credentials. > [!primary] > -> Many other flags are available with rclone. You can get them on the [Rclone documentation](https://rclone.org/commands/rclone/){.external}. +> Many other flags are available with rRlone. You can get them on the [Rclone documentation](https://rclone.org/commands/rclone/). > - -With the copy process set up, you can now begin monitoring the migration process using rclone’s WebUI GUI. -In your preferred web browser, use port 5572 to reach your instance’s address: `http://IP-ADDRESS:5572`{.action} +With the copy process set up, you can now begin monitoring the migration process using Rclone’s WebUI GUI. + +In your preferred web browser, use port 5572 to reach your instance’s address: `http://IP-ADDRESS:5572`. You’ll need to log in using your rclone credentials: `--rc-user` and `–rc-pass`. + Once you’re logged in, you can track the `rclone copy` command’s progress: check job status, throughput, bandwidth, object count, and total data volume. From the GUI, you can also manage new remotes and new actions. #### Migration status @@ -157,11 +175,14 @@ Once you’re logged in, you can track the `rclone copy` command’s progress: c We recommend comparing the source and destination buckets after migration. Your source and OVHcloud destination buckets can be compared via command line or their respective control panels. You can check the size of both buckets and number of objects using this command line: + ```bash rclone size :source-bucket-name/ rclone size ovhcloud:ovh-bucket-name/ ``` ## Go further - + +If you need training or technical assistance to implement our solutions, contact your sales representative or click on [this link](/links/professional-services) to get a quote and ask our Professional Services experts for assisting you on your specific use case of your project. + Join our [community of users](/links/community). diff --git a/pages/storage_and_backup/object_storage/s3_migration/guide.fr-fr.md b/pages/storage_and_backup/object_storage/s3_migration/guide.fr-fr.md index a0a528ff5ed..6be4dc73e7b 100644 --- a/pages/storage_and_backup/object_storage/s3_migration/guide.fr-fr.md +++ b/pages/storage_and_backup/object_storage/s3_migration/guide.fr-fr.md @@ -1,12 +1,12 @@ --- -title: Object Storage - Comment migrer d'un fournisseur de stockage objet compatible S3 vers OVHcloud Object Storage -excerpt: Ce guide fournit des détails sur la façon de migrer d'un fournisseur de stockage objet compatible S3 vers OVHcloud Object Storage en utilisant l(outil Rclone. +title: "Object Storage - Comment migrer d'un fournisseur de stockage objet compatible S3 vers OVHcloud Object Storage" +excerpt: "Ce guide fournit des détails sur la façon de migrer d'un fournisseur de stockage objet compatible S3 vers OVHcloud Object Storage en utilisant l'outil Rclone" updated: 2025-09-08 --- ## Objectif - -Ce guide fournit des étapes détaillées pour vous aider à migrer d'un fournisseur de stockage objet tiers compatible S3 vers OVHcloud Object Storage en utilisant [Rclone](https://rclone.org/){.external}, un outil en ligne de commande très populaire qui peut être utilisé pour gérer les ressources de stockage cloud. + +Ce guide fournit des étapes détaillées pour vous aider à migrer d'un fournisseur de stockage objet tiers compatible S3 vers OVHcloud Object Storage en utilisant [Rclone](https://rclone.org/), un outil en ligne de commande très populaire qui peut être utilisé pour gérer les ressources de stockage cloud. > [!warning] > @@ -15,78 +15,84 @@ Ce guide fournit des étapes détaillées pour vous aider à migrer d'un fournis > Ce guide est conçu pour vous aider dans les tâches courantes autant que possible. Si vous rencontrez des difficultés pour effectuer ces actions, veuillez contacter un [fournisseur de services spécialisés](/links/partner) et/ou discuter du problème avec notre [communauté d'utilisateurs](/links/community). OVHcloud ne peut pas vous fournir de support technique à cet égard. > -## Exigences +## Prérequis - Un **bucket source compatible S3** dans votre stockage objet actuel avec : - Le nom de votre bucket - - Les clés d'accès et secrètes associées + - Les `access key` et `secret key` associées - L'ID de la région associée - - Un **bucket de destination OVHcloud Object Storage** avec : - - Le nom de votre bucket - - Les clés d'accès et secrètes associées - - L'ID de la région associée - + - Le nom de votre bucket + - Les `access key` et `secret key` associées + - L'ID de la région associée - **Une machine virtuelle OVHcloud** avec Rclone installé en tant que station de contrôle dans notre scénario. Pour obtenir les meilleurs résultats, et en prenant en compte votre budget, nous suggérons au moins les spécifications suivantes : - - b3-16 : 4 v-cores et 16 Go de RAM - c3-16 : 8 v-cores et 16 Go de RAM > [!primary] > -> Si c'est la première fois que vous créez un bucket Object Storage, consultez [Premiers pas avec Object Storage](/pages/storage_and_backup/object_storage/s3_getting_started_with_object_storage). +> Si c'est la première fois que vous créez un bucket Object Storage, consultez notre guide de [premiers pas avec Object Storage](/pages/storage_and_backup/object_storage/s3_getting_started_with_object_storage). > - + ## Processus de migration ![Architecture](images/move-to-cloud-object-storage.png){.thumbnail} Voir le diagramme ci-dessus pour une illustration de l'architecture. Une machine virtuelle OVHcloud agit en tant que point d'entrée, sur laquelle Rclone (installé avec SSH et sudo activé) déplace les données vers OVHcloud Object Storage. - + ## Considérations ### Egress -Des frais d'egress peuvent s'appliquer lors de la migration de votre plateforme actuelle, selon votre fournisseur source. Le terme « egress » décrit le volume de données transférées du réseau de ce fournisseur. **Nous vous recommandons vivement de consulter les tarifs d'egress de votre fournisseur actuel** avant de commencer la migration. + +Des frais d'*egress* (sortie) peuvent s'appliquer lors de la migration de votre plateforme actuelle, selon votre fournisseur source. Le terme « egress » décrit le volume de données transférées du réseau de ce fournisseur. **Nous vous recommandons vivement de consulter les tarifs d'egress de votre fournisseur actuel** avant de commencer la migration. ### Optimisation de la vitesse de migration + Gardez à l'esprit que plusieurs facteurs peuvent impacter la durée de la migration. Considérez non seulement le volume de données que vous prévoyez de migrer, mais également la quantité et la taille des objets individuels. Les limitations d'infrastructure et de réseau (bande passante, puissance de calcul, interfaces réseau, etc.) peuvent également affecter les performances. ### Volume de données -Ce guide se concentre principalement sur la **migration de données pour des volumes petits à moyens (généralement inférieurs à 200 To)**. Pour les applications nécessitant la migration de centaines ou de milliers de téraoctets, nous suggérons de contacter notre équipe de services professionnels pour identifier les meilleures approches pour migrer vos données. -## Instructions +Ce guide se concentre principalement sur la **migration de données pour des volumes petits à moyens (généralement inférieurs à 200 To)**. Pour les applications nécessitant la migration de centaines ou de milliers de téraoctets, nous suggérons de contacter notre équipe [Professional Services](/links/professional-services) pour identifier les meilleures approches pour migrer vos données. -### Étape 1 - Préparation de votre bucket source S3-compatible +## En pratique -Comme expliqué précédemment, vous aurez besoin de votre `access key`, `secret key` mais également du `region ID` de la région dans laquelle se trouve votre bucket. Connectez-vous à la console de votre fournisseur de bucket source pour obtenir ces détails. +### Étape 1 - Préparation de votre bucket source S3-compatible +Comme expliqué précédemment, vous aurez besoin de vos `access key` et `secret key` mais également du `region ID` de la région dans laquelle se trouve votre bucket. Connectez-vous à la console de votre fournisseur de bucket source pour obtenir ces détails. ### Étape 2 - Préparation de votre bucket de destination OVHcloud -De même que pour votre bucket source, vous aurez besoin de votre clé d'accès, clé secrète mais également du `region ID` de la région dans laquelle se trouve votre bucket de destination. Connectez-vous à la [console OVHcloud](/links/manager) et accédez à la section `Object Storage`{.action} pour collecter ces détails. +De même que pour votre bucket source, vous aurez besoin de vos `access key` et `secret key` mais également du `region ID` de la région dans laquelle se trouve votre bucket de destination. Connectez-vous à l'[espace client OVHcloud](/links/manager) et accédez à la section `Object Storage`{.action} pour récupérer ces informations. ### Étape 3 - Installation, configuration et exécution de Rclone #### Étape 3.1 - Installation de Rclone -Si vous ne l'avez pas déjà fait, installez **Rclone** en suivant les instructions de la [documentation](https://rclone.org/install/){.external}, en fonction de votre configuration de système d'exploitation. + +Si vous ne l'avez pas déjà fait, installez **Rclone** en suivant les instructions de la [documentation](https://rclone.org/install/), en fonction de votre configuration de système d'exploitation. #### Étape 3.2 - Configuration de Rclone + Après avoir installé **Rclone** sur votre machine virtuelle, configurez sa connexion aux buckets source et de destination. ```bash $ rclone config ``` -Cette commande ouvrira le menu de configuration et vous guidera étape par étape pour la configuration. Le provider officiel OVHcloud est disponible et vous guidera étape par étape, pour le consulter c'est [ici](https://rclone.org/s3/#ovhcloud){.external}. Vous pouvez également créer/modifier le fichier de configuration vous-même avec la commande suivante : + +Cette commande ouvrira le menu de configuration et vous guidera étape par étape pour la configuration. Le provider officiel OVHcloud est disponible et vous guidera étape par étape. Consultez-le [ici](https://rclone.org/s3/#ovhcloud). + +Vous pouvez également créer/modifier le fichier de configuration vous-même avec la commande suivante : ```bash $ rclone config file ``` + Si le fichier de configuration n'existe pas, vous serez invité à ajouter les blocs de configuration suivants en utilisant votre éditeur préféré. Par exemple, sous Linux, vous pouvez utiliser `nano` : ```bash $ nano /home//.config/rclone/rclone.conf ``` + Ajoutez ensuite vos blocs de configuration : ```bash @@ -118,44 +124,48 @@ Vous pouvez ensuite tester vos connexions source et OVHcloud en utilisant la com ```bash $ rclone config ``` + #### Étape 3.3 - Exécution de Rclone -En fonction de votre stratégie, vous pouvez utiliser deux commandes différentes pour démarrer la migration. Vous pouvez utiliser la commande `rclone sync` pour démarrer la migration d'un ou de plusieurs buckets. Comme expliqué dans la documentation, la commande `rclone sync` rendra les buckets source et de destination identiques. +En fonction de votre stratégie, vous pouvez utiliser deux commandes différentes pour démarrer la migration. Vous pouvez utiliser la commande `rclone sync` pour démarrer la migration d'un ou de plusieurs buckets. Comme expliqué dans la documentation, la commande `rclone sync` rendra les buckets source et de destination identiques. + Vous pouvez également utiliser la commande `rclone copy` pour copier les fichiers de votre source vers votre destination. Dans les deux cas, n'oubliez pas de remplacer `source-bucket-name` et `ovh-bucket-name` par les noms de vos buckets source et de destination, respectivement : - ```bash $ rclone sync :source-bucket-name/ ovhcloud:ovh-bucket-name/ --progress ``` -ou + +ou : ```bash $ rclone copy :source-bucket-name/ ovhcloud:ovh-bucket-name/ --progress ``` -`--progress` affiche la progression pendant le transfert + +`--progress` affiche la progression pendant le transfert. Pour utiliser la WebUI de Rclone, vous pouvez également utiliser la commande suivante : ```bash $ rclone copy :source-bucket-name/ ovhcloud:ovh-bucket-name/ --transfers 50 --rc --rc-addr :5572 --rc-web-gui --rc-user USERNAME --rc-pass PASSWORD ``` + Dans cette commande, nous avons ajouté des options spécifiques pour optimiser et surveiller la copie : - `--transfers` représente le nombre de transferts de fichiers à exécuter en parallèle (par défaut 4). Testez différentes valeurs en fonction de votre cas d'utilisation et de votre configuration, car des valeurs élevées peuvent augmenter l'utilisation du processeur, par exemple. -- `--rc` active le serveur de contrôle à distance +- `--rc` active le serveur de contrôle à distance. - `--rc-addr :5572` représente l'adresse et le port utilisés pour accéder à l'interface web de Rclone. Le port 5572 est le port par défaut utilisé par Rclone pour accéder de manière sécurisée à l'interface web. -- `--rc-web-gui` lance l'interface web sur localhost -- `--rc-user USERNAME` `--rc-pass PASSWORD` sont vos identifiants et mot de passe pour l'authentification. Assurez-vous de saisir les informations d'identification correctes. +- `--rc-web-gui` lance l'interface web sur localhost. +- `--rc-user USERNAME` `--rc-pass PASSWORD` sont vos identifiants et mot de passe pour l'authentification. Assurez-vous de saisir les informations d'identification correctes. > [!primary] > -> De nombreuses autres options sont disponibles avec Rclone. Vous pouvez les consulter dans la [documentation](https://rclone.org/commands/rclone/){.external}. +> De nombreuses autres options sont disponibles avec Rclone. Vous pouvez les consulter dans la [documentation](https://rclone.org/commands/rclone/). > - + Avec le processus désormais configuré, vous pouvez maintenant commencer à surveiller le processus de migration en utilisant l'interface web de Rclone. -Dans votre navigateur web préféré, utilisez le port 5572 pour accéder à l'adresse de votre instance : `http://IP-ADDRESS:5572`{.action} +Dans votre navigateur web préféré, utilisez le port 5572 pour accéder à l'adresse de votre instance : `http://IP-ADDRESS:5572`. Vous devrez vous connecter en utilisant vos identifiants Rclone : `--rc-user` and `–rc-pass`. Une fois connecté, vous pouvez suivre la progression de la commande `rclone copy` : vérifiez le statut de la tâche, le débit, la bande passante, le nombre d'objets et le volume total de données. À partir de l'interface web, vous pouvez également gérer de nouveaux remotes et de nouvelles actions. @@ -172,7 +182,7 @@ rclone size ovhcloud:ovh-bucket-name/ ``` ## Allez plus loin - + Si vous avez besoin d'une formation ou d'une assistance technique pour la mise en oeuvre de nos solutions, contactez votre commercial ou cliquez sur [ce lien](/links/professional-services) pour obtenir un devis et demander une analyse personnalisée de votre projet à nos experts de l’équipe Professional Services. Échangez avec notre [communauté d'utilisateurs](/links/community).