Compare commits

..

9 Commits

Author SHA1 Message Date
0f692aba68 Add some fixes and news 2025-08-23 04:17:24 +03:00
92a0078b8b Fix services grid 2025-08-20 03:37:55 +03:00
63ac26acb8 Fix services grid 2025-08-20 03:17:28 +03:00
2d38a75555 Fix notes adaptivity 2025-08-20 03:10:01 +03:00
3a2271ebb6 Add .asciicontainer adaptivity fix 2025-08-20 02:59:00 +03:00
ba0e6f92fe Add new article and specific for notes stylization 2025-08-20 02:33:57 +03:00
29139c807d Add some fixes 2025-08-19 23:07:55 +03:00
3a82701008 Build new website files 2025-08-19 22:59:53 +03:00
b8060817e5 Add some fixes 2025-08-19 22:58:01 +03:00
26 changed files with 304 additions and 109 deletions

File diff suppressed because one or more lines are too long

View File

@@ -5,34 +5,27 @@
<meta name="viewport" content="width=device-width">
<!--<link rel="icon" type="image/svg+xml" href="/favicon.svg" />-->
<meta name="generator" content="Astro v2.10.7">
<meta name="description" content="{frontmatter.description}">
<meta name="keywords" content="nothing crypto free software libre self host {frontmatter.keys}">
<meta name="description" content="Беларусский или белорусский - как писать?">
<meta name="keywords" content="nothing.run nothing privacy free libre software floss self host">
<meta name="keywords" content="Беларусь или Белоруссия белорусский беларусский">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="icon" href="/nothingrun-favicon-whiteonblack.png" type="image/png">
<title>Беларусский или белорусский</title>
<link rel="stylesheet" href="/_astro/contact.05f6af3e.css" /></head>
<link rel="stylesheet" href="/_astro/contact.8ef370d5.css" /></head>
<body>
<div class="header astro-HPNW4VWY">
<a href="/" class="astro-HPNW4VWY">~/</a>
<a href="/contact.html" class="astro-HPNW4VWY">Contact</a>
<a href="/contact" class="astro-HPNW4VWY">Contact</a>
<a href="https://uptime.nothing.run" class="astro-HPNW4VWY">Uptime</a>
<a href="/news" class="astro-HPNW4VWY">News</a>
<a href="/notes.html" class="astro-HPNW4VWY">Notes</a>
<a href="/notes" class="astro-HPNW4VWY">Notes</a>
<a href="/donate" class="astro-HPNW4VWY">Donate :3</a>
</div>
<h1>Беларусский или белорусский</h1>
<h2 id="введение">Введение</h2>
<p>Вопрос “Беларусь или Белоруссия” здесь затронут не будет. Как беларус, могу сказать, что нам просто приятно, когда нас называют Беларусью, и мы считаем использование первого варианта минимальным уважением к нашему народу.</p>
<p>Но отдельная тема - писать белорусский или беларусский. Этот вопрос спорный, но я постараюсь ответить на него с точки зрения русского языка.</p>
<h2 id="морфологический-принцип">Морфологический принцип</h2>
<p>В отличие от беларусского языка, русская орфография имеет в своей основе морфологический принцип, то есть по идее вне зависимости от своей позиции морфема всегда пишется одинаково. Например, са<strong>д</strong> - са<strong>д</strong>ы (на конце всегда <code>д</code>).<br/>Исключения в виде <code>без-</code> - <code>без-</code> не учитываются, так как они редки.</p>
<h2 id="как-писать">Как писать?</h2>
<p>Для начала, в литературном стандарте закреплена форма с буквой <code>о</code>. Но в таком случае слово Беларусь должно было бы писаться с <code>о</code>, так как соеденительной морфемой в русском <code>а</code> быть не может.</p>
<p>Вот только слово Беларусь пишется с <code>а</code>. Что же пошло не так? Это заимствование из беларусского, и сейчас представляет из себя один цельный корень. Это значит, что при добавлении других морфем, в том числе суффикса -ск-, а в корне должно сохраняться. То есть самый логичный вариант - писать <code>беларусский</code>.<br/>Ну либо переходить на <code>Белорусь</code>, но…</p>
<p>P.s. естественно, всё это не касается официальных докемнтов, потому что там, как это ни странно, необходимо использовать литератный стандарт.</p>
<div class="article"><h2 id="введение">Введение</h2><p>Вопрос “Беларусь или Белоруссия” здесь затронут не будет. Как беларус, могу сказать, что нам просто приятно, когда нас называют Беларусью, и мы считаем использование первого варианта минимальным уважением к нашему народу.</p><p>Но отдельная тема - писать белорусский или беларусский. Этот вопрос спорный, но я постараюсь ответить на него с точки зрения русского языка.</p><h2 id="морфологический-принцип">Морфологический принцип</h2><p>В отличие от беларусского языка, русская орфография имеет в своей основе морфологический принцип, то есть по идее вне зависимости от своей позиции морфема всегда пишется одинаково. Например, са<strong>д</strong> - са<strong>д</strong>ы (на конце всегда <code>д</code>).<br/>Исключения в виде <code>без-</code> - <code>без-</code> не учитываются, так как они редки.</p><h2 id="как-писать">Как писать?</h2><p>Для начала, в литературном стандарте закреплена форма с буквой <code>о</code>. Но в таком случае слово Беларусь должно было бы писаться с <code>о</code>, так как соеденительной морфемой в русском <code>а</code> быть не может.</p><p>Вот только слово Беларусь пишется с <code>а</code>. Что же пошло не так? Это заимствование из беларусского, и сейчас представляет из себя один цельный корень. Это значит, что при добавлении других морфем, в том числе суффикса -ск-, а в корне должно сохраняться. То есть самый логичный вариант - писать <code>беларусский</code>.<br/>Ну либо переходить на <code>Белорусь</code>, но…</p><p>P.s. естественно, всё это не касается официальных докемнтов, потому что там, как это ни странно, необходимо использовать литератный стандарт.</p></div>
<div id="footer">
<main>
<pre> .--.

View File

@@ -0,0 +1,79 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width">
<!--<link rel="icon" type="image/svg+xml" href="/favicon.svg" />-->
<meta name="generator" content="Astro v2.10.7">
<meta name="description" content="Restoration of Synapse after losing 1 year of database history">
<meta name="keywords" content="nothing.run nothing privacy free libre software floss self host">
<meta name="keywords" content="matrix synapse conduit postgres">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="icon" href="/nothingrun-favicon-whiteonblack.png" type="image/png">
<title>Restoration of Synapse after losing 1 year of database history</title>
<link rel="stylesheet" href="/_astro/contact.8ef370d5.css" /></head>
<body>
<div class="header astro-HPNW4VWY">
<a href="/" class="astro-HPNW4VWY">~/</a>
<a href="/contact" class="astro-HPNW4VWY">Contact</a>
<a href="https://uptime.nothing.run" class="astro-HPNW4VWY">Uptime</a>
<a href="/news" class="astro-HPNW4VWY">News</a>
<a href="/notes" class="astro-HPNW4VWY">Notes</a>
<a href="/donate" class="astro-HPNW4VWY">Donate :3</a>
</div>
<h1>Restoration of Synapse after losing 1 year of database history</h1>
<div class="article"><h2 id="introduction">Introduction</h2><p>In July 2025, my Synapse PostgreSQL had broken, so I needed to restore it from my 1-y.o. backup. I was thinking about what to do, and my friend sent me <a href="https://blog.erethon.com/blog/2023/06/21/what-happens-when-a-matrix-server-disappears/">this</a> article, so we understood what to do!</p><p>For example, there is a room called #example:example.org (roomid !example:example.org), whose member was @user:example.net.
The problem is that every server knows @user:example.net is in the room #example:example.org. But our server doesnt! So that is what we should aim at solving the problem.</p><h2 id="architecture">Architecture</h2><p>We get 2 types of error messages:</p><ul>
<li><code>synapse.handlers.receipts: [PUT-...] Ignoring receipt for room &#39;!example:example.org&#39; from server example.org as we&#39;re not in the room</code> (there is the same error message, but when you get a typing event from an unknown room)</li>
<li><code>synapse.federation.federation_server: [PUT-...] Ignoring PDU for unknown room_id: !example:example.org</code></li>
</ul><p>We can read the journal and parse the error message (I use a bash script to do that).
Okay, we have a room id! In the given article, the author is the only user of their server, so they can just send <a href="https://spec.matrix.org/v1.15/client-server-api/#post_matrixclientv3joinroomidoralias">POST /_matrix/client/v3/join/!example:example.org</a> request, and everything will be good.
But my server has multiple users, so I cant use the easiest way. We need to get information about membership (so we need to get state).</p><p>As we are admins of our servers, we have their signing keys.
We will need them because we are going to get state via Federation API requests.
How? There are different ways to do that.
However, all of them require at least 1 event id, so firstly we need to do <a href="https://spec.matrix.org/v1.15/server-server-api/#get_matrixfederationv1timestamp_to_eventroomid">GET /_matrix/federation/v1/timestamp_to_event</a>.
Determining request parameters (?dir as direction (b[ackward] or f[orward]) and &amp;ts as timestamp in Unix time format in milliseconds), we have just got either the last or the first event id! In my case, I chose the way of getting the last event, so then Ill have to make <a href="https://spec.matrix.org/v1.15/server-server-api/#get_matrixfederationv1stateroomid">GET /_matrix/federation/v1/state/!example:example.org?event_id=$event_id</a>, and I will get the actual state.
Of course, both of the requests, as I said, should be signed using your servers key (<a href="https://spec.matrix.org/v1.15/server-server-api/#signing-events">how to sign events</a>).</p><br/><p>(There is no support of timestamp_to_event in Conduit, so it would be a good idea to make support of requesting different servers)</p><p>After we receive the state, we need to parse it, but I think this cant make a difficulty.
As a result, we have a list of our users that were in the given room, like [“@user:example.net”, “@anotheruser:example.net”, “@exampleuser:example.net”].
Then, the simplest way is to get temporary users auth token via <a href="https://github.com/matrix-org/synapse/blob/develop/docs/admin_api/user_admin_api.md#login-as-a-user">POST /_synapse/admin/v1/users/user_id/login</a> and make <a href="https://spec.matrix.org/v1.15/client-server-api/#post_matrixclientv3joinroomidoralias">POST /_matrix/client/v3/join/!example:example.org</a> from the name of the user using their token.
The problem is solved!</p><h2 id="external-links">External links</h2><ul>
<li><a href="https://blog.erethon.com/blog/2023/06/21/what-happens-when-a-matrix-server-disappears/">Article that gave me the idea</a></li>
<li><a href="https://spec.matrix.org/v1.15/server-server-api/">Matrix Federation API docs</a>
<ul>
<li><a href="https://spec.matrix.org/v1.15/server-server-api/#signing-events">How to sign Federation API requests</a></li>
<li><a href="https://spec.matrix.org/v1.15/server-server-api/#get_matrixfederationv1stateroomid">GET /_matrix/federation/v1/state/!example:example.org?event_id=$event_id</a></li>
<li><a href="https://spec.matrix.org/v1.15/server-server-api/#get_matrixfederationv1timestamp_to_eventroomid">GET /_matrix/federation/v1/timestamp_to_event</a></li>
</ul>
</li>
<li><a href="https://spec.matrix.org/v1.15/server-server-api/">Matrix Client API docs</a>
<ul>
<li><a href="https://spec.matrix.org/v1.15/client-server-api/#post_matrixclientv3joinroomidoralias">POST /_matrix/client/v3/join/!example:example.org</a></li>
</ul>
</li>
<li><a href="https://github.com/matrix-org/synapse/blob/develop/docs/admin_api/user_admin_api.md#login-as-a-user">Admin API POST /_synapse/admin/v1/users/user_id/login</a></li>
</ul></div>
<div id="footer">
<main>
<pre> .--.
." o \__
_.-" ,( `
_.-" ,;;|
_.-=" _," ,,;;;'
.-"`_.-"``-..,,;;;;:'
`"'` `\`\
/^\\\
</pre>
</main>
<aside>
<b>Made with ♥</b> by Thary<br>
<!-- Website sources are available on <a href="https://git.vector1.dev/thary/website">Gitea</a>!<br> -->
<!-- All content is in Public domain and licensed under <a href="https://creativecommons.org/publicdomain/zero/1.0/">CC0</a><br> -->
Logo is created by <a href="https://houl.floof.company/">Houl</a><br>
ASCII arts are taken from <a href="https://web.archive.org/web/20010420182629/http://www.geocities.com/spunk1111/indexjava.htm">this website</a>
</aside>
</div>
</body></html>

BIN
dist/cinny-preview.png vendored Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 290 KiB

View File

@@ -5,24 +5,25 @@
<meta name="viewport" content="width=device-width">
<!--<link rel="icon" type="image/svg+xml" href="/favicon.svg" />-->
<meta name="generator" content="Astro v2.10.7">
<meta name="description" content="{frontmatter.description}">
<meta name="keywords" content="nothing crypto free software libre self host {frontmatter.keys}">
<meta name="description" content="Contact nothing.run &#38; nothing.run community">
<meta name="keywords" content="nothing.run nothing privacy free libre software floss self host">
<meta name="keywords">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="icon" href="/nothingrun-favicon-whiteonblack.png" type="image/png">
<title>Contact</title>
<link rel="stylesheet" href="/_astro/contact.05f6af3e.css" /></head>
<title>Contact us</title>
<link rel="stylesheet" href="/_astro/contact.8ef370d5.css" /></head>
<body>
<div class="header astro-HPNW4VWY">
<a href="/" class="astro-HPNW4VWY">~/</a>
<a href="/contact.html" class="astro-HPNW4VWY">Contact</a>
<a href="/contact" class="astro-HPNW4VWY">Contact</a>
<a href="https://uptime.nothing.run" class="astro-HPNW4VWY">Uptime</a>
<a href="/news" class="astro-HPNW4VWY">News</a>
<a href="/notes.html" class="astro-HPNW4VWY">Notes</a>
<a href="/notes" class="astro-HPNW4VWY">Notes</a>
<a href="/donate" class="astro-HPNW4VWY">Donate :3</a>
</div>
<h1>Contact</h1>
<h1>Contact us</h1>
<div class="asciicontainer">

View File

@@ -5,20 +5,21 @@
<meta name="viewport" content="width=device-width">
<!--<link rel="icon" type="image/svg+xml" href="/favicon.svg" />-->
<meta name="generator" content="Astro v2.10.7">
<meta name="description" content="{frontmatter.description}">
<meta name="keywords" content="nothing crypto free software libre self host {frontmatter.keys}">
<meta name="description" content="Donate us :3">
<meta name="keywords" content="nothing.run nothing privacy free libre software floss self host">
<meta name="keywords">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="icon" href="/nothingrun-favicon-whiteonblack.png" type="image/png">
<title>Donate :3</title>
<link rel="stylesheet" href="/_astro/contact.05f6af3e.css" /></head>
<link rel="stylesheet" href="/_astro/contact.8ef370d5.css" /></head>
<body>
<div class="header astro-HPNW4VWY">
<a href="/" class="astro-HPNW4VWY">~/</a>
<a href="/contact.html" class="astro-HPNW4VWY">Contact</a>
<a href="/contact" class="astro-HPNW4VWY">Contact</a>
<a href="https://uptime.nothing.run" class="astro-HPNW4VWY">Uptime</a>
<a href="/news" class="astro-HPNW4VWY">News</a>
<a href="/notes.html" class="astro-HPNW4VWY">Notes</a>
<a href="/notes" class="astro-HPNW4VWY">Notes</a>
<a href="/donate" class="astro-HPNW4VWY">Donate :3</a>
</div>

BIN
dist/element-preview.png vendored Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 775 KiB

11
dist/index.html vendored
View File

@@ -5,20 +5,21 @@
<meta name="viewport" content="width=device-width">
<!--<link rel="icon" type="image/svg+xml" href="/favicon.svg" />-->
<meta name="generator" content="Astro v2.10.7">
<meta name="description" content="{frontmatter.description}">
<meta name="keywords" content="nothing crypto free software libre self host {frontmatter.keys}">
<meta name="description" content="Librehoster, crypto- and infoanarchysts, free software fans">
<meta name="keywords" content="nothing.run nothing privacy free libre software floss self host">
<meta name="keywords" content="nothing crypto free software libre self host">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="icon" href="/nothingrun-favicon-whiteonblack.png" type="image/png">
<title>nothing.run</title>
<link rel="stylesheet" href="/_astro/contact.05f6af3e.css" /></head>
<link rel="stylesheet" href="/_astro/contact.8ef370d5.css" /></head>
<body>
<div class="header astro-HPNW4VWY">
<a href="/" class="astro-HPNW4VWY">~/</a>
<a href="/contact.html" class="astro-HPNW4VWY">Contact</a>
<a href="/contact" class="astro-HPNW4VWY">Contact</a>
<a href="https://uptime.nothing.run" class="astro-HPNW4VWY">Uptime</a>
<a href="/news" class="astro-HPNW4VWY">News</a>
<a href="/notes.html" class="astro-HPNW4VWY">Notes</a>
<a href="/notes" class="astro-HPNW4VWY">Notes</a>
<a href="/donate" class="astro-HPNW4VWY">Donate :3</a>
</div>

View File

@@ -5,33 +5,45 @@
<meta name="viewport" content="width=device-width">
<!--<link rel="icon" type="image/svg+xml" href="/favicon.svg" />-->
<meta name="generator" content="Astro v2.10.7">
<meta name="description" content="{frontmatter.description}">
<meta name="keywords" content="nothing crypto free software libre self host {frontmatter.keys}">
<meta name="description" content="nothing.run-s matrix instance info">
<meta name="keywords" content="nothing.run nothing privacy free libre software floss self host">
<meta name="keywords" content="matrix element synapse messenger IM">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="icon" href="/nothingrun-favicon-whiteonblack.png" type="image/png">
<title>Matrix</title>
<link rel="stylesheet" href="/_astro/contact.05f6af3e.css" /></head>
<link rel="stylesheet" href="/_astro/contact.8ef370d5.css" /></head>
<body>
<div class="header astro-HPNW4VWY">
<a href="/" class="astro-HPNW4VWY">~/</a>
<a href="/contact.html" class="astro-HPNW4VWY">Contact</a>
<a href="/contact" class="astro-HPNW4VWY">Contact</a>
<a href="https://uptime.nothing.run" class="astro-HPNW4VWY">Uptime</a>
<a href="/news" class="astro-HPNW4VWY">News</a>
<a href="/notes.html" class="astro-HPNW4VWY">Notes</a>
<a href="/notes" class="astro-HPNW4VWY">Notes</a>
<a href="/donate" class="astro-HPNW4VWY">Donate :3</a>
</div>
<h1>Matrix</h1>
<p><a href="https://matrix.org"><strong>Matrix</strong></a> is modern federative network for communication. That means that users from different servers can interact with each other. We host our own Matrix network server. There also is a great cross-plattform-client available!</p>
<h2 id="login-data">Login data</h2>
<ul>
<li>Server name: nothing.run</li>
<li>Server address: <a href="https://matrix.nothing.run">https://matrix.nothing.run</a></li>
</ul>
<h2 id="our-room">Our room</h2>
<p>Nothing.run has chat in Matrix. Join it to get information about downtimes and updates, help, to suggest something that could make nothing.run better</p>
<ul>
<li>Our Matrix space <a href="https://matrix.to/#/#nothingrun:nothing.run">#nothingrun:nothing.run</a></li>
<li>Our Matrix chat <a href="https://matrix.to/#/#localhost:nothing.run">#localhost:nothing.run</a></li>
</ul>
<h2 id="clients">Clients</h2>
<h3 id="web-clients">Web-clients</h3>
<ul>
<div class="bigcontainer"><div class="matrixclient"><ul>
<li><a href="https://cinny.nothing.run">Cinny</a> - modern and beautiful Matrix web client</li>
</ul><img src="/cinny-preview.png" alt="Cinny preview"/></div><div class="matrixclient"><ul>
<li><a href="https://element.nothing.run">Element</a> - the most popular and functional Matrix client</li>
</ul>
</ul><img src="/element-preview.png" alt="Element preview"/></div></div>
<h3 id="mobile-clients">Mobile clients</h3>
<ul>
<li><a href="https://github.com/element-hq/element-android">Element</a> - very buggy and uncomfortable client</li>
@@ -42,13 +54,10 @@
</ul>
<h3 id="desktop-clients">Desktop clients</h3>
<ul>
<li><a href="https://iamb.chat/">iamb</a> - written in Rust terminal-based client with Vim keybindings</li>
<li><a href="https://github.com/gomuks/gomuks">gomuks</a> - a terminal Matrix client written in Go</li>
<li><a href="https://iamb.chat/">iamb</a> &amp; <a href="https://github.com/gomuks/gomuks">gomuks</a> - written in Rust and Go terminal-based clients. iamb uses Vim-like keybindings</li>
<li><a href="https://wiki.gnome.org/Apps/Fractal">Fractal</a>, <a href="https://apps.kde.org/neochat/">NeoChat</a>, <a href="https://nheko-reborn.github.io/">Nheko</a> - nice desktop-oriented clients. Can be buggy sometimes</li>
<li>You can use Element, Schildi and Cinny Web as desktop clients via Electron. Its a less performant way to message from Matrix, but… You can! :)</li>
<li><a href="https://github.com/alphapapa/ement.el">Ement.el</a> - really? Are you so crazy to chat from Emacs???</li>
<li>[Fractal]</li>
<li>[NeoChat]</li>
<li>[Nheko]</li>
<li>You can use Element, Schildi and Cinny Web as desktop clients through Electron. Its unperformance way to use Matrix, but… You can! :)</li>
</ul>
<div id="footer">
<main>

15
dist/news/index.html vendored
View File

@@ -5,25 +5,30 @@
<meta name="viewport" content="width=device-width">
<!--<link rel="icon" type="image/svg+xml" href="/favicon.svg" />-->
<meta name="generator" content="Astro v2.10.7">
<meta name="description" content="{frontmatter.description}">
<meta name="keywords" content="nothing crypto free software libre self host {frontmatter.keys}">
<meta name="description" content="Librehoster, crypto- and infoanarchysts, free software fans">
<meta name="keywords" content="nothing.run nothing privacy free libre software floss self host">
<meta name="keywords">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="icon" href="/nothingrun-favicon-whiteonblack.png" type="image/png">
<title>nothing.run</title>
<link rel="stylesheet" href="/_astro/contact.05f6af3e.css" /></head>
<link rel="stylesheet" href="/_astro/contact.8ef370d5.css" /></head>
<body>
<div class="header astro-HPNW4VWY">
<a href="/" class="astro-HPNW4VWY">~/</a>
<a href="/contact.html" class="astro-HPNW4VWY">Contact</a>
<a href="/contact" class="astro-HPNW4VWY">Contact</a>
<a href="https://uptime.nothing.run" class="astro-HPNW4VWY">Uptime</a>
<a href="/news" class="astro-HPNW4VWY">News</a>
<a href="/notes.html" class="astro-HPNW4VWY">Notes</a>
<a href="/notes" class="astro-HPNW4VWY">Notes</a>
<a href="/donate" class="astro-HPNW4VWY">Donate :3</a>
</div>
<h1>nothing.run</h1>
<h3 id="23-august-2025">23 August 2025</h3>
<ul>
<li>We have switched from Contabo nameservers to <a href="https://desec.io">Desec</a></li>
</ul>
<h3 id="9-august-2025">9 August 2025</h3>
<ul>
<li>There are <a href="https://tea.nothing.run">Gitea</a> and <a href="https://idm.nothing.run">KaniDM</a> right now</li>

17
dist/notes/index.html vendored
View File

@@ -5,20 +5,21 @@
<meta name="viewport" content="width=device-width">
<!--<link rel="icon" type="image/svg+xml" href="/favicon.svg" />-->
<meta name="generator" content="Astro v2.10.7">
<meta name="description" content="{frontmatter.description}">
<meta name="keywords" content="nothing crypto free software libre self host {frontmatter.keys}">
<meta name="description" content="Tharys notes and articles">
<meta name="keywords" content="nothing.run nothing privacy free libre software floss self host">
<meta name="keywords">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="icon" href="/nothingrun-favicon-whiteonblack.png" type="image/png">
<title>nothing.run</title>
<link rel="stylesheet" href="/_astro/contact.05f6af3e.css" /></head>
<link rel="stylesheet" href="/_astro/contact.8ef370d5.css" /></head>
<body>
<div class="header astro-HPNW4VWY">
<a href="/" class="astro-HPNW4VWY">~/</a>
<a href="/contact.html" class="astro-HPNW4VWY">Contact</a>
<a href="/contact" class="astro-HPNW4VWY">Contact</a>
<a href="https://uptime.nothing.run" class="astro-HPNW4VWY">Uptime</a>
<a href="/news" class="astro-HPNW4VWY">News</a>
<a href="/notes.html" class="astro-HPNW4VWY">Notes</a>
<a href="/notes" class="astro-HPNW4VWY">Notes</a>
<a href="/donate" class="astro-HPNW4VWY">Donate :3</a>
</div>
@@ -26,7 +27,11 @@
<h2 id="linguistics">Linguistics</h2>
<ul>
<li><a href="/articles/belarusian.html">Беларусский или белорусский</a></li>
<li><a href="/articles/belarusian">Беларусский или белорусский</a></li>
</ul>
<h2 id="computers">Computers</h2>
<ul>
<li><a href="/articles/synapse-revitalization-script">Restoration of Synapse after losing 1 year of database history</a></li>
</ul>
<div id="footer">
<main>

BIN
public/cinny-preview.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 290 KiB

BIN
public/element-preview.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 775 KiB

View File

@@ -8,10 +8,10 @@ const { location } = Astro.props;
<div class="header">
<a href="/">~/</a>
<a href="/contact.html">Contact</a>
<a href="/contact">Contact</a>
<a href="https://uptime.nothing.run">Uptime</a>
<a href="/news">News</a>
<a href="/notes.html">Notes</a>
<a href="/notes">Notes</a>
<a href="/donate">Donate :3</a>
</div>

View File

@@ -1,3 +0,0 @@
- **[SchildiChat Web](https://element.nothing.run)** - built with Flutter and based on Element Matrix client with many features!
- **[Cinny](https://cinny.nothing.run)** - most beautiful Matrix client
- *Coming soon!* **[FluffyChat](https://fluffy.nothing.run)** - another Web Matrix client

View File

@@ -0,0 +1,7 @@
---
---
<p>Nothing.run has chat in Matrix. Join it to get information about downtimes and updates, help, to suggest something that could make nothing.run better</p>
<ul>
<li>Our Matrix space <a href="https://matrix.to/#/#nothingrun:nothing.run">#nothingrun:nothing.run</a></li>
<li>Our Matrix chat <a href="https://matrix.to/#/#localhost:nothing.run">#localhost:nothing.run</a></li>
</ul>

View File

@@ -1,4 +0,0 @@
- **[Main website](/)**
- **[Matrix](/matrix.html)** - decentralized communication server (powered by <a href="https://matrix.org/docs/projects/server/synapse">Synapse</a>). We have [Web-clients for Matrix](/matrix.html#web)
<!-- - *Coming soon!* **[Mastodon](https://social.nothing.run)** - free social network, part of the Fediverse, powered by ActivityPub -->
- *Coming soon!* **Forgejo** - lightwale Git repos hosting with Git over HTTPS and over SSH support. Based on Gitea

View File

@@ -4,11 +4,13 @@ import Footer from "../components/footer.astro";
import "../fonts.css";
import "../style.css";
const {frontmatter, title} = Astro.props;
let props = {};
const {frontmatter} = Astro.props;
let {title, description, keys} = Astro.props;
if (typeof frontmatter !== 'undefined') {
props.title = frontmatter.title;
} else { props.title = title; };
title = frontmatter.title;
description = frontmatter.description;
keys = frontmatter.keys;
};
---
<!DOCTYPE html>
@@ -18,17 +20,18 @@ if (typeof frontmatter !== 'undefined') {
<meta name="viewport" content="width=device-width" />
<!--<link rel="icon" type="image/svg+xml" href="/favicon.svg" />-->
<meta name="generator" content={Astro.generator} />
<meta name="description" content="{frontmatter.description}" />
<meta name="keywords" content="nothing crypto free software libre self host {frontmatter.keys}" />
<meta name="description" content={description} />
<meta name="keywords" content="nothing.run nothing privacy free libre software floss self host" />
<meta name="keywords" content={keys} />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<link rel="icon" href="/nothingrun-favicon-whiteonblack.png" type="image/png">
<title>{props.title}</title>
<title>{title}</title>
</head>
<body>
<Header />
<h1>{props.title}</h1>
<h1>{title}</h1>
<slot />
<Footer />

View File

@@ -2,10 +2,11 @@
layout: '../../layouts/index.astro'
title: 'Беларусский или белорусский'
description: 'Беларусский или белорусский - как писать?'
keys: 'nothing crypto free software libre self host'
keys: 'Беларусь или Белоруссия белорусский беларусский'
le: '19 Aug. 2025'
---
<div class="article">
## Введение
Вопрос "Беларусь или Белоруссия" здесь затронут не будет. Как беларус, могу сказать, что нам просто приятно, когда нас называют Беларусью, и мы считаем использование первого варианта минимальным уважением к нашему народу.
@@ -23,3 +24,4 @@ le: '19 Aug. 2025'
Вот только слово Беларусь пишется с `а`. Что же пошло не так? Это заимствование из беларусского, и сейчас представляет из себя один цельный корень. Это значит, что при добавлении других морфем, в том числе суффикса -ск-, а в корне должно сохраняться. То есть самый логичный вариант - писать `беларусский`.<br/>Ну либо переходить на `Белорусь`, но...
P.s. естественно, всё это не касается официальных докемнтов, потому что там, как это ни странно, необходимо использовать литератный стандарт.
</div>

View File

@@ -0,0 +1,48 @@
---
layout: '../../layouts/index.astro'
title: 'Restoration of Synapse after losing 1 year of database history'
description: 'Restoration of Synapse after losing 1 year of database history'
keys: 'matrix synapse conduit postgres'
le: '19 Aug. 2025'
---
<div class="article">
## Introduction
In July 2025, my Synapse PostgreSQL had broken, so I needed to restore it from my 1-y.o. backup. I was thinking about what to do, and my friend sent me [this](https://blog.erethon.com/blog/2023/06/21/what-happens-when-a-matrix-server-disappears/) article, so we understood what to do!
For example, there is a room called #example:example.org (roomid !example:example.org), whose member was @user:example.net.
The problem is that every server knows @user:example.net is in the room #example:example.org. But our server doesn't! So that is what we should aim at solving the problem.
## Architecture
We get 2 types of error messages:
- `synapse.handlers.receipts: [PUT-...] Ignoring receipt for room '!example:example.org' from server example.org as we're not in the room` (there is the same error message, but when you get a typing event from an unknown room)
- `synapse.federation.federation_server: [PUT-...] Ignoring PDU for unknown room_id: !example:example.org`
We can read the journal and parse the error message (I use a bash script to do that).
Okay, we have a room id! In the given article, the author is the only user of their server, so they can just send [POST /_matrix/client/v3/join/!example:example.org](https://spec.matrix.org/v1.15/client-server-api/#post_matrixclientv3joinroomidoralias) request, and everything will be good.
But my server has multiple users, so I can't use the easiest way. We need to get information about membership (so we need to get state).
As we are admins of our servers, we have their signing keys.
We will need them because we are going to get state via Federation API requests.
How? There are different ways to do that.
However, all of them require at least 1 event id, so firstly we need to do [GET /_matrix/federation/v1/timestamp_to_event](https://spec.matrix.org/v1.15/server-server-api/#get_matrixfederationv1timestamp_to_eventroomid).
Determining request parameters (?dir as direction (b[ackward] or f[orward]) and &ts as timestamp in Unix time format in milliseconds), we have just got either the last or the first event id! In my case, I chose the way of getting the last event, so then I'll have to make [GET /_matrix/federation/v1/state/!example:example.org?event_id=$event_id](https://spec.matrix.org/v1.15/server-server-api/#get_matrixfederationv1stateroomid), and I will get the actual state.
Of course, both of the requests, as I said, should be signed using your server's key ([how to sign events](https://spec.matrix.org/v1.15/server-server-api/#signing-events)).
<br />
(There is no support of timestamp_to_event in Conduit, so it would be a good idea to make support of requesting different servers)
After we receive the state, we need to parse it, but I think this can't make a difficulty.
As a result, we have a list of our users that were in the given room, like ["@user:example.net", "@anotheruser:example.net", "@exampleuser:example.net"].
Then, the simplest way is to get temporary user's auth token via [POST /_synapse/admin/v1/users/user_id/login](https://github.com/matrix-org/synapse/blob/develop/docs/admin_api/user_admin_api.md#login-as-a-user) and make [POST /_matrix/client/v3/join/!example:example.org](https://spec.matrix.org/v1.15/client-server-api/#post_matrixclientv3joinroomidoralias) from the name of the user using their token.
The problem is solved!
## External links
- [Article that gave me the idea](https://blog.erethon.com/blog/2023/06/21/what-happens-when-a-matrix-server-disappears/)
- [Matrix Federation API docs](https://spec.matrix.org/v1.15/server-server-api/)
- [How to sign Federation API requests](https://spec.matrix.org/v1.15/server-server-api/#signing-events)
- [GET /_matrix/federation/v1/state/!example:example.org?event_id=$event_id](https://spec.matrix.org/v1.15/server-server-api/#get_matrixfederationv1stateroomid)
- [GET /_matrix/federation/v1/timestamp_to_event](https://spec.matrix.org/v1.15/server-server-api/#get_matrixfederationv1timestamp_to_eventroomid)
- [Matrix Client API docs](https://spec.matrix.org/v1.15/server-server-api/)
- [POST /_matrix/client/v3/join/!example:example.org](https://spec.matrix.org/v1.15/client-server-api/#post_matrixclientv3joinroomidoralias)
- [Admin API POST /_synapse/admin/v1/users/user_id/login](https://github.com/matrix-org/synapse/blob/develop/docs/admin_api/user_admin_api.md#login-as-a-user)
</div>

View File

@@ -1,7 +1,8 @@
---
import Layout from '../layouts/index.astro'
import MatrixChat from '../components/matrixchat.astro'
---
<Layout title="Contact">
<Layout title="Contact us" description="Contact nothing.run & nothing.run community">
<div class="asciicontainer">
<pre class="smaller">
__
@@ -33,11 +34,7 @@ import Layout from '../layouts/index.astro'
<div>
<h2>Our chat</h2>
<p>Nothing.run has chat in Matrix. Join it to get information about downtimes and updates, help, to suggest something that could make nothing.run better</p>
<ul>
<li>Our Matrix space <a href="https://matrix.to/#/#nothingrun:nothing.run">#nothingrun:nothing.run</a></li>
<li>Our Matrix chat <a href="https://matrix.to/#/#localhost:nothing.run">#localhost:nothing.run</a></li>
</ul>
<MatrixChat />
</div>
</div>
</Layout>

View File

@@ -2,7 +2,6 @@
layout: '../layouts/index.astro'
title: 'Donate :3'
description: 'Donate us :3'
keys: 'nothing crypto free software libre self host'
---
import Service from '../components/service.astro';

View File

@@ -1,18 +1,35 @@
---
layout: '../layouts/index.astro'
title: 'Matrix'
description: 'Matrix'
keys: 'nothing crypto free software libre self host'
description: 'nothing.run-s matrix instance info'
keys: 'matrix element synapse messenger IM'
---
import MatrixChat from '../components/matrixchat.astro';
[**Matrix**](https://matrix.org) is modern federative network for communication. That means that users from different servers can interact with each other. We host our own Matrix network server. There also is a great cross-plattform-client available!
## Login data
- Server name: nothing.run
- Server address: https://matrix.nothing.run
## Our room
<MatrixChat />
## Clients
### Web-clients
<div class="bigcontainer">
<div class="matrixclient">
- [Cinny](https://cinny.nothing.run) - modern and beautiful Matrix web client
<img src="/cinny-preview.png" alt="Cinny preview" />
</div>
<div class="matrixclient">
- [Element](https://element.nothing.run) - the most popular and functional Matrix client
<img src="/element-preview.png" alt="Element preview" />
</div>
</div>
### Mobile clients
- [Element](https://github.com/element-hq/element-android) - very buggy and uncomfortable client
@@ -22,10 +39,7 @@ keys: 'nothing crypto free software libre self host'
- [SchildiChat Next](https://schildi.chat/android/next/) - Element X with spaces support
### Desktop clients
- [iamb](https://iamb.chat/) - written in Rust terminal-based client with Vim keybindings
- [gomuks](https://github.com/gomuks/gomuks) - a terminal Matrix client written in Go
- [iamb](https://iamb.chat/) & [gomuks](https://github.com/gomuks/gomuks) - written in Rust and Go terminal-based clients. iamb uses Vim-like keybindings
- [Fractal](https://wiki.gnome.org/Apps/Fractal), [NeoChat](https://apps.kde.org/neochat/), [Nheko](https://nheko-reborn.github.io/) - nice desktop-oriented clients. Can be buggy sometimes
- You can use Element, Schildi and Cinny Web as desktop clients via Electron. It's a less performant way to message from Matrix, but... You can! :)
- [Ement.el](https://github.com/alphapapa/ement.el) - really? Are you so crazy to chat from Emacs???
- [Fractal]
- [NeoChat]
- [Nheko]
- You can use Element, Schildi and Cinny Web as desktop clients through Electron. It's unperformance way to use Matrix, but... You can! :)

View File

@@ -2,9 +2,12 @@
layout: '../layouts/index.astro'
title: 'nothing.run'
description: 'Librehoster, crypto- and infoanarchysts, free software fans'
keys: 'nothing crypto free software libre self host'
---
### 23 August 2025
- We have switched from Contabo nameservers to [Desec](https://desec.io)
### 9 August 2025
- There are [Gitea](https://tea.nothing.run) and [KaniDM](https://idm.nothing.run) right now

View File

@@ -2,8 +2,10 @@
layout: '../layouts/index.astro'
title: 'nothing.run'
description: 'Tharys notes and articles'
keys: 'nothing crypto free software libre self host'
---
## Linguistics
- [Беларусский или белорусский](/articles/belarusian.html)
- [Беларусский или белорусский](/articles/belarusian)
## Computers
- [Restoration of Synapse after losing 1 year of database history](/articles/synapse-revitalization-script)

View File

@@ -38,6 +38,7 @@ body {
font-optical-sizing: auto;
font-style: normal;
height: 100vh;
}
ul, li {
@@ -182,26 +183,27 @@ pre.smaller {
}
#matrix {
background-image: url("./assets/matrix.png");
background-image: url("/matrix.png");
}
#gitea {
background-image: url("./assets/gitea.png");
background-image: url("/gitea.png");
}
#hedgedoc {
background-image: url("./assets/hedgedoc.png");
background-image: url("/hedgedoc.png");
}
#kanidm {
background-image: url("./assets/kanidm.png");
background-image: url("/kanidm.png");
}
.container {
display: grid;
/* margin: 0 auto; */
padding: 10px;
padding: 20px;
margin-left: auto;
margin-right: auto;
grid-column-gap: 10px;
grid-column-gap: 20px;
/* grid-template-columns: auto auto auto; */
/* grid-template-columns: repeat(auto-fit, minmax(420px, 1fr)); */
grid-template-columns: repeat(auto-fit, minmax(400px, 1fr));
max-width: 1300px;
}
@@ -215,10 +217,14 @@ pre.smaller {
grid-template-columns: 250px repeat(auto-fit, minmax(250px, 1fr));
max-width: 1300px;
}
@media (min-width: 1570px) {
.bigcontainer {
display: flex;
gap: 50px;
@media (min-width: 1000px) {
.asciicontainer {
grid-template-columns: 250px repeat(auto-fit, minmax(250px, 1fr));
}
}
@media (max-width: 1000px) {
.asciicontainer {
grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));
}
}
@@ -226,3 +232,30 @@ pre.smaller {
margin-left: 10px;
margin-right: 10px;
}
@media (min-width: 1570px) {
.bigcontainer {
display: flex;
gap: 50px;
}
}
@media (min-width: 1570px) {
.bigcontainer .matrixclient img {
width: 40vw;
height :auth;
}
}
@media (max-width: 1570px) {
.bigcontainer .matrixclient img {
width: 90vw;
height: auth;
}
}
.article {
padding-left: auto;
padding-right: auto;
margin: auto;
max-width: 1000px;
}