Compare commits

...

10 Commits

Author SHA1 Message Date
kurihada 106049be04 rename: kb → notebook,更新所有文档引用和 Caddy 挂载路径 2026-06-04 12:16:44 +08:00
kurihada 0a88970c90 fix: 修复元数据栏 FOUC — CSS 移到模板顶部避免样式延迟加载 2026-06-04 12:06:34 +08:00
kurihada c4058528fc feat: 文章顶部自动显示元数据栏(创建日期、更新日期、字数、阅读时间)
- 安装 mkdocs-git-revision-date-localized-plugin,自动提取 git 提交日期
- 覆盖 content.html,在标题下方注入元数据栏
- JavaScript 自动统计中英文字数并估算阅读时间(400 字/分钟)
- 适配 Material SPA 导航 (document$.subscribe),页面切换时自动更新
- 深色模式兼容
2026-06-04 12:04:13 +08:00
kurihada 88967a238f fix: 全面修订技术文档 — 修复 P0/P1/P2 共 16 项审查问题
P0(必须修复):
- 技术/index.md: Web 服务 NPM → Caddy,补充服务列表和域名
- 旁路由部署.md: VPS OS CentOS → Debian,补全安装命令
- 旁路由部署.md: 新增 systemd-resolved DNS 端口冲突解决步骤
- mkdocs.yml: 删除冗余 index.md 子项,空分类用简单链接
- artalk评论系统.md: docker-compose.yml 补全环境变量

P1(建议修复):
- Linux.md: 区分旁路由本机 vs 局域网其他机器两种场景
- Android.md: 移除不支持的 Clash Meta,添加私人 DNS 冲突警告
- macOS.md: 终端命令补注视说明占位符需替换
- 旅行/index.md: 添加赛里木湖 2026 游记链接
- mkdocs部署.md: 补充 Docker 网络创建、首次启动、LE 邮箱配置
- artalk评论系统.md: 修正环境变量与配置文件矛盾说明

P2(优化):
- 首页: 添加评论区说明、修正 Immich 链接为公网域名
- 旁路由部署.md: 加固有章节目录(无锚点纯文本)
- 摄影/3D打印/日记 index.md: 充实引导内容
- 新增 Immich 部署文档
- 统一 callout 风格: ?> 改为 !!! tip
- GitHub Stars 加时间限定 (截至 2026 年 6 月)
2026-06-04 11:58:36 +08:00
kurihada 155b347d3f docs: 新增 MkDocs 部署文档
涵盖 MkDocs Material 配置、构建流程、Caddy Docker 部署、完整工作流和维护指南
2026-06-04 11:46:27 +08:00
kurihada 7724af96f5 docs: 添加 Artalk 技术选型对比
对比 Artalk/Waline/Twikoo,说明选择 Artalk 的原因:Go 后端省资源、SQLite 零维护、中文社区强
2026-06-04 11:44:27 +08:00
kurihada a9aeb5809d docs: 完善 Artalk 部署文档 — 添加踩坑笔记和管理员创建说明
- 新增踩坑笔记: Caddy handle_path 通配符、bcrypt 兼容性、配置文件权限
- 强调推荐使用 Artalk CLI 创建管理员而非手动写哈希
2026-06-04 11:42:48 +08:00
kurihada 0b962eb2f0 docs: 更新 Artalk 部署文档 — Caddy 替代 Nginx
- 架构图更新为 Caddy
- 反代配置更新为 handle_path /artalk* 模式
- 更新实际部署路径和数据备份命令
- 修正 docker-compose.yml 网络配置
2026-06-04 11:15:19 +08:00
kurihada 017daeea14 feat: 集成 Artalk 自托管评论系统
- 新增 docs/overrides/partials/comments.html,Material 主题评论覆盖
- mkdocs.yml 添加 custom_dir: docs/overrides
- 首页添加 comments: false 关闭评论
- 新增 Artalk 部署文档(Docker + Nginx 反代 + 初始化指南)
- 技术 index 添加 Artalk 文档链接
- mkdocs.yml nav 添加 Artalk 评论系统入口
2026-06-04 10:54:23 +08:00
kurihada 00a355e1e9 iPhone 使用指南只推荐 Shadowrocket,移除 Hiddify Next 2026-06-04 10:28:14 +08:00
19 changed files with 892 additions and 68 deletions
+3 -3
View File
@@ -1,8 +1,8 @@
# CLAUDE.md — kb 维护说明
# CLAUDE.md — notebook 维护说明
## ⚠️ 最重要:敏感信息
kb 内容会被部署到公网,**禁止包含任何敏感信息**,包括但不限于:
知识库内容会被部署到公网,**禁止包含任何敏感信息**,包括但不限于:
- 公网 IP 地址
- 密码、API Key、Token
- 加密密钥(私钥、公钥、UUID、ShortID 等)
@@ -36,6 +36,6 @@ kb 内容会被部署到公网,**禁止包含任何敏感信息**,包括但
## 每次编辑后
```bash
cd ~/kb && mkdocs build # 重新构建 site/
cd ~/notebook && mkdocs build # 重新构建 site/
git add -A && git commit -m "描述改动"
```
+7 -3
View File
@@ -11,9 +11,13 @@
## 📦 模型 & 项目
> 还没有内容。看到感兴趣的模型、打印了什么东西,可以告诉 Claude 帮你记录
>
> 比如:「帮我在 3D打印里加一条,打印了 Genji 盔甲模型,链接是...,参数是...」
> 还没有内容,待补充。计划记录
> - 已打印模型列表(名称、链接、耗材、耗时)
> - 打印参数优化笔记(层高、温度、回抽、支撑)
> - 耗材测试记录(PLA / PETG / ABS 不同品牌对比)
> - Bambu Lab A1 维护日志
看到感兴趣的模型、打印了什么东西,可以告诉 Claude 帮你记录。
---
+15 -2
View File
@@ -1,3 +1,7 @@
---
comments: false
---
# 🏠 我的知识库
欢迎!这里是我(kurihada)的个人知识内容存储。
@@ -18,14 +22,23 @@
## 🔗 快捷入口
- **照片管理**[Immich](http://localhost:2283)(AI 标签、人脸识别、RAW 预览)
- **照片管理**[Immich](https://photo.kurihada.com)(AI 标签、人脸识别、RAW 预览)
- **大疆素材**`~/action5pro/`
- **RAW 原片**`~/aa/`
---
## 💬 反馈
页面底部有评论区([Artalk](技术/artalk评论系统.md) 自托管),欢迎对内容进行提问、补充或指正。
可以使用顶部搜索栏(右上角 🔍)快速查找内容。
---
## 🛠 本站说明
- 基于 [MkDocs Material](https://squidfunk.github.io/mkdocs-material/) 构建
- 所有内容为纯 Markdown 文件,存储在 `~/kb/docs/`
- 所有内容为纯 Markdown 文件,存储在 `~/notebook/docs/`
- Claude 协助维护和更新内容
- 评论系统 [Artalk](技术/artalk评论系统.md) 自托管,数据存储在本站服务器
+34
View File
@@ -0,0 +1,34 @@
{#-
Artalk 评论系统集成
通过 Material 主题的 comments 块覆盖实现
如需关闭某页面的评论,在页面 frontmatter 中设置 comments: false
-#}
{% if page.meta.comments is not defined or page.meta.comments %}
<div id="artalk-comments"></div>
<link href="/artalk/dist/Artalk.css" rel="stylesheet">
<script src="/artalk/dist/Artalk.js"></script>
<script>
document.addEventListener('DOMContentLoaded', function() {
var isDark = document.documentElement.getAttribute('data-md-color-scheme') === 'slate'
Artalk.init({
el: '#artalk-comments',
site: '我的知识库',
server: window.location.origin + '/artalk',
pageKey: window.location.pathname.replace(/\/$/, ''),
pageTitle: document.title,
darkMode: isDark
})
// 跟随 MkDocs Material 深色模式切换
var observer = new MutationObserver(function(mutations) {
mutations.forEach(function(mutation) {
var scheme = document.documentElement.getAttribute('data-md-color-scheme')
var dark = scheme === 'slate'
if (Artalk.darkMode !== dark) Artalk.setDarkMode(dark)
})
})
observer.observe(document.documentElement, { attributes: true, attributeFilter: ['data-md-color-scheme'] })
})
</script>
{% endif %}
+92
View File
@@ -0,0 +1,92 @@
{#-
Override Material theme content partial
Adds page metadata bar: creation date, update date, word count, reading time
-#}
{#- CSS must be first to prevent FOUC #}
<style>
.md-page-metadata {
display: flex;
flex-wrap: wrap;
gap: 0.5rem 1.5rem;
margin: 0 0 1.5rem 0;
padding-bottom: 0.75rem;
border-bottom: 1px solid var(--md-default-fg-color--lightest);
font-size: 0.7rem;
color: var(--md-default-fg-color--light);
}
.md-page-metadata__item {
display: inline-flex;
align-items: center;
gap: 0.2rem;
white-space: nowrap;
}
.md-page-metadata__item .twemoji {
width: 0.9rem;
height: 0.9rem;
}
.md-page-metadata__item .twemoji svg {
width: 100%;
height: 100%;
}
#word-count-value, #reading-time-value {
font-variant-numeric: tabular-nums;
}
</style>
{% include "partials/tags.html" %}
{% include "partials/actions.html" %}
{% if "<h1" not in page.content %}
<h1>{{ page.title | d(config.site_name, true)}}</h1>
{% endif %}
{#- Metadata bar #}
{% if page.meta and (page.meta.git_revision_date_localized or page.meta.git_creation_date_localized) %}
<div class="md-page-metadata">
<span class="md-page-metadata__item">
<span class="twemoji">{% include ".icons/material/calendar-plus.svg" %}</span>
创建:{{ page.meta.git_creation_date_localized }}
</span>
<span class="md-page-metadata__item">
<span class="twemoji">{% include ".icons/material/calendar-edit.svg" %}</span>
更新:{{ page.meta.git_revision_date_localized }}
</span>
<span class="md-page-metadata__item" id="word-count">
<span class="twemoji">{% include ".icons/material/text-short.svg" %}</span>
字数:<span id="word-count-value"></span>
</span>
<span class="md-page-metadata__item" id="reading-time">
<span class="twemoji">{% include ".icons/material/clock-outline.svg" %}</span>
阅读:<span id="reading-time-value"></span>
</span>
</div>
{% endif %}
{{ page.content }}
{% include "partials/source-file.html" %}
{% include "partials/feedback.html" %}
{% include "partials/comments.html" %}
{#- Word count & reading time script (SPA-aware) #}
<script>
function updateMeta() {
var article = document.querySelector('.md-content__inner') || document.querySelector('.md-content');
if (!article) return;
var text = article.textContent || '';
var chineseChars = (text.match(/[一-鿿㐀-䶿]/g) || []).length;
var englishWords = text.replace(/[一-鿿㐀-䶿]/g, ' ')
.split(/\s+/)
.filter(function(w) { return w.length > 0; }).length;
var totalWords = chineseChars + englishWords;
var minutes = Math.max(1, Math.round(totalWords / 400));
var wordEl = document.getElementById('word-count-value');
var timeEl = document.getElementById('reading-time-value');
if (wordEl) wordEl.textContent = totalWords.toLocaleString();
if (timeEl) timeEl.textContent = minutes + ' 分钟';
}
if (typeof document$ !== 'undefined') {
document$.subscribe(function() { updateMeta(); });
} else {
document.addEventListener('DOMContentLoaded', updateMeta);
}
</script>
+269
View File
@@ -0,0 +1,269 @@
# Artalk 评论系统部署
> 为知识库接入自托管评论系统。Artalk v2.9.1Go 后端 + SQLiteDocker 一键部署,前端 ~40KB,完全自托管无外部依赖。
---
## 技术选型
### 需求约束
- **自托管**:不能依赖第三方 SaaS(如 Giscus、Disqus),数据在自己服务器上
- **无需 GitHub 账号**:读者不应被强制要求 GitHub 登录
- **轻量**:服务器资源有限,不能上 PostgreSQL 等重型依赖
- **中文友好**:面向中文用户
对比了 3 款主流的自托管评论系统(数据截至 2026 年 6 月):
| | Artalk | Waline | Twikoo |
|------|:---:|:---:|:---:|
| 后端语言 | **Go** | Node.js | Node.js |
| 数据库 | **SQLite**(嵌入式) | SQLite | 嵌入式文件 DB |
| Docker 镜像 | **~20MB** | ~150MB | ~120MB |
| 内存占用 | **~30MB** | ~100-150MB | ~100MB |
| 前端大小 | **~40KB** | ~60KB | ~50KB |
| 中文支持 | 一级 | 一级 | 一级 |
| GitHub Stars | 2.3k | 1.8k | 1.5k |
| 管理后台 | 侧边栏集成 | 独立后台 | 独立后台 |
| 邮件通知 | ✅ | ✅ | ✅ |
| 验证码 | ✅ 图片验证 | ✅ | ✅ |
| 社交登录 | ✅ 多平台 | ✅ | ✅ |
| 图片上传 | ✅ | ✅ | ✅ |
| Markdown | ✅ | ✅ | ✅ |
| 多站点 | ✅ | ✅ | ✅ |
### 为什么选 Artalk
1. **Go 后端最省资源**Artalk 是唯一用 Go 写的,Docker 镜像只有 ~20MB,运行时内存 ~30MB。Waline 和 Twikoo 都是 Node.js,内存占用 3-5 倍
2. **SQLite 零维护**:不需要单独跑数据库容器,数据就是一个文件,备份只需 `cp` 一下
3. **中文社区最强**:开发者是中国人,文档完整,中文 issue 响应快
4. **前端最轻**:~40KB 的 JS,对页面加载速度几乎没有影响
Walie 和 Twikoo 也都是优秀项目,功能丰富度甚至略超 Artalk。但 知识库这种低流量个人站点,**省资源 + 零维护**的优先级远高于功能数量,Artalk 最合适。
---
## 架构
```mermaid
graph LR
Browser["浏览器"]
Caddy["Caddy"]
MkDocs["MkDocs 静态文件"]
Artalk["Artalk Docker<br/>:23366"]
SQLite[("SQLite<br/>/data")]
Browser --> Caddy
Caddy -->|"/"| MkDocs
Caddy -->|"/artalk* → strip prefix"| Artalk
Artalk --> SQLite
```
- Artalk 后端和 知识库站点部署在同一台服务器
- Caddy 将 `/artalk*` 路径反代到 Artalk 容器(自动去除 `/artalk` 前缀)
- 前端 JS/CSS 同域加载 `/artalk/dist/`,完全自托管无跨域问题
---
## 一、Docker 部署
### 1.1 实际部署位置
```bash
~/docker/artalk/
├── docker-compose.yml
└── data/
├── artalk.db # SQLite 数据库
├── artalk.yml # 配置文件
└── artalk.log # 日志
```
### 1.2 docker-compose.yml
```yaml
services:
artalk:
image: artalk/artalk-go
container_name: artalk
restart: unless-stopped
volumes:
- ./data:/data
environment:
- TZ=Asia/Shanghai
- ATK_LOCALE=zh-CN
- ATK_SITE_DEFAULT=我的知识库
- ATK_SITE_URL=https://note.kurihada.com
- ATK_TRUSTED_DOMAINS=https://note.kurihada.com
networks:
- nginx
networks:
nginx:
external: true
```
> 注意:需要加入 `nginx` 网络以便 Caddy 能通过容器名 `artalk` 访问。`ATK_TRUSTED_DOMAINS` 限制允许跨域请求的域名,防止 CSRF。
### 1.3 启动
```bash
cd ~/docker/artalk && docker compose up -d
```
---
## 二、Caddy 反向代理
Caddyfile 配置(`~/docker/caddy/Caddyfile`):
```caddy
note.kurihada.com {
handle_path /artalk* {
reverse_proxy artalk:23366
}
handle {
root * /srv/mkdocs
file_server
}
}
```
- `handle_path /artalk*`:匹配 `/artalk` 开头的路径,**自动去除 `/artalk` 前缀**后转发
- 例如 `/artalk/dist/Artalk.js` → Artalk 收到 `/dist/Artalk.js`
- `handle { ... }` 包裹 `file_server`,保证与 `handle_path` 互斥不冲突
修改后重载:`docker restart caddy`
---
## 三、初始化 Artalk
### 3.1 创建管理员
**推荐方式(交互式):**
```bash
docker exec -it artalk ./artalk admin
```
按提示输入用户名、邮箱、密码即可。Artalk 自己生成 bcrypt 哈希,不会出现兼容性问题。
> ⚠️ 不建议手动在 `artalk.yml` 中写 bcrypt 哈希。Python 等工具生成的 `$2b$` 格式与 Go 的 `$2a$` 不完全兼容,会导致密码验证失败。
### 3.2 关键配置文件
Artalk 配置文件位于 `~/docker/artalk/data/artalk.yml`,需确保以下两项正确:
```yaml
site_default: 我的知识库
site_url: "https://note.kurihada.com"
```
修改后 `docker restart artalk` 生效。
---
## 四、MkDocs 端运作方式
kb 已通过 Material 主题的 `custom_dir` 机制集成了 Artalk 前端。
### 关键文件
- **覆盖模板**`docs/overrides/partials/comments.html` — Artalk JS/CSS 引入 + 初始化
- **CSS/JS 路径**`/artalk/dist/Artalk.css``/artalk/dist/Artalk.js`(同域加载)
- **API 地址**`window.location.origin + '/artalk'`(自动适配当前域名)
### 关闭特定页面评论
`.md` 文件头部添加 frontmatter
```yaml
---
comments: false
---
```
### 深色模式
Artalk 通过 MutationObserver 监听 Material 主题的 `data-md-color-scheme` 属性变化,自动跟随切换。
---
## 五、日常管理
```bash
# 查看日志
docker logs artalk -f
# 重启
docker restart artalk
# 升级
cd ~/docker/artalk && docker compose pull && docker compose up -d
# 备份数据
cp ~/docker/artalk/data/artalk.db ~/backup/artalk-$(date +%Y%m%d).db
```
### 查看 Artalk 配置
访问 `https://note.kurihada.com/artalk/api/v2/conf` 查看当前前端配置。
---
## 六、可选配置
### 邮件通知
编辑 `~/docker/artalk/data/artalk.yml`,配置 SMTP
```yaml
email:
enabled: true
send_type: smtp
send_name: "{{reply_nick}}"
send_addr: noreply@example.com
smtp:
host: smtp.qq.com
port: 587
username: example@qq.com
password: ""
```
然后 `docker restart artalk`
### 验证码
默认已启用图片验证码(`captcha.captcha_type: image`),评论 3 次后触发。
### 社交登录
配置 `auth` 段可启用 GitHub/Gitea/Google 等社交账号登录,参见 [Artalk 文档](https://artalk.js.org/guide/backend/auth.html)。
---
## 七、踩坑笔记
### Caddy `handle_path` 必须带 `*` 通配符
`handle_path /artalk` 只匹配确切路径 `/artalk`,不匹配 `/artalk/xxx`。必须写成 `handle_path /artalk*`
排查方法:`docker exec caddy caddy adapt --config /etc/caddy/Caddyfile` 查看生成的 JSON,看 `match.path` 是否包含了通配符。
### 管理员密码不要手动写 bcrypt 哈希
Python 生成的 `$2b$` bcrypt 哈希与 Go 的 `$2a$` 格式不完全兼容,直接写入 `artalk.yml` 可能导致密码验证失败。
正确做法是用 Artalk 自带的 CLI 创建:
```bash
docker exec -it artalk ./artalk admin
```
### 配置文件权限问题
`artalk.yml` 由 Docker 挂载后属主为 root,本地编辑需 `sudo`。修改后需 `docker restart artalk` 才能生效。
### 环境变量与配置文件的关系
Artalk 2.9.x 中环境变量和 `artalk.yml` 均可生效。当前部署两种方式同时使用,`ATK_SITE_DEFAULT``ATK_SITE_URL` 在 docker-compose.yml 中设置,同时也直接写入了 `artalk.yml`。修改配置时建议**两边保持一致**,避免排查困难。
+70
View File
@@ -0,0 +1,70 @@
# Immich 照片管理
> 自托管照片管理服务,支持 AI 标签、人脸识别、RAW 预览、多用户。域名 `photo.kurihada.com`。
---
## 架构
Immich 由 4 个容器组成,部署在 `~/docker/immich/`
| 容器 | 镜像 | 说明 |
|------|------|------|
| immich_server | ghcr.io/immich-app/immich-server | 主服务 + API |
| immich_postgres | pgvector/pgvector | 数据库(PostgreSQL + pgvector |
| immich_redis | valkey/valkey | 缓存 |
| immich_machine_learning | ghcr.io/immich-app/immich-machine-learning | AI 智能搜索/人脸识别 |
通过 Caddy 反代 `photo.kurihada.com → immich_server:2283`
---
## 日常管理
```bash
# 查看状态
cd ~/docker/immich && docker compose ps
# 查看日志
docker logs immich_server -f
# 更新
docker compose pull && docker compose up -d
# 完整重启
docker compose down && docker compose up -d
```
---
## 存储
| 内容 | 路径 |
|------|------|
| 照片库 | `~/docker/immich/library/` |
| 数据库 | PostgreSQL(容器内) |
| 外部库(RAW | `~/aa/`(只读挂载,Immich 索引访问) |
---
## 备份
```bash
# 备份照片库
rsync -av ~/docker/immich/library/ /backup/immich-library/
# 备份数据库(推荐用 pg_dump)
docker exec immich_postgres pg_dump -U postgres immich > /backup/immich-db-$(date +%Y%m%d).sql
```
---
## 更新
Immich 发版频繁(~每月),更新前务必查看 [Release Notes](https://github.com/immich-app/immich/releases) 了解破坏性变更。
```bash
cd ~/docker/immich
docker compose pull
docker compose up -d
```
+20 -11
View File
@@ -8,7 +8,8 @@
|------|------|
| 系统 | Ubuntu 24.04, 16 核, 12GB RAM |
| 存储 | 1TB NVMe SSD(后续加机械硬盘) |
| Web 服务 | Nginx Proxy Manager (Docker) |
| 反向代理 | Caddy (Docker) |
| Docker 网络 | `nginx`(所有服务加入此网络互通) |
| 内网穿透 | frpc |
| 照片管理 | Immich |
| 知识库 | MkDocs Material |
@@ -17,18 +18,26 @@
## 📋 服务列表
| 服务 | 说明 |
|------|------|
| Immich | 照片/视频管理 + AI 标签 |
| Immich API | Immich 后端 API |
| Nginx Proxy Manager | 反向代理管理面板 |
| Gitea | 自托管 Git 服务 |
| Minio | S3 兼容对象存储 |
| Java app.jar | Spring Boot 应用 |
| Java auth-backend | 认证后端 |
所有公网流量经 Caddy(TLS 终结)转发到各后端服务。
| 服务 | 域名 | 说明 |
|------|------|------|
| Caddy | — | 反向代理,自动 Let's Encrypt TLS |
| MkDocs | [note.kurihada.com](https://note.kurihada.com) | 知识库(本页面) |
| Artalk | 同域 `/artalk/` | 评论系统 |
| Immich | [photo.kurihada.com](https://photo.kurihada.com) | 照片/视频管理 + AI 标签 |
| Gitea | [git.kurihada.com](https://git.kurihada.com) | 自托管 Git 服务 |
| MinIO | [minio.kurihada.com](https://minio.kurihada.com) | S3 兼容对象存储 |
| Alist | [pan.kurihada.com](https://pan.kurihada.com) | 网盘文件管理 |
| Vaultwarden | [pass.kurihada.com](https://pass.kurihada.com) | 密码管理器 |
| WordPress | [www.kurihada.com](https://www.kurihada.com) | 博客 |
---
## 📝 技术笔记
- [旁路由 + 去广告 部署](旁路由部署.md) — sing-box + AdGuard Home 旁路由架构、配置路径、已知问题
- [MkDocs 知识库部署](mkdocs部署.md) — MkDocs Material 构建 + Caddy 静态文件服务
- [Artalk 评论系统](artalk评论系统.md) — 自托管评论系统,Docker 部署 + MkDocs 集成
- [Immich 照片管理](immich部署.md) — 自托管照片服务,AI 标签 + 人脸识别
- [旁路由部署](旁路由部署.md) — sing-box + AdGuard Home 架构、部署、踩坑笔记
- [旁路由使用指南](旁路由使用/Linux.md) — 各平台客户端配置(Linux / Windows / macOS / Android / iPhone
+224
View File
@@ -0,0 +1,224 @@
# MkDocs 知识库部署
> `note.kurihada.com` — 基于 MkDocs Material 的个人知识库,Caddy 静态文件服务。
---
## 架构
```mermaid
graph LR
Repo["~/notebook Git 仓库"]
Build["mkdocs build"]
Site["kb/site/ 静态文件"]
Caddy["Caddy Docker<br/>caddy:alpine"]
Browser["浏览器<br/>note.kurihada.com"]
Repo --> Build --> Site -->|"bind mount :ro"| Caddy --> Browser
```
整个流程:编辑 Markdown → `mkdocs build` 生成静态文件 → Caddy 直接 serve。
---
## 一、MkDocs 配置
### 1.1 mkdocs.yml 要点
```yaml
site_name: 我的知识库
theme:
name: material
language: zh
features:
- navigation.instant # SPA 即时加载
- navigation.tabs # 顶部标签
- navigation.indexes # 分类文件夹可点击
- search.suggest # 搜索建议
- content.code.copy # 代码块复制按钮
custom_dir: docs/overrides # Artalk 评论等自定义模板
markdown_extensions:
- pymdownx.superfences: # Mermaid 流程图支持
custom_fences:
- name: mermaid
class: mermaid
format: !!python/name:pymdownx.superfences.fence_code_format
```
### 1.2 目录结构
```
~/notebook/
├── mkdocs.yml # 站点配置
├── docs/ # Markdown 源文件
│ ├── index.md
│ ├── overrides/ # 主题覆盖(评论系统等)
│ │ └── partials/
│ │ └── comments.html
│ ├── 技术/
│ ├── 旅行/
│ ├── 摄影/
│ ├── 3D打印/
│ └── 日记/
├── site/ # 构建输出(.gitignore 忽略)
└── .gitignore
```
---
## 二、构建
### 2.1 本地构建
```bash
cd ~/notebook && mkdocs build
```
输出到 `site/` 目录,耗时 < 1 秒。
### 2.2 本地预览
```bash
mkdocs serve -a 0.0.0.0:8000
```
浏览器打开 `http://localhost:8000`,修改 Markdown 后自动刷新。
### 2.3 Git 工作流
```bash
cd ~/notebook
mkdocs build # 构建
git add -A
git commit -m "描述改动" # 提交 Markdown 源码
```
> `site/` 已在 `.gitignore` 中忽略,只提交 Markdown 源文件。
---
## 三、Caddy 部署
### 3.1 前置:创建 Docker 网络
```bash
docker network create nginx
```
所有通过 Caddy 反代的服务都加入 `nginx` 网络,容器间通过容器名互相访问。
### 3.2 docker-compose.yml
Caddy 部署在 `~/docker/caddy/`
```yaml
services:
caddy:
image: caddy:alpine
container_name: caddy
restart: unless-stopped
networks:
- nginx
ports:
- "80:80"
- "443:443"
volumes:
- ./Caddyfile:/etc/caddy/Caddyfile:ro
- ./data:/data # TLS 证书存储
- /home/kurihada/notebook/site:/srv/mkdocs:ro # kb 静态文件
networks:
nginx:
external: true
```
### 3.3 首次启动
```bash
cd ~/docker/caddy && docker compose up -d
```
启动前确认 `~/notebook/site/` 目录存在(需先执行过 `mkdocs build`),否则 bind mount 会创建一个空目录导致 404。
### 3.4 Caddyfile 中 kb 的配置
Caddyfile 开头有全局块配置 Let's Encrypt 通知邮箱:
```caddy
{
email kurihada@qq.com
}
```
kb 站点的配置:
```caddy
note.kurihada.com {
handle_path /artalk* {
reverse_proxy artalk:23366
}
handle {
root * /srv/mkdocs
file_server
}
}
```
列一下关键点:
- `root * /srv/mkdocs` — 指向挂载进来的 `site/` 目录
- `handle_path /artalk*` — Artalk 评论系统反代(详见 [Artalk 部署文档](artalk评论系统.md)
- `handle { ... }` — 包裹 `file_server`,保证和 `handle_path` 互斥
- Caddy 自动申请和续期 Let's Encrypt TLS 证书,无需额外配置
### 3.5 部署后重载
修改 Caddyfile 后重载(两种方式):
```bash
docker restart caddy # 简单粗暴,短暂中断
docker exec caddy caddy reload --config /etc/caddy/Caddyfile # 零停机
```
---
## 四、完整工作流
```
1. 编辑 docs/ 下的 Markdown
2. mkdocs build # 生成 site/
3. git add -A && git commit # 提交源码
4. (无需重启 Caddy) # site/ 通过 bind mount 实时生效
```
> 因为 Caddy 通过 `bind mount` 直接读取 `~/notebook/site/``mkdocs build` 后变更即时生效,无需重启任何服务。
---
## 五、维护
### 升级 MkDocs Material
```bash
pip install --upgrade mkdocs-material
mkdocs build # 确认构建无报错
```
### 检查构建状态
```bash
cd ~/notebook && mkdocs build --verbose
```
### DNS 与 TLS
- DNS`note.kurihada.com` A 记录指向服务器 IP
- TLSCaddy 自动通过 Let's Encrypt 申请,90 天自动续期
- 证书存储:`~/docker/caddy/data/`
### Caddy 日志
```bash
docker logs caddy | grep note.kurihada.com
```
+13 -6
View File
@@ -27,7 +27,7 @@
4. 保存
?> 不同 Android 厂商设置路径略有差异,核心就是 WiFi → 高级 → 静态 IP + 手动代理。
!!! tip "不同 Android 厂商设置路径略有差异,核心就是 WiFi → 高级 → 静态 IP + 手动代理。切换静态 IP 时,**IP 地址/网关/子网掩码保持 DHCP 分配的值不变**,只修改 DNS 字段。"
---
@@ -37,11 +37,12 @@
### 推荐 App
| App | 价格 | 说明 |
|-----|:---:|------|
| **Hiddify Next** | 免费 | 开源,支持 VLESS Reality |
| **v2rayNG** | 免费 | 老牌客户端,功能全面 |
| **Clash Meta** | 免费 | 规则灵活 |
| App | 价格 | VLESS Reality |
|-----|:---:|:---:|
| **Hiddify Next** | 免费 | 支持 |
| **v2rayNG** | 免费 | 支持 |
> Clash Meta 虽然规则灵活,但**不支持 VLESS Reality**,不适合此旁路由架构。
### 配置方法
@@ -75,6 +76,12 @@
有些 app(如银行类)不走系统代理。可以在 Hiddify Next 等 App 中使用 **VPN 模式**,接管全部流量。
### DNS 去广告不生效?
Android 9+ 有「私人 DNS」(DNS-over-TLS)功能,开启后会**覆盖 WiFi 的 DNS 设置**,导致 AdGuard Home 被绕过。
检查路径:**设置 → 连接 → 更多连接设置 → 私人 DNS → 设为关闭**
### 出门时无法连接 VPS
1. 检查 VPS 是否在线
+47 -5
View File
@@ -6,9 +6,13 @@
## 接入旁路由
### 系统代理(GNOME
根据你的 Linux 机器是不是旁路由本身,选择对应的配置方式。
1. 打开 **设置 → 网络 → 代理**
### 场景 A:这台 Linux 就是旁路由
本机已运行 sing-box + AdGuard HomeDNS 和代理指向自己即可。
1. 打开 **设置 → 网络 → 代理**GNOME)或者用 NetworkManager 命令行
2. 选择 **手动**
3. 填写:
@@ -17,14 +21,51 @@
| SOCKS 代理 | `127.0.0.1` |
| 端口 | `7890` |
?> DNS 会自动使用 AdGuard因为旁路由本机 DNS 已设为 `127.0.0.1`
!!! tip "DNS 会自动使用 AdGuard(旁路由本机 DNS 已设为 `127.0.0.1`,无需额外配置。"
### 终端代理(可选)
### 场景 B:这台 Linux 是局域网内其他机器
DNS 和代理都需要指向旁路由 IP。
#### 设置 DNS
**GNOME 图形界面:**
1. 打开 **设置 → 网络**
2. 选择当前连接 → **IPv4 → DNS**
3. 添加:`旁路由 IP`(如 `192.168.31.112`
4. 备用:`223.5.5.5`
**命令行方式(NetworkManager):**
```bash
nmcli con mod "连接名" ipv4.dns "旁路由IP" ipv4.ignore-auto-dns yes
nmcli con up "连接名"
```
#### 设置系统代理
1. 打开 **设置 → 网络 → 代理**
2. 选择 **手动**
3. 填写 SOCKS 代理地址为旁路由 IP
| 字段 | 值 |
|------|-----|
| SOCKS 代理 | `旁路由 IP`(如 `192.168.31.112` |
| 端口 | `7890` |
---
## 终端代理(可选)
如果需要在终端里走代理,设置环境变量:
```bash
# 本机就是旁路由
export ALL_PROXY=socks5://127.0.0.1:7890
# 局域网内其他机器(替换为实际 IP)
export ALL_PROXY=socks5://旁路由IP:7890
```
或者写入 `~/.bashrc` 持久化:
@@ -48,13 +89,14 @@ curl --socks5 127.0.0.1:7890 https://www.google.com -o /dev/null -s -w '%{http_c
# 测试 DNS 去广告
nslookup doubleclick.net
# 返回 0.0.0.0 → 广告域名已被拦截
# 如果提示 command not found,安装 dnsutilsDebian/Ubuntu)或 bind-utilsFedora
```
---
## 服务管理
旁路由本机就是服务器,所以日常管理命令也在这里执行
如果这台机器就是旁路由,日常管理命令
```bash
sudo systemctl restart sing-box # 重启翻墙
+1 -1
View File
@@ -38,7 +38,7 @@
4. 点击 **保存**
?> 不需要翻墙时关掉即可,国内网站直连,不受影响。
!!! tip "不需要翻墙时关掉即可,国内网站直连,不受影响。"
---
+2 -12
View File
@@ -37,10 +37,7 @@
### 推荐 App
| App | 价格 | 说明 |
|-----|:---:|------|
| **Shadowrocket**(小火箭) | 美区 $2.99 | 最流行,稳定好用 |
| **Hiddify Next** | 免费 | 开源替代,功能相近 |
**Shadowrocket**(小火箭),美区 App Store $2.99,最稳定好用的翻墙客户端。
### Shadowrocket 配置
@@ -66,13 +63,6 @@
4. 保存 → 开启连接
5. 首次连接会弹出 VPN 授权,点击 **允许**
### Hiddify Next 配置(免费方案)
1. App Store 搜索 Hiddify Next 安装
2. 添加配置 → 手动输入
3. 协议 VLESS,参数同上表
4. 保存连接
---
## 验证
@@ -86,7 +76,7 @@
### WiFi 代理不生效?
有些 app 不走 HTTP 代理。可以 Shadowrocket/Hiddify Next 的 **代理模式**WiFi 下也开启,无需设置系统 HTTP 代理。
有些 app 不走 HTTP 代理。可以 Shadowrocket 中开启 **代理模式**WiFi 下也无需手动设置系统 HTTP 代理。
### 出门无法连接 VPS
+3 -3
View File
@@ -38,14 +38,14 @@
4. 点击 **好**
?> 不需要翻墙时关掉即可。也可以使用 **SwitchyOmega**(Chrome 扩展)按规则自动切换,国内网站不走代理。
!!! tip "不需要翻墙时关掉即可。也可以使用 **SwitchyOmega**(Chrome 扩展)按规则自动切换,国内网站不走代理。"
---
## 终端代理(可选)
```bash
# 临时开启
# 临时开启(替换为实际旁路由 IP,如 192.168.31.112
export ALL_PROXY=socks5://旁路由IP:7890
# 写入 ~/.zshrc 持久化
@@ -59,7 +59,7 @@ echo 'alias unproxy="unset ALL_PROXY"' >> ~/.zshrc
```bash
# 测试代理是否通
curl --socks5 旁路由IP:7890 https://www.google.com -o /dev/null -s -w '%{http_code}'
curl --socks5 旁路由IP:7890 https://www.google.com -o /dev/null -s -w '%{http_code}' # 替换为实际 IP
# 返回 200 → 正常
# 测试 DNS 去广告
+52 -6
View File
@@ -2,6 +2,20 @@
> 用一台 Ubuntu 机器做旁路由,实现全家翻墙 + DNS 去广告。基于 sing-boxVLESS + Reality)和 AdGuard Home。
## 目录
1. **概述** — 什么是旁路由、架构图
2. **一、部署教程** — 6 步完成旁路由搭建
- 1.1 前置条件
- 1.2 本机网络配置(静态 IP、IP 转发)
- 1.3 VPS 服务端(sing-box 安装、Reality 配置)
- 1.4 本机客户端(sing-box 入站 + 路由规则)
- 1.5 DNS 端口冲突解决(systemd-resolved
- 1.6 AdGuard HomeDocker 部署、过滤规则)
- 1.7 各设备接入
3. **二、使用教程** — 日常管理、故障排查
4. **三、踩坑笔记** — TProxy 为什么不用、DNS 劫持等
---
## 概述
@@ -52,7 +66,7 @@ graph TD
### 1.1 前置条件
- 一台 24 小时开机的 Linux 设备(本例 Ubuntu 24.04),已接入局域网
- 一台境外 VPS(本例香港 CentOS Stream 9
- 一台境外 VPS(本例 Debian 12,位于香港
- 一个域名(用于 Reality 伪装,本例 `www.microsoft.com` 作为 SNI
### 1.2 步骤一:配置旁路由本机网络
@@ -97,12 +111,22 @@ sudo sysctl -p /etc/sysctl.d/99-bypass.conf
#### 安装 sing-box
```bash
# VPS 上执行(CentOS Stream 9 示例
# 官方安装脚本
# VPS 上执行(Debian 12,其他发行版参见官方文档
# 安装依赖
sudo apt update && sudo apt install -y curl ca-certificates
# 添加官方源
sudo mkdir -p /etc/apt/keyrings
curl -fsSL https://sing-box.app/gpg.key | sudo gpg --dearmor -o /etc/apt/keyrings/sing-box.gpg
# 具体安装方式参见 https://sing-box.sagernet.org/installation/
echo "deb [signed-by=/etc/apt/keyrings/sing-box.gpg] https://sing-box.app/deb /" | sudo tee /etc/apt/sources.list.d/sing-box.list
# 安装并启用
sudo apt update && sudo apt install -y sing-box
sudo systemctl enable sing-box
```
> 其他发行版(CentOS/Fedora)的安装方式参见 [sing-box 官方文档](https://sing-box.sagernet.org/installation/)。
#### 生成 Reality 密钥
```bash
@@ -243,7 +267,29 @@ curl --socks5 127.0.0.1:7890 https://www.google.com -o /dev/null -s -w '%{http_c
# 返回 200 或 301/302 即成功
```
### 1.5 步骤四:部署 AdGuard Home
### 1.5 步骤四:解决 DNS 端口冲突
Ubuntu 24.04 默认运行 `systemd-resolved`,占用 `127.0.0.53:53`。AdGuard Home 需要绑定 `0.0.0.0:53`,必须先释放 53 端口:
```bash
# 禁用 systemd-resolved 的 DNS stub listener
sudo sed -i 's/#DNSStubListener=yes/DNSStubListener=no/' /etc/systemd/resolved.conf
sudo systemctl restart systemd-resolved
# 确认 53 端口已释放(应该无输出)
sudo ss -tuln | grep ':53 '
```
> 如果 `ss` 命令仍有输出(说明其他进程占用 53 端口),用 `sudo lsof -i :53` 排查。
同时确保 `/etc/resolv.conf` 指向有效的 DNS 服务器:
```bash
# 如果 /etc/resolv.conf 指向 127.0.0.53,暂时改为公共 DNS
echo 'nameserver 223.5.5.5' | sudo tee /etc/resolv.conf
```
### 1.6 步骤五:部署 AdGuard Home
用 Docker 启动 AdGuard Home,统一管理局域网 DNS 并过滤广告。
@@ -297,7 +343,7 @@ docker run -d \
https://dns.quad9.net/dns-query
```
### 1.6 步骤:各设备接入
### 1.7 步骤:各设备接入
部署完成后,各终端设备需要配置 DNS 和代理才能使用旁路由。每个平台的设置方式不同,详见各平台使用指南:
+8 -4
View File
@@ -14,12 +14,16 @@
| 内容 | 位置 | 大小 |
|------|------|------|
| RAW 原片 (ARW) | `~/aa/` | 117 张 / 2.8 GB |
| Immich 管理 | [Immich](http://localhost:2283) | — |
| Immich 管理 | [Immich](https://photo.kurihada.com) | AI 标签 + RAW 预览 |
---
## 📝 拍摄笔记
> 还没有内容,待 Claude 帮你整理。
>
> 可以告诉 Claude:「帮我写一篇 xx 拍摄的笔记,参数是...」
> 还没有内容,待补充。计划涵盖:
> - 拍摄参数记录(光圈、快门、ISO、焦段)
> - 后期思路(Lightroom / Darktable 调色)
> - 航拍飞行点位与构图笔记
> - 赛里木湖之行的拍摄成果(2026 年 8 月)
可以告诉 Claude:「帮我写一篇 xx 拍摄的笔记,参数是...」
+3 -1
View File
@@ -4,7 +4,9 @@
## 📝 游记 & 计划
> 还没有内容,待 Claude 帮你整理。
- **[赛里木湖 2026](赛里木湖2026.md)** — 8 月 20-25 日,6 天北疆赛里木湖 + 独库公路,含拍摄计划与行程表
> 更多游记待补充。8 月赛里木湖之行的旅行日记将在行程中或结束后更新。
---
+18 -3
View File
@@ -2,6 +2,21 @@
---
> 日记按日期组织,文件名格式:`YYYY-MM-DD.md`
>
> 告诉 Claude 你想记录什么,我来帮你写成结构化的日记
## 使用方式
日记按日期组织,文件名格式 `YYYY-MM-DD.md`
告诉 Claude:「帮我记一下今天的日记,今天做了...」
## 日记列表
> 还没有日记条目,待添加。
---
## 计划记录
- 技术折腾日志(部署了什么东西、踩了什么坑)
- 旅行当天的即时记录
- 摄影外出拍摄日志
- 日常碎碎念
+11 -8
View File
@@ -29,6 +29,7 @@ theme:
- search.suggest # 搜索建议
- search.highlight # 搜索高亮
- content.code.copy # 代码块复制按钮
custom_dir: docs/overrides # 自定义模板覆盖(评论系统等)
markdown_extensions:
- admonition # 提示框 !!! note
@@ -51,6 +52,10 @@ markdown_extensions:
plugins:
- search:
lang: zh # 中文搜索优化
- git-revision-date-localized:
enable_creation_date: true
type: date
locale: zh
extra:
social:
@@ -60,12 +65,12 @@ extra:
nav:
- 首页: index.md
- 旅行:
- 旅行/index.md
- 赛里木湖 2026: 旅行/赛里木湖2026.md
- 摄影:
- 摄影/index.md
- 摄影: 摄影/index.md
- 技术:
- 技术/index.md
- MkDocs 部署: 技术/mkdocs部署.md
- Artalk 评论系统: 技术/artalk评论系统.md
- Immich 照片管理: 技术/immich部署.md
- 旁路由部署: 技术/旁路由部署.md
- 旁路由使用:
- Linux: 技术/旁路由使用/Linux.md
@@ -73,7 +78,5 @@ nav:
- macOS: 技术/旁路由使用/macOS.md
- Android: 技术/旁路由使用/Android.md
- iPhone: 技术/旁路由使用/iPhone.md
- 3D打印:
- 3D打印/index.md
- 日记:
- 日记/index.md
- 3D打印: 3D打印/index.md
- 日记: 日记/index.md