这篇教程介绍一套我实际搭起来的方案,用来在这些设备之间同步文件、iPhone 照片和密码:
- 家用 Linux 服务器(Ubuntu 24.04)
- Linux / macOS 笔记本
- iPhone
整个过程尽量做到:
- 数据在自己手里,不交给 Google / Apple / Dropbox 等
- iOS 也能用(自动备份照片、查密码)
- 尽量简单稳定
用到的组件:
- Tailscale:基于 WireGuard 的私有虚拟局域网
- Syncthing:点对点文件同步
- Nextcloud:iPhone 照片自动上传到家里服务器
- KeePass + Strongbox + KeePassXC:用单个
.kdbx密码库管理所有密码
下文命令中的
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.961.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-pagerSyncthing 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 设备配对
- 在 服务器 的 Syncthing UI 中,复制自己的 Device ID
- 在 笔记本 的 Syncthing UI 中,点击 Add Remote Device:
- 粘贴服务器的 Device ID
- 回到服务器 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:勾选你的笔记本
- Folder Path:
在笔记本 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 version3.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>:8080http://<服务器 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 restart3.4 iPhone 上开启“相册自动上传”
在 iPhone 上:
- 安装 Nextcloud App(App Store 搜索 Nextcloud)
- 添加账户:
- 服务器:
http://<tailscale-ip>:8080 - 使用刚才创建的管理员帐号密码登录
- 服务器:
- 在 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
创建数据库:
-
打开 KeePassXC → 顶部菜单 Database → New Database…
-
名称:例如
Passwords -
加密设置:保持默认(AES‑256 + Argon2,一般已经很安全)
-
设置一个 强但可记的主密码:
- 推荐使用 4–6 个随机单词 + 数字,例如:
apple subway rocket coffee 93
- 推荐使用 4–6 个随机单词 + 数字,例如:
-
保存到一个会被 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
步骤:
- 在 Syncthing 中把
MyFolder作为一个文件夹共享(Folder ID 记为keepass-folder) - 服务器端接受这个 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 上:
- 安装 Strongbox(App Store 搜索 Strongbox)
- 在 Strongbox 里添加新的数据库:
- 类型选 远程 / SFTP(不同版本菜单名称略有差异,大致是 Remote / SFTP / Server)
- 配置 SFTP:
- Host:
100.122.100.96(服务器 Tailscale IP) - Port:
22 - Username:
username - Auth:SSH 密码或密钥(推荐用密钥)
- Remote Path:
/home/username/Sync/MyFolder/Passwords.kdbx
- Host:
首次打开时:
- 输入 KeePass 主密码
- Strongbox 会读服务器上的最新
.kdbx文件
之后:
- 在 iPhone 上新增/修改密码后,Strongbox 保存会写回服务器上的文件
- Syncthing 会把更新同步到笔记本
- 在笔记本 KeePassXC 打开时就能看到最新状态
避免冲突的小规则:
- 不要在笔记本和 iPhone 上同时编辑密码库
- 在一个设备上改完,保存,等几秒让 Syncthing / SFTP 完成本次写入,再换另一台设备打开
4.4 修改主密码的正确姿势
在 KeePassXC(笔记本)上:
- 打开数据库(用当前主密码)
- 菜单:Database → Change Master Key…
- 输入新的主密码(可以换一个更长的 passphrase)
- 保存数据库(Ctrl+S)
- 等 Syncthing 把新版本同步到服务器(检查服务器上文件时间戳是否更新)
然后在 iPhone Strongbox 上:
- 打开这个 SFTP 数据库 → 用新的主密码解锁
- 如果提示错误,很可能是服务器还没同步到新版本,或者 Strongbox 打开的不是同一个文件(例如本地缓存);检查路径和时间戳。
5. 强密码但不烦人的使用习惯
设置 KeePass 主密码时,常见矛盾是:密码短了不安全,长了又懒得每次敲。
解决思路:
-
用易记的长口令
- 例如:
苹果 地铁 飞机 咖啡 91 - 甚至可以混合中英文,只要是你自己记得住、别人猜不到的随机组合。
- 例如:
-
减少“需要输入”的频率,而不是缩短密码本身
- 笔记本 KeePassXC:
- 把自动锁定时间调长一点
- 或(在信任机器的前提下)用系统钥匙串辅助解锁
- iPhone Strongbox:
- 在设置里启用 Face ID / Touch ID 解锁(或 Pro 版下的生物识别解锁)
- 自动锁定策略设置成“退出一段时间后锁定”,而不是切换一下后台就锁
- 笔记本 KeePassXC:
这样:
- 强密码保证安全
- 平时主要靠指纹 / 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 可用 + 不太折腾”之间的一个比较均衡的点了。