Files changed: engine/.embcache.json engine/changelog.md engine/lint-report.md vault/.trash/2026-06-19.md vault/docs/hardware/environment.md vault/docs/hardware/ip-allocation.md vault/docs/matrix/archivist.md vault/docs/matrix/matrix_host.md vault/docs/matrix/mautrix_signal.md vault/docs/matrix/synapse.md vault/docs/matrix/synapse_retention_discovery.md vault/docs/navi/cc-rules.md vault/docs/navi/deployment.md vault/docs/navi/themes.md vault/docs/services/ots-setup.md vault/docs/services/services.md vault/docs/services/usenet.md vault/docs/software/authentik.md vault/docs/software/caddy.md vault/docs/software/central.md vault/docs/software/dns.md vault/docs/software/geo-tools.md vault/docs/software/navi.md vault/docs/software/recon.md vault/docs/software/searxng.md vault/glossary.md vault/notes/echo6-landing-page-data-export.md vault/notes/ia-download-queue.md vault/projects/advbbs-project.md vault/projects/argus.md vault/projects/deploy-livesync.md vault/projects/fleet-patch-audit.md vault/projects/fleet-platform-baseline.md vault/projects/matrix-synapse-deployment.md vault/projects/meshai-config-hot-apply.md vault/projects/meshai-region-routing-plan.md vault/projects/meshai.md vault/projects/meshcore-transport.md vault/projects/meshtastic-headscale-runbook.md vault/projects/mmud-project.md vault/projects/nominatim-v5-reimport.md vault/runbooks/add-peertube-channel.md vault/runbooks/authentik-access-groups.md vault/runbooks/authentik-create-invitation.md vault/runbooks/authentik-oidc-application.md vault/runbooks/authentik-upgrade.md vault/runbooks/central-deploy-cutover.md vault/runbooks/ct-runbook.md vault/runbooks/edge2-access-reference.md vault/runbooks/expose-service-contabo.md vault/runbooks/expose-service-edge2.md vault/runbooks/expose-service-home.md vault/runbooks/fleet-magicdns-resolved-migration.md vault/runbooks/headless-browser-page-verification.md vault/runbooks/headscale-oidc-boot-order.md vault/runbooks/headscale-onboard-node.md vault/runbooks/ia-cli-reference.md vault/runbooks/ia-download-mirror.md vault/runbooks/idahomesh-bridge-setup.md vault/runbooks/idahomesh-vpn-device-setup.md vault/runbooks/lxc-service-migration.md vault/runbooks/mailcow-create-mailbox.md vault/runbooks/meshai-prod-compose-override.md vault/runbooks/meshmonitor-password-reset.md vault/runbooks/meshtastic-sidecar-node.md vault/runbooks/meshtasticd-sim-nodes-runbook.md vault/runbooks/nordvpn-lxc.md vault/runbooks/peertube-remote-runner.md vault/runbooks/pg-backup.md vault/runbooks/pi-nas-omv-runbook.md vault/runbooks/pipeline-patterns.md vault/runbooks/proxmox-create-ubuntu-vm.md vault/runbooks/proxmox-onboard-node.md vault/runbooks/pymc-repeater-kiss-tnc-reenumeration.md vault/runbooks/recon-operations.md vault/runbooks/recon-service-integration.md vault/runbooks/syncthing-add-node.md vault/runbooks/toc-cortex-pve9.2-update.md vault/session-resume/SESSION-HANDOFF-meshai-test.md
4.9 KiB
| title | type | tags | aliases | related | updated | ||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Headscale / Tailscale — Onboard a New Node | runbook |
|
|
2026-07-13 |
Headscale / Tailscale — Onboard a New Node
Standard procedure to bring any new system (Proxmox host, bare-metal, VM, or LXC) onto the Echo6 tailnet.
Overview
- Control server: Headscale on edge2 CT107 —
ssh edge2thensudo pct exec 107 -- docker exec headscale headscale <cmd>, Docker containerheadscale. (Migrated off Contabo 2026-06-19.) - Login server:
https://vpn.echo6.co· Admin UI (Headplane):https://vpn.echo6.co/admin - User/namespace: all Echo6 nodes join
echo6(user ID 1). - MagicDNS base domain:
echo6.mesh(e.g.ping data.echo6.mesh). - Naming: lowercase, hyphens OK, no dots/underscores. Matches
--hostnameand the cortex SSH alias.
1. Generate a preauth key (on edge2 CT107)
ssh edge2 "sudo pct exec 107 -- docker exec headscale headscale preauthkeys create --user echo6 --reusable --expiration 1h"
# If the name form errors, use the user ID: --user 1
2. Install Tailscale on the node
curl -fsSL https://tailscale.com/install.sh | sh
systemctl enable --now tailscaled
3. DNS-bootstrap drop-in (REQUIRED on LXCs, recommended everywhere)
Without this, tailscaled can't resolve vpn.echo6.co on a cold boot. Makes onboarding survive a reboot.
mkdir -p /etc/systemd/system/tailscaled.service.d
cat > /etc/systemd/system/tailscaled.service.d/dns-bootstrap.conf <<'EOF'
[Service]
ExecStartPre=/bin/sh -c "grep -q nameserver /etc/resolv.conf || echo nameserver 1.1.1.1 > /etc/resolv.conf"
EOF
systemctl daemon-reload
4. LXC containers only — TUN device prerequisite
On the Proxmox host, before starting the container (needs nesting=1,keyctl=1 features set):
pct stop <CTID>
cat >> /etc/pve/lxc/<CTID>.conf <<'EOF'
lxc.cgroup2.devices.allow: c 10:200 rwm
lxc.mount.entry: /dev/net/tun dev/net/tun none bind,create=file
EOF
pct start <CTID>
(Privileged variant: create with --unprivileged 0, use lxc.mount.entry: /dev/net dev/net none bind,create=dir.)
5. Register with Headscale
tailscale up --login-server=https://vpn.echo6.co --auth-key=<KEY> --hostname=<NAME>
- Standard nodes pass no
--advertise-routes/--accept-routes/--advertise-tags. - Add
--sshto enable Tailscale SSH. - Always include
--login-server=https://vpn.echo6.co— without it the node registers against Tailscale's public servers instead of Echo6 Headscale. - Subnet-router exception: the mesh-bridge advertises
100.100.0.0/16 --accept-routes, then enable on Headscale (headscale routes list/routes enable -r <ID>).
6. Verify
tailscale status
tailscale ip -4
ssh edge2 "sudo pct exec 107 -- docker exec headscale headscale nodes list" # confirm node + assigned 100.64.0.x
Headscale assigns the IP sequentially at registration — don't pre-assign; read it back here.
7. SSH config aliases on cortex (~/.ssh/config)
Host <alias>
HostName <local-or-public-IP>
User root
Host ts-<alias>
HostName <tailscale-IP>
User root
Most nodes use User root. Per-node exceptions exist — e.g. edge2 uses User admin + IdentityFile ~/.ssh/contabo2_ed25519 (cloud image, no root login).
8. Update inventory
docs/hardware/environment.md— Key Servers table and Headscale Node List (bump count + "updated" line).docs/hardware/ip-allocation.md— Tailscale IPs section.CLAUDE.mdcluster cheat-sheet — Proxmox hosts only.docs/services/services.md— once services are deployed on the node.
Worked example — edge2 (2026-06-16)
Proxmox host on Contabo. Preauth key → tailscale up --login-server=https://vpn.echo6.co --auth-key=<KEY> --hostname=edge2 → assigned 100.64.0.26 (Headscale node 42). SSH aliases edge2 / ts-edge2 use User admin + ~/.ssh/contabo2_ed25519.
Gotchas
environment.md's Headscale Node List is the authoritative IP source —ip-allocation.md's table has gone stale before.- A node deleted from Headscale does not get its old IP auto-reused; confirm the real next IP with
headscale nodes list. - The old
ct-runbooktailscale up --authkey ... --sshform omits--login-server— don't copy it blindly.
Checklist
[ ] Preauth key generated on edge2 CT107 (user echo6)
[ ] Tailscale installed + tailscaled enabled
[ ] DNS-bootstrap drop-in in place (LXC: required)
[ ] (LXC) TUN device added to CT config
[ ] tailscale up with --login-server=https://vpn.echo6.co --hostname=<name>
[ ] Node appears in headscale nodes list; IP captured
[ ] SSH aliases (<alias> + ts-<alias>) added on cortex and tested
[ ] Inventory updated (environment.md, ip-allocation.md, CLAUDE.md)