Before you start: migrate from DigitalOcean to KiviDB
You need valkey-cli (or redis-cli 6.2 or later, built with TLS) and, optionally, doctl, DigitalOcean's CLI.
Install the tools
You need valkey-cli (or redis-cli 6.2 or later, built with TLS) and,
optionally, doctl, DigitalOcean's CLI.
Get the cluster's connection details
In the control panel, open the cluster and find Connection Details, or
with doctl:
doctl databases list
doctl databases connection <cluster-id> --show
--show prints the password; without it, it is masked. Connections use TLS
on port 25061:
valkey-cli --tls -h my-cache-do-user-1234567-0.db.ondigitalocean.com -p 25061 -a "$DO_PASSWORD" PING
Set a variable for the rest of this guide, with the URI from the connection details:
export DO_URI='rediss://default:...@my-cache-do-user-1234567-0.db.ondigitalocean.com:25061'
Let the copy machine in
The copy runs from a machine you control, best a Droplet in the cluster's region. If the cluster has trusted sources, add that machine:
doctl databases firewalls append <cluster-id> --rule droplet:<droplet-id>
# or an address
doctl databases firewalls append <cluster-id> --rule ip_addr:203.0.113.5
A Droplet in the same VPC can use the cluster's private hostname, which keeps the copy off the public network. KiviDB Cloud must also allow the machine: Configuration → Network → Allowed IPs.
Check what the cluster uses
valkey-cli -u "$DO_URI" INFO server | grep -E 'valkey_version|redis_version'
valkey-cli -u "$DO_URI" INFO keyspace
valkey-cli -u "$DO_URI" INFO memory | grep -E 'used_memory_human|maxmemory_human|maxmemory_policy'
valkey-cli -u "$DO_URI" INFO commandstats | grep -E 'eval|evalsha|fcall|function'
CONFIG GET is disabled. The cluster's settings are in the control panel under
Settings → Advanced Configurations, or with
doctl databases configuration get <cluster-id> --engine valkey.
| Check | Why it matters |
|---|---|
valkey_version 9 or later | Changes how you move the data (below). New clusters run Valkey 9 by default |
INFO keyspace lists db1, db2... | RedisShake copies every database; RIOT copies one per run |
cmdstat_eval, cmdstat_evalsha, cmdstat_fcall | Job queues (BullMQ, Sidekiq) and lock libraries use Lua. KiviDB needs the lua or full build; on Cloud, turn on Lua scripting when you create the database. Default and free-tier Cloud databases have no Lua |
maxmemory_policy | Set the same policy on KiviDB. Both default to noeviction |
| Search, JSON or other modules in your code | Search, JSON, time series and vectors are built into KiviDB; there is no MODULE LOAD |
Size it
Size KiviDB from used_memory_human, the data actually held, not from the
plan's RAM: DigitalOcean gives Valkey 70% of a node's memory, and keeps more
for replication and the system (a 1 GiB plan holds 0.5 GiB of data, a 4 GiB
plan 2.5 GiB). Leave headroom on KiviDB for growth; about 30% more than
used_memory is a reasonable start.
Pick the build
| Your cluster uses | Self-hosted build | KiviDB Cloud |
|---|---|---|
| No Lua | tls (to keep TLS, as on DigitalOcean) | TLS on |
Lua (EVAL, FUNCTION) | full | Lua scripting and TLS |