You've probably got files scattered across three or four machines right now. A laptop, a desktop, maybe a phone, and now a Proxmox box you're hoping will tie it all together. The usual answer is to shove everything into a cloud drive and hope your upload speed cooperates. Syncthing skips that step entirely — it copies files straight between your own devices, no cloud account, no monthly fee, no company reading your file names on the way through.
This guide sets up Syncthing inside its own LXC container on Proxmox VE 9.2, running as a proper systemd service instead of something you start by hand and forget about. By the end you'll have a syncing node your other devices can talk to, and you'll actually understand every piece of it instead of copy-pasting a helper script and hoping for the best.
What You Will Learn
This is a from-scratch build, not a one-line installer. Here's what you'll walk away with:
- A right-sized Debian 13 LXC container built specifically to host Syncthing
- Syncthing installed from its official repository, not whatever older build Debian ships
- A dedicated non-root user running the service, with systemd keeping it alive across reboots
- The GUI opened up to your LAN — it's locked to localhost by default, which trips up almost everyone the first time
- A working sync between this container and a second device, plus the errors you're likely to hit along the way
What Is Syncthing?
Syncthing is an open-source tool that keeps a folder identical across two or more devices. Point it at a folder on your laptop and the same folder on this container, and any file you add, edit, or delete on one side shows up on the other within seconds — assuming both machines are online and can reach each other.
There's no central server involved. Each device runs its own copy of Syncthing, and they talk to each other directly using an encrypted connection, authenticated by a device ID that's really just a fingerprint of a cryptographic key generated the first time you run it. Think of it as two people handing files back and forth in person rather than mailing them through a warehouse in between.
That's the core difference between Syncthing and something like Nextcloud, which this blog has covered separately as a full self-hosted cloud platform with a web-based file browser, calendars, and apps of its own. Syncthing does exactly one thing — it keeps folders in sync between machines you already own. If you want a phone-accessible cloud replacement, Nextcloud is the better fit. If you just want your notes folder identical on your desktop and this server, Syncthing gets there with far less setup.
Why Would You Use It?
The obvious case is backup-adjacent: point Syncthing at your laptop's Documents folder and have a copy land on this container automatically, without remembering to run anything. But it's just as useful the other direction — sync a folder of configs, scripts, or media from this container out to your workstation so you're not SSHing in every time you need a file.
Running it in its own LXC container, rather than directly on the Proxmox host, keeps things clean. LXC containers are Linux's lightweight alternative to a full virtual machine — instead of virtualizing hardware and booting a separate kernel, a container shares the host's kernel and just gets its own isolated filesystem and processes. That means Syncthing starts in under a second, uses barely any RAM at idle, and if you ever want to move it to a bigger disk or a different node, you snapshot the container and go. Your Proxmox host stays free of application-level software, which is exactly where you want it to stay.
Prerequisites
Before starting, make sure you've got:
- Proxmox VE 9.x (this guide was written against 9.2; 8.x works the same way for this particular tutorial)
- A Debian 13 "Trixie" LXC template available on your storage — the steps below cover downloading it if you don't have it yet
- Enough free disk space for whatever you plan to sync, plus some headroom. Syncthing itself needs almost nothing; the folders you point it at are what actually use space
- At least one other device — a laptop, desktop, or phone with the Syncthing app — to sync with. A one-node Syncthing setup doesn't do anything useful on its own
- Comfort typing basic Linux commands. Nothing advanced, but you'll be editing a config file by hand at one point
Step-by-Step Tutorial
Step 1: Download the Debian 13 template
From the Proxmox web interface, click your node, then go to local (Storage) > CT Templates > Templates, search for "debian-13", and download the standard template. It's around 130 MB.
If you'd rather do it from the shell, SSH into the Proxmox host and run:
pveam update
pveam available | grep debian-13
pveam download local debian-13-standard_13.1-1_amd64.tar.zst
The exact version number in that filename changes as Proxmox updates its template index, so check the output of the search command rather than copying the filename above blindly.
Step 2: Create the container
Click Create CT and work through the wizard:
- General: hostname something like
syncthing, set a root password, and leave "Unprivileged container" checked — Syncthing has no reason to need privileged access to the host - Template: the debian-13-standard template from Step 1
- Disk: size this to what you're actually syncing, not to Syncthing itself. A folder of documents and configs might need 8 GB total; a folder of photos or video needs a lot more. You can always add a second mount point later if you guessed wrong — that's covered in a separate guide on this blog if you need it
- CPU: 1 core is fine. Syncthing does more work when it's scanning large folders for changes, but it's not CPU-hungry in normal operation
- Memory: 512 MB is enough for a modest number of synced folders. Bump it to 1 GB if you're syncing tens of thousands of small files, since Syncthing keeps an index of every file in RAM
- Network: bridge to
vmbr0(or whatever bridge your other guests use), DHCP unless you're assigning static addresses
Finish the wizard, select the container, and click Start.
Step 3: Add the official Syncthing repository
Debian's own repositories carry Syncthing, but it's usually a version or two behind. Syncthing publishes its own APT repository that tracks stable releases directly, so use that instead. Open the container's console and run:
apt update && apt upgrade -y
apt install -y curl gnupg apt-transport-https
Now add the repository's signing key and source list:
mkdir -p /etc/apt/keyrings
curl -L -o /etc/apt/keyrings/syncthing-archive-keyring.gpg https://syncthing.net/release-key.gpg
echo "deb [signed-by=/etc/apt/keyrings/syncthing-archive-keyring.gpg] https://apt.syncthing.net/ syncthing stable" > /etc/apt/sources.list.d/syncthing.list
That signing key lets APT verify the packages actually came from Syncthing's project and weren't tampered with somewhere between their server and your container — the same reason every third-party repository you add should come with one.
Step 4: Install Syncthing
apt update
apt install -y syncthing
This pulls in the current stable release along with the systemd unit files the package ships — you won't be writing your own service file for this one, unlike some other self-hosted tools.
Step 5: Create a dedicated user for the service
Running Syncthing as root works, but it's sloppy — if a synced folder ever gets compromised through a bad file, you don't want that happening with root privileges. Create a normal user instead:
useradd -m -s /bin/bash syncuser
passwd syncuser
The -m flag creates a home directory at /home/syncuser, which is where Syncthing will store its configuration and index database once it starts.
Step 6: Start Syncthing as a systemd service
The Debian package installs a template unit that runs Syncthing as any user you name. Enable and start it for syncuser:
systemctl enable --now syncthing@syncuser.service
systemctl status syncthing@syncuser.service
You should see "active (running)" within a few seconds. This first launch generates a fresh configuration file and a unique device ID for this container — that ID is what other devices will use to recognize and connect to it.
Step 7: Open the GUI to your LAN
Here's the part that catches almost everyone. Syncthing's web GUI listens on 127.0.0.1:8384 by default, which means it only answers requests from inside the container itself — not from your laptop, not from anywhere on your network. You have to open it up manually. Stop the service first:
systemctl stop syncthing@syncuser.service
nano /home/syncuser/.config/syncthing/config.xml
Find the <gui> block and look for a line like <address>127.0.0.1:8384</address>. Change 127.0.0.1 to 0.0.0.0 so it listens on every network interface, save, and exit. Then start the service back up:
systemctl start syncthing@syncuser.service
Step 8: Log in and add your first sync
Find the container's IP address from the Summary tab in the Proxmox web UI, then browse to:
http://<container-ip>:8384
Go straight to Settings > GUI and set a username and password before doing anything else — right now, anyone on your LAN who finds that port has full control over this instance. Once that's set, click Add Remote Device, and on your other device (say, the Syncthing app on your laptop or phone) do the same, pasting each device's ID into the other. After they accept each other, click Add Folder on either side, point it at a real directory, and share it to the other device. Files start copying as soon as both sides agree.
Commands Explained
| Command | What it does |
|---|---|
pveam download local debian-13-standard... | Downloads a specific LXC template to the node's local storage so it's available when creating a container |
curl -L -o ... https://syncthing.net/release-key.gpg | Downloads Syncthing's GPG signing key and saves it where APT expects to find keyrings |
useradd -m -s /bin/bash syncuser | Creates a new Linux user with a home directory and a normal login shell |
systemctl enable --now syncthing@syncuser.service | Registers the Syncthing service to start on boot and starts it immediately, running as the syncuser account |
systemctl status syncthing@syncuser.service | Shows whether the service is currently running and prints recent log output if it isn't |
journalctl -u syncthing@syncuser.service -n 100 | Prints the last 100 log lines for the service, the first place to look when something's wrong |
Common Errors
The GUI won't load from another device on your network. Nine times out of ten this is the default 127.0.0.1 address from Step 7 that never got changed. Confirm the edit actually saved and that you restarted the service afterward.
"Failed to load config: permission denied" in the logs. This happens if you edited config.xml as root and the file's ownership changed. Fix it with chown syncuser:syncuser /home/syncuser/.config/syncthing/config.xml and restart the service.
Two devices show "Disconnected" even though both are online. Usually a firewall blocking Syncthing's sync port. It uses TCP/UDP 22000 for the actual data transfer and UDP 21027 for finding devices on the local network — both need to be open between the two machines.
A shared folder gets stuck at "Out of Sync" with items that never resolve. This is typically a permissions mismatch — the syncuser account can't write to a subfolder or file that has restrictive permissions. Check ownership on the target directory with ls -la before assuming it's a Syncthing problem.
Troubleshooting
Logs are always the first move:
journalctl -u syncthing@syncuser.service -n 100 --no-pager
If the service refuses to start at all, check that the user exists and that its home directory is actually writable:
id syncuser
ls -ld /home/syncuser
If devices can see each other in the GUI but nothing actually transfers, look at the connection type shown next to the remote device. "Relay" means Syncthing couldn't establish a direct connection and is routing through a public relay server, which works but is much slower — this usually means a firewall or NAT is blocking direct connections on port 22000 in one direction.
And if the Proxmox firewall is enabled on this container (check Datacenter > Firewall and the container's own Firewall tab), make sure rules exist allowing inbound TCP and UDP on 22000 and UDP on 21027, plus TCP 8384 if you need GUI access from outside your own machine.
Best Practices
A few things worth doing once the basic sync is working:
- Set folder type to Send Only on this container if you're using it purely as a backup destination — that stops an accidental delete on your laptop from wiping the copy here
- Back up this container with vzdump or Proxmox Backup Server just like any other guest. Because Syncthing's own config and index live inside the container, a single container backup covers the whole setup
- Don't sync directly to the container's root filesystem for large amounts of data. Mount a second disk and point folders there instead, so a runaway sync can't fill the disk Debian itself needs to boot
- Take a quick snapshot before a major Syncthing version upgrade. Config format changes are rare, but not unheard of
I'd skip enabling "Ignore Permissions" on shared folders unless you specifically need it — it exists for cross-platform syncing quirks with Windows, and most Linux-to-Linux setups never touch it.
Frequently Asked Questions
Do I need to open ports on my router for this to work?
Only if you're syncing with a device outside your home network. For two devices on the same LAN, local discovery handles everything automatically with no router changes needed.
Is the data encrypted while it's syncing?
Yes. Every connection between devices uses TLS, and devices only trust each other after you've manually approved the pairing through their device IDs.
What happens if I edit the same file on two devices at once?
Syncthing detects the conflict and keeps both versions, renaming one with a .sync-conflict suffix so you don't lose either copy. It never silently picks a winner.
Can I run this on my phone too?
Yes — there are Syncthing apps for Android, and unofficial but well-maintained options for iOS, so your container can sync directly with a phone the same way it does with a laptop.
How is this different from just using rsync in a cron job?
rsync is one-directional and needs you to trigger it. Syncthing watches folders continuously in both directions and reacts to changes within seconds, with no scheduling involved.
Conclusion
You've now got a container quietly keeping a folder identical between this Proxmox host and whatever else you paired it with, no cloud middleman involved. The setup here covers one shared folder, but the same container handles as many as you want to add — just repeat the folder-sharing step for each one. Once you're comfortable with it, it's worth pointing at something you actually rely on, since an out-of-sync photo folder is a much smaller problem to notice than a backup you assumed was running.