甲骨文云 Ubuntu WebDAV 安装指南

我要在甲骨文云中安装WebDAV服务，我的甲骨文的系统是Ubuntu 24.04.3 LTS (GNU/Linux 6.14.0-1012-oracle x86_64)。

请告诉详细的步骤，我跟着一步一步做，如果你发现WebDAV服务需求说的不够清楚，你也可以提示我回答问题。

你好！我是你的IT专家伙伴。很高兴能协助你在 Oracle Cloud (甲骨文云) 的 Ubuntu 24.04 上搭建 WebDAV 服务。

WebDAV 是一种允许客户端（如 Windows 资源管理器、MacOS Finder 或手机 App）像访问本地硬盘一样通过网络编辑和管理文件的协议。

为了最稳定且符合“行业标准”的部署，我们将使用 **Apache HTTP Server** 来实现 WebDAV。它在 Ubuntu 上非常成熟，且原生支持该协议。

### 📋 准备工作

在开始之前，为了确保我提供的方案最适合你，我有两个小问题（你可以先看，稍后回答，我们先按标准流程走）：

1.  **安全性需求：** 你是否有自己的域名？（WebDAV 如果没有 HTTPS 加密，密码和文件是明文传输的，非常不安全。如果有域名，后续我们可以配置 SSL 证书）。
    
2.  **部署方式：** 我默认使用 **原生安装 (Apache)**，这最直接。如果你更喜欢 **Docker** 容器化部署（方便以后删除或迁移），请告诉我。
    

* * *

以下是**原生 Apache WebDAV** 的详细安装步骤：

### 第一步：更新系统并安装 Apache

首先，我们需要确保你的 Ubuntu 系统是最新的，并安装 Apache web 服务器。

1.  使用 SSH 连接到你的甲骨文云服务器。
    
2.  运行以下命令更新软件包列表：
    
    ```
    sudo apt update && sudo apt upgrade -y
    ```
    
3.  安装 Apache 服务器和用于生成密码文件的工具：
    
    ```
    sudo apt install apache2 apache2-utils -y
    ```
    

### 第二步：启用 WebDAV 模块

Apache 默认安装了 WebDAV 模块，但处于关闭状态。我们需要启用它。

1.  运行以下命令启用必要的模块：
    
    ```
    sudo a2enmod dav
    sudo a2enmod dav_fs
    ```
    
2.  重启 Apache 使更改生效：
    
    ```
    sudo systemctl restart apache2
    ```
    

### 第三步：创建共享目录

我们需要指定一个文件夹作为 WebDAV 的存储位置。

1.  创建一个目录（例如 `/var/www/webdav`）：
    
    ```
    sudo mkdir -p /var/www/webdav
    ```
    
2.  **关键步骤：** 修改权限。Apache 的运行用户通常是 `www-data`，必须让它拥有这个文件夹的读写权限：
    
    ```
    sudo chown www-data:www-data /var/www/webdav
    sudo chmod 755 /var/www/webdav
    ```
    

### 第四步：设置密码认证（安全加固）

WebDAV 必须设置密码，否则任何人都能访问你的文件。

1.  创建一个用户（例如用户名为 `user1`）并设置密码。系统会提示你输入并确认密码：
    
    ```
    sudo htpasswd -c /etc/apache2/webdav.password user1
    ```
    
    *注意：如果你以后想添加第二个用户，去掉 `-c` 参数，否则会覆盖原文件。*
    

### 第五步：配置 Apache 站点

现在我们需要告诉 Apache 哪个文件夹对应 WebDAV，并开启密码验证。

1.  使用编辑器创建一个新的配置文件：
    
    ```
    sudo nano /etc/apache2/sites-available/webdav.conf
    ```
    
2.  将以下内容**完全复制并粘贴**进去（注意端口我设置为 **8080**，以避免与默认网页冲突，也方便管理）：
    
    ```
    Listen 8080
    <VirtualHost *:8080>
        ServerAdmin webmaster@localhost
        DocumentRoot /var/www/webdav
    
        # WebDAV 配置
        <Directory /var/www/webdav>
            Options Indexes MultiViews
            AllowOverride None
            Require all granted
        </Directory>
    
        # 开启 WebDAV 功能并绑定路径 /share
        Alias /share /var/www/webdav
        <Location /share>
            DAV On
            AuthType Basic
            AuthName "webdav"
            AuthUserFile /etc/apache2/webdav.password
            Require valid-user
        </Location>
    
        ErrorLog ${APACHE_LOG_DIR}/error.log
        CustomLog ${APACHE_LOG_DIR}/access.log combined
    </VirtualHost>
    ```
    
    *按 `Ctrl + O` 保存，然后按 `Enter` 确认，最后按 `Ctrl + X` 退出编辑器。*
    
3.  启用这个新站点：
    
    ```
    sudo a2ensite webdav.conf
    ```
    
4.  再次重启 Apache：
    
    ```
    sudo systemctl restart apache2
    ```
    

### 第六步：配置防火墙（至关重要！）

在甲骨文云（Oracle Cloud）上，你有**两道**防火墙需要打通。这是大多数人失败的地方。

**1\. 操作系统内部防火墙 (Ubuntu)** 你需要允许 8080 端口通过 iptables 或 ufw。

```
# 如果你使用 ufw (Ubuntu默认防火墙管理工具)
sudo ufw allow 8080/tcp
# 为了保险，直接修改 iptables 规则（Oracle 镜像有时会有预设规则）
sudo iptables -I INPUT 6 -m state --state NEW -p tcp --dport 8080 -j ACCEPT
sudo netfilter-persistent save
```

**2\. 甲骨文云控制台安全列表 (Oracle Cloud Console)** 你必须在网页端开放端口：

- 登录 Oracle Cloud 网页后台。
    
- 找到你的实例 (Instance) -> 点击 **Subnet (子网)** -> 点击 **Security Lists (安全列表)** -> 点击 **Default Security List**。
    
- 添加一条 **Ingress Rule (入站规则)**：
    
    - **Source CIDR:** `0.0.0.0/0` (允许所有人，或者填你自己的IP)
        
    - **IP Protocol:** TCP
        
    - **Destination Port Range:** `8080`
        
- 点击保存。
    

* * *

### 🎉 测试你的 WebDAV

现在服务应该已经启动了。

- **测试地址：** `http://<你的服务器公网IP>:8080/share`
    
- **用户名：** `user1`
    
- **密码：** 你在第四步设置的密码
    

你可以先在浏览器里输入这个地址，如果弹出输入密码的框，并能看到“Index of /share”页面，说明成功了！

* * *

### ⚠️ IT专家的安全建议

目前我们搭建的是基于 **HTTP** 的 WebDAV。

> **风险提示：** 在 HTTP 协议下，你在咖啡厅或公共 WiFi 使用该服务时，你的**密码和文件内容是明文传输的**，黑客可以轻松截获。

**你可以为我做下一步：** 如果你打算长期使用或存放重要文件，请告诉我\*\*“我想配置 HTTPS”\*\*。 我会教你如何申请免费的 SSL 证书（Let's Encrypt），将连接加密，使其变得固若金汤。你需要有一个域名（哪怕是免费的域名也可以）。

按照以上步骤操作，如果遇到任何报错，请把错误信息复制给我，我会帮你分析！

因为我的甲骨文云服务器的配置并不是很高，所以我会倾向于用原生的Apache方式来提高效能，我这种理解对吗？用Apache就已经是我能做的最佳效能的选择了吗？

你的理解**大方向是完全正确的**，特别是在资源受限的环境下（比如甲骨文云的 Always Free AMD 实例，只有 1GB 内存）。

作为一个IT专家，我来帮你深度剖析一下你的选择，并告诉你如何在这个基础上做到极致。

### 1\. 你的判断为什么是对的？

- **原生 vs. Docker：**
    
    - **Docker 的开销：** Docker 本身会占用一部分系统资源（虽然不多，但对小内存机器敏感），而且每个容器内的进程往往比原生运行要消耗更多内存（因为包含了一套独立的运行库）。
        
    - **网络开销：** Docker 默认使用网桥模式（Bridge），流量需要经过 NAT 转换，虽然现代 CPU 处理很快，但这确实是一层额外的性能损耗。
        
    - **结论：** 在低配机器上，**原生安装（Bare Metal）确实比 Docker 更节省内存和 CPU。**
        

### 2\. Apache 是“最佳性能”的选择吗？

这是一个非常有意思的技术权衡问题。答案是：**Apache 是综合“兼容性”与“性能”的最佳平衡点，但从纯粹的“省内存”角度看，它不是第一名。**

让我们看看几个选手的对比：

| 服务器软件 | 内存占用 (RAM) | WebDAV 兼容性 | 配置难度 | 评价  |
| --- | --- | --- | --- | --- |
| **Apache** | ⭐⭐⭐ (中等) | ⭐⭐⭐⭐⭐ (完美) | ⭐⭐⭐ (中等) | **推荐。** 原生支持 WebDAV (mod_dav)，兼容 Windows/Mac/iOS 所有客户端，极其稳定。 |
| **Nginx** | ⭐⭐⭐⭐⭐ (极低) | ⭐⭐ (较差) | ⭐⭐⭐⭐ (困难) | **不推荐用于 WebDAV。** Nginx 以高性能著称，但它原生的 WebDAV 模块功能残缺（不支持 PROPFIND 等高级指令），需要重新编译第三方模块才能正常使用，容易出 Bug。 |
| **Caddy** | ⭐⭐⭐ (中等) | ⭐⭐⭐⭐ (不错) | ⭐⭐⭐⭐⭐ (极简) | 基于 Go 语言，内存占用甚至可能比 Apache 高一点，但在并发处理上很强。 |
| **Lighttpd** | ⭐⭐⭐⭐⭐ (极低) | ⭐⭐⭐⭐ (良好) | ⭐⭐⭐ (中等) | 真正的轻量级王者，但社区文档较少，出了问题较难排查。 |

**专家结论：** 虽然 Nginx 或 Lighttpd 在处理静态网页时内存占用更低，但在 **WebDAV** 这个特定领域，**Apache 是事实上的行业标准**。为了节省 10MB 的内存去折腾 Nginx 的兼容性问题（比如 Windows 资源管理器连不上、上传文件报错），对于个人用户来说是非常不划算的。

所以，**坚持使用 Apache 是一个非常明智的决策**，它能保证你“连得上、用得稳”。

* * *

### 3\. 如何让 Apache 变得更“轻”？（性能优化）

既然确定了用 Apache，我们可以通过调整配置，让它在甲骨文云这台小机器上跑得像飞一样。

Apache 默认的模式（Prefork）比较耗内存。建议你检查并切换到 **Event 模式**，这是现代 Apache 性能最好、最省资源的模式。

**操作步骤：**

1.  **检查当前模式：** 输入以下命令查看：
    
    ```
    apache2ctl -V | grep -i mpm
    ```
    
    如果显示 `Server MPM: event`，那就已经是最好的了。 如果显示 `Server MPM: prefork`，建议切换。
    
2.  **切换到 Event 模式（如果需要）：**
    
    - 禁用 PHP 模块（WebDAV 通常不需要 PHP，PHP 是 prefork 模式的主要依赖）：
        
        ```
        sudo a2dismod php* # (如果提示没有安装php则忽略)
        ```
        
    - 切换 MPM 模块：
        
        ```
        sudo a2dismod mpm_prefork
        sudo a2enmod mpm_event
        ```
        
    - 重启 Apache：
        
        ```
        sudo systemctl restart apache2
        ```
        
    
3.  **限制并发数（防止内存爆满）：** 在小内存机器上，我们需要告诉 Apache：“不要为了服务太多人而把内存吃光”。
    
    编辑 MPM Event 配置文件：
    
    ```
    sudo nano /etc/apache2/mods-available/mpm_event.conf
    ```
    
    修改（或确认）以下参数，将其调小以适应低配环境：
    
    ```
    <IfModule mpm_event_module>
            StartServers             2
            MinSpareThreads          25
            MaxSpareThreads          75
            ThreadLimit              64
            ThreadsPerChild          25
            # 关键：限制最大并发进程数，防止内存溢出
            MaxRequestWorkers        150
            MaxConnectionsPerChild   0
    </IfModule>
    ```
    
    保存并重启 Apache。
    

### 总结

你选择 **原生 Apache** 是完全正确的思路。

- 它比 Docker 省资源。
    
- 它比 Nginx 的 WebDAV 兼容性好太多。
    

**下一步建议：** 如果你是自己用（1-2人使用），按照上面的步骤安装完即可，无需过度焦虑性能。Apache 处理你个人的文件同步流绰绰有余。

**是否需要继续安装？** 如果你准备好了，我们可以继续之前的步骤，或者如果你想让我教你如何**绑定域名并配置 HTTPS**（这对传输速度和安全性都有帮助，因为现代网络对 HTTPS 有优化），请告诉我！

我的WebDAV主要是服务我的笔记本与手机的Joolin同步使用，所以我需要稳定性，如果你说的Apache最稳定，那我就选Apache吧！

既然你是为了 **Joplin**（我猜你指的是这个笔记软件，对吧？它非常依赖 WebDAV 的稳定性）同步笔记，那么选择 **Apache** 绝对是明智之举。它的 `mod_dav` 模块经过了二十年的考验，处理 Joplin 的频繁小文件同步非常稳健，不会出现莫名其妙的“锁死”或丢失数据问题。

我们现在就开始实操。请打开你的 SSH 终端，按照以下步骤一步步执行。

### 第一阶段：安装与基础配置

**1\. 更新系统并安装 Apache** 首先确保你的 Ubuntu 24.04 系统是最新的，并安装必要的软件。

```
sudo apt update
sudo apt install apache2 apache2-utils -y
```

**2\. 启用 WebDAV 模块** Apache 安装好后，默认并没有开启 WebDAV 功能，我们需要手动启用这两个核心模块。

```
sudo a2enmod dav
sudo a2enmod dav_fs
sudo systemctl restart apache2
```

**3\. 创建同步目录** 我们需要专门为 Joplin 创建一个存放数据的文件夹。

```
# 创建目录
sudo mkdir -p /var/www/webdav

# 修改所有权：这一步至关重要！
# Apache 的运行用户是 www-data，必须把这个文件夹给它，否则 Joplin 无法写入文件。
sudo chown www-data:www-data /var/www/webdav
sudo chmod 755 /var/www/webdav
```

### 第二阶段：安全认证设置

因为你的笔记可能包含隐私，必须设置密码保护。

**4\. 创建用户和密码** 我们将创建一个名为 `joplin`（或者你喜欢的其他名字）的用户。

```
# 系统会提示你输入并确认密码，输入时屏幕不会显示字符，这是正常的。
sudo htpasswd -c /etc/apache2/webdav.password joplin
```

### 第三阶段：配置 Apache 站点

**5\. 编写配置文件** 我们要创建一个独立的配置文件，不干扰默认的网页服务。

使用 nano 编辑器新建文件：

```
sudo nano /etc/apache2/sites-available/webdav.conf
```

**请将以下内容完整复制并粘贴进去：** *(注：这里我配置使用 **8080** 端口，这样可以避开默认的 80 端口，方便你以后在 80 端口放别的网站。)*

```
Listen 8080

<VirtualHost *:8080>
    ServerAdmin webmaster@localhost
    DocumentRoot /var/www/webdav

    # 目录权限设置
    <Directory /var/www/webdav>
        Options Indexes FollowSymLinks
        AllowOverride None
        Require all granted
    </Directory>

    # WebDAV 核心配置
    # Alias 将 URL 中的 /joplin 映射到服务器的 /var/www/webdav 目录
    Alias /joplin /var/www/webdav

    <Location /joplin>
        DAV On
        AuthType Basic
        AuthName "Joplin Sync"
        AuthUserFile /etc/apache2/webdav.password
        Require valid-user
    </Location>

    # 日志文件（排错用）
    ErrorLog ${APACHE_LOG_DIR}/webdav-error.log
    CustomLog ${APACHE_LOG_DIR}/webdav-access.log combined
</VirtualHost>
```

- **保存退出方法：** 按 `Ctrl + O`，然后按 `Enter` 确认，最后按 `Ctrl + X` 退出。
    

**6\. 启用新站点并重启**

```
# 启用我们刚才写的配置
sudo a2ensite webdav

# 重启 Apache 让所有配置生效
sudo systemctl restart apache2
```

### 第四阶段：打通防火墙（最关键的一步）

在甲骨文云上，你需要过**两关**防火墙。很多人配置失败都是因为漏了其中一关。

**第一关：Ubuntu 系统内部防火墙** 甲骨文的 Ubuntu 镜像通常默认使用 `iptables` 规则。我们需要放行 8080 端口。

```
# 开放 8080 TCP 端口
sudo iptables -I INPUT 6 -m state --state NEW -p tcp --dport 8080 -j ACCEPT

# 保存规则，确保重启后不失效
sudo netfilter-persistent save
```

**第二关：甲骨文云控制台 (网页端)** 这一步必须在浏览器里操作：

1.  登录 Oracle Cloud 后台。
    
2.  进入你的实例页面 (Compute -> Instances)。
    
3.  点击你的实例名称，向下滚动找到 **"Primary VNIC"** 部分，点击 **"Subnet"** (子网) 的链接。
    
4.  在子网页面，点击 **"Security Lists"** (安全列表)，通常名为 `Default Security List for <你的VCN名字>`。
    
5.  点击 **"Add Ingress Rules"** (添加入站规则) 按钮。
    
6.  填写以下信息：
    
    - **Source CIDR:** `0.0.0.0/0` (允许任何IP访问)
        
    - **IP Protocol:** TCP
        
    - **Destination Port Range:** `8080`
        
7.  点击 "Add Ingress Rules" 保存。
    

* * *

### 🎉 验证与连接

现在，你的 WebDAV 服务应该已经上线了。

**1\. 浏览器测试** 在电脑浏览器访问：`http://<你的公网IP>:8080/joplin`

- 它应该弹窗让你输入账号（`joplin`）和密码。
    
- 输入正确后，如果看到类似 "Index of /joplin" 的页面（或者是空白页面但没有报错），说明成功了！
    

**2\. 在 Joplin 中配置**

- 打开 Joplin -> 工具 -> 选项 -> 同步。
    
- **同步目标：** 选择 WebDAV。
    
- **WebDAV URL：** `http://<你的公网IP>:8080/joplin`
    
- **用户名：** `joplin`
    
- **密码：** (你设置的密码)
    
- 点击 **"检查同步配置"**。
    

如果显示“成功！同步配置看起来没问题”，恭喜你，搭建完成！

* * *

**🔒 专家的最后叮嘱（关于 HTTPS）：** 目前你是通过 `HTTP` 同步的。Joplin 的笔记虽然可以端到端加密（E2EE），但同步时的密码和传输过程最好还是加上 `HTTPS`。

- **如果你的笔记非常私密**：强烈建议你在 Joplin 设置里开启 **"端到端加密" (E2EE)**。这样即使通过 HTTP 传输，你的笔记内容本身也是加密的乱码，只有你的设备能解密。
    
- **未来升级**：如果你有域名，后续我们可以用 Certbot 免费申请 SSL 证书，把链接变成 `https://`。
    

先试着配通这一步，如果有报错，请告诉我！

执行 iptables 的命令有如下的错误，请参考底下。另外我的vps应该已经将所有的端口都打开了，请告诉我指令确认，如果已经全部都打开了，是不是就不需要做这个步骤了？

root@ts91:~# sudo iptables -I INPUT 6 -m state --state NEW -p tcp --dport 8080 -j ACCEPT

iptables: Index of insertion too big.

root@ts91:~# 

这是一个非常典型的 `iptables` 错误，不用担心。

### 1\. 为什么会报错 `Index of insertion too big`？

想象一下防火墙规则就像写在一个笔记本上的清单，每一行都是一条规则。 之前的命令 `-I INPUT 6` 意思是：“把这条规则插到**第 6 行**”。 但是，你的系统目前可能是一张白纸（没有任何规则），或者只有 1-2 行规则。既然没有第 5 行，它就无法插入到第 6 行。这就是报错的原因。

### 2\. 如何确认防火墙是否“全部打开”了？

既然你提到可能已经全开了，我们先确认一下现状，以免做无用功。

请运行以下指令查看当前的防火墙规则：

```
sudo iptables -L INPUT -n -v --line-numbers
```

**如何看懂结果：**

- **情况 A：全开（裸奔状态）** 如果你看到第一行写着 `Chain INPUT (policy ACCEPT)`，而且下面**没有任何规则**，或者没有任何写着 `DROP` 或 `REJECT` 的规则。
    
    - **结论：** 你的系统内部防火墙是完全开放的。你**不需要**再运行任何 iptables 命令了。
        
- **情况 B：有规则** 如果你看到列表里有规则，特别是最后几行如果有 `REJECT all` 或 `DROP`，那就说明防火墙是生效的。
    

### 3\. 如果需要添加规则，正确的指令是什么？

不管你有多少行规则，如果你想确保 8080 端口能用，最安全的方法是把它**插到第 1 行**（最前面），这样它的优先级最高。

请使用这条修正后的命令（把 `6` 改为 `1`）：

```
sudo iptables -I INPUT 1 -p tcp --dport 8080 -j ACCEPT
```

然后保存：

```
sudo netfilter-persistent save
```

* * *

### 💡 专家的额外建议 (针对 Ubuntu 24.04)

你使用的是 Ubuntu 24.04，其实它自带了一个更简单的防火墙工具叫 **UFW (Uncomplicated Firewall)**。很多时候 `iptables` 报错是因为 `ufw` 正在接管系统。

你可以检查一下 UFW 的状态：

- 如果显示 **`Status: active`**： 那么请**忘掉** iptables 指令，直接用 UFW 开启端口，这才是 Ubuntu 的“正道”：
    
    ```
    sudo ufw allow 8080/tcp
    sudo ufw reload
    ```
    
- 如果显示 **`Status: inactive`**： 那说明你是纯靠 `iptables` 或者根本没开防火墙。如果上面的 **情况 A** 确认是全开的，那你现在就可以直接去浏览器测试能不能访问了！
    

### 下一步

请先运行 `sudo iptables -L INPUT -n` 告诉我结果，或者直接尝试在浏览器访问 `http://<你的IP>:8080/joplin`。如果能通，就说明不需要再折腾防火墙了。

root@ts91:~# sudo iptables -L INPUT -n -v --line-numbers

Chain INPUT (policy ACCEPT 6796K packets, 1762M bytes)

num   pkts bytes target     prot opt in     out     source               destination         

root@ts91:~# 

你的判断完全正确！👏

从你提供的输出： `Chain INPUT (policy ACCEPT ...)` 且下方没有任何规则。

这说明你的 Ubuntu 系统内部防火墙处于 **“裸奔”状态（完全开放）**。

- **policy ACCEPT**：意思是“默认允许所有进入的连接”。
    
- **列表为空**：没有任何拦截规则。
    

### 结论

**你不需要执行任何 `iptables` 或 `ufw` 的命令了。** 你的 8080 端口在操作系统层面已经是通的。

* * *

### 下一步：关键的最后检查

虽然操作系统（Ubuntu）放行了，但别忘了**甲骨文云（Oracle Cloud）还有一层“云防火墙”**（也就是网页控制台里的 **Security List**）。

**请立刻进行最终测试：**

1.  **打开浏览器**（在你的电脑或手机上）。
    
2.  访问：`http://<你的服务器IP>:8080/joplin` *(注意是 http 不是 https)*
    

**会出现两种情况：**

- **情况 A：弹出输入密码的框** 🎉 **恭喜！** 你的 WebDAV 已经完美搭建成功了！你可以直接去 Joplin 里配置了。
    
- **情况 B：网页一直转圈，最后显示“无法连接”或“超时”** ❌ **问题定位：** 这说明 Ubuntu 没问题，但被**甲骨文云网页端的防火墙**挡住了。 **解决方法：** 你需要回到甲骨文云网页后台 -> 实例 -> 子网 (Subnet) -> 安全列表 (Security List)，添加一条 **Ingress Rule**：
    
    - **Protocol:** TCP
        
    - **Port:** 8080
        
    - **Source:** 0.0.0.0/0
        

你先试一下浏览器访问，如果有弹窗，就不用管甲骨文后台设置了！告诉我测试结果吧。

已经可以了。刚刚经过复杂的程序完成了，请把过程整理一个表格，方便我日后要做的时候，只要照着表格来操作即可，无需从头看到尾。

太棒了！很高兴你已经成功搭建好了。

作为一个IT专家，整理**SOP (标准作业程序)** 是必修课。这能让你在未来重新部署或迁移服务器时，无需回忆细节，直接复制粘贴即可完成。

以下是为你定制的 **Oracle Cloud Ubuntu + Apache WebDAV 极简部署速查表**。

### 📋 Apache WebDAV 部署速查表 (Ubuntu 24.04)

| 步骤  | 任务名称 | 执行命令 / 操作说明 |
| --- | --- | --- |
| **1** | **环境准备** | `sudo apt update && sudo apt install apache2 apache2-utils -y` |
| **2** | **启用模块** | `sudo a2enmod dav dav_fs`<br><br>`sudo systemctl restart apache2` |
| **3** | **创建目录** | `sudo mkdir -p /var/www/webdav`<br><br>`sudo chown www-data:www-data /var/www/webdav`<br><br>`sudo chmod 755 /var/www/webdav` |
| **4** | **设置密码** | `sudo htpasswd -c /etc/apache2/webdav.password joplin`<br><br>*(输入两次密码，注意 `-c` 仅在第一次创建文件时使用)* |
| **5** | **配置站点** | `sudo nano /etc/apache2/sites-available/webdav.conf`<br><br>*(将下方 **配置代码块** 内容完整粘贴进去，按 `Ctrl+O` 保存，`Ctrl+X` 退出)* |
| **6** | **启动服务** | `sudo a2ensite webdav`<br><br>`sudo systemctl restart apache2` |
| **7** | **系统防火墙** | `sudo iptables -L INPUT -n`<br><br>*(如果策略是 ACCEPT 且无 DROP 规则，则跳过；否则需放行 8080 端口)* |
| **8** | **云端防火墙** | **必做：** 登录甲骨文云网页 -> Instance -> Subnet -> Security List<br><br>添加入站规则 (Ingress): Protocol **TCP**, Port **8080**, Source **0.0.0.0/0** |

* * *

### 📝 步骤 5 对应的配置代码块

**文件路径：** `/etc/apache2/sites-available/webdav.conf`

```
Listen 8080
<VirtualHost *:8080>
    ServerAdmin webmaster@localhost
    DocumentRoot /var/www/webdav

    <Directory /var/www/webdav>
        Options Indexes FollowSymLinks
        AllowOverride None
        Require all granted
    </Directory>

    Alias /joplin /var/www/webdav
    <Location /joplin>
        DAV On
        AuthType Basic
        AuthName "Joplin Sync"
        AuthUserFile /etc/apache2/webdav.password
        Require valid-user
    </Location>

    ErrorLog ${APACHE_LOG_DIR}/webdav-error.log
    CustomLog ${APACHE_LOG_DIR}/webdav-access.log combined
</VirtualHost>
```

* * *

### 📱 Joplin 客户端设置参数

| 设置项 | 值   |
| --- | --- |
| **同步目标** | WebDAV |
| **WebDAV URL** | `http://<你的公网IP>:8080/joplin` |
| **用户名** | `joplin` |
| **密码** | (你刚才设置的密码) |

这份表格涵盖了从零开始到完成的所有关键点。建议你将这段内容保存到你的笔记软件中（比如 Joplin），以后这就是你专属的“一键部署脚本”了！

最后一个问题，因为我已经建立好了WebDAV服务器，目前是给Joplin使用，所以我建立了一个joplin的用户。更新一下你的表格，加上如果我要给另外的app增加一个同步的功能，我要如何做？

没问题！这是非常实用的需求。既然你的 WebDAV 服务器已经搭好了，为了让不同的 App（比如 Keepass、Obsidian、Photos 等）数据互不干扰，**最佳实践是为每个 App 创建独立的文件夹和独立的用户名**。

这里是更新后的\*\*《甲骨文云 Apache WebDAV 专家速查表 v2.0》\*\*，包含了“初次部署”和“新增 App”两个部分。

* * *

### 📘 第一部分：初次部署 (已完成，仅供参考)

如果你已经做完了，这部分可以跳过，仅作日后重装时的备忘。

| 步骤  | 任务名称 | 命令 / 操作 |
| --- | --- | --- |
| **1** | **环境与模块** | `sudo apt update && sudo apt install apache2 apache2-utils -y`<br><br>`sudo a2enmod dav dav_fs && sudo systemctl restart apache2` |
| **2** | **创建 Joplin 目录** | `sudo mkdir -p /var/www/webdav`<br><br>`sudo chown -R www-data:www-data /var/www/webdav` |
| **3** | **创建首个用户** | `sudo htpasswd -c /etc/apache2/webdav.password joplin`<br><br>*(注意：首次创建文件必须加 **\-c** 参数)* |
| **4** | **配置文件** | 编辑 `/etc/apache2/sites-available/webdav.conf` (见下方代码模板) |
| **5** | **启动与防火墙** | `sudo a2ensite webdav && sudo systemctl restart apache2`<br><br>Oracle 后台开放 **8080** 端口。 |

* * *

### 🚀 第二部分：扩展指南 (如何增加第二个 App)

假设你要为一个新 App（例如 **Keepass**）增加同步功能，**请严格照此表格操作**：

| 步骤  | 任务名称 | 命令 / 详细说明 | 关键点 |
| --- | --- | --- | --- |
| **1** | **创建新目录** | `sudo mkdir -p /var/www/keepass`<br><br>`sudo chown -R www-data:www-data /var/www/keepass` | **必须**建立独立文件夹，防止文件混淆。 |
| **2** | **添加新用户** | `sudo htpasswd /etc/apache2/webdav.password keepass`<br><br>*(输入两次密码)* | **绝对不要加 `-c` 参数！**<br><br>加了会把之前的 joplin 用户删掉。 |
| **3** | **修改配置** | `sudo nano /etc/apache2/sites-available/webdav.conf`<br><br>*(在文件底部 `</VirtualHost>` 之前，复制并添加一段新的 Alias 和 Location 配置，详见下方代码)* | 这里是告诉 Apache 把新网址映射到新文件夹。 |
| **4** | **生效更改** | `sudo systemctl restart apache2` | 重启服务。 |

* * *

### 📝 配置文件修改参考 (WebDAV.conf)

当你做“第二部分：步骤3”时，你的配置文件应该长这样。 *(注意：请保留之前的 Joplin 配置，在它下面**追加**新的 App 配置)*

**文件路径：** `/etc/apache2/sites-available/webdav.conf`

```
Listen 8080
<VirtualHost *:8080>
    ServerAdmin webmaster@localhost
    # 这一行其实不重要，因为我们用的是具体的 Alias
    DocumentRoot /var/www/webdav

    # ==============================
    # 1. 原有的 Joplin 配置 (不要动)
    # ==============================
    # 目录权限
    <Directory /var/www/webdav>
        Options Indexes FollowSymLinks
        AllowOverride None
        Require all granted
    </Directory>
    # 映射地址
    Alias /joplin /var/www/webdav
    <Location /joplin>
        DAV On
        AuthType Basic
        AuthName "Joplin Sync"
        AuthUserFile /etc/apache2/webdav.password
        Require user joplin
    </Location>

    # ==============================
    # 2. 新增的 Keepass 配置 (这是你要加的)
    # ==============================
    # A. 先给新文件夹授权
    <Directory /var/www/keepass>
        Options Indexes FollowSymLinks
        AllowOverride None
        Require all granted
    </Directory>

    # B. 设置新映射 (访问地址变为 http://IP:8080/keepass)
    Alias /keepass /var/www/keepass
    <Location /keepass>
        DAV On
        AuthType Basic
        AuthName "Keepass Sync"
        AuthUserFile /etc/apache2/webdav.password
        # 注意：这里限制只允许 keepass 用户访问，确保隔离
        Require user keepass
    </Location>

    ErrorLog ${APACHE_LOG_DIR}/webdav-error.log
    CustomLog ${APACHE_LOG_DIR}/webdav-access.log combined
</VirtualHost>
```

### 💡 专家的核心提示：

1.  **用户隔离**：注意看配置文件中的 `Require user ...` 这一行。
    
    - 在 `/joplin` 区块里写 `Require user joplin`。
        
    - 在 `/keepass` 区块里写 `Require user keepass`。
        
    - **效果：** 这样 Keepass 的用户就算知道地址也登不进 Joplin 的笔记，反之亦然。这是最安全的做法。
        
2.  **客户端填写**：
    
    - **App 1 (Joplin)** 地址：`http://<IP>:8080/joplin`
        
    - **App 2 (新App)** 地址：`http://<IP>:8080/keepass`
        

这份表格可以保存在你的笔记里，未来无论你要加多少个 App，只要重复 **第二部分** 的操作即可！

我注意到WebDAV是透过http传输的，也就是明文传输的，貌似密码也是明文传输，那安全性如何？

你的观察非常敏锐，简直是一针见血。作为一个 IT 专家，我必须非常诚实地告诉你：

**是的，目前的 HTTP 部署方式在安全性上是不合格的。**

如果不加任何防护直接在互联网（尤其是公共 Wi-Fi）使用 HTTP WebDAV，这就相当于你在寄明信片，任何经过的邮差（黑客、网络管理员、ISP）都能看到上面写的内容，包括你的**账号密码**。

### 🚨 为什么 HTTP 不安全？

1.  **明文传输 (Cleartext)**： HTTP 协议下，数据包是完全透明的。如果你在星巴克连着 Wi-Fi 同步笔记，黑客只需要用简单的抓包工具（如 Wireshark），就能把你的笔记内容（如果没加密）还原出来。
    
2.  **密码 "裸奔" (Basic Auth)**： 我们在 Apache 配置里用了 `AuthType Basic`。
    
    - **误区：** 很多人以为它加密了。
        
    - **真相：** 它只是把密码做了 Base64 编码（类似把 "123456" 变成了 "MTIzNDU2"）。这**不是加密**，这叫编码。任何截获数据包的人都可以瞬间将其解码回原始密码。
        
    - **后果：** 黑客拿到了你的 WebDAV 密码，不仅能看你的笔记，还能**删光**你的数据。
        

* * *

### 🛡️ 现阶段的补救措施（分两步走）

既然你已经搭好了，我们先看如何用最低成本提高安全性，再看终极解决方案。

#### 1\. 紧急措施：利用 Joplin 自带的 E2EE (端到端加密)

这是你**现在立刻**就可以做的，不需要改服务器配置。

- **操作：** 在 Joplin 客户端（电脑或手机） -> 设置 -> 加密 -> 启用加密 -> 设置一个强密码。
    
- **效果：**
    
    - Joplin 会先把笔记加密成乱码，然后再传给你的 Apache 服务器。
        
    - **优点：** 即使黑客截获了数据包，他看到的也只是一堆乱码，无法知道你笔记的内容。
        
    - **缺点：** **这依然保护不了你的 WebDAV 密码**。黑客依然能拦截到你的 WebDAV 登录密码，然后登录你的服务器把这些乱码文件删掉。
        

#### 2\. 终极方案：配置 HTTPS (SSL/TLS)

这是行业标准，也是我**强烈建议**你下一步要做的。

- **原理：** 给服务器装一个 SSL 证书。就像给传输管道套了一层防弹钢管。
    
- **效果：** 密码和数据在传输过程中全是加密的，没人能窥探。
    

**要实现 HTTPS，你需要满足一个硬性条件：**

> **你需要有一个域名 (Domain Name)**。
> 
> - SSL 证书通常是颁发给域名（如 `mysync.com`）的，很难颁发给纯 IP 地址（如 `123.45.67.89`）。
>     
> - 域名可以是买的（一年几美元），也可以是免费申请的（如 duckdns 等）。
>     

* * *

### 🚦 你的下一步决策

根据你的情况，我有三个建议方案：

**方案 A：如果你没有域名，也不想折腾域名**

- **做法：** 使用 **Tailscale** 或 **ZeroTier**（虚拟局域网技术）。
    
- **原理：** 在你的 VPS 和手机/电脑上都装上 Tailscale。它会建立一个加密的虚拟内网。你在 Joplin 里填写的地址变成 Tailscale 的内网 IP（例如 `100.x.x.x`）。
    
- **安全性：** ⭐⭐⭐⭐⭐ (极高，不暴露公网端口)
    
- **难度：** ⭐⭐ (简单，只需安装软件)
    

**方案 B：如果你愿意申请一个域名 (推荐)**

- **做法：** 买个便宜域名 -> 解析到你的甲骨文 IP -> 使用 **Certbot** 自动申请免费证书 -> Apache 开启 HTTPS。
    
- **原理：** 这是最标准、最通用的做法。
    
- **安全性：** ⭐⭐⭐⭐⭐ (行业标准)
    
- **难度：** ⭐⭐⭐ (中等，我可以教你)
    

**方案 C：保持现状 (高风险)**

- **做法：** 仅依赖 Joplin 的端到端加密，且**绝对不在**公共 Wi-Fi 下同步，只在这个服务器和你家宽带之间点对点用。
    
- **安全性：** ⭐ (由于密码可能泄露，依然危险)
    

* * *

**你想选哪一条路？** 如果你想选 **方案 B (HTTPS)**，请告诉我\*\*“我有域名”**或者**“我去申请个域名”\*\*，我会给你生成一份 **《Apache 开启 HTTPS 傻瓜式操作表》**。 如果你想选 **方案 A (Tailscale)**，我可以教你如何隐藏端口，只通过内网同步。

太好了！拥有域名是迈向“企业级安全标准”的关键一步。

现在的目标是将你的 WebDAV 从 **HTTP (8080端口)** 升级为 **HTTPS (443端口)**。 这样做的好处是：

1.  **全程加密**：密码和文件无法被窃听。
    
2.  **标准端口**：以后访问不需要再输 `:8080`，直接输域名即可。
    

请按照以下\*\*《WebDAV HTTPS 升级指南》\*\*操作。

* * *

### 📋 准备工作：DNS 解析 (必做)

在操作服务器之前，请去你的域名购买处（如 Godaddy, Namecheap, 阿里云等）：

1.  添加一条 **A记录**。
    
2.  **主机记录 (Name/Host)**：你可以填 `dav` (如果你想用 `dav.yourdomain.com`) 或者 `@` (如果你直接用主域名)。
    
3.  **记录值 (Value/IP)**：填入你甲骨文服务器的 **公网 IP**。
    
4.  等待几分钟，直到你能 ping 通这个域名。
    

* * *

### 🚀 阶段一：调整防火墙 (Oracle Cloud)

Certbot (SSL证书申请工具) 需要用到 **80** 端口验证身份，而 HTTPS 需要用到 **443** 端口。我们需要把这两个端口都打开。

1.  回到 **甲骨文云网页后台** (Security List)。
    
2.  在之前的入站规则 (Ingress Rules) 里，再添加**两条**规则：
    
    - 规则 1: Protocol **TCP**, Port **80**, Source **0.0.0.0/0**
        
    - 规则 2: Protocol **TCP**, Port **443**, Source **0.0.0.0/0**
        
    - *(注：之前的 8080 端口规则可以留着，也可以稍后删掉)*
        

* * *

### 💻 阶段二：服务器端操作流程

请连接 SSH，按顺序执行。

#### 步骤 1：安装 Certbot

这是 Let's Encrypt 的官方自动化工具，它会帮我们申请证书并自动修改 Apache 配置。

```
sudo apt update
sudo apt install certbot python3-certbot-apache -y
```

#### 步骤 2：修改 Apache 配置以适配域名

我们需要先把端口从 8080 改回标准的 80，并告诉 Apache 你的域名是什么，这样 Certbot 才能找到它。

编辑配置文件：

```
sudo nano /etc/apache2/sites-available/webdav.conf
```

**请将内容修改为如下 (主要改动了前三行)：**

- 请把 `<你的域名>` 换成你真实的域名（例如 `dav.example.com`）。
    

```
# 1. 改为监听 80 端口
<VirtualHost *:80>
    # 2. 这里的域名非常重要，Certbot 靠它识别
    ServerName <你的域名>
    ServerAdmin webmaster@localhost
    
    # 下面的内容保持不变
    DocumentRoot /var/www/webdav

    <Directory /var/www/webdav>
        Options Indexes FollowSymLinks
        AllowOverride None
        Require all granted
    </Directory>

    # Joplin 配置
    Alias /joplin /var/www/webdav
    <Location /joplin>
        DAV On
        AuthType Basic
        AuthName "Joplin Sync"
        AuthUserFile /etc/apache2/webdav.password
        Require user joplin
    </Location>

    # (如果你有 Keepass 配置，也保留在这里)

    ErrorLog ${APACHE_LOG_DIR}/webdav-error.log
    CustomLog ${APACHE_LOG_DIR}/webdav-access.log combined
</VirtualHost>
```

*保存退出 (`Ctrl+O` -> `Enter` -> `Ctrl+X`)。*

#### 步骤 3：调整系统端口监听

我们需要告诉 Apache 全局停止监听 8080，改为监听 80。

编辑端口配置文件：

```
sudo nano /etc/apache2/ports.conf
```

- 确保里面有 `Listen 80`。
    
- 如果有 `Listen 8080`，可以把它**删掉**或**注释掉**（前面加 #）。
    
- 保存退出。
    

然后重启 Apache：

```
sudo systemctl restart apache2
```

#### 步骤 4：一键申请 SSL 证书

见证奇迹的时刻。运行以下命令：

**交互流程说明：**

1.  **Enter email address**: 输入你的邮箱（用于接收证书过期提醒）。
    
2.  **Terms of Service**: 输入 `Y` 同意。
    
3.  **Share email**: 输入 `N` (不分享)。
    
4.  **Which names to activate**: 它会列出你在配置文件里写的域名，直接按 **回车** (选择所有)。
    
5.  **Obtaining a new certificate**: 等待几秒...
    
6.  **Redirect**: 这一步最关键！它会问你是否要自动把 HTTP 跳转到 HTTPS。
    
    - **请选择 `2` (Redirect)**。这样即使你输的是 `http://`，它也会自动变成安全的 `https://`。
        

如果最后看到 **"Congratulations!"**，恭喜你，HTTPS 配置成功！

* * *

### 🎉 阶段三：客户端更新

现在你的 WebDAV 服务已经固若金汤了。

**1\. 浏览器验证** 在浏览器输入：`http://你的域名/joplin`

- 你会发现浏览器地址栏自动变成了 `https://`，并且有一把**这把锁**🔒。
    
- 查看证书信息，颁发者应该是 "Let's Encrypt"。
    

**2\. 更新 Joplin 设置**

- **WebDAV URL**：`https://你的域名/joplin` *(注意：端口号不需要了，因为 HTTPS 默认就是 443)*
    
- **用户名/密码**：不变。
    
- 点击“检查同步配置”，应该显示成功。
    

* * *

### ❓ 常见问题 QA

- **Q: 我还需要每三个月手动续期证书吗？**
    
    - **A:** 不需要。Certbot 安装时已经自动添加了定时任务，它会每隔一段时间自动帮你免费续期。
        
- **Q: 之前的 8080 端口还要吗？**
    
    - **A:** 不需要了。为了安全，建议去甲骨文云后台把 8080 的规则**删掉**，减少被攻击的风险。
        

搞定这一步，你的 WebDAV 服务就真正达到了“生产环境”的标准，安全又专业！有任何报错随时告诉我。

我的有域名已经有证书了，是不是就不需要申请了？你可以给我一个指令确认。

这是一个非常棒的问题。这里的核心概念是：**拥有证书（Purchased/Owned）** 和 **服务器已安装证书（Installed/Configured）** 是两回事。

即使你手里已经有证书文件（比如 `.crt` 和 `.key` 文件），或者在云服务商那里看到了证书，只要这些文件没有**上传到这台 Ubuntu 服务器**并**配置进 Apache**，那对于 WebDAV 服务来说，它依然是裸奔的。

### 1\. 用指令确认现状

你可以运行下面这条指令，来检查你的 Apache 目前是否已经配置了证书：

```
grep -r "SSLCertificateFile" /etc/apache2/sites-enabled/
```

#### 判读结果：

- **结果 A：没有任何输出（一片空白）**
    
    - **结论：** 你的 Apache **没有**配置任何证书。
        
    - **你需要做什么：** 你必须进行配置。如果你想用你现有的证书，你需要手动上传并修改配置文件；但我**强烈建议**你直接用我上一条回答里的 `certbot` 方法重新申请一个。
        
    - **为什么？** 因为 Certbot 是全自动的（自动修改配置、自动续期）。手动上传你现有的证书，你需要自己写配置文件，而且证书过期了还要手动去换，非常麻烦。
        
- **结果 B：输出了类似 `/etc/apache2/...: SSLCertificateFile /etc/letsencrypt/...` 的内容**
    
    - **结论：** 你的服务器上已经安装过证书了。
        
    - **你需要做什么：** 既然已经有了，你只需要确保你的 WebDAV 配置（`webdav.conf`）也在使用这个证书即可。
        

* * *

### 2\. 专家建议：如何处理你手里的证书？

根据你的情况，我有两个建议：

#### 选项一：忽略你手里的证书，直接用 Certbot（推荐 ⭐⭐⭐⭐⭐）

这是最省事的方案。Certbot 申请的 Let's Encrypt 证书完全免费，且被所有设备信任。

- **优点：** 一个命令搞定配置，以后每3个月自动续期，完全不用管。
    
- **操作：** 直接照我上一个回复的“阶段二”操作即可。
    

#### 选项二：坚持使用你现有的证书（手动挡）

如果你一定要用你手里购买的证书（比如是一年期的通配符证书），你需要手动操作，步骤会复杂很多：

1.  **上传文件：** 你需要用 SFTP 把 `.crt` (证书) 和 `.key` (私钥) 上传到服务器，例如放到 `/etc/ssl/certs/mycert.crt` 和 `/etc/ssl/private/mykey.key`。
    
2.  **手动改配置：** 你需要编辑 `/etc/apache2/sites-available/webdav.conf`，把端口改成 443，开启 `SSLEngine on`，并手动指定这两个文件的路径。
    

**我的建议：** 除非你是企业级用户且有特殊需求（如 EV 证书），否则**请把“我已经有的证书”忘掉，直接使用 `certbot`**。这能为你省下大量的维护时间。

**你可以直接开始运行 `sudo certbot --apache`，它会自动处理好一切。**

没有出现 Redirect 选项怎么办？

root@ts91:~# sudo certbot --apache

Saving debug log to /var/log/letsencrypt/letsencrypt.log

Enter email address (used for urgent renewal and security notices)

&nbsp;(Enter 'c' to cancel): huang3327@gmail.com

\- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

Please read the Terms of Service at

https://letsencrypt.org/documents/LE-SA-v1.6-August-18-2025.pdf. You must agree

in order to register with the ACME server. Do you agree?

\- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

(Y)es/(N)o: Y

\- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

Would you be willing, once your first certificate is successfully issued, to

share your email address with the Electronic Frontier Foundation, a founding

partner of the Let's Encrypt project and the non-profit organization that

develops Certbot? We'd like to send you email about our work encrypting the web,

EFF news, campaigns, and ways to support digital freedom.

\- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

(Y)es/(N)o: N

Account registered.

Which names would you like to activate HTTPS for?

We recommend selecting either all domains, or all domains in a VirtualHost/server block.

\- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

1: ts91.078919.xyz

\- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

Select the appropriate numbers separated by commas and/or spaces, or leave input

blank to select all options shown (Enter 'c' to cancel): 

Requesting a certificate for ts91.078919.xyz

Successfully received certificate.

Certificate is saved at: /etc/letsencrypt/live/ts91.078919.xyz/fullchain.pem

Key is saved at:         /etc/letsencrypt/live/ts91.078919.xyz/privkey.pem

This certificate expires on 2026-02-27.

These files will be updated when the certificate renews.

Certbot has set up a scheduled task to automatically renew this certificate in the background.

Deploying certificate

Successfully deployed certificate for ts91.078919.xyz to /etc/apache2/sites-available/webdav-le-ssl.conf

Congratulations! You have successfully enabled HTTPS on https://ts91.078919.xyz

\- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

If you like Certbot, please consider supporting our work by:

&nbsp;\* Donating to ISRG / Let's Encrypt:   https://letsencrypt.org/donate

&nbsp;\* Donating to EFF:                    https://eff.org/donate-le

\- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

root@ts91:~# 

不用担心，这完全没有问题！👍

从你的日志来看，**证书其实已经成功申请并部署了**。 提示信息中显示：

> `Congratulations! You have successfully enabled HTTPS on https://ts91.078919.xyz`

**为什么没有出现 Redirect 选项？** 新版本的 Certbot 在某些系统上可能会跳过这个交互步骤，默认只帮你配置好 HTTPS（生成了 `webdav-le-ssl.conf`），但不一定会强制修改你的 HTTP 配置文件来做跳转。

你需要做两件事：**验证** 和 **手动补充跳转（如果需要）**。

请跟着我做：

### 第一步：验证 HTTPS 是否生效

请在浏览器直接访问： `https://ts91.078919.xyz/joplin`

- 如果你能看到页面，并且地址栏有一把**锁**🔒，说明 **HTTPS 已经成功了**。
    
- 你现在的 Joplin 客户端已经可以直接把地址改成 `https://...` 来使用了。
    

### 第二步：检查并手动开启 "强制跳转" (HTTP -> HTTPS)

为了安全，我们不希望任何人使用不加密的 HTTP。我们测试一下： 在浏览器访问：`http://ts91.078919.xyz/joplin` (注意是 **http**)

- **情况 A**：它自动跳变成了 `https://...` —— 恭喜你，Certbot 已经帮你做好了，你什么都不用做了！
    
- **情况 B**：它依然停留在 `http://...` (显示“不安全”) —— **你需要手动添加一行配置**。
    

**如果是情况 B，请执行以下步骤：**

1.  编辑你的 HTTP 配置文件：
    
    ```
    sudo nano /etc/apache2/sites-available/webdav.conf
    ```
    
2.  你会看到类似下面的内容。请在 `ServerAdmin` 下面加一行 `Redirect` 指令。 **修改后的样子如下（请直接复制加粗的那一行）：**
    
    ```
    <VirtualHost *:80>
        ServerName ts91.078919.xyz
        ServerAdmin webmaster@localhost
    
        # === 插入这一行 ===
        # 这会让所有访问 80 端口的请求，全部强制跳转到 HTTPS
        Redirect permanent / https://ts91.078919.xyz/
        # =================
    
        # 下面的内容其实已经不重要了，因为流量已经被转走了，但保留着也没事
        DocumentRoot /var/www/webdav
        # ... (省略)
    </VirtualHost>
    ```
    
3.  保存并退出 (`Ctrl+O`, `Enter`, `Ctrl+X`)。
    
4.  重启 Apache 使其生效：
    
    ```
    sudo systemctl restart apache2
    ```
    

现在，无论你在浏览器输入 `http` 还是 `https`，它都会乖乖地变成安全的加密连接了！

你可以去更新 Joplin 的设置了，把 URL 改成 `https://ts91.078919.xyz/joplin` 即可。

这是为你量身定制的 **《甲骨文云 Ubuntu + Apache WebDAV (HTTPS 加密版) 终极部署手册》**。

这份 SOP 整合了我们之前讨论的所有内容（从环境搭建、SSL 证书到多 App 隔离），你未来重装或部署新服务器时，只需照着这份表格操作即可。

* * *

### 📋 阶段一：基础环境与防火墙

**前提条件：** 你必须拥有一个域名（如 `ts91.078919.xyz`），并已在域名后台将其 A 记录解析到你的甲骨文云 IP。

| 步骤  | 任务  | 操作说明 / 命令 |
| --- | --- | --- |
| **1** | **云端防火墙** | **登录 Oracle Cloud 网页后台** -> Instance -> Subnet -> Security List。<br><br>添加入站规则 (Ingress Rules)：<br><br>1\. Protocol: TCP, Port: **80**, Source: 0.0.0.0/0<br><br>2\. Protocol: TCP, Port: **443**, Source: 0.0.0.0/0 |
| **2** | **系统更新与安装** | `sudo apt update`<br><br>`sudo apt install apache2 apache2-utils certbot python3-certbot-apache -y` |
| **3** | **启用必要模块** | `sudo a2enmod dav dav_fs ssl rewrite headers`<br><br>`sudo systemctl restart apache2` |

* * *

### 📂 阶段二：目录与用户管理 (可反复执行)

这里演示如何初始化 Joplin，以及如何添加第二个 App（如 Keepass）。

| 场景  | 任务  | 命令 (请按需修改用户名和目录名) |
| --- | --- | --- |
| **初始化** | **创建数据目录** | `sudo mkdir -p /var/www/webdav`<br><br>`sudo chown -R www-data:www-data /var/www/webdav` |
| **初始化** | **创建首个用户** | `sudo htpasswd -c /etc/apache2/webdav.password joplin`<br><br>*(注意：**\-c** 仅在第一次创建密码文件时使用)* |
| **扩展** | **增加新 App 目录** | `sudo mkdir -p /var/www/keepass`<br><br>`sudo chown -R www-data:www-data /var/www/keepass` |
| **扩展** | **增加新用户** | `sudo htpasswd /etc/apache2/webdav.password keepass`<br><br>*(注意：这里**千万不要**加 -c，否则会覆盖旧用户)* |

* * *

### 🔒 阶段三：证书申请与 HTTPS 配置

| 步骤  | 任务  | 操作说明 |
| --- | --- | --- |
| **1** | **初始化配置** | 先写一个最简单的配置让 Certbot 识别：<br><br>`sudo nano /etc/apache2/sites-available/webdav.conf`<br><br>*(内容见下方 **\[配置模板 A\]**)* |
| **2** | **启用站点** | `sudo a2ensite webdav`<br><br>`sudo systemctl restart apache2` |
| **3** | **申请证书** | `sudo certbot --apache`<br><br>*(按提示输入邮箱 -> 同意协议 -> 选择域名 -> 等待成功)* |
| **4** | **最终配置确认** | Certbot 会自动生成 SSL 配置文件。为了多 App 隔离，建议手动检查：<br><br>`sudo nano /etc/apache2/sites-available/webdav-le-ssl.conf`<br><br>*(确保内容符合下方 **\[配置模板 B\]**)* |
| **5** | **强制跳转(可选)** | 再次编辑 `webdav.conf`，确保 HTTP 自动跳 HTTPS。<br><br>*(见下方 **\[配置模板 C\]**)* |
| **6** | **最后重启** | `sudo systemctl restart apache2` |

* * *

### 📝 配置文件模板库

#### \[配置模板 A\]：初始化 HTTP 配置 (仅用于申请证书前)

文件：`/etc/apache2/sites-available/webdav.conf`

```
<VirtualHost *:80>
    ServerName ts91.078919.xyz
    DocumentRoot /var/www/webdav
</VirtualHost>
```

#### \[配置模板 B\]：HTTPS 核心配置 (生产环境使用)

**这是最关键的文件**。Certbot 生成后，你需要确保里面的 Alias 和权限设置如下。 文件：`/etc/apache2/sites-available/webdav-le-ssl.conf`

```
<IfModule mod_ssl.c>
<VirtualHost *:443>
    ServerName ts91.078919.xyz
    ServerAdmin webmaster@localhost
    DocumentRoot /var/www/webdav

    # SSL 证书路径 (Certbot 自动生成的，不要动)
    SSLCertificateFile /etc/letsencrypt/live/ts91.078919.xyz/fullchain.pem
    SSLCertificateKeyFile /etc/letsencrypt/live/ts91.078919.xyz/privkey.pem
    Include /etc/letsencrypt/options-ssl-apache.conf

    # ==============================
    # APP 1: Joplin
    # ==============================
    Alias /joplin /var/www/webdav
    <Directory /var/www/webdav>
        Options Indexes FollowSymLinks
        AllowOverride None
        Require all granted
    </Directory>
    <Location /joplin>
        DAV On
        AuthType Basic
        AuthName "Joplin Sync"
        AuthUserFile /etc/apache2/webdav.password
        Require user joplin
    </Location>

    # ==============================
    # APP 2: Keepass (示例：如果需要增加，解开注释即可)
    # ==============================
    # Alias /keepass /var/www/keepass
    # <Directory /var/www/keepass>
    #     Options Indexes FollowSymLinks
    #     AllowOverride None
    #     Require all granted
    # </Directory>
    # <Location /keepass>
    #     DAV On
    #     AuthType Basic
    #     AuthName "Keepass Sync"
    #     AuthUserFile /etc/apache2/webdav.password
    #     Require user keepass
    # </Location>

    ErrorLog ${APACHE_LOG_DIR}/error.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>
</IfModule>
```

#### \[配置模板 C\]：HTTP 强制跳转 HTTPS

文件：`/etc/apache2/sites-available/webdav.conf` *(申请完证书后，把这个文件改成这样，实现全站加密)*

```
<VirtualHost *:80>
    ServerName ts91.078919.xyz
    # 核心指令：将所有流量重定向到 https
    Redirect permanent / https://ts91.078919.xyz/
</VirtualHost>
```

* * *

### 📱 客户端最终设置参数

| App | URL (注意是 HTTPS) | 用户名 |
| --- | --- | --- |
| **Joplin** | `https://ts91.078919.xyz/joplin` | `joplin` |
| **Keepass** (如已配置) | `https://ts91.078919.xyz/keepass` | `keepass` |

这份文档已经包含了从零开始到多应用扩展的所有步骤。日后维护，你只需要关注 **阶段二** (加用户/加目录) 和 **阶段三的模板 B** (加配置段) 即可。

id: f49188f341ee42aeae3d162e1cc5fc8b
parent_id: c8972912af904d98b5610c325e3d5ad3
created_time: 2025-11-29T16:00:09.640Z
updated_time: 2025-11-29T16:00:09.640Z
is_conflict: 0
latitude: 0.00000000
longitude: 0.00000000
altitude: 0.0000
author: 
source_url: https://gemini.google.com/share/c257e9b058bc
is_todo: 0
todo_due: 0
todo_completed: 0
source: joplin-desktop
source_application: net.cozic.joplin-desktop
application_data: 
order: 1764432009640
user_created_time: 2025-11-29T16:00:09.640Z
user_updated_time: 2025-11-29T16:00:09.640Z
encryption_cipher_text: 
encryption_applied: 0
markup_language: 1
is_shared: 0
share_id: 
conflict_original_id: 
master_key_id: 
user_data: 
deleted_time: 0
type_: 1