Files

128 lines
10 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 2026-08-16
## Obsidian Web 版部署教程改稿
**项目**:`E:\svn\OSQY\如何搭建web版本obsidian`
**用户需求**:检查初稿部署方案的可行性 + 搜同类竞品文章对照改稿,做成爆款向。
**关键发现**:
- 初稿 Caddyfile 里**硬编码了 4 段真实 API 凭证**(阿里云 AccessKey、DNSPod Token、Cloudflare Token),已经提示用户必须去对应云厂商轮换
- 部署方案 3 个硬伤:reverse_proxy 用了 `localhost:88`(caddy 容器内的 localhost 指向自己)、HTTPS 端口映射成 `8001:443`(公网 443 访问失败)、basic_auth 哈希硬编码(人人密码一样)
- 缺 WS_ORIGINS、缺离线安装(国内服务器首启下载 Obsidian 会被墙)、缺 Caddy 固定镜像来源说明
**已交付**:
- `如何搭建web版本obsidian.md` 重写完毕,347 行
- 新结构:痛点 → 竞品对比 → 准备清单 → 6 步部署 → 踩坑/进阶 → FAQ → 结尾引导
- 镜像:使用官方 `nobbe/ignis:latest` + `caddy:2`,清华/阿里云镜像用户可自行替换
- 加了 Tailscale 替代方案(无公网 IP 场景)
**参考的同类文章**:
- 喵斯基部落 moewah.com(结构最好,参考了它的标题钩子和 FAQ 形式)
- yanh.tech(简洁的 docker-compose 编排)
- 飞牛俱乐部 fnnas.com(早期社区帖)
- jinli.io(VNC 方案对比)
- 官方仓库:Nystik-gh/ignis
**下次可继续**:
- 用户处理 4 段密钥轮换后,回填一份自己验证过的截图
- 考虑加一张架构图(docker-compose 启动后的网络拓扑)
- 写 Obsidian Git 自动备份的下篇
## 二次改稿(同日 17:42)
**用户新要求**:1) 默认假定无 80 端口;2) 突出主题、删非必要内容、精简。
**改动**:
- 证书改为 **DNS 验证(acme_dns)为主方案**,Caddyfile 全局块直接内置;compose 只映射 `443:443`,去掉 80
- Caddy 官方 `caddy:2` 镜像不带 DNS 插件 → 增加 `Dockerfile.caddy`(xcaddy 编译 alidns/dnspod/cloudflare 三模块),compose 改 `build:`;Cloudflare 用户可选现成 `caddy-dns/cloudflare`
- 全文 347 → 约 130 行:砍掉 5 方案对比表(压缩成 2 句)、环境变量大表、10 条 FAQ 砍到 3 个核心坑(证书失败/离线安装/无公网 IP)
- 保留:WS_ORIGINS、离线 .deb 安装、Tailscale、备份/升级一行带过
**教训**:中国用户服务器常见无 80 端口(运营商封锁),DNS 验证是默认正确姿势;官方 caddy 镜像无 DNS provider 插件是必讲的前提,否则读者直接抄配置会失败。
## 三次改稿(同日 17:48)
**用户提出新问题**:电信家庭网下入站 443 是否也被封?
**结论**:是。国内家庭宽带默认封入站 80/443,多数用户还没公网 IP(CGNAT)。acme_dns 只能解决证书签发(出站),解决不了外部访问(入站)。
**改动(已交付)**:文章主线改为 **frp 内网穿透 + 轻量云服务器**:
- 云服务器(有公网 IP):`snowdreamtech/frps`,host 网络监听 7000 + 443,`frps.toml`(bindPort/auth.token)
- 家里:原 ignis + caddy(acme_dns 证书不变,TLS 终止在家里)+ 新增 `snowdreamtech/frpc` 服务(host 网络,`frpc.toml` 把本地 443 转发到云服务器 443)
- 架构:浏览器 → 云服务器 443 → frp 隧道 → 家里 Caddy 443 → ignis:8080;家里不需要公网 IP 和任何入站端口
- 备选保留:无云服务器 → 非标端口 8443(acme_dns 不变)或 Tailscale
- 坑新增:安全组放行 7000/443、token 不一致、云服务器 443 被占、家里 443 被占可改 8443
- 篇幅约 185 行
## 四次改稿(同日 17:54):用户假定没有云主机
**用户选择**:主线改为**非标端口 8443**(零成本、直连家里、数据不出网;前提:有公网 IP + 8443 未被运营商封)。
**改动(已交付)**:
- 删除 frps/frpc 全部内容(云服务器步骤整个移除)
- Caddy 端口映射 `443:443` → `8443:443`;WS_ORIGINS 域名带 `:8443`
- 新增第 1 步「验证前提」:ip.sb 对光猫 WAN 口 IP 判断有无公网 IP(100.64~100.127 为 CGNAT);在线端口扫描测 8443 是否被封
- 新增第 5 步 DDNS:`jeessy/ddns-go` 容器(host 网络,web 配置 :9876),飞牛用户可用内置 DDNS(阿里云/腾讯云/花生壳/DuckDNS)
- 新增第 6 步:光猫/路由器端口转发 8443
- 备选(文末):Cloudflare Tunnel(零成本、无需公网 IP、自动 HTTPS、数据过 CF、国内速度一般)、Tailscale(纯自用)
- 坑新增:8443 也被封可换 9443 等、换 IP 后连不上(DDNS 未生效)
**飞牛相关事实**(搜索确认):飞牛 fnOS 内置 Docker Compose 支持 + 镜像加速(docker.ketches.cn)+ FN Connect(官方穿透,限速,只适合管 fnOS 界面)+ 内置 DDNS(仅阿里云/腾讯云/花生壳/DuckDNS,无 DNSPod/CF)。ignis 镜像注意 x86/ARM 架构。
## 五次改稿(同日 18:00):端口 8443 → 666
**用户判断**:8443 属于常见端口、部分城市在封锁列表;666 冷门端口大概率不封。
**改动(已交付)**:全文所有 8443 替换为 666(标题、架构图、compose 映射 `666:443`、WS_ORIGINS 带 `:666`、端口转发、访问地址、坑/备选标题);被封端口列表恢复为 8080/8443/8888 并加说明"666 冷门端口大概率没事";备选端口 9443 → 6666;新增一条低端口提示(<1024,rootless Docker 需 `sysctl net.ipv4.ip_unprivileged_port_start=0`)。
## 六次改稿(同日 18:06):DDNS 并入 Caddy,删除 ddns-go
**用户需求**:DDNS 能否也用 Caddy 完成,简化部署步骤。
**查证结论**:`github.com/mholt/caddy-dynamicdns`(Caddy 作者 Matt Holt 写的 app 模块,2026-08 仍在活跃维护)可完全替代 ddns-go:
- xcaddy 加 `--with github.com/mholt/caddy-dynamicdns` 即可,复用文章已编译的 caddy-dns provider(alidns/dnspod/cloudflare)
- Caddyfile 全局块 `dynamic_dns { provider alidns {...} domains { example.cc ob } versions ipv4 ip_source simple_http https://api.ipify.org }`
- 默认 30 分钟查一次公网 IP,变化时更新 A 记录;dynamic_domains 可自动收集站点域名(本文用显式 domains 更稳)
- 注意:ACME 的 `acme_dns alidns` 是内建指令,与 dynamic_dns 用的 caddy-dns provider 是两套模块体系,Token 会写两遍(可改用 {env.XXX})
**改动(已交付)**:Dockerfile.caddy 加 dynamicdns 模块;compose 删 ddns-go 服务(3 容器→2 容器);Caddyfile 全局块加 dynamic_dns;删第 5 步"配置 DDNS",步骤重排为 6 步;常见坑改为查 `docker compose logs caddy | grep -i dynamic_dns`;Cloudflare 现成镜像提示改为"不含 dynamic_dns 模块"的警告。
## 七次改稿(同日 18:11):改用现成国内镜像 xm798/caddy:plus
**用户需求**:caddy-dynamicdns 有没有现成的国内镜像?
**查证结论**:
- 官方无预编译镜像(dynamic_dns 是 Non-standard 模块,官方只提供 xcaddy 自建)
- **`xm798/caddy:plus`**(国内作者,Docker Hub + 阿里云 `registry.cn-shanghai.aliyuncs.com/xm798/caddy:plus`,README 官方推荐国内直拉):普通版含 alidns/dnspod/cloudflare/tencentcloud,plus 版再加 replace-response + **mholt/caddy-dynamicdns**
- **坑**:Caddy 2.10 后 libdns 升 1.0,dnspod 插件未适配,作者 2025-06 已从最新构建移除 dnspod → 用现成镜像时 DNSPod 不可用,需用腾讯云 tencentcloud 替代(`acme_dns tencentcloud <SecretId>,<SecretKey>`)
- 其他社区镜像(serfriz/caddy-*、vnxme/caddy)只含单 provider,且无国内镜像
**改动(已交付,用户选"现成镜像为主、自建作备选")**:
- compose 主线:`build:` → `image: registry.cn-shanghai.aliyuncs.com/xm798/caddy:plus`
- 第 2 步 hash-password 镜像同步改为国内地址(原 `caddy:2` 国内也可能拉不动)
- Caddyfile 注释:DNSPod → 腾讯云(两处:acme_dns + dynamic_dns provider)
- 准备表格 DNS 服务商:阿里云/腾讯云/Cloudflare,DNSPod 用户指到文末自建备选
- 文末新增「备选:自建 Caddy」(原 Dockerfile.caddy + build: 回退写法 + DNSPod 语法 + `ENV GOPROXY=https://goproxy.cn,direct` 国内编译加速)
- 全文镜像拉取全部走国内地址
## 八次改稿(同日 18:14):ignis 也换国内镜像
**用户需求**:ignis 也改成国内镜像。
**查证**:本机 Docker 27.1.1 实测——Docker Hub 直连 000(连接失败,复现读者痛点);探测 6 个加速站对 `nobbe/ignis` 的 manifest 可用性:`docker.1panel.live` **200 且 tags 完整(0.8.0~0.8.9+latest)**;daocloud/1ms.run 401(无此镜像或需认证)、xuanyuan 429 限流、dockerpull.pw 000 不可达、rat.dev 302。
**改动(已交付)**:compose 里 `nobbe/ignis:latest` → `docker.1panel.live/nobbe/ignis:latest`(注释保留原版名);第 9 行项目说明同步;compose 提示区加一条"拉不动时换其他加速站前缀或配加速器后用原版名"。全文镜像现在全部国内直拉(caddy: registry.cn-shanghai.aliyuncs.com/xm798/caddy:plus,ignis: docker.1panel.live/nobbe/ignis:latest)。
## 九次改稿(同日 18:17):面向网络传播的整体优化
**用户需求**:重新整理全文优化内容和标题,使文章更适合网络传播。
**改动(已交付)**:技术内容/命令/配置一字未动,重排结构与文案:
- 标题改为爆款向:「没有官方网页版?30 分钟自建一个 Web 版 Obsidian」+ 收益型副标题(免费/私有/带密码/不用买云服务器/封 80/443 不影响)
- 新增「先看痛点」:出差没带电脑/公司电脑不让装/平板随手记 三场景代入
- 新增「你能得到什么」表:时间 30 分钟、成本 0 元、2 容器、数据 100% 在家、前提不满足有备选
- 小标题全部口语化+承诺化:「开工前,备好这 5 样东西」「部署:6 步,30 分钟」「常见坑(先看这里,能省一小时)」「启动!看到登录页就成功了」
- 结尾改为「写在最后」:评论互动引导(卡住留言补坑)+ 点赞收藏转发 + 下篇预告强化
- 约 268 行,结构与字数基本持平,传播性增强