<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Mastodon on East of the Sun, West of the Moon</title>
    <link>https://is-here.com/tags/mastodon/</link>
    <description>Recent content in Mastodon on East of the Sun, West of the Moon</description>
    <generator>Hugo -- gohugo.io</generator>
    <language>en-us</language>
    <copyright>Erwin Harte</copyright>
    <lastBuildDate>Wed, 31 Dec 2025 00:00:00 +0000</lastBuildDate><atom:link href="https://is-here.com/tags/mastodon/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Mastodon server</title>
      <link>https://is-here.com/project/mastodon/</link>
      <pubDate>Wed, 31 Dec 2025 00:00:00 +0000</pubDate>
      
      <category>AWS</category><category>Mastodon</category><category>Terraform</category><guid>https://is-here.com/project/mastodon/</guid>
      <description>
&lt;div id=&#34;outline-container-headline-1&#34; class=&#34;outline-2&#34;&gt;
&lt;h2 id=&#34;headline-1&#34;&gt;
Status
&lt;/h2&gt;
&lt;div id=&#34;outline-text-headline-1&#34; class=&#34;outline-text-2&#34;&gt;
&lt;p&gt;Active since December 2022.&lt;/p&gt;
&lt;p&gt;
Moved from AWS to Hetzner in November 2025.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-2&#34; class=&#34;outline-2&#34;&gt;
&lt;h2 id=&#34;headline-2&#34;&gt;
What
&lt;/h2&gt;
&lt;div id=&#34;outline-text-headline-2&#34; class=&#34;outline-text-2&#34;&gt;
&lt;p&gt;My personal &lt;a href=&#34;https://joinmastodon.org/&#34;&gt;Mastodon&lt;/a&gt; server. The accounts on there are all &lt;em&gt;me&lt;/em&gt;, at this time.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-3&#34; class=&#34;outline-2&#34;&gt;
&lt;h2 id=&#34;headline-3&#34;&gt;
Where
&lt;/h2&gt;
&lt;div id=&#34;outline-text-headline-3&#34; class=&#34;outline-text-2&#34;&gt;
&lt;p&gt;&lt;a href=&#34;https://strangeweb.page/&#34;&gt;https://strangeweb.page/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;
I wanted to keep this relatively separate from other projects, so I registered a &lt;code class=&#34;verbatim&#34;&gt;.page&lt;/code&gt; domain.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-4&#34; class=&#34;outline-2&#34;&gt;
&lt;h2 id=&#34;headline-4&#34;&gt;
How
&lt;/h2&gt;
&lt;div id=&#34;outline-text-headline-4&#34; class=&#34;outline-text-2&#34;&gt;
&lt;p&gt;When I migrated to Hetzner, I simplified the setup a bit:&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;A single VM&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;
More than enough CPU, RAM, storage, and of course an IPv4 and an IPv6 address.&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;Access via &lt;code class=&#34;verbatim&#34;&gt;ssh&lt;/code&gt; locked down&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;
Only my home IP address can get in. Easily updated when that changes (which is rare).&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;The other ports available&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;
Port 80 (&lt;code class=&#34;verbatim&#34;&gt;http&lt;/code&gt;, in practice really only for LetsEncrypt, but also the classic &lt;code class=&#34;verbatim&#34;&gt;http&lt;/code&gt; to &lt;code class=&#34;verbatim&#34;&gt;https&lt;/code&gt; redirect), and of course 443 (&lt;code class=&#34;verbatim&#34;&gt;https&lt;/code&gt;) for the main attraction.&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;Still using the S3 bucket&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;
I plan to migrate that to different object storage in the near future.&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;Terraform code&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;
It creates the VM, updates the DNS (A and AAAA records which now live at &lt;a href=&#34;https://desec.io/&#34;&gt;deSEC.io&lt;/a&gt;), as well as reverse DNS managed by Hetzner, then throws &lt;code class=&#34;verbatim&#34;&gt;cloud-init&lt;/code&gt; at it.&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;The &lt;code class=&#34;verbatim&#34;&gt;cloud-init&lt;/code&gt; setup&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;
This takes care of basic conveniences (things like &lt;code class=&#34;verbatim&#34;&gt;emacs&lt;/code&gt;, &lt;code class=&#34;verbatim&#34;&gt;jq&lt;/code&gt;, &lt;code class=&#34;verbatim&#34;&gt;rsync&lt;/code&gt;, and others) but also installs dependencies for Mastodon and prepare it most of the way (skipping the interactive configuration of Mastodon itself).&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-5&#34; class=&#34;outline-2&#34;&gt;
&lt;h2 id=&#34;headline-5&#34;&gt;
Code and related things
&lt;/h2&gt;
&lt;div id=&#34;outline-text-headline-5&#34; class=&#34;outline-text-2&#34;&gt;
&lt;p&gt;Mastodon &lt;a href=&#34;https://docs.joinmastodon.org/user/run-your-own/&#34;&gt;instructions&lt;/a&gt; for setting up your own server&lt;/p&gt;
&lt;p&gt;
The &lt;a href=&#34;https://codeberg.org/jochie/strangeweb.page/&#34;&gt;Infrastructure as Code&lt;/a&gt; at &lt;a href=&#34;https://codeberg.org/.&#34;&gt;https://codeberg.org/.&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-6&#34; class=&#34;outline-2&#34;&gt;
&lt;h2 id=&#34;headline-6&#34;&gt;
Previously
&lt;/h2&gt;
&lt;div id=&#34;outline-text-headline-6&#34; class=&#34;outline-text-2&#34;&gt;
&lt;p&gt;The setup in AWS (from 2022-2025) was as follows:&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;Basic Virtual Private Cloud (VPC)&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;
Pretty standard setup. A subnet for public facing things (which is the only things in here right now), and one for resources that don&amp;#39;t connect out to the internet. Right now there aren&amp;#39;t any of the latter, but it is good to be prepared&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;A bastion server&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;
A locked down instance that is intended to be the only way to get into the VPC with &lt;code class=&#34;verbatim&#34;&gt;ssh&lt;/code&gt;, with an IP address that is separate from the actual service.&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;The actual Mastodon server&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;An S3 bucket&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;
This is where Mastodon stores media associated with posts (in the timeline of my accounts, or my own), with a CloudFront shield in front of it&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;Terraform code&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;
This managed all of the above.&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;For Mastodon upgrades&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;
I created &lt;a href=&#34;https://codeberg.org/jochie/misc/src/branch/master/AWS/upscale-downscale.sh&#34;&gt;a script&lt;/a&gt; to temporarily bump up the instance size, because it was unhappy for some of those steps but perfectly content running in a smaller instance during normal operations.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
</description>
    </item>
    
    <item>
      <title>Teletekst Bot</title>
      <link>https://is-here.com/project/teletekst/</link>
      <pubDate>Sun, 28 Dec 2025 00:00:00 +0000</pubDate>
      
      <category>Mastodon</category><category>Python</category><comments>https://strangeweb.page/@jochie/115805471217337649</comments><guid>https://is-here.com/project/teletekst/</guid>
      <description>
&lt;div id=&#34;outline-container-headline-1&#34; class=&#34;outline-2&#34;&gt;
&lt;h2 id=&#34;headline-1&#34;&gt;
Status
&lt;/h2&gt;
&lt;div id=&#34;outline-text-headline-1&#34; class=&#34;outline-text-2&#34;&gt;
&lt;p&gt;Active since July 2024&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-2&#34; class=&#34;outline-2&#34;&gt;
&lt;h2 id=&#34;headline-2&#34;&gt;
What
&lt;/h2&gt;
&lt;div id=&#34;outline-text-headline-2&#34; class=&#34;outline-text-2&#34;&gt;
&lt;p&gt;Monitor the news (&amp;#34;Nieuws&amp;#34; in Dutch) such as it is shared by the &lt;a href=&#34;https://nos.nl/teletekst&#34;&gt;NOS Teletekst&lt;/a&gt;, by checking the references from the index pages at 101, 102, and 103, and then scan for any other pages from 104 to 199.&lt;/p&gt;
&lt;p&gt;
When a new page is found, or an existing page is updated (using a relatively basic heuristic), post the new or updated page to the Mastodon account. It also attempts to detect when a page is moved around.&lt;/p&gt;
&lt;p&gt;
Because occasionally pages are included for sport (in general) or soccer (voetbal), it will use an appropriate &lt;code class=&#34;verbatim&#34;&gt;#TeletekstXYZ&lt;/code&gt; hashtag for that, so people can mute that. The same goes for the content updates, which can be a bit much especially for emerging stories, and get tagged with &lt;code class=&#34;verbatim&#34;&gt;#TeletekstUpdate&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;
For content updates the posts also includes comparison of the previous and current version with color-coding for words or lines that have been removed, were added, or stayed the same. It&amp;#39;s similar to &lt;code class=&#34;verbatim&#34;&gt;git diff&lt;/code&gt; but has been adapted to make more sense in this text context.&lt;/p&gt;
&lt;p&gt;
If the content was unchanged and only the page number or title changed, the existing Mastodon post is updated in place.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-3&#34; class=&#34;outline-2&#34;&gt;
&lt;h2 id=&#34;headline-3&#34;&gt;
Where
&lt;/h2&gt;
&lt;div id=&#34;outline-text-headline-3&#34; class=&#34;outline-text-2&#34;&gt;
&lt;p&gt;&lt;a href=&#34;https://mstdn.social/@teletekst&#34;&gt;https://mstdn.social/@teletekst&lt;/a&gt; (originally at &lt;a href=&#34;https://botsin.space/@teletekst,&#34;&gt;https://botsin.space/@teletekst,&lt;/a&gt; but that server shut down at the end of 2024).&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-4&#34; class=&#34;outline-2&#34;&gt;
&lt;h2 id=&#34;headline-4&#34;&gt;
How
&lt;/h2&gt;
&lt;div id=&#34;outline-text-headline-4&#34; class=&#34;outline-text-2&#34;&gt;
&lt;p&gt;There are two Cron jobs:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Every 5 minutes a program &lt;em&gt;walks&lt;/em&gt; all the pages from 101 to 199, using the &lt;code class=&#34;verbatim&#34;&gt;next page&lt;/code&gt; references. If all pages are exactly identical, discard the results.

It needs to gracefully handle broken &lt;code class=&#34;verbatim&#34;&gt;next page&lt;/code&gt; links and other quirks.&lt;/li&gt;
&lt;li&gt;Also every 5 minutes, but a minute later, a second program checks if changes were found. If so, look for new pages, deletes pages, moved pages, and modified pages.

Two pages are treated differently, namely the &amp;#34;Kort nieuws binnenland&amp;#34; and &amp;#34;Kort nieuws buitenland&amp;#34;, where one or two short national or international news items are dumped.&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-5&#34; class=&#34;outline-2&#34;&gt;
&lt;h2 id=&#34;headline-5&#34;&gt;
Disclaimer
&lt;/h2&gt;
&lt;div id=&#34;outline-text-headline-5&#34; class=&#34;outline-text-2&#34;&gt;
&lt;p&gt;This is &lt;strong&gt;not&lt;/strong&gt; an (official or endorsed) &lt;a href=&#34;https://nos.nl/&#34;&gt;NOS.nl&lt;/a&gt; service!&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-6&#34; class=&#34;outline-2&#34;&gt;
&lt;h2 id=&#34;headline-6&#34;&gt;
Code
&lt;/h2&gt;
&lt;div id=&#34;outline-text-headline-6&#34; class=&#34;outline-text-2&#34;&gt;
&lt;p&gt;&lt;a href=&#34;https://codeberg.org/jochie/Teletekst&#34;&gt;https://codeberg.org/jochie/Teletekst&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
</description>
    </item>
    
    <item>
      <title>Backups, What a Concept</title>
      <link>https://is-here.com/post/2025/12/backups-what-a-concept/</link>
      <pubDate>Sat, 27 Dec 2025 00:00:00 +0000</pubDate>
      
      <category>Mastodon</category><category>Backups</category><category>Shell</category><category>Scaleway</category><category>Hetzner</category><comments>https://strangeweb.page/@jochie/115794830473439348</comments><guid>https://is-here.com/post/2025/12/backups-what-a-concept/</guid>
      <description>
&lt;div id=&#34;outline-container-headline-1&#34; class=&#34;outline-2&#34;&gt;
&lt;h2 id=&#34;headline-1&#34;&gt;
How it started
&lt;/h2&gt;
&lt;div id=&#34;outline-text-headline-1&#34; class=&#34;outline-text-2&#34;&gt;
&lt;p&gt;For about three years I ran a single-user Mastodon instance at &lt;a href=&#34;https://strangeweb.page/&#34;&gt;strangeweb.page&lt;/a&gt; in AWS, where the non-IaC bits were mostly manually put together. It was also a big example of &amp;#34;Do as I say, don&amp;#39;t do as I do&amp;#34; because I wasn&amp;#39;t maintaining any backups.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-2&#34; class=&#34;outline-2&#34;&gt;
&lt;h2 id=&#34;headline-2&#34;&gt;
How it&amp;#39;s going
&lt;/h2&gt;
&lt;div id=&#34;outline-text-headline-2&#34; class=&#34;outline-text-2&#34;&gt;
&lt;p&gt;Recently I moved that instance from AWS EC2 to a Hetzner VM, which meant I had to actually go through the steps of taking the configuration and data from one host to another. As part of that exercise I cobbled together a small shell script that takes those vital bits and copies them to a safe place.&lt;/p&gt;
&lt;p&gt;
In my case that&amp;#39;s object storage at a different provider, avoiding a single point of failure.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-3&#34; class=&#34;outline-2&#34;&gt;
&lt;h2 id=&#34;headline-3&#34;&gt;
The script
&lt;/h2&gt;
&lt;div id=&#34;outline-text-headline-3&#34; class=&#34;outline-text-2&#34;&gt;
&lt;div class=&#34;src src-shell&#34;&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#75715e&#34;&gt;#!/bin/sh&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  . &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;$0&lt;span style=&#34;color:#e6db74&#34;&gt;.env&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  echo &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;$(&lt;/span&gt;date&lt;span style=&#34;color:#66d9ef&#34;&gt;)&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;: Creating a DB snapshot&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#75715e&#34;&gt;# Create a backup of the mastodon tables:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  sudo -u mastodon &lt;span style=&#34;color:#ae81ff&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;&lt;/span&gt;     pg_dump &lt;span style=&#34;color:#ae81ff&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;&lt;/span&gt;     -Fc mastodon_production &lt;span style=&#34;color:#ae81ff&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;&lt;/span&gt;     -f /home/mastodon/backup.dump
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  echo &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;$(&lt;/span&gt;date&lt;span style=&#34;color:#66d9ef&#34;&gt;)&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;: Creating a Redis snapshot&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#75715e&#34;&gt;# Create a snapshot of the redis data:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  redis-cli SAVE
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt; src in &lt;span style=&#34;color:#ae81ff&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;&lt;/span&gt;      /home/mastodon/live/.env.production &lt;span style=&#34;color:#ae81ff&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;&lt;/span&gt;      /var/lib/redis/dump.rdb &lt;span style=&#34;color:#ae81ff&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;&lt;/span&gt;      /home/mastodon/backup.dump; &lt;span style=&#34;color:#66d9ef&#34;&gt;do&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      echo &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;$(&lt;/span&gt;date&lt;span style=&#34;color:#66d9ef&#34;&gt;)&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;: Backing up &lt;/span&gt;$src&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      aws s3 &lt;span style=&#34;color:#ae81ff&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;&lt;/span&gt;          --endpoint &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;https://&lt;/span&gt;$ENDPOINT&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;&lt;/span&gt;          cp &lt;span style=&#34;color:#ae81ff&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;&lt;/span&gt;          --quiet &lt;span style=&#34;color:#ae81ff&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;&lt;/span&gt;          &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;$src&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;&lt;/span&gt;          &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;s3://&lt;/span&gt;$BUCKET&lt;span style=&#34;color:#e6db74&#34;&gt;/snapshot/mastodon/&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#66d9ef&#34;&gt;done&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  echo &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;$(&lt;/span&gt;date&lt;span style=&#34;color:#66d9ef&#34;&gt;)&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;: Done&amp;#34;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;
The &lt;code class=&#34;verbatim&#34;&gt;.env&lt;/code&gt; file contains two settings: &lt;code class=&#34;verbatim&#34;&gt;ENDPOINT&lt;/code&gt; and &lt;code class=&#34;verbatim&#34;&gt;BUCKET&lt;/code&gt;. The &lt;code class=&#34;verbatim&#34;&gt;ENDPOINT&lt;/code&gt; is necessary because the slightly older &lt;code class=&#34;verbatim&#34;&gt;awscli&lt;/code&gt; version on the host was ignoring the &lt;code class=&#34;verbatim&#34;&gt;endpoint_url&lt;/code&gt; directive in &lt;code class=&#34;verbatim&#34;&gt;~/.aws/config&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;
It&amp;#39;s a fairly simple file, pointing to an object storage bucket at Scaleway:&lt;/p&gt;
&lt;div class=&#34;src src-text&#34;&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;[default]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;region = nl-ams
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;output = json
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;services = scw-nl-ams&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;
The other missing piece is &lt;code class=&#34;verbatim&#34;&gt;~/.aws/credentials&lt;/code&gt; with credentials for that bucket/account.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-4&#34; class=&#34;outline-2&#34;&gt;
&lt;h2 id=&#34;headline-4&#34;&gt;
Disclaimer
&lt;/h2&gt;
&lt;div id=&#34;outline-text-headline-4&#34; class=&#34;outline-text-2&#34;&gt;
&lt;p&gt;Going back to that &amp;#34;Do as I say, don&amp;#39;t do as I do&amp;#34; bit, I have not yet performed the ultimate test of restoring a test-server from the backed up data. So if I&amp;#39;m missing something, maybe let me know so I can fix it before it&amp;#39;s too late? 😅&lt;/p&gt;
&lt;p&gt;
I also know that this only maintains a single snapshot unless the object storage has version support and it&amp;#39;s enabled.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
</description>
    </item>
    
    <item>
      <title>WARN Act Bot</title>
      <link>https://is-here.com/project/warn-act/</link>
      <pubDate>Sun, 13 Jul 2025 00:00:00 +0000</pubDate>
      
      <category>AWS</category><category>Terraform</category><category>Mastodon</category><comments>https://strangeweb.page/@@jochie/114849277939604707</comments><guid>https://is-here.com/project/warn-act/</guid>
      <description>
&lt;div id=&#34;outline-container-headline-1&#34; class=&#34;outline-2&#34;&gt;
&lt;h2 id=&#34;headline-1&#34;&gt;
Status
&lt;/h2&gt;
&lt;div id=&#34;outline-text-headline-1&#34; class=&#34;outline-text-2&#34;&gt;
&lt;p&gt;Active since around April 2023.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-2&#34; class=&#34;outline-2&#34;&gt;
&lt;h2 id=&#34;headline-2&#34;&gt;
What
&lt;/h2&gt;
&lt;div id=&#34;outline-text-headline-2&#34; class=&#34;outline-text-2&#34;&gt;
&lt;p&gt;As I understand it, there are WARN Acts in most states (maybe all) that require employers of companies over a certain size to give a heads-up to the state when they plan to let go for one reason or another. This could be for permanent closure of a place of business, redundancies for whatever reason, and some other reasons I can&amp;#39;t think of right now. Many states make the notices available in some form on the web. Sadly they don&amp;#39;t seem to have considered standardizing that, so automation based on the content found online is a challenge.&lt;/p&gt;
&lt;p&gt;
In my case, I decided to automate checking the notices for the &lt;a href=&#34;https://edd.ca.gov/en/jobs_and_training/Layoff_Services_WARN&#34;&gt;California EDD&lt;/a&gt;, and post the incremental changes (summarized where possible) on the Fediverse.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-3&#34; class=&#34;outline-2&#34;&gt;
&lt;h2 id=&#34;headline-3&#34;&gt;
Where
&lt;/h2&gt;
&lt;div id=&#34;outline-text-headline-3&#34; class=&#34;outline-text-2&#34;&gt;
&lt;p&gt;&lt;a href=&#34;https://sfba.social/@warn_act_ca&#34;&gt;https://sfba.social/@warn_act_ca&lt;/a&gt; (originally at &lt;a href=&#34;https://botsin.space/@warn_act_ca,&#34;&gt;https://botsin.space/@warn_act_ca,&lt;/a&gt; but that server shut down at the end of 2024).&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-4&#34; class=&#34;outline-2&#34;&gt;
&lt;h2 id=&#34;headline-4&#34;&gt;
How
&lt;/h2&gt;
&lt;div id=&#34;outline-text-headline-4&#34; class=&#34;outline-text-2&#34;&gt;
&lt;p&gt;The setup (in AWS) is as follows:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;An S3 bucket to maintain state from one run to another&lt;/li&gt;
&lt;li&gt;A few Systems Manager Parameter Store entries for the knowledge of where the bot is and the token to post to its timeline&lt;/li&gt;
&lt;li&gt;A Lambda that is triggered from EventBridge on a regular basis that checks the California website&lt;/li&gt;
&lt;li&gt;An SQS queue through which to manage the posts to the bot account, with a Lambda consumer that does that work&lt;/li&gt;
&lt;li&gt;Terraform code to create these resources and some tangentially related ones&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-5&#34; class=&#34;outline-2&#34;&gt;
&lt;h2 id=&#34;headline-5&#34;&gt;
Cost
&lt;/h2&gt;
&lt;div id=&#34;outline-text-headline-5&#34; class=&#34;outline-text-2&#34;&gt;
&lt;p&gt;$0.00!&lt;/p&gt;
&lt;p&gt;
Actually, the dedicated AWS account in which this runs had a bill for (literally) a few pennies one time, apparently related to AWS Cost Explorer of all things, but otherwise the monthly bills have been $0.00 since I started.&lt;/p&gt;
&lt;p&gt;
The reason is that all of the service usage (S3, Lambda, SNS, SQS, CloudWatch, and data transfer) are all flying well under the limits of the permanent AWS free tiers. The biggest risk is probably S3 where the it&amp;#39;s running up a bill of about $0.005 per month, so each month that is rounded down to $0.00 but when you request an annual total it lists that as ~$0.05. 😁&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-6&#34; class=&#34;outline-2&#34;&gt;
&lt;h2 id=&#34;headline-6&#34;&gt;
Code
&lt;/h2&gt;
&lt;div id=&#34;outline-text-headline-6&#34; class=&#34;outline-text-2&#34;&gt;
&lt;p&gt;&lt;a href=&#34;https://codeberg.org/jochie/WARN&#34;&gt;https://codeberg.org/jochie/WARN&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
</description>
    </item>
    
    <item>
      <title>Moving to Europe</title>
      <link>https://is-here.com/post/2025/04/moving-to-europe/</link>
      <pubDate>Sun, 13 Apr 2025 00:00:00 +0000</pubDate>
      
      <category>Hugo</category><category>Mastodon</category><category>Terraform</category><comments>https://strangeweb.page/@jochie/114333655533283802</comments><guid>https://is-here.com/post/2025/04/moving-to-europe/</guid>
      <description>
&lt;div id=&#34;outline-container-headline-1&#34; class=&#34;outline-2&#34;&gt;
&lt;h2 id=&#34;headline-1&#34;&gt;
Shifting things around
&lt;/h2&gt;
&lt;div id=&#34;outline-text-headline-1&#34; class=&#34;outline-text-2&#34;&gt;
&lt;p&gt;For &lt;em&gt;reasons&lt;/em&gt;, I am slowly but surely moving most of my online resources to European providers. This has meant a journey of discovery, finding suitable ones for:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Domain registration&lt;/li&gt;
&lt;li&gt;DNS hosting&lt;/li&gt;
&lt;li&gt;Some place for a few static (placeholder) websites&lt;/li&gt;
&lt;li&gt;Virtual servers of some kind&lt;/li&gt;
&lt;li&gt;Object storage or something similar&lt;/li&gt;
&lt;li&gt;Git repository hosting&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-2&#34; class=&#34;outline-2&#34;&gt;
&lt;h2 id=&#34;headline-2&#34;&gt;
Resources that helped
&lt;/h2&gt;
&lt;div id=&#34;outline-text-headline-2&#34; class=&#34;outline-text-2&#34;&gt;
&lt;p&gt;Most of my information has come from &lt;a href=&#34;https://european-alternatives.eu/&#34;&gt;european-alternatives.eu&lt;/a&gt;. Some test accounts were needed here and there because it isn&amp;#39;t necessarily obvious how well they may cooperate with automation tools like Terraform and how much click-ops will be required, and how well does their web UI work in that case.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-3&#34; class=&#34;outline-2&#34;&gt;
&lt;h2 id=&#34;headline-3&#34;&gt;
Obstacles I encountered
&lt;/h2&gt;
&lt;div id=&#34;outline-text-headline-3&#34; class=&#34;outline-text-2&#34;&gt;
&lt;p&gt;There were some hiccups with getting the European companies to play nice with my US credit cards.&lt;/p&gt;
&lt;p&gt;
One disappointment was because the company (Infomaniak 🇨🇭) seems to be incapable of sending SMS to US phone numbers. Pity, because they looked promising otherwise.&lt;/p&gt;
&lt;p&gt;
Another &lt;em&gt;Nope&lt;/em&gt; was finding out that OVH 🇫🇷 pushes you to &lt;a href=&#34;https://us.ovhcloud.com/about/&#34;&gt;OVH US&lt;/a&gt; if you&amp;#39;re in the US or Canada, a &lt;em&gt;wholly owned subsidiary of OVH Group&lt;/em&gt;, defeating the purpose of going with European companies.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-4&#34; class=&#34;outline-2&#34;&gt;
&lt;h2 id=&#34;headline-4&#34;&gt;
Choices/solutions
&lt;/h2&gt;
&lt;div id=&#34;outline-text-headline-4&#34; class=&#34;outline-text-2&#34;&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Service&lt;/th&gt;
&lt;th&gt;My Pick&lt;/th&gt;
&lt;th&gt;Based in&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Domain registration&lt;/td&gt;
&lt;td&gt;&lt;a href=&#34;https://www.openprovider.com/&#34;&gt;https://www.openprovider.com/&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;🇳🇱&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DNS&lt;/td&gt;
&lt;td&gt;&lt;a href=&#34;https://desec.io/&#34;&gt;https://desec.io/&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;🇩🇪&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Static websites&lt;/td&gt;
&lt;td&gt;&lt;a href=&#34;https://www.statichost.eu/&#34;&gt;https://www.statichost.eu/&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;🇸🇪&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Git repository hosting&lt;/td&gt;
&lt;td&gt;&lt;a href=&#34;https://codeberg.org/&#34;&gt;https://codeberg.org/&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;🇩🇪&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;
Of these, &lt;a href=&#34;https://www.statichost.eu/&#34;&gt;statichost.eu&lt;/a&gt; was a nice find, because it will let you point to a git repository (public or private), and run with it, with support for either fully static content, or one of several static site generators, and even pick a specific version to avoid surprises.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-5&#34; class=&#34;outline-2&#34;&gt;
&lt;h2 id=&#34;headline-5&#34;&gt;
Still to do
&lt;/h2&gt;
&lt;div id=&#34;outline-text-headline-5&#34; class=&#34;outline-text-2&#34;&gt;
&lt;p&gt;That leaves virtual servers, for my self-hosted mail-server and the one-person-Mastodon instance. Most likely I&amp;#39;ll pick one of UpCloud (🇫🇮) or Scaleway (🇫🇷), after sitting down again to do a side-by-side comparison.&lt;/p&gt;
&lt;p&gt;
For object storage Scaleway seems to have a reasonably priced solution, but that also needs another look.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
</description>
    </item>
    
    <item>
      <title>Hello again, world?</title>
      <link>https://is-here.com/post/2023/11/hello-again-world/</link>
      <pubDate>Mon, 13 Nov 2023 00:00:00 +0000</pubDate>
      
      <category>Hugo</category><category>Mastodon</category><category>Meta</category><comments>https://strangeweb.page/@jochie/111407198734333719</comments><guid>https://is-here.com/post/2023/11/hello-again-world/</guid>
      <description>
&lt;div id=&#34;outline-container-headline-1&#34; class=&#34;outline-2&#34;&gt;
&lt;h2 id=&#34;headline-1&#34;&gt;
From Twitter to Mastodon
&lt;/h2&gt;
&lt;div id=&#34;outline-text-headline-1&#34; class=&#34;outline-text-2&#34;&gt;
&lt;p&gt;For many years Twitter was my main social media account. My Facebook account has not been visited in many months and Instagram has mostly been kept alive to follow some friends and family&amp;#39;s postings. Though I originally did post from time to time, the last few years it had turned mostly into a read-only account.&lt;/p&gt;
&lt;p&gt;
Then last year around the time of the change in ownership, I gave up on it and began an effort to migrate my 
&lt;em&gt;network&lt;/em&gt; to Mastodon or, more accurately the &lt;a href=&#34;https://en.wikipedia.org/wiki/Fediverse&#34;&gt;Fediverse&lt;/a&gt;. Initially at &lt;a href=&#34;https://mastodon.social/@jochie&#34;&gt;mastodon.social&lt;/a&gt;, the flagship server for the Mastodon software, with an account that I had created in May 2022 but began using in earnest in October. Later I migrated to an account on a &lt;a href=&#34;https://strangeweb.page/@jochie&#34;&gt;personal server&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-2&#34; class=&#34;outline-2&#34;&gt;
&lt;h2 id=&#34;headline-2&#34;&gt;
Starting to feel an itch
&lt;/h2&gt;
&lt;div id=&#34;outline-text-headline-2&#34; class=&#34;outline-text-2&#34;&gt;
&lt;p&gt;As I was posting on my Mastodon account, I regularly found myself writing more than was going to fit in the space of the default 500 characters. Sure I could change that default (although it is a &lt;em&gt;little&lt;/em&gt; bit more work than just changing a configuration file entry), but that felt wrong. To me, the fact that I was bumping against that ceiling suggested I was looking for a different medium for those posts.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-3&#34; class=&#34;outline-2&#34;&gt;
&lt;h2 id=&#34;headline-3&#34;&gt;
Static Site Generator to the rescue
&lt;/h2&gt;
&lt;div id=&#34;outline-text-headline-3&#34; class=&#34;outline-text-2&#34;&gt;
&lt;p&gt;While I did feel the itch to write some longer form things, the idea of running (potentially vulnerable) infrastructure for this that would need to be maintained did not appeal to me.&lt;/p&gt;
&lt;p&gt;
Comes along &lt;a href=&#34;https://en.wikipedia.org/wiki/Hugo_(software)&#34;&gt;Hugo&lt;/a&gt; (docs, themes, etc at the &lt;a href=&#34;https://gohugo.io/&#34;&gt;official website&lt;/a&gt;) which comes with a generous set of themes that can be tweaked as needed, allows me to write posts and other pages in &lt;a href=&#34;https://orgmode.org/&#34;&gt;Org Mode&lt;/a&gt; syntax, and has built-in support for deploying its output into an AWS S3 bucket.&lt;/p&gt;
&lt;p&gt;
More details on the &lt;a href=&#34;https://is-here.com/project/website/&#34;&gt;project page&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
</description>
    </item>
    
  </channel>
</rss>
