月度归档: 2026 年 2 月

  • 我的爱发电主页

    我创建了个爱发电账号,如果觉得我的“屎山”项目很有用的可以去浅浅支持一下

    https://afdian.com/a/Kunnector

  • LifeDrive-个人计划&记录系统

    今天是昨天的明天

    写了个轻量级个人知识库系统,融合了笔记、时间追踪、关系图谱和日历视图。它支持类 Obsidian 的 [[@页面链接]] 和 [[标签]] 语法,内置待办清单、提醒组件和 Markdown 渲染。

    Notiobsidian(Nobsidian)作为开源版本


    🌐 Notiobsidian

    Stars
    Forks
    Issues
    MIT License
    Python
    Flask
    Local First
    Notion Style


    本地优先 · 可编程 · Agent-ready 的下一代个人工作空间

    Notiobsidian

    把 Notion 的交互美学 + Obsidian 的本地自由 + AI Agent 原生接口 揉在一起
    一个完全自托管、可编程、跑在你电脑上的个人第二大脑(目前已是我本人的主力生产力工具)

    ✨ 核心特性(已实现 & 日常在用)

    • 本地优先 + Markdown 文件存储 —— 所有数据就是你硬盘上的文件,永不锁仓
    • Notion 风格块式编辑器 —— 支持拖拽、/命令、富媒体、数据库视图雏形
    • 自定义语法糖 —— {{TODO}}、{{image}}、{{video}}、{{calc}}、{{notice}} 等扩展块
    • 变量系统 & 数据面板 —— 记录习惯/开销/体重等数值,自动生成折线图/饼图/分布图
    • 每日追踪器 —— 时间统计 + 情绪日记 + 模板一键插入(我每天写日记都在这里)
    • 全局日历视图 —— 从笔记里自动提取 @2026-02-18 [会议] 事件,支持 ICS 导入导出
    • 知识图谱 —— vis-network 驱动,拖拽节点、按标签分组、cabinet 文件柜
    • 实时提醒 & 桌面通知 —— WebSocket + 浏览器通知(定时/间隔/周几都支持)
    • 极简自托管 —— 一条命令 python Notiobsidian.py 就能跑
    • 暗黑模式友好 + Tailwind 美化(手机也能凑合看)

    📸 截图预览

    Sidebar & Dashboard
    Daily Tracker with Charts
    Knowledge Graph View
    Calendar Events

    🚀 快速开始(3 分钟跑起来)

    1. 克隆仓库
       git clone https://github.com/NanamiChiaki-7/Notiobsidian.git
       cd Notiobsidian
    Bash
    1. 安装依赖(Python 3.8+)
       pip install -r requirements.txt
    Bash
    1. 启动
       python Notiobsidian.py
    Bash

    → 默认监听 http://0.0.0.0:5004

    1. 登录(首次使用)
    • 用户名:admin
    • 密码:PASSWORD(启动后立刻去改!见下方安全提示)
    1. 开始使用:浏览器打开 http://localhost:5004 即可看到欢迎页和示例内容

    生产建议

    • 用环境变量设置 SECRET_KEY 和密码
    • --host 0.0.0.0 --port 你的端口 或用 gunicorn / uvicorn 部署
    • 数据文件:nation_pro_v3.db(SQLite),记得定期备份!

    🛤️ 路线图(2026 计划)

    • [x] 基本笔记 + TODO + 日历 + 图谱 + 追踪器
    • [ ] 完善图片/视频上传 & 拖拽排序
    • [ ] 提醒真正定时推送(apscheduler / 系统托盘 /手机APP FCM)
    • [ ] Agent 接口(Python 函数暴露给 LLM 调用)
    • [ ] 移动端响应式优化
    • [ ] 主题切换(光暗 + 自定义配色)
    • [ ] 数据导入(Notion / Obsidian / Markdown 文件夹)
    • [ ] Docker 一键部署

    欢迎 PR 加速这些功能!

    🤝 贡献

    欢迎 issue、PR、想法!

    1. Fork → branch
    2. 改动后加测试(如果有)→ 提交清晰 commit
    3. 发 PR,描述清楚做了什么

    喜欢就点个 ⭐ 支持一下~


    Last updated: February 2026 · 最后更新:2026年2月

    Happiness depends upon ourselves.

    幸福取决于我们自己。

    —— 亚里士多德

  • 多项目挂载单一域名下子域名反代问题处理

    🏆 BUG本质归档:多项目同域名反代下的「路径双重转义」问题


    🎯 一句话总结

    静态资源请求被错误地当成了动态路由处理,导致路径被二次编码。


    🔍 问题根源拓扑

    你的预期:
    浏览器请求 /LifeDrive/static/css/style.css 
        → Nginx 静态 location 
        → 直接读硬盘文件 ✅
    
    实际发生:
    浏览器请求 /LifeDrive/static/css/style.css
        → Nginx 无静态 location(或被覆盖)
        → 转发给 Flask 代理
        → Flask 的 ReverseProxied 剥离 /LifeDrive
        → Flask 收到 /static/css/style.css
        → Flask 把它当作路由去找 @app.route('/static/...')
        → 找不到,返回 404 ❌

    触发条件(三要素缺一不可)

    1. Nginx 静态 location 缺失/写错/顺序不对
    • ^~ /Project/static/ 没写
    • 或写在代理 location 后面
    • alias 路径错误/少斜杠
    1. Flask 启用了 ReverseProxied
    • 正确剥离了前缀
    • 但把静态请求也剥离了
    1. HTML 用了 url_for 生成静态路径
       <!-- 这会让静态请求也经过 Flask 路由系统 -->
       <link href="{{ url_for('static', filename='css/style.css') }}">

    url_for('static') → 生成 /LifeDrive/static/css/style.css → 同上死循环


    解决方案对比

    方案静态文件处理动态路由HTML写法适用场景
    ❌ 全代理Flask处理Flask处理url_for单项目,无Nginx静态
    ✅ 组合拳Nginx直出Flask处理写死路径多项目同域名,性能最优
    ⚠️ 全直出Nginx直出Nginx直出写死路径纯静态站

    你最终选的是「组合拳」——工业标准做法。


    📚 经验法则(以后照着做)

    法则1:Nginx 静态 location 必须写在代理前面

    # ✅ 正确顺序
    location ^~ /Project/static/ { ... }  # 1. 精确匹配优先
    location /Project/ { ... }            # 2. 模糊匹配在后

    法则2:静态文件用写死路径,动态链接用 url_for

    <!-- ✅ 静态资源:直接写死,不走 Flask -->
    <link href="/Project/static/css/style.css">
    
    <!-- ✅ 动态链接:用 url_for,自动加前缀 -->
    <a href="{{ url_for('view_page', id=1) }}">

    法则3:BASE_PATH 是给动态路由用的,静态文件不要

    # ✅ 只有 Flask 需要知道
    export BASE_PATH=/Project
    
    # ❌ Nginx 静态 location 完全不需要
    # alias 直接写绝对路径即可

    法则4:新项目部署检查清单

    1. [ ] Nginx 加静态 location(^~ /项目名/static/
    2. [ ] Nginx 加代理 location(/项目名/
    3. [ ] 静态写在代理前面
    4. [ ] HTML 里写死 /项目名/static/xxx
    5. [ ] Flask 启动前 export BASE_PATH=/项目名
    6. [ ] 测试静态文件直出(应200)
    7. [ ] 测试动态页面(应200)

    🎖️ 本次BUG修复贡献者

    问题发现:浏览器控制台 404
    定位过程:curl → Nginx 404 → 检查 alias → 发现少斜杠
    深层原因:发现静态请求进了 Flask
    解决方案:Nginx 静态直出 + HTML写死路径
    最终验证:静态文件 200,动态页面 200,完美

    耗时:一下午
    收获:多项目反代的标准模式固化


    📌 以后再也不犯的错误

    1. Nginx 静态 location 不加 ^~(被正则覆盖)
    2. 静态 location 写在代理后面(永远匹配不到)
    3. alias 路径末尾少斜杠staticcss 经典错误)
    4. HTML 里对静态文件用 url_for(本末倒置)
    5. Flask 里写死 BASE_PATH(环境不通用)
    6. 试图让 Flask 既当路由又当静态服务器(性能差、易错)

    这次 BUG 修完,你已经是 Nginx + Flask 多项目部署的专家了。
    这套组合拳可以复用到以后所有项目,不会再卡一下午了。

    钱会把人引进恶劣的社会中去,把高尚的理想撇开,而甘心走入地狱中去。

    Money can lead people into vile society, making them abandon noble ideals and willingly walk into hell.

    —— 《骆驼祥子》老舍

    *当初为了项目反代问题处理一下午,今天又处理一下午,要吸取教训了*

  • LifeDrive

    我常常想的太多 做的太少 太多想法没得到记录 太多想法没得到事实践 那么这种思考本身就是种逃避 我希望LifeDrive能将我那些天马行空的空中楼阁般的想法托举到地上 虽然这些楼阁大抵是云做的虚无缥缈且摇摇欲坠 我将为我的想法接生 这是就是我对LifeDrive的寄语

    *该图为我生日时NASA每日一图 是猫爪星云!

  • 健身房小程序-更新日志

    最终,幸福不在于石头是否停留在山顶,而在于你每一次走向山脚的步伐。”

    -读《坦纳伯斯寓言》有感

    为有牺牲多壮志,敢教日月换新天.

    学了下怎么用agent 现在AI技术真的是日新月异
    搭建了一个框架 现在往里面填充血肉
    具体更新了(已经链接云函数实现的):
    1. 获取微信账号注册登录 头像名称修改
    2. 教练页面的详细展示 图片插入与修改
    头像修改 介绍修改等
    3. 修复了2个框架BUG
    妥协性修复了一个BUG

    未来更新目标

    增值版

    内部植入AI agent根据健身房器械和教练
    制定和推荐训练计划

    To be without some of the things you want is an indispensable part of happiness.

    没有一些你想要的东西是幸福不可或缺的一部分。

    —— 罗素