Move files into object storage.
Bring files from Amazon S3, Google Cloud Storage, any S3-compatible storage or a folder on your server into a bucket: copy everything at once, or move gradually without downtime.
Already keep files somewhere else? Move them into a bucket of your application in one of two ways. Both start from the panel: the application → Storage → the bucket → Move files in.
| Copy everything now | Move gradually, without downtime | |
|---|---|---|
| What happens | every file is copied in one go | a file is copied the first time your application reads it |
| When to switch your application | after the copy is done | right away |
| Progress | files found, copied, skipped, not copied; pause, resume, stop | on until you turn it off |
| Old storage | Amazon S3, Google Cloud Storage, S3-compatible | Amazon S3, Google Cloud Storage |
The copy runs on our side — your computer does not need to stay on. When it is done (or if it stops before the end) you get an e-mail and a Telegram message.
Moving files is available to the account owner and the application's Administrators (see Team access), and also from the API, CLI and MCP.
Before you start: a key that can only read
Make a separate key for this move in your old storage that can only list and read the one bucket. Never paste your main keys. The key is used for this move only; we do not keep it, and it is never shown again. Delete it at the old provider once the move is finished.
Amazon S3
In IAM, create a user (or a role with an access key) with this policy — replace my-old-bucket with your bucket:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": ["s3:List*", "s3:Get*"],
"Resource": ["arn:aws:s3:::my-old-bucket", "arn:aws:s3:::my-old-bucket/*"]
}
]
}Then create an access key for it. In the panel you need the access key ID, the secret access key, the bucket name and its region (for example eu-central-1; it is shown next to the bucket in the S3 console).
Google Cloud Storage
Create a service account with read access to the bucket and download its JSON key:
gcloud iam service-accounts create rivervo-move --display-name="Move files to Rivervo"
gcloud storage buckets add-iam-policy-binding gs://my-old-bucket \
--member="serviceAccount:rivervo-move@MY-PROJECT.iam.gserviceaccount.com" --role="roles/storage.objectViewer"
gcloud storage buckets add-iam-policy-binding gs://my-old-bucket \
--member="serviceAccount:rivervo-move@MY-PROJECT.iam.gserviceaccount.com" --role="roles/storage.legacyBucketReader"
gcloud iam service-accounts keys create key.json \
--iam-account="rivervo-move@MY-PROJECT.iam.gserviceaccount.com"Storage Object Viewer reads the files; Storage Legacy Bucket Reader lets the copy read the bucket itself. In the panel, paste the whole content of key.json. Delete the key file from your computer afterwards.
Other S3-compatible storage
Any storage with an S3 API works the same way: create a key that can only list and read the bucket (most providers call it a «read-only» or «restricted» key), and find the S3 address of the bucket's region — for example https://s3.eu-central-003.backblazeb2.com. Enter the address without the bucket name.
Copy everything now
- The application → Storage → the bucket → Move files in.
- Choose Copy everything now, the old storage, the bucket there, the region or S3 address, and paste the key.
- Optional: a folder — copy just
photos/, for example. - Files that are already here: by default a file with the same name already in the bucket is kept and the one from the old storage is skipped. Turn on Replace them to overwrite.
- Start the copy and confirm.
The card shows how many files were found, copied, skipped and not copied, with a progress bar; Show log names the files that were skipped or could not be copied. You can Pause, Resume or Stop the copy — files already copied stay. Once the copy is done, switch your application to the bucket (it already has the S3_* variables).
Files keep their names (keys). Running the copy again later copies only what is missing (with Replace them off).
Move gradually, without downtime
Useful when the application must keep working and files are added all the time:
- Move files in → Move gradually, without downtime, the old storage, the bucket and the key → Turn on gradual moving.
- Switch your application to this bucket right away (its
S3_*variables) and deploy. - When the application reads a file that is not in the bucket yet, it is copied from the old storage at that moment and served. New uploads go straight into the bucket.
- To finish: run Copy everything now for the files nobody has read yet (with Replace them off, so the newer files stay), wait until it is done, then Turn off gradual moving.
Until you turn it off, the old storage must stay available with the same key. Files that were never read and were not copied are not fetched any more after it is off.
From a folder on your server
To move files from a VPS or any other server (for example storage/app/public of a Laravel site), use rclone with the bucket's own keys. Find them on the application's Variables tab: S3_ENDPOINT, S3_BUCKET, S3_KEY and S3_SECRET (a second bucket has its name in front: MEDIA_S3_KEY …).
# Install rclone (Linux)
curl https://rclone.org/install.sh | sudo bash
# The bucket's keys as environment variables — they do not end up in a config file
export RCLONE_CONFIG_RIVERVO_TYPE=s3
export RCLONE_CONFIG_RIVERVO_PROVIDER=Other
export RCLONE_CONFIG_RIVERVO_REGION=auto
export RCLONE_CONFIG_RIVERVO_ENDPOINT='value of S3_ENDPOINT'
export RCLONE_CONFIG_RIVERVO_ACCESS_KEY_ID='value of S3_KEY'
export RCLONE_CONFIG_RIVERVO_SECRET_ACCESS_KEY='value of S3_SECRET'
# Copy the folder into the bucket (value of S3_BUCKET), keeping the folder structure
rclone copy /var/www/shop/storage/app/public rivervo:BUCKET/public --progress --transfers 16
# Check that every file arrived
rclone check /var/www/shop/storage/app/public rivervo:BUCKET/public --one-wayrclone copy never deletes anything in the bucket and skips files that are already there unchanged, so you can run it again after a break. Run it inside tmux or screen on the server for a long copy — then it keeps going if your SSH connection drops.
What it costs
There is no fee for the move itself. Files in the bucket cost the usual object storage prices, paid from your balance:
- storage: $0.025 per GB a month — 50 GB costs about $1.25 a month;
- writes: $6 per million — each copied file is about one write, so 100 000 files cost about $0.60 (a very large file is uploaded in parts and counts a few writes);
- reads made while moving gradually are ordinary reads ($0.50 per million).
Most cloud storage providers charge for data leaving them (egress). Check your old provider's price list before moving a lot of data.
Moving files needs a positive balance, the same as adding a bucket. It is not available during the free trial and not into a bucket that is read-only (over its size limit, or beyond what the balance pays for) — the panel says why and offers a top-up where that helps. While a copy runs and the bucket becomes read-only, the copy pauses and goes on by itself once writing is possible again.
Limits
- One copy and one gradual move at a time per bucket.
- Files larger than 1 TB are skipped by the copy.
- Files in archive classes that have to be restored before reading (S3 Glacier Flexible Retrieval, Glacier Deep Archive) are skipped; restore them first.
- Only your own metadata (
x-amz-meta-*) moves with a file; the ETag of a file may differ from the old one. - A file deleted from the bucket while gradual moving is on is copied again the next time it is read.