一键导入
tailscale-ops
Expert knowledge for Tailscale VPN operations. Use when configuring remote access, exit nodes, ACL policies, or troubleshooting VPN connectivity.
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
菜单
Expert knowledge for Tailscale VPN operations. Use when configuring remote access, exit nodes, ACL policies, or troubleshooting VPN connectivity.
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
基于 SOC 职业分类
Operating the local coding agent — qwen3-coder via opencode, Claude-orchestrated, spec-driven. Use when running/troubleshooting `oc`, the ralph-qwen loop, or the laptop↔Beelink-qwen creds.
Expert knowledge for cluster backup and restore operations. Use when configuring backups, triggering manual jobs, or restoring data.
Expert knowledge for media applications (Jellyfin, Immich, Jellyseerr). Use when managing media storage, NFS mounts, or application-specific configurations.
Expert knowledge for Pi-hole and Unbound DNS operations. Use when configuring DNS, troubleshooting resolution issues, modifying adlists, or understanding the DNS data flow.
Expert knowledge for cluster observability. Use when configuring Prometheus/Grafana, Alertmanager, Uptime Kuma, or the Homepage dashboard.
Expert knowledge for the Family Board kiosk dashboard (board.lab.mtgibbs.dev) — a framework-light PWA that renders the n8n intake feed. Use when designing or changing the board UI, adding fixtures, or wiring the feed proxy. The deployable workspace is clusters/pi-k3s/family-board/.
| name | tailscale-ops |
| description | Expert knowledge for Tailscale VPN operations. Use when configuring remote access, exit nodes, ACL policies, or troubleshooting VPN connectivity. |
| allowed-tools | Bash, Read, Grep, Glob, Edit, Write |
Mobile ad blocking via Pi-hole exit node and remote access without opening router ports.
Phone (Tailscale App)
│
│ NAT traversal (no open ports)
▼
Pi K3s Cluster
│
├─► Tailscale Operator (manages Connectors, ProxyClasses)
│
└─► Connector Pod (exit node on Pi 5)
│
▼
Pi-hole (192.168.1.55:53) → Unbound → Internet
tailscaletailscale-operator (HelmRelease)Connector resource named pi-cluster-exitnodeSelector: arm64 (Pi 5)The Operator requires an OAuth client with minimal scopes. Extra scopes cause "requested tags are invalid" errors.
| Setting | Value |
|---|---|
| Devices Core | Read + Write |
| Auth Keys | Read + Write |
| Tags | tag:k8s-operator (ONLY) |
| Other Scopes | NONE |
You must grant access to the advertised routes in the Tailscale admin console.
{
"tagOwners": {
"tag:k8s-operator": ["autogroup:admin", "autogroup:member"]
},
"autoApprovers": {
"exitNode": ["tag:k8s-operator"],
"routes": {
"192.168.1.0/24": ["tag:k8s-operator"]
}
},
"grants": [
{"src": ["autogroup:member"], "dst": ["autogroup:member"], "ip": ["*"]},
{"src": ["tag:k8s-operator"], "dst": ["autogroup:member"], "ip": ["*"]},
{"src": ["autogroup:member"], "dst": ["tag:k8s-operator"], "ip": ["*"]},
{"src": ["autogroup:member"], "dst": ["autogroup:internet"], "ip": ["*"]},
{"src": ["autogroup:member"], "dst": ["192.168.1.0/24"], "ip": ["*"]}
]
}
Why grants are needed:
autogroup:internet: Allows traffic through the Exit Node.192.168.1.0/24: Allows access to the advertised Subnet Routes (Pi-hole IPs).tailscale with oauth-client-id and oauth-client-secret.tailscale-oauth in tailscale namespace.For ad-blocking to work remotely:
192.168.1.55 and 192.168.1.56.The gap (learned 2026-06-04, fixed 2026-06-06): member devices (laptop,
autogroup:member) only get the 192.168.1.55/.56 Pi-hole /32s advertised —
not the full home /24. So anything addressed by a LAN IP other than those two
(e.g. the Beelink at 192.168.1.70) is unrouted over Tailscale. Off-net, only
ICMP + SSH to the tailnet 100.x IPs work; service ports (:443 Caddy, :6443
k8s API) return 000 because autogroup:member has no grant to tag:inference.
Rule: address cross-site ops by the tailnet, never the LAN IP. Use the MagicDNS
name (stable across IP changes) or the 100.x literal.
tailf8d786.ts.net.beelink-ai.tailf8d786.ts.net → 100.123.94.31, tag:inference.get_tailscale_status (MCP) reports ready:false even when healthy — trust
tailscale status / kubectl describe connector instead.The beelink-ansible inventory pins ansible_host: beelink-ai.tailf8d786.ts.net,
so ansible-playbook … -l inference connects over the tailnet from anywhere
with no -e ansible_host= override. Requires Tailscale up on the control
machine (there is no bare-LAN .70 fallback by design). On-LAN, Tailscale still
prefers a direct path, so home deploys stay fast. (First use of a new MagicDNS
hostname needs its key in known_hosts; it presents the same host key as the IP.)
Ollama (:11434) and LiteLLM (:4000) are Docker-internal by design — never
host-expose them. To hit them remotely, tunnel through SSH to the tailnet IP, then
address the container on the Docker network:
ssh mtgibbs@100.123.94.31 # tailnet IP (or MagicDNS name)
# on-box, find the container IP:
docker inspect <ctr> | grep IPAddress
curl http://172.18.0.5:11434/... # e.g. Ollama on the bridge network
The Caddy :443 front door (https://ai.lab.mtgibbs.dev) is the intended remote
path, but needs the Phase-2 autogroup:member → tag:inference grant (below) first.
Spec & verify gate for this work:
specs/remote-ops-access/.
# Check operator status
kubectl get pods -n tailscale
# Check exit node status
kubectl get connector pi-cluster-exit -n tailscale
kubectl describe connector pi-cluster-exit -n tailscale
autogroup:internet grant in ACL.192.168.1.0/24 grant in ACL or routes not approved in Admin Console.