这篇教程介绍一套我实际搭起来的方案,用来在这些设备之间同步文件、iPhone 照片和密码:

  • 家用 Linux 服务器(Ubuntu 24.04)
  • Linux / macOS 笔记本
  • iPhone

整个过程尽量做到:

  • 数据在自己手里,不交给 Google / Apple / Dropbox 等
  • iOS 也能用(自动备份照片、查密码)
  • 尽量简单稳定

用到的组件:

下文命令中的 username 是占位符,请替换成你自己在服务器上的实际用户名。

如果你也想:

  • 自托管
  • iOS + 桌面端都能用
  • 不让第三方看你的原始数据

这套方案可以作为一个完整蓝图。


总体架构

家用服务器(Ubuntu 24.04)

  • 跑 Tailscale
  • 跑 Syncthing
  • 跑 Nextcloud(Docker 部署,用来接 iPhone 照片)
  • 存 KeePass .kdbx 密码库和其他文件

笔记本(Linux / macOS)

  • 跑 Tailscale + Syncthing
  • 和服务器自动同步指定目录
  • 用 KeePassXC 打开 .kdbx 密码库

iPhone

  • Tailscale → 直接访问家里服务器(私有 IP)
  • Nextcloud App → 相册自动上传
  • Strongbox(或 KeePassium)→ 通过 SFTP / Files 打开 KeePass .kdbx
  • 另外装一个 SFTP 客户端(如 Termius / Secure ShellFish)做临时文件传输

特点:

  • 所有数据都在你控制的机器上
  • “云” = 你的服务器 + Tailscale 私网
  • iOS 的限制通过一些安全的“手动动作”来规避

1. 搭建私网:Tailscale

Tailscale 会给每台设备分配一个 100.x.x.x 的私有加密 IP,就像在同一个局域网里。

1.1 服务器安装(Ubuntu)

curl -fsSL https://tailscale.com/install.sh | sh
sudo tailscale up
tailscale ip -4

浏览器会弹出一次登录授权页面,登录你的 Tailscale 账户即可。
记住服务器的 Tailscale IP,例如:

100.122.100.96

1.2 笔记本 / 手机安装

  • 在 Linux / macOS / Windows / iOS 上安装 Tailscale App
  • 用同一个账号登录
  • 确认状态为 Connected

在笔记本上测试 ping:

ping 100.122.100.96

如果能通,就说明这个私有网络打通了。

建议(Linux 上):

sudo tailscale down
sudo tailscale up --reset --accept-routes=false --accept-dns=false

这样可以避免 Tailscale 把你的 DNS / 路由改乱,影响本地网络。


2. 文件同步中枢:服务器 + 笔记本上的 Syncthing

Syncthing 用点对点的方式同步文件,没有中央云端。

2.1 在服务器安装 Syncthing(Ubuntu)

sudo apt update
sudo apt install -y syncthing
 
# 以当前用户启动
systemctl --user enable --now syncthing
systemctl --user status syncthing --no-pager

Syncthing Web UI 在服务器上的地址是:

http://127.0.0.1:8384

想从笔记本安全访问,可以用 SSH 端口转发:

ssh -L 8384:127.0.0.1:8384 username@<server-ip-or-tailscale-ip>

然后在笔记本浏览器里打开:

http://localhost:8384

第一次建议在 Settings → GUI 里设置一个访问用户名/密码。

2.2 笔记本安装 Syncthing

以 Ubuntu 为例:

sudo apt install -y syncthing
systemctl --user enable --now syncthing

在笔记本上打开 http://127.0.0.1:8384 即可访问。

2.3 设备配对

  1. 服务器 的 Syncthing UI 中,复制自己的 Device ID
  2. 笔记本 的 Syncthing UI 中,点击 Add Remote Device
    • 粘贴服务器的 Device ID
  3. 回到服务器 UI,会看到有一个新设备请求:
    • 点击 Add Device 接受

配对完成后,就可以在两个设备之间共享文件夹了。

2.4 示例:“Drop” 文件夹用于快速互传

在服务器上创建一个目录:

mkdir -p /home/username/Sync/Drop

在服务器 Syncthing UI 中:

  • 点击 Add Folder
    • Folder Path: /home/username/Sync/Drop
    • Folder ID: drop
    • Label: 任意,比如 Drop
    • Sharing:勾选你的笔记本

在笔记本 Syncthing UI 中:

  • 会看到一个新文件夹请求 → 点击 Add
  • Folder Path: 例如 /home/your-laptop-username/Sync/Drop

这样,无论你在服务器还是笔记本上的 Drop/ 里放东西,都会自动同步。


3. iPhone → 服务器:用 Nextcloud 自动备份照片

Syncthing 在 iOS 上不太好用,要做“相册自动上传”,Nextcloud 是目前自托管里比较省心的方案之一。

3.1 安装 Docker Engine + compose 插件(Ubuntu)

使用 Docker 官方源(自带 docker compose 插件):

如果你之前装过 docker.io,先卸载:

sudo apt remove -y docker.io

安装 Docker 官方版本:

# 前置依赖
sudo apt update
sudo apt install -y ca-certificates curl gnupg
 
# 添加 Docker GPG key
sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | \
  sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
sudo chmod a+r /etc/apt/keyrings/docker.gpg
 
# 添加 Docker 源(Ubuntu 24.04 = noble)
echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] \
  https://download.docker.com/linux/ubuntu noble stable" | \
  sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
 
sudo apt update
sudo apt install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
 
sudo systemctl enable --now docker
sudo usermod -aG docker $USER
newgrp docker
 
docker version
docker compose version

3.2 Docker 方式部署 Nextcloud

mkdir -p /home/username/services/nextcloud
cd /home/username/services/nextcloud
mkdir -p data

创建 docker-compose.yml

services:
  nextcloud:
    image: nextcloud:29-apache
    container_name: nextcloud
    restart: unless-stopped
    ports:
      - "8080:80"   # 所有网卡上的 8080
    volumes:
      - ./data:/var/www/html

启动:

cd /home/username/services/nextcloud
docker compose up -d
docker compose ps

此时 Nextcloud 可以通过:

  • http://<服务器局域网 IP>:8080
  • http://<服务器 Tailscale IP>:8080

访问。

3.3 浏览器里完成首次安装

在笔记本浏览器中打开:

http://<server-ip>:8080
# 或
http://<tailscale-ip>:8080

按提示创建管理员帐号和密码(默认 SQLite 就够用个人使用)。

如果你用 IP 访问时提示 “Access through untrusted domain”,需要在服务器上编辑配置:

sudo nano /home/username/services/nextcloud/data/config/config.php

找到:

'trusted_domains' =>
array (
  0 => 'localhost',
),

修改为(根据实际情况添加):

'trusted_domains' =>
array (
  0 => 'localhost',
  1 => '100.122.100.96',     // 服务器 Tailscale IP
  2 => '192.168.31.20',      // 例如家用路由器分配的局域网 IP
),

保存退出,必要时重启容器:

cd /home/username/services/nextcloud
docker compose restart

3.4 iPhone 上开启“相册自动上传”

在 iPhone 上:

  1. 安装 Nextcloud App(App Store 搜索 Nextcloud
  2. 添加账户:
    • 服务器:http://<tailscale-ip>:8080
    • 使用刚才创建的管理员帐号密码登录
  3. 在 Nextcloud App 中:
    • 打开设置 → 找到 “自动上传” / “相机上传”
    • 启用照片(可选启用视频)
    • 选择上传目录,例如 /Photos/iPhone/

之后新照片只要满足你设定的条件(例如 Wi‑Fi + 充电),就会自动备份到你自己的服务器。


4. 密码管理:KeePass + KeePassXC + Strongbox

综合考虑隐私、跨平台和 iOS 的限制,我最终选择了 KeePass 生态:

  • 密码库是一个 .kdbx 文件,本身强加密(AES‑256/ChaCha20 + Argon2)
  • 各平台都有成熟客户端
  • 不需要搭 HTTPS Web 服务(避免 iOS ATS/TLS 各种坑)

4.1 在笔记本上创建 KeePass 数据库(KeePassXC)

先安装 KeePassXC

  • Ubuntu:sudo apt install keepassxc
  • macOS(Homebrew):brew install --cask keepassxc

创建数据库:

  1. 打开 KeePassXC → 顶部菜单 Database → New Database…

  2. 名称:例如 Passwords

  3. 加密设置:保持默认(AES‑256 + Argon2,一般已经很安全)

  4. 设置一个 强但可记的主密码

    • 推荐使用 4–6 个随机单词 + 数字,例如:
      • apple subway rocket coffee 93
  5. 保存到一个会被 Syncthing 同步的目录,比如:

    /home/your-laptop-username/MyFolder/Passwords.kdbx

之后我们会让这个文件同步到服务器。

4.2 用 Syncthing 只同步 .kdbx 文件

假设:

  • 笔记本路径:/home/your-laptop-username/MyFolder/Passwords.kdbx
  • 服务器路径:/home/username/Sync/MyFolder/Passwords.kdbx

步骤:

  1. 在 Syncthing 中把 MyFolder 作为一个文件夹共享(Folder ID 记为 keepass-folder
  2. 服务器端接受这个 Folder,路径选 /home/username/Sync/MyFolder

为了只同步这个 .kdbx,在 两边 的这个目录里都创建 .stignore

在笔记本:

cd /home/your-laptop-username/MyFolder
nano .stignore

内容:

*
!Passwords.kdbx

在服务器:

cd /home/username/Sync/MyFolder
nano .stignore

同样内容:

*
!Passwords.kdbx

含义:

  • *:默认忽略所有文件
  • !Passwords.kdbx:例外,同步这个文件

这样,Syncthing 只会在两端同步 Passwords.kdbx,其它文件都不会动。

每次在笔记本上修改密码库并保存后,等几秒让 Syncthing 把新文件同步到服务器,然后再在 iPhone 或其它设备上打开。

4.3 iPhone 上用 Strongbox 通过 SFTP 打开 .kdbx

我们利用 Tailscale + SSH,让 Strongbox 直接从服务器读取密码库。

假设服务器上密码库路径是:

/home/username/Sync/MyFolder/Passwords.kdbx

在 iPhone 上:

  1. 安装 Strongbox(App Store 搜索 Strongbox
  2. 在 Strongbox 里添加新的数据库:
    • 类型选 远程 / SFTP(不同版本菜单名称略有差异,大致是 Remote / SFTP / Server)
  3. 配置 SFTP:
    • Host:100.122.100.96(服务器 Tailscale IP)
    • Port:22
    • Username:username
    • Auth:SSH 密码或密钥(推荐用密钥)
    • Remote Path:/home/username/Sync/MyFolder/Passwords.kdbx

首次打开时:

  • 输入 KeePass 主密码
  • Strongbox 会读服务器上的最新 .kdbx 文件

之后:

  • 在 iPhone 上新增/修改密码后,Strongbox 保存会写回服务器上的文件
  • Syncthing 会把更新同步到笔记本
  • 在笔记本 KeePassXC 打开时就能看到最新状态

避免冲突的小规则:

  • 不要在笔记本和 iPhone 上同时编辑密码库
  • 在一个设备上改完,保存,等几秒让 Syncthing / SFTP 完成本次写入,再换另一台设备打开

4.4 修改主密码的正确姿势

在 KeePassXC(笔记本)上:

  1. 打开数据库(用当前主密码)
  2. 菜单:Database → Change Master Key…
  3. 输入新的主密码(可以换一个更长的 passphrase)
  4. 保存数据库(Ctrl+S)
  5. 等 Syncthing 把新版本同步到服务器(检查服务器上文件时间戳是否更新)

然后在 iPhone Strongbox 上:

  • 打开这个 SFTP 数据库 → 用新的主密码解锁
  • 如果提示错误,很可能是服务器还没同步到新版本,或者 Strongbox 打开的不是同一个文件(例如本地缓存);检查路径和时间戳。

5. 强密码但不烦人的使用习惯

设置 KeePass 主密码时,常见矛盾是:密码短了不安全,长了又懒得每次敲。

解决思路:

  1. 用易记的长口令

    • 例如:苹果 地铁 飞机 咖啡 91
    • 甚至可以混合中英文,只要是你自己记得住、别人猜不到的随机组合。
  2. 减少“需要输入”的频率,而不是缩短密码本身

    • 笔记本 KeePassXC:
      • 把自动锁定时间调长一点
      • 或(在信任机器的前提下)用系统钥匙串辅助解锁
    • iPhone Strongbox:
      • 在设置里启用 Face ID / Touch ID 解锁(或 Pro 版下的生物识别解锁)
      • 自动锁定策略设置成“退出一段时间后锁定”,而不是切换一下后台就锁

这样:

  • 强密码保证安全
  • 平时主要靠指纹 / Face ID 解锁,只有冷启动或间隔较长时才敲一次密码

6. 这套方案最终带来了什么?

文件

  • Syncthing 的 Drop/ 文件夹:快速跨设备互传
  • 其它重要目录:精细控制哪些同步、哪些不动(通过 .stignore

照片

  • iPhone Nextcloud App:相册自动上传到你自己的服务器 /Photos/ 目录
  • 不依赖 iCloud 空间

密码

  • 单一 KeePass 库 Passwords.kdbx 存在服务器
  • 笔记本:KeePassXC
  • iPhone:Strongbox(通过 SFTP 直连服务器)
  • 数据加密格式标准、客户端可替换,不绑死在某个商业服务上

隐私

  • 原始文件 / 照片 / 密码库不暴露给任何第三方云服务
  • 内网通信通过 Tailscale 加密,外界看不到

7. 后续可以继续改进的方向

如果你愿意再进一步:

  • 在服务器上加一块本地备份盘,用 restic / borg 定期备份:
    • /home/username/services/nextcloud/data
    • KeePass .kdbx 文件
    • 重要的 Syncthing 目录
  • 再加一个异地加密备份(比如 restic + Backblaze B2`)
  • 在完全掌控 TLS / HTTPS 的前提下,后面也可以考虑尝试 Vaultwarden + Bitwarden 的方案

但就当前这套来说,已经是在“自托管 + iOS 可用 + 不太折腾”之间的一个比较均衡的点了。