开篇词

在企业级内网环境中,我们经常面临一个痛点:服务器完全隔离于互联网,但又需要在这几台机器之间实时同步文件(如备份日志、同步静态资源或分发配置)。

传统的 rsync 定时任务不够实时,NFS 挂载在网络波动时容易卡死。今天,我们来介绍一款开源神器 —— Syncthing。它无需中心服务器,支持 P2P 传输,且完全开源免费。

本文将演示如何在 完全离线 的 Linux 环境下,部署并配置两台服务器的双向同步。


准备工作

  • 服务器 A (Master): IP 192.168.1.100 (示例)
  • 服务器 B (Slave): IP 192.168.1.101 (示例)
  • 系统环境: CentOS 7 / Ubuntu 20.04 (通用)
  • 工具: 一台能上网的电脑(用于下载安装包),U盘或 SCP 工具。


第一步:获取离线安装包

由于服务器无法上网,我们需要先在有网的电脑上下载 Syncthing 的二进制文件。

  1. 访问 GitHub 发布页:https://github.com/syncthing/syncthing/releases 或者官网 https://syncthing.net/downloads/
  2. 下载对应架构的 Linux 版本(通常是 syncthing-linux-amd64-v2.xx.x.tar.gz)。
  3. 通过 SCP 或 U 盘将压缩包上传至两台服务器的 /tmp 目录。

第二步:安装与部署

(以下操作在两台服务器上均需执行)

我们将 Syncthing 安装到 /usr/local/bin 以便全局调用。

# 1. 解压安装包
cd /tmp
tar -zxvf syncthing-linux-amd64-*.tar.gz

# 2. 进入解压后的目录
cd syncthing-linux-amd64-*

# 3. 复制二进制文件到系统路径
sudo cp syncthing /usr/local/bin/

# 4. 验证安装
syncthing --version

如果看到版本号输出,说明二进制文件已就位。


第三步:配置 Systemd 后台服务

为了让 Syncthing 开机自启并在后台运行,我们需要创建一个 Systemd 服务文件。

建议创建一个专用用户运行(如 syncthing),也可以直接用 root(生产环境请注意权限)。这里演示使用 root 用户。

新建文件 /etc/systemd/system/syncthing.service

[Unit]
Description=Syncthing - Open Source Continuous File Synchronization
Documentation=https://docs.syncthing.net/
After=network.target

[Service]
# 指定运行用户,如果是非 root 用户请修改此处
User=root
# 关键:指定配置文件和数据目录,防止乱放
ExecStart=/usr/local/bin/syncthing -no-browser -home=/etc/syncthing
Restart=on-failure
SuccessExitStatus=3 4

[Install]
WantedBy=multi-user.target

启动服务:

# 创建配置目录
mkdir -p /etc/syncthing

# 重新加载服务配置
systemctl daemon-reload

# 启动并设置开机自启
systemctl enable syncthing
systemctl start syncthing

# 查看状态
systemctl status syncthing

第四步:修改配置以允许远程访问

默认情况下,Syncthing 的 Web 管理界面(GUI)只允许 127.0.0.1 访问。在无桌面的服务器上,我们需要修改配置允许通过 IP 访问。

  1. 修改 config.xml
    文件路径位于我们在 Service 中指定的 /etc/syncthing/config.xml

    vi /etc/syncthing/config.xml
    

    找到 <gui> 标签部分,将 <address>127.0.0.1:8384</address> 修改为 0.0.0.0:8384

    <gui enabled="true" tls="false" debugging="false">
        <!-- 修改此处为 0.0.0.0:8384 -->
        <address>0.0.0.0:8384</address>
        <apikey>...</apikey>
        <theme>default</theme>
    </gui>
    
  2. 重启服务

    systemctl restart syncthing
    
  3. 开放防火墙(重要)
    Syncthing 需要开放两个端口:

    • 8384 (TCP): Web 管理面板
    • 22000 (TCP/UDP): 数据传输协议
    # CentOS 7+
    firewall-cmd --zone=public --add-port=8384/tcp --permanent
    firewall-cmd --zone=public --add-port=22000/tcp --permanent
    firewall-cmd --zone=public --add-port=22000/udp --permanent
    firewall-cmd --reload
    

第五步:Web 界面连接与配对

现在,在你的浏览器中输入 http://192.168.1.100:8384http://192.168.1.101:8384,你应该能看到 Syncthing 的管理界面。

1. 设置密码(安全第一)

首次进入会有红色警告,点击设置,为 GUI 设置一个账号密码。

2. 添加远程设备

由于是离线环境,全局发现(Global Discovery) 功能是失效的,我们需要手动指定 IP。

  • 服务器 A 的界面上,点击右下角“操作” -> “显示 ID”,复制那一长串 ID。
  • 服务器 B 的界面上,点击“添加远程设备”。
  • 设备 ID: 粘贴 A 的 ID。
  • 高级 -> 地址列表: 默认是 dynamic必须修改为静态 IP
    • 格式:tcp://192.168.1.100:22000
  • 点击保存。

反向操作一遍:在 A 上添加 B 的 ID,并在地址列表中填入 tcp://192.168.1.101:22000

3. 共享文件夹

设备连接成功后(状态显示为“已连接”),就可以同步文件夹了。

  • 在 A 上点击“添加文件夹”。
  • 文件夹路径: 输入你想同步的目录,例如 /data/backup
  • 共享: 勾选“服务器 B”。
  • 保存后,B 的界面会弹出一个提示“A 想要共享文件夹”,点击“添加”,设置好 B 本地的路径即可。




⚠️ 常见问题与避坑指南 (Troubleshooting)

在离线环境中,你可能会遇到以下问题,请提前规避:

1. 为什么一直显示“断开连接”?

  • 检查防火墙: 确保两台服务器的 22000 端口都已放行。可以使用 telnet 对方IP 22000 测试连通性。
  • 关闭无关功能: 在“操作” -> “设置” -> “连接”中,取消勾选以下内容,可以减少报错日志并节省资源:
    • ❌ 全局发现 (Global Discovery)
    • ❌ 中继 (Relaying)
    • ❌ NAT 穿透

2. 权限不足 (Permission Denied)

如果同步状态显示“停止”或报错权限问题,通常是因为 Syncthing 运行用户(如 root)对目标文件夹没有读写权限。

  • 解决方案: chown -R 用户名:用户组 /你的/同步目录

3. 文件冲突怎么办?

Syncthing 默认采用“版本控制”策略。如果在两端同时修改了同一个文件,它会生成一个冲突文件(包含 sync-conflict 字样)。你可以在文件夹设置中配置“文件版本控制”为“简易版本控制”或“回收站”,以防误删。

4.部分linux服务器提示无法监控文件的问题原因

  • inotify 限制
    • fs.inotify.max_user_watches:定义单个用户可以监视的文件或目录数量。默认值(通常为 8192 或 16384)可能不足以应对大型文件夹或多个同步目录。
    • fs.inotify.max_user_instances:定义用户可以创建的 inotify 实例数量。默认值较小(如 128),可能限制 Syncthing 的监控能力。
  • Syncthing 需求
    • Syncthing 为每个同步文件夹创建一个 inotify 监视器,监控文件夹内的所有文件和子目录。如果文件夹包含大量文件或子目录,可能会超出 max_user_watches 限制。
    • 错误中的“Default Folder”和“rsync”文件夹表明这两个目录触发了限制。

解决方法
1. 检查当前 inotify 限制

运行以下命令查看当前的 inotify 限制:

cat /proc/sys/fs/inotify/max_user_watches
cat /proc/sys/fs/inotify/max_user_instances
  • max_user_watches:默认值通常为 8192 或 16384。
  • max_user_instances:默认值通常为 128。

如果这些值较低(例如 max_user_watches 小于文件夹中的文件数),需要增加限制。

2. 临时增加 inotify 限制

通过以下命令临时调整 inotify 限制(重启后失效):

sudo sysctl -w fs.inotify.max_user_watches=524288
sudo sysctl -w fs.inotify.max_user_instances=512
  • max_user_watches=524288:增加到 524288,足以应对大多数大型文件夹。
  • max_user_instances=512:增加实例数,适合多文件夹同步。

调整后,检查 Syncthing 是否恢复正常:

  • 打开 Syncthing Web 界面(http://127.0.0.1:8384),查看“Default Folder”和“rsync”文件夹是否仍在报错。
  • 或检查日志(~/.config/syncthing/logs 或 Web 界面“操作” > “日志”)。
3. 永久增加 inotify 限制

为了确保重启后限制仍然生效,修改系统配置文件:

  1. 编辑 /etc/sysctl.conf(或 /etc/sysctl.d/99-sysctl.conf):
    sudo nano /etc/sysctl.conf
    
  2. 在文件末尾添加以下行:
    fs.inotify.max_user_watches=524288
    fs.inotify.max_user_instances=512
    
  3. 保存并应用更改:
    sudo sysctl -p
    
  4. 重启 Syncthing:
    systemctl --user restart syncthing
    

    或手动重启 Syncthing 进程。


结语

通过以上步骤,你已经成功构建了一个完全私有、不依赖公网、点对点加密的文件同步系统。无论是做数据库异地备份,还是应用代码分发,Syncthing 都是内网运维的得力助手。

喜欢本文?欢迎点赞、在看、转发!👇

Q.E.D.


寻门而入,破门而出