<?xml version="1.0" encoding="utf-8" standalone="yes"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:webfeeds="http://webfeeds.org/rss/1.0"><author><name>Marko Korhonen</name><uri>https://korhonen.cc/</uri></author><generator uri="https://gohugo.io">Hugo 0.160.1</generator><id>urn:uuid:3d1731e8-0321-4d17-b23c-7fabe585a119</id><link rel="self" type="application/atom+xml" href="https://korhonen.cc/fi/feed.xml" hreflang="fi"/><link rel="alternate" type="text/html" href="https://korhonen.cc/fi/" hreflang="fi"/><link rel="alternate" type="application/json" href="https://korhonen.cc/fi/index.json" hreflang="fi"/><icon>https://korhonen.cc/favicon.png</icon><logo>https://korhonen.cc/images/marko.jpeg</logo><title>Korhonen.cc Blogi</title><subtitle>Blogissa käsitellään avoimen lähdekoodin työkaluja, itsehostattuja palveluja ja kehittäjän arkea.</subtitle><updated>2026-04-08T14:52:12+00:00</updated><entry><author><name>Marko Korhonen</name></author><id>tag:korhonen.cc,2024:/fi/posts/firewall_rules_openwrt_ipv6_dynamic_prefix/</id><link rel="alternate" href="https://korhonen.cc/fi/posts/firewall_rules_openwrt_ipv6_dynamic_prefix/"/><title>OpenWRT palomuurisäännöt dynaamisella IPv6-prefixillä</title><published>2024-06-10T00:00:00-05:00</published><updated>2026-03-30T03:01:11+00:00</updated><summary type="text">Helpommat palomuurisäännöt OpenWRT:n kanssa, kun käytössä on dynaaminen IPv6-prefix.</summary><content type="html" xml:base="https://korhonen.cc/fi/posts/firewall_rules_openwrt_ipv6_dynamic_prefix/" xml:lang="fi"><![CDATA[
        <img src="hero.jpg" alt="Featured image"></img>
        
<div id="preamble">
<div class="sectionbody">
<div class="paragraph">
<p>Sain äskettäin IPv6-yhteyden kotiini, joten halusin luonnollisesti lisätä IPv6-tuen palvelimelleni. Törmäsin muutamiin ongelmiin, joita en löytänyt dokumentoituna yhdessä paikassa, joten tässä löytämäni ratkaisu.</p>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_ongelma">Ongelma</h2>
<div class="sectionbody">
<div class="paragraph">
<p>Huomasin nopeasti, että Internet-palveluntarjoajani ei ole toteuttanut IPv6-tukea &#34;oikein&#34;. En saa /56 prefixiä prefix delegoinnilla vaan /64-prefixin, jota ei voi jakaa edelleen aliverkkoihin. Tämä pätee kaikkiin mobiilioperaattoreihin Suomessa, ja koska en voi saada kiinteää yhteyttä nykyiseen osoitteeseeni niin tämän on riitettävä.</p>
</div>
<div class="paragraph">
<p>Prefix delegoinnin puute tarkoittaa, että minun on asetettava RA ja NDP relay tilaan OpenWRT:ssä, eikä minulla ole kontrollia IPv6-osoitteisiin jotka laitteeni saavat. Tämä puolestaan tarkoittaa, että en voi luoda pysyviä palomuurisääntöjä näiden osoitteiden perusteella, koska ne voivat muuttua milloin tahansa.</p>
</div>
<div class="paragraph">
<p>Muutaman viikon ajan selvisin manuaalisesti muuttamalla palomuurisääntöjä aina, kun prefix muuttui, mutta se ei ollut riittävän hyvä ratkaisu pitkässä juoksussa, koska minulla on paljon palomuurisääntöjä.</p>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_ipv6_slaac_privacy_extension_käytöstä_poistaminen">IPv6 SLAAC privacy extension käytöstä poistaminen</h2>
<div class="sectionbody">
<div class="paragraph">
<p>Vaikka en saa ennustettavaa prefixiä, voin saada ennustettavan suffixin poistamalla käytöstä IPv6 SLAAC:n <a href="https://www.internetsociety.org/resources/deploy360/2014/privacy-extensions-for-ipv6-slaac/">Privacy Extensions</a>. Näin suffix (host osa) johdetaan laitteen MAC-osoitteesta ja se pysyy aina samana.</p>
</div>
<div class="paragraph">
<p>Privacy Extensions on olemassa syystä. Se lisää yksityisyyttä generoimalla osoitteen host osan satunnaisesti ja vaihtamalla osoitetta aika-ajoin. En usko, että tämä on ongelma palvelimellani, koska se on joka tapauksessa avoin julkiverkkoon. Privacy Extensionsin pääasiallinen tarkoitus on se, että mobiililaitteita ei voida seurata verkkojen välillä ja palvelimeni pysyy luonnollisesti aina samassa verkossa. On hyvä tiedostaa, että tämä käytännössä tekee MAC-osoitteestasi julkisen, mutta en henkilökohtaisesti näe siinä ilmeistä riskiä.</p>
</div>
<div class="paragraph">
<p>Käytän NetworkManageria palvelimellani. Voit poistaa yksityisyyden laajennukset käytöstä etsimällä verkkoyhteytesi asetukset hakemistosta <code>/etc/NetworkManager/system-connections/</code>. Omalla palvelimellani se oli tiedosto <code>Wired connection 1.nmconnection</code>. Lisää/muuta seuraavat rivit <code>[ipv6]</code>-osioon:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="rouge highlight"><code data-lang="config">[<span class="n">ipv6</span>]
<span class="n">addr</span>-<span class="n">gen</span>-<span class="n">mode</span>=<span class="n">eui64</span>
<span class="n">method</span>=<span class="n">auto</span>
<span class="n">ip6</span>-<span class="n">privacy</span>=<span class="m">0</span></code></pre>
</div>
</div>
<div class="paragraph">
<p>Tämän jälkeen voit joko käynnistää NetworkManagerin tai koko koneen uudelleen. Sen jälkeen tietokoneellasi pitäisi olla uusi IPv6 osoite.</p>
</div>
<div class="paragraph">
<p>Logiikkaa, jolla IPv6-osoite nyt lasketaan, kutsutaan EUI-64:ksi. Löysin loistavan työkalun sen testaamiseen ja paremmin ymmärtämiseen: <a href="https://eui64-calc.princelle.org/">EUI-64 calculator</a>.</p>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_dynaamisen_prefixin_edelleenlähetys">Dynaamisen prefixin edelleenlähetys</h2>
<div class="sectionbody">
<div class="paragraph">
<p>Löysin, että OpenWRT:ssä voi asettaa osan palomuurisäännön kohdeosoitteesta dynaamiseksi. Tätä tekniikkaa kutsutaan dynaamisen prefixin edelleenlähetykseksi. Käsittääkseni se on OpenWRT spesifinen ominaisuus, joten tämä syntaksi ei siis todennäköisesti toimi muissa palomuureissa. Tämän tekniikan avulla voimme käyttää staattista host osaa palomuurisäännön kohdeosoitteena, jonka asetimme palvelimelle edellisessä osassa.</p>
</div>
<table class="tableblock frame-all grid-all stretch">
<colgroup>
<col style="width: 50%;"/>
<col style="width: 50%;"/>
</colgroup>
<tbody>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><strong>Palvelimen IPv6-osoite</strong></p></td>
<td class="tableblock halign-right valign-top"><p class="tableblock"><strong><code>2001:14bb:8ad:6b:f279:59ff:fe65:f9e4</code></strong></p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><strong>Palomuurisäännön kohdeosoite</strong></p></td>
<td class="tableblock halign-right valign-top"><p class="tableblock"><strong><code>::f279:59ff:fe65:f9e4/-64</code></strong></p></td>
</tr>
</tbody>
</table>
<div class="paragraph">
<p>Tässä näet palvelimeni nykyisen IPv6-osoitteen ja siitä johdetun palomuurisäännön kohdeosoitteen. <code>/-64</code> kertoo palomuurille, että se jättää huomioimatta osoitteen ensimmäiset 64 bittiä ja tarkastelee vain osoitteen viimeisiä 64 bittiä, jotka ovat host osa.</p>
</div>
<div class="paragraph">
<p>Lisätietoja palomuurin asetuksista löydät <a href="https://openwrt.org/docs/guide-user/firewall/fw3_configurations/fw3_ipv6_examples#dynamic_prefix_forwarding">OpenWRT wikistä</a>.</p>
</div>
</div>
</div>

      ]]></content></entry><entry><author><name>Marko Korhonen</name></author><id>tag:korhonen.cc,2023:/fi/posts/migrate_misskey_root_account/</id><link rel="alternate" href="https://korhonen.cc/fi/posts/migrate_misskey_root_account/"/><title>Misskeyn root-tilin migraatio</title><published>2023-12-10T11:41:08+02:00</published><updated>2026-03-30T03:01:11+00:00</updated><summary type="text">Ratkaisu ongelmaan johon törmäsin Misskey Firefish migraatiossa</summary><content type="html" xml:base="https://korhonen.cc/fi/posts/migrate_misskey_root_account/" xml:lang="fi"><![CDATA[
        <img src="hero.jpg" alt="Featured image"></img>
        
<div id="preamble">
<div class="sectionbody">
<div class="paragraph">
<p>Vaihdoin äskettäin yhden käyttäjän Fediverse-palvelimeni <a href="https://misskey-hub.net">Misskey</a>stä <a href="https://joinfirefish.org">Firefish</a>iin.
Kohtasin ongelman, jota en löytänyt dokumentoituna muualla.
Päätin jakaa löytämäni ratkaisun, jos joku muu hyötyisi siitä ja säästäisi aikaansa tulevaisuudessa.</p>
</div>
<div class="paragraph">
<p>Päätin samalla siirtyä uuteen verkkotunnukseen, joten helpoin tapa oli luoda  uusi palvelin ja migratoida käyttäjätili sen sijaan, että vaivautuisin migratoimaan koko Misskey-instanssia.</p>
</div>
<div class="paragraph">
<p>Koska kyseessä oli yhden käyttäjän instanssi, tili oli myös Misskeyn &#34;root&#34; tili.
Misskey ei salli root-tilin siirtämistä, ja jos yrität, saat virheen &#34;root cannot migrate&#34; tai jotain sinne päin.</p>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_ratkaisu">Ratkaisu</h2>
<div class="sectionbody">
<div class="paragraph">
<p>Menin tietokantaan selvittääkseni, mitä voisin tehdä ohittamalla käyttöliittymän, ja kas, löysin <code>isRoot</code>-sarakkeen <code>user</code>-taulusta.
En kuitenkaan halunnut jäädä ilman root-tiliä vanhassa instanssissani, joten menin Misskeyn hallintapaneeliin ja loin uuden tilin, yksinkertaisesti nimeltään &#34;root&#34;.</p>
</div>
<div class="paragraph">
<p>Misskey näyttää tallentavan kaikki tunnetut käyttäjät <code>user</code>-tauluun, ei vain varsinaisia paikallia käyttäjätilejä.
Paikallisten tilien löytämiseksi voit käyttää seuraavaa kyselyä</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="rouge highlight"><code data-lang="sql"><span class="n">misskey</span><span class="o">=#</span> <span class="k">SELECT</span> <span class="n">id</span><span class="p">,</span> <span class="n">username</span><span class="p">,</span> <span class="nv">&#34;isRoot&#34;</span> <span class="k">from</span> <span class="nv">&#34;user&#34;</span> <span class="k">WHERE</span> <span class="k">host</span> <span class="k">IS</span> <span class="k">NULL</span><span class="p">;</span>
     <span class="n">id</span>     <span class="o">|</span>  <span class="n">username</span>   <span class="o">|</span> <span class="n">isRoot</span> 
<span class="c1">------------+-------------+--------</span>
 <span class="mi">98</span><span class="n">wzsyrur6</span> <span class="o">|</span> <span class="n">relay</span><span class="p">.</span><span class="n">actor</span> <span class="o">|</span> <span class="n">f</span>
 <span class="mi">9</span><span class="n">n1njqolcd</span> <span class="o">|</span> <span class="n">root</span>        <span class="o">|</span> <span class="n">f</span>
 <span class="mi">9</span><span class="n">n342nasd3</span> <span class="o">|</span> <span class="n">marko</span>       <span class="o">|</span> <span class="n">t</span></code></pre>
</div>
</div>
<div class="paragraph">
<p>Nyt voit yksinkertaisesti asettaa uuden root-tilin <code>isRoot</code>-sarakkeen arvoksi <code>true</code> ja oman käyttäjätilin arvoksi <code>false</code>.
Sen jälkeen migraation pitäisi toimia.</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="rouge highlight"><code data-lang="sql"><span class="n">misskey</span><span class="o">=#</span> <span class="k">BEGIN</span><span class="p">;</span>
<span class="k">UPDATE</span> <span class="nv">&#34;user&#34;</span> <span class="k">SET</span> <span class="nv">&#34;isRoot&#34;</span> <span class="o">=</span> <span class="k">true</span> <span class="k">WHERE</span> <span class="n">id</span> <span class="o">=</span> <span class="s1">&#39;9n1njqolcd&#39;</span><span class="p">;</span>
<span class="k">UPDATE</span> <span class="nv">&#34;user&#34;</span> <span class="k">SET</span> <span class="nv">&#34;isRoot&#34;</span> <span class="o">=</span> <span class="k">false</span> <span class="k">WHERE</span> <span class="n">id</span> <span class="o">=</span> <span class="s1">&#39;9n342nasd3&#39;</span><span class="p">;</span>
<span class="k">COMMIT</span><span class="p">;</span></code></pre>
</div>
</div>
<div class="paragraph">
<p>Kannattaa varmistaa, että muutit vain 2 riviä ennen kuin kommitoit transaktion.</p>
</div>
<div class="paragraph">
<p>Olettaisin, että tämä ratkaisu toimii myös Misskey forkeissa, mutta en ole testannut.</p>
</div>
<div class="paragraph">
<p>Jos tästä postauksesta oli sinulle hyötyä, muista jakaa, twiitata, tuutata ja  piippailla se haluamassasi sosiaalisen median palvelussa.
Jos sinulla on ongelmia tässä prosessissa, voit myös jättää kommentin alapuolelle niin voin yrittää auttaa.</p>
</div>
</div>
</div>

      ]]></content></entry><entry><author><name>Marko Korhonen</name></author><id>tag:korhonen.cc,2022:/fi/posts/creating_this_site/</id><link rel="alternate" href="https://korhonen.cc/fi/posts/creating_this_site/"/><title>Tämän sivun luominen</title><published>2022-09-14T00:00:00-05:00</published><updated>2026-03-30T03:01:11+00:00</updated><summary type="text">Matkani AsciiDocin and Hugon parissa ja miten tähän pisteeseen päädyttiin</summary><content type="html" xml:base="https://korhonen.cc/fi/posts/creating_this_site/" xml:lang="fi"><![CDATA[
        <img src="hero.jpg" alt="Featured image"></img>
        
<div id="preamble">
<div class="sectionbody">
<div class="paragraph">
<p>Kuten teknologiaan liittyvissä blogeissa näyttää olevan tapana, ensimmäinen postaus on itse blogin luomisesta.
Joten tässä olemme, tämä on ensimmäinen kirjoitus blogissani, joka kuvaa vaiheet jotka johtivat tähän pisteeseen.</p>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_vaihtoehtojen_arviointi">Vaihtoehtojen arviointi</h2>
<div class="sectionbody">
<div class="paragraph">
<p>Kiinnostuin ensimmäisen kerran staattisista sivugeneraattoreista vuosia sitten, kun ystäväni Fatih rakensi <a href="https://teaddict.net">oman sivunsa</a> käyttäen <a href="https://jekyllrb.com">Jekylliä</a>.
Se tuntui erittäin virkistävältä tuolloin, koska siihen aikaan kotisivuni olivat WordPressissä, mikä tuntui aina hieman liian ylimitoitetulta ja raskaalta tarpeisiini nähden.</p>
</div>
<div class="sect2">
<h3 id="_jekyll">Jekyll</h3>
<div class="paragraph">
<p>Yritin asentaa Jekylliä useita kertoja vuonna 2021, mutta menetin mielenkiinnon monimutkaisen build-prosessin takia, joka vaati kaikenlaisten bundlejen ja  gemien määrittämistä (en koskaan ollut erityisen kiinnostunut Rubysta alun perinkään).
Minun piti myös debuggata kaikenlaisia ongelmia, jotka johtuivat blogilleni asettamistani vaatimuksista.
Lisäsin useita liitännäisiä, jotka eivät toimineet kovin hyvin yhdessä.
Suurin haaste oli se, että halusin käyttää sivun kirjoittamiseen <a href="https://en.wikipedia.org/wiki/AsciiDoc">AsciiDocia</a>.
Jekyll tue tätä oletuksena, joten minun piti käyttää <a href="https://github.com/asciidoctor/jekyll-asciidoc">pluginia</a>.
Tämä plugin ei näyttänyt toimivan kovin hyvin muiden tarvitsemieni pluginien ja teeman kanssa.</p>
</div>
<div class="paragraph">
<p>Joka tapauksessa en koskaan päässyt pidemmälle sivuston asentamisessa, joten laitoin projektin taka-alalle.
Alusta lähtien nykyisen domainini <a href="https://korhonen.cc">korhonen.cc</a> perustamisesta joulukuussa 2020 aina kesään 2022 asti domainin juuri näytti vain 404-virheen. Minulla oli paljon itse hostattuja sovelluksia asennettuna vain subdomaineissa.</p>
</div>
</div>
<div class="sect2">
<h3 id="_hugo">Hugo</h3>
<div class="paragraph">
<p>Löydettyäni <a href="https://gohugo.io">Hugon</a> innostuin heti. Se näytti olevan vastaus kaikkiin ongelmiini.
Päälimmäiset edut olivat</p>
</div>
<div class="ulist">
<ul>
<li>
<p>Staattinen binääri</p>
</li>
<li>
<p>Suora tuki AsciiDocille</p>
</li>
</ul>
</div>
<div class="paragraph">
<p>Tämän ansiosta sain perussivuston käyttöön muutamassa minuutissa.
Ei enää sotkemista bundlejen ja gemien kanssa.
Minun ei myöskään tarvinnut käyttää mitään plugineita, koska Hugo näytti tukevan oletuksena kaikkea mitä tarvitsin.</p>
</div>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_konfigurointi">Konfigurointi</h2>
<div class="sectionbody">
<div class="paragraph">
<p>Päätin käyttää <a href="https://github.com/hossainemruz/toha">Hugo Toha</a> -teemaa sivustollani, koska se näytti tekevän hyvin kaikki asiat, jotka halusin saavuttaa tällä sivustolla</p>
</div>
<div class="ulist">
<ul>
<li>
<p>Verkkosivusto, johon voin lisätä helposti haluamani määrän staattisia sivuja (ei blogikirjoituksia)</p>
<div class="ulist">
<ul>
<li>
<p><a href="/fi/pgp">Sivu tietoja PGP-avaimestani</a></p>
</li>
<li>
<p><a href="/fi/korhonen_aur">Sivu tietoja Arch Linux -varastostani</a></p>
</li>
</ul>
</div>
</li>
<li>
<p><a href="/fi">Esittely ja portfolio</a></p>
</li>
<li>
<p><a href="/fi/posts">Blogi</a></p>
</li>
</ul>
</div>
<div class="paragraph">
<p>Hugon ja teeman konfigurointi kesti aikansa, mutta oli sen arvoista.
Minulla on nyt kaunis ja monipuolinen sivusto, jota on helppo ylläpitää ja laajentaa.</p>
</div>
<div class="sect2">
<h3 id="_kommentointijärjestelmä">Kommentointijärjestelmä</h3>
<div class="paragraph">
<p>Halusin lisätä mahdollisuuden käyttäjille kommentoida blogiani. Vaikka yleensä hostaan itse kaiken mahdollisen, tällä kertaa päädyin <a href="https://giscus.app">Giscus</a>-palveluun.
Se käyttää GitHub Discussions alustaa backendinään, joten minun tarvitsi vain luoda repo GitHubissa jossa on tämä ominaisuus päällä ja konfiguroida se Tohaan (valitsemaani Hugon teemaan).</p>
</div>
<div class="paragraph">
<p>Kävin läpi kaikki Tohan tuetut vaihtoehdot, mutta mikään niistä ei ollut itse hostattavissa.
En halunnut myöskään toteuttaa tukea uudelle kommenttialustalle itse.
Tämä voisi olla kuitenkin hauska projekti tulevaisuudessa.</p>
</div>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_build_prosessin_automatisointi">Build prosessin automatisointi</h2>
<div class="sectionbody">
<div class="paragraph">
<p><em>Päivitys 2022-12-17: Olen vaihtanut Drone CI:stä Woodpecker CI:hin.
Woodpecker on avoimen lähdekoodin fork Dronesta, koska Drone siirtyi suljettuun lisenssiin.</em></p>
</div>
<div class="paragraph">
<p><em>Päivitys 2022-12-17 osa 2: Olen vaihtanut Giteasta Forgejoon.
Forgejo on avoimen lähdekoodin fork Gitesta, koska Gitea näyttää siirtyvän suljettuun liiketoimintamalliin.</em></p>
</div>
<div class="paragraph">
<p><em>Päivitys 2025-08-15: Olen vaihtanut Woodpecker CI:n Forgejo Actionsiin.
Itse asiassa vaihdoin jo aiemmin, mutta vasta nyt ajattelin päivittää tämän sivuston.</em></p>
</div>
<div class="paragraph">
<p>Vuosien varrella olen siirtynyt eri CI-järjestelmiin. Nykyinen järjestelmä on <a href="https://forgejo.org/docs/latest/user/actions/reference/">Forgejo Actions</a>.
Se on käytännössä avoimen lähdekoodin vastine GitHub Actionsille, ja nautin sen käytöstä todella paljon.</p>
</div>
<div class="paragraph">
<p>Relevantit konfiguraatiotiedostot</p>
</div>
<div class="ulist">
<ul>
<li>
<p><a href="https://git.korhonen.cc/FunctionalHacker/korhonen.cc/src/branch/main/.forgejo/workflows/deploy_site.yaml">Sivuston buildiin käytetty pipeline</a></p>
</li>
<li>
<p><a href="https://git.korhonen.cc/FunctionalHacker/dotfiles/src/branch/main/docker/forgejo/docker-compose.yaml">Forgejo-serverin konfiguraatio</a></p>
</li>
</ul>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_tulevaisuuden_suunnitelmat">Tulevaisuuden suunnitelmat</h2>
<div class="sectionbody">
<div class="paragraph">
<p>En aio tulla säännölliseksi bloggaajaksi lähiaikoina.
Jos löydän jotain, mikä voisi olla arvokasta muille, kirjoitan siitä täällä, jos vaan löydän siihen aikaa ja energiaa.</p>
</div>
<div class="paragraph">
<p>Nautin paljon Linuxin näpräämisestä ja sovellusten itse hostaamisesta palvelimellani, joten saatan kirjoittaa joitain ohjeita näistä aiheista tulevaisuudessa.
Olen myös <a href="https://neovim.io">NeoVim</a>-käyttäjä, joten saatan kirjoittaa postauksen <a href="https://git.korhonen.cc/FunctionalHacker/dotfiles/src/branch/main/home/.config/nvim">asetuksistani</a> jossakin vaiheessa.</p>
</div>
<div class="paragraph">
<p>Tässä on kuvankaappaus minusta kirjoittamassa tätä blogikirjoitusta. Aika meta 😃</p>
</div>
<div class="imageblock">
<div class="content">
<img src="/posts/creating_this_site/assets/writing_blogpost_neovim_hugo.png" alt="Minä kirjoittamassa tätä blogikirjoitusta"/>
</div>
<div class="title">Figure 1. Kuvankaappaus minusta kirjoittamassa blogikirjoitusta tästä blogista</div>
</div>
</div>
</div>

      ]]></content></entry></feed>