<?xml version="1.0" encoding="utf-8"?>







<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="de">
  <title>Vitalij Mik: github_pages</title>
  <subtitle>Persönliche Webseite und Blog</subtitle>
  <id>https://blackscorp.github.io/feed/by_tag/github_pages.xml</id>
  <link href="https://blackscorp.github.io/feed/by_tag/github_pages.xml" rel="self" type="application/atom+xml"/>
  <link href="https://blackscorp.github.io/blog/" rel="alternate"/>
  <updated>2026-11-08T10:21:35+00:00</updated>
  <author><name>Vitalij Mik</name></author>
  
  <entry>
    <title>Dynamische Funktionen mit Jekyll und GitHub Pages</title>
    <id>https://blackscorp.github.io/blog/dynamische-funktionen-mit-jekyll-und-github-pages/</id>
    <link href="https://blackscorp.github.io/blog/dynamische-funktionen-mit-jekyll-und-github-pages/" rel="alternate"/>
    <published>2026-10-25T00:00:00+00:00</published>
    <updated>2026-10-25T00:00:00+00:00</updated>
    <summary>Ein Blog mit Jekyll und GitHub Pages muss nicht auf Kommentare verzichten: So ergänze ich eine statische Website mit GitHub Discussions und Actions.</summary>
    <content type="html" xml:base="https://blackscorp.github.io/blog/dynamische-funktionen-mit-jekyll-und-github-pages/">&lt;h1 id=&quot;die-idee-ein-eigener-blog&quot;&gt;Die Idee: ein eigener Blog&lt;/h1&gt;

&lt;p&gt;Ich wollte schon immer mal einen eigenen Blog führen und meine Experimente dokumentieren.
Ein Blog zu führen erlaubt es, eigene Gedanken besser zu strukturieren und Probleme besser zu verstehen und zu verarbeiten. Er ist also nicht nur für andere Leser gedacht, sondern auch für mich selbst.&lt;/p&gt;

&lt;p&gt;Ich habe allerdings besondere Ansprüche an einen Blog und wenig Zeit gehabt, um ihn aufzusetzen.&lt;/p&gt;

&lt;p&gt;Bei „statisch“ denken viele vielleicht zuerst daran, dass es keine dynamischen Funktionen wie Kommentare geben kann. Genau das wollte ich ausprobieren: Kann ich einen Blog mit einem Static-Site-Generator betreiben und trotzdem Kommentare und automatische Abläufe integrieren?&lt;/p&gt;

&lt;p&gt;Meine Idee war: Ich öffne einen Markdown-Editor meiner Wahl und kann direkt mit dem Schreiben loslegen. Code und Syntax-Highlighting sollten auf jeden Fall drin sein. Der Text sollte versionierbar sein und einfache Diagramme sollten auch möglich sein.&lt;/p&gt;

&lt;p&gt;Außerdem will ich die Freiheit haben, das Layout komplett selbst zu gestalten, und ich möchte kein Geld fürs Hosting ausgeben.
Ich will mich auch nicht um Updates von Server und Infrastruktur kümmern.&lt;/p&gt;

&lt;p&gt;Doch wie funktioniert das im Detail?&lt;/p&gt;

&lt;h1 id=&quot;grundlegendes&quot;&gt;Grundlegendes&lt;/h1&gt;

&lt;p&gt;Auf GitHub besteht die Möglichkeit, ein Repository mit dem Namen &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;&amp;lt;username&amp;gt;.github.io&lt;/code&gt; anzulegen. Alles, was du hier veröffentlichst, ist auch unter der URL &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;https://&amp;lt;username&amp;gt;.github.io&lt;/code&gt; erreichbar.&lt;/p&gt;

&lt;p&gt;Standardmäßig versucht GitHub, in diesem Repository den Static-Site-Generator Jekyll zu verwenden. Du könntest zum Beispiel eine Datei &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;.nojekyll&lt;/code&gt; und eine &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;index.html&lt;/code&gt; mit „Hallo Welt“ anlegen und nach dem Pushen des Git-Commits das Ergebnis sehen.&lt;/p&gt;

&lt;p&gt;Ich möchte in meinem Fall aber Jekyll verwenden, da bei einem Blog automatisch RSS-Feeds, Tags und Ähnliches generiert werden können.&lt;/p&gt;

&lt;h1 id=&quot;docker-setup&quot;&gt;Docker setup&lt;/h1&gt;

&lt;p&gt;Bevor ich überhaupt loslegen kann, muss ich ja irgendwie eine Vorschau lokal haben. Ich könnte zwar ein Jekyll-Template verwenden, dieses immer wieder auf GitHub deployen und schauen, was am Ende herauskommt. Das würde aber zu lange dauern.&lt;/p&gt;

&lt;p&gt;Deshalb habe ich mir als Erstes ein Dockerfile mit Jekyll gebaut.&lt;/p&gt;

&lt;div class=&quot;language-Dockerfile highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;k&quot;&gt;FROM&lt;/span&gt;&lt;span class=&quot;s&quot;&gt; ruby:3.3&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;WORKDIR&lt;/span&gt;&lt;span class=&quot;s&quot;&gt; /site&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;ENV&lt;/span&gt;&lt;span class=&quot;s&quot;&gt; BUNDLE_GEMFILE=/site/jekyll/Gemfile&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;COPY&lt;/span&gt;&lt;span class=&quot;s&quot;&gt; Gemfile Gemfile.lock ./jekyll/&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;RUN &lt;/span&gt;bundle &lt;span class=&quot;nb&quot;&gt;install&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Der Container musste noch in einer &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;docker-compose.yaml&lt;/code&gt; konfiguriert werden. Das sieht dann so aus:&lt;/p&gt;

&lt;div class=&quot;language-yaml highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;na&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;blog&lt;/span&gt;

&lt;span class=&quot;na&quot;&gt;services&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;jekyll&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;build&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;.&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;command&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;pi&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;bundle&quot;&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;exec&quot;&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;jekyll&quot;&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;serve&quot;&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;--host&quot;&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;0.0.0.0&quot;&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;--port&quot;&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;4000&quot;&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;--force_polling&quot;&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;]&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;ports&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
      &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;127.0.0.1:4000:4000&quot;&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;volumes&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
      &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;..:/site&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;environment&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
      &lt;span class=&quot;na&quot;&gt;JEKYLL_ENV&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;production&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Jetzt konnte ich die ersten Dateien ablegen und mir unter &lt;a href=&quot;http://localhost:4000&quot;&gt;http://localhost:4000&lt;/a&gt; die Vorschau anzeigen lassen. Ich musste nichts bei GitHub commiten und nicht warten.&lt;/p&gt;

&lt;p&gt;Als Nächstes war das Layout dran. Ich habe zunächst versucht, mir mit Codex ein paar Layoutvorschläge generieren zu lassen. Das hat allerdings nicht besonders gut funktioniert. Besser lief es, als die Layouts als Bilder generiert wurden. Mit Bildern konnte Codex irgendwie besser umgehen als mit HTML. Nach einigen Vorschlägen habe ich mich für das Layout entschieden, das du gerade siehst. Es sollte dunkel und schlicht sein und Orange als Highlightfarbe haben.&lt;/p&gt;

&lt;p&gt;Der Rest war nur noch, die Styles aus dem Bild zu extrahieren und im Blog zu konfigurieren. Natürlich hat das die KI für mich gemacht.&lt;/p&gt;

&lt;h1 id=&quot;beiträge-erstellen&quot;&gt;Beiträge erstellen&lt;/h1&gt;

&lt;p&gt;Nach dem Setup konnte ich dann direkt loslegen. Die Beiträge landen im Unterordner &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;_articles/&amp;lt;Name&amp;gt;/index.md&lt;/code&gt;. Alle Bilder, die zum Blogbeitrag gehören, landen auch in diesem Ordner.&lt;/p&gt;

&lt;p&gt;Die &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;index.md&lt;/code&gt; ist in zwei Teilen aufgebaut. Ganz oben stehen die Metainformationen zum Beitrag, wie zum Beispiel die URL, wann der Artikel veröffentlicht wurde, das Layout, die Tags oder Keywords. Das ist das Front Matter.&lt;/p&gt;

&lt;p&gt;Darunter kommt ganz normal mein Inhalt. Syntax-Highlighting geschieht über CSS und Diagramme kann man mit dem Mermaid-JavaScript-Framework im Browser rendern. Mehr braucht man erst mal nicht.&lt;/p&gt;

&lt;h1 id=&quot;dynamische-kommentare&quot;&gt;Dynamische Kommentare&lt;/h1&gt;

&lt;p&gt;Jetzt gehört ja zu jedem Blog auch die Kommentarfunktion. Diese kann man auf einer statischen HTML-Seite relativ schwierig umsetzen. Viele würden ein Iframe von Disqus oder Ähnlichem einbinden. Ich entschied mich für einen anderen Weg. Auf GitHub gibt es Workflows, die man bei bestimmten Events auslösen kann. Außerdem hat GitHub eine Diskussionsplattform. Hier können GitHub-Nutzer sie wie eine Art Forum verwenden. Es gibt eine besondere Kategorie „Ankündigungen“. In dieser Kategorie kann nur ich als Betreiber einen Eintrag erstellen, und andere Nutzer dürfen nur kommentieren.&lt;/p&gt;

&lt;p&gt;Meine Idee war jetzt folgende: Wenn ich einen Beitrag veröffentliche, erstelle ich eine neue Ankündigung. Die URL der Ankündigung hinterlege ich im Front Matter meines Blogbeitrags. Anschließend erstelle ich einen Workflow auf GitHub. Dieser holt sich die neuesten Kommentare und exportiert sie als JSON in den Ordner &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;_data/comments&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Jekyll liest die Kommentare und zeigt sie unter dem Blogbeitrag an. Der Trigger für den Workflow ist also ein Kommentar.&lt;/p&gt;

&lt;p&gt;Der Prozess besteht also aus mehreren Schritten. Die Skriptausführung geschieht über &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;actions/github-script&lt;/code&gt;. Ich kann eine Node.js-Datei erstellen und darin alles abarbeiten.&lt;/p&gt;

&lt;p&gt;Den kompletten Workflow mit Triggern findest du in der &lt;a href=&quot;https://github.com/BlackScorp/blackscorp.github.io/blob/master/.github/workflows/publish.yml&quot;&gt;publish.yml des GitHub-Actions-Workflows&lt;/a&gt;.&lt;/p&gt;

&lt;h1 id=&quot;automatische-ankündigungen&quot;&gt;Automatische Ankündigungen&lt;/h1&gt;

&lt;p&gt;Nachdem ich den Blog und die Workflows mehrfach ausprobiert hatte, bin ich auf die Idee gekommen, dass ich auch automatisch Ankündigungen anlegen kann. Das Skript dazu habe ich in Bash geschrieben. Die Idee ist, alle Artikel herauszusuchen, die &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;published: true&lt;/code&gt; im Front Matter haben und keinen &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;comments_key&lt;/code&gt;. Wenn es den &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;comments_key&lt;/code&gt; nicht gibt, dann gibt es noch keine Ankündigung für den Beitrag. So kann man die Ankündigung automatisch erstellen, ihre ID auslesen und ins Front Matter schreiben. Der Job würde nächtlich laufen oder dann, wenn ich ihn manuell über GitHub starte.&lt;/p&gt;

&lt;h1 id=&quot;fazit&quot;&gt;Fazit&lt;/h1&gt;

&lt;p&gt;Dank GitHub, KI und Jekyll konnte ich mir nun meinen Traum erfüllen und einen eigenen Blog starten. Vielleicht wäre es auch eine Idee für dich. Wenn du einfache Seiten hast und nicht unbedingt dynamischen Content direkt benötigst, kannst du durchaus einiges über Static-Site-Generatoren und GitHub Actions lösen.&lt;/p&gt;

&lt;p&gt;Ich habe auf jeden Fall jetzt die Möglichkeit, einfach einen Text in Markdown zu schreiben und das Layout für alle Blogbeiträge direkt zu bearbeiten. Ich kann den Blog auch mal selbst hosten. Und wenn jemand einen Gastbeitrag bei mir machen möchte, kann er das über einen Pull Request im Projekt machen.&lt;/p&gt;

&lt;h2 id=&quot;weiterführende-links&quot;&gt;Weiterführende Links&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://docs.github.com/pages&quot;&gt;GitHub Pages: Dokumentation&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://docs.github.com/en/pages/setting-up-a-github-pages-site-with-jekyll&quot;&gt;GitHub Pages: Eine GitHub-Pages-Website mit Jekyll erstellen&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://jekyllrb.com/docs/&quot;&gt;Jekyll: Dokumentation&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://jekyllrb.com/docs/github-pages/&quot;&gt;Jekyll: GitHub Pages&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://docs.github.com/actions&quot;&gt;GitHub Actions: Dokumentation&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://docs.github.com/discussions&quot;&gt;GitHub Discussions: Dokumentation&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content>
    <category term="github_pages"/><category term="jekyll"/><category term="docker"/><category term="github_actions"/><category term="bloggen"/>
  </entry>
  
</feed>
