{"id":18021438,"url":"https://github.com/suda/dvsync","last_synced_at":"2025-10-28T15:13:12.771Z","repository":{"id":47356233,"uuid":"140030954","full_name":"suda/dvsync","owner":"suda","description":"🐳️ Easy and secure way to copy data between Docker volumes, even across data centers","archived":false,"fork":false,"pushed_at":"2024-07-03T17:35:02.000Z","size":1221,"stargazers_count":71,"open_issues_count":0,"forks_count":5,"subscribers_count":4,"default_branch":"main","last_synced_at":"2025-10-08T22:06:02.661Z","etag":null,"topics":["containers","docker","kubernetes","tunnel"],"latest_commit_sha":null,"homepage":"","language":"Shell","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/suda.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","funding":null,"license":null,"code_of_conduct":"CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2018-07-06T21:25:08.000Z","updated_at":"2025-04-11T11:43:54.000Z","dependencies_parsed_at":"2023-02-17T10:15:33.473Z","dependency_job_id":null,"html_url":"https://github.com/suda/dvsync","commit_stats":null,"previous_names":[],"tags_count":5,"template":false,"template_full_name":null,"purl":"pkg:github/suda/dvsync","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/suda%2Fdvsync","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/suda%2Fdvsync/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/suda%2Fdvsync/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/suda%2Fdvsync/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/suda","download_url":"https://codeload.github.com/suda/dvsync/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/suda%2Fdvsync/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":281459336,"owners_count":26505129,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-10-28T02:00:06.022Z","response_time":60,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["containers","docker","kubernetes","tunnel"],"created_at":"2024-10-30T06:09:58.042Z","updated_at":"2025-10-28T15:13:12.740Z","avatar_url":"https://github.com/suda.png","language":"Shell","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003ch1 align=\"center\"\u003e\n\t\u003cbr\u003e\n\t\u003cimg height=\"100\" alt=\"dvsync\" src=\"media/logo.png\"\u003e\n\t\u003cbr\u003e\n\t\u003cbr\u003e\n\t\u003cbr\u003e\n\u003c/h1\u003e\n\n\u003e Easy and secure way to copy data between Docker volumes, even across VPCs or data centers.\n\n`dvsync` is a set of two containers running [OpenSSH](https://www.openssh.com/), [ngrok](https://ngrok.com/) and [rsync](https://rsync.samba.org/) that automatically create a secure, encrypted channel between each other and enable easy way to migrate data stored in Docker volumes.\n\n\u003chr /\u003e\n\n![](media/dvsync.gif)\n\n# Running\n\n⚠️ **To establish a secure channel, `dvsync` uses [ngrok](https://ngrok.com/) and you need to pass your `NGROK_AUTHTOKEN` which can be found in [ngrok dashboard](https://dashboard.ngrok.com/auth).**\n\n`dvsync` will synchronize contents of its `/data` directory, therefore whatever data you want to sync, should be mounted under it.\n\nHere are example ways to run it using [Docker CLI](#docker-cli), [Docker Compose / Swarm](#docker-compose--swarm) or [Kubernetes](#kubernetes). Note that you can mix those, making data migration much easier.\n\n## Docker CLI\n\n1. Start a server where you want to copy data **from**:\n```sh\ndocker run --rm -e NGROK_AUTHTOKEN=\"$NGROK_AUTHTOKEN\" \\\n  --mount source=MY_SOURCE_VOLUME,target=/data,readonly \\\n  ghcr.io/suda/dvsync-server\n```\n\n2. Once the server started, look into the logs and copy the `DVSYNC_TOKEN`\n3. Start the client where you want tot copy the data **to**:\n```sh\ndocker run --rm -e DVSYNC_TOKEN=\"$DVSYNC_TOKEN\" \\\n  --mount source=MY_TARGET_VOLUME,target=/data \\\n  ghcr.io/suda/dvsync-client\n```\n\n#### Using local source/target\nAlternatively, if you want to copy this data to your local machine, you can mount a host directory as well:\n\n```sh\ndocker run --rm -e DVSYNC_TOKEN=\"$DVSYNC_TOKEN\" \\\n  -v $PWD:/data \\\n  ghcr.io/suda/dvsync-client\n```\nThis can also be done other way around, when you start the server locally if you need to copy local data into the data center.\n\n## Docker Compose / Swarm\n\n1. Start a server where you want to copy data **from**:\n```yaml\nversion: '3.6'\nservices:\n  dvsync-server:\n    image: 'ghcr.io/suda/dvsync-server'\n    environment:\n      NGROK_AUTHTOKEN: ${NGROK_AUTHTOKEN}\n    volumes:\n      - type: volume\n        source: MY_SOURCE_VOLUME\n        target: /data\n        read_only: true\nvolumes:\n  MY_SOURCE_VOLUME:\n```\n\n2. Once the server started, look into the logs and copy the `DVSYNC_TOKEN`\n3. Start the client where you want tot copy the data **to**:\n```yaml\nversion: '3.6'\nservices:\n  dvsync-server:\n    image: 'ghcr.io/suda/dvsync-client'\n    environment:\n      DVSYNC_TOKEN: ${DVSYNC_TOKEN}\n    volumes:\n      - type: volume\n        source: MY_TARGET_VOLUME\n        target: /data\nvolumes:\n  MY_SOURCE_VOLUME:\n```\n\n## Kubernetes\n\n1. Start a server where you want to copy data **from**:\n```yaml\napiVersion: v1\nkind: Pod\nmetadata:\n  name: dvsync-server\nspec:\n  containers:\n  - image: ghcr.io/suda/dvsync-server\n    name: dvsync-server\n    env:\n    - name: NGROK_AUTHTOKEN\n      value: \"REPLACE WITH YOUR NGROK_AUTHTOKEN\"\n    volumeMounts:\n    - mountPath: /data\n      name: MY_SOURCE_VOLUME\n  volumes:\n  - name: MY_SOURCE_VOLUME\n```\n2. Once the server started, look into the logs and copy the `DVSYNC_TOKEN`\n3. Start the client where you want tot copy the data **to**:\n```yaml\napiVersion: v1\nkind: Pod\nmetadata:\n  name: dvsync-client\nspec:\n  containers:\n  - image: ghcr.io/suda/dvsync-client\n    name: dvsync-client\n    env:\n    - name: DVSYNC_TOKEN\n      value: \"REPLACE WITH YOUR DVSYNC_TOKEN\"\n    volumeMounts:\n    - mountPath: /data\n      name: MY_TARGET_VOLUME\n  volumes:\n  - name: MY_TARGET_VOLUME\n```\n\n# Contributing\n\n[All contributions (no matter if small) are always welcome](http://contributionswelcome.org/).\n\nTo see how you can help and where to start [see Contributing file](CONTRIBUTING.md).\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsuda%2Fdvsync","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fsuda%2Fdvsync","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsuda%2Fdvsync/lists"}