背景
因为之前鼓捣了一套「全天候办公系统 」,让我的一堆电脑组成了一个办公集群,让我可以随时随地办公。(详见《码农的快乐你不懂:随便一台破电脑,都能远程高效开发!真·零帧起手·爽爆了!》)
所以我是 Tailscale + RustDesk 的重度用户。这不,这个集群最近又加入了一台 AI 服务器(详见《双 16G V100 本地部署 Qwen3.6》)。
所以我就在想,能不能把这个 AI 服务器启动的服务,变成公网服务,这样就能方便各种工具的接入了。
但是内网服务暴露到公网,要么用收费的软件,要么每次启动地址都会变,都不太符合需求。
于是就有了这个方案云服务器 + Tailscale。
步骤
准备
- 云服务器 :你得有个外网能访问的云服务器,我用的是阿里云的 ECS, 2C2G 的配置就够用了。记得装上
Nginx; - 域名 :最好有个域名,否则直接用 IP 访问的话不太方便,也不太安全。买个最便宜的个人域名就行。比如
myname.top; - Tailscale:保证你的 ECS 和本地机器上都安装了 Tailscale,并登录在同一个虚拟内网里。进 Tailscale 的后台看看就知道了;
- 放开 UDP 41641 端口:在 ECS 的安全管理中,放开 UDP 的 41641 端口,这样 Tailscale 才能直连。
做完上面工作,基本网络层面就差不多搭好了。你可以登录 ECS 上,ping 一下你的本地主机的 Tailscale 内网 IP,应该是能通的。
sh
tailscale ping 100.115.247.79
pong from mini-ubuntu (100.115.247.79) via DERP(hkg) in 161ms # 不是直连
pong from mini-ubuntu (100.115.247.79) via 101.96.65.126:41641 in 196ms # 直连成功
tailscale status # 查看状态,看是否有 direct 字样
奇怪,为什么我测试的 DERP 比直连还快呢......
配置 Nginx
首先,你要把域名的 DNS 配到你的 ECS 的公网 IP 上。比如 test.myname.top 到 114.113.112.111。
然后,配置 ECS 的 Nginx:
sh
cd /etc/nginx/conf.d
touch test.myname.top.conf
然后把下面的内容粘贴进去:
sh
server {
listen 80;
server_name test.myname.top; # 你的域名
location / {
proxy_pass http://100.100.99.99:5678; # 本地服务的 Tailscale IP + 服务端口
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
}
然后
sh
sudo nginx -t
sudo nginx -s reload
这时候,如果你启动了本地服务,那么访问 test.myname.top 的时候,应该就能访问到了。
注意,如果没访问成功,看看你的本地服务是不是起在了 127.0.0.1:5678 上,改成 0.0.0.0:5678 试试。
增加 HTTPS
如果想进一步配置 HTTPS,就安装 certbot 上免费证书即可。
sh
sudo dnf install certbot python3-certbot-nginx -y
sudo certbot --nginx -d test.myname.top
第一次使用,应该会让你输入个邮箱,输入个能用的就行。
注意,上了 HTTPS 之后,你的本地服务可能需要一些配置上的调整,否则可能造成访问失败等问题。
结语
感觉打开了新世界的大门了,也许我的一堆被当成服务器使用的废电脑,能压榨出更多的价值了。
另外,需要注意的是,如果你部署的是网页服务,那么很有可能会因为备案之类的问题被拦截。
所以最好还是提供接口方面的服务比较好。
当然,这个方案的稳定性肯定比不上直接在 ECS 上装服务了,但是在一些非严肃、小范围使用的场景下,还是比较合适的。
它可以突破 ECS 配置的限制,把本地算力部署上去,还是比较有想象力的。
等后面再玩出别的花样,我再来分享~