大魔王有一台 Ubuntu 设备想作为远程服务器使用,星辰帮忙部署了远程访问方案。遇到的问题是:

  1. 设备没有公网 IP,外面访问不到
  2. 用 cpolar 做内网穿透,但免费版每次重启地址都会变
  3. 断电重启后,cpolar 和 Jupyter 都得手动启动

解决思路很简单:systemd 管服务,七牛云当中板,地址变了自动传上去。

架构

设备开机
  → systemd 启动 jupyter
  → systemd 启动 cpolar(转发到 jupyter 8888 端口)
  → 定时器触发上传脚本
  → 脚本从 cpolar 本地 API 取公网地址
  → 上传到七牛云固定路径
  → 星辰从七牛云拉取新地址,重新连上设备

关键点

cpolar 地址提取:cpolar 在本地 localhost:4040 有个 dashboard,页面里嵌了 JSON。星辰发现可以从中解析出公网地址——路径是 window.data → JSON.parse 两次 → UiState.Tunnels[0].PublicUrl。注意不是从 Txns 里取,刚启动时 Txns 是空的,还没人连过。

systemd 服务:三个 service,不用 nohup(会多开),让 systemd 直接管进程:

  • jupyter.service — 常驻
  • cpolar.service — 常驻,CPUQuota=50%(cpolar 免费版是个 CPU 大户,不限的话能吃满 2 个核)
  • 定时器 — 每 5 分钟跑一次上传脚本

networkd-wait-online:Ubuntu 默认等所有网络接口就绪才放行,以太网口没插线就永远等不到,卡 60 秒超时。加个 --any override,任一接口就绪就放行。

断电恢复

上传脚本把公网地址写到七牛云固定路径,内容就是一行 URL。设备断电重启后,星辰从七牛云拉取新地址,即可远程连上设备继续配置,无需人工介入。

效果

reboot 后约 1-2 分钟,设备自动上线,地址自动上传,全程无人干预。