<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Notes on seolcu notes</title><link>https://blog.seolcu.com/notes/</link><description>Recent content in Notes on seolcu notes</description><generator>Hugo</generator><language>en</language><atom:link href="https://blog.seolcu.com/notes/index.xml" rel="self" type="application/rss+xml"/><item><title>Automatic `docker compose pull` updates slowly fill the disk with dangling images</title><link>https://blog.seolcu.com/notes/docker-compose-pull-dangling-images-fill-disk/</link><pubDate>Mon, 09 Nov 2026 00:00:00 +0000</pubDate><guid>https://blog.seolcu.com/notes/docker-compose-pull-dangling-images-fill-disk/</guid><description>Each &lt;code&gt;docker compose pull&lt;/code&gt; + &lt;code&gt;up -d&lt;/code&gt; leaves the previous image untagged (dangling). Nothing removes it, so weekly auto-updates grow &lt;code&gt;/var/lib/containerd&lt;/code&gt; without bound. Run &lt;code&gt;docker image prune --force --filter until=336h&lt;/code&gt; after the post-update health check passes.</description></item><item><title>Don't pass credential-bearing URLs on the command line: they are readable in `ps` and `/proc/&lt;pid&gt;/cmdline`</title><link>https://blog.seolcu.com/notes/secret-urls-on-command-line-are-visible-in-proc/</link><pubDate>Mon, 09 Nov 2026 00:00:00 +0000</pubDate><guid>https://blog.seolcu.com/notes/secret-urls-on-command-line-are-visible-in-proc/</guid><description>A pre-authenticated upload URL passed as a &lt;code&gt;curl&lt;/code&gt; argument was visible to every local user for the whole multi-minute upload. Feed secrets to curl on stdin with &lt;code&gt;--config -&lt;/code&gt; (or from a 0600 file) instead of argv.</description></item><item><title>Expose a home server behind CGNAT through a VPS over Tailscale (Caddy for HTTPS, HAProxy for TCP)</title><link>https://blog.seolcu.com/notes/expose-home-server-behind-cgnat-with-tailscale-and-a-vps/</link><pubDate>Mon, 09 Nov 2026 00:00:00 +0000</pubDate><guid>https://blog.seolcu.com/notes/expose-home-server-behind-cgnat-with-tailscale-and-a-vps/</guid><description>Without opening anything at home: put the home server and a public VPS on one tailnet, terminate HTTPS on the VPS with Caddy &lt;code&gt;reverse_proxy&lt;/code&gt; to the server&amp;rsquo;s MagicDNS name, and forward raw TCP (game ports) with HAProxy in &lt;code&gt;mode tcp&lt;/code&gt;. Do public-side rate limiting on the VPS, because the backend only sees the VPS&amp;rsquo;s tailnet IP.</description></item><item><title>Gate automatic updates on backup freshness (bash + systemd pattern)</title><link>https://blog.seolcu.com/notes/backup-freshness-gate-for-automatic-updates/</link><pubDate>Mon, 09 Nov 2026 00:00:00 +0000</pubDate><guid>https://blog.seolcu.com/notes/backup-freshness-gate-for-automatic-updates/</guid><description>Let an unattended update job run only if a verified local backup and an offsite-upload stamp are both younger than a threshold; otherwise skip with exit 0 and push DOWN to a heartbeat monitor. A broken backup then surfaces as a red monitor instead of an update without a restore point.</description></item><item><title>GitHub Sponsor button not showing despite FUNDING.yml: enable `hasSponsorshipsEnabled` per repository</title><link>https://blog.seolcu.com/notes/github-sponsor-button-needs-has-sponsorships-enabled/</link><pubDate>Mon, 09 Nov 2026 00:00:00 +0000</pubDate><guid>https://blog.seolcu.com/notes/github-sponsor-button-needs-has-sponsorships-enabled/</guid><description>A &lt;code&gt;FUNDING.yml&lt;/code&gt; (per repo or in your account&amp;rsquo;s &lt;code&gt;.github&lt;/code&gt; repo) is not enough. Each repository also needs its Sponsorships feature turned on, either under Settings → General → Features → Sponsorships or in bulk with the GraphQL &lt;code&gt;updateRepository(input: {hasSponsorshipsEnabled: true})&lt;/code&gt; mutation. The REST repo object has no such field.</description></item><item><title>OCI Object Storage: versioning + fixed-key overwrites quietly bill terabytes</title><link>https://blog.seolcu.com/notes/oci-object-storage-versioning-hidden-cost/</link><pubDate>Mon, 09 Nov 2026 00:00:00 +0000</pubDate><guid>https://blog.seolcu.com/notes/oci-object-storage-versioning-hidden-cost/</guid><description>With bucket versioning on, overwriting the same object name daily keeps every old copy as a noncurrent version. 3.26 GiB of current objects carried 1.78 TiB of versions and cost $29.93–$58.56/month. &lt;code&gt;oci os object bulk-delete&lt;/code&gt; does not remove versions; delete by &lt;code&gt;version-id&lt;/code&gt;.</description></item><item><title>Unattended offsite backups with the official Proton Drive CLI</title><link>https://blog.seolcu.com/notes/proton-drive-cli-unattended-backups/</link><pubDate>Mon, 09 Nov 2026 00:00:00 +0000</pubDate><guid>https://blog.seolcu.com/notes/proton-drive-cli-unattended-backups/</guid><description>Run the official &lt;code&gt;proton-drive&lt;/code&gt; CLI from systemd on headless servers: log hosts in as a separate editor account (Proton has no scoped tokens), store the session in &lt;code&gt;pass&lt;/code&gt; with a passphrase-less GPG key, set a readable working directory, and purge the owner&amp;rsquo;s trash yourself.</description></item><item><title>Uptime Kuma push monitors: 24.8-day interval limit and the always-DOWN query string</title><link>https://blog.seolcu.com/notes/uptime-kuma-push-monitor-pitfalls/</link><pubDate>Mon, 09 Nov 2026 00:00:00 +0000</pubDate><guid>https://blog.seolcu.com/notes/uptime-kuma-push-monitor-pitfalls/</guid><description>Uptime Kuma push intervals cannot exceed 2147483 s (~24.8 days, Node.js 32-bit timer). Monitor longer cadences with a weekly re-push of the last result. Also push to the bare &lt;code&gt;/api/push/&amp;lt;token&amp;gt;&lt;/code&gt; URL: pasting the UI&amp;rsquo;s &lt;code&gt;?status=up&amp;amp;msg=OK&amp;amp;ping=&lt;/code&gt; URL and adding your own &lt;code&gt;status&lt;/code&gt; makes every heartbeat record as DOWN.</description></item><item><title>Disable USB autosuspend on Linux (USB Ethernet adapter drops after boot)</title><link>https://blog.seolcu.com/notes/linux-disable-usb-autosuspend/</link><pubDate>Sat, 11 Oct 2025 00:00:00 +0000</pubDate><guid>https://blog.seolcu.com/notes/linux-disable-usb-autosuspend/</guid><description>Add the kernel parameter &lt;code&gt;usbcore.autosuspend=-1&lt;/code&gt; and regenerate the bootloader config (&lt;code&gt;update-grub&lt;/code&gt; on Debian/Ubuntu, &lt;code&gt;grubby&lt;/code&gt; on Fedora). Verify with &lt;code&gt;cat /sys/module/usbcore/parameters/autosuspend&lt;/code&gt; → &lt;code&gt;-1&lt;/code&gt;, and check that the adapter&amp;rsquo;s &lt;code&gt;power/runtime_status&lt;/code&gt; reads &lt;code&gt;active&lt;/code&gt;.</description></item><item><title>Expose local TCP services without port forwarding using frp (frps on a VPS, frpc at home)</title><link>https://blog.seolcu.com/notes/frp-expose-local-server/</link><pubDate>Sat, 11 Oct 2025 00:00:00 +0000</pubDate><guid>https://blog.seolcu.com/notes/frp-expose-local-server/</guid><description>Run &lt;code&gt;frps&lt;/code&gt; on a public VPS (&lt;code&gt;bindPort = 7000&lt;/code&gt;, &lt;code&gt;auth.token&lt;/code&gt;) and &lt;code&gt;frpc&lt;/code&gt; on any machine at home with one &lt;code&gt;[[proxies]]&lt;/code&gt; block per service (&lt;code&gt;type = &amp;quot;tcp&amp;quot;&lt;/code&gt;, &lt;code&gt;localIP&lt;/code&gt;, &lt;code&gt;localPort&lt;/code&gt;, &lt;code&gt;remotePort&lt;/code&gt;). Both run as systemd services.</description></item><item><title>Keep a Linux laptop running with the lid closed (systemd-logind HandleLidSwitch)</title><link>https://blog.seolcu.com/notes/linux-laptop-ignore-lid-close/</link><pubDate>Sat, 11 Oct 2025 00:00:00 +0000</pubDate><guid>https://blog.seolcu.com/notes/linux-laptop-ignore-lid-close/</guid><description>Set &lt;code&gt;HandleLidSwitch=ignore&lt;/code&gt;, &lt;code&gt;HandleLidSwitchExternalPower=ignore&lt;/code&gt; and &lt;code&gt;HandleLidSwitchDocked=ignore&lt;/code&gt; in a drop-in under &lt;code&gt;/etc/systemd/logind.conf.d/&lt;/code&gt;, then reboot. Check the effective config with &lt;code&gt;systemd-analyze cat-config systemd/logind.conf&lt;/code&gt;.</description></item><item><title>kitty terminal over SSH: 'xterm-kitty': unknown terminal type</title><link>https://blog.seolcu.com/notes/kitty-ssh-kitten/</link><pubDate>Sat, 11 Oct 2025 00:00:00 +0000</pubDate><guid>https://blog.seolcu.com/notes/kitty-ssh-kitten/</guid><description>Remote hosts don&amp;rsquo;t have kitty&amp;rsquo;s terminfo, so &lt;code&gt;nano&lt;/code&gt;, &lt;code&gt;less&lt;/code&gt;, &lt;code&gt;tput&lt;/code&gt; and line editing fail with &lt;code&gt;Error opening terminal: xterm-kitty.&lt;/code&gt; and similar. Connect with &lt;code&gt;kitten ssh&lt;/code&gt; (it copies the terminfo and sets up shell integration), or copy the terminfo once with &lt;code&gt;infocmp -a xterm-kitty | ssh host tic -x -o ~/.terminfo /dev/stdin&lt;/code&gt;.</description></item></channel></rss>