Goodbye nextcloud, hello syncthing
I’ve been using a self-hosted nextcloud for years. Both my better-half and myself heavily relied on it for files, contacts and calendar synchronization.
It’s a mostly straight forward process thanks to the docker image and the awesome documentation. Still, updating is a manual process and I happened to fail once. While I was able to recover everything, it was deemed not safe-enough for work purpose. And so I became the sole user of this server.
It’s been more than a year now. And it’s time to move on to another, single-user, approach. It’s no coincidence I choose to do it now : I’ve set up my very own web radio so I don’t need to synchronize my music anymore and I have another solution for heavy files like movies. All that is left is mostly text files that I want to access via multiple machines, with or without graphical user interface.
Without further ado, folks, meet syncthing !
The problem
Okay, all this comes from a simple issue I have : I use neorg and want to have all my notes synchronized between all my machines.
The thing is, some of those machines are headless servers. So I need a simple way to achieve synchronization. And the occ (nextcloud’s CLI) is not that simple.
Also, the server I host nextcloud on cost me money monthly. It’s a worthy investment for multiple users. But, yeah, not the case anymore.
The solution
Syncthing is a decentralized, CLI friendly solution to my problem.
It works by first generating a public key per machine. Once those keys are shared between the different machines, they can communicate.
The beauty in this is : there is no central server. Data are on the machines, nowhere else. And as long as there are two machines up, data get synchronized.
Key generation
Once installed, it’s as easy as :
syncthing generate
The public keys are, well, public. They can be shared with the rest of the world.
For the home-manager or nixos users out there : This means the public keys can be added to your favorite version control system to automate synchronization on new machines.
Key sharing
Ok, I’ve $KEY_A from the $MACHINE_A and $KEY_B from $MACHINE_B.
On $MACHINE_A
syncthing cli config devices add --device-id $KEY_B
On $MACHINE_B
syncthing cli config devices add --device-id $KEY_A
List known machines
Listing devices is as simple as
syncthing cli config devices list
Resource management
By default, syncthing won’t accept synchronization request from one machine to another.
While it’s pretty easy to manage this through the GUI, it gets a bit dirty through CLI :
On $MACHINE_A
syncthing cli config devices $KEY_B auto-accept-folders set true
Now, $MACHINE_A accepts all incoming synchronization requests from $MACHINE_B.
For my personal use-case, this is what I want. Both ways.
But it’s also possible to accept a folder once and then run this command afterward :
syncthing cli config devices $KEY_B auto-accept-folders set false
Doing so will disable auto-accept from $MACHINE_B until accepted back again.
Data sharing
Ok, time to share a folder.
There is this default at ~/Sync folder that got created on syncthing startup. And it’s of course possible to list available folders to share :
syncthing cli config folders list
On $MACHINE_B
syncthing cli config folders default devices add --device-id $KEY_A
Since $MACHINE_A accepts everything from $MACHINE_B, that’s it.
Test
On $MACHINE_B
echo Syncthing > ~/Sync/test
On $MACHINE_A
cat ~/Sync/test
# Syncthing
Success 🎉
What about the other way around ?
echo Reverse >> ~/Sync/test
On $MACHINE_B
echo Syncthing > ~/Sync/test
# Syncthing
# Reverse
Awesome 🎉
Neorg
As stated at the beginning of this post, my end-goal is neorg notes synchronization. Let’s do this.
I’m on $MACHINE_A which happen to have an up-to-date copy of my notes in ~/Nextcloud/neorg. And I want to make it available on every other machines.
First, synchronize notes accross machines :
mv Nextcloud/neorg Sync/neorg
Then update neorg’s settings :
require("neorg").setup {
load = {
["core.defaults"] = {},
["core.dirman"] = {
config = {
workspaces = { neorg = "~/Sync/neorg", },
default_workspace = "neorg",
index = "index.norg",
autochdir = false,
}
},
}
}
Conclusion
That’s it : a couple of commands and no central server.
At least two machines need to be up but that’s also the case with nextcloud: the server and the computer.
It works, it’s fast, I love it. And, in case I have a GUI, it gets even easier through the web interface 👌
Resources
Syncthingdocumentation- This gist by Jonny-exe