How To: Set Up Nextcloud + Syncthing IntegrationLast Update: January 12, 2023
- Step 1: Syncthing Config Folder
- Step 2: Syncthing Data Folder
- Step 3: Choose Syncthing Source
- Step 4: Create Syncthing Systemd Service
- Step 5: Edit Syncthing Config
- Step 6: Verify GUI Access
- Step 7: Setup Peers and Shared Folders
- Step 8: Add Syncthing Folder to Nextcloud
- Step 9: Enjoy Nextcloud and Syncthing Integration
I previously wrote a post describing the benefits of Nextcloud. and of using Nextcloud with Syncthing. Since then, I realized it would be helpful to write an easy to follow, step-by-step guide, describing the process.
The main problem that many on Linux run into is that these two programs typically run as different users. Because of this, you’ll often run into permission issues, and read/write errors when trying to sync Nextcloud data. Below, I explain the process of getting both Nextcloud and Syncthing to play together without these issues.
For this walkthrough, I used Debian 10, however the instructions should work for other Debian based distributions, such as Ubuntu, Raspbian, and RaspberryPi OS. Instructions may vary for other Linux distributions, so make sure you understand each command before entering it.
- A working Nextcloud installation
- This can be an involved process that differs between operating systems and even between Linux distributions. I’ve written instructions on How to Install Nextcloud on Debian 10, but otherwise see the Nextcloud official install instructions.
- For this article, my server is named
- Know which user the web server runs as
- In this article, we’re using an Apache web server on Debian 10,
which runs as the
- In this article, we’re using an Apache web server on Debian 10, which runs as the
- Another device to sync with
- This device can be another server, personal computer, smartphone, or other such device. It only needs a working Syncthing port.
- For this article, the client computer is a laptop named
Step 1: Syncthing Config Folder
cloud, create a folder to hold Syncthing configuration files,
and change ownership to the same as the web server.
sudo mkdir /opt/syncthing-config sudo chown www-data:www-data /opt/syncthing-config
Step 2: Syncthing Data Folder
Choose a location for Syncthing data files. These are the files you’ll actually be syncing, so keep in mind the storage space you might need. You may prefer to keep it on a separate partition, or separate disk.
You could set up multiple folders in different locations, but I find it easier to have one Syncthing folder, and then all synced folders to be subdirectories of it.
Regardless of the location you choose, make the sure the web server is the owner.
sudo mkdir /srv/syncthing sudo chown www-data:www-data /srv/sycnthing
Step 3: Choose Syncthing Source
Check the version on your distro’s package manager. On Debian, the stable package is usually very old, so you’ll need to decide whether to get it from the Debian repos, or from the Syncthing website. From Syncthing, you ensure it’s the most up to date, however from the package manager requires no extra configuration.
From Syncthing Repo
Add the release PGP keys:
sudo curl -s -o /usr/share/keyrings/syncthing-archive-keyring.gpg https://syncthing.net/release-key.gpg
Add the “stable” channel to your APT sources:
echo "deb [signed-by=/usr/share/keyrings/syncthing-archive-keyring.gpg] https://apt.syncthing.net/ syncthing stable" | sudo tee /etc/apt/sources.list.d/syncthing.list
Increase preference of Syncthing’s packages (“pinning”) over system packages.
printf "Package: *\nPin: origin apt.syncthing.net\nPin-Priority: 990\n" | sudo tee /etc/apt/preferences.d/syncthing
Now that the sources have been added to the package manager, continue with From Debian Repo
From Debian Repo
sudo apt update sudo apt install syncthing
Step 4: Create Syncthing Systemd Service
This will allow us to start Syncthing automatically, as well as make sure it runs with the correct permissions.
Because this file will get overwritten if there is an update to Syncthing, we create a copy of the included service file. After creation, open the new file for editing.
cd /lib/systemd/system sudo cp syncthing@.service firstname.lastname@example.org sudoedit email@example.com
Change the description, home directory, and user.
[Unit] Description=Syncthing - Nextcloud Compatible for %I [Service] User=www-data ExecStart=/usr/bin/syncthing serve --no-browser --no-restart --home=/opt/syncthing-config --logflags=3 --logfile=/var/log/syncthing.log
Some distributions may require the dash in
www-data to be escaped,
and set instead to
If you see errors related to this,
try including the backslash.
The home directory is the location we specified for the Syncthing config files
The logging portion is optional,
but may be helpful in case something goes wrong.
Keep everything else as is.
Enable the service, so that it starts automatically.
sudo systemctl enable syncthing@www-data
Now start the service, and check for errors.
sudo systemctl start syncthing@www-data sudo systemctl status syncthing@www-data ` * Syncthing@www-data.service - Syncthing - Nextcloud Compatible for www/data Loaded: loaded (/firstname.lastname@example.org; enabled; vendor preset: enabled) Active: active (running) since Wed 2021-07-07 11:52:58 UTC; 4s ago Docs: man:Syncthing(1) Main PID: 15925 (Syncthing) Tasks: 12 (limit: 9830) Memory: 48.4M
If you see errors about the Default folder, you can safely ignore them for now.
Stop the Syncthing service.
sudo systemctl stop syncthing@www-data
The reason we start and stop Syncthing, is just to create the initial Syncthing config files.
Step 5: Edit Syncthing Config
Currently, the GUI is only accessible from the system it is installed on. Since our instance is running on a headless server, we need to make the GUI accessible by the computer we’re working from. To change this, edit the newly created Syncthing config.
The GUI IP is
which means it will only be accessible from
To do this,
change the GUI address to 0.0.0.0:8384,
which makes it accessible from any host.
<gui enabled="true" tls="false" debugging="false"> <address>0.0.0.0:8384</address> <apikey>xxxxxxxxxx</apikey> <theme>default</theme> </gui>
Start the service again and once more confirm there are no errors.
sudo systemctl start syncthing@www-data sudo systemctl status syncthing@www-data
Step 6: Verify GUI Access
The Syncthing GUI should now be accessible via your web browser
using the Nextcloud server’s IP or hostname, and the Syncthing port.
For us it’s
Here you’ll see the Syncthing GUI, which should appear like the image below.
Step 7: Setup Peers and Shared Folders
Connect additional clients,
and set up your Syncthing folders as you normally would.
Because syncthing is now running as
make sure the folder is stored within a
www-data owned directory.
/srv/syncthing in Step 2.
To fix the Default folder error, remove it, and remake the folder under the chosen directory.
I’ve connected a new client to
which I’m calling
clouduser I’ve created a new folder,
a file called
# hello-world.txt If this text is visible from within Nextcloud, then Syncthing has been properly integrated!
I then shared this folder with
You can see
clouduser GUI on the right,
cloud GUI on the left.
When adding new Synced folders to
make sure the parent directory is owned by
such as the
/srv/syncthing folder we made earlier.
you can see that
has received the
hello-world.txt file from
Step 8: Add Syncthing Folder to Nextcloud
Click the Menu icon, and select
Apps menu, enable
External storage support.
Afterwards, click the Menu icon again,
but this time select
From the menu on the left,
Configure your Syncthing storage location here. The path can be entered as either a relative path, or an absolute path.
Step 9: Enjoy Nextcloud and Syncthing Integration
The final step is to find the synced directory,
and view the file.
From the Nextcloud
select the Syncthing folder we just created.
you’ll find the documents folder we synced,
as well as the
From now on, any changes to this file will be synced in both directions.
In the end we created a fully synced, and self hosted Google Drive alternative. Any changes made will be synced to all connected devices. This much needed solution helps us take one more step to being completely in control of our own data.