这台笔记本,现在是一台服务器

desktop-dpg62md · Windows 11 · Tailscale Funnel 公网发布
公网访问(任何设备、任何网络)
https://desktop-dpg62md.tail68eaa9.ts.net
自动 HTTPS,无需域名。手机流量下直接可开
内网访问(装了 Tailscale 的设备)
http://100.113.156.117:8099
不依赖公网 DNS,最稳的入口
SSH 远程登录
ssh mengde@100.113.156.117
密码 = Windows 登录密码。只能走 Tailscale

1. 三种入口,分别什么时候用

入口地址适用场景
家里局域网http://192.168.x.x:8099人在家里,最高速
Tailscale 内网http://100.113.156.117:8099在外面用手机查东西、SSH 进去改脚本
Funnel 公网https://desktop-dpg62md.tail68eaa9.ts.net给不装 Tailscale 的人看、分享链接

注意:Funnel 只转发 HTTP / HTTPS,所以 SSH 走不了公网,必须用 Tailscale 网络。

2. 手机怎么连进来

  1. 手机装 Tailscale App,用同一个账号登录(选 Microsoft / GitHub,别选 Google,Google 在国内不通)
  2. SSH 用 Termius 或 JuiceSSH:地址 100.113.156.117、端口 22、用户 mengde
  3. 看网页直接浏览器打开 http://100.113.156.117:8099
公网地址打不开?先开关一次飞行模式刷掉手机 DNS 缓存;还不行就把私人 DNS 改成 doh.pub。换手机流量再试。内网地址 100.113.156.117 是保底方案,一定可用。

3. 把一个新服务发布到公网(核心技能)

以 TickFlow 后端跑在 3011 端口为例,三步:

  1. 确认本地能开——浏览器打开 http://127.0.0.1:3011 有内容
  2. 做成开机自启——不要用 nohup,会话一结束进程就被杀。要用计划任务(见第 5 节)
  3. 挂到 Funnel——443 已被占用,换一个可用端口
# 挂在 8443 端口(Funnel 允许 443 / 8443 / 10000)
sudo "C:\Program Files\Tailscale\tailscale.exe" funnel --bg --https=8443 http://127.0.0.1:3011

# 查看当前所有映射
"C:\Program Files\Tailscale\tailscale.exe" funnel status

之后访问地址就是 https://desktop-dpg62md.tail68eaa9.ts.net:8443。

想在同一域名下用路径分流(/tickflow、/manual)?Funnel 是按端口整体代理的,不支持按路径分发,需要在本地先跑一个反向代理(nginx / caddy)再把它挂上去。

4. 定时任务:这台机器的"闹钟"

任务名时间作用
竞价专用机-0920唤醒就绪09:20唤醒机器,准备竞价数据
竞价专用机-0926兜底并休眠09:26兜底执行后让机器休眠
竞价专用机-1535唤醒就绪15:35唤醒,准备收盘选股
竞价专用机-1545兜底并休眠15:45兜底执行后休眠
server-page-8099开机时常驻本状态页(8099)

脚本位置:D:\盯盘工具,解释器 D:\python\pythonw.exe。--bg 任务配了 WakeToRun,到点会自动唤醒机器。

5. 常用运维命令

# ——— 状态自检 ———
netstat -ano | findstr LISTENING          # 哪些端口在听
tasklist | findstr pythonw                # 后台 Python 进程

# ——— Tailscale ———
"C:\Program Files\Tailscale\tailscale.exe" status          # 设备与对端列表
"C:\Program Files\Tailscale\tailscale.exe" ip -4           # 本机虚拟 IP
"C:\Program Files\Tailscale\tailscale.exe" funnel status   # 公网映射一览

# ——— 服务重启(需管理员) ———
Restart-Service sshd
Restart-Service Tailscale

# ——— 计划任务 ———
Get-ScheduledTask | Where-Object {$_.TaskName -like "*竞价*"} | Get-ScheduledTaskInfo
Start-ScheduledTask -TaskName "server-page-8099"     # 手动触发
Stop-ScheduledTask  -TaskName "server-page-8099"

# ——— 站点日志 ———
type C:\Users\mengde\server_www\server.log

6. 部署一个新常驻服务的标准模板

PowerShell 管理员窗口执行(普通权限注册计划任务会被拒):

$a = New-ScheduledTaskAction -Execute "D:\python\pythonw.exe" `
       -Argument '-m http.server 9000 --directory D:\mysite'
$t = New-ScheduledTaskTrigger -AtLogOn
$p = New-ScheduledTaskPrincipal -UserId "$env:COMPUTERNAME\$env:USERNAME" `
       -LogonType Interactive -RunLevel Limited
$s = New-ScheduledTaskSettingsSet -AllowStartIfOnBatteries `
       -DontStopIfGoingOnBatteries -ExecutionTimeLimit ([TimeSpan]::Zero)

Register-ScheduledTask -TaskName "mysite-9000" -Action $a -Trigger $t `
       -Principal $p -Settings $s -Force
Start-ScheduledTask -TaskName "mysite-9000"
pythonw.exe 的坑:没有控制台时 stderr 是 None,直接 -m http.server 会在第一个请求就静默崩溃(端口看着在听,请求全挂)。解决办法是套一层包装脚本,显式把 stdout/stderr 重定向到文件——参考 C:\Users\mengde\server_www\serve.py。

7. 三条必须记住的注意事项

另:tailscale.com 域名在国内被 DNS 污染,客户端本身不受影响(走 IP 直连控制面),但万一哪天连不上,备选方案是 cpolar / 花生壳这类国内穿透服务。

手册对应配置完成时间:2026-09-24 · 本页随服务器一起对外提供服务