Digital Ocean
Digital Ocean is a cloud hosting platform.
Electric and Digital Ocean
You can use Digital Ocean to deploy any or all components of the Electric stack:
If you already run a Managed Postgres in Digital Ocean, then it's a great idea to also deploy Electric within the same network.
Need context?
See the Deployment guide for more details.
Deploy Postgres
Digital Ocean provides Managed Postgres. This has logical replication enabled and works with Electric out of the box.
Use doadmin
for older Postgres versions
If you're using Postgres version 15 or lower, you will need to connect to your Managed Postgres as the doadmin
user. This is the default user and the only user with the REPLICATION
role.
(With later Postgres versions its fine to create other users and use the doadmin
user to grant them the REPLICATION
role).
Deploy Electric
Digital Ocean has a number of different ways to deploy web services. We recommend using a Docker Droplet.
Below we walk through the steps to deploy Electric using a Docker Droplet. First you create the Droplet. Then setup some Docker / SSH networking so your local Docker can talk to it. Then use Docker Compose to run Electric inside the Droplet.
Don't use App Platform
We don't recommend that you use App Platform to deploy the Electric sync service because App Platform does not provide persistent file storage for Shape logs.
Create Droplet
Go to the Docker marketplace page and click on the "Create Docker Droplet" button. Follow the prompts. You must use key-based SSH authentication (so that you can set up your local Docker to talk to the remote daemon). It's a good idea to change the hostname to something like electric-sync
as well.
Create the Droplet and wait until its ready with an IPv4 address. Copy the address and use it in place of YOUR_IP_ADDRESS
in the instructions that follow.
Connect Docker
Connect to your new Droplet using ssh
in order to verify the authenticity of the host and add its public key to your local known_hosts
file.
$ ssh root@YOUR_IP_ADDRESS
...
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added 'YOUR_IP_ADDRESS' (ED25519) to the list of known hosts.
Permission denied?
If the output from the command above ends with:
... Permission denied (publickey).
Then you need to add a section to your ~/.ssg/config
to tell it to use your SSH key when connecting to YOUR_IP_ADDRESS
. Something like this will do:
Host YOUR_IP_ADDRESS
Port 22
Hostname YOUR_IP_ADDRESS
AddKeysToAgent yes
IdentitiesOnly yes
IdentityFile ~/.ssh/path_to_your_private_ssh_key
TCPKeepAlive yes
UseKeychain yes
Now set the DOCKER_HOST
environment variable to point to your Droplet's IP address:
export DOCKER_HOST=ssh://root@YOUR_IP_ADDRESS
Deploy
Save the following contents into a file called compose.yaml
, changing the DATABASE_URL
and setting any other environment variables to match your setup.
services:
electric:
image: electricsql/electric:latest
environment:
DATABASE_URL: "postgresql://..."
ports:
- 80:3000
restart: always
Now launch on the remote server, with output that should look something like this:
$ docker compose up
[+] Running 8/8
✔ electric 7 layers [⣿⣿⣿⣿⣿⣿⣿] 0B/0B Pulled 8.2s
✔ efc2b5ad9eec Pull complete 3.4s
✔ 2cb0d575dcef Pull complete 4.5s
✔ c1b251d76665 Pull complete 4.6s
✔ c82981779fd9 Pull complete 4.7s
✔ 65b429e477c5 Pull complete 4.8s
✔ 1fd7ee9efb04 Pull complete 6.0s
✔ 87053f06541e Pull complete 6.1s
[+] Running 2/2
✔ Network electric-sync-droplet_default Created 0.2s
✔ Container electric-sync-droplet-electric-1 Created 0.2s
Attaching to electric-sync-droplet-electric-1
electric-sync-droplet-electric-1 | =INFO REPORT==== 23-Oct-2024::13:16:01.777082 ===
electric-sync-droplet-electric-1 | Loading 140 CA(s) from otp store
electric-sync-droplet-electric-1 | 13:16:01.832 [info] Running Electric.Plug.Router with Bandit 1.5.5 at 0.0.0.0:3000 (http)
electric-sync-droplet-electric-1 | 13:16:01.935 [info] Acquiring lock from postgres with name electric_slot_default
electric-sync-droplet-electric-1 | 13:16:01.937 [info] Lock acquired from postgres with name electric_slot_default
electric-sync-droplet-electric-1 | 13:16:02.006 [info] Postgres server version = 160004, system identifier = 7428958789530034185, timeline_id = 1
electric-sync-droplet-electric-1 | 13:16:02.145 [info] No previous timeline detected.
electric-sync-droplet-electric-1 | 13:16:02.146 [info] Connected to Postgres and timeline
electric-sync-droplet-electric-1 | 13:16:02.147 [info] Starting shape replication pipeline
electric-sync-droplet-electric-1 | 13:16:02.150 [info] Starting replication from postgres
You can hit the health check endpoint to verify that everything is running OK:
$ curl http://YOUR_IP_ADDRESS/v1/health
{"status":"active"}
Deploy your app
You can deploy your client app to Digital Ocean using App Platform.