infrastructure/skills/tailscale/SKILL.md
Tailscale mesh VPN (tailscaled service). Installs the tailscale package from upstream, enables tailscaled.service via systemd. Use when adding Tailscale as a standalone systemd service to a box — distinct from the deploy-time Tailscale tunnel/sidecar model.
npx skillsauth add overthinkos/overthink-plugins tailscaleInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
| Property | Value |
|----------|-------|
| Dependencies | none |
| Ports | none (WireGuard uses UDP; no host port mapping) |
| Service | tailscaled.service (systemd, enabled at build time) |
| Install files | task: |
rpm:): tailscale from the upstream tailscale-stable repo (https://pkgs.tailscale.com/stable/fedora/tailscale.repo)pac:): tailscale# charly.yml -- typical bootc composition
my-bootc-image:
base: "quay.io/fedora/fedora-bootc:43"
bootc: true
distro: ["fedora:43", fedora]
candy:
- tailscale
- ...
The candy's cmd: task issues systemctl enable tailscaled.service at build time (suffixed with || true because offline bootc assembly can't fully activate a live systemd).
The box does not bring up the mesh on first boot — tailscale up --authkey=tskey-… is a runtime concern, not a build-time concern. Options:
sudo tailscale up and copy the login URL./etc/tailscale/authkey (out of scope for this candy).For target: local host deploys (canonical: local.charly-cachyos), pair this candy with /charly-infrastructure:tailscale-up — the runtime-config sibling that sets --operator=$account so non-root user-systemd quadlets can run tailscale serve (the per-pod tunnel: tailscale mechanism in charly.yml), and that keeps the tailnet device name in sync with hostname -s across hostname changes. tailscale-up self-gates on systemctl is-active tailscaled so it's a no-op in image-build / pre-auth contexts; bootc consumers don't include it.
Two declarative checks (build-scope):
tailscale-binary — /usr/bin/tailscale and /usr/sbin/tailscaled executables existtailscaled-unit-enabled — systemctl is-enabled tailscaled.service returns enabled/charly-infrastructure:tailscale) — bakes the daemon into a system image as a first-class systemd service. The box runs its own tailnet node. Use for bootc/VM images./charly-distros:container-nesting — also installs the tailscale package, but as a tool inside a container-in-container harness (rootless podman with Tailscale-backed outbound). Different use case; don't use both in the same box./charly-automation:sidecar, /charly-core:deploy) — a separate deployment-time decision that runs tailscale in a sidecar container alongside your app pod, giving the app a tailnet identity without baking the daemon into the app box. This is charly.yml-only state and is not affected by whether this candy is present.All three can coexist, but for most cases you want exactly one.
/charly-infrastructure:tailscale-up — runtime-config sibling for target: local host deploys (sets --operator + --hostname). Use both candies together on host targets that need tailscale serve to work without sudo./charly-distros:container-nesting — the previous home of the tailscale package (bundled with buildah/skopeo/docker for nested podman; separate concern)/charly-automation:sidecar — deploy-time Tailscale sidecar pattern (alternative, not a replacement)/charly-core:deploy — charly.yml tunnel/sidecar configuration/charly-image:layer — candy authoring reference/charly-check:check — declarative testing referenceUse when the user asks about:
tailscaled.service appears in a bootc image's service listtools
Use when authoring or modifying a charly PLUGIN — a candy with a `plugin:` block that contributes Providers (verbs/kinds/deploy-targets/steps/builders/commands), its own CUE schema, builtin (compiled-in) or external (out-of-tree git repo). Covers the unified Provider model, the per-plugin CUE-schema contract (single source → Go params for dev + schema-over-Describe RPC for runtime), the SDK, and the loader.
tools
The CUE data-validation / configuration CLI (cue), pinned to v0.16.1. Use when working with the cue candy, installing the cue binary into a box or onto a target:local dev host, or running the offline schema-vendoring pipeline that feeds charly's egress validation.
tools
CUE EGRESS validation — validating (and, where it adds value, generating) the config files charly WRITES to a system BEFORE the bytes hit disk. MUST be invoked before working on charly/egress.go, the vendored schemas under candy/plugin-egress/egress-schemas/vendor/, the ValidateEgress / registerVendoredEgressKind path, the offline `task cue:vendor` pipeline, or adding an egress schema for any written artifact (cloud-init, k8s manifests, traefik routes, runtime config, install ledger, systemd/quadlet units, ssh_config, libvirt XML).
tools
Kubernetes cluster-probe declarative check verb — the `kube:` check verb (nodes, pods, ingress, storage class, addon health, apply/delete, and arbitrary resource GETs) served out-of-process by the candy/plugin-kube plugin (vendored client-go; no external kubectl required).