====== New Machine Setup Playbook ======
Generalized provisioning for a homelab machine. Not every machine needs every section: pick by role.
===== 1. SSH Access (every machine) =====
* Install ''openssh-server''. On Ubuntu 24.04 it listens via ''ssh.socket''; ''ssh.service'' spawns on demand.
* Key-only auth, drop-in ''/etc/ssh/sshd_config.d/60-key-only.conf'': ''PasswordAuthentication no'', ''PermitRootLogin no''
* Keep ''authorized_keys'' curated: record which key belongs to which machine and remove dead keys.
* Firewall: ''ufw deny incoming'' + ''ufw allow 22/tcp''.
===== 2. Off-LAN Reachability =====
For machines that should be reachable outside the LAN without port forwarding (and immune to routers without hairpin NAT), a Cloudflare tunnel:
curl -L -o ~/.local/bin/cloudflared \
https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-linux-amd64
cloudflared tunnel login # browser auth, picks the zone
cloudflared tunnel create # writes ~/.cloudflared/.json (secret)
cloudflared tunnel route dns # one route per hostname
* Ingress config: ''service: http://127.0.0.1:PORT'' for web, ''service: ssh://localhost:22'' for SSH, always ending with a ''http_status:404'' catch-all.
* SSH client side: ''ProxyCommand cloudflared access ssh --hostname %h'' under a ''Host'' alias in ''~/.ssh/config''.
* Cost: ~20-40 MB RAM. ''python3 -m http.server'' is a fine origin for a static ''~/public''.
===== 3. Always-On Duty =====
For a laptop acting as a server:
* Mask ''sleep/suspend/hibernate/hybrid-sleep'' targets: immediate and needs no logind restart.
* logind drop-in ''/etc/systemd/logind.conf.d/'': ''HandleLidSwitch=ignore'' for lids (takes effect next boot).
* UPower: ''IgnoreLid=true''; consider ''CriticalPowerAction=PowerOff'' so a dying battery cleanly shuts down instead of failing a hybrid-sleep.
* Wi-Fi powersave off for server duty: ''nmcli con mod 802-11-wireless.powersave 2'' plus a NetworkManager ''conf.d'' default.
* Screen blanking is fine to keep: it does not suspend anything.
===== 4. Battery Longevity =====
For laptops on permanent AC: where firmware exposes ''/sys/class/power_supply/BAT*/charge_control_end_threshold'' (recent ThinkPads and many ASUS do), write 75-80 and persist it with a oneshot systemd unit. Undo by setting 100 and disabling the unit.
===== 5. Unattended Credentials =====
Unattended jobs need non-interactive credentials. Never store passphrases in files.
* Preferred: ''keychain''. Passphrase typed once per boot at an interactive login; cron jobs source ''~/.keychain/-sh'' for ''SSH_AUTH_SOCK''. If the agent is empty after a fresh boot, jobs fail gracefully.
* Alternative: per-repo deploy keys (read-only, scoped). More secure than an account-wide passphrase-less key; never reuse one across repos.
* Anti-pattern: a passphrase-less personal key on the account. Do not.
===== 6. Health Checks and Alerts =====
A daily cron script with functional probes, not just ''is-active'': actually ''curl'' the service's own URL to catch running but unresponsive processes.
* Check connectivity first: do not churn restarts on a dead network.
* Retries: 2 attempts, 10 seconds apart, all logged. Self-trim the log.
* Alerts via ''curl -d msg https://ntfy.sh/'': free, no account. Pick an obscure topic name per machine.
* Daily git pulls run as the owning user (''runuser -u''), ''--ff-only'', failing gracefully on dirty trees.
===== 7. Lightweight Strip-Down =====
For low-spec or focused machines:
* Mask unused services: bluetooth, cups, avahi, ModemManager.
* Hide login autostart entries.
* ''zram-config'' plus ''vm.swappiness=100'' for small RAM. See [[hosting:hardware:low_memory|Running Linux on Low RAM]].
* ''snap set system refresh.retain=2'' and drop disabled snap revisions.
===== 8. Git Conventions =====
* One-line conventional commits: ''type(scope): description''.
* Automation runs ''git -c commit.gpgsign=false'' so a signing-key passphrase prompt cannot block a cron commit.
===== Checklist =====
[ ] sshd + key-only auth + authorized_keys
[ ] ufw allows 22
[ ] machine recorded in inventory docs
[ ] (optional) cloudflared tunnel + systemd service
[ ] (optional, laptop) battery threshold + always-on
[ ] keychain wired in ~/.profile
[ ] health-check cron job installed
[ ] ntfy topic chosen + subscribed
===== See Also =====
* [[guides:start|Guides Index]]
* [[guides:add_new_service|Adding a New Service]]
* [[hosting:networking:security|Security Considerations]]
* [[terminal:tools:ssh_homelab|SSH: Remote Server]]
* [[start|Return to wiki home]]