<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="zh">
    <title>Owen的博客 - Dev</title>
    <subtitle>主要关注技术，读书，摘抄，杂谈，文章评论，工具分享，工作流，灵感，英文学习，注意力管理，深度工作等方向。</subtitle>
    <link rel="self" type="application/atom+xml" href="https://old.owenyoung.com/categories/dev/atom.xml"/>
    <link rel="alternate" type="text/html" href="https://old.owenyoung.com"/>
    <generator uri="https://www.getzola.org/">Zola</generator>
    <updated>2023-03-10T11:04:55+08:00</updated>
    <id>https://old.owenyoung.com/categories/dev/atom.xml</id>
    <entry xml:lang="zh">
        <title>在 Cloudflare Workers 部署一个带有 Dashboard 的 Cron 服务</title>
        <published>2023-03-10T11:04:55+08:00</published>
        <updated>2023-03-10T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Owen Young
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://old.owenyoung.com/blog/cronbin/"/>
        <id>https://old.owenyoung.com/blog/cronbin/</id>
        
        <summary type="html">&lt;p&gt;昨天在 Cloudflare 搭建了 &lt;a href=&quot;https:&#x2F;&#x2F;old.owenyoung.com&#x2F;blog&#x2F;jsonbin&#x2F;&quot;&gt;JSONBin&lt;&#x2F;a&gt; 服务，作为持久化存储的方案，今天又总结出了我的工作流似乎还需要一个重要的 Trigger，那就是 Cron 任务，如果把这个问题解决，那么百分之 90 的用例就都被覆盖了。&lt;&#x2F;p&gt;
&lt;p&gt;目前已解决的工作流问题：&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Webhook Trigger: &lt;a rel=&quot;noopener nofollow noreferrer&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;deno.com&#x2F;deploy&quot;&gt;Deno Deploy&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;持久化存储： &lt;a href=&quot;https:&#x2F;&#x2F;old.owenyoung.com&#x2F;blog&#x2F;jsonbin&#x2F;&quot;&gt;JSONBin&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
</summary>
        
        <content type="html" xml:base="https://old.owenyoung.com/blog/cronbin/">&lt;p&gt;昨天在 Cloudflare 搭建了 &lt;a href=&quot;https:&#x2F;&#x2F;old.owenyoung.com&#x2F;blog&#x2F;jsonbin&#x2F;&quot;&gt;JSONBin&lt;&#x2F;a&gt; 服务，作为持久化存储的方案，今天又总结出了我的工作流似乎还需要一个重要的 Trigger，那就是 Cron 任务，如果把这个问题解决，那么百分之 90 的用例就都被覆盖了。&lt;&#x2F;p&gt;
&lt;p&gt;目前已解决的工作流问题：&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Webhook Trigger: &lt;a rel=&quot;noopener nofollow noreferrer&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;deno.com&#x2F;deploy&quot;&gt;Deno Deploy&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;持久化存储： &lt;a href=&quot;https:&#x2F;&#x2F;old.owenyoung.com&#x2F;blog&#x2F;jsonbin&#x2F;&quot;&gt;JSONBin&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;span id=&quot;continue-reading&quot;&gt;&lt;&#x2F;span&gt;
&lt;p&gt;待解决的问题：&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Cron 任务&lt;&#x2F;li&gt;
&lt;li&gt;需要 Oauth2.0 授权的第三方接口调用，比如推特等&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;今天用部署在 Cloudflare Workers 之上的几百行代码的单一 Javascript 文件，满足了我的 Cron 任务需求。最终效果如下：&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;old.owenyoung.com&#x2F;blog&#x2F;cronbin&#x2F;.&#x2F;cronbin3.png&quot; alt=&quot;screenshot&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;p&gt;该工具的功能很简单，就是定时对配置里的 URL 或者 curl 命令发出请求，并且记录每个 URL 最近 10 条的日志，方便定位问题。&lt;&#x2F;p&gt;
&lt;p&gt;最终源码都在这&lt;a rel=&quot;noopener nofollow noreferrer&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;theowenyoung&#x2F;blog&#x2F;blob&#x2F;main&#x2F;scripts&#x2F;cronbin&#x2F;main.js&quot;&gt;一个文件&lt;&#x2F;a&gt;里，可以很方便的部署在 Cloudflare Worker 之上。&lt;&#x2F;p&gt;
&lt;p&gt;HTML 文件也只有一个，增删改查都在一个页面进行。数据存储在一个 JSON 文件里，存储结构如下：&lt;&#x2F;p&gt;
&lt;pre style=&quot;background-color:#2b303b;color:#c0c5ce;&quot;&gt;&lt;code&gt;&lt;span&gt;{
&lt;&#x2F;span&gt;&lt;span&gt;  &amp;quot;tasks&amp;quot;: {
&lt;&#x2F;span&gt;&lt;span&gt;    &amp;quot;1&amp;quot;: {
&lt;&#x2F;span&gt;&lt;span&gt;      &amp;quot;url&amp;quot;: &amp;quot;https:&#x2F;&#x2F;test.com&amp;quot;,
&lt;&#x2F;span&gt;&lt;span&gt;      &amp;quot;interval&amp;quot;: 5,
&lt;&#x2F;span&gt;&lt;span&gt;      &amp;quot;note&amp;quot;:&amp;quot;Note&amp;quot;,
&lt;&#x2F;span&gt;&lt;span&gt;      &amp;quot;logs&amp;quot;: [
&lt;&#x2F;span&gt;&lt;span&gt;        {
&lt;&#x2F;span&gt;&lt;span&gt;          &amp;quot;ok&amp;quot;: true,
&lt;&#x2F;span&gt;&lt;span&gt;          &amp;quot;message&amp;quot;: &amp;quot;success&amp;quot;,
&lt;&#x2F;span&gt;&lt;span&gt;          &amp;quot;run_at&amp;quot;: &amp;quot;2019-01-01 00:00:00&amp;quot;
&lt;&#x2F;span&gt;&lt;span&gt;        }
&lt;&#x2F;span&gt;&lt;span&gt;      ]
&lt;&#x2F;span&gt;&lt;span&gt;    }
&lt;&#x2F;span&gt;&lt;span&gt;  }
&lt;&#x2F;span&gt;&lt;span&gt;}
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;用户（我）首先在这个简单的 UI 里增删改查 Task，然后利用 Cloudflare Workers 的 &lt;a rel=&quot;noopener nofollow noreferrer&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;developers.cloudflare.com&#x2F;workers&#x2F;runtime-apis&#x2F;scheduled-event&#x2F;&quot;&gt;Schedule 事件&lt;&#x2F;a&gt;，每分钟运行一次&lt;a rel=&quot;noopener nofollow noreferrer&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;theowenyoung&#x2F;blog&#x2F;blob&#x2F;53afd7aaf518523544a1fc37cddbe00c6f2f3b4a&#x2F;scripts&#x2F;cronbin&#x2F;main.js#L348&quot;&gt;&lt;code&gt;CheckAndRunTasks&lt;&#x2F;code&gt;&lt;&#x2F;a&gt;函数,该函数通过检查每个 Task 里&lt;code&gt;logs&lt;&#x2F;code&gt;字段里最近的&lt;code&gt;run_at&lt;&#x2F;code&gt;和任务本身的&lt;code&gt;interval&lt;&#x2F;code&gt;,来确定要不要运行该任务，随后计算出一个该次需要运行的 url&#x2F;curl 命令列表，如果是 curl 命令，则解析为 fetch options, 然后&lt;code&gt;Promise.allSettled&lt;&#x2F;code&gt;并行发出请求，最后，记录各 URL 执行的情况。如果有失败，则还会调用 dashborad 里配置的通知 curl 命令，及时的发送错误消息。&lt;&#x2F;p&gt;
&lt;p&gt;有了这个之后，我就可以执行一些定时的任务了，比如我刚把定时发送&lt;a rel=&quot;noopener nofollow noreferrer&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;twitter.com&#x2F;HackerNewsZh&quot;&gt;Hacker News 中文精选&lt;&#x2F;a&gt;的推特 Bot 的&lt;a rel=&quot;noopener nofollow noreferrer&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;theowenyoung&#x2F;blog&#x2F;blob&#x2F;main&#x2F;scripts&#x2F;hackernewszh&#x2F;mod.js#L14&quot;&gt;服务&lt;&#x2F;a&gt;放在了 Deno Deploy 里，然后在这个 Cronbin 里添加一个每&lt;code&gt;60&lt;&#x2F;code&gt;分钟的定时请求： &lt;code&gt;https:&#x2F;&#x2F;task.owenyoung.com&#x2F;runHackernewszhTask?key=abc&lt;&#x2F;code&gt;，这样就搞定了这个 bot 的定时发布程序。&lt;&#x2F;p&gt;
&lt;p&gt;目前还有一个痛点，就是发布推文这个 API，要是只有一个账户还好，但是我同时有很多个 Bot，所以最好是有一个 UI 界面可以绑定多账户，然后提供一个简单的发布 API 出来。我目前是用 IFTTT 做这件事，If Webhook -&amp;gt; Then Post a Tweet. 目前 IFTTT 免费层级只能绑定一个账户。所以我新开了一个坑&lt;a rel=&quot;noopener nofollow noreferrer&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;theowenyoung&#x2F;simpleapi&quot;&gt;SimpleAPI&lt;&#x2F;a&gt;,准备用无服务器的方式提供任何接口的 SimpleAPI 版本，不知道能不能填上这个坑。&lt;&#x2F;p&gt;
&lt;p&gt;如果你想部署该服务，可以参考我写的这个&lt;a rel=&quot;noopener nofollow noreferrer&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;theowenyoung&#x2F;blog&#x2F;tree&#x2F;main&#x2F;scripts&#x2F;cronbin&quot;&gt;文档&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
</content>
    </entry>
    <entry xml:lang="zh">
        <title>在 Cloudflare Workers 部署一个 JSON as a Storage 服务</title>
        <published>2023-03-09T01:38:46+08:00</published>
        <updated>2023-03-09T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Owen Young
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://old.owenyoung.com/blog/jsonbin/"/>
        <id>https://old.owenyoung.com/blog/jsonbin/</id>
        
        <summary type="html">&lt;p&gt;我特别喜欢&lt;a rel=&quot;noopener nofollow noreferrer&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;www.json.org&#x2F;json-en.html&quot;&gt;JSON&lt;&#x2F;a&gt;, 因为它真的很小巧和简单，幸运的是，它还是我使用的主要语言 Javascript 和 Typescript 里的一级公民，也太幸运了吧！&lt;&#x2F;p&gt;
&lt;p&gt;我经常用本地的 JSON 文件来存储一些需要持久化的数据，这样可以省掉要调试 sql 或者 redis 的大把时间，而且数据都是明文纯文本存储，搜索，定位问题都很方便，比如整个&lt;a rel=&quot;noopener nofollow noreferrer&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;www.buzzing.cc&#x2F;&quot;&gt;Buzzing&lt;&#x2F;a&gt; 还有整个&lt;a rel=&quot;noopener nofollow noreferrer&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;www.trackawesomelist.com&#x2F;&quot;&gt;Track Awesome List&lt;&#x2F;a&gt; 都只使用 JSON 作为持久化存储的格式。&lt;&#x2F;p&gt;
&lt;p&gt;但是像这样比较大的项目，我会把 JSON 文件存储到 Cloudflare 的 R2 服务里（类似 AWS 的 S3 ），但是除此之外，我还有很多小小的工作流，这些东西通常也需要一个持久化的数据存储，比如一个 RSS 的监控服务，我需要记录哪些 ID 已经被发送过了，这是一个很常见的需求，但是要寻找一个适合的服务也不是一件容易的事，所以今天我尝试搜索了一下 JSON as a Storage 方案，最后决定采用 Cloudfalre 的 Workers 作为 host, 其实也就几十行代码的事，Workers 好就好在一次部署，终生不用再管，所以特别适合这种服务。&lt;&#x2F;p&gt;
</summary>
        
        <content type="html" xml:base="https://old.owenyoung.com/blog/jsonbin/">&lt;p&gt;我特别喜欢&lt;a rel=&quot;noopener nofollow noreferrer&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;www.json.org&#x2F;json-en.html&quot;&gt;JSON&lt;&#x2F;a&gt;, 因为它真的很小巧和简单，幸运的是，它还是我使用的主要语言 Javascript 和 Typescript 里的一级公民，也太幸运了吧！&lt;&#x2F;p&gt;
&lt;p&gt;我经常用本地的 JSON 文件来存储一些需要持久化的数据，这样可以省掉要调试 sql 或者 redis 的大把时间，而且数据都是明文纯文本存储，搜索，定位问题都很方便，比如整个&lt;a rel=&quot;noopener nofollow noreferrer&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;www.buzzing.cc&#x2F;&quot;&gt;Buzzing&lt;&#x2F;a&gt; 还有整个&lt;a rel=&quot;noopener nofollow noreferrer&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;www.trackawesomelist.com&#x2F;&quot;&gt;Track Awesome List&lt;&#x2F;a&gt; 都只使用 JSON 作为持久化存储的格式。&lt;&#x2F;p&gt;
&lt;p&gt;但是像这样比较大的项目，我会把 JSON 文件存储到 Cloudflare 的 R2 服务里（类似 AWS 的 S3 ），但是除此之外，我还有很多小小的工作流，这些东西通常也需要一个持久化的数据存储，比如一个 RSS 的监控服务，我需要记录哪些 ID 已经被发送过了，这是一个很常见的需求，但是要寻找一个适合的服务也不是一件容易的事，所以今天我尝试搜索了一下 JSON as a Storage 方案，最后决定采用 Cloudfalre 的 Workers 作为 host, 其实也就几十行代码的事，Workers 好就好在一次部署，终生不用再管，所以特别适合这种服务。&lt;&#x2F;p&gt;
&lt;span id=&quot;continue-reading&quot;&gt;&lt;&#x2F;span&gt;
&lt;p&gt;部署之后，你会得到一个这样的接口：&lt;&#x2F;p&gt;
&lt;h2 id=&quot;xie-json&quot;&gt;写 json&lt;a class=&quot;zola-anchor&quot; href=&quot;#xie-json&quot; aria-label=&quot;Anchor link for: xie-json&quot;&gt;🔗&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;pre data-lang=&quot;bash&quot; style=&quot;background-color:#2b303b;color:#c0c5ce;&quot; class=&quot;language-bash &quot;&gt;&lt;code class=&quot;language-bash&quot; data-lang=&quot;bash&quot;&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;curl &lt;&#x2F;span&gt;&lt;span&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;https:&#x2F;&#x2F;json.owenyoung.com&#x2F;foo&#x2F;bar?key=abc&lt;&#x2F;span&gt;&lt;span&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt; --data &lt;&#x2F;span&gt;&lt;span&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;{&amp;quot;foo&amp;quot;:&amp;quot;bar&amp;quot;}&lt;&#x2F;span&gt;&lt;span&gt;&amp;#39;
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;h2 id=&quot;du-json&quot;&gt;读 json&lt;a class=&quot;zola-anchor&quot; href=&quot;#du-json&quot; aria-label=&quot;Anchor link for: du-json&quot;&gt;🔗&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;pre data-lang=&quot;bash&quot; style=&quot;background-color:#2b303b;color:#c0c5ce;&quot; class=&quot;language-bash &quot;&gt;&lt;code class=&quot;language-bash&quot; data-lang=&quot;bash&quot;&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;curl &lt;&#x2F;span&gt;&lt;span&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;https:&#x2F;&#x2F;json.owenyoung.com&#x2F;foo&#x2F;bar?key=abc&lt;&#x2F;span&gt;&lt;span&gt;&amp;#39;
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;h3 id=&quot;shi-li-ru-he-ji-lu-yi-fa-song-de-rss-ids&quot;&gt;示例：如何记录已发送的 RSS ids&lt;a class=&quot;zola-anchor&quot; href=&quot;#shi-li-ru-he-ji-lu-yi-fa-song-de-rss-ids&quot; aria-label=&quot;Anchor link for: shi-li-ru-he-ji-lu-yi-fa-song-de-rss-ids&quot;&gt;🔗&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;pre data-lang=&quot;javascript&quot; style=&quot;background-color:#2b303b;color:#c0c5ce;&quot; class=&quot;language-javascript &quot;&gt;&lt;code class=&quot;language-javascript&quot; data-lang=&quot;javascript&quot;&gt;&lt;span style=&quot;color:#b48ead;&quot;&gt;let &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;sentArr &lt;&#x2F;span&gt;&lt;span&gt;= [];
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#b48ead;&quot;&gt;const &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;response &lt;&#x2F;span&gt;&lt;span&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;color:#b48ead;&quot;&gt;await &lt;&#x2F;span&gt;&lt;span style=&quot;color:#8fa1b3;&quot;&gt;fetch&lt;&#x2F;span&gt;&lt;span&gt;(
&lt;&#x2F;span&gt;&lt;span&gt;  &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;https:&#x2F;&#x2F;json.owenyoung.com&#x2F;rss&#x2F;hackernews&#x2F;sent?key=abc&lt;&#x2F;span&gt;&lt;span&gt;&amp;quot;
&lt;&#x2F;span&gt;&lt;span&gt;);
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#b48ead;&quot;&gt;if &lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;response&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;ok&lt;&#x2F;span&gt;&lt;span&gt;) {
&lt;&#x2F;span&gt;&lt;span&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;sentArr &lt;&#x2F;span&gt;&lt;span&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;color:#b48ead;&quot;&gt;await &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;response&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#8fa1b3;&quot;&gt;json&lt;&#x2F;span&gt;&lt;span&gt;();
&lt;&#x2F;span&gt;&lt;span&gt;} &lt;&#x2F;span&gt;&lt;span style=&quot;color:#b48ead;&quot;&gt;else &lt;&#x2F;span&gt;&lt;span&gt;{
&lt;&#x2F;span&gt;&lt;span&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#b48ead;&quot;&gt;if &lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;response&lt;&#x2F;span&gt;&lt;span&gt;.status === &lt;&#x2F;span&gt;&lt;span style=&quot;color:#d08770;&quot;&gt;404&lt;&#x2F;span&gt;&lt;span&gt;) {
&lt;&#x2F;span&gt;&lt;span&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;sentArr &lt;&#x2F;span&gt;&lt;span&gt;= [];
&lt;&#x2F;span&gt;&lt;span&gt;  } &lt;&#x2F;span&gt;&lt;span style=&quot;color:#b48ead;&quot;&gt;else &lt;&#x2F;span&gt;&lt;span&gt;{
&lt;&#x2F;span&gt;&lt;span&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#b48ead;&quot;&gt;throw &lt;&#x2F;span&gt;&lt;span&gt;new Error(`&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;${&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;response&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;.status}: ${&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;response&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;.statusText}&lt;&#x2F;span&gt;&lt;span&gt;`);
&lt;&#x2F;span&gt;&lt;span&gt;  }
&lt;&#x2F;span&gt;&lt;span&gt;}
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ebcb8b;&quot;&gt;console&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#96b5b4;&quot;&gt;log&lt;&#x2F;span&gt;&lt;span&gt;(&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;current sentArr&lt;&#x2F;span&gt;&lt;span&gt;&amp;quot;, &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;sentArr&lt;&#x2F;span&gt;&lt;span&gt;);
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#65737e;&quot;&gt;&#x2F;&#x2F; do some work
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;sentArr&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#96b5b4;&quot;&gt;push&lt;&#x2F;span&gt;&lt;span&gt;(&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;456&lt;&#x2F;span&gt;&lt;span&gt;&amp;quot;);
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#65737e;&quot;&gt;&#x2F;&#x2F; write the newest sentArr to KV
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#b48ead;&quot;&gt;const &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;writeResponse &lt;&#x2F;span&gt;&lt;span&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;color:#b48ead;&quot;&gt;await &lt;&#x2F;span&gt;&lt;span style=&quot;color:#8fa1b3;&quot;&gt;fetch&lt;&#x2F;span&gt;&lt;span&gt;(
&lt;&#x2F;span&gt;&lt;span&gt;  &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;https:&#x2F;&#x2F;json.owenyoung.com&#x2F;rss&#x2F;hackernews&#x2F;sent?key=abc&lt;&#x2F;span&gt;&lt;span&gt;&amp;quot;,
&lt;&#x2F;span&gt;&lt;span&gt;  {
&lt;&#x2F;span&gt;&lt;span&gt;    method: &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;POST&lt;&#x2F;span&gt;&lt;span&gt;&amp;quot;,
&lt;&#x2F;span&gt;&lt;span&gt;    body: JSON.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#96b5b4;&quot;&gt;stringify&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;sentArr&lt;&#x2F;span&gt;&lt;span&gt;),
&lt;&#x2F;span&gt;&lt;span&gt;  }
&lt;&#x2F;span&gt;&lt;span&gt;);
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#b48ead;&quot;&gt;if &lt;&#x2F;span&gt;&lt;span&gt;(!&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;writeResponse&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;ok&lt;&#x2F;span&gt;&lt;span&gt;) {
&lt;&#x2F;span&gt;&lt;span&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#b48ead;&quot;&gt;throw &lt;&#x2F;span&gt;&lt;span&gt;new Error(`&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;${&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;writeResponse&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;.status}: ${&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;writeResponse&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;.statusText}&lt;&#x2F;span&gt;&lt;span&gt;`);
&lt;&#x2F;span&gt;&lt;span&gt;}
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;好吧，上面那一坨有点烦，我&lt;a rel=&quot;noopener nofollow noreferrer&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;theowenyoung&#x2F;blog&#x2F;blob&#x2F;main&#x2F;scripts&#x2F;jsonbin&#x2F;mod.ts&quot;&gt;封装了一个叫 JSONBin 的类&lt;&#x2F;a&gt;，我喜欢用 Deno 写这种小脚本，所以你可以在 Deno 中这样使用：&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;typescript&quot; style=&quot;background-color:#2b303b;color:#c0c5ce;&quot; class=&quot;language-typescript &quot;&gt;&lt;code class=&quot;language-typescript&quot; data-lang=&quot;typescript&quot;&gt;&lt;span style=&quot;color:#b48ead;&quot;&gt;import &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;JSONBin &lt;&#x2F;span&gt;&lt;span style=&quot;color:#b48ead;&quot;&gt;from &lt;&#x2F;span&gt;&lt;span&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;https:&#x2F;&#x2F;deno.land&#x2F;x&#x2F;jsonbin@v0.0.5&#x2F;mod.ts&lt;&#x2F;span&gt;&lt;span&gt;&amp;quot;;
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#b48ead;&quot;&gt;const &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;jsonBin &lt;&#x2F;span&gt;&lt;span&gt;= new JSONBin({
&lt;&#x2F;span&gt;&lt;span&gt;  api: &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;https:&#x2F;&#x2F;json.owenyoung.com&lt;&#x2F;span&gt;&lt;span&gt;&amp;quot;,
&lt;&#x2F;span&gt;&lt;span&gt;  key: &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;abc&lt;&#x2F;span&gt;&lt;span&gt;&amp;quot;,
&lt;&#x2F;span&gt;&lt;span&gt;});
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#b48ead;&quot;&gt;const &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;sentArr &lt;&#x2F;span&gt;&lt;span&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;color:#b48ead;&quot;&gt;await &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;jsonBin&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#96b5b4;&quot;&gt;get&lt;&#x2F;span&gt;&lt;span&gt;(&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;&#x2F;rss&#x2F;abc&lt;&#x2F;span&gt;&lt;span&gt;&amp;quot;, []);
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ebcb8b;&quot;&gt;console&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#96b5b4;&quot;&gt;log&lt;&#x2F;span&gt;&lt;span&gt;(&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;current sentArr&lt;&#x2F;span&gt;&lt;span&gt;&amp;quot;, &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;sentArr&lt;&#x2F;span&gt;&lt;span&gt;);
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#65737e;&quot;&gt;&#x2F;&#x2F; do some work
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#65737e;&quot;&gt;&#x2F;&#x2F; ...
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;sentArr&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#96b5b4;&quot;&gt;push&lt;&#x2F;span&gt;&lt;span&gt;(&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;456&lt;&#x2F;span&gt;&lt;span&gt;&amp;quot;);
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#65737e;&quot;&gt;&#x2F;&#x2F; write the newest sentArr to KV
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#b48ead;&quot;&gt;await &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;jsonBin&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#96b5b4;&quot;&gt;set&lt;&#x2F;span&gt;&lt;span&gt;(&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;&#x2F;rss&#x2F;abc&lt;&#x2F;span&gt;&lt;span&gt;&amp;quot;, &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;sentArr&lt;&#x2F;span&gt;&lt;span&gt;);
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;h2 id=&quot;ru-he-zai-cloudfalre-workers-shang-bu-shu-gai-fu-wu&quot;&gt;如何在 Cloudfalre Workers 上部署该服务&lt;a class=&quot;zola-anchor&quot; href=&quot;#ru-he-zai-cloudfalre-workers-shang-bu-shu-gai-fu-wu&quot; aria-label=&quot;Anchor link for: ru-he-zai-cloudfalre-workers-shang-bu-shu-gai-fu-wu&quot;&gt;🔗&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;如下：&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;先在 &lt;a rel=&quot;noopener nofollow noreferrer&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;dash.cloudflare.com&#x2F;&quot;&gt;Cloudfalre&lt;&#x2F;a&gt; 创建一个 KV 命名空间, &lt;code&gt;Workers -&amp;gt; KV&lt;&#x2F;code&gt; , 名字可以叫：&lt;code&gt;jsonbin&lt;&#x2F;code&gt;&lt;&#x2F;li&gt;
&lt;li&gt;然后在&lt;a rel=&quot;noopener nofollow noreferrer&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;dash.cloudflare.com&#x2F;&quot;&gt;Cloudfalre&lt;&#x2F;a&gt; 创建一个 Worker, 在该 Worker 的 Settings -&amp;gt; Variables -&amp;gt; KV Namespace Bindings , 绑定刚刚创建的 KV， Variable name 填：&lt;code&gt;JSONBIN&lt;&#x2F;code&gt;, kv namespace 选择刚刚那个就可以了.&lt;&#x2F;li&gt;
&lt;li&gt;点击快速编辑，把 &lt;a rel=&quot;noopener nofollow noreferrer&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;theowenyoung&#x2F;blog&#x2F;blob&#x2F;main&#x2F;scripts&#x2F;jsonbin&#x2F;main.js&quot;&gt;&lt;code&gt;main.js&lt;&#x2F;code&gt;&lt;&#x2F;a&gt; 里的代码粘贴进去, 记得修改一下密钥。&lt;&#x2F;li&gt;
&lt;li&gt;如果有需要，可以在 Triggers 里面配置绑定的自定义域名，我绑定了一个 &lt;code&gt;json.owenyoung.com&lt;&#x2F;code&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;blockquote&gt;
&lt;p&gt;灵感和初始代码来自 &lt;a rel=&quot;noopener nofollow noreferrer&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;huhuhang&#x2F;jsonbase&#x2F;blob&#x2F;master&#x2F;index.js&quot;&gt;这里 jsonbase &lt;&#x2F;a&gt;，我加了一点鲁棒性在里面！&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;
&lt;p&gt;希望这个小脚本成为你的工作流中的粘合剂！&lt;&#x2F;p&gt;
</content>
    </entry>
    <entry xml:lang="zh">
        <title>在中国自动生成免费HTTPS证书的最佳方案</title>
        <published>2022-03-25T00:00:00+00:00</published>
        <updated>2022-03-25T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Owen Young
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://old.owenyoung.com/blog/auto-https-ssl-in-china/"/>
        <id>https://old.owenyoung.com/blog/auto-https-ssl-in-china/</id>
        
        <summary type="html">&lt;p&gt;Certbot 自动生成 Lets encrypt 的方案已经被墙了，经过各种尝试之后，发现基于 &lt;a rel=&quot;noopener nofollow noreferrer&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;acmesh-official&#x2F;acme.sh&quot;&gt;&lt;code&gt;amce.sh+cloudflare&lt;&#x2F;code&gt;&lt;&#x2F;a&gt; 的 dns 解析是最方便无痛的.&lt;&#x2F;p&gt;
</summary>
        
        <content type="html" xml:base="https://old.owenyoung.com/blog/auto-https-ssl-in-china/">&lt;p&gt;Certbot 自动生成 Lets encrypt 的方案已经被墙了，经过各种尝试之后，发现基于 &lt;a rel=&quot;noopener nofollow noreferrer&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;acmesh-official&#x2F;acme.sh&quot;&gt;&lt;code&gt;amce.sh+cloudflare&lt;&#x2F;code&gt;&lt;&#x2F;a&gt; 的 dns 解析是最方便无痛的.&lt;&#x2F;p&gt;
&lt;span id=&quot;continue-reading&quot;&gt;&lt;&#x2F;span&gt;
&lt;ol&gt;
&lt;li&gt;下载 acme 工具:&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;pre data-lang=&quot;bash&quot; style=&quot;background-color:#2b303b;color:#c0c5ce;&quot; class=&quot;language-bash &quot;&gt;&lt;code class=&quot;language-bash&quot; data-lang=&quot;bash&quot;&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#65737e;&quot;&gt;# 用root用户权限，因为涉及到操作nginx
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;sudo&lt;&#x2F;span&gt;&lt;span&gt; su
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;wget -O&lt;&#x2F;span&gt;&lt;span&gt; - https:&#x2F;&#x2F;get.acme.sh | &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;sh -s&lt;&#x2F;span&gt;&lt;span&gt; email=my@example.com
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;域名在 &lt;a rel=&quot;noopener nofollow noreferrer&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;www.cloudflare.com&#x2F;zh-cn&#x2F;&quot;&gt;Cloudflare&lt;&#x2F;a&gt; 解析&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;在某个域名的 dashboard 面板右侧找到 &lt;code&gt;Account ID&lt;&#x2F;code&gt;, 记录下备用。&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;进入&lt;a rel=&quot;noopener nofollow noreferrer&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;dash.cloudflare.com&#x2F;profile&#x2F;api-tokens&quot;&gt;https:&#x2F;&#x2F;dash.cloudflare.com&#x2F;profile&#x2F;api-tokens&lt;&#x2F;a&gt;，生成一个 API Token,选择&lt;code&gt;Edit Zone&lt;&#x2F;code&gt; 模版，Zone Resources 选择 &lt;code&gt;All Zones&lt;&#x2F;code&gt;,生成，&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;p&gt;把以下的信息保存到 &lt;code&gt;~&#x2F;.bashrc&lt;&#x2F;code&gt;&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;bash&quot; style=&quot;background-color:#2b303b;color:#c0c5ce;&quot; class=&quot;language-bash &quot;&gt;&lt;code class=&quot;language-bash&quot; data-lang=&quot;bash&quot;&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#b48ead;&quot;&gt;export &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;CF_Token&lt;&#x2F;span&gt;&lt;span&gt;=&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;sdfsdfsdfljlbjkljlkjsdfoiwje&lt;&#x2F;span&gt;&lt;span&gt;&amp;quot;
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#b48ead;&quot;&gt;export &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;CF_Account_ID&lt;&#x2F;span&gt;&lt;span&gt;=&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;xxxxxxxxxxxxx&lt;&#x2F;span&gt;&lt;span&gt;&amp;quot;
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;pre data-lang=&quot;bash&quot; style=&quot;background-color:#2b303b;color:#c0c5ce;&quot; class=&quot;language-bash &quot;&gt;&lt;code class=&quot;language-bash&quot; data-lang=&quot;bash&quot;&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#96b5b4;&quot;&gt;source &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;~&lt;&#x2F;span&gt;&lt;span&gt;&#x2F;.bashrc
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;blockquote&gt;
&lt;p&gt;如果有什么不清楚的，可以参考文档： &lt;a rel=&quot;noopener nofollow noreferrer&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;acmesh-official&#x2F;acme.sh&#x2F;wiki&#x2F;dnsapi&quot;&gt;https:&#x2F;&#x2F;github.com&#x2F;acmesh-official&#x2F;acme.sh&#x2F;wiki&#x2F;dnsapi&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;签发证书，运行 &lt;code&gt;acme.sh --issue --dns dns_cf -d example.com --server letsencrypt&lt;&#x2F;code&gt;&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;安装证书到指定目录：&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;pre data-lang=&quot;bash&quot; style=&quot;background-color:#2b303b;color:#c0c5ce;&quot; class=&quot;language-bash &quot;&gt;&lt;code class=&quot;language-bash&quot; data-lang=&quot;bash&quot;&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;acme.sh --install-cert -d&lt;&#x2F;span&gt;&lt;span&gt; example.com \
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;--key-file&lt;&#x2F;span&gt;&lt;span&gt; &#x2F;etc&#x2F;nginx&#x2F;ssl&#x2F;example.com.key \
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;--fullchain-file&lt;&#x2F;span&gt;&lt;span&gt; &#x2F;etc&#x2F;nginx&#x2F;ssl&#x2F;example.com.crt \
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;--reloadcmd &lt;&#x2F;span&gt;&lt;span&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;service nginx force-reload&lt;&#x2F;span&gt;&lt;span&gt;&amp;quot;
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;之后 acme 会自动添加 cron 任务，自动续期期限&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;nginx 配置参考&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;p&gt;可以在&lt;a rel=&quot;noopener nofollow noreferrer&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;www.digitalocean.com&#x2F;community&#x2F;tools&#x2F;nginx?domains.0.https.certType=custom&amp;amp;domains.0.php.php=false&amp;amp;domains.0.reverseProxy.reverseProxy=true&amp;amp;domains.0.routing.root=false&amp;amp;global.app.lang=zhCN&quot;&gt;这里&lt;&#x2F;a&gt; 在线生成一份合适的 ssl 配置&lt;&#x2F;p&gt;
&lt;p&gt;生成后，首次需要初始化 Diffie-Hellman keys:&lt;code&gt;openssl dhparam -out &#x2F;etc&#x2F;nginx&#x2F;dhparam.pem 2048&lt;&#x2F;code&gt;&lt;&#x2F;p&gt;
&lt;p&gt;然后运行 &lt;code&gt;sudo nginx -t &amp;amp;&amp;amp; sudo systemctl reload nginx&lt;&#x2F;code&gt;&lt;&#x2F;p&gt;
</content>
    </entry>
    <entry xml:lang="zh">
        <title>Jackett 安装指南</title>
        <published>2021-03-26T00:00:00+00:00</published>
        <updated>2022-03-26T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Owen Young
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://old.owenyoung.com/blog/jackett-setup/"/>
        <id>https://old.owenyoung.com/blog/jackett-setup/</id>
        
        <summary type="html">&lt;p&gt;Jackett 是一款开源的种子聚合搜索服务，常用来和 BT 下载器配合使用。&lt;&#x2F;p&gt;
&lt;p&gt;Read more at &lt;a rel=&quot;noopener nofollow noreferrer&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;Jackett&#x2F;Jackett#install-as-service&quot;&gt;here&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
</summary>
        
        <content type="html" xml:base="https://old.owenyoung.com/blog/jackett-setup/">&lt;p&gt;Jackett 是一款开源的种子聚合搜索服务，常用来和 BT 下载器配合使用。&lt;&#x2F;p&gt;
&lt;p&gt;Read more at &lt;a rel=&quot;noopener nofollow noreferrer&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;Jackett&#x2F;Jackett#install-as-service&quot;&gt;here&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;span id=&quot;continue-reading&quot;&gt;&lt;&#x2F;span&gt;&lt;h2 id=&quot;install&quot;&gt;Install&lt;a class=&quot;zola-anchor&quot; href=&quot;#install&quot; aria-label=&quot;Anchor link for: install&quot;&gt;🔗&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;ol&gt;
&lt;li&gt;Download and extract the latest &lt;code&gt;Jackett.Binaries.LinuxAMDx64.tar.gz&lt;&#x2F;code&gt; release from the &lt;a rel=&quot;noopener nofollow noreferrer&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;Jackett&#x2F;Jackett&#x2F;releases&quot;&gt;releases page&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;pre data-lang=&quot;bash&quot; style=&quot;background-color:#2b303b;color:#c0c5ce;&quot; class=&quot;language-bash &quot;&gt;&lt;code class=&quot;language-bash&quot; data-lang=&quot;bash&quot;&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;wget&lt;&#x2F;span&gt;&lt;span&gt; https:&#x2F;&#x2F;github.com&#x2F;Jackett&#x2F;Jackett&#x2F;releases&#x2F;download&#x2F;v0.18.545&#x2F;Jackett.Binaries.LinuxAMDx64.tar.gz
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#65737e;&quot;&gt;# tar to a directory you want
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;tar -xf&lt;&#x2F;span&gt;&lt;span&gt; Jackett.Binaries.LinuxAMDx64.tar.gz
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;ol start=&quot;2&quot;&gt;
&lt;li&gt;To install Jackett as a service, open a Terminal, cd to the jackett folder and run &lt;code&gt;sudo .&#x2F;install_service_systemd.sh&lt;&#x2F;code&gt; You need root permissions to install the service. The service will start on each logon. You can always stop it by running &lt;code&gt;systemctl stop jackett.service&lt;&#x2F;code&gt; from Terminal. You can start it again it using &lt;code&gt;systemctl start jackett.service&lt;&#x2F;code&gt;. Logs are stored as usual under &lt;code&gt;~&#x2F;.config&#x2F;Jackett&#x2F;log.txt&lt;&#x2F;code&gt; and also in &lt;code&gt;journalctl -u jackett.service&lt;&#x2F;code&gt;.&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;p&gt;&lt;code&gt;http:&#x2F;&#x2F;your-ip:9117&lt;&#x2F;code&gt;&lt;&#x2F;p&gt;
&lt;p&gt;You can set password, or port by UI.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;jackett-suo-yin-tui-jian&quot;&gt;Jackett 索引推荐&lt;a class=&quot;zola-anchor&quot; href=&quot;#jackett-suo-yin-tui-jian&quot; aria-label=&quot;Anchor link for: jackett-suo-yin-tui-jian&quot;&gt;🔗&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;ul&gt;
&lt;li&gt;EZTV&lt;&#x2F;li&gt;
&lt;li&gt;RARBG&lt;&#x2F;li&gt;
&lt;li&gt;YTS&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
</content>
    </entry>
    <entry xml:lang="zh">
        <title>Jellyfin安装指南</title>
        <published>2021-03-26T00:00:00+00:00</published>
        <updated>2022-03-26T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Owen Young
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://old.owenyoung.com/blog/jellyfin-setup/"/>
        <id>https://old.owenyoung.com/blog/jellyfin-setup/</id>
        
        <summary type="html">&lt;p&gt;Jellyfin 是一款开源的，拥有前后端服务的视频播放器和服务端程序。&lt;&#x2F;p&gt;
</summary>
        
        <content type="html" xml:base="https://old.owenyoung.com/blog/jellyfin-setup/">&lt;p&gt;Jellyfin 是一款开源的，拥有前后端服务的视频播放器和服务端程序。&lt;&#x2F;p&gt;
&lt;span id=&quot;continue-reading&quot;&gt;&lt;&#x2F;span&gt;&lt;h2 id=&quot;install&quot;&gt;Install&lt;a class=&quot;zola-anchor&quot; href=&quot;#install&quot; aria-label=&quot;Anchor link for: install&quot;&gt;🔗&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;See &lt;a rel=&quot;noopener nofollow noreferrer&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;jellyfin.org&#x2F;docs&#x2F;general&#x2F;administration&#x2F;installing.html#debian&quot;&gt;Installing Jellyfin | Documentation - Jellyfin Project&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;h2 id=&quot;usage&quot;&gt;Usage&lt;a class=&quot;zola-anchor&quot; href=&quot;#usage&quot; aria-label=&quot;Anchor link for: usage&quot;&gt;🔗&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;pre data-lang=&quot;bash&quot; style=&quot;background-color:#2b303b;color:#c0c5ce;&quot; class=&quot;language-bash &quot;&gt;&lt;code class=&quot;language-bash&quot; data-lang=&quot;bash&quot;&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;sudo&lt;&#x2F;span&gt;&lt;span&gt; systemctl restart jellyfin
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;h2 id=&quot;zhong-wen-zi-ti&quot;&gt;中文字体&lt;a class=&quot;zola-anchor&quot; href=&quot;#zhong-wen-zi-ti&quot; aria-label=&quot;Anchor link for: zhong-wen-zi-ti&quot;&gt;🔗&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Download google noto fonts:
This &lt;a rel=&quot;noopener nofollow noreferrer&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;CodePlayer&#x2F;webfont-noto&quot;&gt;repo&lt;&#x2F;a&gt; compiled noto fonts, so you can just download it and use it.&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;bash&quot; style=&quot;background-color:#2b303b;color:#c0c5ce;&quot; class=&quot;language-bash &quot;&gt;&lt;code class=&quot;language-bash&quot; data-lang=&quot;bash&quot;&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;wget&lt;&#x2F;span&gt;&lt;span&gt; https:&#x2F;&#x2F;github.com&#x2F;CodePlayer&#x2F;webfont-noto&#x2F;raw&#x2F;master&#x2F;dist&#x2F;NotoSans&#x2F;NotoSansCJKsc-hinted&#x2F;subset&#x2F;NotoSansCJKsc-hinted-standard&#x2F;NotoSansCJKsc-Regular.woff2
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;At Jellyfin Admin dashboard, player, open back font, add the font path&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;h2 id=&quot;faq&quot;&gt;FAQ&lt;a class=&quot;zola-anchor&quot; href=&quot;#faq&quot; aria-label=&quot;Anchor link for: faq&quot;&gt;🔗&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a rel=&quot;noopener nofollow noreferrer&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;jellyfin&#x2F;jellyfin-web&#x2F;issues&#x2F;934&quot;&gt;Jellyfin 中文字体问题&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
</content>
    </entry>
    <entry xml:lang="zh">
        <title>Debian初始化Rust环境</title>
        <published>2021-03-26T00:00:00+00:00</published>
        <updated>2022-03-26T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Owen Young
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://old.owenyoung.com/blog/rust-environment-setup-for-debian/"/>
        <id>https://old.owenyoung.com/blog/rust-environment-setup-for-debian/</id>
        
        <summary type="html">&lt;p&gt;在 Debian 上初始化 Rust 环境笔记。&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a rel=&quot;noopener nofollow noreferrer&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;www.rust-lang.org&#x2F;learn&#x2F;get-started&quot;&gt;Official Site&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
 </summary>
        
        <content type="html" xml:base="https://old.owenyoung.com/blog/rust-environment-setup-for-debian/">&lt;p&gt;在 Debian 上初始化 Rust 环境笔记。&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a rel=&quot;noopener nofollow noreferrer&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;www.rust-lang.org&#x2F;learn&#x2F;get-started&quot;&gt;Official Site&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
 &lt;span id=&quot;continue-reading&quot;&gt;&lt;&#x2F;span&gt;&lt;h2 id=&quot;rust-jing-xiang-she-zhi&quot;&gt;Rust 镜像设置&lt;a class=&quot;zola-anchor&quot; href=&quot;#rust-jing-xiang-she-zhi&quot; aria-label=&quot;Anchor link for: rust-jing-xiang-she-zhi&quot;&gt;🔗&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;&lt;a rel=&quot;noopener nofollow noreferrer&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;rsproxy.cn&#x2F;&quot;&gt;https:&#x2F;&#x2F;rsproxy.cn&#x2F;&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;Add this to &lt;code&gt;~&#x2F;.bashrc&lt;&#x2F;code&gt;&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;bash&quot; style=&quot;background-color:#2b303b;color:#c0c5ce;&quot; class=&quot;language-bash &quot;&gt;&lt;code class=&quot;language-bash&quot; data-lang=&quot;bash&quot;&gt;&lt;span style=&quot;color:#b48ead;&quot;&gt;export &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;RUSTUP_DIST_SERVER&lt;&#x2F;span&gt;&lt;span&gt;=&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;https:&#x2F;&#x2F;rsproxy.cn&lt;&#x2F;span&gt;&lt;span&gt;&amp;quot;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#b48ead;&quot;&gt;export &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;RUSTUP_UPDATE_ROOT&lt;&#x2F;span&gt;&lt;span&gt;=&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;https:&#x2F;&#x2F;rsproxy.cn&#x2F;rustup&lt;&#x2F;span&gt;&lt;span&gt;&amp;quot;
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Install rustup &lt;code&gt;curl --proto &#x27;=https&#x27; --tlsv1.2 -sSf https:&#x2F;&#x2F;rsproxy.cn&#x2F;rustup-init.sh | sh&lt;&#x2F;code&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;code&gt;~&#x2F;.cargo&#x2F;config&lt;&#x2F;code&gt;:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;bash&quot; style=&quot;background-color:#2b303b;color:#c0c5ce;&quot; class=&quot;language-bash &quot;&gt;&lt;code class=&quot;language-bash&quot; data-lang=&quot;bash&quot;&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;[source.crates-io]
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;replace-with&lt;&#x2F;span&gt;&lt;span&gt; = &amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;rsproxy&lt;&#x2F;span&gt;&lt;span&gt;&amp;#39;
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;[source.rsproxy]
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;registry&lt;&#x2F;span&gt;&lt;span&gt; = &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;https:&#x2F;&#x2F;rsproxy.cn&#x2F;crates.io-index&lt;&#x2F;span&gt;&lt;span&gt;&amp;quot;
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;[registries.rsproxy]
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;index&lt;&#x2F;span&gt;&lt;span&gt; = &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;https:&#x2F;&#x2F;rsproxy.cn&#x2F;crates.io-index&lt;&#x2F;span&gt;&lt;span&gt;&amp;quot;
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;[net]
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;git-fetch-with-cli&lt;&#x2F;span&gt;&lt;span&gt; = true
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;h2 id=&quot;install&quot;&gt;Install&lt;a class=&quot;zola-anchor&quot; href=&quot;#install&quot; aria-label=&quot;Anchor link for: install&quot;&gt;🔗&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;pre data-lang=&quot;bash&quot; style=&quot;background-color:#2b303b;color:#c0c5ce;&quot; class=&quot;language-bash &quot;&gt;&lt;code class=&quot;language-bash&quot; data-lang=&quot;bash&quot;&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;curl --proto &lt;&#x2F;span&gt;&lt;span&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;=https&lt;&#x2F;span&gt;&lt;span&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt; --tlsv1&lt;&#x2F;span&gt;&lt;span&gt;.2&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt; -sSf&lt;&#x2F;span&gt;&lt;span&gt; https:&#x2F;&#x2F;sh.rustup.rs | &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;sh
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
</content>
    </entry>
</feed>
