Diagnosis & Recovery — Troubleshooting
Common problems and diagnostic rites.
A Daemon Is Unhealthy
Section titled “A Daemon Is Unhealthy”# View latest health check resultsdocker inspect --format='{{json .State.Health}}' <name> | jq
# View daemon logsdocker logs <name> --tail 50
# Manual restartsystemctl restart docker-<name>The timer docker-health-watch@<name> automatically kills an unhealthy daemon
every 30 seconds, triggering a systemd restart.
If the daemon loops, inspect its logs.
A systemd Service Is Failed
Section titled “A systemd Service Is Failed”# View status and logssystemctl status docker-<name>journalctl -u docker-<name> --since "30 minutes ago"
# Reset failure counter before restartingsystemctl reset-failed docker-<name>systemctl start docker-<name>Traefik Is Unresponsive
Section titled “Traefik Is Unresponsive”# Internal health checkdocker exec traefik traefik healthcheck
# Verify container is runningdocker ps | grep traefik
# Check Let's Encrypt certificatesls -lh /srv/docker/traefik/acme.json# If 0 bytes: certs not generated# Let's Encrypt limit: 5 attempts/domain/hour
# Traefik logstail -100 /srv/docker/traefik/logs/traefik.log | jq .sops Cannot Decrypt Secrets
Section titled “sops Cannot Decrypt Secrets”# Verify age key is presentls -la /etc/sops/age/keys.txt
# Verify public keyage-keygen -y /etc/sops/age/keys.txt# Should match the key in .sops.yaml
# Test decryptionsops -d secrets/clochette.yamlIf the public key does not match, see Reliquary Backup & Restoration.
nixos-rebuild Deployment Fails
Section titled “nixos-rebuild Deployment Fails”# Build without deploying to see the errorjust build_clochette
# Verify lintersjust test
# Verify flake evaluationnix flake checkIf it is a network error (download timeout), retry. If it is a Nix eval error, read the full error message: sops or missing type errors are usually explicit.
SSH to clochette Is Unreachable
Section titled “SSH to clochette Is Unreachable”Verification order:
-
Is Tailscale active on both shrines?
Terminal window tailscale status # from exampleHost -
Is clochette reachable via Tailscale ping?
Terminal window tailscale ping clochette -
Is the SSH daemon running on clochette? Use Scaleway serial console:
Terminal window systemctl status sshd -
Is the firewall rule in place?
Terminal window sudo nft list ruleset | grep 100.64
Docker Storage Driver ZFS (exampleHost)
Section titled “Docker Storage Driver ZFS (exampleHost)”If Docker fails to start on exampleHost with a ZFS error:
# Verify Docker dataset existszfs list | grep docker
# Docker uses rpool/nixos/var/lib as base# Dataset is in /var/lib/dockerdocker info | grep "Storage Driver"
# If Docker left a corrupted statesudo systemctl stop dockersudo rm -rf /var/lib/docker/devicemapper # or problematic subdirectorysudo systemctl start dockerBorg Backup Fails
Section titled “Borg Backup Fails”# Latest statusjournalctl -u borgbackup-job-remote --since today
# Test SSH connection to backup serverssh -i /run/secrets/services/borg/key/private backup@storage2.friloux.me
# Test repo accessBORG_PASSPHRASE=$(cat /run/secrets/services/borg/passphrase) \BORG_RSH="ssh -i /run/secrets/services/borg/key/private" \borg info ssh://backup@storage2.friloux.me/~/clochette.friloux.meCommon causes:
- Backup server SSH host key changed → update
backup.nixknownHostsFiles - Backup server disk full
- Borg lock held:
borg break-lock ssh://backup@storage2.friloux.me/~/clochette.friloux.me
ZFS Pool Degraded (exampleHost)
Section titled “ZFS Pool Degraded (exampleHost)”# Pool statuszpool status
# If a disk is DEGRADED/FAULTEDzpool status -v # show errors
# After physically replacing a diskzpool replace rpool /dev/disk/by-id/OLD_ID /dev/disk/by-id/NEW_ID# Track resilver progresszpool status -w rpoolWeeCHAT / zellij Session Lost
Section titled “WeeCHAT / zellij Session Lost”# Connect to existing weechat sessionssh irc.friloux.me# In the weechat shell:zellij attachIf the zellij session no longer exists:
zellij # creates new session# Then restart weechat manuallyweechat