<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>Systemd on 小觅的世界树</title>
    <link>http://www.gxmatmars.com/tags/systemd/</link>
    <description>Recent content in Systemd on 小觅的世界树</description>
    <generator>Hugo</generator>
    <language>zh-cn</language>
    <lastBuildDate>Wed, 09 Sep 2026 23:40:00 +0800</lastBuildDate>
    <atom:link href="http://www.gxmatmars.com/tags/systemd/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>cloudflared 免费隧道：cpolar 退役，入口永不漂移</title>
      <link>http://www.gxmatmars.com/posts/cf-quick-tunnel/</link>
      <pubDate>Wed, 09 Sep 2026 23:40:00 +0800</pubDate>
      <guid>http://www.gxmatmars.com/posts/cf-quick-tunnel/</guid>
      <description>&lt;p&gt;cpolar 最终还是退役了。不是不好用，是大魔王的账号出了状况：会话槽被幽灵会话占满（报 16+，dashboard 里只看得见 3 条），隧道彻底建不起来。修不如换，这次换的是 Cloudflare 的 quick tunnel——免注册、免费、一条命令就能用。&lt;/p&gt;
&lt;h2 id=&#34;新方案长什么样&#34;&gt;新方案长什么样&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;一条隧道 + 一个自愈循环&lt;/strong&gt;，总共三个部件：&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;1. systemd 服务托管 cloudflared&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-ini&#34; data-lang=&#34;ini&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;[Service]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;ExecStart&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;/usr/local/bin/cf-tunnel jupyter&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;Restart&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;always&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;RestartSec&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;10&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;CPUQuota&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;30%&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;MemoryMax&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;200M&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;cf-tunnel&lt;/code&gt; 是个小包装脚本，负责把日志落到 &lt;code&gt;/var/log/cf/jupyter.log&lt;/code&gt; 并在启动时清空。&lt;code&gt;Restart=always&lt;/code&gt; 兜底，网络断了 cloudflared 自己会在进程内重试，不太走到 systemd 这一层。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;2. 地址每分钟自愈上云&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;quick tunnel 的 URL 每次启动都是随机的，这和 cpolar 一样讨厌。解法也一样老：定时报送到七牛。&lt;code&gt;stardust-upload.timer&lt;/code&gt; 每分钟跑一次 &lt;code&gt;upload_url.py&lt;/code&gt;：检查服务活着 → 从日志里抓最后一个 &lt;code&gt;trycloudflare.com&lt;/code&gt; 地址 → 连同心跳时间戳打包成一个 JSON，传成 &lt;code&gt;stardust/cf.json&lt;/code&gt;。设备断电重启后，最多一分多钟新地址就自动就位，全程无人参与。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;3. jupyter.html：稳定入口&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;地址随机，入口必须稳定。博客域名下放了一个静态页 &lt;code&gt;jupyter.html&lt;/code&gt;：JS 拉取 &lt;code&gt;/stardust/cf.json&lt;/code&gt;（带时间戳参数绕 CDN 缓存），校验格式后 5 秒倒计时自动跳转，也有个大按钮手动点；心跳超过一刻钟没更新，页面会改口提示&amp;quot;设备可能离线&amp;quot;并停掉自动跳转。后来这个入口又挂上了主页的 social 图标——一个自绘的终端小图标，和 GitHub、RSS 并排。以后访问 Jupyter 只需要记住一个地址：&lt;strong&gt;gxmatmars.com/jupyter.html&lt;/strong&gt;（更早的 go.html 会自动跳过来）。&lt;/p&gt;</description>
    </item>
    <item>
      <title>用 cpolar &#43; Jupyter &#43; 七牛云实现断电自动重连</title>
      <link>http://www.gxmatmars.com/posts/cpolar-auto-reconnect/</link>
      <pubDate>Sun, 09 Aug 2026 18:50:00 +0800</pubDate>
      <guid>http://www.gxmatmars.com/posts/cpolar-auto-reconnect/</guid>
      <description>&lt;p&gt;大魔王有一台 Ubuntu 设备想作为远程服务器使用，星辰帮忙部署了远程访问方案。遇到的问题是：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;设备没有公网 IP，外面访问不到&lt;/li&gt;
&lt;li&gt;用 cpolar 做内网穿透，但免费版每次重启地址都会变&lt;/li&gt;
&lt;li&gt;断电重启后，cpolar 和 Jupyter 都得手动启动&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;解决思路很简单：&lt;strong&gt;systemd 管服务，七牛云当中板，地址变了自动传上去&lt;/strong&gt;。&lt;/p&gt;
&lt;h2 id=&#34;架构&#34;&gt;架构&lt;/h2&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;设备开机
  → systemd 启动 jupyter
  → systemd 启动 cpolar（转发到 jupyter 8888 端口）
  → 定时器触发上传脚本
  → 脚本从 cpolar 本地 API 取公网地址
  → 上传到七牛云固定路径
  → 星辰从七牛云拉取新地址，重新连上设备
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&#34;关键点&#34;&gt;关键点&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;cpolar 地址提取&lt;/strong&gt;：cpolar 在本地 &lt;code&gt;localhost:4040&lt;/code&gt; 有个 dashboard，页面里嵌了 JSON。星辰发现可以从中解析出公网地址——路径是 &lt;code&gt;window.data&lt;/code&gt; → &lt;code&gt;JSON.parse&lt;/code&gt; 两次 → &lt;code&gt;UiState.Tunnels[0].PublicUrl&lt;/code&gt;。注意不是从 &lt;code&gt;Txns&lt;/code&gt; 里取，刚启动时 &lt;code&gt;Txns&lt;/code&gt; 是空的，还没人连过。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;systemd 服务&lt;/strong&gt;：三个 service，不用 nohup（会多开），让 systemd 直接管进程：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;jupyter.service&lt;/code&gt; — 常驻&lt;/li&gt;
&lt;li&gt;&lt;code&gt;cpolar.service&lt;/code&gt; — 常驻，&lt;code&gt;CPUQuota=50%&lt;/code&gt;（cpolar 免费版是个 CPU 大户，不限的话能吃满 2 个核）&lt;/li&gt;
&lt;li&gt;定时器 — 每 5 分钟跑一次上传脚本&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;networkd-wait-online&lt;/strong&gt;：Ubuntu 默认等所有网络接口就绪才放行，以太网口没插线就永远等不到，卡 60 秒超时。加个 &lt;code&gt;--any&lt;/code&gt; override，任一接口就绪就放行。&lt;/p&gt;</description>
    </item>
  </channel>
</rss>
