majorwiki/05-troubleshooting/networking
MajorLinux 155651c373 wiki: ssh.socket wait-ready gate + mastodon post-install hardening
Two related additions covering the 2026-05-31 cutover-night incidents on
majorlinux and majortoot-hetzner.

ssh-socket-tailscale-race-condition.md (update Race 1 fix):
- After=tailscaled.service Requires=tailscaled.service orders against the
  service becoming active, not against tailscale0 having an IPv4 — hosts
  kept losing SSH intermittently after reboots (incident: majorlinux +
  majortoot-hetzner 2026-05-31, during cutover-night Ansible reboot).
- Canonical fix: a oneshot tailscale-wait-ready.service that polls
  `ip -4 -o addr show tailscale0` until an address is present, with
  ssh.socket After=/Requires= that service. Document the full evolution
  (2026-05-19 BindsTo → 2026-05-23 Requires → 2026-05-31 wait-ready) so
  future readers don't try the half-fixes thinking they're sufficient.
- Add majortoot-hetzner to affected hosts.

mastodon-post-install-hardening.md (new):
Four upstream-install gaps that bit during the majortoot-hetzner cutover:
1. /home/mastodon at 0750 (useradd default) → nginx www-data can't
   traverse → every static asset 403s → unstyled "purple screen" in the
   browser while API/HTML still work through the puma proxy.
2. .env.production at 0644 (mastodon-setup default) → DB_PASS,
   SECRET_KEY_BASE, OTP_SECRET world-readable once gap (1) is fixed.
3. mastodon user shell at /usr/sbin/nologin → `su - mastodon` blocked.
4. rbenv init in .bashrc only → login shells don't source .bashrc; even
   when chained, Ubuntu's .bashrc returns early for non-interactive
   shells. Fix: .bash_profile sets up rbenv BEFORE sourcing .profile +
   .bashrc, so it works for both interactive and non-interactive logins.

All four codified in MajorAnsible configure_mastodon_permissions.yml
with self-asserting verification steps.

02-selfhosting/index.md + SUMMARY.md:
Add a "Services" section to the selfhosting index linking the
mastodon-post-install-hardening article (and the other orphaned
services/ entries while there). SUMMARY.md gains one new entry.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-31 11:08:24 -04:00
..
fail2ban-imap-self-ban-mail-client.md wiki: audit fixes — broken links, wikilinks, frontmatter, stale content (66 files) 2026-04-02 11:16:29 -04:00
fail2ban-self-ban-apache-outage.md wiki: audit fixes — broken links, wikilinks, frontmatter, stale content (66 files) 2026-04-02 11:16:29 -04:00
fail2ban-ufw-rule-bloat-cleanup.md wiki: audit fixes — broken links, wikilinks, frontmatter, stale content (66 files) 2026-04-02 11:16:29 -04:00
firewalld-mail-ports-reset.md wiki: audit fixes — broken links, wikilinks, frontmatter, stale content (66 files) 2026-04-02 11:16:29 -04:00
pihole-blocks-claude-desktop.md docs: add Pi-hole AI blocklist / claude.ai ERR_CONNECTION_REFUSED article 2026-04-22 18:12:08 -04:00
postfix-sendgrid-tls-handshake-failure.md wiki: batch update — 4 new articles + 4 updates 2026-05-25 13:55:10 -04:00
rsync-tailscale-teardown-stall.md wiki: add troubleshooting articles from MajorTwin v8 cycle 2026-04-25 12:57:39 -04:00
ssh-socket-tailscale-race-condition.md wiki: ssh.socket wait-ready gate + mastodon post-install hardening 2026-05-31 11:08:24 -04:00
tailscale-ssh-reauth-prompt.md wiki: audit fixes — broken links, wikilinks, frontmatter, stale content (66 files) 2026-04-02 11:16:29 -04:00
tailscale-status-json-hostname-localhost-ios.md wiki: update fail2ban digest + netdata docker health + 3 new articles 2026-05-02 14:58:07 -04:00
windows-openssh-wsl-default-shell-breaks-remote-commands.md wiki: update fail2ban digest + netdata docker health + 3 new articles 2026-05-02 14:58:07 -04:00
windows-sshd-stops-after-reboot.md wiki: update fail2ban digest + netdata docker health + 3 new articles 2026-05-02 14:58:07 -04:00