# Mac Mini WebDAV 服务配置指南

## 目的
在 Mac Mini 上通过原生 Apache 配置 WebDAV 服务，用于共享 Obsidian 笔记。

---

## 一、Mac Mini 本地配置

### 步骤 1: 启用 WebDAV 模块

编辑 Apache 配置文件，启用 DAV 模块：

```bash
sudo nano /etc/apache2/httpd.conf
```

找到以下行并取消注释（去掉 `#`）：

```apache
LoadModule dav_module libexec/apache2/mod_dav.so
LoadModule dav_fs_module libexec/apache2/mod_dav_fs.so
LoadModule dav_lock_module libexec/apache2/mod_dav_lock_module
```

### 步骤 2: 创建 DavLockDB 目录

WebDAV 需要一个目录来存储锁文件：

```bash
sudo mkdir -p /var/run/dav
sudo chown _www:_www /var/run/dav
```

### 步骤 3: 创建 WebDAV 目录并链接 Obsidian

```bash
sudo mkdir -p /Library/WebServer/Documents/Obsidian
sudo ln -s /Users/weishen/Obsidian/shenwei /Library/WebServer/Documents/Obsidian/shenwei
```

### 步骤 4: 配置 WebDAV

创建配置文件：

```bash
sudo nano /etc/apache2/other/webdav.conf
```

**配置内容（完整版）：**

```apache
DavLockDB /var/run/dav/DavLock

<IfModule mod_dav.c>
    DAVMinTimeout 240
</IfModule>

Alias /webdav "/Library/WebServer/Documents"

<Directory "/Library/WebServer/Documents">
    Options Indexes FollowSymLinks
    AllowOverride None
    Require all granted
    
    DAV On
    DAVDepthInfinity off
    
    Header set Allow "OPTIONS, GET, HEAD, POST, PUT, DELETE, PROPFIND, PROPPATCH, MKCOL, COPY, MOVE, LOCK, UNLOCK"
    
    AuthType Basic
    AuthName "WebDAV"
    AuthUserFile /etc/apache2/webdav.users
    Require valid-user
</Directory>
```

### 步骤 5: 创建访问用户

```bash
sudo htpasswd -c /etc/apache2/webdav.users webdav
```

输入密码: `macmini_dav`

> **注意**: 用户名和密码需要与后续 Obsidian 客户端配置一致

### 步骤 6: 设置目录权限（重要！）

WebDAV 需要 Apache 运行用户 (`_www`) 对 Obsidian 目录有读写权限：

```bash
# 修复用户目录权限
sudo chmod o+x /Users/weishen
sudo chmod -R o+rx /Users/weishen/Obsidian

# 将 Obsidian 目录所有权改为 _www
sudo chown -R _www:_www /Library/WebServer/Documents/Obsidian
sudo chown -R _www:_www /Users/weishen/Obsidian/shenwei
sudo chmod -R 775 /Users/weishen/Obsidian/shenwei
```

### 步骤 7: 启动 Apache 服务

```bash
sudo apachectl start
```

---

## 二、FRP 端口映射配置

在 Mac Mini 上编辑 FRP 配置文件：

```bash
sudo nano /opt/frp/frp_0.65.0_darwin_arm64/frpc.toml
```

**添加以下配置（WebDAV 使用 80 端口）：**

```toml
[[proxies]]
name = "macmini-webdav"
type = "tcp"
localIP = "127.0.0.1"
localPort = 80
remotePort = 60080
```

> **重要**: 如果 Mac Mini 上设置了代理（科学上网），需要在 FRPC 启动时添加 `no_proxy` 环境变量：
> ```bash
> export no_proxy="192.227.222.142,127.0.0.1,localhost"
> cd /opt/frp/frp_0.65.0_darwin_arm64 && ./frpc -c frpc.toml
> ```

---

## 三、VPS1 Caddy 反向代理配置

在 VPS1 上编辑 Caddyfile：

```bash
sudo nano /etc/caddy/Caddyfile
```

**添加以下配置：**

```bash
# WebDAV 外网访问
macwebdav.ishenwei.online {
    reverse_proxy localhost:60080
}
```

**重载 Caddy 配置：**

```bash
sudo systemctl reload caddy
```

> **注意**: 需要先在 DNS 服务商处添加 A 记录：
> - 主机记录: `macwebdav`
> - 记录类型: `A`
> - 记录值: `192.227.222.142` (VPS1 IP)

---

## 四、防火墙配置

### VPS1 防火墙（如果使用 UFW）

```bash
sudo ufw allow 60080/tcp
```

---

## 五、常用命令

### Apache 命令

| 命令 | 功能 |
|------|------|
| `sudo apachectl start` | 启动 Apache |
| `sudo apachectl stop` | 停止 Apache |
| `sudo apachectl restart` | 重启 Apache |
| `sudo apachectl -t` | 检查配置语法 |
| `sudo apachectl -M \| grep dav` | 确认 WebDAV 模块已加载 |

### FRP 命令

```bash
# 重启 FRPC（Mac Mini 上）
# in tmux
tmux attach -t frpc
# 停止现有进程 (Ctrl+C in tmux)
# 重启（注意添加 no_proxy）
export no_proxy="192.227.222.142,127.0.0.1,localhost" && cd /opt/frp/frp_0.65.0_darwin_arm64 && ./frpc -c frpc.toml
```

### Caddy 命令（VPS1）

```bash
sudo systemctl reload caddy
```

---

## 六、Obsidian 客户端连接配置（最终验证版本）

### 配置参数

| 配置项 | 值 |
|--------|-----|
| **服务器地址** | `https://macwebdav.ishenwei.online/webdav/Obsidian/` |
| **用户名** | `webdav` |
| **密码** | `macmini_dav` |
| **鉴权类型** | `basic` |
| **Depth header** | `只支持 depth='1'` |

### 配置步骤

1. 打开 Obsidian
2. 安装 **Remotely Save** 插件（或其他 WebDAV 同步插件）
3. 选择远程服务为 **WebDAV**
4. 填写上方配置参数
5. 点击 **检查** 按钮验证连接
6. 开始同步

---

## 七、内网访问

- **URL**: `http://192.168.3.189/webdav/`
- **用户名**: `webdav`
- **密码**: `macmini_dav`

---

## 八、注意事项

1. **安全提示**: 
   - Basic 认证密码明文传输，建议仅在内网使用
   - 外网访问建议配合 HTTPS（Caddy 自动提供 Let's Encrypt）
   
2. **端口规划**:
   - Apache: 80
   - FRP 映射: 60080
   
3. **防火墙**: 
   - Mac 防火墙需允许 80 端口入站
   - VPS 防火墙需开放 FRP 映射的端口

4. **开机自启**: 
   - Apache 开机自动启动（MacOS 默认行为）
   - FRPC 需配置开机自启（tmux 或 launchd）

5. **代理问题**: 
   - 如果 Mac Mini 使用科学上网代理，FRPC 需要设置 `no_proxy` 环境变量
   - 参考上面的 FRP 命令部分

---

## 九、故障排除

### 问题：500 Internal Server Error

**原因**: DavLockDB 目录权限不足

**解决**:
```bash
sudo chown -R _www:_www /var/run/dav
```

### 问题：403 Forbidden

**原因**: Obsidian 目录权限不足，Apache 无法写入

**解决**:
```bash
sudo chown -R _www:_www /Library/WebServer/Documents/Obsidian
sudo chown -R _www:_www /Users/weishen/Obsidian/shenwei
sudo chmod -R 775 /Users/weishen/Obsidian/shenwei
```

### 问题：无法解析域名

**原因**: DNS 记录未生效

**解决**:
1. 确认 DNS A 记录已添加
2. 等待 5-30 分钟 DNS 传播
3. 本地刷新 DNS 缓存：`sudo dscacheutil -flushcache`

### 问题：FRPC 连接超时

**原因**: Mac Mini 代理设置干扰 FRPC 连接

**解决**:
```bash
export no_proxy="192.227.222.142,127.0.0.1,localhost"
```

### 检查 Apache 状态
```bash
sudo apachectl status
```

### 查看日志
```bash
sudo tail -f /var/log/apache2/error_log
```

### 确认 WebDAV 模块加载
```bash
sudo apachectl -M | grep -E "dav|webdav"
```

### 测试本地访问
```bash
curl -u webdav:macmini_dav http://127.0.0.1/webdav/
```

### 测试 FRP 端口连通性（VPS1）
```bash
curl -u webdav:macmini_dav http://localhost:60080/webdav/
```

---

## 十、测试步骤

### 阶段 1: Apache 本地测试（Mac Mini）

#### 1.1 检查 Apache 状态
```bash
sudo apachectl status
```
**预期输出**: Apache 运行中 (running)

#### 1.2 确认 WebDAV 模块已加载
```bash
sudo apachectl -M | grep -E "dav|webdav"
```
**预期输出**: 
- `dav_module (shared)`
- `dav_fs_module (shared)`
- `dav_lock_module (shared)`

#### 1.3 测试本地认证访问
```bash
curl -u webdav:macmini_dav -I http://127.0.0.1/webdav/
```
**预期输出**: HTTP/1.1 200 OK

#### 1.4 列出 WebDAV 目录内容
```bash
curl -u webdav:macmini_dav -X PROPFIND -H "Depth: 1" http://127.0.0.1/webdav/Obsidian/shenwei/
```
**预期输出**: XML 格式的目录列表

---

### 阶段 2: FRP 连通性测试

#### 2.1 检查 FRPC 状态（Mac Mini）
```bash
tmux capture-pane -t frpc -p | tail -10
```
**预期输出**: 看到 `[macmini-webdav] start proxy success`

#### 2.2 测试 VPS1 端口监听
```bash
# 在 VPS1 上执行
sudo ss -tlnp | grep 60080
```
**预期输出**: `*:60080 LISTEN`

#### 2.3 测试内网通过 FRP 访问（从 VPS1 测试）
```bash
# 在 VPS1 上执行
curl -u webdav:macmini_dav -I http://localhost:60080/webdav/
```
**预期输出**: HTTP/1.1 200 OK

---

### 阶段 3: Caddy 反向代理测试

#### 3.1 检查 DNS 解析
```bash
dig +short macwebdav.ishenwei.online
```
**预期输出**: `192.227.222.142`

#### 3.2 测试 HTTPS 访问
```bash
curl -k -u webdav:macmini_dav -I https://macwebdav.ishenwei.online/webdav/
```
**预期输出**: HTTP/1.1 200 OK

---

### 阶段 4: 完整链路测试清单

| 序号 | 测试项 | 测试命令/方法 | 预期结果 |
|------|--------|--------------|----------|
| 1 | Apache 运行中 | `sudo apachectl status` | running |
| 2 | WebDAV 模块已加载 | `apachectl -M \| grep dav` | dav_module |
| 3 | 本地认证访问 | `curl -u webdav:macmini_dav http://127.0.0.1/webdav/` | 200 OK |
| 4 | FRPC 运行正常 | 查看 tmux 日志 | proxy success |
| 5 | VPS1 端口监听 | `ss -tlnp \| grep 60080` | LISTEN |
| 6 | 外网 HTTPS 访问 | `curl -k -u webdav:macmini_dav https://macwebdav.ishenwei.online/` | 200 OK |
| 7 | Obsidian 连接 | 客户端测试 | 同步成功 |

---

## 十一、配置汇总表

| 项目                                | 值                                                  |
| --------------------------------- | -------------------------------------------------- |
| 内网 URL                            | http://192.168.3.189/webdav/                       |
| 外网域名                              | https://macwebdav.ishenwei.online                  |
| **Obsidian Remotely Save 最终配置路径** | https://macwebdav.ishenwei.online/webdav/Obsidian/ |
| FRP 本地端口                          | 80                                                 |
| FRP 远程端口                          | 60080                                              |
| WebDAV 用户                         | webdav                                             |
| WebDAV 密码                         | macmini_dav                                        |

---

## 十二、关键修正记录

本配置在测试过程中发现并修复了以下问题：

1. **WebDAV 模块未启用**: 需要在 `httpd.conf` 中取消注释 DAV 相关模块
2. **DavLockDB 权限问题**: 需要创建目录并设置 `_www` 所有权
3. **符号链接权限问题**: 符号链接使用绝对路径 `/Users/weishen/...`
4. **Obsidian 目录权限**: 需要将目录所有权改为 `_www` 并设置 775 权限
5. **FRPC 代理干扰**: Mac Mini 的代理设置会干扰 FRPC 连接，需要设置 `no_proxy`
6. **DNS 解析延迟**: 添加 DNS 记录后需要等待传播

---

*文档更新时间: 2026-03-19*
