A post on the pronouns.page blog
]]>Wpis na blogu zaimki.pl
]]>A post on the pronouns.page blog
]]>Wpis na blogu zaimki.pl
]]>Wpis na blogu zaimki.pl
]]>Nobody likes ads, obviously. But what came as a painful surprise for me is that they don't just annoy people who see them – but also those who try to monetise their projects. It's not just a matter of putting a few tags on your page and waiting for a big fat wire transfer.
The process is exhausting and I feel the need to rant about it, as well as maybe warn people who might be embarking on a similar journey… so here we go.
In a perfect world, if I create a popular website, I could easily find someone who wants to use that advertising space, they give me money, I add their banner, everyone is happy. The ad is simply relevant to the page content, not the personal info about any particular user. In practice, though, unless you're a huge company with enough resources, finding advertisers and negotiating deals is a tedious task that a random programmer or creator just isn't equipped to do.
That's why ad networks exist – they facilitate the process, act as proxies between publishers and advertisers, and they take their cut. Cool concept, it really is. The problem, though, is the capitalist approach of squeezing the last bits of value from the process, at the cost of user experience, privacy and simplicity.
When I was researching ad networks last year, I only found one that was plain and simple: EthicalAds. It would've been perfect for my needs, if it wasn't for the fact that it's only applicable for websites that target software developers. I run a few of those, but they're too tiny to join the network, while the popular project that me and the rest of the collective wanted to use it for, Pronouns.Page, is for a totally different audience.
So it was more a choice of lesser evil than finding an ad network that we'd be totally comfortable with. Personally, I wanted to avoid dealing with Google, but it looks like most networks are strongly relying on AdSense anyway. We ended up trying three different networks so far, and today I've sent the third one a termination notice after having been in talks with the fourth network to switch to them. Let's hope that the fourth time will be the charm 😅
I don't really wanna name and shame any specific companies, cause it seems like the issues are there all over the industry, plus some of our problems might be stemming from our own inexperience in the advertisement world (although that shows how inaccessible the process is to an average publisher).
One inherent problem with ad networks is that it's practically impossible to fully test how they will look on your website. I can put seven empty placeholders on the page, as instructed by an expert from the network, and then test it and see that three of them got filled out with ads – while you load the same page and see all seven. I might be shown ads of food delivery companies – while you get shown some disgusting foot fungus medication ad. Some networks let you pick the categories that will and will not be shown, and even review post-factum which specific ads have been shown to users and block those advertisers for the future – but others give you zero flexibility in that area. In general, algorithms, mathematical models, AI and real-time bidding have more say than humans.
But that's something that's, admittedly, hard to avoid in the existing ecosystem. Other issues were more avoidable. For example, when we first tried one network, it utterly broke our website. They offered a super simple setup – just give them access to your Cloudflare and they'll proxy everything, not only adding the necessary ad scripts, but also optimising the traffic and speeding up your page. Sounds cool, didn't work. Well, it probably does for most of their publishers, but in case of our PWA and some DNS entries their scripts were not expecting, we ended up with no ads and no ability to log in. Not fun.
You'd think that adding a script that's loaded after the rest of the page and should limit its impact for a bunch of clearly defined placeholder shouldn't really affect the performance of the page much. However, one network's scripts were somehow affecting us so much that we ended up switching to another mainly for that reason. Another broke an essential feature of the page in a way that was troublesome to debug.
Update: After installing Sentry we've found out just how much JS errors ad scripts produced, geeeez…
All the networks looked at our traffic numbers and predicted monthly revenue in the lower five digits area – the kind of money that we could set up a proper foundation with, run educational campaigns, spread our mission, employ people, make the project a full-time job, not just a side project of passion created in spare time. But in practice it was not just lower, but an order of magnitude lower. Still not bad, enough to cover the server, domains, cloud and other maintenance costs, do occasional offline stuff like printing our zine, creating pins, stickers and flyers and handing them out at Herts Pride and Toruń Pride, and distributing the rest among the contributors in a form of volunteer allowance. Basically, it's not some wild, life-changing money, but it keeps the project running while also rewarding contributors for our time and effort, and helping us pay our bills. So we're really grateful to be in that position.
What's really bugging us, though, is how volatile and unpredictable the whole thing is. Of course we're expecting ups and downs, but sometimes it can just randomly drop by half in the span of two months, with no explanation. One that we did get, I'm not kidding, is that after we've spent a lot of time optimising the setup with A/B testing, our ad units performed so well that the system counts the traffic as suspicious and just doesn't pay for it. Their proposed solutions (adding padding and labels to ads so that users are less likely to click on them accidentally) didn't help at all. And there's no one to complain about it, you just have to deal with it.
There are so many variables at play, it's super confusing and unclear. Our current ad network tripled (!) the number of ad impressions they were showing our users compared to the previous company, without it being proportionally reflected in the revenue or becoming more optimised for user experience with time.
One network wouldn't show us any reporting for the first month, we were completely in the dark. And once we finally got access to the dashboard, it was way less useful than what other networks provided (eg. even trying to figure out which ad unit is which was not easy, because the dashboard simply didn't show their unique identifiers that are used in the code) – which we couldn't have known until we're a month in.
The flexibility of the setup varies a lot between the networks. For example, one has a simple button to switch their consent box from “Accept / More options” to “Accept / Decline / More options”, while another took two weeks to fulfil our simple request “we're not going live until declining is just as simple as accepting”. And none had an option to show the consent banner to everyone, not just people who are in jurisdictions where it's required by law, unless we implemented a big chunk ourselves.
I'm sure we could make our setup better in one way or another. There might be a good balance somewhere, there's probably an ad network that's the best match for us that we haven't tried yet. But I don't want to be spending more time on making monetisation bearable than I spend working on the actual website. It's already a way more annoying and complicated project than I was expecting it to be…
We're currently onboarding with a fourth company, hopefully to be accomplished this week. They look very promising, so keep fingers crossed that they're actually what they seem to be and that this switch will be the last one 😉
We're also working on implementing an idea (which was also independently proposed by a user) to offer a subscription for a few bucks which would remove all ads for them and the visitors of their profile, add a “supporter” badge in their card, and support the project.
I really hope that works out, because dealing with the ads setup (even though personally I'm mainly helping with the technical side and am shielded from a lot of other bs) is really sucking the joy out of creating this passion project.
]]>A post on the pronouns.page blog
]]>Wpis na blogu zaimki.pl
]]>Wpis na blogu zaimki.pl
]]>Wpis na blogu zaimki.pl
]]>Alejandra Caraballo posted a video of a powerful testimony by Lola Smith, a 12-year-old nonbinary person forced to beg for their rights in front of the Florida Medical Board. This video is both terrifying and empowering. Indeed, everyone should see it.
But transphobes transphobing and trans people being forced to defend their dignity is just a part of the struggle. Another one is how our “allies” are pretending to ally…
You'd think that if a nonbinary person says they're nonbinary within the first few seconds of a video, if they literally introduce themselves with name, age and gender, then people watching the video and commenting on it would get the message that the person is nonbinary. And yet, there's comments underneath the tweet calling Lola a “brave young lady”, “inspiring young woman”, she/her-ing them1…
Just because transphobic politicians are setting the bar for treating trans people with dignity as terrifyingly low as letting them exist in public spaces, it doesn't mean that's where your allyship should stop.
Real allyship starts with actually respecting a person's identity. If you look at a person who says they're nonbinary and you see a girl2, you're missing the entire point. Lola is very likely to see this tweet and see the comments where “allies” purposefully misgender them. How will they feel, after having to defend themselves in front of a panel full of transphobes, seeing that even self-proclaimed allies don't really respect them?
Yes, purposefully misgender. If you make a mistake, if something slips your mind – it's perfectly fine, we all do that; but you need to take effort to correct that mistake! As an analogy, say you reposted an information about a celebrity dying, but it turns out it was all a hoax, they're very much alive, and you were made aware of that. You would edit or remove your post, so that the fake news doesn't circulate anymore, right?
Yet here the “allies” in question, after getting politely corrected (and interacting with the replies), still as of time of writing this post (13h after) have neither apologised nor removed their tweets. So how on Earth is it not a purposeful misgendering of a child?
And apparently, according to some other user in the replies, politely correcting a factual error that actively harms a trans kid is what makes us “insufferable”, “small-minded”, “pedantic”, “counter-productive”, and a self-designated “pronoun police” 🤦🤦🤦
Holy fuck, that's absurd… The video we’re commenting under is about Lola demanding respect for their identity, and the “ally” in question not only didn’t do that but keeps refusing to do that by not removing the tweet (well, it got 38 likes, you could see how big of a sacrifice it would be to lose those imaginary internet points!). How is it “counter-productive” to correct someone’s mistake, especially in this context?
But most importantly… “Pronoun police”? Seriously?! Police are a tool of power, authority, and often oppression. Calling a minoritised group’s effort to protect each other from mistreatment by simply pointing out that someone is hurting us a “pronoun police” is misguided at best, malicious at worst…
You're trying to flip the reality. You're literally calling the oppresed oppressors, you're comparing care for a kid's identity to state-sanctioned violence.
How insufferable of you.
1 Lola doesn't mention their pronouns in this short video, it could also be some neopronouns or even indeed “she/her” – but outright assuming it's “she/her” just because of their AGAB is a bad assumption to make; English has a normative pronoun used to describe people whose gender and/or pronouns we don't know (eg. “someone left their umbrella in the hallway”), so that's what I'll be using here.
2 Calling them a “woman”, even if preceded with “young”, is also kinda cringe… They're a kid. A 12-year-old who should be enjoying their childhood and not be put in the situation where they have to advocate for their rights in front of adults filled with hatered…
]]>DWH Delft organised a letter writing campaign to advocate for the passage of the trans ID bill in the Netherlands.
As much as I'd personally prefer to remove gender markers from official documents entirely, I believe that if it has to be there, it should at least be reasonably easy for trans people to make it reflect their real gender. So here's my letter:
Dear representative,
When most people think about trans folks, they focus only on the gender incongruence of our bodies – the aspect in which we do indeed require and appreciate the expertise of medical professionals. There are, however, so many other aspects of life where all that’s needed for our happiness and wellbeing is just understanding and acceptance. Human gender is not defined by our bodies – we all express it through things like clothes, makeup, language, name, etc.; we all care how other people see us; we care if our official documents properly describe facts about us.
Being trans is not just a medical issue. For many of us the social and legal aspects of transition might actually be more important than the medical side. What we need first and foremost is respect for our identity. That’s why I’m voicing my support for the proposed self-ID bill (wijziging vermelding geslacht in geborteakte).
Each person knows best what gender they are, it’s as simple as that. The very same way that you know which gender you are, trans people do too. It might take a while to figure out, gender is a complex concept after all, but eventually we arrive at a conclusion that’s as obvious to us as the air we breathe.
But there’s an important difference between the transgender and cisgender experience: nobody requires a doctor’s opinion to confirm that a cis person is really the gender they say they are. Our society and our government just take it for granted that if someone’s declared gender matches the genitals they were observed to have at birth, then they must be telling the truth. All the trans community is asking for is for the same respect and trust to be extended to us. We know who we are – and we need the government to acknowledge that.
It's been confirmed by multiple studies that gender affirmation improves mental health and saves lives. The government has the moral responsibility to listen to the voice of science. Requiring expert assessments not only is an unnecessary hurdle for trans people, but also isn’t supported by the experts themselves. Simplifying the procedure of changing the gender marker on the birth certificate is going to make it easier for trans people to participate in public life and government services. It costs nothing to respect someone’s identity, and it costs next to nothing to make one’s official documents reflect that reality.
Allowing an “X” marker would be an amazing step towards affirming people like myself, whose gender doesn’t fit neatly in the categories of “man” and “woman”. Making the public life inclusive for intersex and nonbinary people is an important part of the Netherlands staying a progressive and diverse country – which are some of the most important qualities that made me fall in love with this place and call it my new home.
Opponents of this bill make a lot of arguments that aren’t reflected in the reality of what the actual effects of such self-ID legislation would be. They claim that fairness in sports would be negatively affected, even though most associations already have their own rules and don’t rely on a gender marker in documents. They claim that bathrooms would become less safe, even though there’s no evidence that being trans inclusive had increased sexual violence in bathrooms anywhere in the world, and even though this legislation doesn’t even affect the rules regarding access to gendered bathrooms – it’s still just as legal to enter a bathroom regardless of one’s gender, and it’s still just as illegal to harass and rape people. Painting the entire community of trans people as potential rapists is just despicable, and arguing that the only thing stopping actual rapists from harassing people in bathrooms is somehow the gender marker in their documents, that’s simply ridiculous.
There’s no evidence of potential systemic abuse of a self-ID system, and the bill has safeguards in place to ensure that people don’t change their marker on a whim. It also addresses the rare situations of detransition. Essentially – there’s no reason to believe that simplifying the way that trans people can adjust their gender marker to better reflect reality would in any way be a systemic issue or otherwise harmful to the society. What is harmful, though, is all the disinformation and unethical attacks targeting minoritised groups, such as trans people.
We just want to live our lives in peace, being true to ourselves. We just want our identity respected and the reality reflected in our documents. We just want the government to simply believe us that we know who we are. Because no one knows our identity better than we do ourselves.
— Andrea Vos
]]>A user suggested adding a timezone field to Pronouns.page. This website lets people, among other things, create a card with info about how they want to be referred – their pronouns, names, etc. But it also has some generic fields, like age or links, so the team was onboard with the idea of adding some more basic info: not just timezone, but while we're at it, why not also a location?
Well, adding a location is not as easy as it seems…
First thing that comes to mind when I think of adding a location field in a profile is my experience running #TeamLocked (NSFW). I thought I implemented it in a pretty neat way – but turns out I still couldn't avoid issues.
I wanted the data to be structured, not just a free text field – that way I could add some smaller or bigger features around it: from displaying a little emoji flag next to a country name, to allowing people to search users by country and province.
So I split it into three levels: country
, province
(which depending on context can mean a state, a province, a województwo, etc.) and city
. First two being a selection from predefined lists, while the last one a free text input – cause I'm not going to manage a database of all cities, municipalities and villages in the world 😅 But even for countries and provinces, I didn't want to manually manage that list either – those things change constantly, and I'd rather focus on actually running the page. So I delegated the issue to the United Nations. I wrote a script that fetches the list of countries from here and the list of provinces from here, puts it into a neat JSON file, and then gets used to generate the select fields.
I thought that would be simple and unproblematic… until someone messaged me, angry that my website calls his country “Taiwan, Province of China”. Which is not something I stand for, but I checked and indeed that's how UNECE describes the country code “TW”. It's some kind of a weird compromise between recognising Taiwan's independence and pleasing China. Let's give it a separate country code while still calling it a part of another country… Ugh…
I changed my script to rename that item on the fly, but then more of similar issues kept coming. I checked if Kosovo is on a list – nope, despite having an ISO country code (XK) and an emoji flag (🇽🇰), it isn't included on UNECE's list. So I added it. The list of British provinces didn't include London for some reason. North Macedonia's name didn't get updated for a while, and Czechia's still isn't. Even though I had an automated script and was delegating responsibility to an international authority – I still ended up needing to put in manual effort into it.
Despite unexpected issues, it ended up working really well in the end. But simply applying a similar approach (well, probably just reusing the very same script) wouldn't really fit Pronouns.page well.
First of all, unlike #TeamLocked, an adult dating website, Pronouns.page is family friendly, and a lot of its users are minors. I want to make sure that I don't create a feature that could inadvertedly cause harm. What if a 13-year-old queer kid sees a free text input field called “location” and without thinking much just puts in their full home address?
We'd also like to avoid unnecessary political conflicts. Don't get me wrong, we're quite a political team, but our mission is to tell enbies (and queers in general) that they're amazing, that they deserve respect and recognition of their identity, and that they have a right to shape their language to meet their needs; not to get tangled in endless discussions over which government has jurisdiction over which piece of land. Actually, many of us are anarchists, so we'd rather see those governments fall than start showing their flags as a location indicator and validating the notion that artificial political borders are the best way to describe where you are 😅
Then there's a question of localisation. In the database we'd of course save the country info as a simple country code, but when displaying it – on a page so heavily focused on language and localisation – we'd have to take into account wheter “DE” should get shown as “Germany”, “Deutschland”, “Duitsland”, “Niemcy”, … There's databases online that we could use for that, but it's adding another layer of complexity…
There is a way to describe one's location that's super simple and (mainly) independent from politics – just use latitude and longitude, right? Other than the prime meridian being an arbitrary choice, it literally just describes one's location on a globe using simple geometry.
There is one problem though, at least for our use case: it's way too accurate. We want to allow users to share some very basic info about themselves, to let others know whether they live nearby or across an ocean – and not to be their GPS 😅
What if we rounded it to the nearest degree, though? Or 5 degrees? That way we'd only know that someone lives within a rectangle of few hundred kilometers by few hundred kilometers, giving us a healthy dose of inaccuracy and therefore privacy.
Well, I made a little proof of concept of how selecting one's location would look like, and TBH it's not too nice or intuitive. It's just a map with some arbitrary rectangle following your mouse, it looks confusing when you live near an edge of such a rectangle, it would require some fancier projection than Mercator, it wouldn't be too easy to use on mobile, etc. etc.
All of those potential issues can be overcome, of course, but I'd rather settle for something easier, if possible.
Well, the answer has been there all along! We were going to implement timezones anyway, right? We can use that for location information. After all, time and space are very closely related!
The simplest way to approach storing one's timezone would be to save the offset, like UTC-5
. But offset ≠ timezone! My timezone is UTC+1 now, but in March it will switch to UTC+2 even if I don't move anywhere – thanks DST 🙄 It's more accurate to use IANA's timezones, in my case Europe/Amsterdam
– that way a library can just calculate the proper offset itself.
But as you can see, that format already includes some location information! Why don't we just use it? Here's how those timezones look on a map:
It looks exactly like what we need! It splits the Earth into chunks that look less arbitrary and clunky than some purely geometric lat/long rectangles. Chunks that are big enough not to give away too much of someone's location, but small enough to give a pretty good understanding of how far away from you someone is. Sure, in many cases those splits follow country borders, but at least the assocciated labels focus mostly on cities and geographical names rather than political ones.
So, let's get to actually implementing the timezone field! It ended up being way simpler than I imagined. Here's how the form looks:
Turns out we can just use a built-in JavaScript feature to list all the IANA timezone codes:
this.timezones = Intl.supportedValuesOf('timeZone');
I'm already using Luxon in the project, so let's leverage its timezone features to add the “Detect automatically” button:
this.timezone = DateTime.local().zone.name;
Yup, that's it. Well, setting aside all the boring stuff, like migrations, server-side handling, autocomplete component, etc. – but the timezone part itself was incredibly easy!
I also added switches to let users choose whether their continent/ocean and location field should be explicitly displayed on their card (the full timezone code needs to be published by the API anyway, in order to correctly calculate the offset, but we can decide whether to show it in an easily accessible way).
And here's how it shows up in the profile:
The clock is of course dynamic. I used Luxon's built-in localisation to be able to show for example “1:35 PM” on the English version while Polish says “13:35”. I also had to remember to include weekday, so that it's clearer if someone is a day ahead or behind you. One nice extra touch is that since FontAwesome has multiple “globe” icons, each focusing on a different continent, I could even make the icon dynamic 😉
Different use cases might require different solutions, but if yours is similar to ours – relatively low accuracy by design, hard to abuse, easy to localise, etc. – keep in mind that timezones could be super helpful.
IANA timezone encodes so much information: if you know it, you know both approximately where someone is and also what time is it there. Pretty cool, huh?
Turns out there are still problems with the IANA timezones database. Kind of expectedly, huh? I knew life can't be too easy, there's definitely gonna be controversies around city names, I'm just excpecting that there would be fewer than with countries.
So the first one we found is this: for the capital of Ukraine IANA uses… the Russian spelling 🤦 (Kiev). We've replaced it with the more appropriate one: Kyiv.
A post on the pronouns.page blog
]]>Wpis na blogu zaimki.pl
]]>Wpis na blogu zaimki.pl
]]>Wpis na blogu zaimki.pl
]]>Wpis na blogu zaimki.pl
]]>When it comes to DevOps, I'm just the “dev”. I write code, but I'd rather have someone else worry about making sure it keeps running as intended. I manage my personal VPS, I manage some servers at work, but I wouldn't call myself an expert in that area at all. So I'm super proud of myself and how well it went when I migrated a big project to a new machine 😊 The downtime was just 15 minutes! Here's the story, if you're interested.
I bought the server on Wednesday and started setting it up, completely independently of the old machine. I created a setup that from the outside was indistinguishable from the old one, except for using an older database backup. Until Saturday morning they were running simultaneously – the DNS were pointing to the old IP, but my local /etc/hosts
to the new one.
I picked Saturday morning, because mornings are when our traffic is lowest, and that day I'm free and can focus on the migration, even if something goes wrong and takes more time than expected.
An important part of the plan was taking notes – every important command I had run, I documented for myself. In case anything goes wrong and I have to start over, or in case I wanted to later migrate my other projects to Hetzner too (and I do), I'd have a recepe basically ready.
The old configs were… meh. Long, repetitive and messy. Just switching from Apache to nginx simplified them massively, but I went further and extracted common parts for all domains and subdomains to make them reusable. Setting up everything for a new language version used to be a half-an-hour-or-so long process – now it takes me a few minutes.
There's two things that were really annoying for me to figure out: analytics and monitoring. Those things are expensive when your traffic is as big as ours. Corporations with such traffic can afford it easily, but we're not a business, we have no considerable income other than donations and an arc.io widget. We need to self-host those things, then.
For traffic analytics, I've recently switched from Matomo to Plausible. As much as Matomo is better than Google Analytics from the privicy perspective (and it's a lot better), it's still really heavy and has way more features than I'll probably ever need. I needed to pay 11€/m extra for a separate database server just for Matomo to store its logs. Plausible, on the other hand, is exactly what I need. So neat!
For monitoring… We used to have one, hosted on AWS Lambda, but it kept causing trouble that I had no time to fix, and in the end I disabled it. Monitoring is quite hard, because it needs to run on a dedicated and super reliable infrastructure – we can't monitor ourselves after all; if the server is down, so is the monitor that's supposed to let us know. I found out a really cool tool that keeps blowing my mind with its ingenuity: Upptime. It runs entirely on GitHub pages and actions, totally for free (as long as you keep it public).
We have multiple node servers running for different language versions. Each needs to run at some port and then nginx needs to be configured as a reverse proxy to that specific port. Before it was really tediuos, I'd just enumerate the ports starting at 3001 and for each new version I'd first need to sift through configs to find what the current max value was. I kept looking up which port was related to which domain. Annoying shit.
In the new setup, I wanted to have some single source of truth for the domain-port pairs, but it turned out to be near impossible (at least for my skills). Nginx is strict about its configs being static. I couldn't find an easy way to pass data about those ports to it.
Ultimately, I settled for a compromise system: I unambiguously map each version to a port by convering each letter of its ISO code to its index in the English alphabet. For example for Japanese, ja
, the port would be 31001
because “j” is the 10th letter of the alphabet, and “a” is the 1st. Not a perfect system, but it's gonna simplify my flow a lot.
I wanted to switch from supervisor to pm2 for its nicer interface and cool features, but for some reason it kept dropping a significant percentage of requests at (seemingly) random. I couldn't figure out the root cause, so I gave up. That switch wasn't worth that much of my time, I reverted back to supervisor.
A huge issue was that… no emails were getting sent from the new server. Every SMTP request would just time out. I tried everything I could think of, I figured I must've misconfigured something. I asked the team for help, but we couldn't find a root cause. But then I got this random hypothesis – what if Hetzner is blocking port 465 regardless of our firewall settings? A quick seach – turns out they do! Ugh… I get their reasoning, seems like a perfectly reasonable approach. Switching ports worked. I just wish they somehow gave notice more visibly, not just an unexplained timeout, so that I wouldn't waste so much time figuring it out.
I struggled with moving Plausible too… It runs in Docker containers – but my knowlege of Docker is pretty limited. I spent way too much time trying to pg_dump
and pg_restore
my way from one container to host to another host via scp
to another container, only to finally succeed and then… realise that the Postgres database is just half of the story. The main chunk of data resides in ClickHouse. Instead of struggling with the whole thing again, I took a different approach: backing up and restoring entire Docker volumes. It worked like a charm! Here are the commands, if you're interested:
# old host
docker run -v plausible_db-data:/volume --rm loomchild/volume-backup backup - > ./db-data.tar.bz2
docker run -v plausible_event-data:/volume --rm loomchild/volume-backup backup - > ./event-data.tar.bz2
scp ./db-data.tar.bz2 pp:/home/admin/www/stats.pronouns.page
scp ./event-data.tar.bz2 pp:/home/admin/www/stats.pronouns.page
# new host
cat ./db-data.tar.bz2 | sudo docker run -i -v statspronounspage_db-data:/volume --rm loomchild/volume-backup restore -f -
cat ./event-data.tar.bz2 | sudo docker run -i -v statspronounspage_event-data:/volume --rm loomchild/volume-backup restore -f -
When everything was ready, on Friday evening, I announced the upcoming maintanance and waited. I had all the commands ready in a notepad.
When the time came, I just… stopped both servers, moved the database, moved plausible volumes, started the new server, and then updated the DNS entries. Simple as that.
It was tons of work over a couple of evenings, but good preparation made wonders: it only took a quarter to actually switch. Considering how ops is not my forte at all, I'm so proud of having accomplished such a smooth transition 🥰
A post on the pronouns.page blog
]]>A post on the pronouns.page blog
]]>A post on the pronouns.page blog
]]>