src.nth.io/

summaryrefslogtreecommitdiff
AgeCommit message (Collapse)AuthorFilesLines
9 hourspleroma/otp: proxy to 127.0.0.1 instead of localhostLuke Hoersten1-1/+4
nginx expands localhost to [::1] too, but the endpoint binds only 127.0.0.1, so every request burned a refused ipv6 connect first and flooded the error log.
9 hourssoju: gate the admin password reset behind soju_reset_passwordLuke Hoersten1-1/+4
The unconditional change-password re-keyed the account on every run, clobbering any password changed in-band and locking out clients.
9 hoursergo: give nginx access to the unix socketLuke Hoersten1-0/+7
nginx terminates tls on 6697 and proxies to the socket, created 0770 ergo:ergo. With the ergo group empty the workers got EACCES and every client saw a tls handshake then silence (bitten on web after the 26.04 reboot).
9 hoursdelete unused unifi and writefreely rolesLuke Hoersten23-1586/+0
Nothing references them: no play in main.yaml, no meta dependency.
9 hourshomebridge: rebuild on apt nodejs and npmLuke Hoersten3-18/+48
26.04 ships nodejs 22, so no repo.homebridge.io vendor repo (its package bundled a private node runtime). npm installs homebridge, the role provides the unit, and the previously undefined dir and package vars get defaults.
9 hoursminecraft: papermc fill v3 api and jar checksumLuke Hoersten1-2/+7
The v2 api was sunset july 2026 (http 410). Fill v3 returns the download url and sha256 directly. Passing the checksum to get_url also makes version bumps take effect: without it the download was skipped whenever server.jar existed.
9 hoursinstall from the 26.04 archive instead of third-party sourcesLuke Hoersten11-96/+56
- rpi-base: log2ram from the archive, drop the azlux repo (which still pointed at debian buster) - aws-s3-backup: apt awscli (v2) instead of pip v1; drop boto3, nothing used it - scrypted, koreader-sync: docker.io and docker-compose-v2 instead of the docker.com repo pinned to noble; the docker-ce removal lives in cleanup-third-party.yaml since the packages collide on files - miniflux: the archive package with a dbconfig preseed; drops the github binary download and the bundled unit - prometheus/client: note the nginx and postgres exporters are in apt - dendrite/build, nostr/build: unversioned golang-go instead of pinned golang-1.21-go and a hand symlink that shadowed the real go
27 hoursnodejs: delete the roleLuke Hoersten2-35/+0
Nothing consumes it: no play in main.yaml and no role dependency. 26.04 ships nodejs 22 in apt anyway, so any future consumer can just apt install it.
27 hourspleroma/build: install elixir from aptLuke Hoersten2-20/+2
26.04 ships elixir 1.18.3, the exact version the role pinned from upstream zips, so the download/unarchive tasks and version vars go away. Resolves the TODO waiting on this release.
27 hourspostgresql: bump to 18 after the web.lan.nth.io cluster migrationLuke Hoersten1-1/+1
27 hoursrpi-base: install acl for become_user tasksLuke Hoersten1-0/+3
26.04 no longer ships setfacl by default; without it, ansible tasks that become an unprivileged user (postgres) fail on temp-file perms when pipelining is unavailable (async tasks).
29 hourspostgresql: fix initdb guard to compare find matched countLuke Hoersten1-1/+1
29 hoursrelayer, soju: order services after postgresql at bootLuke Hoersten2-1/+23
relayer had Requires= without After=, which does not order startup; soju's packaged unit has no postgres ordering at all, so both raced the postgres socket at boot and stayed failed. Adds After= to the relayer unit and a systemd drop-in for soju.
29 hoursdendrite, relayer: percent-encode db passwords in connection urlsLuke Hoersten2-2/+2
Passwords containing '/' are invalid unencoded in a url authority and break Go's url.Parse (invalid port after host). Latent until a restart forced a config re-read. jinja urlencode leaves '/' unescaped, hence the extra replace.
29 hoursmattertimectl/build: use apt rustc/cargo instead of rustupLuke Hoersten3-23/+10
26.04 ships rustc 1.93, past the rs-matter 1.87 floor that forced rustup on 24.04. Drops the toolchain install tasks and RUSTUP_HOME.
29 hoursrpi-base: skip terminfo sync when the controller TERM has no entryLuke Hoersten1-0/+5
infocmp fails when ansible runs from a terminal without a compiled terminfo entry (e.g. emacs eshell, TERM=emacs); treat that as skip instead of failing the play.
29 hourstransmission: enable the service so it survives rebootsLuke Hoersten1-2/+2
The role only started the unit; nothing enabled it, so a reboot left transmission down until the next playbook run.
3 daysRename mattertimesync role to mattertimectl (build + controller)Luke Hoersten19-211/+233
- Rename role dir and all vars from mattertimesync to mattertimectl - Rename the server subrole to controller - Build via cargo instead of npm; run the binary directly (no node) - Default fabricLabel to "Matter Time Controller"
5 daysAdd fabricLabel to mattertimesync configLuke Hoersten2-1/+3
Renders the new mattertimesync fabricLabel field (the label other Matter ecosystems display for this controller, e.g. the Apple Home Connected Services subtitle) with the app default. Labels must be unique per device, so instance overrides should not reuse another admin's label.
5 daysbuild roles: create build_work_dir and redirect caches per-roleLuke Hoersten5-0/+74
Each build role now creates build_work_dir itself and sets its own toolchain's cache env (GOPATH/GOCACHE/GOMODCACHE, CARGO_HOME, npm cache, MIX/HEX) on its build tasks, so the roles are self-contained instead of relying on a play-level environment and pre_task.
5 daysbuild roles: force real tarballs for single-file artifactsLuke Hoersten3-0/+9
community.general.archive (>=10) compresses a lone file into a bare .gz instead of a tarball, so the mattertimesync/bin/nostr artifacts failed the server-side unarchive. Set force_archive: true so the archive module emits a real single-member .tar.gz, consistent with the multi-file dendrite/pleroma builds.
5 daysnodejs: map kernel arch to Node's dist arch namesLuke Hoersten1-1/+6
Node release tarballs use arm64/x64, not the kernel's aarch64/x86_64, so the download URL 404'd on the arm64 Pis. Map the common arches and fall back to the raw architecture value.
5 daysbuild roles: stage checkouts + artifacts under build_work_dirLuke Hoersten10-16/+16
Move every build role's working dir off /tmp (the SD card) to {{build_work_dir}}, which the playbook points at the SSD on the build host. nostr and pleroma stage their artifacts inside their own build dirs so the shared work dir can't collide, while preserving the archive top-level names (relayer, release) that the server roles depend on.
5 daysmattertimesync: add build + server rolesLuke Hoersten10-0/+198
Build role compiles the tagged source on the build host (npm ci + npm run bundle) into a versioned mattertimesync-<ver>.tar.gz in build_srv_dir. Server role installs the single bundled .mjs, creates the mattertimesync service user and a 0700 storage dir for the Matter fabric keys, templates config.json, and runs a hardened oneshot sync via a systemd timer. Both roles depend on the nodejs role for Node >=20.
6 daysopenhop/repeater: add MeshCore repeater roleLuke Hoersten9-0/+272
Deploys the openHop MeshCore repeater on a Raspberry Pi with a RAK6421 WisMesh Pi HAT: installs the daemon into a venv from a versioned git tag, templates config.yaml and a systemd unit, and loads board pin maps and RF region presets by name from vars/. identity_file is configurable and defaults to null (daemon generates its own keypair).
11 daysgit/web: support cgit head-include for viewport metaLuke Hoersten2-1/+10
2026-06-29certbot: scoped CF API token; gate prosody deploy hook on RENEWED_LINEAGELuke Hoersten2-4/+23
cred.conf.j2 now emits the single-line dns_cloudflare_api_token form (scoped Cloudflare API Token) instead of the legacy account-wide email + global API key. prosody.sh.j2 deploy hook now no-ops unless $RENEWED_LINEAGE matches the prosody vhost, so unrelated lineage renewals (haskell.social, etracapital.com) no longer report a spurious "Hook reported error code 1 / No certificate for host found". Co-Authored-By: Claude Opus 4.8 (1M context) <[email protected]>
2026-04-25Only run pleroma migrate on version change or first installLuke Hoersten1-1/+6
2026-04-25Build all roles from source with versioned artifactsLuke Hoersten21-87/+177
- Add pleroma/build role to compile from source (OTP binaries no longer published) - Install Elixir 1.18.3 manually on Ubuntu Noble (ships 1.14, needs 1.15+) - Standardize all build roles to produce versioned .tar.gz artifacts - Add version defaults to all server roles (bin, dendrite, nostr/relayer) - Switch server roles from get_url to unarchive for .tar.gz installs - Add build_srv_dir variable to all build roles - Deploy pleroma styles.json so custom FE themes appear in picker - Fix pleroma OTP install: version check, root ownership, auto-cleanup old releases - Fix pleroma config: log level :warn -> :warning, remove availableStyles - Add wait_for grafana readiness before dashboard install - Set minecraft ops changed_when: false
2026-04-19Add cgit favicon deploy taskLuke Hoersten1-0/+5
2026-04-19Make cgit source-filter path configurable, add deploy taskLuke Hoersten2-1/+7
2026-04-18Remove nginx config tasks from git/web role, make owner discovery recursiveLuke Hoersten2-20/+3
2026-04-18Make cgit theme configurable via variables, fix owner discoveryLuke Hoersten2-1/+45
Add cgit_css_src, cgit_header_src, cgit_footer_src, cgit_owner variables to optionally install a custom theme without hardcoding nth.io. Move scan-path after enable-git-config in cgitrc so gitweb.owner is read from repo git configs. Switch repo owner loop from find|while to glob for loop to avoid subshell issues.
2026-04-18Use checksum-based rsync for nginx root file syncLuke Hoersten1-1/+4
2026-04-18Add nginx permanent redirects for old Mercurial /file/tip/ paths to cgit /tree/Luke Hoersten1-0/+5
2026-04-18Fix cgit duplicate repo name in URLs by setting virtual-root=/Luke Hoersten1-0/+1
2026-04-18Rename unifi role to unifi-controllerLuke Hoersten4-5/+5
2026-04-15Update all references from doorbell-viewport to unifi-protect-viewportLuke Hoersten8-133/+133
2026-04-15Rename doorbell-viewport role to unifi-protect-viewportLuke Hoersten8-0/+0
2026-04-15Replace real camera ID with placeholder in READMELuke Hoersten1-1/+1
2026-04-14Minor daemon cleanup: drop inspect shim, module-level SSL ctx, rename ws_headersLuke Hoersten1-14/+6
2026-04-14Further simplify doorbell-viewport daemonLuke Hoersten1-20/+13
- Flatten DisplayController: remove _set() middle layer - Inline on_ring() into _handle_protect_event (was a 2-line wrapper) - Collapse triggered flag in touch monitor to single boolean expression
2026-04-13Remove vcgencmd display backend, simplify DisplayControllerLuke Hoersten5-127/+54
Always use sysfs backlight. vcgencmd resets DRM planes under fkms making it incompatible with the drm video output. Removes libraspberrypi-bin dependency and panel/vcgencmd dead code.
2026-04-13Remove warm prebuffer mode from doorbell-viewportLuke Hoersten3-26/+5
Always start mpv on demand (cold start). The warm path was fragile on the RPi4 with fkms and added complexity without reliable benefit.
2026-04-12Switch doorbell-viewport to cold start, add backlight diagnosticsLuke Hoersten2-3/+4
- prebuffer_mode=cold: mpv starts on demand at ring/touch event - Add tty group to service user for DRM TTY access - Log backlight brightness changes for diagnostics - Remove --really-quiet suppression during debug (now restored)
2026-04-12Fix doorbell-viewport display and ring detectionLuke Hoersten2-3/+19
- Switch to sysfs backlight (drm backend) to avoid DRM plane reset on display power cycle caused by vcgencmd display_power - Add udev rule and sysfs permissions for rpi_backlight - Fix multi-packet WebSocket decoder (ring events were being dropped) - Fix mpv loop/cache flags (--loop=no, bounded --demuxer-max-bytes) - Remove hardware decode (caused SIGSEGV on RPi4 with fkms)
2026-04-12Fix doorbell-viewport bringup issuesLuke Hoersten3-46/+112
- Fix websockets headers kwarg via inspect (works across all versions) - Use full path /usr/bin/vcgencmd; add libraspberrypi-bin dependency - Fix UniFi Protect WS packet decoder to handle multiple concatenated packets per message (action+data in single frame) - Fetch lastUpdateId from bootstrap for WS URL - Switch fbcon disable from video=HDMI-A-1:D to fbcon=map:99 (fkms compat) - Default drm_connector to DSI-1 for fkms; drop hardcoded drm_mode - Add --no-audio and --hwdec=no to mpv; fix DRM mode-setting race on startup - Add PoE HAT fan control with configurable temp thresholds
2026-04-12Add .gitignore for Emacs backup filesLuke Hoersten1-0/+1
2026-04-12Add nofail to block-device mount optionsLuke Hoersten1-1/+1
Prevents emergency mode on boot if the external drive is absent.
2026-04-12Add doorbell-viewport roleLuke Hoersten8-0/+1222
RPi4 portrait touchscreen that shows a live UniFi Protect RTSP stream on doorbell ring or touch, with display fully off at idle. Supports warm prebuffer, vcgencmd/drm/panel display backends, evdev touch input, and configurable DRM device/connector/mode.