Repository files navigation

Sclone logo

Sclone

Testsnpm version

Sclone, for "Storage Clone", is a program to sync files to and from different cloud storage providers supporting S3 and OpenStack SWIFT.

It offers fast speed thanks to parallelized workloads and file list caching. If you would like to know more about performance, refer to the benchmarks section.

Features

  • Unidirectional mode: mode to just copy new/changed/deleted files from a source to a destination.
  • Bidirectional mode: mode to make the source and target buckets identical.
  • Job scheduler: Use the Cron syntax to start the process every minute, every 30 minutes, or anytime you want.
  • Optional deletion: by default deletion is disabled: missing files are added on the source/target bucket. When enabled, files are deleted on the source/target bucket.
  • High speed: File transfers are split into parallel queues. At the end of each process, the list of files is cached for better performance on the next execution.
  • Optional integrity check: MD5 hashes checked for file integrity. Disabled by default.
  • Metadata preserved: from S3 to SWIFT or SWIFT to S3, metadata is preserved/converted automatically.
  • Production ready: Battle tested with terabytes of buckets.
  • Dry run: Output what operations will be performed without actually carrying out those operations.
  • Support any S3 and SWIFT provider: AWS S3, OVHCloud, Scaleway, Ceph.io, DigitalOcean Spaces, Cloudflare R2, Seagate Lyve Cloud, Tencent Cloud, Alibaba Cloud OSS, IBM COS S3, Dreamhost S3, GCS, IDrive e2, Synology C2, IONOS Cloud, Minio, Petabox, and more...

Benchmarks

  • Environment: VPS OVH - 2 vCores - 4GB Ram - Bandwidth 500Mbit/s - Debian 12 - Node 20.5.1 - Strasbourg (France)
  • Default options were used for sclone (1.0.0) / rclone (v1.63.1) / s3sync (2.61)
  • OVH S3 bucket type: normal (and not performance)

Unidirectional sync from a source storage to a target storage located in different regions. Every synchronization used the same 10 GB dataset of 1624 files.

10GB from S3 OVH Gra to S3 OVH Sbg10GB from S3 OVH Gra to S3 Scaleway Paris10GB from S3 OVH Gra to SWIFT OVH Gra
sclone3.30 Min4.10 Min3.27 Min
rclone5.45 Min10.51 Min6.32 Min
s3sync3.10 Min4.09 Min

Bidirectional sync between two storages located in different regions. Every synchronization used the same two 8 GB datasets (1354 files) with 1/3 common files, 1/3 new files and 1/3 edited files.

8GB S3 OVH Gra <> 8GB S3 OVH Sbg8GB S3 OVH Gra <> 8GB S3 Scaleway Paris8GB from S3 OVH Gra <> 8GB SWIFT OVH Gra
sclone3.59 Min4.11 Min3.42 Min
rclone8.4 Min13.57 Min10.40 Min

Quickstart

Option 1: Standalone binary

  1. Download the latest binary from the Release page and make it executable:
chmod +x ./sclone-1.2.0-linux
  1. Create a file config.json near the binary to define the source/target storage credentials, and options. You can copy the config.default.json file as an example. Read the configuration section for details.
  2. Finally start the synchronisation.
./sclone-1.2.0-linux

Option 2: npm (requires Node.js 20 or higher)

  1. Install the npm package globally:
npm install -g @steevepay/sclone
  1. Create a config.json file in the directory you will run sclone from (see the configuration section).
  2. Start the synchronisation:
sclone

🟢 Tip: Set the option "dryRun":true on the config.json, it will output on a log file what operations will be performed without actually carrying out those operations.

Configuration

At the root of the project, copy the config.default.json and name it config.json.

List of options

OptionsDefault valueDescription
sourceOption required
Storage credentials (S3 Example / SWIFT example)
targetOption required
Storage credentials (S3 Example / SWIFT example)
modeOption required
Synchronisation mode:
unidirectional: One way synchronization from source to destination without modifying any of the source files and deleting any of the destination files (unless delete option is enabled).
bidirectional: Two way synchronisation between a source and target storage, without deleting any files (unless delete option is enabled).
cronDefine the period of the program execution, and must follow the CRON syntax, for instance every minute: "*/1 * * * *". A new process is not started until the current synchronisation is finished. If the option is not defined, the synchronisation is executed immediately, one time.
deletefalseIf true, files are deleted according to the synchronization mode logic.
integrityCheckfalseIf true, MD5 hashes are checked for file integrity.
logSyncfalseIf true, at the end of each synchronisation, a JSON file is created including all file operations.
cacheFilename"listFiles.cache.json"File name of the cache, it is keeping the list of files synchronised during bidirectional mode only. The JSON file is created automatically in the current working directory (the directory the program is started from). An absolute path can also be provided.
transfers15Number of file operations to run in parallel: upload/deletion. If a storage responds with many errors (status 500, socket or authentication error), consider reducing the number of transfers.
retry1Max number of retries to sync a file.
dryRunfalseDo a trial run with no permanent changes, a JSON file is created including all file operations.
maxDeletionMax number of deletions allowed during a file synchronisation. If the threshold is reached, the process is terminated before deleting anything. It is a security measure to avoid propagation of unexpected bulk deletions.

Example of config.json

{
"mode" : "bidirectional",
"delete" : false,
"logSync" : false,
"cacheFilename" : "sync.cache.json",
"cron" : "*/5 * * * *",
"integrityCheck": false,
"source" : {
"name" : "swift",
"authUrl" : "https://auth.cloud.ovh.net/v3",
"username": "",
"password": "",
"region" : "",
"bucket" : ""
},
"target" : {
"name" : "s3",
"accessKeyId" : "access-key-id",
"secretAccessKey": "secret-access-key",
"url" : "s3.gra.first.cloud.test",
"region" : "gra",
"bucket" : ""
}
}

Example of OpenStack SWIFT credentials

{
"name" : "swift", /** Required by Sclone **/"authUrl" : "https://auth.cloud.ovh.net/v3", /** Insert your own auth URL **/"username": "", /** Your username **/"password": "", /** Your password **/"region" : "", /** Bucket region **/"bucket" : ""/** Bucket name that will be synchronised **/
}

Example of S3 credentials

{
"name" : "s3", /** Required by Sclone **/"url" : "s3.gra.first.cloud.test", /** S3 URL, without the bucket name, and without "https://" **/"accessKeyId" : "", /** Your access key ID **/"secretAccessKey": "", /** Your secret key **/"region" : "", /** Bucket region **/"bucket" : ""/** Bucket name that will be synchronised **/
}

Environment variables

VariableDescription
SCLONE_CONFIGPath to the configuration file (filename or absolute path). Defaults to config.json.
SCLONE_CRONCron expression, overrides the cron option of the configuration file.

Synchronisation Strategy

Unidirectional

Sclone adds, updates, and deletes (if enabled) files from a source to a destination storage, based on the files' md5 hash.

If the delete option is false, files on the destination storage are not deleted even if they do not exist on the source storage. In other words, the destination will accumulate all files.

If the delete option is true, files on the destination storage that do not exist on the source are deleted. The destination will be an exact copy of the source storage.

During unidirectional sync, no cache file is created.

Bidirectional

The file resolution is not based on the source but both storages. Sclone compares files' both md5 and modification times. If the md5 is different, only the newest file is kept. If the md5 is different but the modification times are identical, the source version wins the conflict.

For the first synchronisation, even if the deletion option is enabled, it won't delete anything. It will make sure the source and target are synchronised. If a file does not exist on one storage, it will be pushed into the other storage, and vice-versa. Finally, a cache of the list of synchronised files is created (named listFiles.cache.json by default).

For all subsequent synchronisations, Sclone will use the cache as the source of truth of the previous synchronisation to determine new, edited, or deleted files. If the cache is deleted, it will be considered a first synchronisation; it won't delete anything and will create a new cache. If a synchronisation ends with transfer errors, the cache is not updated: the failed files are retried on the next run.

Development

Requires Node.js 20 or higher.

npm install # install dependencies
npm test# run the test suite (mocha)
npm run lint # lint and auto-fix (eslint)
npm run build # build the Linux and macOS binaries (@yao-pkg/pkg, installed as a dev dependency)

Tests and lint run automatically on GitHub Actions for every push and pull request. Pushing a v* tag (matching the package.json version) builds the binaries, attaches them to a GitHub release, and publishes the package to npm.

Supporters

This package is maintained by Carbone:

Carbone.io logo

About

Clone S3/SWIFT storages between multiple cloud providers (AWS, OVH, Scaleway, Ceph.io, DigitalOcean Spaces, Cloudflare R2)

Resources

Stars

9 stars

Watchers

2 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Repository files navigation

Sclone logo

Sclone

Testsnpm version

Sclone, for "Storage Clone", is a program to sync files to and from different cloud storage providers supporting S3 and OpenStack SWIFT.

It offers fast speed thanks to parallelized workloads and file list caching. If you would like to know more about performance, refer to the benchmarks section.

Features

  • Unidirectional mode: mode to just copy new/changed/deleted files from a source to a destination.
  • Bidirectional mode: mode to make the source and target buckets identical.
  • Job scheduler: Use the Cron syntax to start the process every minute, every 30 minutes, or anytime you want.
  • Optional deletion: by default deletion is disabled: missing files are added on the source/target bucket. When enabled, files are deleted on the source/target bucket.
  • High speed: File transfers are split into parallel queues. At the end of each process, the list of files is cached for better performance on the next execution.
  • Optional integrity check: MD5 hashes checked for file integrity. Disabled by default.
  • Metadata preserved: from S3 to SWIFT or SWIFT to S3, metadata is preserved/converted automatically.
  • Production ready: Battle tested with terabytes of buckets.
  • Dry run: Output what operations will be performed without actually carrying out those operations.
  • Support any S3 and SWIFT provider: AWS S3, OVHCloud, Scaleway, Ceph.io, DigitalOcean Spaces, Cloudflare R2, Seagate Lyve Cloud, Tencent Cloud, Alibaba Cloud OSS, IBM COS S3, Dreamhost S3, GCS, IDrive e2, Synology C2, IONOS Cloud, Minio, Petabox, and more...

Benchmarks

  • Environment: VPS OVH - 2 vCores - 4GB Ram - Bandwidth 500Mbit/s - Debian 12 - Node 20.5.1 - Strasbourg (France)
  • Default options were used for sclone (1.0.0) / rclone (v1.63.1) / s3sync (2.61)
  • OVH S3 bucket type: normal (and not performance)

Unidirectional sync from a source storage to a target storage located in different regions. Every synchronization used the same 10 GB dataset of 1624 files.

10GB from S3 OVH Gra to S3 OVH Sbg10GB from S3 OVH Gra to S3 Scaleway Paris10GB from S3 OVH Gra to SWIFT OVH Gra
sclone3.30 Min4.10 Min3.27 Min
rclone5.45 Min10.51 Min6.32 Min
s3sync3.10 Min4.09 Min

Bidirectional sync between two storages located in different regions. Every synchronization used the same two 8 GB datasets (1354 files) with 1/3 common files, 1/3 new files and 1/3 edited files.

8GB S3 OVH Gra <> 8GB S3 OVH Sbg8GB S3 OVH Gra <> 8GB S3 Scaleway Paris8GB from S3 OVH Gra <> 8GB SWIFT OVH Gra
sclone3.59 Min4.11 Min3.42 Min
rclone8.4 Min13.57 Min10.40 Min

Quickstart

Option 1: Standalone binary

  1. Download the latest binary from the Release page and make it executable:
chmod +x ./sclone-1.2.0-linux
  1. Create a file config.json near the binary to define the source/target storage credentials, and options. You can copy the config.default.json file as an example. Read the configuration section for details.
  2. Finally start the synchronisation.
./sclone-1.2.0-linux

Option 2: npm (requires Node.js 20 or higher)

  1. Install the npm package globally:
npm install -g @steevepay/sclone
  1. Create a config.json file in the directory you will run sclone from (see the configuration section).
  2. Start the synchronisation:
sclone

🟢 Tip: Set the option "dryRun":true on the config.json, it will output on a log file what operations will be performed without actually carrying out those operations.

Configuration

At the root of the project, copy the config.default.json and name it config.json.

List of options

OptionsDefault valueDescription
sourceOption required
Storage credentials (S3 Example / SWIFT example)
targetOption required
Storage credentials (S3 Example / SWIFT example)
modeOption required
Synchronisation mode:
unidirectional: One way synchronization from source to destination without modifying any of the source files and deleting any of the destination files (unless delete option is enabled).
bidirectional: Two way synchronisation between a source and target storage, without deleting any files (unless delete option is enabled).
cronDefine the period of the program execution, and must follow the CRON syntax, for instance every minute: "*/1 * * * *". A new process is not started until the current synchronisation is finished. If the option is not defined, the synchronisation is executed immediately, one time.
deletefalseIf true, files are deleted according to the synchronization mode logic.
integrityCheckfalseIf true, MD5 hashes are checked for file integrity.
logSyncfalseIf true, at the end of each synchronisation, a JSON file is created including all file operations.
cacheFilename"listFiles.cache.json"File name of the cache, it is keeping the list of files synchronised during bidirectional mode only. The JSON file is created automatically in the current working directory (the directory the program is started from). An absolute path can also be provided.
transfers15Number of file operations to run in parallel: upload/deletion. If a storage responds with many errors (status 500, socket or authentication error), consider reducing the number of transfers.
retry1Max number of retries to sync a file.
dryRunfalseDo a trial run with no permanent changes, a JSON file is created including all file operations.
maxDeletionMax number of deletions allowed during a file synchronisation. If the threshold is reached, the process is terminated before deleting anything. It is a security measure to avoid propagation of unexpected bulk deletions.

Example of config.json

{
"mode" : "bidirectional",
"delete" : false,
"logSync" : false,
"cacheFilename" : "sync.cache.json",
"cron" : "*/5 * * * *",
"integrityCheck": false,
"source" : {
"name" : "swift",
"authUrl" : "https://auth.cloud.ovh.net/v3",
"username": "",
"password": "",
"region" : "",
"bucket" : ""
},
"target" : {
"name" : "s3",
"accessKeyId" : "access-key-id",
"secretAccessKey": "secret-access-key",
"url" : "s3.gra.first.cloud.test",
"region" : "gra",
"bucket" : ""
}
}

Example of OpenStack SWIFT credentials

{
"name" : "swift", /** Required by Sclone **/"authUrl" : "https://auth.cloud.ovh.net/v3", /** Insert your own auth URL **/"username": "", /** Your username **/"password": "", /** Your password **/"region" : "", /** Bucket region **/"bucket" : ""/** Bucket name that will be synchronised **/
}

Example of S3 credentials

{
"name" : "s3", /** Required by Sclone **/"url" : "s3.gra.first.cloud.test", /** S3 URL, without the bucket name, and without "https://" **/"accessKeyId" : "", /** Your access key ID **/"secretAccessKey": "", /** Your secret key **/"region" : "", /** Bucket region **/"bucket" : ""/** Bucket name that will be synchronised **/
}

Environment variables

VariableDescription
SCLONE_CONFIGPath to the configuration file (filename or absolute path). Defaults to config.json.
SCLONE_CRONCron expression, overrides the cron option of the configuration file.

Synchronisation Strategy

Unidirectional

Sclone adds, updates, and deletes (if enabled) files from a source to a destination storage, based on the files' md5 hash.

If the delete option is false, files on the destination storage are not deleted even if they do not exist on the source storage. In other words, the destination will accumulate all files.

If the delete option is true, files on the destination storage that do not exist on the source are deleted. The destination will be an exact copy of the source storage.

During unidirectional sync, no cache file is created.

Bidirectional

The file resolution is not based on the source but both storages. Sclone compares files' both md5 and modification times. If the md5 is different, only the newest file is kept. If the md5 is different but the modification times are identical, the source version wins the conflict.

For the first synchronisation, even if the deletion option is enabled, it won't delete anything. It will make sure the source and target are synchronised. If a file does not exist on one storage, it will be pushed into the other storage, and vice-versa. Finally, a cache of the list of synchronised files is created (named listFiles.cache.json by default).

For all subsequent synchronisations, Sclone will use the cache as the source of truth of the previous synchronisation to determine new, edited, or deleted files. If the cache is deleted, it will be considered a first synchronisation; it won't delete anything and will create a new cache. If a synchronisation ends with transfer errors, the cache is not updated: the failed files are retried on the next run.

Development

Requires Node.js 20 or higher.

npm install # install dependencies
npm test# run the test suite (mocha)
npm run lint # lint and auto-fix (eslint)
npm run build # build the Linux and macOS binaries (@yao-pkg/pkg, installed as a dev dependency)

Tests and lint run automatically on GitHub Actions for every push and pull request. Pushing a v* tag (matching the package.json version) builds the binaries, attaches them to a GitHub release, and publishes the package to npm.

Supporters

This package is maintained by Carbone:

Carbone.io logo

About

Clone S3/SWIFT storages between multiple cloud providers (AWS, OVH, Scaleway, Ceph.io, DigitalOcean Spaces, Cloudflare R2)

Resources

Stars

9 stars

Watchers

2 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

Sclone logo

Sclone

Testsnpm version

Sclone, for "Storage Clone", is a program to sync files to and from different cloud storage providers supporting S3 and OpenStack SWIFT.

It offers fast speed thanks to parallelized workloads and file list caching. If you would like to know more about performance, refer to the benchmarks section.

Features

  • Unidirectional mode: mode to just copy new/changed/deleted files from a source to a destination.
  • Bidirectional mode: mode to make the source and target buckets identical.
  • Job scheduler: Use the Cron syntax to start the process every minute, every 30 minutes, or anytime you want.
  • Optional deletion: by default deletion is disabled: missing files are added on the source/target bucket. When enabled, files are deleted on the source/target bucket.
  • High speed: File transfers are split into parallel queues. At the end of each process, the list of files is cached for better performance on the next execution.
  • Optional integrity check: MD5 hashes checked for file integrity. Disabled by default.
  • Metadata preserved: from S3 to SWIFT or SWIFT to S3, metadata is preserved/converted automatically.
  • Production ready: Battle tested with terabytes of buckets.
  • Dry run: Output what operations will be performed without actually carrying out those operations.
  • Support any S3 and SWIFT provider: AWS S3, OVHCloud, Scaleway, Ceph.io, DigitalOcean Spaces, Cloudflare R2, Seagate Lyve Cloud, Tencent Cloud, Alibaba Cloud OSS, IBM COS S3, Dreamhost S3, GCS, IDrive e2, Synology C2, IONOS Cloud, Minio, Petabox, and more...

Benchmarks

  • Environment: VPS OVH - 2 vCores - 4GB Ram - Bandwidth 500Mbit/s - Debian 12 - Node 20.5.1 - Strasbourg (France)
  • Default options were used for sclone (1.0.0) / rclone (v1.63.1) / s3sync (2.61)
  • OVH S3 bucket type: normal (and not performance)

Unidirectional sync from a source storage to a target storage located in different regions. Every synchronization used the same 10 GB dataset of 1624 files.

10GB from S3 OVH Gra to S3 OVH Sbg10GB from S3 OVH Gra to S3 Scaleway Paris10GB from S3 OVH Gra to SWIFT OVH Gra
sclone3.30 Min4.10 Min3.27 Min
rclone5.45 Min10.51 Min6.32 Min
s3sync3.10 Min4.09 Min

Bidirectional sync between two storages located in different regions. Every synchronization used the same two 8 GB datasets (1354 files) with 1/3 common files, 1/3 new files and 1/3 edited files.

8GB S3 OVH Gra <> 8GB S3 OVH Sbg8GB S3 OVH Gra <> 8GB S3 Scaleway Paris8GB from S3 OVH Gra <> 8GB SWIFT OVH Gra
sclone3.59 Min4.11 Min3.42 Min
rclone8.4 Min13.57 Min10.40 Min

Quickstart

Option 1: Standalone binary

  1. Download the latest binary from the Release page and make it executable:
chmod +x ./sclone-1.2.0-linux
  1. Create a file config.json near the binary to define the source/target storage credentials, and options. You can copy the config.default.json file as an example. Read the configuration section for details.
  2. Finally start the synchronisation.
./sclone-1.2.0-linux

Option 2: npm (requires Node.js 20 or higher)

  1. Install the npm package globally:
npm install -g @steevepay/sclone
  1. Create a config.json file in the directory you will run sclone from (see the configuration section).
  2. Start the synchronisation:
sclone

🟢 Tip: Set the option "dryRun":true on the config.json, it will output on a log file what operations will be performed without actually carrying out those operations.

Configuration

At the root of the project, copy the config.default.json and name it config.json.

List of options

OptionsDefault valueDescription
sourceOption required
Storage credentials (S3 Example / SWIFT example)
targetOption required
Storage credentials (S3 Example / SWIFT example)
modeOption required
Synchronisation mode:
unidirectional: One way synchronization from source to destination without modifying any of the source files and deleting any of the destination files (unless delete option is enabled).
bidirectional: Two way synchronisation between a source and target storage, without deleting any files (unless delete option is enabled).
cronDefine the period of the program execution, and must follow the CRON syntax, for instance every minute: "*/1 * * * *". A new process is not started until the current synchronisation is finished. If the option is not defined, the synchronisation is executed immediately, one time.
deletefalseIf true, files are deleted according to the synchronization mode logic.
integrityCheckfalseIf true, MD5 hashes are checked for file integrity.
logSyncfalseIf true, at the end of each synchronisation, a JSON file is created including all file operations.
cacheFilename"listFiles.cache.json"File name of the cache, it is keeping the list of files synchronised during bidirectional mode only. The JSON file is created automatically in the current working directory (the directory the program is started from). An absolute path can also be provided.
transfers15Number of file operations to run in parallel: upload/deletion. If a storage responds with many errors (status 500, socket or authentication error), consider reducing the number of transfers.
retry1Max number of retries to sync a file.
dryRunfalseDo a trial run with no permanent changes, a JSON file is created including all file operations.
maxDeletionMax number of deletions allowed during a file synchronisation. If the threshold is reached, the process is terminated before deleting anything. It is a security measure to avoid propagation of unexpected bulk deletions.

Example of config.json

{
"mode" : "bidirectional",
"delete" : false,
"logSync" : false,
"cacheFilename" : "sync.cache.json",
"cron" : "*/5 * * * *",
"integrityCheck": false,
"source" : {
"name" : "swift",
"authUrl" : "https://auth.cloud.ovh.net/v3",
"username": "",
"password": "",
"region" : "",
"bucket" : ""
},
"target" : {
"name" : "s3",
"accessKeyId" : "access-key-id",
"secretAccessKey": "secret-access-key",
"url" : "s3.gra.first.cloud.test",
"region" : "gra",
"bucket" : ""
}
}

Example of OpenStack SWIFT credentials

{
"name" : "swift", /** Required by Sclone **/"authUrl" : "https://auth.cloud.ovh.net/v3", /** Insert your own auth URL **/"username": "", /** Your username **/"password": "", /** Your password **/"region" : "", /** Bucket region **/"bucket" : ""/** Bucket name that will be synchronised **/
}

Example of S3 credentials

{
"name" : "s3", /** Required by Sclone **/"url" : "s3.gra.first.cloud.test", /** S3 URL, without the bucket name, and without "https://" **/"accessKeyId" : "", /** Your access key ID **/"secretAccessKey": "", /** Your secret key **/"region" : "", /** Bucket region **/"bucket" : ""/** Bucket name that will be synchronised **/
}

Environment variables

VariableDescription
SCLONE_CONFIGPath to the configuration file (filename or absolute path). Defaults to config.json.
SCLONE_CRONCron expression, overrides the cron option of the configuration file.

Synchronisation Strategy

Unidirectional

Sclone adds, updates, and deletes (if enabled) files from a source to a destination storage, based on the files' md5 hash.

If the delete option is false, files on the destination storage are not deleted even if they do not exist on the source storage. In other words, the destination will accumulate all files.

If the delete option is true, files on the destination storage that do not exist on the source are deleted. The destination will be an exact copy of the source storage.

During unidirectional sync, no cache file is created.

Bidirectional

The file resolution is not based on the source but both storages. Sclone compares files' both md5 and modification times. If the md5 is different, only the newest file is kept. If the md5 is different but the modification times are identical, the source version wins the conflict.

For the first synchronisation, even if the deletion option is enabled, it won't delete anything. It will make sure the source and target are synchronised. If a file does not exist on one storage, it will be pushed into the other storage, and vice-versa. Finally, a cache of the list of synchronised files is created (named listFiles.cache.json by default).

For all subsequent synchronisations, Sclone will use the cache as the source of truth of the previous synchronisation to determine new, edited, or deleted files. If the cache is deleted, it will be considered a first synchronisation; it won't delete anything and will create a new cache. If a synchronisation ends with transfer errors, the cache is not updated: the failed files are retried on the next run.

Development

Requires Node.js 20 or higher.

npm install # install dependencies
npm test# run the test suite (mocha)
npm run lint # lint and auto-fix (eslint)
npm run build # build the Linux and macOS binaries (@yao-pkg/pkg, installed as a dev dependency)

Tests and lint run automatically on GitHub Actions for every push and pull request. Pushing a v* tag (matching the package.json version) builds the binaries, attaches them to a GitHub release, and publishes the package to npm.

Supporters

This package is maintained by Carbone:

Carbone.io logo

About

Clone S3/SWIFT storages between multiple cloud providers (AWS, OVH, Scaleway, Ceph.io, DigitalOcean Spaces, Cloudflare R2)

Resources

Stars

9 stars

Watchers

2 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

Sclone logo

Sclone

Testsnpm version

Sclone, for "Storage Clone", is a program to sync files to and from different cloud storage providers supporting S3 and OpenStack SWIFT.

It offers fast speed thanks to parallelized workloads and file list caching. If you would like to know more about performance, refer to the benchmarks section.

Features

  • Unidirectional mode: mode to just copy new/changed/deleted files from a source to a destination.
  • Bidirectional mode: mode to make the source and target buckets identical.
  • Job scheduler: Use the Cron syntax to start the process every minute, every 30 minutes, or anytime you want.
  • Optional deletion: by default deletion is disabled: missing files are added on the source/target bucket. When enabled, files are deleted on the source/target bucket.
  • High speed: File transfers are split into parallel queues. At the end of each process, the list of files is cached for better performance on the next execution.
  • Optional integrity check: MD5 hashes checked for file integrity. Disabled by default.
  • Metadata preserved: from S3 to SWIFT or SWIFT to S3, metadata is preserved/converted automatically.
  • Production ready: Battle tested with terabytes of buckets.
  • Dry run: Output what operations will be performed without actually carrying out those operations.
  • Support any S3 and SWIFT provider: AWS S3, OVHCloud, Scaleway, Ceph.io, DigitalOcean Spaces, Cloudflare R2, Seagate Lyve Cloud, Tencent Cloud, Alibaba Cloud OSS, IBM COS S3, Dreamhost S3, GCS, IDrive e2, Synology C2, IONOS Cloud, Minio, Petabox, and more...

Benchmarks

  • Environment: VPS OVH - 2 vCores - 4GB Ram - Bandwidth 500Mbit/s - Debian 12 - Node 20.5.1 - Strasbourg (France)
  • Default options were used for sclone (1.0.0) / rclone (v1.63.1) / s3sync (2.61)
  • OVH S3 bucket type: normal (and not performance)

Unidirectional sync from a source storage to a target storage located in different regions. Every synchronization used the same 10 GB dataset of 1624 files.

10GB from S3 OVH Gra to S3 OVH Sbg10GB from S3 OVH Gra to S3 Scaleway Paris10GB from S3 OVH Gra to SWIFT OVH Gra
sclone3.30 Min4.10 Min3.27 Min
rclone5.45 Min10.51 Min6.32 Min
s3sync3.10 Min4.09 Min

Bidirectional sync between two storages located in different regions. Every synchronization used the same two 8 GB datasets (1354 files) with 1/3 common files, 1/3 new files and 1/3 edited files.

8GB S3 OVH Gra <> 8GB S3 OVH Sbg8GB S3 OVH Gra <> 8GB S3 Scaleway Paris8GB from S3 OVH Gra <> 8GB SWIFT OVH Gra
sclone3.59 Min4.11 Min3.42 Min
rclone8.4 Min13.57 Min10.40 Min

Quickstart

Option 1: Standalone binary

  1. Download the latest binary from the Release page and make it executable:
chmod +x ./sclone-1.2.0-linux
  1. Create a file config.json near the binary to define the source/target storage credentials, and options. You can copy the config.default.json file as an example. Read the configuration section for details.
  2. Finally start the synchronisation.
./sclone-1.2.0-linux

Option 2: npm (requires Node.js 20 or higher)

  1. Install the npm package globally:
npm install -g @steevepay/sclone
  1. Create a config.json file in the directory you will run sclone from (see the configuration section).
  2. Start the synchronisation:
sclone

🟢 Tip: Set the option "dryRun":true on the config.json, it will output on a log file what operations will be performed without actually carrying out those operations.

Configuration

At the root of the project, copy the config.default.json and name it config.json.

List of options

OptionsDefault valueDescription
sourceOption required
Storage credentials (S3 Example / SWIFT example)
targetOption required
Storage credentials (S3 Example / SWIFT example)
modeOption required
Synchronisation mode:
unidirectional: One way synchronization from source to destination without modifying any of the source files and deleting any of the destination files (unless delete option is enabled).
bidirectional: Two way synchronisation between a source and target storage, without deleting any files (unless delete option is enabled).
cronDefine the period of the program execution, and must follow the CRON syntax, for instance every minute: "*/1 * * * *". A new process is not started until the current synchronisation is finished. If the option is not defined, the synchronisation is executed immediately, one time.
deletefalseIf true, files are deleted according to the synchronization mode logic.
integrityCheckfalseIf true, MD5 hashes are checked for file integrity.
logSyncfalseIf true, at the end of each synchronisation, a JSON file is created including all file operations.
cacheFilename"listFiles.cache.json"File name of the cache, it is keeping the list of files synchronised during bidirectional mode only. The JSON file is created automatically in the current working directory (the directory the program is started from). An absolute path can also be provided.
transfers15Number of file operations to run in parallel: upload/deletion. If a storage responds with many errors (status 500, socket or authentication error), consider reducing the number of transfers.
retry1Max number of retries to sync a file.
dryRunfalseDo a trial run with no permanent changes, a JSON file is created including all file operations.
maxDeletionMax number of deletions allowed during a file synchronisation. If the threshold is reached, the process is terminated before deleting anything. It is a security measure to avoid propagation of unexpected bulk deletions.

Example of config.json

{
"mode" : "bidirectional",
"delete" : false,
"logSync" : false,
"cacheFilename" : "sync.cache.json",
"cron" : "*/5 * * * *",
"integrityCheck": false,
"source" : {
"name" : "swift",
"authUrl" : "https://auth.cloud.ovh.net/v3",
"username": "",
"password": "",
"region" : "",
"bucket" : ""
},
"target" : {
"name" : "s3",
"accessKeyId" : "access-key-id",
"secretAccessKey": "secret-access-key",
"url" : "s3.gra.first.cloud.test",
"region" : "gra",
"bucket" : ""
}
}

Example of OpenStack SWIFT credentials

{
"name" : "swift", /** Required by Sclone **/"authUrl" : "https://auth.cloud.ovh.net/v3", /** Insert your own auth URL **/"username": "", /** Your username **/"password": "", /** Your password **/"region" : "", /** Bucket region **/"bucket" : ""/** Bucket name that will be synchronised **/
}

Example of S3 credentials

{
"name" : "s3", /** Required by Sclone **/"url" : "s3.gra.first.cloud.test", /** S3 URL, without the bucket name, and without "https://" **/"accessKeyId" : "", /** Your access key ID **/"secretAccessKey": "", /** Your secret key **/"region" : "", /** Bucket region **/"bucket" : ""/** Bucket name that will be synchronised **/
}

Environment variables

VariableDescription
SCLONE_CONFIGPath to the configuration file (filename or absolute path). Defaults to config.json.
SCLONE_CRONCron expression, overrides the cron option of the configuration file.

Synchronisation Strategy

Unidirectional

Sclone adds, updates, and deletes (if enabled) files from a source to a destination storage, based on the files' md5 hash.

If the delete option is false, files on the destination storage are not deleted even if they do not exist on the source storage. In other words, the destination will accumulate all files.

If the delete option is true, files on the destination storage that do not exist on the source are deleted. The destination will be an exact copy of the source storage.

During unidirectional sync, no cache file is created.

Bidirectional

The file resolution is not based on the source but both storages. Sclone compares files' both md5 and modification times. If the md5 is different, only the newest file is kept. If the md5 is different but the modification times are identical, the source version wins the conflict.

For the first synchronisation, even if the deletion option is enabled, it won't delete anything. It will make sure the source and target are synchronised. If a file does not exist on one storage, it will be pushed into the other storage, and vice-versa. Finally, a cache of the list of synchronised files is created (named listFiles.cache.json by default).

For all subsequent synchronisations, Sclone will use the cache as the source of truth of the previous synchronisation to determine new, edited, or deleted files. If the cache is deleted, it will be considered a first synchronisation; it won't delete anything and will create a new cache. If a synchronisation ends with transfer errors, the cache is not updated: the failed files are retried on the next run.

Development

Requires Node.js 20 or higher.

npm install # install dependencies
npm test# run the test suite (mocha)
npm run lint # lint and auto-fix (eslint)
npm run build # build the Linux and macOS binaries (@yao-pkg/pkg, installed as a dev dependency)

Tests and lint run automatically on GitHub Actions for every push and pull request. Pushing a v* tag (matching the package.json version) builds the binaries, attaches them to a GitHub release, and publishes the package to npm.

Supporters

This package is maintained by Carbone:

Carbone.io logo

About

Clone S3/SWIFT storages between multiple cloud providers (AWS, OVH, Scaleway, Ceph.io, DigitalOcean Spaces, Cloudflare R2)

Resources

Stars

9 stars

Watchers

2 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Repository files navigation

Sclone logo

Sclone

Testsnpm version

Sclone, for "Storage Clone", is a program to sync files to and from different cloud storage providers supporting S3 and OpenStack SWIFT.

It offers fast speed thanks to parallelized workloads and file list caching. If you would like to know more about performance, refer to the benchmarks section.

Features

  • Unidirectional mode: mode to just copy new/changed/deleted files from a source to a destination.
  • Bidirectional mode: mode to make the source and target buckets identical.
  • Job scheduler: Use the Cron syntax to start the process every minute, every 30 minutes, or anytime you want.
  • Optional deletion: by default deletion is disabled: missing files are added on the source/target bucket. When enabled, files are deleted on the source/target bucket.
  • High speed: File transfers are split into parallel queues. At the end of each process, the list of files is cached for better performance on the next execution.
  • Optional integrity check: MD5 hashes checked for file integrity. Disabled by default.
  • Metadata preserved: from S3 to SWIFT or SWIFT to S3, metadata is preserved/converted automatically.
  • Production ready: Battle tested with terabytes of buckets.
  • Dry run: Output what operations will be performed without actually carrying out those operations.
  • Support any S3 and SWIFT provider: AWS S3, OVHCloud, Scaleway, Ceph.io, DigitalOcean Spaces, Cloudflare R2, Seagate Lyve Cloud, Tencent Cloud, Alibaba Cloud OSS, IBM COS S3, Dreamhost S3, GCS, IDrive e2, Synology C2, IONOS Cloud, Minio, Petabox, and more...

Benchmarks

  • Environment: VPS OVH - 2 vCores - 4GB Ram - Bandwidth 500Mbit/s - Debian 12 - Node 20.5.1 - Strasbourg (France)
  • Default options were used for sclone (1.0.0) / rclone (v1.63.1) / s3sync (2.61)
  • OVH S3 bucket type: normal (and not performance)

Unidirectional sync from a source storage to a target storage located in different regions. Every synchronization used the same 10 GB dataset of 1624 files.

10GB from S3 OVH Gra to S3 OVH Sbg10GB from S3 OVH Gra to S3 Scaleway Paris10GB from S3 OVH Gra to SWIFT OVH Gra
sclone3.30 Min4.10 Min3.27 Min
rclone5.45 Min10.51 Min6.32 Min
s3sync3.10 Min4.09 Min

Bidirectional sync between two storages located in different regions. Every synchronization used the same two 8 GB datasets (1354 files) with 1/3 common files, 1/3 new files and 1/3 edited files.

8GB S3 OVH Gra <> 8GB S3 OVH Sbg8GB S3 OVH Gra <> 8GB S3 Scaleway Paris8GB from S3 OVH Gra <> 8GB SWIFT OVH Gra
sclone3.59 Min4.11 Min3.42 Min
rclone8.4 Min13.57 Min10.40 Min

Quickstart

Option 1: Standalone binary

  1. Download the latest binary from the Release page and make it executable:
chmod +x ./sclone-1.2.0-linux
  1. Create a file config.json near the binary to define the source/target storage credentials, and options. You can copy the config.default.json file as an example. Read the configuration section for details.
  2. Finally start the synchronisation.
./sclone-1.2.0-linux

Option 2: npm (requires Node.js 20 or higher)

  1. Install the npm package globally:
npm install -g @steevepay/sclone
  1. Create a config.json file in the directory you will run sclone from (see the configuration section).
  2. Start the synchronisation:
sclone

🟢 Tip: Set the option "dryRun":true on the config.json, it will output on a log file what operations will be performed without actually carrying out those operations.

Configuration

At the root of the project, copy the config.default.json and name it config.json.

List of options

OptionsDefault valueDescription
sourceOption required
Storage credentials (S3 Example / SWIFT example)
targetOption required
Storage credentials (S3 Example / SWIFT example)
modeOption required
Synchronisation mode:
unidirectional: One way synchronization from source to destination without modifying any of the source files and deleting any of the destination files (unless delete option is enabled).
bidirectional: Two way synchronisation between a source and target storage, without deleting any files (unless delete option is enabled).
cronDefine the period of the program execution, and must follow the CRON syntax, for instance every minute: "*/1 * * * *". A new process is not started until the current synchronisation is finished. If the option is not defined, the synchronisation is executed immediately, one time.
deletefalseIf true, files are deleted according to the synchronization mode logic.
integrityCheckfalseIf true, MD5 hashes are checked for file integrity.
logSyncfalseIf true, at the end of each synchronisation, a JSON file is created including all file operations.
cacheFilename"listFiles.cache.json"File name of the cache, it is keeping the list of files synchronised during bidirectional mode only. The JSON file is created automatically in the current working directory (the directory the program is started from). An absolute path can also be provided.
transfers15Number of file operations to run in parallel: upload/deletion. If a storage responds with many errors (status 500, socket or authentication error), consider reducing the number of transfers.
retry1Max number of retries to sync a file.
dryRunfalseDo a trial run with no permanent changes, a JSON file is created including all file operations.
maxDeletionMax number of deletions allowed during a file synchronisation. If the threshold is reached, the process is terminated before deleting anything. It is a security measure to avoid propagation of unexpected bulk deletions.

Example of config.json

{
"mode" : "bidirectional",
"delete" : false,
"logSync" : false,
"cacheFilename" : "sync.cache.json",
"cron" : "*/5 * * * *",
"integrityCheck": false,
"source" : {
"name" : "swift",
"authUrl" : "https://auth.cloud.ovh.net/v3",
"username": "",
"password": "",
"region" : "",
"bucket" : ""
},
"target" : {
"name" : "s3",
"accessKeyId" : "access-key-id",
"secretAccessKey": "secret-access-key",
"url" : "s3.gra.first.cloud.test",
"region" : "gra",
"bucket" : ""
}
}

Example of OpenStack SWIFT credentials

{
"name" : "swift", /** Required by Sclone **/"authUrl" : "https://auth.cloud.ovh.net/v3", /** Insert your own auth URL **/"username": "", /** Your username **/"password": "", /** Your password **/"region" : "", /** Bucket region **/"bucket" : ""/** Bucket name that will be synchronised **/
}

Example of S3 credentials

{
"name" : "s3", /** Required by Sclone **/"url" : "s3.gra.first.cloud.test", /** S3 URL, without the bucket name, and without "https://" **/"accessKeyId" : "", /** Your access key ID **/"secretAccessKey": "", /** Your secret key **/"region" : "", /** Bucket region **/"bucket" : ""/** Bucket name that will be synchronised **/
}

Environment variables

VariableDescription
SCLONE_CONFIGPath to the configuration file (filename or absolute path). Defaults to config.json.
SCLONE_CRONCron expression, overrides the cron option of the configuration file.

Synchronisation Strategy

Unidirectional

Sclone adds, updates, and deletes (if enabled) files from a source to a destination storage, based on the files' md5 hash.

If the delete option is false, files on the destination storage are not deleted even if they do not exist on the source storage. In other words, the destination will accumulate all files.

If the delete option is true, files on the destination storage that do not exist on the source are deleted. The destination will be an exact copy of the source storage.

During unidirectional sync, no cache file is created.

Bidirectional

The file resolution is not based on the source but both storages. Sclone compares files' both md5 and modification times. If the md5 is different, only the newest file is kept. If the md5 is different but the modification times are identical, the source version wins the conflict.

For the first synchronisation, even if the deletion option is enabled, it won't delete anything. It will make sure the source and target are synchronised. If a file does not exist on one storage, it will be pushed into the other storage, and vice-versa. Finally, a cache of the list of synchronised files is created (named listFiles.cache.json by default).

For all subsequent synchronisations, Sclone will use the cache as the source of truth of the previous synchronisation to determine new, edited, or deleted files. If the cache is deleted, it will be considered a first synchronisation; it won't delete anything and will create a new cache. If a synchronisation ends with transfer errors, the cache is not updated: the failed files are retried on the next run.

Development

Requires Node.js 20 or higher.

npm install # install dependencies
npm test# run the test suite (mocha)
npm run lint # lint and auto-fix (eslint)
npm run build # build the Linux and macOS binaries (@yao-pkg/pkg, installed as a dev dependency)

Tests and lint run automatically on GitHub Actions for every push and pull request. Pushing a v* tag (matching the package.json version) builds the binaries, attaches them to a GitHub release, and publishes the package to npm.

Supporters

This package is maintained by Carbone:

Carbone.io logo

About

Clone S3/SWIFT storages between multiple cloud providers (AWS, OVH, Scaleway, Ceph.io, DigitalOcean Spaces, Cloudflare R2)

Resources

Stars

9 stars

Watchers

2 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

Sclone logo

Sclone

Testsnpm version

Sclone, for "Storage Clone", is a program to sync files to and from different cloud storage providers supporting S3 and OpenStack SWIFT.

It offers fast speed thanks to parallelized workloads and file list caching. If you would like to know more about performance, refer to the benchmarks section.

Features

  • Unidirectional mode: mode to just copy new/changed/deleted files from a source to a destination.
  • Bidirectional mode: mode to make the source and target buckets identical.
  • Job scheduler: Use the Cron syntax to start the process every minute, every 30 minutes, or anytime you want.
  • Optional deletion: by default deletion is disabled: missing files are added on the source/target bucket. When enabled, files are deleted on the source/target bucket.
  • High speed: File transfers are split into parallel queues. At the end of each process, the list of files is cached for better performance on the next execution.
  • Optional integrity check: MD5 hashes checked for file integrity. Disabled by default.
  • Metadata preserved: from S3 to SWIFT or SWIFT to S3, metadata is preserved/converted automatically.
  • Production ready: Battle tested with terabytes of buckets.
  • Dry run: Output what operations will be performed without actually carrying out those operations.
  • Support any S3 and SWIFT provider: AWS S3, OVHCloud, Scaleway, Ceph.io, DigitalOcean Spaces, Cloudflare R2, Seagate Lyve Cloud, Tencent Cloud, Alibaba Cloud OSS, IBM COS S3, Dreamhost S3, GCS, IDrive e2, Synology C2, IONOS Cloud, Minio, Petabox, and more...

Benchmarks

  • Environment: VPS OVH - 2 vCores - 4GB Ram - Bandwidth 500Mbit/s - Debian 12 - Node 20.5.1 - Strasbourg (France)
  • Default options were used for sclone (1.0.0) / rclone (v1.63.1) / s3sync (2.61)
  • OVH S3 bucket type: normal (and not performance)

Unidirectional sync from a source storage to a target storage located in different regions. Every synchronization used the same 10 GB dataset of 1624 files.

10GB from S3 OVH Gra to S3 OVH Sbg10GB from S3 OVH Gra to S3 Scaleway Paris10GB from S3 OVH Gra to SWIFT OVH Gra
sclone3.30 Min4.10 Min3.27 Min
rclone5.45 Min10.51 Min6.32 Min
s3sync3.10 Min4.09 Min

Bidirectional sync between two storages located in different regions. Every synchronization used the same two 8 GB datasets (1354 files) with 1/3 common files, 1/3 new files and 1/3 edited files.

8GB S3 OVH Gra <> 8GB S3 OVH Sbg8GB S3 OVH Gra <> 8GB S3 Scaleway Paris8GB from S3 OVH Gra <> 8GB SWIFT OVH Gra
sclone3.59 Min4.11 Min3.42 Min
rclone8.4 Min13.57 Min10.40 Min

Quickstart

Option 1: Standalone binary

  1. Download the latest binary from the Release page and make it executable:
chmod +x ./sclone-1.2.0-linux
  1. Create a file config.json near the binary to define the source/target storage credentials, and options. You can copy the config.default.json file as an example. Read the configuration section for details.
  2. Finally start the synchronisation.
./sclone-1.2.0-linux

Option 2: npm (requires Node.js 20 or higher)

  1. Install the npm package globally:
npm install -g @steevepay/sclone
  1. Create a config.json file in the directory you will run sclone from (see the configuration section).
  2. Start the synchronisation:
sclone

🟢 Tip: Set the option "dryRun":true on the config.json, it will output on a log file what operations will be performed without actually carrying out those operations.

Configuration

At the root of the project, copy the config.default.json and name it config.json.

List of options

OptionsDefault valueDescription
sourceOption required
Storage credentials (S3 Example / SWIFT example)
targetOption required
Storage credentials (S3 Example / SWIFT example)
modeOption required
Synchronisation mode:
unidirectional: One way synchronization from source to destination without modifying any of the source files and deleting any of the destination files (unless delete option is enabled).
bidirectional: Two way synchronisation between a source and target storage, without deleting any files (unless delete option is enabled).
cronDefine the period of the program execution, and must follow the CRON syntax, for instance every minute: "*/1 * * * *". A new process is not started until the current synchronisation is finished. If the option is not defined, the synchronisation is executed immediately, one time.
deletefalseIf true, files are deleted according to the synchronization mode logic.
integrityCheckfalseIf true, MD5 hashes are checked for file integrity.
logSyncfalseIf true, at the end of each synchronisation, a JSON file is created including all file operations.
cacheFilename"listFiles.cache.json"File name of the cache, it is keeping the list of files synchronised during bidirectional mode only. The JSON file is created automatically in the current working directory (the directory the program is started from). An absolute path can also be provided.
transfers15Number of file operations to run in parallel: upload/deletion. If a storage responds with many errors (status 500, socket or authentication error), consider reducing the number of transfers.
retry1Max number of retries to sync a file.
dryRunfalseDo a trial run with no permanent changes, a JSON file is created including all file operations.
maxDeletionMax number of deletions allowed during a file synchronisation. If the threshold is reached, the process is terminated before deleting anything. It is a security measure to avoid propagation of unexpected bulk deletions.

Example of config.json

{
"mode" : "bidirectional",
"delete" : false,
"logSync" : false,
"cacheFilename" : "sync.cache.json",
"cron" : "*/5 * * * *",
"integrityCheck": false,
"source" : {
"name" : "swift",
"authUrl" : "https://auth.cloud.ovh.net/v3",
"username": "",
"password": "",
"region" : "",
"bucket" : ""
},
"target" : {
"name" : "s3",
"accessKeyId" : "access-key-id",
"secretAccessKey": "secret-access-key",
"url" : "s3.gra.first.cloud.test",
"region" : "gra",
"bucket" : ""
}
}

Example of OpenStack SWIFT credentials

{
"name" : "swift", /** Required by Sclone **/"authUrl" : "https://auth.cloud.ovh.net/v3", /** Insert your own auth URL **/"username": "", /** Your username **/"password": "", /** Your password **/"region" : "", /** Bucket region **/"bucket" : ""/** Bucket name that will be synchronised **/
}

Example of S3 credentials

{
"name" : "s3", /** Required by Sclone **/"url" : "s3.gra.first.cloud.test", /** S3 URL, without the bucket name, and without "https://" **/"accessKeyId" : "", /** Your access key ID **/"secretAccessKey": "", /** Your secret key **/"region" : "", /** Bucket region **/"bucket" : ""/** Bucket name that will be synchronised **/
}

Environment variables

VariableDescription
SCLONE_CONFIGPath to the configuration file (filename or absolute path). Defaults to config.json.
SCLONE_CRONCron expression, overrides the cron option of the configuration file.

Synchronisation Strategy

Unidirectional

Sclone adds, updates, and deletes (if enabled) files from a source to a destination storage, based on the files' md5 hash.

If the delete option is false, files on the destination storage are not deleted even if they do not exist on the source storage. In other words, the destination will accumulate all files.

If the delete option is true, files on the destination storage that do not exist on the source are deleted. The destination will be an exact copy of the source storage.

During unidirectional sync, no cache file is created.

Bidirectional

The file resolution is not based on the source but both storages. Sclone compares files' both md5 and modification times. If the md5 is different, only the newest file is kept. If the md5 is different but the modification times are identical, the source version wins the conflict.

For the first synchronisation, even if the deletion option is enabled, it won't delete anything. It will make sure the source and target are synchronised. If a file does not exist on one storage, it will be pushed into the other storage, and vice-versa. Finally, a cache of the list of synchronised files is created (named listFiles.cache.json by default).

For all subsequent synchronisations, Sclone will use the cache as the source of truth of the previous synchronisation to determine new, edited, or deleted files. If the cache is deleted, it will be considered a first synchronisation; it won't delete anything and will create a new cache. If a synchronisation ends with transfer errors, the cache is not updated: the failed files are retried on the next run.

Development

Requires Node.js 20 or higher.

npm install # install dependencies
npm test# run the test suite (mocha)
npm run lint # lint and auto-fix (eslint)
npm run build # build the Linux and macOS binaries (@yao-pkg/pkg, installed as a dev dependency)

Tests and lint run automatically on GitHub Actions for every push and pull request. Pushing a v* tag (matching the package.json version) builds the binaries, attaches them to a GitHub release, and publishes the package to npm.

Supporters

This package is maintained by Carbone:

Carbone.io logo

About

Clone S3/SWIFT storages between multiple cloud providers (AWS, OVH, Scaleway, Ceph.io, DigitalOcean Spaces, Cloudflare R2)

Resources

Stars

9 stars

Watchers

2 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

Sclone logo

Sclone

Testsnpm version

Sclone, for "Storage Clone", is a program to sync files to and from different cloud storage providers supporting S3 and OpenStack SWIFT.

It offers fast speed thanks to parallelized workloads and file list caching. If you would like to know more about performance, refer to the benchmarks section.

Features

  • Unidirectional mode: mode to just copy new/changed/deleted files from a source to a destination.
  • Bidirectional mode: mode to make the source and target buckets identical.
  • Job scheduler: Use the Cron syntax to start the process every minute, every 30 minutes, or anytime you want.
  • Optional deletion: by default deletion is disabled: missing files are added on the source/target bucket. When enabled, files are deleted on the source/target bucket.
  • High speed: File transfers are split into parallel queues. At the end of each process, the list of files is cached for better performance on the next execution.
  • Optional integrity check: MD5 hashes checked for file integrity. Disabled by default.
  • Metadata preserved: from S3 to SWIFT or SWIFT to S3, metadata is preserved/converted automatically.
  • Production ready: Battle tested with terabytes of buckets.
  • Dry run: Output what operations will be performed without actually carrying out those operations.
  • Support any S3 and SWIFT provider: AWS S3, OVHCloud, Scaleway, Ceph.io, DigitalOcean Spaces, Cloudflare R2, Seagate Lyve Cloud, Tencent Cloud, Alibaba Cloud OSS, IBM COS S3, Dreamhost S3, GCS, IDrive e2, Synology C2, IONOS Cloud, Minio, Petabox, and more...

Benchmarks

  • Environment: VPS OVH - 2 vCores - 4GB Ram - Bandwidth 500Mbit/s - Debian 12 - Node 20.5.1 - Strasbourg (France)
  • Default options were used for sclone (1.0.0) / rclone (v1.63.1) / s3sync (2.61)
  • OVH S3 bucket type: normal (and not performance)

Unidirectional sync from a source storage to a target storage located in different regions. Every synchronization used the same 10 GB dataset of 1624 files.

10GB from S3 OVH Gra to S3 OVH Sbg10GB from S3 OVH Gra to S3 Scaleway Paris10GB from S3 OVH Gra to SWIFT OVH Gra
sclone3.30 Min4.10 Min3.27 Min
rclone5.45 Min10.51 Min6.32 Min
s3sync3.10 Min4.09 Min

Bidirectional sync between two storages located in different regions. Every synchronization used the same two 8 GB datasets (1354 files) with 1/3 common files, 1/3 new files and 1/3 edited files.

8GB S3 OVH Gra <> 8GB S3 OVH Sbg8GB S3 OVH Gra <> 8GB S3 Scaleway Paris8GB from S3 OVH Gra <> 8GB SWIFT OVH Gra
sclone3.59 Min4.11 Min3.42 Min
rclone8.4 Min13.57 Min10.40 Min

Quickstart

Option 1: Standalone binary

  1. Download the latest binary from the Release page and make it executable:
chmod +x ./sclone-1.2.0-linux
  1. Create a file config.json near the binary to define the source/target storage credentials, and options. You can copy the config.default.json file as an example. Read the configuration section for details.
  2. Finally start the synchronisation.
./sclone-1.2.0-linux

Option 2: npm (requires Node.js 20 or higher)

  1. Install the npm package globally:
npm install -g @steevepay/sclone
  1. Create a config.json file in the directory you will run sclone from (see the configuration section).
  2. Start the synchronisation:
sclone

🟢 Tip: Set the option "dryRun":true on the config.json, it will output on a log file what operations will be performed without actually carrying out those operations.

Configuration

At the root of the project, copy the config.default.json and name it config.json.

List of options

OptionsDefault valueDescription
sourceOption required
Storage credentials (S3 Example / SWIFT example)
targetOption required
Storage credentials (S3 Example / SWIFT example)
modeOption required
Synchronisation mode:
unidirectional: One way synchronization from source to destination without modifying any of the source files and deleting any of the destination files (unless delete option is enabled).
bidirectional: Two way synchronisation between a source and target storage, without deleting any files (unless delete option is enabled).
cronDefine the period of the program execution, and must follow the CRON syntax, for instance every minute: "*/1 * * * *". A new process is not started until the current synchronisation is finished. If the option is not defined, the synchronisation is executed immediately, one time.
deletefalseIf true, files are deleted according to the synchronization mode logic.
integrityCheckfalseIf true, MD5 hashes are checked for file integrity.
logSyncfalseIf true, at the end of each synchronisation, a JSON file is created including all file operations.
cacheFilename"listFiles.cache.json"File name of the cache, it is keeping the list of files synchronised during bidirectional mode only. The JSON file is created automatically in the current working directory (the directory the program is started from). An absolute path can also be provided.
transfers15Number of file operations to run in parallel: upload/deletion. If a storage responds with many errors (status 500, socket or authentication error), consider reducing the number of transfers.
retry1Max number of retries to sync a file.
dryRunfalseDo a trial run with no permanent changes, a JSON file is created including all file operations.
maxDeletionMax number of deletions allowed during a file synchronisation. If the threshold is reached, the process is terminated before deleting anything. It is a security measure to avoid propagation of unexpected bulk deletions.

Example of config.json

{
"mode" : "bidirectional",
"delete" : false,
"logSync" : false,
"cacheFilename" : "sync.cache.json",
"cron" : "*/5 * * * *",
"integrityCheck": false,
"source" : {
"name" : "swift",
"authUrl" : "https://auth.cloud.ovh.net/v3",
"username": "",
"password": "",
"region" : "",
"bucket" : ""
},
"target" : {
"name" : "s3",
"accessKeyId" : "access-key-id",
"secretAccessKey": "secret-access-key",
"url" : "s3.gra.first.cloud.test",
"region" : "gra",
"bucket" : ""
}
}

Example of OpenStack SWIFT credentials

{
"name" : "swift", /** Required by Sclone **/"authUrl" : "https://auth.cloud.ovh.net/v3", /** Insert your own auth URL **/"username": "", /** Your username **/"password": "", /** Your password **/"region" : "", /** Bucket region **/"bucket" : ""/** Bucket name that will be synchronised **/
}

Example of S3 credentials

{
"name" : "s3", /** Required by Sclone **/"url" : "s3.gra.first.cloud.test", /** S3 URL, without the bucket name, and without "https://" **/"accessKeyId" : "", /** Your access key ID **/"secretAccessKey": "", /** Your secret key **/"region" : "", /** Bucket region **/"bucket" : ""/** Bucket name that will be synchronised **/
}

Environment variables

VariableDescription
SCLONE_CONFIGPath to the configuration file (filename or absolute path). Defaults to config.json.
SCLONE_CRONCron expression, overrides the cron option of the configuration file.

Synchronisation Strategy

Unidirectional

Sclone adds, updates, and deletes (if enabled) files from a source to a destination storage, based on the files' md5 hash.

If the delete option is false, files on the destination storage are not deleted even if they do not exist on the source storage. In other words, the destination will accumulate all files.

If the delete option is true, files on the destination storage that do not exist on the source are deleted. The destination will be an exact copy of the source storage.

During unidirectional sync, no cache file is created.

Bidirectional

The file resolution is not based on the source but both storages. Sclone compares files' both md5 and modification times. If the md5 is different, only the newest file is kept. If the md5 is different but the modification times are identical, the source version wins the conflict.

For the first synchronisation, even if the deletion option is enabled, it won't delete anything. It will make sure the source and target are synchronised. If a file does not exist on one storage, it will be pushed into the other storage, and vice-versa. Finally, a cache of the list of synchronised files is created (named listFiles.cache.json by default).

For all subsequent synchronisations, Sclone will use the cache as the source of truth of the previous synchronisation to determine new, edited, or deleted files. If the cache is deleted, it will be considered a first synchronisation; it won't delete anything and will create a new cache. If a synchronisation ends with transfer errors, the cache is not updated: the failed files are retried on the next run.

Development

Requires Node.js 20 or higher.

npm install # install dependencies
npm test# run the test suite (mocha)
npm run lint # lint and auto-fix (eslint)
npm run build # build the Linux and macOS binaries (@yao-pkg/pkg, installed as a dev dependency)

Tests and lint run automatically on GitHub Actions for every push and pull request. Pushing a v* tag (matching the package.json version) builds the binaries, attaches them to a GitHub release, and publishes the package to npm.

Supporters

This package is maintained by Carbone:

Carbone.io logo

About

Clone S3/SWIFT storages between multiple cloud providers (AWS, OVH, Scaleway, Ceph.io, DigitalOcean Spaces, Cloudflare R2)

Resources

Stars

9 stars

Watchers

2 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Repository files navigation

Sclone logo

Sclone

Testsnpm version

Sclone, for "Storage Clone", is a program to sync files to and from different cloud storage providers supporting S3 and OpenStack SWIFT.

It offers fast speed thanks to parallelized workloads and file list caching. If you would like to know more about performance, refer to the benchmarks section.

Features

  • Unidirectional mode: mode to just copy new/changed/deleted files from a source to a destination.
  • Bidirectional mode: mode to make the source and target buckets identical.
  • Job scheduler: Use the Cron syntax to start the process every minute, every 30 minutes, or anytime you want.
  • Optional deletion: by default deletion is disabled: missing files are added on the source/target bucket. When enabled, files are deleted on the source/target bucket.
  • High speed: File transfers are split into parallel queues. At the end of each process, the list of files is cached for better performance on the next execution.
  • Optional integrity check: MD5 hashes checked for file integrity. Disabled by default.
  • Metadata preserved: from S3 to SWIFT or SWIFT to S3, metadata is preserved/converted automatically.
  • Production ready: Battle tested with terabytes of buckets.
  • Dry run: Output what operations will be performed without actually carrying out those operations.
  • Support any S3 and SWIFT provider: AWS S3, OVHCloud, Scaleway, Ceph.io, DigitalOcean Spaces, Cloudflare R2, Seagate Lyve Cloud, Tencent Cloud, Alibaba Cloud OSS, IBM COS S3, Dreamhost S3, GCS, IDrive e2, Synology C2, IONOS Cloud, Minio, Petabox, and more...

Benchmarks

  • Environment: VPS OVH - 2 vCores - 4GB Ram - Bandwidth 500Mbit/s - Debian 12 - Node 20.5.1 - Strasbourg (France)
  • Default options were used for sclone (1.0.0) / rclone (v1.63.1) / s3sync (2.61)
  • OVH S3 bucket type: normal (and not performance)

Unidirectional sync from a source storage to a target storage located in different regions. Every synchronization used the same 10 GB dataset of 1624 files.

10GB from S3 OVH Gra to S3 OVH Sbg10GB from S3 OVH Gra to S3 Scaleway Paris10GB from S3 OVH Gra to SWIFT OVH Gra
sclone3.30 Min4.10 Min3.27 Min
rclone5.45 Min10.51 Min6.32 Min
s3sync3.10 Min4.09 Min

Bidirectional sync between two storages located in different regions. Every synchronization used the same two 8 GB datasets (1354 files) with 1/3 common files, 1/3 new files and 1/3 edited files.

8GB S3 OVH Gra <> 8GB S3 OVH Sbg8GB S3 OVH Gra <> 8GB S3 Scaleway Paris8GB from S3 OVH Gra <> 8GB SWIFT OVH Gra
sclone3.59 Min4.11 Min3.42 Min
rclone8.4 Min13.57 Min10.40 Min

Quickstart

Option 1: Standalone binary

  1. Download the latest binary from the Release page and make it executable:
chmod +x ./sclone-1.2.0-linux
  1. Create a file config.json near the binary to define the source/target storage credentials, and options. You can copy the config.default.json file as an example. Read the configuration section for details.
  2. Finally start the synchronisation.
./sclone-1.2.0-linux

Option 2: npm (requires Node.js 20 or higher)

  1. Install the npm package globally:
npm install -g @steevepay/sclone
  1. Create a config.json file in the directory you will run sclone from (see the configuration section).
  2. Start the synchronisation:
sclone

🟢 Tip: Set the option "dryRun":true on the config.json, it will output on a log file what operations will be performed without actually carrying out those operations.

Configuration

At the root of the project, copy the config.default.json and name it config.json.

List of options

OptionsDefault valueDescription
sourceOption required
Storage credentials (S3 Example / SWIFT example)
targetOption required
Storage credentials (S3 Example / SWIFT example)
modeOption required
Synchronisation mode:
unidirectional: One way synchronization from source to destination without modifying any of the source files and deleting any of the destination files (unless delete option is enabled).
bidirectional: Two way synchronisation between a source and target storage, without deleting any files (unless delete option is enabled).
cronDefine the period of the program execution, and must follow the CRON syntax, for instance every minute: "*/1 * * * *". A new process is not started until the current synchronisation is finished. If the option is not defined, the synchronisation is executed immediately, one time.
deletefalseIf true, files are deleted according to the synchronization mode logic.
integrityCheckfalseIf true, MD5 hashes are checked for file integrity.
logSyncfalseIf true, at the end of each synchronisation, a JSON file is created including all file operations.
cacheFilename"listFiles.cache.json"File name of the cache, it is keeping the list of files synchronised during bidirectional mode only. The JSON file is created automatically in the current working directory (the directory the program is started from). An absolute path can also be provided.
transfers15Number of file operations to run in parallel: upload/deletion. If a storage responds with many errors (status 500, socket or authentication error), consider reducing the number of transfers.
retry1Max number of retries to sync a file.
dryRunfalseDo a trial run with no permanent changes, a JSON file is created including all file operations.
maxDeletionMax number of deletions allowed during a file synchronisation. If the threshold is reached, the process is terminated before deleting anything. It is a security measure to avoid propagation of unexpected bulk deletions.

Example of config.json

{
"mode" : "bidirectional",
"delete" : false,
"logSync" : false,
"cacheFilename" : "sync.cache.json",
"cron" : "*/5 * * * *",
"integrityCheck": false,
"source" : {
"name" : "swift",
"authUrl" : "https://auth.cloud.ovh.net/v3",
"username": "",
"password": "",
"region" : "",
"bucket" : ""
},
"target" : {
"name" : "s3",
"accessKeyId" : "access-key-id",
"secretAccessKey": "secret-access-key",
"url" : "s3.gra.first.cloud.test",
"region" : "gra",
"bucket" : ""
}
}

Example of OpenStack SWIFT credentials

{
"name" : "swift", /** Required by Sclone **/"authUrl" : "https://auth.cloud.ovh.net/v3", /** Insert your own auth URL **/"username": "", /** Your username **/"password": "", /** Your password **/"region" : "", /** Bucket region **/"bucket" : ""/** Bucket name that will be synchronised **/
}

Example of S3 credentials

{
"name" : "s3", /** Required by Sclone **/"url" : "s3.gra.first.cloud.test", /** S3 URL, without the bucket name, and without "https://" **/"accessKeyId" : "", /** Your access key ID **/"secretAccessKey": "", /** Your secret key **/"region" : "", /** Bucket region **/"bucket" : ""/** Bucket name that will be synchronised **/
}

Environment variables

VariableDescription
SCLONE_CONFIGPath to the configuration file (filename or absolute path). Defaults to config.json.
SCLONE_CRONCron expression, overrides the cron option of the configuration file.

Synchronisation Strategy

Unidirectional

Sclone adds, updates, and deletes (if enabled) files from a source to a destination storage, based on the files' md5 hash.

If the delete option is false, files on the destination storage are not deleted even if they do not exist on the source storage. In other words, the destination will accumulate all files.

If the delete option is true, files on the destination storage that do not exist on the source are deleted. The destination will be an exact copy of the source storage.

During unidirectional sync, no cache file is created.

Bidirectional

The file resolution is not based on the source but both storages. Sclone compares files' both md5 and modification times. If the md5 is different, only the newest file is kept. If the md5 is different but the modification times are identical, the source version wins the conflict.

For the first synchronisation, even if the deletion option is enabled, it won't delete anything. It will make sure the source and target are synchronised. If a file does not exist on one storage, it will be pushed into the other storage, and vice-versa. Finally, a cache of the list of synchronised files is created (named listFiles.cache.json by default).

For all subsequent synchronisations, Sclone will use the cache as the source of truth of the previous synchronisation to determine new, edited, or deleted files. If the cache is deleted, it will be considered a first synchronisation; it won't delete anything and will create a new cache. If a synchronisation ends with transfer errors, the cache is not updated: the failed files are retried on the next run.

Development

Requires Node.js 20 or higher.

npm install # install dependencies
npm test# run the test suite (mocha)
npm run lint # lint and auto-fix (eslint)
npm run build # build the Linux and macOS binaries (@yao-pkg/pkg, installed as a dev dependency)

Tests and lint run automatically on GitHub Actions for every push and pull request. Pushing a v* tag (matching the package.json version) builds the binaries, attaches them to a GitHub release, and publishes the package to npm.

Supporters

This package is maintained by Carbone:

Carbone.io logo

About

Clone S3/SWIFT storages between multiple cloud providers (AWS, OVH, Scaleway, Ceph.io, DigitalOcean Spaces, Cloudflare R2)

Resources

Stars

9 stars

Watchers

2 watching

Forks

Releases

Packages

Used by

Contributors

Languages