# n8n HTTPS + Caddy 完整方案

## 问题：n8n Secure Cookie 报错

```
🚫 Your n8n server is configured to use a secure cookie,
however you are either visiting this via an insecure URL,
or using Safari.
```

**根因链条：**
1. n8n 默认要求 HTTPS 才能写 secure cookie
2. 局域网 IP（`http://192.168.1.x:5678`）= HTTP → 被拒绝
3. Safari 对 secure cookie 要求更严（即使 HTTPS 也可能报）
4. 自签证书 ≠ 可信 HTTPS → 浏览器当 HTTP 处理

**三种解法：**

| 方案 | 复杂度 | 安全性 | 推荐场景 |
|------|--------|--------|----------|
| `N8N_SECURE_COOKIE=false` | ⭐ | ❌ 降级 | 临时、无公网、懒得折腾 |
| 自签证书 + 接受警告 | ⭐⭐ | ⚠️ 自签 | 局域网 Chrome/Edge |
| 真实域名 + Let's Encrypt | ⭐⭐⭐ | ✅ 完美 | **正式使用，推荐** |

---

## 方案 A：关闭 secure cookie（临时）

适合：不需要 HTTPS、不在意安全警告。

```bash
# 重建容器，加一行环境变量
docker stop n8n && docker rm n8n
docker run -d \
  --name n8n \
  --restart unless-stopped \
  -p 5678:5678 \
  -v n8n_data:/home/node/.n8n \
  -e N8N_SECURE_COOKIE=false \
  n8nio/n8n
```

**注意：** 如果 `docker stop` / `docker rm -f` 都报 permission denied（没有 sudo），这个方案无法执行。只能先绕过。

---

## 方案 B：自签证书 + Caddy（局域网 Chrome/Edge）

用户当前已有的配置：

```
宿主机：局域网 IP 192.168.1.x
Caddy 容器：0.0.0.0:443 → 反向代理 → n8n-v2:5678
证书：自签 cert.pem + key.pem
```

**访问方式：**
- `https://localhost` — 本机 Chrome/Edge，点"高级→继续"
- 局域网其他设备：先在 n8n 所在机器安装自签 CA 为可信根，或者手动 trust cert.pem

**缺点：** 每个新设备都要导入证书，麻烦。

---

## 方案 C：真实域名 + Let's Encrypt（生产推荐）

**为什么需要域名：**
- Let's Encrypt 不给纯 IP 发证书
- 有域名后，Caddy 自动申请、自动续期、完全免费

**推荐免费域名方案：**

### DuckDNS（最简单，5 分钟搞定）

1. 去 https://www.duckdns.org 注册
2. 创建子域名（如 `kuhnn.duckdns.org`）
3. 设置 DNS A 记录指向你的**公网 IP**
4. Caddyfile：

```caddy
kuhnn.duckdns.org:443 {
    reverse_proxy n8n-v2:5678
}
```

**注意：** 公网 IP 变化需要动态更新（DDNS），DuckDNS 支持 API 更新。

### Cloudflare Tunnel（更简单，不需要公网 IP）

不需要路由器端口映射、不需要 DDNS，Cloudflare 免费提供 WireGuard 隧道和 HTTPS。

1. 安装 cloudflared（无 root 也可以）
2. 连接 Cloudflare
3. 配置文件指向 `localhost:5678`
4. 得到 `https://xxx.trycloudflare.com` 公开 HTTPS URL

---

## 当前用户环境（2026-05-20）

- n8n 跑了两个容器：`n8n`（直接 npm 安装）和 `n8n-v2`（Docker，端口 5679→5678）
- Caddy 已安装并跑在宿主机（PID 89440），配置在 `/home/kuhnn/Caddyfile`
- Caddy 当前配置：`:443` + 自签证书 → `n8n-v2:5678`
- 用户没有 sudo 密码，无法用 `docker stop` 重建容器
- n8n-v2 直接访问 `http://192.168.1.x:5678` 或 `http://localhost:5678` 可以工作（不走 HTTPS 不触发 cookie 检查）

**结论：** 在用户获得 sudo 权限或配置域名之前，局域网内直接用 `http://IP:5678` 是唯一可用路径。
