5776dbe1bf
ups role: NUT server on home.debyl.io for the CyberPower PR1500RT2U that backs both it and truenas.localdomain, with staged shutdown (TrueNAS sheds at t+2min, host at 10% charge) and best-effort IPMI power-on when mains returns. The 10% threshold leans on ignorelb + override.battery.charge.low rather than a custom poller, because CyberPower asserts its own low-battery flag far too early. Credentials come from vault vars; nothing sensitive is templated in the clear. Nextcloud background jobs: both instances have backgroundjobs_mode "cron", which expects an external caller every ~5 minutes, and nothing was calling. The personal instance had not run a background job since 2026-05-14 and skudak since 2024-11-20. Consequently trash and file versions never expired, stale chunked uploads accumulated, calendar reminders never fired, and nextcloud.log was never rotated -- which quietly made the existing log_rotate_size cap inert. Added a systemd timer per instance, skipping cleanly when the container is down or in maintenance so deploy windows don't show up as failed units. Trash retention on the personal instance: the default "auto" only expires when disk space demands it, so 66 GB of >30-day deletions sat on a host with 1.3 TB free -- effectively unbounded. "auto, 30" makes the 30-day expiry unconditional while still purging early under pressure. Image bumps: nextcloud 33.0.0 -> 34.0.2 (both cloud and skudak-cloud) greg-time-bot 3.9.25 -> 3.10.0 fulfillr 20260723.2044 -> 20260728.2155 (prod and dev) The fulfillr bump records what is already deployed: both containers were rolled to that image on 2026-07-29 for SCRUM-156 (digital product releases + customer update campaign). Committing it keeps the repo from claiming an older tag than the host is actually running, which would otherwise roll fulfillr backwards on the next clean-checkout deploy. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
35 lines
997 B
Django/Jinja
35 lines
997 B
Django/Jinja
#!/bin/bash
|
|
# {{ ansible_managed }}
|
|
# Remote power control for truenas.localdomain via the R415 iDRAC6.
|
|
# Usage: truenas-power.sh {status|on|soft|off|cycle}
|
|
set -euo pipefail
|
|
|
|
PW_FILE=/etc/ups/idrac.pw
|
|
|
|
if [ ! -r "$PW_FILE" ]; then
|
|
echo "cannot read $PW_FILE" >&2
|
|
exit 1
|
|
fi
|
|
|
|
# -f keeps the password out of the process argument list.
|
|
ipmi() {
|
|
ipmitool -I lanplus -H {{ idrac_host }} -U {{ idrac_user }} \
|
|
-f "$PW_FILE" "$@"
|
|
}
|
|
|
|
case "${1:-status}" in
|
|
status) ipmi chassis power status ;;
|
|
on) ipmi chassis power on ;;
|
|
# ACPI soft-off. FreeBSD has hw.acpi.power_button_state=S5, so this is
|
|
# a clean TrueNAS shutdown. Normally unused: TrueNAS shuts itself down
|
|
# as a NUT slave. This is the manual escape hatch.
|
|
soft) ipmi chassis power soft ;;
|
|
# Hard cut, last resort only.
|
|
off) ipmi chassis power off ;;
|
|
cycle) ipmi chassis power cycle ;;
|
|
*)
|
|
echo "usage: $0 {status|on|soft|off|cycle}" >&2
|
|
exit 2
|
|
;;
|
|
esac
|