


[{"content":"这个博客今晚上线了。不过不是挂在好看的域名上，而是挂在 blog.sp1128node.duckdns.org:9443——带着端口号，因为 Caddy 在我的小 VPS 上就是在这个端口提供服务的。最后一步本来应该是最简单的：把 blog.sp1128.top 通过 Cloudflare 指到这台机器，再加一条源站规则（Origin Rule），把回源端口改写到 9443（源站的 443 端口是另一个服务在用），然后享受干净的 URL。\n结果折腾了三轮。三轮全是我自己的问题。\n症状 # DNS 记录加好了（开启代理，指向 198.44.52.74）。源站规则也建了：当主机名是 blog.sp1128.top 时，把回源端口改写为 9443。打开 https://blog.sp1128.top：\nError 525 —— SSL 握手错误。\nCloudflare 能连到源站，但 TLS 握手死掉了。而博客本体在 duckdns 地址上一切正常，证书俱全。也就是说源站不是不会 TLS——只是不给这个主机名用。\n走过的弯路 # 第一个怀疑对象：Caddy 根本没有 blog.sp1128.top 的证书。这一点是对的。几个小时前装博客时，这个主机名在 DNS 里还不存在，Caddy 的日志也写得很明白：\nchallenge failed … \u0026#34;detail\u0026#34;:\u0026#34;DNS problem: NXDOMAIN looking up A for blog.sp1128.top\u0026#34; 那好办——现在 DNS 有了，重启 Caddy，让 ACME 把证书签出来就是。结果：还是 525。而且 caddy reload 连试都不试——它回了一句 \u0026ldquo;config is unchanged\u0026rdquo;，直接跳过了重新签发。只有把容器整个重启，才逼它重新尝试了一次。\n而这次尝试又失败了，但日志有意思多了。\n根因 # http-01: \u0026#34;detail\u0026#34;:\u0026#34;… Invalid response from http://blog.sp1128.top/.well-known/acme-challenge/…: 400\u0026#34; tls-alpn-01: \u0026#34;detail\u0026#34;:\u0026#34;Cannot negotiate ALPN protocol \\\u0026#34;acme-tls/1\\\u0026#34; for tls-alpn-01 challenge\u0026#34; 手动探了一下验证地址，拿到了决定性证据——一个 400，响应体是 Caddy 的 TLS 端口在说：\nClient sent an HTTP request to an HTTPS server. 我的源站规则把发往 blog.sp1128.top 的每一个请求都改写到了 9443——包括普通 HTTP。而 Let\u0026rsquo;s Encrypt 的 HTTP-01 验证恰恰是一个明文 HTTP GET。Cloudflare 忠实地从源站的 9443 端口去取它，而那个端口只说 TLS。明文撞上 TLS 端口，换回一个 400，验证永远过不了。TLS-ALPN-01 也救不了：中间隔着代理，acme-tls/1 这个 ALPN 协议根本协商不起来。\n服务器本身是无辜的：就在几分钟前，同一套 HTTP-01 流程刚给 duckdns 那个主机名签出过证书（它直连源站，日志是 served key authentication → certificate obtained successfully）。唯一坏掉的路径，就是经过我这条规则的那条。证书生不出来，是因为我为站点写的规则，把接生婆的请求给吃了。\n出门前还踩了最后一个小坑：我的第一版修法 (http.host eq \u0026quot;blog.sp1128.top\u0026quot; and http.request.scheme eq \u0026quot;https\u0026quot;) 被 Cloudflare 的校验直接拒了——在源站规则这个阶段，根本没有 http.request.scheme 这个字段。\n修法 # 把规则限定为只对 HTTPS 请求生效，用源站规则真正提供的那个布尔字段：\n(http.host eq \u0026#34;blog.sp1128.top\u0026#34; and ssl) 现在 HTTPS 流量的端口会被改写到 9443，而普通 HTTP 流量留在 80 端口——那正是 HTTP-01 验证需要落的地方。再重启一次 Caddy（docker restart panels-caddy-1），大约 90 秒后，日志里出现了我想看的那一行：\n\u0026#34;certificate obtained successfully\u0026#34;,\u0026#34;identifier\u0026#34;:\u0026#34;blog.sp1128.top\u0026#34;, \u0026#34;issuer\u0026#34;:\u0026#34;acme-v02.api.letsencrypt.org-directory\u0026#34; curl https://blog.sp1128.top → 200。干净的 URL、真正的 Let\u0026rsquo;s Encrypt 证书，之后由 Caddy 自动续期——而且续期时的 HTTP-01 也能一直通过，正是因为这条规则再也不碰 HTTP 了。\n教训 # 改写流量去向的规则，作用范围要收得越窄越好——按 scheme、按路径、按一切你能命名的条件来限定。一条不限范围的规则不只是\u0026quot;为你的站点服务\u0026quot;，它会拦截一切只是提到你站点的东西，包括敲前门的证书颁发机构。\n","date":"2026年10月24日","externalUrl":null,"permalink":"/zh-cn/posts/cloudflare-525-origin-rule-acme/","section":"Posts","summary":"博客其实早就上线了——只是挂在带端口号的丑地址上。把它迁到 blog.sp1128.top 折腾了三轮，因为我为这个站点写的 Cloudflare 源站规则，一直在吃掉它的证书赖以签发的 Let’s Encrypt 验证请求。","title":"525 错误：我写的源站规则，吃掉了我自己的证书","type":"posts"},{"content":"","date":"2026年10月24日","externalUrl":null,"permalink":"/zh-cn/tags/cloudflare/","section":"Tags","summary":"","title":"Cloudflare","type":"tags"},{"content":"","date":"2026年10月24日","externalUrl":null,"permalink":"/zh-cn/tags/dev-notes/","section":"Tags","summary":"","title":"Dev-Notes","type":"tags"},{"content":"","date":"2026年10月24日","externalUrl":null,"permalink":"/zh-cn/","section":"Dorm Room Dev","summary":"","title":"Dorm Room Dev","type":"page"},{"content":"","date":"2026年10月24日","externalUrl":null,"permalink":"/zh-cn/posts/","section":"Posts","summary":"","title":"Posts","type":"posts"},{"content":"","date":"2026年10月24日","externalUrl":null,"permalink":"/zh-cn/tags/self-hosting/","section":"Tags","summary":"","title":"Self-Hosting","type":"tags"},{"content":"","date":"2026年10月24日","externalUrl":null,"permalink":"/zh-cn/tags/ssl/","section":"Tags","summary":"","title":"Ssl","type":"tags"},{"content":"","date":"2026年10月24日","externalUrl":null,"permalink":"/zh-cn/tags/","section":"Tags","summary":"","title":"Tags","type":"tags"},{"content":"","date":"2026年10月24日","externalUrl":null,"permalink":"/zh-cn/tags/ai/","section":"Tags","summary":"","title":"Ai","type":"tags"},{"content":"","date":"2026年10月24日","externalUrl":null,"permalink":"/zh-cn/tags/claude/","section":"Tags","summary":"","title":"Claude","type":"tags"},{"content":"","date":"2026年10月24日","externalUrl":null,"permalink":"/zh-cn/tags/claude-code/","section":"Tags","summary":"","title":"Claude-Code","type":"tags"},{"content":"","date":"2026年10月24日","externalUrl":null,"permalink":"/zh-cn/tags/cli/","section":"Tags","summary":"","title":"Cli","type":"tags"},{"content":"","date":"2026年10月24日","externalUrl":null,"permalink":"/zh-cn/tags/devtrack/","section":"Tags","summary":"","title":"Devtrack","type":"tags"},{"content":"站会。每天早上。『你昨天做了什么？』\nAnd me, every morning, staring at the ceiling trying to reconstruct my own day. I shipped stuff! There were commits! I just couldn\u0026rsquo;t tell you what they were without opening four different tools.\nSo I built the tool I wanted: DevTrack.\n→ GitHub: github.com/sp1128/DevTrack\nWhat it does # DevTrack is a local CLI that hooks into Claude Code and quietly records your dev activity as you work:\nSessions and active coding time Files changed (Claude\u0026rsquo;s edits plus git working-tree changes) The important commands you ran — tests, builds, installs — with secrets scrubbed out Git commits: branch, message, files touched, lines added/removed Tasks, inferred from Claude\u0026rsquo;s task tools or from your commits Then it answers the standup question directly:\nnpm install -g devtrack devtrack init claude # work like normal — DevTrack records in the background devtrack today # what did I actually do today? There are week and month views, a Markdown weekly report you can paste anywhere (with an optional AI summary), and an activity heatmap for when you want to feel something about your own consistency.\nThe part I care about most # Everything stays on your machine. No account, no cloud sync, no analytics. Your dev history is yours. DevTrack doesn\u0026rsquo;t modify the Claude Code client either — it just listens to the hooks Claude Code already exposes.\nWhen I demo\u0026rsquo;d it for the video, it showed my day back to me: 19 active minutes in the test session, 3 files, 2 commits, 4 commands — including the build that failed. Especially the build that failed. That\u0026rsquo;s the stuff I always forget by the next morning, and it\u0026rsquo;s exactly what a standup is supposed to surface.\nTry it # It\u0026rsquo;s MIT-licensed and on npm. If you live in Claude Code and your standups sound like mine, give it a spin — issues and PRs welcome.\nThe video version of this post is on my TikTok: @dormroomdev.\n","date":"2026年10月24日","externalUrl":null,"permalink":"/zh-cn/posts/devtrack/","section":"Posts","summary":"站会天天问昨天交付了什么，我天天卡壳。于是我做了 DevTrack——一个本地 CLI，记录我的 Claude Code 会话、提交和命令，然后替我把日报和周报写好。","title":"DevTrack：我做了个能记住我昨天干了啥的 CLI","type":"posts"},{"content":"","date":"2026年10月24日","externalUrl":null,"permalink":"/zh-cn/tags/gamedev/","section":"Tags","summary":"","title":"Gamedev","type":"tags"},{"content":"","date":"2026年10月24日","externalUrl":null,"permalink":"/zh-cn/tags/github/","section":"Tags","summary":"","title":"Github","type":"tags"},{"content":"","date":"2026年10月24日","externalUrl":null,"permalink":"/zh-cn/tags/idea-review/","section":"Tags","summary":"","title":"Idea-Review","type":"tags"},{"content":"","date":"2026年10月24日","externalUrl":null,"permalink":"/zh-cn/tags/meta/","section":"Tags","summary":"","title":"Meta","type":"tags"},{"content":"","date":"2026年10月24日","externalUrl":null,"permalink":"/zh-cn/tags/projects/","section":"Tags","summary":"","title":"Projects","type":"tags"},{"content":"新系列，每周五更新：Weekly AI Flex。规则很简单——我让 AI 去造一件它本不该造得出的东西，然后亲自实测。\nEpisode 1 is the one-sentence challenge:\nBuild me a game.\nThat\u0026rsquo;s it. That\u0026rsquo;s the prompt. What came back was a playable neon asteroid shooter — movement, shooting, waves of asteroids, the works — as one single HTML file. No game engine, no build step, no assets. Open it in a browser and play.\nThen I pushed it, because episode 1 needed a twist: now add a boss fight. It did. The boss has health phases, attack patterns, and it absolutely killed me on my first run. On camera.\nWatch it:\n🎵 TikTok: One Sentence. One Game. 📘 Facebook: the same episode as a Reel The honest takeaway isn\u0026rsquo;t \u0026ldquo;AI is magic.\u0026rdquo; It\u0026rsquo;s that the gap between a sentence and a thing you can play has basically collapsed — if you know how to ask, and how to test what you got back. That\u0026rsquo;s the skill I\u0026rsquo;m practicing in this series, one Friday at a time.\nNext episode drops Friday. Every Friday, I let AI build something it shouldn\u0026rsquo;t be able to.\n","date":"2026年10月24日","externalUrl":null,"permalink":"/zh-cn/posts/weekly-flex-ep1-one-sentence-one-game/","section":"Posts","summary":"周五新系列：我给 AI 一句话，看它能不能做出本不该做得出的东西。第一集——一个能玩的霓虹陨石射击游戏，带 Boss 战，全塞在一个 HTML 文件里。","title":"Weekly AI Flex 第一集：一句话，一个游戏","type":"posts"},{"content":"","date":"2026年10月24日","externalUrl":null,"permalink":"/zh-cn/tags/weekly-ai-flex/","section":"Tags","summary":"","title":"Weekly-Ai-Flex","type":"tags"},{"content":"博客开张了。还是 TikTok 上那个 @dormroomdev，还是从第一天就立下的那条规矩：\nIf I haven\u0026rsquo;t run it, I don\u0026rsquo;t post it.\nHere\u0026rsquo;s why. Open-source Twitter and TikTok are full of accounts posting \u0026ldquo;10 GitHub repos that will blow your mind\u0026rdquo; — and half the time, the person posting never cloned a single one. The README looks great, the demo GIF looks great, and then you install it and it doesn\u0026rsquo;t even start. I\u0026rsquo;ve wasted enough evenings on repos like that.\nSo my process is boring on purpose:\nClone the repo. Run whatever the README says to run. Actually use the thing — click the buttons, run the commands, break it if I can. Only then make the video. It costs me an extra hour per video. It\u0026rsquo;s also the whole point. When I say a tool is fast, it\u0026rsquo;s because I watched it be fast. When I say \u0026ldquo;skip this one,\u0026rdquo; it\u0026rsquo;s because it crashed on me, not because the vibes were off.\nWhat this blog is for # TikTok is 50 seconds. That\u0026rsquo;s enough for a demo and a verdict, but not enough for the interesting stuff — the setup gotchas, the \u0026ldquo;here\u0026rsquo;s what actually died when I ran it,\u0026rdquo; the longer comparisons. That\u0026rsquo;s what goes here.\nExpect three kinds of posts:\nRepo write-ups — the long version of my tutorial videos, with the commands and the caveats. My own projects — stuff I build, like DevTrack and idea-review. Building in public, including the parts that don\u0026rsquo;t work yet. Weekly AI Flex — every Friday I let AI build something it shouldn\u0026rsquo;t be able to. The blog post gets the behind-the-scenes version. One post a day is the goal, matching the videos. If a repo isn\u0026rsquo;t worth your time, I\u0026rsquo;ll say so here too — just with more receipts.\nFirst project post is already up: DevTrack, the CLI I built because I kept blanking at standup.\n","date":"2026年10月24日","externalUrl":null,"permalink":"/zh-cn/posts/why-i-run-every-repo/","section":"Posts","summary":"博客开张了。这里的规矩和我的 TikTok 一样：我没亲手跑过的仓库，就不会发。","title":"为什么我每个仓库都要先亲手跑一遍，才会发出来","type":"posts"},{"content":"随便找个 AI 助手评估你的创业想法，看它怎么表演。它能找到市场，能编出 TAM，能列出十个功能，然后告诉你这想法『潜力很强』。\nThat is the single least useful response possible at the exact moment you\u0026rsquo;re deciding whether to spend three months of your life on something.\nSo I built the opposite. It\u0026rsquo;s called idea-review, a skill for Claude:\n→ GitHub: github.com/sp1128/idea-review\nHow it works # You hand it a raw idea. Before judging anything, it researches — real searches, in that session, not the model\u0026rsquo;s memory. And it deliberately hunts for disconfirming evidence: \u0026ldquo;why did X fail\u0026rdquo;, \u0026ldquo;X alternative\u0026rdquo;, the graveyard posts.\nThen it writes you two files:\n\u0026lt;idea\u0026gt;-feasibility.md — the idea restated, research findings, a 7-dimension scorecard, a one-sentence verdict, and \u0026ldquo;how this most likely dies.\u0026rdquo; If a mature free alternative already exists, that\u0026rsquo;s the opening paragraph, not a footnote. \u0026lt;idea\u0026gt;-tasks.md — if (and only if) the verdict isn\u0026rsquo;t \u0026ldquo;no\u0026rdquo;: a dependency-ordered build plan, tasks sized half a day to two days, each with acceptance criteria a coding agent can actually check. Every market number carries a source link. No source? It writes \u0026ldquo;no reliable public data\u0026rdquo; instead of making one up.\nFirst test: \u0026ldquo;an app that pays you to walk\u0026rdquo; # Sounds harmless, right? The skill dug in and came back with 17/35 — Don\u0026rsquo;t build it.\nThe receipts:\nSweat Economy — the biggest player in this exact space — just announced it\u0026rsquo;s shutting down on Dec 30, 2026. Their CEO\u0026rsquo;s words: \u0026ldquo;no sustainable profitability.\u0026rdquo; Real-world earnings for walkers: roughly $0.03–0.12 per day. That\u0026rsquo;s the whole business model. STEPN is down ~99%. Step App shut down in August 2026. Pay people for steps and you don\u0026rsquo;t get users, you get bot farms spoofing steps — and handing out cash makes you a money transmitter, with the licensing that implies. No tasks file for this one. The skill skips it on a \u0026ldquo;don\u0026rsquo;t build\u0026rdquo; verdict, which is the entire point: a plan for a dead idea is just a slower way to find out.\nInstall it # git clone https://github.com/sp1128/idea-review.git ~/.claude/skills/idea-review Bring it your favorite idea. Bring a thick skin too.\n","date":"2026年10月24日","externalUrl":null,"permalink":"/zh-cn/posts/idea-review/","section":"Posts","summary":"问任何 AI 你的 App 想法好不好，它都会给你开派对。idea-review 专唱反调：先做调研，先报坏消息，该说『别做』的时候绝不含糊。第一个实测案例在文里。","title":"我做了个会劝你「别做这个 App」的技能","type":"posts"},{"content":"","externalUrl":null,"permalink":"/zh-cn/authors/","section":"Authors","summary":"","title":"Authors","type":"authors"},{"content":"","externalUrl":null,"permalink":"/zh-cn/categories/","section":"Categories","summary":"","title":"Categories","type":"categories"},{"content":"","externalUrl":null,"permalink":"/zh-cn/series/","section":"Series","summary":"","title":"Series","type":"series"},{"content":"🎓 CS 本科在读 | 发之前先把仓库跑一遍 ⭐ 每日 GitHub 教程\n我是一名计算机本科生，每天发 GitHub 开源相关的视频——每个仓库都先克隆、亲手跑一遍、诚实评测，然后才做成视频。周五是 Weekly AI Flex：我让 AI 去造它本不该造得出的东西。\n这个博客是长文版：命令、踩过的坑、还有证据，都写在这里。\n其他平台\nTikTok: @dormroomdev Facebook: Dorm Room Dev GitHub: sp1128 — DevTrack 和 idea-review 的大本营 ","externalUrl":null,"permalink":"/zh-cn/about/","section":"Dorm Room Dev","summary":"关于 Dorm Room Dev","title":"关于","type":"page"}]