Files
server-ops/milestone_v1.md

201 lines
7.0 KiB
Markdown
Raw 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.

# 🏆 里程碑 V1 — 栖云个人数据中心
> **时间**2026-06-15 20:33
> **确认人**:冯星源
> **状态**:所有服务正常运行,认证架构按预期工作
---
## 一、认证架构
```
浏览器 → Caddy v2.11.4HTTPS 终止 + 路由)
├─ 有 sess cookie → 直接放行到后端7天免登录
├─ 无 cookie → 302 跳转到 auth.xybkwd.top/login
└─ auth.xybkwd.top → auth_proxy:9002登录页 + 签发 cookie
```
### 认证流程
1. 用户访问任意受保护服务 → 无 cookie → 302 到 `auth.xybkwd.top/login?redirect=原地址`
2. 用户输入 `fxy` / `Qiyun2025!` → auth_proxy 验证 → 设置 `sess` cookie → 302 回原地址
3. 浏览器带 cookie 访问原地址 → Caddy 匹配 `@authed { header Cookie "sess=*" }` → 直接放行
4. Cookie 7 天有效,到期后重复步骤 1
### Cookie 参数
| 参数 | 值 |
|:---|:---|
| Name | `sess` |
| Value | `base64(payload).hmac_sig` |
| Domain | `.xybkwd.top`(跨子域) |
| Path | `/` |
| HttpOnly | ✅ |
| SameSite | `Lax` |
| Max-Age | 6048007天 |
---
## 二、服务清单
| # | 服务 | 域名 | 端口 | 后端类型 | 认证方式 | Gitea Commit |
|:---:|:---|:---|:---:|:---|:---|:---:|
| 1 | **Caddy** | 所有域名 | 80/443 | 反向代理 | HTTPS 自动证书 | nav-page `1a80249` |
| 2 | **auth_proxy** | auth.xybkwd.top | 9002 | Python http.server | Cookie Session | server-ops `195954c` |
| 3 | **Gitea** | gitea.xybkwd.top | 3000 | Gitea 二进制 | Cookie 跳过 | — |
| 4 | **Dashboard** | dashboard.xybkwd.top | 9000 | Python Flask | Cookie 跳过 | — |
| 5 | **Memos** | memo.xybkwd.top | 5230 | Docker | 自身登录 | — |
| 6 | **栖云导航** | nav.xybkwd.top | 静态 | Caddy file_server | Cookie 跳过 | — |
| 7 | **每日要闻** | brief.xybkwd.top | 静态 | Caddy file_server | Cookie 跳过 | — |
| 8 | **Todo API** | nav.xybkwd.top/api | 9001 | Python | Cookie 跳过 | — |
| 9 | **Vaultwarden** | vault.xybkwd.top | 8088 | Docker | 自身登录 | — |
| 10 | **Halo 博客** | www.xybkwd.top | 8090 | Docker | 自身登录 | — |
| 11 | **Calibre-Web** | books.xybkwd.top | 8083 | Docker | Cookie 跳过 | — |
| 12 | **AI Chat** | chat.xybkwd.top | 8900 | Python | Cookie 跳过 | — |
| 13 | **灵感收集器** | — | — | Python/cron | — | inspiration-collector |
| 14 | **系统备份** | — | — | shell/cron | — | — |
### 服务依赖关系
```
Caddy v2.11.4HTTPS + 路由)
├── auth.xybkwd.top:443 ──→ auth_proxy:9002登录页无其他依赖
├── gitea.xybkwd.top:443 ──→ Gitea:3000
├── dashboard.xybkwd.top:443 ──→ dashboard:9000
├── memo.xybkwd.top:443 ──→ Memos Docker:5230
├── nav.xybkwd.top:443 ──→ 静态文件 /var/www/nav + API → todo:9001
├── brief.xybkwd.top:443 ──→ 静态文件 /var/www/nav
├── vault.xybkwd.top:443 ──→ Vaultwarden Docker:8088
├── www.xybkwd.top:443 ──→ Halo Docker:8090
├── books.xybkwd.top:443 ──→ Calibre-Web Docker:8083
└── chat.xybkwd.top:443 ──→ AI Chat Python:8900
```
---
## 三、核心文件
| 文件 | 服务器路径 | Gitea 仓库路径 | 功能 |
|:---|:---|:---|:---|
| **Caddyfile** | `/etc/caddy/Caddyfile` | `fxy/nav-page/Caddyfile` | 反向代理 + Cookie 路由 + HTTPS |
| **auth_proxy.py** | `/home/ubuntu/auth_proxy.py` | `beast/server-ops/auth_proxy/auth_proxy.py` | 登录页 + Cookie 签发 |
| **auth_proxy.service** | `/etc/systemd/system/auth_proxy.service` | `beast/server-ops/auth_proxy/auth_proxy.service` | systemd 服务管理 |
---
## 四、关键配置常量
| 配置项 | 值 | 说明 |
|:---|:---|:---|
| 服务器 IP | `43.163.225.30` | 东京云服务器 |
| SSH 密钥 | `C:/Users/32779/Desktop/ssh_new.pem` | 本地私钥路径 |
| 登录用户名 | `fxy` | basicauth + auth_proxy 通用 |
| 登录密码 | `Qiyun2025!` | **不要明文存储** |
| bcrypt hash | `$2a$14$0U13bqD7CgmZe7jcBQAUHehV2M6qrotbxERgDrHgzLxSXtmRX/YUK` | Caddy basic_auth 用 |
| auth_proxy 监听 | `127.0.0.1:9002` | 仅本地访问 |
| nav 静态文件根 | `/var/www/nav/` | 导航页 + 每日要闻 |
---
## 五、Gitea 仓库锚点
### nav-pageCaddyfile
```
最新 commit: 1a80249
消息: refactor: unified login-first experience
回滚命令: git checkout 1a80249 -- Caddyfile
```
### server-opsauth_proxy
```
最新 commit: 195954c
消息: fix: auth_proxy Cache-Control no-cache + POST redirect fallback
回滚命令: git checkout 195954c -- auth_proxy/
```
---
## 六、完全恢复步骤
```bash
# 1. 克隆仓库
cd /tmp
git clone http://gitea.xybkwd.top/fxy/nav-page.git
git clone http://gitea.xybkwd.top/beast/server-ops.git
# 2. 恢复 Caddy
sudo cp nav-page/Caddyfile /etc/caddy/Caddyfile
sudo caddy reload --config /etc/caddy/Caddyfile
# 3. 恢复 auth_proxy
sudo cp server-ops/auth_proxy/auth_proxy.py /home/ubuntu/
sudo cp server-ops/auth_proxy/auth_proxy.service /etc/systemd/system/
sudo systemctl daemon-reload
sudo systemctl restart auth_proxy
```
---
## 七、调试命令模板
```bash
# 1. 验证登录页
curl -sk -o /dev/null -w '%{http_code}' https://auth.xybkwd.top/login
# 期望值: 200
# 2. 验证认证拦截
curl -sk -o /dev/null -w '%{http_code}' https://brief.xybkwd.top/
# 期望值: 302重定向到登录页
# 3. 登录并获取 cookie
curl -sk -c /tmp/v1_cookies.txt -X POST \
-d 'username=fxy&password=Qiyun2025!' \
-d 'redirect=https://brief.xybkwd.top/' \
https://auth.xybkwd.top/login
# 期望值: 302 + Set-Cookie
# 4. 验证 cookie 免登录
curl -sk -o /dev/null -w '%{http_code}' \
--cookie /tmp/v1_cookies.txt https://brief.xybkwd.top/
# 期望值: 200
curl -sk -o /dev/null -w '%{http_code}' \
--cookie /tmp/v1_cookies.txt https://dashboard.xybkwd.top/
# 期望值: 200
curl -sk -o /dev/null -w '%{http_code}' \
--cookie /tmp/v1_cookies.txt https://gitea.xybkwd.top/
# 期望值: 200
```
---
## 八、已知限制
1. **Cookie 仅检查存在性**,不验证 HMAC 签名(个人服务器可接受)
2. **auth_proxy 单进程** Python http.server高并发可能阻塞
3. **无 basicauth 兜底**,完全依赖 cookiecookie 丢失需重新登录
4. **auth_proxy 无自动重启**,异常退出需 systemd 重启
5. **Dashboard 缺少 WebSocket 支持**,实时更新可能不稳定
---
## 九、历史 Git 记录2026-06-15 全量)
### nav-page commit 线
```
1a80249 refactor: unified login-first experience
a86991a feat: cookie + basicauth dual-auth (7-day session)
f43abe9 fix: restore basic_auth with bcrypt (Caddy v2.11 compatible)
41f8ded rollback: revert auth_proxy to direct proxy (no auth)
9462963 auth: replace basicauth with cookie session auth_proxy
6c35f31 fix: unify ebook library card status text to 运行中
```
### server-ops commit 线
```
195954c fix: auth_proxy Cache-Control no-cache + POST redirect fallback
438245a rollback: revert auth_proxy, restore direct proxy
858a948 auth: add auth_proxy v2 with cookie session auth
df7d64d fix: remove basicauth from memo.xybkwd.top (has own auth)
846dcf7 fix: add missing brief.xybkwd.top with basicauth
```