Commit Graph
247 Commits
Author SHA1 Message Date
PhilandClaude Opus 5.5 fa29cf5e08 starpunk: v2.6.1 (retry Threads publish errors)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-31 21:18:21 -06:00
PhilandClaude Opus 5.5 f1736343cf starpunk: v2.6.0 (Threads crossposting)
Pass the Threads token (vault_starpunk.threads_access_token, Meta app
"starpunk") and username philskents. StarPunk refreshes the token daily
and keeps the current one in /data/threads_token.json.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-31 20:59:13 -06:00
PhilandClaude Opus 5.5 95020e754a starpunk: v2.5.0 (likes and reposts)
GoToSocial token rotated with read:search and write:favourites.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-31 20:18:43 -06:00
PhilandClaude Opus 5.5 654a613113 starpunk: v2.4.0 (Micropub update, delete, drafts, replies)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-31 19:53:55 -06:00
Phil f1b9604f3b starpunk: v2.3.3 (Micropub titles, q=source URL, single title display) 2026-10-31 19:39:36 -06:00
PhilandClaude Opus 5.5 750d4dacad Record the Debian 13 upgrade and turn off the VSOCK SSH generator
The server now runs Debian 13.7. systemd 257's ssh generator logs a
harmless AF_VSOCK error on netcup VMs, so the common role masks it.
The plan file now records how the upgrade went and what's left.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-31 19:07:31 -06:00
PhilandClaude Opus 5.5 abf9760bfd starpunk: v2.3.2 (Log in / Admin link in header)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-31 18:57:14 -06:00
PhilandClaude Opus 5.5 e39fba3972 starpunk: v2.3.0 (public page style pass)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-31 18:43:30 -06:00
PhilandClaude Opus 5.5 2acf307ac0 Add Docker's apt repo with a signed-by key, ready for Debian 13
Debian 13 drops apt-key and software-properties-common, so the old tasks
would fail after the upgrade. The key now lives in /etc/apt/keyrings
(same fingerprint, 9DC8...CD88), the repo is a deb822 file whose release
name follows the installed Debian, and the old .list file is removed.
The apt tasks get a docker_apt tag so they can be deployed on their own.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-31 17:52:02 -06:00
PhilandClaude Opus 5.5 5f1d7635e9 starpunk: v2.2.0 with Bluesky crossposting
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-31 17:49:43 -06:00
PhilandClaude Opus 5.5 d1770a87e5 Let Caddy's HSTS header replace the one HeyForm sends
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-31 17:49:15 -06:00
PhilandClaude Opus 5.5 9b4df20080 Draft the Debian 13 upgrade plan
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-31 17:47:22 -06:00
PhilandClaude Opus 5.5 cab61b78e7 Send HSTS on every Caddy site
Browsers will use HTTPS for each site for a year. includeSubDomains is
left off so hosts not served by this Caddy are unaffected.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-31 17:47:21 -06:00
PhilandClaude Opus 5.5 a1a79af7d5 Upgrade HeyForm from v0.1.0 to v3.0.5
v0.1.0 (Feb 2025) has dozens of published security advisories fixed in
v3. Tested against a copy of the database first; forms load unchanged.

v3 listens on 9157, keeps uploads under packages/server, and uses Redis 8
commands, so KeyDB is replaced by redis:8-alpine. The homepage URL is now
https (v3's CORS allowlist is built from it), Caddy is the trusted proxy,
public sign-up is off, and integration credentials get their own key.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-31 12:50:57 -06:00
PhilandClaude Opus 5.5 394f111162 Turn on StarPunk crossposting to GoToSocial (v2.1.0)
StarPunk 2.1.0 copies new notes to GoToSocial and keeps edits and
deletes in step. Token for the app "StarPunk crossposting" (scopes
write:statuses write:media) is in vault_starpunk.gotosocial_token; the
container reaches social. through Caddy (hairpin).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-31 12:46:56 -06:00
PhilandClaude Opus 5.5 0f66326555 Pin Tika to the version Paperless 3.4.1 ships with
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-31 12:40:04 -06:00
PhilandClaude Opus 5.5 e68a329eeb Update Paperless-ngx to 3.4.1
2.20.15 has run its migrations, so this is the supported jump to v3.
Search moves to Tantivy and is rebuilt on first start.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-31 12:37:37 -06:00
PhilandClaude Opus 5.5 fba5520cda Pin Paperless-ngx to 2.20.15 on the way to v3
v3 can only be reached from 2.20.15, so stop tracking :latest. Also set
the two settings v3 needs from us: trust Caddy as the proxy (v3's login
rate limiting), and keep rejecting duplicate documents.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-31 12:34:52 -06:00
PhilandClaude Opus 5.5 68a1622665 Deploy StarPunk from its CI-built image
StarPunk's Gitea Actions workflow now builds and pushes the image on
vX.Y.Z tags. Pin the tag in starpunk_version (v2.0.2, the first CI build)
and always pull it, so an image built by hand on the server with the
same name can't be deployed instead.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-31 12:24:08 -06:00
PhilandClaude Opus 5.5 85bd6abc22 Update Karakeep's browser and search, and Gotenberg
Karakeep's Chrome was alpine-chrome 123 (April 2024) and it opens every
bookmarked URL; it now uses Karakeep's own Chrome image like upstream.
Meilisearch goes from 1.13.3 to 1.41.0 with a dumpless in-place upgrade.
Gotenberg for Paperless goes from 8.7 to 8.39.0.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-31 12:23:52 -06:00
PhilandClaude Opus 5.5 2d5abde71b Update StarPunk to v2.0.1
Fixes http:// feed and permalink URLs behind Caddy.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-31 12:18:39 -06:00
PhilandClaude Opus 5.5 dff614b481 Turn off SSH password and root login
sshd accepted passwords from the internet (about 12,000 failed logins a
day) and root logins with a key. Keys only now, no root, no X11 forwarding.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-31 12:17:45 -06:00
PhilandClaude Opus 5.5 f8197418d3 Remove the last Gondulf references
The gondulf DNS record is deleted (checked against public DNS), so its
removed_records entry is no longer needed. vault_gondulf was also removed
from the vault.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-31 12:06:35 -06:00
PhilandClaude Opus 5.5 a6592d3ad0 Take the Docker socket away from the Gitea runner
Jobs run inside the runner container (label docker:host), and with the
host's Docker socket mounted every workflow had root on the server. The
socket was only there for StarPunk's image build, which has never worked
(it logged in to gitea:3000, which the host daemon can't resolve).

Image builds now go to a rootless BuildKit container that shares only a
unix socket with the runner. Site builds keep their /sites mount.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-31 12:01:06 -06:00
PhilandClaude Opus 5.5 6dfb58d3f1 Retire Gondulf and move StarPunk to v2.0.0 with Pocket ID login
StarPunk 2.0.0 logs in with Pocket ID and issues its own Micropub tokens
(ADR-064 in the StarPunk repo), so the Gondulf IndieAuth server is no
longer used. Removes its task, templates, Caddy route, subdomain and
service entry, and moves its DNS record to removed_records.

The StarPunk template was still on v1.6.0-rc.2 with Gondulf hairpin
hosts; deploying it would have broken login. It now matches production:
v2.0.0, Pocket ID hairpin, OIDC client from vault_starpunk.pocketid and
the admin sub in starpunk_admin_sub.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-31 11:52:07 -06:00
PhilandClaude Opus 5.5 a08402f0ac Close Karakeep signups and turn on unattended security updates
Karakeep had DISABLE_SIGNUPS unset, so anyone could make an account on
bookmarks. and use the OpenAI key behind it. The server also had no
automatic updates and three security updates waiting; the common role now
installs unattended-upgrades with Debian's default security-only origins.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-31 11:47:45 -06:00
PhilandClaude Opus 5.5 0c14ee5b1d Bring the docs up to date with the running stack
The READMEs, CLAUDE.md and todo.md still described Authentik, services
removed long ago (Ghost, MMDL, Postiz, Pinchflat...) and two servers. Now
they list the 24 services actually deployed (checked against docker ps),
explain that netcup and docker-01 are one machine, document Gondulf,
StarPunk, Listmonk, Gokapi and dockcheck, and use bin/deploy throughout.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-31 11:30:50 -06:00
PhilandClaude Opus 5.5 0282debf07 Run Gokapi's first-run password step as a blocking command
--deployment-password sets the password and exits, so the detached run
plus health wait never saw a healthy container.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-31 10:13:22 -06:00
PhilandClaude Opus 5.5 7a68fdf96f Wait for Gokapi's healthcheck on first run
The 'Gokapi started' log line is not always flushed to log.txt, so the
first-run wait timed out even though the super admin had been created.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-31 10:09:14 -06:00
PhilandClaude Opus 5.5 9b9be6a2f0 Retire Authentik now that every app logs in with Pocket ID
All of Authentik's applications (including Tailscale's tailnet login)
have moved to Pocket ID, and its only recent sign-ins were those
handovers. Drops its stack, the auth. route and DNS record, the auth
subdomain variables, Gotify's leftover hairpin entries, and the dockcheck
exclude; the docs now name Pocket ID as the SSO provider.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-31 10:07:39 -06:00
PhilandClaude Opus 5.5 2512f6cb86 Reset Gokapi and log in with Pocket ID
Gokapi now keeps its config and data in /opt/stacks/gokapi instead of named
volumes. config.json is templated with Pocket ID as the OIDC provider, so a
fresh install never shows the open /setup wizard. On a new database a one-off
run with --deployment-password creates the super admin, after which only
existing users can log in.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-31 10:04:44 -06:00
PhilandClaude Opus 5.5 e72c09e9f6 Point Audiobookshelf at Pocket ID and drop podcasts
Audiobookshelf's OIDC settings (stored in its own database) now use the
Pocket ID client in vault_audiobookshelf.pocketid instead of Authentik, so
the container needs the Pocket ID hairpin entry. The podcasts library was
deleted and its files purged, so its volume goes too.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-31 09:58:29 -06:00
PhilandClaude Opus 5.5 e4da4982b7 Remove Sneaky Klaus
It was hand-deployed, had no Caddy route, and nothing used it. Delete
its santa. DNS record.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-31 09:42:36 -06:00
PhilandClaude Opus 5.5 be9523a0c4 Manage Gondulf and StarPunk with Ansible
Both were hand-deployed to /opt/stacks. Templates match the live setup
and keep the same stack dirs and volume names, so data stays put.
Secrets come from the vault; .env and the StarPunk compose file are now
0640 root:docker instead of the broken 1204 mode. Adds their DNS
records to dns.yml and drops the dead godulf. Caddy route (no DNS).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-31 09:42:36 -06:00
PhilandClaude Opus 5.5 6f6a669cf3 Delete the opds. and sync. DNS records
Their services (dir2opds, kosync) were retired in the previous commit.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-31 09:39:19 -06:00
PhilandClaude Opus 5.5 35852ee697 Retire kosync and dir2opds now that Kavita handles both
Kavita's KOReader sync API and OPDS feed replace them, and both readers
(Kindle KOReader, Xteink X4) now point at books.thesatelliteoflove.com.
Drops their stacks, the sync. and opds. routes and DNS records, and the
htpasswd tasks that only existed for dir2opds basic auth.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-31 09:33:24 -06:00
PhilandClaude Opus 5.5 6a0819059b Move books. from Calibre-Web to Kavita
Kavita now serves books.thesatelliteoflove.com with Pocket ID login
(password login is off), and the temporary kavita. subdomain is gone.
Calibre-Web's stack is removed; its calibre_books and calibre_config
volumes stay on docker-01 as a fallback for now.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-31 09:31:14 -06:00
PhilandClaude Opus 5.5 0875389d02 Add guard rails for several agents working on the repo at once
Deploys from unpushed branches were being reverted by the next deploy
from main, and in-place vault edits could overwrite each other.

- deploy-guard.yml (imported by site.yml and dns.yml) refuses real runs
  unless the checkout is clean and exactly origin/main; --check is fine.
- bin/deploy holds a lock so only one deploy runs at a time.
- bin/vault-run edits the vault under a lock with an atomic swap.
- bin/worktree starts a task in a fresh worktree from origin/main.
- CLAUDE.md explains the workflow.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-31 09:29:41 -06:00
PhilandClaude Opus 5.5 9363bc24d5 Deploy Dockge's compose file from the repo template
The template existed but was never copied, so the live file on the
server had drifted (still carried Glance labels).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-31 09:13:15 -06:00
PhilandClaude Opus 5.5 078c32cdc3 Answer every apex WebFinger query with phil's record
Tailscale's issuer lookup didn't match the resource=acct:phil@ filter,
got redirected to GoToSocial, found no issuer and fell back to Authentik.
phil is the only account here, so serve the same record for all queries.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-31 09:05:22 -06:00
PhilandClaude Opus 5.5 c9c05df534 Serve WebFinger on the apex domain for Tailscale and the fediverse
Tailscale finds the tailnet's login provider through the OpenID issuer
link in phil@'s WebFinger record, which now points at Pocket ID. The
same record carries GoToSocial's links, since the apex is its account
domain; other fediverse discovery paths redirect to GoToSocial. All of
these returned 404 before.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-31 08:55:08 -06:00
PhilandClaude Opus 5.5 ba0b1b319d Turn off legacy OpenID 2.0 login in Gitea
ENABLE_OPENID_SIGNUP let anyone with an OpenID URL register despite
DISABLE_REGISTRATION (an account was created that way on 2026-09-30).
All logins go through Pocket ID now.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-31 08:48:26 -06:00
PhilandClaude Opus 5.5 0371004150 Move Gitea login from Authentik to Pocket ID
The OAuth2 source in Gitea's database was renamed to PocketID and pointed
at Pocket ID with 'gitea admin auth update-oauth', and the existing
user's external login was remapped to the Pocket ID user. Here the
container now resolves the Pocket ID host instead of Authentik; the
runner never needed the login host. Credentials are in vault_gitea.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-31 08:46:06 -06:00
PhilandClaude Opus 5.5 5255049c10 Remove the unused Glance dashboard
Drop the Glance stack, its home. route and DNS record, the glance.*
labels on every container, and the Glance restart in the Warhammer
feed cron script. Update docs to match.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-31 08:34:14 -06:00
PhilandClaude Opus 5.5 1601d47d4c Move GoToSocial login from Authentik to Pocket ID
The first Pocket ID login linked to the existing account by email, then
GTS_OIDC_LINK_EXISTING was switched off so only that Pocket ID identity
can sign in. The Authentik credentials stay in the vault for rollback.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-31 08:33:21 -06:00
PhilandClaude Opus 5.5 b902c0bfb0 Move Karakeep login from Authentik to Pocket ID
The first Pocket ID login linked to the existing account by email, then
email-based account linking was switched off so only that Pocket ID
identity can sign in. The client ID now comes from the vault instead of
being written in the template.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-31 08:25:16 -06:00
PhilandClaude Opus 5.5 ea3092779c Add Kavita as the new book server
Runs next to Calibre-Web at a temporary kavita. subdomain until it takes
over books. Each book lives in its own folder under
/opt/stacks/kavita/books, because Kavita names a book after its folder.
The admin password is in the vault as vault_kavita.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-31 08:19:57 -06:00
PhilandClaude Opus 5.5 e17e37be31 Move Paperless login from Authentik to Pocket ID
Pocket ID was added as a second allauth provider first, so the existing
account could be connected from the Paperless profile page. With that
done, the Authentik provider is removed. Its credentials stay in the
vault for rollback.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-30 17:10:23 -06:00
PhilandClaude Opus 5.5 fea0d1042d Move Manyfold login from Authentik to Pocket ID
Manyfold matches linked users on provider + uid, so the existing user's
auth_uid was remapped to the Pocket ID user before deploying.
HTTPS_ONLY is needed so Manyfold builds an https callback URL behind
Caddy. The Authentik credentials stay in the vault for rollback.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-30 08:57:11 -06:00
PhilandClaude Opus 5.5 ef3a850996 Move ByteStash login from Authentik to Pocket ID
ByteStash matches users on issuer + sub only, so the existing user row
was remapped to the Pocket ID user before this was deployed. The old
Authentik credentials stay in the vault for rollback.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-30 08:39:46 -06:00