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

<rss version="2.0" 
   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
   xmlns:admin="http://webns.net/mvcb/"
   xmlns:dc="http://purl.org/dc/elements/1.1/"
   xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
   xmlns:wfw="http://wellformedweb.org/CommentAPI/"
   xmlns:content="http://purl.org/rss/1.0/modules/content/"
   >
<channel>
    
    <title>Netz - Rettung - Recht (Artikel mit Tag anleitung)</title>
    <link>https://netz-rettung-recht.de/</link>
    <description>Netzleben, Rettungs- und Rechtswesen</description>
    <dc:language>de</dc:language>
    <generator>Serendipity 2.5.0 - http://www.s9y.org/</generator>
    <pubDate>Sun, 08 Aug 2021 06:49:29 GMT</pubDate>

    <image>
    <url>https://netz-rettung-recht.de/templates/2k11/img/s9y_banner_small.png</url>
    <title>RSS: Netz - Rettung - Recht - Netzleben, Rettungs- und Rechtswesen</title>
    <link>https://netz-rettung-recht.de/</link>
    <width>100</width>
    <height>21</height>
</image>

<item>
    <title>irc.szaf.org</title>
    <link>https://netz-rettung-recht.de/archives/2303-irc.szaf.org.html</link>
            <category>Bits'n'Bytes</category>
    
    <comments>https://netz-rettung-recht.de/archives/2303-irc.szaf.org.html#comments</comments>
    <wfw:comment>https://netz-rettung-recht.de/wfwcomment.php?cid=2303</wfw:comment>

    <slash:comments>0</slash:comments>
    <wfw:commentRss>https://netz-rettung-recht.de/rss.php?version=2.0&amp;type=comments&amp;cid=2303</wfw:commentRss>
    

    <author>nospam@example.com (Thomas Hochstein)</author>
    <content:encoded>
    &lt;p&gt;Webserver sind ja nichts Besonderes, meinen eigenen Mailserver betreibe ich seit 2002, und einen &amp;#8220;richtigen&amp;#8221; Newsserver, der nicht nur ein paar lokale Gruppen führt, ebenfalls seit 2005 - und SSH samt SCP und Co. und ggf. FTP sind ja eh dabei. Was fehlt also noch in der Liste der &amp;#8220;klassischen&amp;#8221; Dienste? Richtig - derjenige, mit dem ich als letztes warm geworden bin und den ich am wenigsten nutze: IRC, der &amp;#8220;Internet Relay Chat&amp;#8221;.&lt;/p&gt;

&lt;p&gt;Nach dem unerwarteten Tod eines &lt;a href=&quot;https://cord.de/files/Public/sven/&quot; title=&quot;&quot;&gt;Freundes&lt;/a&gt; an Ostern 2020 musste sich die Gemeinschaft der &lt;a href=&quot;https://szaf.org/&quot; title=&quot;szaf.org - Home, szweet home&quot;&gt;Szafe&lt;/a&gt; auch eine neue Lösung für die bislang mitgenutzten IRC-Server einfallen lassen, so dass in der Folge selbst ein Netzwerk aufgesetzt wurde - und da wollte ich auch gerne dabei sein und meinen eigenen Server aufsetzen und einbinden.&lt;/p&gt;

&lt;h3 id=&quot;installation-und-erstkonfiguration&quot;&gt;Installation und Erstkonfiguration&lt;/h3&gt;

&lt;p&gt;Ich befürchtete schon, das werde sicherlich ganz furchtbar kompliziert, aber dem war angenehmerweise nicht so. Die Software-Wahl war auf den &lt;a href=&quot;https://ngircd.barton.de/&quot; title=&quot;ngIRCd: Free, portable and lightweight Internet Relay Chat server&quot;&gt;&lt;em&gt;ngircd&lt;/em&gt;&lt;/a&gt; gefallen, den &amp;#8220;next-generation IRC daemon&amp;#8221;, und der ist in Debian verfügbar: &lt;code&gt;apt install ngircd&lt;/code&gt; reicht also aus, und dann muss nur noch ein wenig an der Konfiguration in &lt;code&gt;/etc/ngircd/ngircd.conf&lt;/code&gt; geschraubt werden:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;    Name = irc.szaf.org

    AdminInfo1 = (Info zum Administrator, Zeile 1)
    AdminInfo2 = (Info zum Administrator, Zeile 2)
    AdminEMail = (Mailadresse des Administrators)

    Info = Szeep on IRC
    ;MotdPhrase = &quot;irc.szaf.org SzafNet IRC Server. Ready. Bleat ahead.&quot;

    Network = szafnet

    Password = Swordfish

[Limits]
    MaxJoins = 20
    MaxNickLength = 25
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Wenn man will, kann man auch noch die Zugangsdaten für einen IRC-Operator hinterlegen:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;[Operator]
    Name = thh
    Password = pass123
&lt;/code&gt;&lt;/pre&gt;

&lt;h3 id=&quot;tls&quot;&gt;TLS&lt;/h3&gt;

&lt;p&gt;Dazu dann noch eine &lt;a href=&quot;https://irc.szaf.org/&quot; title=&quot;irc.szaf.org&quot;&gt;Webseite&lt;/a&gt;, über die es ein Zertifikat von &lt;em&gt;Let&amp;#8217;s encrypt&lt;/em&gt; gibt, das man dann auch dem IRC-Server verfüttern kann; die &lt;a href=&quot;https://netz-rettung-recht.de/archives/1943-letsencrypt-jenseits-des-Webservers.html&quot; title=&quot;&quot;&gt;grundsätzliche Vorgehensweise&lt;/a&gt; hatte ich ja bereits vor knapp fünf Jahren beschrieben.&lt;/p&gt;

&lt;p&gt;Erstmal das Zertifikat einkopieren &amp;#8230;&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;mkdir /etc/ngircd/certs/
cp /etc/letsencrypt/live/irc.szaf.org/fullchain.pem /etc/ngircd/certs/
cp /etc/letsencrypt/live/irc.szaf.org/privkey.pem /etc/ngircd/certs/
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&amp;#8230; und in der Konfiguration (&lt;code&gt;/etc/ngircd/ngircd.conf&lt;/code&gt;) einrichten:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;[SSL]
    # SSL-related configuration options.
    CertFile = /etc/ngircd/certs/fullchain.pem
    KeyFile = /etc/ngircd/certs/privkey.pem
    Ports = 6697
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Nach &lt;code&gt;service ngircd restart&lt;/code&gt; sind wir dann im Geschäft.&lt;/p&gt;

&lt;p&gt;Das ganze lässt sich auch automatisieren - ich baue mir ein kurzes Shellscript, bspw. &lt;code&gt;/etc/ngircd/certbot-deploy-certs.sh&lt;/code&gt;:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;#!/bin/dash
cp /etc/letsencrypt/live/irc.szaf.org/fullchain.pem /etc/ngircd/certs/
cp /etc/letsencrypt/live/irc.szaf.org/privkey.pem /etc/ngircd/certs/
/usr/sbin/service ngircd reload
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;und mache es ausführbar (&lt;code&gt;chmod 755 /etc/ngircd/certbot-deploy-certs.sh&lt;/code&gt;) und setze einen entsprechenden Cronjob &lt;strong&gt;vor&lt;/strong&gt; denjenigen, der alle abgelaufenen Zertifikate rundum erneuert.&lt;/p&gt;

&lt;p&gt;Ein kleines Manko hat die ganze Sache noch: leider kann erst der &lt;em&gt;ngIRCd 26~rc1&lt;/em&gt; ein TLS-Zertifikat im laufenden Betrieb nachladen, wenn er mit GnuTLS arbeitet, wie das bei Debian der Fall ist; in früheren Versionen geht das nur bei OpsenSSL. Leider hat &lt;em&gt;Debian Stretch&lt;/em&gt; nur die Version 24-1, und auch das aktuelle &lt;em&gt;Debian Buster&lt;/em&gt; nur die Version 25-2. Das Script funktioniert also bisher nicht; zwar wird das neue Zertifikat einkopiert, aber der Server verarbeitet es nicht. Dafür wäre ein &lt;code&gt;service ngircd restart&lt;/code&gt; notwendig - der aber die Verbindung zu allen Clients und allen verbundenen Servern trennt. Bislang habe ich daher einen alle drei Monate wiederholten Eintrag in meinem Todo-System, um nach dem Zertifikat zu schauen und ggf. den Server manuell zu starten. Mit dem künftigen &lt;em&gt;Debian Bullseye&lt;/em&gt; sollte das dann ein Ende haben.&lt;/p&gt;

&lt;h3 id=&quot;vernetzung-mit-anderen-irc-servern&quot;&gt;Vernetzung mit anderen IRC-Servern&lt;/h3&gt;

&lt;p&gt;Alleine chatten ist nett, ein IRC-Netzwerk aufzubauen noch netter. Zu diesem Zweck muss man dem &lt;em&gt;ngircd&lt;/em&gt; nur verklicken, welche anderen Server &amp;#8220;dazugehören&amp;#8221;, und mit denen ein Passwort vereinbaren. Jeder Serverbetreiber notiert dann das eigene Passwort und das der Gegenstelle in der Konfiguration, und schon vernetzen sich die Server - jeder allerdings immer nur mit einem anderen, die Topologie bildet also Linien, keine Sterne. Wenn aber ein Server aus dem Netz fällt, bspw. weil er restartet wird, verbinden sich die verbleibenden Server neu, bis sie alle wieder miteinander verbunden sind.&lt;/p&gt;

&lt;p&gt;Eine solche Konfiguration kann dann bspw. so aussehen:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;[Server]
    Name = irc.anderer-server.example
    Host = irc.anderer-server.example
    Port = 6697
    MyPassword = OhmyOhmyOhmy
    PeerPassword = Ramalamadingdong
    Group = 1
    Passive = no
    SSLConnect = yes
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Das weist diesen Server der Gruppe 1 zu (wenn ein Server innerhalb einer Gruppe nicht verfügbar ist, wird ein anderer ausprobiert), lässt automatische Verbindungen zu und verlangt dafür SSL/TLS. Die Gegenstelle (&lt;code&gt;irc.anderer-server.example&lt;/code&gt;) muss natürlich die Werte für &lt;code&gt;MyPassword&lt;/code&gt; und &lt;code&gt;PeerPassword&lt;/code&gt; vertauschen.&lt;/p&gt;

&lt;p&gt;Server neu starten, et voilà: das IRC-Netzwerk steht. Das war einfach - und tut seit April 2020 sehr zuverlässig.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Titelbild © AliFuat - stock.adobe.com&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;[Nachträglich veröffentlicht im August 2021.]&lt;/em&gt;&lt;/p&gt;
&lt;img src=&quot;https://ssl-vg03.met.vgwort.de/na/12979f8f36fa4bc6967c75f6fa734934&quot; width=&quot;1&quot; height=&quot;1&quot; alt=&quot;&quot;&gt; 
    </content:encoded>

    <pubDate>Thu, 11 Feb 2021 06:20:00 +0000</pubDate>
    <guid isPermaLink="false">https://netz-rettung-recht.de/archives/2303-guid.html</guid>
    <category>anleitung</category>
<category>irc</category>

</item>
<item>
    <title>&quot;Sprechende&quot; Message-IDs erzeugen mit dem INN</title>
    <link>https://netz-rettung-recht.de/archives/2239-Sprechende-Message-IDs-erzeugen-mit-dem-INN.html</link>
            <category>Bits'n'Bytes</category>
    
    <comments>https://netz-rettung-recht.de/archives/2239-Sprechende-Message-IDs-erzeugen-mit-dem-INN.html#comments</comments>
    <wfw:comment>https://netz-rettung-recht.de/wfwcomment.php?cid=2239</wfw:comment>

    <slash:comments>0</slash:comments>
    <wfw:commentRss>https://netz-rettung-recht.de/rss.php?version=2.0&amp;type=comments&amp;cid=2239</wfw:commentRss>
    

    <author>nospam@example.com (Thomas Hochstein)</author>
    <content:encoded>
    &lt;p&gt;Ich fürchte, das hier wird ein eher technisch geprägter Special-Interest-Beitrag werden, aber sei es drum: es soll darum gehen, mit Hilfe des Newsservers &lt;a href=&quot;https://th-h.de/net/usenet/servers/inn/&quot; title=&quot;INN - InterNetNews | th-h.de&quot;&gt;&lt;em&gt;INN&lt;/em&gt;&lt;/a&gt; &lt;em&gt;Message-IDs&lt;/em&gt; für Usenet-Postings zu erzeugen, die neben ihrem primären Daseinszweck - ein Posting mit einer dauerhaft und global eindeutigen ID zu versehen - auch einen menschenlesbaren Inhalt haben.&lt;/p&gt;

&lt;h3 id=&quot;-message-ids-ihr-aufbau-und-ihre-funktion&quot;&gt;&lt;em&gt;Message-IDs&lt;/em&gt;, ihr Aufbau und ihre Funktion&lt;/h3&gt;

&lt;p&gt;Der &lt;em&gt;Message-ID&lt;/em&gt;-Header verleiht jedem Beitrag im Usenet (jedem Posting) und jeder E-Mail eine absolut eindeutige, nur einmal vergebene Kennung, mit der das Posting oder die E-Mail referenziert werden können.&lt;/p&gt;

&lt;h4 id=&quot;funktion&quot;&gt;Funktion&lt;/h4&gt;

&lt;p&gt;Die Notwendigkeit dafür ist einmal technischer Art; so können Postings und E-Mails bspw. in Logdateien eindeutig bezeichnet werden. Auch ist die &lt;em&gt;Message-ID&lt;/em&gt; für das Threading - also die Darstellung von Postings oder E-Mails in einem &amp;#8220;Diskussionsfaden&amp;#8221; erforderlich; denn dazu enthält jede E-Mail die &lt;em&gt;Message-ID&lt;/em&gt; ihres Vorgängers, also die Kennung der Nachricht, auf die sie die Antwort enthält. Bei Postings ist das ähnlich; nur werden dort die &lt;em&gt;Message-IDs&lt;/em&gt; aller (oder bei langen Threads zumindest etlicher) Vorgänger übermittelt. So können Newsreader und Mailprogramme Bezugsverkettungen aufbauen und E-Mails (oder Postings) im Zusammenhang darstellen, ohne sich dabei auf Zufälle wie einen identischen Betreff verlassen zu müssen.&lt;/p&gt;

&lt;p&gt;Im Usenet hat die &lt;em&gt;Message-ID&lt;/em&gt; noch eine weitere wichtige Bedeutung: Postings werden im Gegensatz zu E-Mails nicht nur an einen oder mehrere bestimmte Empfänger übermittelt, sondern im &amp;#8220;Floodfill&amp;#8221;-Verfahren an alle miteinander vernetzten Newsserver verteilt. Diese Newsserver sind aber regelmäßig nicht nur einfach, sondern vielfach miteinander vernetzt und erhalten daher jeden Beitrag mehr- oder vielfach auf verschiedenen Wegen. Um Übertragungskapazität zu sparen (und Duplikate zu vermeiden) lehnen sie daher die Annahme von Beiträgen, die sie schon kennen, ab und speichern diese auch nicht, falls sie doch übertragen werden. Daraus folgt, dass ein Posting, dass eine bereits einmal verwendete &lt;em&gt;Message-ID&lt;/em&gt; enthält, nicht verteilt wird; und schlimmer noch, dass eine Änderung der &lt;em&gt;Message-ID&lt;/em&gt; zur mehrfachen Verteilung und Speicherung von Postings, also zu unerwünschten Duplikaten führt. Deshalb sollte man an der &lt;em&gt;Message-ID&lt;/em&gt; von Postings, die nicht lokal erzeugt wurden, auch niemals herumfummeln und generell genau wissen, was man tut, wenn man die &lt;em&gt;Message-ID&lt;/em&gt; manipuliert.&lt;/p&gt;

&lt;p&gt;Unabhängig von diesen technischen Aufgaben ist die &lt;em&gt;Message-ID&lt;/em&gt; auch der geeignetste Weg, im Usenet auf einen bestimmten anderen Beitrag zu verweisen. &amp;#8220;Schau mal in das Posting von Hans Meier von gestern, 17.32 Uhr, da steht die Antwort auf Deine Frage&amp;#8221; ist so aufwendig - für Schreiber und Leser - wie unprofessionell. &amp;#8220;Schau Dir mal &lt;code&gt;&amp;lt;d648ee74-9def-e5ca-8c12-9a347fce0dc5@host.example&amp;gt;&lt;/code&gt; an, da steht alles drin&amp;#8221; ist hingegen schnell geschrieben (es genügt ein Kopieren der &lt;em&gt;Message-ID&lt;/em&gt;) und ebenso schnell aufrufbar, weil Newsreader in der Regel den Aufruf von Postings anhand der &lt;em&gt;Message-ID&lt;/em&gt; ermöglichen.&lt;/p&gt;

&lt;h4 id=&quot;aufbau-einer-messsage-id-&quot;&gt;Aufbau einer &lt;em&gt;Messsage-ID&lt;/em&gt;&lt;/h4&gt;

&lt;p&gt;Vom Aufbau her ähnelt eine &lt;em&gt;Message-ID&lt;/em&gt; sehr einer E-Mail-Adresse: sie hat einen linken und einen rechten Teil, die durch ein &lt;code&gt;@&lt;/code&gt;-Symbol miteinander verknüpft sind und wird von spitzen Klammern (&lt;code&gt;&amp;lt;&amp;gt;&lt;/code&gt;) eingerahmt. Weil das sehr dem Konzept einer lokalen Adresse und einer Domain ähnelt, wird die Anforderung, dass &lt;em&gt;Message-IDs&lt;/em&gt; global eindeutig sein müssen, am besten so umgesetzt, dass das die ID erzeugende System auf der rechten Seite seinen (weltweit eindeutigen) Hostnamen einsetzt und auf der linken Seite eine Zeichenfolge verwendet, die systemweit eindeutig ist, in der Regel also aus einem Timestamp, ggf. einer Prozess-ID oder einem Zähler besteht. Das Format wäre also &lt;code&gt;&amp;lt;unique@hostname&amp;gt;&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Das funktioniert prima, solange das System einen (eindeutigen) Hostnamen &lt;em&gt;hat&lt;/em&gt;; für den typischen (Windows-)Heimrechner ist das allerdings nicht der Fall. Dann kann man die Erzeugung der ID entweder dem Newsserver überlassen, der ja in der Regel im Netz erreichbar sein muss und daher über eine IP-Adresse und einen auch als &lt;em&gt;FQDN&lt;/em&gt; bezeichneten domainisierten Hostnamen (&lt;code&gt;news1.provider.example&lt;/code&gt;) verfügt. Alternativ kann man dem Newsreader einen Hostnamen (FQDN) vorgeben; das muss nicht zwingend der tatsächliche Hostname des Rechners sein, es genügt auch ein Name, der garantiert nicht anderweitig vergeben werden kann, wie ihn bspw. das Projekt &lt;a href=&quot;https://my-fqdn.de/&quot; title=&quot;Willkommen! | my-fqdn.de&quot;&gt;&lt;em&gt;My FQDN&lt;/em&gt;&lt;/a&gt; zur Verfügung stellt. Schließlich kann man, wenn alle Stricke reißen und man die &lt;em&gt;Message-ID&lt;/em&gt; unbedingt selbst generieren will, auf die Mailadresse des Autors abstellen, für die Adresse &lt;code&gt;localpart@domain&lt;/code&gt; dann etwa so: &lt;code&gt;&amp;lt;unique.localpart@domain&amp;gt;&lt;/code&gt;.&lt;/p&gt;

&lt;h5 id=&quot;beispiele-f-r-message-ids-&quot;&gt;Beispiele für &lt;em&gt;Message-IDs&lt;/em&gt;&lt;/h5&gt;

&lt;p&gt;In der Praxis sieht bspw. eine durch den Newsserver &lt;em&gt;INN&lt;/em&gt; erzeugte &lt;em&gt;Message-ID&lt;/em&gt; so aus:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&amp;lt;r6d9hs$4cu$1@thangorodrim.ancalagon.de&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Auf der rechten Seite steht der Hostname des Newsservers (hier &lt;code&gt;thangorodrim.ancalagon.de&lt;/code&gt;), auf der linken Seite finden sich (nacheinander und getrennt durch &lt;code&gt;$&lt;/code&gt;) ein Timestamp (hier &lt;code&gt;r6d9hs&lt;/code&gt;), die Prozess-ID des Serverprozeses (hier &lt;code&gt;4cu&lt;/code&gt;) und - für den Fall, dass in derselben Sekunde vom selben Prozess mehrere Beiträge entgegengenommen werden - ein Zähler (hier &lt;code&gt;1&lt;/code&gt;). Timestamp und Prozess-ID werden dabei in einem Zahlensystem auf der Basis 32 kodiert; dezimal lautet der Timestamp also &lt;code&gt;912696892&lt;/code&gt; und die Prozess-ID &lt;code&gt;4510&lt;/code&gt;. Und tatsächlich: wie das Logfile des Newsservers zeigt, wurde der Beitrag von dem Prozess Nummer 4510 angenommen:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;thangorodrim nnrpd[4510]: thangorodrim.ancalagon.de (127.0.0.1) connect - port 119
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Beim Timestamp muss man nun noch wissen, dass der &lt;em&gt;INN&lt;/em&gt; vom tatsächlichen Unix-Timestamp (also der Anzahl der Sekunden seit der Epoche, d.h. seit 01.01.1970&amp;#160;00:00:00) wahllos 673416000 abzieht, um eine kürzere &lt;em&gt;Message-ID&lt;/em&gt; zu erhalten. Zählt man also zu dem Timestamp von 912696892 noch 673416000 hinzu, erhält man 1586112892 - und das ist  umgerechnet der 05.04.2020, 18:54:52 Uhr: passt!&lt;/p&gt;

&lt;p&gt;Der Newsreader &lt;em&gt;slrn&lt;/em&gt; arbeitet ähnlich:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&amp;lt;slrn94p19c.ns.thomas@thangorodrim.ancalagon.de&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Die &lt;em&gt;Message-ID&lt;/em&gt; besteht aus dem Namen des Newsreaders (&lt;code&gt;slrn&lt;/code&gt;), einem verkürzten Zeitstempel im 32er-Zahlensystem (&lt;code&gt;94p19c&lt;/code&gt;), der Prozess-ID (&lt;code&gt;ns&lt;/code&gt;) und der Mailadresse des Nutzers (bzw. seinem Usernamen und dem Hostnamen).&lt;/p&gt;

&lt;h4 id=&quot;vorteile-einer-selbst-erzeugten-message-id-&quot;&gt;Vorteile einer selbst erzeugten &lt;em&gt;Message-ID&lt;/em&gt;&lt;/h4&gt;

&lt;p&gt;Am einfachsten wäre es natürlich, die Erzeugung von &lt;em&gt;Message-IDs&lt;/em&gt; dem Newsserver zu überlassen; andererseits hat die Erzeugung eigener &lt;em&gt;Message-IDs&lt;/em&gt; durchaus Vorteile. Manche Newsreader benötigen das schon deshalb, weil sie eigene Postings auch ablegen und speichern wollen. Ganz allgemein hat eine selbst erzeugte &lt;em&gt;Message-ID&lt;/em&gt; aber den Vorteil, dass man (nur) an ihr sehr einfach eigene Beiträge erkennen kann, auch dann, wenn man vielleicht wechselnde E-Mail-Adressen verwendet, und dass man nur so auch &lt;em&gt;Antworten&lt;/em&gt; auf eigene Beiträge erkennt (weil diese eine &lt;em&gt;Message-ID&lt;/em&gt; mit dem eigenen FQDN im &lt;em&gt;References&lt;/em&gt;-Header tragen). So kann ein geeigneter Newsreader bspw. Antworten auf eigene Postings hervorheben, oder man kann sich mit einem Tool wie &lt;a href=&quot;https://th-h.de/net/software/fupcheck/&quot; title=&quot;fupcheck | th-h.de&quot;&gt;&lt;em&gt;fupcheck&lt;/em&gt;&lt;/a&gt; per Mail über Antworten benachrichtigen lassen.&lt;/p&gt;

&lt;h3 id=&quot;-sprechende-message-ids-&quot;&gt;&amp;#8220;Sprechende&amp;#8221; &lt;em&gt;Message-IDs&lt;/em&gt;&lt;/h3&gt;

&lt;p&gt;Noch schöner finde ich es persönlich, wenn die &lt;em&gt;Message-ID&lt;/em&gt; meiner Postings nicht nur global eindeutig ist, sondern auch für den menschlichen Leser verwertbare Informationen enthält. So ist es ja theoretisch nett, dass ich aus der &lt;em&gt;Message-ID&lt;/em&gt; &lt;code&gt;&amp;lt;r6d9hs$4cu$1@thangorodrim.ancalagon.de&amp;gt;&lt;/code&gt; herauslesen kann, dass es sich um ein Posting vom Abend des 05.04.2020 handelt - aber natürlich wird kaum je ein Mensch &lt;code&gt;r6d9hs&lt;/code&gt; in eine Dezimalzahl umwandeln, 673416000 hinzuzählen und das Ergebnis dann von einem UNIX-Timestamp in ein Datum konvertieren. Viel praktischer wäre es doch, wenn man einer &lt;em&gt;Message-ID&lt;/em&gt; direkt ansehen könnte, von wann sie ist, und am besten vielleicht auch von &lt;em&gt;wo&lt;/em&gt;, d.h. aus welcher Newsgroup. Dann muss man sich nicht wundern, wenn mal wieder jemand erst nach Monaten oder Jahren auf einen alten Beitrag antwortet, und man kann auch an einer zitierten &lt;em&gt;Message-ID&lt;/em&gt; ungefähr ablesen, wo sie herkommt.&lt;/p&gt;

&lt;p&gt;Ich erzeuge daher seit vielen, vielen Jahren unter Hinzunahme meines &lt;a href=&quot;https://hamster-classic.de/&quot; title=&quot;start - Hamster Classic&quot;&gt;&lt;em&gt;Hamsters&lt;/em&gt;&lt;/a&gt; &amp;#8220;sprechende&amp;#8221; &lt;em&gt;Message-IDs&lt;/em&gt;, die aus den Initialen der (ersten) Newsgroup, in der der Beitrag erschienen ist, einem lesbaren Zeitstempel und einem Zähler bestehen. Der Beitrag mit der &lt;em&gt;Message-ID&lt;/em&gt;&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&amp;lt;dcsn.1908202159.235@meneldor.ancalagon.de&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;ist mithin am 20.08.2019 um 21.59 Uhr von meinem Laptop &lt;code&gt;meneldor&lt;/code&gt; aus in der Newsgroup &lt;code&gt;d.c.s.n&lt;/code&gt; erschienen; letzteres kann man mit etwas Erfahrung als &lt;code&gt;de.comm.software.newsreader&lt;/code&gt; (oder auch &lt;code&gt;de.comm.software.newsserver&lt;/code&gt; - natürlich sind Initialen nicht eindeutig!) übersetzen. Außerdem handelte es sich um den 235. Beitrag im Jahr 2019; das ermöglicht mir zudem durch einen schlichten Blick in die Datei, in der der Zähler gespeichert wird, die Gesamtzahl meiner Beiträge im jeweiligen Jahr zu erfassen.&lt;/p&gt;

&lt;p&gt;Klar, das ist eine Spielerei, aber eine für mich hilfreiche - und liebgewonnene - Spielerei.&lt;/p&gt;

&lt;h4 id=&quot;-sprechende-message-ids-mit-dem-inn-erzeugen&quot;&gt;&amp;#8220;Sprechende&amp;#8221; &lt;em&gt;Message-IDs&lt;/em&gt; mit dem &lt;em&gt;INN&lt;/em&gt; erzeugen&lt;/h4&gt;

&lt;p&gt;Nun habe ich in letzter Zeit öfters mal von verschiedenen Rechnern aus mit verschiedenen Newsreadern (nicht nur zu Testzwecken) auf meinem &amp;#8220;hauseigenen&amp;#8221; &lt;em&gt;INN&lt;/em&gt; gepostet. Und da hätte ich dann gerne - auch ohne &lt;em&gt;Hamster&lt;/em&gt; - meine sprechenden &lt;em&gt;Message-IDs&lt;/em&gt;, die der &lt;em&gt;INN&lt;/em&gt; für mich setzen müsste.&lt;/p&gt;

&lt;p&gt;Der richtige Ansatzpunkt für solche Manipulationen ist der Filter &lt;code&gt;filter_nnrpd.pl&lt;/code&gt; (bei Debian in &lt;code&gt;/etc/news/filter/&lt;/code&gt;), der nur auf dem Server über den NNRP-Daemon (&lt;code&gt;nnrpd&lt;/code&gt;) gepostete Beiträge bearbeitet, nicht aber etwa ein- und durchgeleitete Beiträge wie der &lt;code&gt;filter_innd.pl&lt;/code&gt; - denn an &lt;em&gt;Message-IDs&lt;/em&gt; schon geposteter Beiträge herumzufummeln ist ein absolutes No-Go!&lt;/p&gt;

&lt;p&gt;Insbesondere wenn man den Server nicht alleine nutzt, möchte man die Veränderungen an der &lt;em&gt;Message-ID&lt;/em&gt; auf eigene Postings beschränken; das kann man zum Beispiel durch einen Filter auf den Domain-Part (also die rechte Seite der &lt;em&gt;Message-ID&lt;/em&gt;) lösen oder indem man nur Postings bearbeitet, die einen entsprechenden Zusatzheader (wie bspw. &lt;code&gt;X-Fix-MID: yes&lt;/code&gt;) gesetzt haben.&lt;/p&gt;

&lt;p&gt;Im &lt;code&gt;filter_nnrpd.pl&lt;/code&gt; gibt es die Funktion &lt;code&gt;filter_post&lt;/code&gt;; dort sind wir richtig. Am Anfang sollte man auf jeden Fall den Rückgabewert der Funktion auf einen leeren String setzen, denn ansonsten werden Postings mit einer Fehlermeldung abgewiesen. Außerdem muss man das Verändern von Headern freischalten:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;my $rval = &quot;&quot;; # assume we&#039;ll accept.
$modify_headers = 1;
# [...]
return $rval;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;So weit, so gut. An der mit &amp;#8220;[&amp;#8230;]&amp;#8221; markierten Stelle prüfen wir jetzt, ob das Posting modifiziert werden soll oder nicht; wenn ja, rufen wir eine - noch zu schreibende - Funktion dafür auf:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;# Fix Message-ID
if (exists($hdr{&#039;X-Fix-MID&#039;})) {
    # remove trigger header
    delete $hdr{&#039;X-Fix-MID&#039;};
    # fix MID
    $hdr{&#039;Message-ID&#039;} = fix_mid($hdr{&#039;Newsgroups&#039;}, $hdr{&#039;Message-ID&#039;});
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Ist die Headerzeile &lt;code&gt;X-Fix-MID&lt;/code&gt; auf irgendeinen Wert gesetzt, entfernen wir sie und setzen dann die &lt;em&gt;Message-ID&lt;/em&gt; auf den Rückgabewert der Funktion &lt;code&gt;fix_mid&lt;/code&gt;. Und die sieht wie folgt aus:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;#
# Message-ID
#
sub fix_mid($$) {
    my ($newsgroups, $mid) = @_;
    my ($fqdn, $element, $initial)= &#039;&#039;;
    # get FQDN
    if (defined($mid) &amp;amp;&amp;amp; $mid ne &#039;&#039;) {
       ($fqdn) = $mid =~ /&amp;lt;.+\@(.+)&amp;gt;$/;
    } else {
       $fqdn = $inn::fromhost;
    }
    # get timestamp
    my $datetime = strftime(&quot;%Y%m%d%H%M%S&quot;,localtime());
    # get initials of first newsgroup
    my($newsgroup,undef) = split /,/, $newsgroups;
    my @newsgroup = split /\./, $newsgroup;
    foreach $element (@newsgroup) {
       $initial .= substr($element,0,1);
    };
    # get, increment and save counter
    open CTR, &#039;+&amp;lt;/var/lib/news/mid-counter&#039;;
    flock(CTR, 2);
    my $counter = &amp;lt;CTR&amp;gt;;
    $counter++;
    seek(CTR,0,0);
    print CTR $counter;
    close CTR;
    # return Message-ID
    return sprintf(&#039;&amp;lt;%s.%s.%s@%s&amp;gt;&#039;, $initial, $datetime, $counter, $fqdn);
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Wir übernehmen also den Domain-Part der bestehenden &lt;em&gt;Message-ID&lt;/em&gt;; nur wenn es bisher keine &lt;em&gt;Message-ID&lt;/em&gt; gibt, nehmen wir den Hostnamen des Newsservers. Dann generieren wir den Zeitstempel, die Initialen der (ersten) Newsgroup und laden und schreiben den Zähler; letzteres ist natürlich mit Plattenzugriffen verbunden. Am Schluss werden die Einzelteile zu einer &lt;em&gt;Message-ID&lt;/em&gt; zusammengesetzt.&lt;/p&gt;

&lt;p&gt;Voila!&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Nachtrag&lt;/strong&gt; vom 10.01.2021: Die meisten Newsreader nutzen natürlich mehrere parallele Threads zum Lesen und Posten. Das geht dann schief, wenn deshalb verschiedene &lt;code&gt;nnrpd&lt;/code&gt;-Prozesse gleichzeitig auf die Datei &lt;code&gt;/var/lib/news/mid-counter&lt;/code&gt; zugreifen. Daher bedarf es eines exklusiven Locks auf die Datei, schon beim Lesen, damit nicht mehrere Prozesse denselben Zahlenwert erhalten; und weil beim Schließen eines Dateihandles auch die Locks aufgegeben werden, muss die Datei zum Lesen und Schreiben geöffnet werden. Und wenn man das wiederum tut, muss man nach dem Lesen zurück an den Anfang der Datei springen, um den alten Inhalt mit der neuen Zahl zu überschreiben. Den Beispielcode oben habe ich entsprechend angepasst.&lt;/p&gt;

&lt;p&gt;(Und wenn man das testen will, sollte man bedenken, dass &lt;code&gt;filter_nnrpd.pl&lt;/code&gt; immer dann, aber auch nur dann neu geladen wird, wenn ein neuer &lt;code&gt;nnrpd&lt;/code&gt;-Prozess startet - dementsprechend also nicht, wenn der Newsreader die Verbindung erst einmal offen hält und weitere Testposts dann über die noch bestehende Verbindung abgesetzt werden.)&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Titelbild © Weissblick - stock.adobe.com&lt;/em&gt;&lt;/p&gt;
&lt;img src=&quot;https://ssl-vg03.met.vgwort.de/na/e6775c991a684726be21872afd324b03&quot; width=&quot;1&quot; height=&quot;1&quot; alt=&quot;&quot;&gt; 
    </content:encoded>

    <pubDate>Wed, 15 Apr 2020 06:00:00 +0000</pubDate>
    <guid isPermaLink="false">https://netz-rettung-recht.de/archives/2239-guid.html</guid>
    <category>anleitung</category>
<category>inn</category>
<category>usenet</category>

</item>
<item>
    <title>Blogbeiträge in sozialen Medien teilen</title>
    <link>https://netz-rettung-recht.de/archives/2231-Blogbeitraege-in-sozialen-Medien-teilen.html</link>
            <category>Bits'n'Bytes</category>
    
    <comments>https://netz-rettung-recht.de/archives/2231-Blogbeitraege-in-sozialen-Medien-teilen.html#comments</comments>
    <wfw:comment>https://netz-rettung-recht.de/wfwcomment.php?cid=2231</wfw:comment>

    <slash:comments>0</slash:comments>
    <wfw:commentRss>https://netz-rettung-recht.de/rss.php?version=2.0&amp;type=comments&amp;cid=2231</wfw:commentRss>
    

    <author>nospam@example.com (Thomas Hochstein)</author>
    <content:encoded>
    &lt;p&gt;Die große Zeit der Blogs als primäres, ja nahezu einziges Medium zum Teilen und Veröffentlichen der eigenen Gedanken ist seit Jahren vorüber; die sog. &amp;#8220;Blogosphäre&amp;#8221; vereinzelt. Das schließt nicht aus, dass es weiter große, vor allem kommerzielle bzw. kommerzialisierte Blogs mit tausenden Lesern und mehreren Beiträgen täglich gibt, aber der durchschnittliche Internetnutzer denkt vermutlich nicht an ein Blog, wenn er sich online äußern will. Diesen Blog haben vielmehr die sog. &amp;#8220;Sozialen Medien&amp;#8221; (social media), also bspw. Twitter, Facebook und Instagram, eingenommen. Und man vernetzt sich heutzutage auch eher dort als über Kommentare und &lt;a href=&quot;https://netz-rettung-recht.de/archives/1964-Sind-Trackbacks-und-Pingbacks-out.html&quot; title=&quot;&quot;&gt;Trackbacks&lt;/a&gt; in den eigenen Blogs.&lt;/p&gt;

&lt;p&gt;Nicht nur Twitter mit seiner Beschränkung auf 280 Zeichen, auch Facebook ist per se aber wenig geeignet zur Veröffentlichung auch nur kürzerer, geschweige denn mittlerer oder gar langer Texte in der eigenen Timeline bzw. dem eigenen Profil; das beginnt schon mit dem Editor, der als Stil- und Gliederungselement nur Zeilenschaltungen (also Leerzeichen) kennt und nicht einmal einfachste Hervorhebungen (kursiv, fett) oder gar Überschriften ermöglicht. Diese technischen Unzulänglichkeiten sind aber gar nicht der entscheidende Punkt; auch ohne sie spräche vieles dafür, seine eigenen Inhalte auch selbst zu kontrollieren und nicht vom freien, weltweit verfügbaren und vernetzten &lt;em&gt;World Wide Web&lt;/em&gt; einen großen Schritt zurück in die Welt der Onlinedienste der 90er Jahre zu machen, in der Inhalte nur innerhalb der jeweiligen Dienste (&amp;#8220;Silos&amp;#8221;) verfügbar sind. Und es mag zwar unwahrscheinlich sein, dass Facebook demnächst die Pforten schließt, aber die Welt dreht sich weiter und Internetkonzerne kommen und gehen &amp;#8230; Deshalb hilft es auch nur bedingt, dass Facebook mit den wenig bekannten und genutzten Notizen (&amp;#8220;Notes&amp;#8221;) durchaus die Möglichkeit bietet, blog-artige Beiträge zu veröffentlichen, mit Überschriften, Aufzählungen, Hervorhebungen, Links und sogar einem Bild im Kopf der Seite.&lt;/p&gt;

&lt;h3 id=&quot;blogbeitr-ge-in-sozialen-medien-teilen&quot;&gt;Blogbeiträge in sozialen Medien teilen&lt;/h3&gt;

&lt;p&gt;Es geht also nichts über das eigene Blog - aber wie macht man dessen Inhalte sichtbar? Die Vernetzung über Links und Blogrolls oder gar Blogverzeichnisse funktioniert allenfalls innerhalb der &amp;#8220;Blogosphäre&amp;#8221;, erreicht aber den durchschnittlichen Internetnutzer nicht; und wenn man Leser gefunden hat, können diese das Blog natürlich über einen RSS-Feed &amp;#8220;abonnieren&amp;#8221; oder verfolgen, aber auch RSS (und Atom) gerät zunehmend in Vergessenheit. Das lässt sich nicht nur an der Einstellung des &lt;em&gt;Google Readers&lt;/em&gt; 2013 (sieben Jahre ist das schon her!) erkennen, sondern auch am Wegfall der Unterstützung für diese Formate in populären Programmen wie &lt;em&gt;Firefox&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Ein guter Weg ist daher die Ankündigung bzw. das Teilen der eigenen Beiträge in den proprietären sozialen Netzwerken, um auch deren Nutzer &amp;#8220;abzuholen&amp;#8221; und es ihnen zu ermöglichen, auf diese Weise dem eigenen Blog zu &amp;#8220;folgen&amp;#8221;. Das kann man selbst tun, man kann es automatisieren und man kann auch den Lesern einfache Möglichkeiten bieten, die Beiträge über ihre Accounts zu teilen; entsprechende &amp;#8220;Sharing Buttons&amp;#8221; gehören mittlerweile zum gewohnten Bild vieler Webpräsenzen.&lt;/p&gt;

&lt;p&gt;Ein simpler Link ist aber auf Twitter alles anderen als ein Eye-Catcher, und Facebook erzeugt zwar eine ansehnliche Vorschau für Links, die man in seinen Status aufnimmt, doch auch das gelingt nicht immer optimal: die dort abgebildeten einleitenden Worte sind für einen Überblick über den Beitrag nicht unbedingt geeignet, und wenn ein Bild ausgewählt wird, dann passt es oft überhaupt nicht zum Link. Wie schön wäre es, wenn man bei Facebook Bild und Zusammenfassung selbst kontrollieren könnte und bei Twitter für seine Links ebenfalls eine Vorschau anzeigen könnte, wie man das von anderen Tweets - bspw. verschiedener Medien - kennt! Und all das kann man; auch und gerade mit &lt;em&gt;Serendipity&lt;/em&gt;. Und man sollte es auch tun, jedenfalls dann, wenn man seine Beiträge in sozialen Medien teilen will.&lt;/p&gt;

&lt;h3 id=&quot;vorschaubilder-f-r-links-bei-twitter-und-facebook-und-anderswo-&quot;&gt;Vorschaubilder für Links bei Twitter und Facebook (und anderswo)&lt;/h3&gt;

&lt;figure class=&quot;serendipity_imageComment_center&quot; style=&quot;width: 607px&quot;&gt;&lt;div class=&quot;serendipity_imageComment_img&quot;&gt;&lt;!-- s9ymdb:806 --&gt;&lt;img class=&quot;serendipity_image_center&quot; width=&quot;607&quot; height=&quot;247&quot;  src=&quot;https://netz-rettung-recht.de/uploads/articles/2020/2020-03-29-twitter-card.png&quot; title=&quot;Blogbeitrag, geteilt auf Twitter&quot; alt=&quot;&quot;&gt;&lt;/div&gt;&lt;figcaption class=&quot;serendipity_imageComment_txt&quot;&gt;Blogbeitrag, geteilt auf Twitter.&lt;/figcaption&gt;&lt;/figure&gt;

&lt;p&gt;Das &amp;#8220;Geheimnis&amp;#8221; hinter den Bildern und Zusammenfassungen, mit der Twitter und Facebook (aber auch andere Dienste wie bspw. &lt;em&gt;Tumblr&lt;/em&gt; oder &lt;em&gt;Slack&lt;/em&gt;) Links ersetzen bzw. aufhübschen, ist das &lt;em&gt;Open Graph Protocol&lt;/em&gt;, das Twitter in der Form von &lt;em&gt;Twitter Cards&lt;/em&gt; leicht abwandelt. All das, was man in diesen Vorschaublocks sieht, findet sich unsichtbar im &lt;code&gt;&amp;lt;head&amp;gt;&lt;/code&gt;-Abschnitt der jeweiligen Webseite, die verlinkt wurde. Dort finden sich spezielle &lt;code&gt;&amp;lt;meta&amp;gt;&lt;/code&gt;-Tags, in denen Titel, Beschreibung, Link, Bild usw. hinterlegt sind, die in der Vorschau erscheinen sollen. Die Einzelheiten dazu - mit vielen Beispielen und Empfehlungen, bspw. zu Bildgrößen und Länge der einzelnen Textelemente - habe ich vor vier Jahren schon einmal in dem Beitrag &amp;#8220;&lt;a href=&quot;https://netz-rettung-recht.de/archives/1906-Open-Graph-Protocol-und-Twitter-Cards.html&quot; title=&quot;&quot;&gt;Open Graph Protocol und Twitter Cards&lt;/a&gt;&amp;#8221; hier im Blog erläutert. &lt;em&gt;(Alle Links sind noch einmal am Ende des Beitrags zusammengefasst.)&lt;/em&gt;&lt;/p&gt;

&lt;figure class=&quot;serendipity_imageComment_center&quot; style=&quot;width: 400px&quot;&gt;&lt;div class=&quot;serendipity_imageComment_img&quot;&gt;&lt;a  class=&quot;serendipity_image_link&quot; title=&quot;Blogbeitrag, geteilt auf Facebook&quot;  rel=&#039;lightbox[2231]&#039; href=&#039;https://netz-rettung-recht.de/uploads/articles/2020/2020-03-29-open-graph.png&#039;&gt;&lt;!-- s9ymdb:803 --&gt;&lt;img class=&quot;serendipity_image_center&quot; width=&quot;400&quot; height=&quot;372&quot;  src=&quot;https://netz-rettung-recht.de/uploads/articles/2020/2020-03-29-open-graph.serendipityThumb.png&quot; title=&quot;Blogbeitrag, geteilt auf Facebook&quot; alt=&quot;&quot;&gt;&lt;/a&gt;&lt;/div&gt;&lt;figcaption class=&quot;serendipity_imageComment_txt&quot;&gt;Blogbeitrag, geteilt auf Facebook.&lt;/figcaption&gt;&lt;/figure&gt;

&lt;h4 id=&quot;-serendipity-event-social-&quot;&gt;&lt;code&gt;serendipity_event_social&lt;/code&gt;&lt;/h4&gt;

&lt;p&gt;Die notwendigen Einträge kann das &lt;em&gt;Serendipity&lt;/em&gt;-Plugin &lt;code&gt;serendipity_event_social&lt;/code&gt; setzen, das sich über den Plugin-Manager &lt;em&gt;Spartacus&lt;/em&gt; installieren lässt.&lt;/p&gt;

&lt;figure class=&quot;serendipity_imageComment_center&quot; style=&quot;width: 400px&quot;&gt;&lt;div class=&quot;serendipity_imageComment_img&quot;&gt;&lt;a  class=&quot;serendipity_image_link&quot; title=&quot;Social-Media-Bild pro Beitrag&quot;  rel=&#039;lightbox[2231]&#039; href=&#039;https://netz-rettung-recht.de/uploads/articles/2020/2020-03-29-entry-image.png&#039;&gt;&lt;!-- s9ymdb:801 --&gt;&lt;img class=&quot;serendipity_image_center&quot; width=&quot;400&quot; height=&quot;236&quot;  src=&quot;https://netz-rettung-recht.de/uploads/articles/2020/2020-03-29-entry-image.serendipityThumb.png&quot; title=&quot;Social-Media-Bild pro Beitrag&quot; alt=&quot;&quot;&gt;&lt;/a&gt;&lt;/div&gt;&lt;figcaption class=&quot;serendipity_imageComment_txt&quot;&gt;Ein beitragsspezifisches Bild.&lt;/figcaption&gt;&lt;/figure&gt;

&lt;p&gt;Das verwendete Bild kann man in &lt;em&gt;Serendipity&lt;/em&gt; für jeden Eintrag unter den &amp;#8220;Erweiterten Optionen&amp;#8221; des Eintrags gesondert auswählen. Wird hier keine Auswahl getroffen, verwendet &lt;em&gt;Serendipity&lt;/em&gt; bei den Themes &lt;em&gt;Timeline&lt;/em&gt; und &lt;em&gt;Photo&lt;/em&gt; die - nur - dort vorgesehenen Titelbilder (bzw. &amp;#8220;featured images&amp;#8221;) für jeden Eintrag; ansonsten wird das erste im Eintrag vorkommende Bild verwendet. Gibt es auch dort kein Bild, greift &lt;em&gt;Serendipity&lt;/em&gt; auf das in der Plugin-Konfiguration definierte Standardbild zurück.&lt;/p&gt;

&lt;h4 id=&quot;-serendipity-event-metadesc-&quot;&gt;&lt;code&gt;serendipity_event_metadesc&lt;/code&gt;&lt;/h4&gt;

&lt;p&gt;Die für den Titel und die Beschreibung verwendeten Texte kann &lt;code&gt;serendipity_event_social&lt;/code&gt; allerdings nicht setzen; es greift standardmäßig vielmehr auf den Titel des Beitrags und die ersten 200 Zeichen des Beitrags zurück. Auch das lässt sich aber steuern, und zwar mit dem Plugin &lt;code&gt;serendipity_event_metadesc&lt;/code&gt;.&lt;/p&gt;

&lt;figure class=&quot;serendipity_imageComment_center&quot; style=&quot;width: 400px&quot;&gt;&lt;div class=&quot;serendipity_imageComment_img&quot;&gt;&lt;a  class=&quot;serendipity_image_link&quot; title=&quot;Meta-Beschreibung pro Eintrag&quot;  rel=&#039;lightbox[2231]&#039; href=&#039;https://netz-rettung-recht.de/uploads/articles/2020/2020-03-29-meta.png&#039;&gt;&lt;!-- s9ymdb:802 --&gt;&lt;img class=&quot;serendipity_image_center&quot; width=&quot;400&quot; height=&quot;241&quot;  src=&quot;https://netz-rettung-recht.de/uploads/articles/2020/2020-03-29-meta.serendipityThumb.png&quot; title=&quot;Meta-Beschreibung pro Eintrag&quot; alt=&quot;&quot;&gt;&lt;/a&gt;&lt;/div&gt;&lt;figcaption class=&quot;serendipity_imageComment_txt&quot;&gt;Die Eingabefelder des &lt;i&gt;Metadesc&lt;/i&gt;-Plugins in der Beitragsbearbeitung.&lt;/figcaption&gt;&lt;/figure&gt;

&lt;p&gt;Dieses Plugin bietet für jeden Eintrag - ebenfalls in den &amp;#8220;Erweiterten Optionen&amp;#8221; - die Möglichkeit, die &lt;code&gt;&amp;lt;meta&amp;gt;&lt;/code&gt;-Tags &lt;em&gt;Description&lt;/em&gt; und &lt;em&gt;Keywords&lt;/em&gt; zu setzen, auf die übrigens auch Suchmachinen wie Google für die Suche wie auch die Darstellung der Suchergebnisse zugreifen. Es empfiehlt sich daher ohnehin, dieses Plugin zu installieren und für die eigenen Blogbeiträge ein knackiges Summary zu hinterlegen. Auf die dort eingegegeben &lt;em&gt;Description&lt;/em&gt; greift auch &lt;code&gt;serendipity_event_social&lt;/code&gt; zurück und übernimmt sie für die &lt;em&gt;Open Graph&lt;/em&gt;-Einträge.&lt;/p&gt;

&lt;h3 id=&quot;sharebuttons-mit-serendipity-event-social-&quot;&gt;Sharebuttons mit &lt;code&gt;serendipity_event_social&lt;/code&gt;&lt;/h3&gt;

&lt;p&gt;Vorschaubilder und passende Beschreibungen auf Twitter und Facebook sind ja schon toll - noch toller wäre es aber, wenn man selbst (und die werte Leserschaft!) Blogbeiträge einfach und datenschutzkonform auf Facebook, Twitter und anderen sozialen Medien teilen könnte, am besten, ohne den Eintragstitel und den Link von Hand kopieren zu müssen. Kurzum, entsprechende Buttons wären schön, wie die sozialen Netzwerke sie anbieten, aber doch bitte möglichst ohne das Nachladen irgendwelchen Codes von dort, der dann wer-weiß-welche Informationen über die Besucher des eigenen Blogs nach dort übermittelt. Dafür gibt es von &lt;em&gt;Heise online&lt;/em&gt; das &lt;a href=&quot;https://github.com/heiseonline/shariff&quot; title=&quot;GitHub - heiseonline/shariff: 👮 Shariff enables website users to share their favorite content without compromising their privacy. · GitHub&quot;&gt;&lt;em&gt;Shariff&lt;/em&gt;&lt;/a&gt;-Projekt, das &amp;#8220;Teilen&amp;#8221;-Buttons für soziale Netzwerke ohne jede Datenübermittlung an dieselben anbietet (bis man darauf klickt, logischerweise - denn dann will man ja gerade, äh, Daten teilen).&lt;/p&gt;

&lt;p&gt;Und auch &lt;em&gt;Shariff&lt;/em&gt; kann man mit &lt;code&gt;serendipity_event_social&lt;/code&gt; in das eigene Blog einbinden - das ist sogar der primäre Anwendungsbereich dieses Plugins.&lt;/p&gt;

&lt;figure class=&quot;serendipity_imageComment_center&quot; style=&quot;width: 400px&quot;&gt;&lt;div class=&quot;serendipity_imageComment_img&quot;&gt;&lt;a  class=&quot;serendipity_image_link&quot; title=&quot;serendipity_event_social&quot;  rel=&#039;lightbox[2231]&#039; href=&#039;https://netz-rettung-recht.de/uploads/articles/2020/2020-03-29-s9y-event-social.png&#039;&gt;&lt;!-- s9ymdb:804 --&gt;&lt;img class=&quot;serendipity_image_center&quot; width=&quot;400&quot; height=&quot;296&quot;  src=&quot;https://netz-rettung-recht.de/uploads/articles/2020/2020-03-29-s9y-event-social.serendipityThumb.png&quot; title=&quot;serendipity_event_social&quot; alt=&quot;&quot;&gt;&lt;/a&gt;&lt;/div&gt;&lt;figcaption class=&quot;serendipity_imageComment_txt&quot;&gt;Die Konfiguration des &lt;i&gt;Sharebuttons&lt;/i&gt;-Plugins.&lt;/figcaption&gt;&lt;/figure&gt;

&lt;p&gt;In der Pluginkonfiguration lassen sich die sozialen Netzwerke auswählen, für die &amp;#8220;Teilen&amp;#8221;-Buttons am Ende jedes Beitrags angezeigt werden sollen - soweit das &lt;em&gt;Shariff&lt;/em&gt;-Projekt entsprechende Buttons anbietet. Außerdem kann man auswählen, ob die Buttons nur unter den einzelnen Einträgen erscheinen sollen oder auch auf Übersichtsseiten wie der Startseite des Blogs, den Archivseiten oder Suchergebnissen unter jedem Beitrag angezeigt werden sollen.&lt;/p&gt;

&lt;p&gt;Hier wird auch das bereits weiter oben angesprochene Fallback-Bild konfiguriert, das als Vorschaubild in den sozialen Medien angezeigt wird, wenn im Beitrag kein Bild angegeben ist bzw. sich keines dort findet. Für die Twitter-Nutzer kann man zudem noch das eigene Twitter-Handle an den geteilten Text anhängen lassen.&lt;/p&gt;

&lt;p&gt;Außerdem bietet das &lt;em&gt;Shariff&lt;/em&gt;-Projekt für diejenigen sozialen Netzwerke, die das unterstützen, einen Zähler an, wie oft der Beitrag dort bereits geteilt wurde; das ist im Wesentlichen allerdings nur noch Facebook. Außerdem braucht es dazu ein Backend; die dazu notwendige Software kann man selbst installieren, oder man greift auf die von &lt;em&gt;Serendipity&lt;/em&gt;-Entwickler &lt;a href=&quot;https://www.onli-blogging.de/&quot; title=&quot;onli blogging&quot;&gt;onli&lt;/a&gt; angebotene Installation auf &lt;code&gt;https://onli.columba.uberspace.de/s9y_shariff/&lt;/code&gt; zurück, die im Plugin auch als Default eingestellt ist.&lt;/p&gt;

&lt;h3 id=&quot;beitr-ge-automatisch-teilen&quot;&gt;Beiträge automatisch teilen&lt;/h3&gt;

&lt;p&gt;Noch besser als auf Knopfdruck geteilte Beiträge mit passendem Bild und Text sind nur automatisch geteilte Beiträge - und auch das geht, allerdings nicht mehr mit Facebook, jedenfalls nicht auf der eigenen Profilseite, sondern nur auf &amp;#8220;Facebook Pages&amp;#8221;, also quasi Fanseiten.&lt;/p&gt;

&lt;p&gt;Für diese Aufgabe eignen sich eine Vielzahl von Diensten, die sich die Vernetzung verschiedener Apps zur Aufgabe gemacht haben; zu den bekannteren zählen bspw. &lt;em&gt;&amp;#8220;If This Then That&amp;#8221;&lt;/em&gt; (&lt;a href=&quot;https://ifttt.com/&quot; title=&quot;IFTTT - Automate business &amp;amp; home&quot;&gt;IFTTT&lt;/a&gt;) oder &lt;a href=&quot;https://zapier.com/&quot; title=&quot;&quot;&gt;&lt;em&gt;Zapier&lt;/em&gt;&lt;/a&gt;. Allen diesen gemeinsam ist, dass man einen Auslöser (Trigger) mit einer Aktion verbindet (und ggf. noch Filter dazwischenschaltet). Man beauftragt den Dienst bspw., regelmäßig den RSS-Feed des eigenen Blogs abzurufen und immer dann, wenn sich dort ein neuer Beitrag findet, einen Tweet oder einen Facebook-Post auf der eigenen Fanseite zu veröffentlichen (oder sonst etwas zu tun).&lt;/p&gt;

&lt;h4 id=&quot;-serendipity-event-twitter-&quot;&gt;&lt;code&gt;serendipity_event_twitter&lt;/code&gt;&lt;/h4&gt;

&lt;p&gt;Soweit man jedoch mit automatischen Tweets auf Twitter zufrieden ist - weil man bspw. keine Facebook-Fanseite hat und die Beiträge auf der eigenen Profilseite gezwungenermaßen von Hand veröffentlichen muss -, geht das auch mit &lt;em&gt;Serendipity&lt;/em&gt;-Bordmitteln: das Microblogging-Plugin &lt;code&gt;serendipity_event_twitter&lt;/code&gt; kündigt neue Beiträge sogar ohne die bei den Automatisierungsdiensten übliche Verzögerung im Bereich von Minuten (oder halben Stunden) sofort an!&lt;/p&gt;

&lt;p&gt;Die Vielzahl der Einstellungen und Möglichkeiten dieses Plugins würde allerdings die Grenzen dieses Beitrags sprengen, weshalb ich mich stattdessen auf einen Verweis auf die mit dem Plugin mitgelieferte mehrsprachige Dokumentation verweise, die sich aus der Plugin-Verwaltung von &lt;em&gt;Serendipity&lt;/em&gt; abrufen lässt und auch auf Github eingesehen werden kann (allerdings dann in &amp;#8220;rohem&amp;#8221; HTML). Für einen ersten Überblick genügt vielleicht auch der folgenden Screenshot.&lt;/p&gt;

&lt;figure class=&quot;serendipity_imageComment_center&quot; style=&quot;width: 400px&quot;&gt;&lt;div class=&quot;serendipity_imageComment_img&quot;&gt;&lt;a  class=&quot;serendipity_image_link&quot; title=&quot;Dokumentation für serendipity_event_twitter&quot;  rel=&#039;lightbox[2231]&#039; href=&#039;https://netz-rettung-recht.de/uploads/articles/2020/2020-03-29-s9y-event-twitter-doc.png&#039;&gt;&lt;!-- s9ymdb:805 --&gt;&lt;img class=&quot;serendipity_image_center&quot; width=&quot;400&quot; height=&quot;203&quot;  src=&quot;https://netz-rettung-recht.de/uploads/articles/2020/2020-03-29-s9y-event-twitter-doc.serendipityThumb.png&quot; title=&quot;Dokumentation für serendipity_event_twitter&quot; alt=&quot;&quot;&gt;&lt;/a&gt;&lt;/div&gt;&lt;figcaption class=&quot;serendipity_imageComment_txt&quot;&gt;Screenshot der Dokumentation des Twitter-Plugins.&lt;/figcaption&gt;&lt;/figure&gt;

&lt;h3 id=&quot;zusammenfassung&quot;&gt;Zusammenfassung&lt;/h3&gt;

&lt;p&gt;Wer seine Blogbeiträge einfach und mit einer schicken Vorschau versehen auf Twitter, Facebook und Co teilen möchte. installiert sich die Plugins  &lt;code&gt;serendipity_event_social&lt;/code&gt;  und &lt;code&gt;serendipity_event_metadesc&lt;/code&gt; und füllt im Beitragseditor die Felder für die Meta-Beschreibung und ggf. das Eintragsbild aus; sollen die Veröffentlichungen bei Twitter automatisch erscheinen, kommt noch die Installation und Konfiguration von &lt;code&gt;serendipity_event_twitter&lt;/code&gt; dazu. Das war&amp;#8217;s!&lt;/p&gt;

&lt;p&gt;Selbstverständlich gibt es auch für andere Blogsysteme und CMS - wie Wordpress - entsprechende Plugins, und selbstverständlich kann man &lt;em&gt;Open Graph&lt;/em&gt; und &lt;em&gt;Twitter Cards&lt;/em&gt; sowie &lt;em&gt;Shariff&lt;/em&gt; auch für die eigene Homepage nutzbar machen, sei es von Hand oder durch entsprechende Ergänzungen des verwendeten CMS oder &lt;em&gt;static site generators&lt;/em&gt;. Wie das aussehen kann, kann man sich bspw. auf meinen Webseiten ansehen.&lt;/p&gt;

&lt;h3 id=&quot;zusammenfassende-linkliste&quot;&gt;Zusammenfassende Linkliste&lt;/h3&gt;

&lt;p&gt;Hier noch einmal die wichtigsten Links zusammengestellt:&lt;/p&gt;

&lt;h4 id=&quot;grundlagen&quot;&gt;Grundlagen&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;a href=&quot;https://netz-rettung-recht.de/archives/1906-Open-Graph-Protocol-und-Twitter-Cards.html&quot; title=&quot;&quot;&gt;Open Graph Protocol und Twitter Cards&lt;/a&gt; bei &lt;em&gt;Netz - Rettung - Recht&lt;/em&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href=&quot;https://ogp.me/&quot; title=&quot;The Open Graph protocol&quot;&gt;The Open Graph protocol&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href=&quot;https://developers.facebook.com/docs/sharing/best-practices&quot; title=&quot;&quot;&gt;Best Practices for Facebook Sharing&lt;/a&gt; &lt;em&gt;(facebook for developers)&lt;/em&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href=&quot;https://developer.twitter.com/en/docs/tweets/optimize-with-cards/guides/getting-started&quot; title=&quot;&quot;&gt;Optimize Tweets with Cards&lt;/a&gt; bei &lt;em&gt;Twitter developers&lt;/em&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h4 id=&quot;share-buttons&quot;&gt;Share-Buttons&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;a href=&quot;https://netz-rettung-recht.de/archives/2077-Shariff-sichere-Sharing-Buttons.html&quot; title=&quot;&quot;&gt;Shariff - sichere Sharing-Buttons&lt;/a&gt; bei &lt;em&gt;Netz - Rettung - Recht&lt;/em&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href=&quot;https://github.com/heiseonline/shariff&quot; title=&quot;GitHub - heiseonline/shariff: 👮 Shariff enables website users to share their favorite content without compromising their privacy. · GitHub&quot;&gt;Shariff&lt;/a&gt;-Repository bei &lt;em&gt;Github&lt;/em&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href=&quot;https://www.heise.de/newsticker/meldung/Datenschutz-und-Social-Media-Der-c-t-Shariff-ist-im-Einsatz-2470103.html&quot; title=&quot;302 Found&quot;&gt;Datenschutz und Social Media: Der c&amp;#8217;t Shariff ist im Einsatz&lt;/a&gt; bei &lt;em&gt;heise online&lt;/em&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;automatisierungsdienste&quot;&gt;Automatisierungsdienste&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;a href=&quot;https://ifttt.com/&quot; title=&quot;IFTTT - Automate business &amp;amp; home&quot;&gt;IFTTT&lt;/a&gt; &lt;em&gt;(&amp;#8220;If This Then That&amp;#8221;)&lt;/em&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href=&quot;https://zapier.com/&quot; title=&quot;&quot;&gt;Zapier&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;-serendipity-plugins&quot;&gt;&lt;em&gt;Serendipity&lt;/em&gt;-Plugins&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;em&gt;Serendipity&lt;/em&gt;-Plugin &lt;a href=&quot;https://spartacus.s9y.org/index.php?mode=bygroups_event_en#serendipity_event_social&quot; title=&quot;Spartacus | Serendipity Blog System&quot;&gt;&lt;em&gt;Sharebuttons&lt;/em&gt;&lt;/a&gt; (&lt;code&gt;serendipity_event_social&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Serendipity&lt;/em&gt;-Plugin &lt;a href=&quot;https://spartacus.s9y.org/index.php?mode=bygroups_event_de#serendipity_event_metadesc&quot; title=&quot;Spartacus | Serendipity Blog System&quot;&gt;&lt;em&gt;HTML Meta-Tags&lt;/em&gt;&lt;/a&gt; (&lt;code&gt;serendipity_event_metadesc&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Serendipity&lt;/em&gt;-Plugin &lt;a href=&quot;https://spartacus.s9y.org/index.php?mode=bygroups_event_de#serendipity_event_twitter&quot; title=&quot;Spartacus | Serendipity Blog System&quot;&gt;&lt;em&gt;Microblogging&lt;/em&gt;&lt;/a&gt; (&lt;code&gt;serendipity_event_twitter&lt;/code&gt;)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;Titelbild © TeraVector - stock.adobe.com&lt;/em&gt;&lt;/p&gt;
&lt;img src=&quot;https://ssl-vg03.met.vgwort.de/na/c987728fb9954d99b44cdf9c989eac50&quot; width=&quot;1&quot; height=&quot;1&quot; alt=&quot;&quot;&gt; 
    </content:encoded>

    <pubDate>Wed, 08 Apr 2020 10:00:00 +0000</pubDate>
    <guid isPermaLink="false">https://netz-rettung-recht.de/archives/2231-guid.html</guid>
    <category>anleitung</category>
<category>facebook</category>
<category>s9y</category>
<category>twitter</category>

</item>
<item>
    <title>Ein Serendipity-Testblog auf dem aktuellen Stand halten</title>
    <link>https://netz-rettung-recht.de/archives/1983-Ein-Serendipity-Testblog-auf-dem-aktuellen-Stand-halten.html</link>
            <category>Bits'n'Bytes</category>
    
    <comments>https://netz-rettung-recht.de/archives/1983-Ein-Serendipity-Testblog-auf-dem-aktuellen-Stand-halten.html#comments</comments>
    <wfw:comment>https://netz-rettung-recht.de/wfwcomment.php?cid=1983</wfw:comment>

    <slash:comments>2</slash:comments>
    <wfw:commentRss>https://netz-rettung-recht.de/rss.php?version=2.0&amp;type=comments&amp;cid=1983</wfw:commentRss>
    

    <author>nospam@example.com (Thomas Hochstein)</author>
    <content:encoded>
    &lt;p&gt;Wenn man das Weblog-System &lt;em&gt;Serendipity&lt;/em&gt; nicht nur nutzt, sondern auch testen möchte, empfiehlt es sich, neben dem &amp;#8220;echten&amp;#8221; eigenen Blog (der Live-Instanz) auch ein Testblog zu betreiben. Dort kann man dann jeweils den neuesten Code aus &lt;em&gt;git&lt;/em&gt; auschecken und testen.&lt;/p&gt;

&lt;p&gt;Um sicherzugehen, dass es sich auch wirklich um einen frischen Checkout handelt und nicht noch irgendwelche Dateien aus früheren Versionen &amp;#8220;herumliegen&amp;#8221;, lösche ich gerne die bisherige Installation und setze sie frisch auf. Dabei sollen aber die Datenbanken sowie vorhandene Plugins und Themes und Medien erhalten bleiben.&lt;/p&gt;

&lt;p&gt;Für diesen Zweck verwende ich ein passendes Shellscript:
&lt;div class=&quot;bash geshi&quot; style=&quot;text-align: left&quot;&gt;&lt;ol&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;&lt;span style=&quot;color: #666666; font-style: italic;&quot;&gt;#!/bin/bash&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;&lt;span style=&quot;color: #7a0874; font-weight: bold;&quot;&gt;cd&lt;/span&gt; &lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;/&lt;/span&gt;var&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;/&lt;/span&gt;www&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;&amp;lt;/&lt;/span&gt;p&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;&amp;#160;&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;&amp;lt;&lt;/span&gt;p&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #7a0874; font-weight: bold;&quot;&gt;echo&lt;/span&gt; &lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&quot;color: #666666; font-style: italic;&quot;&gt;#8220;&amp;amp;#8212;&amp;amp;#8212;&amp;gt; Save config, plugins, themes and uploads &amp;amp;#8230;&amp;amp;#8221;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;&lt;span style=&quot;color: #c20cb9; font-weight: bold;&quot;&gt;tar&lt;/span&gt; &lt;span style=&quot;color: #660033;&quot;&gt;-czf&lt;/span&gt; s9y-testblog-backup.tgz s9y-testblog&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;/&lt;/span&gt;serendipity_config_local.inc.php s9y-testblog&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;/&lt;/span&gt;.htaccess s9y-testblog&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;/&lt;/span&gt;plugins&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;/*&lt;/span&gt; s9y-testblog&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;/&lt;/span&gt;templates&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;/*&lt;/span&gt; s9y-testblog&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;/&lt;/span&gt;uploads&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;/*&amp;lt;/&lt;/span&gt;p&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;&amp;#160;&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;&amp;lt;&lt;/span&gt;p&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #7a0874; font-weight: bold;&quot;&gt;echo&lt;/span&gt; &lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&quot;color: #666666; font-style: italic;&quot;&gt;#8220;&amp;amp;#8212;&amp;amp;#8212;&amp;gt; Downloading &amp;amp;#8230;&amp;amp;#8221;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;&lt;span style=&quot;color: #c20cb9; font-weight: bold;&quot;&gt;wget&lt;/span&gt; https:&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;//&lt;/span&gt;github.com&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;/&lt;/span&gt;s9y&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;/&lt;/span&gt;Serendipity&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;/&lt;/span&gt;archive&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;/&lt;/span&gt;master.zip&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;&amp;lt;/&lt;/span&gt;p&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;&amp;#160;&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;&amp;lt;&lt;/span&gt;p&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #7a0874; font-weight: bold;&quot;&gt;echo&lt;/span&gt; &lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&quot;color: #666666; font-style: italic;&quot;&gt;#8220;&amp;amp;#8212;&amp;amp;#8212;&amp;gt; Unzipping &amp;amp;#8230; (to Serendipity-master/)&amp;amp;#8221;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;&lt;span style=&quot;color: #c20cb9; font-weight: bold;&quot;&gt;unzip&lt;/span&gt; master.zip&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;&amp;lt;/&lt;/span&gt;p&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;&amp;#160;&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;&amp;lt;&lt;/span&gt;p&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #7a0874; font-weight: bold;&quot;&gt;echo&lt;/span&gt; &lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&quot;color: #666666; font-style: italic;&quot;&gt;#8220;&amp;amp;#8212;&amp;amp;#8212;&amp;gt; Deleting current installation &amp;amp;#8230;&amp;amp;#8221;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;&lt;span style=&quot;color: #c20cb9; font-weight: bold;&quot;&gt;rm&lt;/span&gt; &lt;span style=&quot;color: #660033;&quot;&gt;-r&lt;/span&gt; s9y-testblog&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;&lt;span style=&quot;color: #7a0874; font-weight: bold;&quot;&gt;echo&lt;/span&gt; &lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&quot;color: #666666; font-style: italic;&quot;&gt;#8220;&amp;amp;#8212;&amp;amp;#8212;&amp;gt; Restore config, plugins, themes and uploads &amp;amp;#8230;&amp;amp;#8221;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;&lt;span style=&quot;color: #c20cb9; font-weight: bold;&quot;&gt;tar&lt;/span&gt; &lt;span style=&quot;color: #660033;&quot;&gt;-xzf&lt;/span&gt; s9y-testblog-backup.tgz&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;&lt;span style=&quot;color: #7a0874; font-weight: bold;&quot;&gt;echo&lt;/span&gt; &lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&quot;color: #666666; font-style: italic;&quot;&gt;#8220;&amp;amp;#8212;&amp;amp;#8212;&amp;gt; Install new files &amp;amp;#8230;&amp;amp;#8221;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;&lt;span style=&quot;color: #c20cb9; font-weight: bold;&quot;&gt;cp&lt;/span&gt; &lt;span style=&quot;color: #660033;&quot;&gt;-ar&lt;/span&gt; Serendipity-master&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;/*&lt;/span&gt; s9y-testblog&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;/&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;&lt;span style=&quot;color: #7a0874; font-weight: bold;&quot;&gt;echo&lt;/span&gt; &lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&quot;color: #666666; font-style: italic;&quot;&gt;#8220;&amp;amp;#8212;&amp;amp;#8212;&amp;gt; Cleanup &amp;amp;#8230;&amp;amp;#8221;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;&lt;span style=&quot;color: #c20cb9; font-weight: bold;&quot;&gt;rm&lt;/span&gt; master.zip&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;&lt;span style=&quot;color: #c20cb9; font-weight: bold;&quot;&gt;rm&lt;/span&gt; s9y-testblog-backup.tgz &lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;&lt;span style=&quot;color: #c20cb9; font-weight: bold;&quot;&gt;rm&lt;/span&gt; &lt;span style=&quot;color: #660033;&quot;&gt;-r&lt;/span&gt; Serendipity-master&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;/&amp;lt;/&lt;/span&gt;p&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;&amp;#160;&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;&amp;lt;&lt;/span&gt;p&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #7a0874; font-weight: bold;&quot;&gt;echo&lt;/span&gt; &lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&quot;color: #666666; font-style: italic;&quot;&gt;#8220;&amp;amp;#8212;&amp;amp;#8212;&amp;gt; Log last commit&amp;amp;#8221;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;curl https:&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;//&lt;/span&gt;api.github.com&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;/&lt;/span&gt;repos&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;/&lt;/span&gt;s9y&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;/&lt;/span&gt;Serendipity&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;/&lt;/span&gt;commits&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;/&lt;/span&gt;master &lt;span style=&quot;color: #660033;&quot;&gt;-H&lt;/span&gt; &lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&quot;color: #666666; font-style: italic;&quot;&gt;#8220;Accept: application/vnd.github.v3.sha&amp;amp;#8221; &amp;gt; s9y-testblog/COMMIT-ID&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;&lt;/p&gt;

&lt;p&gt;Das Script setzt voraus, dass das Testblog in &lt;code&gt;/var/www/s9y-testblog&lt;/code&gt; installiert wurde; Pfade müssen ansonsten angepasst werden. Es sichert die lokale Konfiguration (einschließlich einer bestehenden &lt;code&gt;.htaccess&lt;/code&gt;-Datei) sowie die Verzeichnisse für Plugins, Themes und die Mediendaten, bevor es die Dateien aus dem aktuellen Master-Branch lädt; die ZIP-Datei wird dann nach &lt;code&gt;Serendipity-master&lt;/code&gt; entpackt. Danach wird das alte Testblog-Verzeichnis gelöscht; dann werden die gesicherten Dateien einkopiert und schließlich der Inhalt des Master-Branches überkopiert. Diese Reihenfolge ist wichtig, damit nicht eventuelle Updates von Plugins oder Templates, die mit dem &lt;em&gt;Serendipity&lt;/em&gt;-Kern verteilt werden, durch das eingespielte Backup überschrieben werden. Am Schluss werden temporäre Dateien gelöscht und die Commit-ID des aktuellen &lt;code&gt;HEAD&lt;/code&gt; des Master-Branches in einer Datei &lt;code&gt;COMMIT-ID&lt;/code&gt; gespeichert. (Klar, da gibt es eine Race-Condition, weil möglicherweise jemand zwischen dem Laden der Daten und der Speicherung der Commit-ID neue Commits gepushed haben kann - für meine Zwecke reicht das aber.)&lt;/p&gt;

&lt;p&gt;Alternativ kann man sich natürlich das Löschen und Neuaufsetzen sparen und einfach nur die neuen Dateien überkopieren; so lässt sich auch der Upgrade-Pfad testen. Das ginge dann vereinfacht so:&lt;/p&gt;

&lt;p&gt;&lt;div class=&quot;bash geshi&quot; style=&quot;text-align: left&quot;&gt;&lt;ol&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;&lt;span style=&quot;color: #666666; font-style: italic;&quot;&gt;#!/bin/bash&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;&lt;span style=&quot;color: #7a0874; font-weight: bold;&quot;&gt;cd&lt;/span&gt; &lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;/&lt;/span&gt;var&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;/&lt;/span&gt;www&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;&amp;lt;/&lt;/span&gt;p&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;&amp;#160;&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;&amp;lt;&lt;/span&gt;h1 &lt;span style=&quot;color: #007800;&quot;&gt;id&lt;/span&gt;=&lt;span style=&quot;color: #ff0000;&quot;&gt;&amp;quot;log-last-commit&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;&amp;gt;&lt;/span&gt;Log &lt;span style=&quot;color: #c20cb9; font-weight: bold;&quot;&gt;last&lt;/span&gt; commit&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;&amp;lt;/&lt;/span&gt;h1&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;&amp;#160;&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;&amp;lt;&lt;/span&gt;p&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;&amp;gt;&lt;/span&gt;curl https:&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;//&lt;/span&gt;api.github.com&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;/&lt;/span&gt;repos&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;/&lt;/span&gt;s9y&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;/&lt;/span&gt;Serendipity&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;/&lt;/span&gt;commits&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;/&lt;/span&gt;master &lt;span style=&quot;color: #660033;&quot;&gt;-H&lt;/span&gt; &lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&quot;color: #666666; font-style: italic;&quot;&gt;#8220;Accept: application/vnd.github.v3.sha&amp;amp;#8221; &amp;gt; s9y-testblog/COMMIT-ID&amp;lt;/p&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;&amp;#160;&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;&amp;lt;&lt;/span&gt;h1 &lt;span style=&quot;color: #007800;&quot;&gt;id&lt;/span&gt;=&lt;span style=&quot;color: #ff0000;&quot;&gt;&amp;quot;update&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;&amp;gt;&lt;/span&gt;Update&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;&amp;lt;/&lt;/span&gt;h1&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;&amp;#160;&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;&amp;lt;&lt;/span&gt;p&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #c20cb9; font-weight: bold;&quot;&gt;wget&lt;/span&gt; https:&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;//&lt;/span&gt;github.com&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;/&lt;/span&gt;s9y&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;/&lt;/span&gt;Serendipity&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;/&lt;/span&gt;archive&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;/&lt;/span&gt;master.zip&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;&lt;span style=&quot;color: #c20cb9; font-weight: bold;&quot;&gt;unzip&lt;/span&gt; master.zip&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;&lt;span style=&quot;color: #c20cb9; font-weight: bold;&quot;&gt;cp&lt;/span&gt; &lt;span style=&quot;color: #660033;&quot;&gt;-ar&lt;/span&gt; Serendipity-master&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;/*&lt;/span&gt; s9y-testblog&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;/&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;&lt;span style=&quot;color: #c20cb9; font-weight: bold;&quot;&gt;rm&lt;/span&gt; master.zip&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;&lt;span style=&quot;color: #c20cb9; font-weight: bold;&quot;&gt;rm&lt;/span&gt; &lt;span style=&quot;color: #660033;&quot;&gt;-r&lt;/span&gt; Serendipity-master&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;/&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;&lt;/p&gt;
&lt;img src=&quot;https://ssl-vg03.met.vgwort.de/na/e53ddc21e67946ba935e5ad6af63f0fe&quot; width=&quot;1&quot; height=&quot;1&quot; alt=&quot;&quot;&gt; 
    </content:encoded>

    <pubDate>Fri, 14 Apr 2017 13:45:00 +0000</pubDate>
    <guid isPermaLink="false">https://netz-rettung-recht.de/archives/1983-guid.html</guid>
    <category>anleitung</category>
<category>s9y</category>

</item>
<item>
    <title>Logfile-Auswertung mit AWStats</title>
    <link>https://netz-rettung-recht.de/archives/1945-Logfile-Auswertung-mit-AWStats.html</link>
            <category>Bits'n'Bytes</category>
    
    <comments>https://netz-rettung-recht.de/archives/1945-Logfile-Auswertung-mit-AWStats.html#comments</comments>
    <wfw:comment>https://netz-rettung-recht.de/wfwcomment.php?cid=1945</wfw:comment>

    <slash:comments>3</slash:comments>
    <wfw:commentRss>https://netz-rettung-recht.de/rss.php?version=2.0&amp;type=comments&amp;cid=1945</wfw:commentRss>
    

    <author>nospam@example.com (Thomas Hochstein)</author>
    <content:encoded>
    &lt;p&gt;Webstatistik &amp;#8220;macht&amp;#8221; man heutzutage, so mein Eindruck, primär live und dann entweder mit &lt;a href=&quot;https://www.google.com/analytics/&quot; title=&quot;301 Moved&quot;&gt;Google Analytics&lt;/a&gt;, oder man legt - auch unter Datenschutzgesichtspunkten - lieber selbst Hand an und greift dann normalerweise zu &lt;a href=&quot;https://piwik.org/&quot; title=&quot;301 Moved Permanently&quot;&gt;Piwik&lt;/a&gt;. So war auch der Tenor der Antworten auf meine zwei Jahre zurückliegende &lt;a href=&quot;https://netz-rettung-recht.de/archives/1767-Wie-macht-man-heute-Webstatistik.html&quot; title=&quot;&quot;&gt;Frage&lt;/a&gt; nach dem &amp;#8220;Stand der Technik&amp;#8221;.&lt;/p&gt;

&lt;p&gt;Dieser Tage habe ich mich gefragt, ob sich nicht viele Fragen auch durch eine bloße Auswertung der Webserver-Logs beantworten lassen, und einmal geschaut, was mir das aus der Vergangenheit noch bekannte &lt;em&gt;&lt;a href=&quot;http://www.awstats.org/&quot; title=&quot;301 Moved Permanently&quot;&gt;AWStats&lt;/a&gt;&lt;/em&gt; so macht. Und siehe da, die Software gibt es noch, und sie bekommt auch noch einmal jährlich ein Update, zumeist mit Daten zu neuen Browserversionen und Webcawlern.&lt;/p&gt;

&lt;p&gt;Es ist auch gar nicht so viel Arbeit, damit einen ganzen Haufen Websites statistisch zu erfassen - wobei ich das folgende als konzeptionelles Beispiel verstanden sehen möchte, nicht als &lt;em&gt;copy&amp;amp;paste&lt;/em&gt;-fähige Anleitung. Man sollte sich bspw. gut überlegen, ob man die Webserver-Logs wirklich weltweit lesbar haben möchte oder nicht lieber anderweitig dafür sorgt, dass &lt;em&gt;AWStats&lt;/em&gt; auf sie zugreifen kann.&lt;/p&gt;

&lt;h4 id=&quot;ein-logfile-pro-virtual-host-&quot;&gt;Ein Logfile pro &lt;em&gt;virtual host&lt;/em&gt;&lt;/h4&gt;

&lt;p&gt;Man definiert im jeweiligen &lt;em&gt;virtual host&lt;/em&gt; ein weiteres &lt;em&gt;CustomLog&lt;/em&gt;, bspw. &lt;code&gt;/var/log/awstats/$domain.log&lt;/code&gt;, wobei &lt;code&gt;$domain&lt;/code&gt; natürlich durch einen passenden Bezeichner zu ersetzen ist. Dabei sollte man daran denken, dort auch das Standard-Logfile, zumeist also wohl &lt;code&gt;/var/log/apache2/access.log&lt;/code&gt;, erneut anzugeben, weil der &lt;em&gt;Apache&lt;/em&gt; sonst nicht &lt;em&gt;zusätzlich&lt;/em&gt; in das weitere Logfile schreibt, sondern &lt;em&gt;nur noch&lt;/em&gt; nach dort.&lt;/p&gt;

&lt;p&gt;Alternativ lässt man die Webserver-Logs nicht in eine Datei schreiben, sondern in ein Script pipen, das dann die eingehenden Logzeilen je nach Domain bzw. Hostnamen in der jeweils passenden Datei speichert - wie auch immer.&lt;/p&gt;

&lt;p&gt;Die zusätzlichen Logfiles müssen für &lt;em&gt;AWStats&lt;/em&gt; lesbar sein!&lt;/p&gt;

&lt;h4 id=&quot;eine-awstats-konfigurationsdatei-pro-virtual-host-&quot;&gt;Eine &lt;em&gt;AWStats&lt;/em&gt;-Konfigurationsdatei pro &lt;em&gt;virtual host&lt;/em&gt;&lt;/h4&gt;

&lt;p&gt;Dann legt man sich für jede Domain (respektive jeden Hostname, respektive jeden &lt;em&gt;virtual host&lt;/em&gt;) eine passende Konfigurationsdatei &lt;code&gt;awstats.$domain.conf&lt;/code&gt; an (wobei man $domain jeweils durch eine passende Bezeichnug ersetzt) - die Konfigurationsdatei kann im selben Verzeichnis wie das Script liegen, in &lt;code&gt;/etc/awstats&lt;/code&gt;, in &lt;code&gt;/usr/local/etc/awstats&lt;/code&gt;, direkt in &lt;code&gt;/etc&lt;/code&gt; oder auch in &lt;code&gt;/etc/opt/awstats&lt;/code&gt;. Legt man die Konfiguration im selben Verzeichnis wie das Script an und will man ebendieses auch über den Webserver aufrufen, empfiehlt es sich, den Zugriff auf die Konfiguration in einer &lt;code&gt;.htaccess&lt;/code&gt;-Datei zu sperren:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&amp;lt;FilesMatch &quot;\.(conf|txt)$&quot;&amp;gt;
 order allow,deny
 deny from all
&amp;lt;/FilesMatch&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Für &lt;em&gt;Apache 2.4&lt;/em&gt; ist diese Syntax bekanntermaßen anzupassen.&lt;/p&gt;

&lt;h4 id=&quot;statistik-erstellen-und-im-web-mit-awstats-anschauen&quot;&gt;Statistik erstellen und im Web mit &lt;em&gt;AWStats&lt;/em&gt; anschauen&lt;/h4&gt;

&lt;p&gt;Danach muss man das Sript nur noch aufrufen: &lt;code&gt;perl /path/to/awstats.pl -config=$domain -update&lt;/code&gt;, wobei freilich statt &lt;code&gt;/path/to/&lt;/code&gt; der richtige Pfad und statt &lt;code&gt;$domain&lt;/code&gt; die zuvor für den Namen der Konfigurationsdatei vergebene Kennung stehen muss. Voilà.&lt;/p&gt;

&lt;p&gt;Die fertige Statistik lässt sich dann durch Aufruf von &lt;code&gt;http://domain.example/cgi-bin/awstats.pl?config=$domain&lt;/code&gt; anzeigen, wenn denn der Webserver von &lt;code&gt;domain.example&lt;/code&gt; entsprechend konfiguriert ist. &amp;#8220;Oberhalb&amp;#8221; von &lt;code&gt;cgi-bin&lt;/code&gt; kann man sich dann noch eine Startseite mit Links zu den einzelnen Statistiken basteln.&lt;/p&gt;

&lt;h4 id=&quot;regelm-ige-aktualisierung-der-statistik-per-cronjob&quot;&gt;Regelmäßige Aktualisierung der Statistik per Cronjob&lt;/h4&gt;

&lt;p&gt;Per Cronjob (bspw. in &lt;code&gt;/usr/local/bin/do-webstats.sh&lt;/code&gt;) lassen sich dann täglich (stündlich, &amp;#8230;) alle Statistiken aktualisieren:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;#!/bin/dash
for i in $domain1 $domain2 $domainX; do
  echo &quot;--- $i&quot;
  perl /path/to/awstats.pl -config=$i -update
done
&lt;/code&gt;&lt;/pre&gt;

&lt;h4 id=&quot;rotation-der-zus-tzlich-f-r-awstats-angelagen-logfiles&quot;&gt;Rotation der zusätzlich für &lt;em&gt;AWStats&lt;/em&gt; angelagen Logfiles&lt;/h4&gt;

&lt;p&gt;Und wenn man die - in unserem Beispiel in &lt;code&gt;/var/log/awstats/&lt;/code&gt; zusätzlich angelegten Logfiles nicht ins unendliche wachsen lassen möchte, sollte man auch &lt;code&gt;logrotate&lt;/code&gt; noch mit einer passenden Konfiguration versehen, bspw. in &lt;code&gt;/etc/logrotate.d/awstats&lt;/code&gt;:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;/var/log/awstats/*.log {
    weekly
    missingok
    rotate 4
    compress
    delaycompress
    notifempty
    # die Logs muessen so erzeugt werden, dass AWStats sie lesen kann!
    create 644 root adm
    sharedscripts
    postrotate
    /etc/init.d/apache2 reload &amp;gt; /dev/null
        endscript
        prerotate
            /usr/local/bin/do-webstats.sh
        endscript
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Für meine Zwecke scheint mir das doch weitgehend auszureichen - vielleicht auch deshalb, weil ich die sonstigen vielfältigen Möglichen, die bspw. &lt;em&gt;Piwik&lt;/em&gt; bietet, nicht recht verstanden habe und/oder nicht nutze.&lt;/p&gt;
&lt;img src=&quot;https://ssl-vg03.met.vgwort.de/na/b2fe279517a8442c85d19e41375d49ab&quot; width=&quot;1&quot; height=&quot;1&quot; alt=&quot;&quot;&gt; 
    </content:encoded>

    <pubDate>Fri, 02 Sep 2016 20:00:00 +0000</pubDate>
    <guid isPermaLink="false">https://netz-rettung-recht.de/archives/1945-guid.html</guid>
    <category>anleitung</category>

</item>
<item>
    <title>letsencrypt jenseits des Webservers</title>
    <link>https://netz-rettung-recht.de/archives/1943-letsencrypt-jenseits-des-Webservers.html</link>
            <category>Bits'n'Bytes</category>
    
    <comments>https://netz-rettung-recht.de/archives/1943-letsencrypt-jenseits-des-Webservers.html#comments</comments>
    <wfw:comment>https://netz-rettung-recht.de/wfwcomment.php?cid=1943</wfw:comment>

    <slash:comments>3</slash:comments>
    <wfw:commentRss>https://netz-rettung-recht.de/rss.php?version=2.0&amp;type=comments&amp;cid=1943</wfw:commentRss>
    

    <author>nospam@example.com (Thomas Hochstein)</author>
    <content:encoded>
    &lt;p&gt;Vor einigen Monaten hatte ich über &lt;em&gt;letsencrypt&lt;/em&gt;, die neue Zertifizierungsstelle für TLS-Zertifikate, &lt;a href=&quot;https://netz-rettung-recht.de/archives/1903-SSLTLS-mit-Lets-Encrypt.html&quot; title=&quot;&quot;&gt;berichtet&lt;/a&gt; und demletzt meine guten Erfahrungen damit &lt;a href=&quot;https://netz-rettung-recht.de/archives/1916-Lets-Encrypt-Updates.html&quot; title=&quot;&quot;&gt;dargestellt&lt;/a&gt;. Doch &lt;em&gt;HTTP&lt;/em&gt; ist ja nicht das einzige Protokoll, das einer Absicherung bedarf. Wie sieht es mit TLS-Zertifikaten für Mail (&lt;em&gt;SMTP&lt;/em&gt; und &lt;em&gt;POP3&lt;/em&gt; oder &lt;em&gt;IMAP&lt;/em&gt;) und News (&lt;em&gt;NNTP&lt;/em&gt;) oder noch andere Dienste aus?&lt;/p&gt;

&lt;p&gt;Grundsätzlich ist das kein Problem: vorhandene Zertifikate mit dem (oder den) passenden Hostnamen müssen nur eingebunden werden.&lt;/p&gt;

&lt;p&gt;In der Folge stelle ich die Vorgehensweise ausgehend von einem &lt;em&gt;Debian&lt;/em&gt;-&lt;em&gt;Jessie&lt;/em&gt;-System aus vor.&lt;/p&gt;

&lt;h3 id=&quot;erhalt-des-zertifikats&quot;&gt;Erhalt des Zertifikats&lt;/h3&gt;

&lt;p&gt;Am einfachsten ist das, wenn unter jedem Hostnamen auch ein Webserver erreichbar ist; dann kann nämlich einfach das &lt;code&gt;webroot&lt;/code&gt;-&lt;a href=&quot;https://certbot.eff.org/docs/using.html#webroot&quot; title=&quot;&quot;&gt;Plugin&lt;/a&gt; verwendet werden. Ist das nicht der Fall, kommen bspw. das &lt;code&gt;manual&lt;/code&gt;-&lt;a href=&quot;https://certbot.eff.org/docs/using.html#manual&quot; title=&quot;&quot;&gt;Plugin&lt;/a&gt; oder das &lt;code&gt;external&lt;/code&gt;-&lt;a href=&quot;https://github.com/marcan/certbot-external&quot; title=&quot;GitHub - marcan/certbot-external: Certbot plugin that uses an external shell script for domain validation · GitHub&quot;&gt;Plugin&lt;/a&gt; in Betracht.&lt;/p&gt;

&lt;h3 id=&quot;installation-des-zertifikats&quot;&gt;Installation des Zertifikats&lt;/h3&gt;

&lt;p&gt;Das bereits - für den Webserver - vorhandene oder neu erhaltene Zertifikat und der zugehörige Schlüssel (
&lt;em&gt;Key&lt;/em&gt;), die üblicherweise im Verzeichnis &lt;code&gt;/etc/letsencrypt/live/domain.example/&lt;/code&gt; liegen, können nun eingebunden werden - entweder das Zertifikat und die ganze Zertifikatskette mit allen Zwischenzertifikaten zusammen in einer Datei (&lt;code&gt;fullchain.pem&lt;/code&gt;), oder das Zertifikat (&lt;code&gt;cert.pem&lt;/code&gt;) und die Zwischenzertifikate (&lt;code&gt;chain.pem&lt;/code&gt;) getrennt, je nachdem, was die Applikation unterstützt.&lt;/p&gt;

&lt;p&gt;Nicht immer ist es aber ohne weiteres möglich, unmittelbar auf die Dateien in &lt;code&gt;/etc/letsencrypt/live/domain.example/&lt;/code&gt; zuzugreifen, die &lt;code&gt;root:root&lt;/code&gt; gehören und aufgrund der Verzeichnisrechte auch nur für &lt;code&gt;root&lt;/code&gt; lesbar sind. Manche Programme (bspw. der Mailserver &lt;em&gt;Exim&lt;/em&gt;) greifen nämlich auf die Zertifikate zu einem Zeitpunkt zu, zu dem sie bereits keine Root-Rechte mehr haben; und es erscheint wenig tunlich, sie in die Gruppe &lt;code&gt;root&lt;/code&gt; aufzunehmen oder gar Zertifikat und Key weltweit lesbar zu machen. Andere Programme wiederum haben ausgesprochen strikte Vorstellungen darüber, welchem Benutzer und/oder welcher Gruppe die Dateien &amp;#8220;gehören&amp;#8221; müssen und wie die Zugriffsrechte auszusehen haben (so z.B. der Newsserver &lt;em&gt;INN&lt;/em&gt;, der erwartet, dass der Key ausschließlich für den User &lt;code&gt;news&lt;/code&gt; lesbar ist). In diesen Fällen wird es m.E. unausweichlich sein, Kopien der Zertifikate und des Keys mit den passenden Rechten anzulegen.&lt;/p&gt;

&lt;h4 id=&quot;-dovecot-&quot;&gt;&lt;em&gt;Dovecot&lt;/em&gt;&lt;/h4&gt;

&lt;p&gt;Der &lt;em&gt;POP3&lt;/em&gt;- und &lt;em&gt;IMAP&lt;/em&gt;-Server &lt;em&gt;Dovecot&lt;/em&gt; greift als &lt;code&gt;root&lt;/code&gt; auf die Zertifikate zu und kann - jedenfalls in seiner in &lt;em&gt;Debian Jessie&lt;/em&gt; enthaltenen Version &lt;em&gt;2.2.13&lt;/em&gt; - die Zertifikatskette (&lt;code&gt;fullchain.pem&lt;/code&gt;) verarbeiten. Es genügt also, Zertifikat und Key einzubinden und die Serverkonfiguration neu einzulesen (&lt;code&gt;service dovecot reload&lt;/code&gt;).&lt;/p&gt;

&lt;h4 id=&quot;-exim-&quot;&gt;&lt;em&gt;Exim&lt;/em&gt;&lt;/h4&gt;

&lt;p&gt;Anders sieht es mit dem &lt;em&gt;SMTP&lt;/em&gt;-Server &lt;em&gt;Exim&lt;/em&gt; aus. Dieser gibt seine Root-Rechte auf, bevor er auf die TLS-Zertifikate zugreift. Immerhin kommt auch er mit &lt;code&gt;fullchain.pem&lt;/code&gt; klar.&lt;/p&gt;

&lt;p&gt;Eine Möglichkeit ist es, Zertifikat und Key in ein passendes Verzeichnis zu kopieren und dann Eigentümer und Rechte (&lt;code&gt;644&lt;/code&gt;!) anzupassen, bspw. so:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;cd /etc/exim4
mkdir certs 
cp /etc/letsencrypt/live/domain.example/fullchain.pem /etc/exim4/certs/
cp /etc/letsencrypt/live/domain.example/privkey.pem /etc/exim4/certs/
service exim4 restart
chown Debian-exim:Debian-exim /etc/exim4/certs/
chown Debian-exim:Debian-exim /etc/exim4/certs/*
chmod 644 /etc/exim4/certs/*
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Ein solches Vorgehen wird dann auch bei jeder Erneuerung der Zertifikate erforderlich (s.u.)!&lt;/p&gt;

&lt;p&gt;Danach genügt es, die Serverkonfiguration neu zu laden (&lt;code&gt;service exim4 reload&lt;/code&gt;) und sich dann zu Testzwecken auf Port 25 zu verbinden und nach dem &lt;code&gt;EHLO&lt;/code&gt; ein &lt;code&gt;STARTTLS&lt;/code&gt; abzusetzen.&lt;/p&gt;

&lt;h4 id=&quot;-inn-&quot;&gt;&lt;em&gt;INN&lt;/em&gt;&lt;/h4&gt;

&lt;p&gt;&lt;em&gt;INN&lt;/em&gt; stellt - jedenfalls in der in &lt;em&gt;Debian Jessie&lt;/em&gt; enthaltenen Version &lt;em&gt;2.5.4&lt;/em&gt; - ganz besondere Ansprüche: jedenfalls der Key muss für den Benutzer &lt;code&gt;news&lt;/code&gt; lesbar sein, und er benötigt &lt;code&gt;cert.pem&lt;/code&gt; und &lt;code&gt;chain.pem&lt;/code&gt; getrennt.&lt;/p&gt;

&lt;p&gt;Umsetzen könnte man das bspw. so:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;cd /etc/news
mkdir certs 
cp /etc/letsencrypt/live/domain.example/cert.pem /etc/news/certs/
cp /etc/letsencrypt/live/domain.example/chain.pem /etc/news/certs/
cp /etc/letsencrypt/live/domain.example/privkey.pem /etc/news/certs/
chown news:news /etc/news/certs/*
chmod 600 /etc/news/certs/*
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Auch hier muss man dieses Vorgehen für eine Erneuerung der Zertifikate im Blick behalten (s.u.).&lt;/p&gt;

&lt;p&gt;Ein Einlesen der &lt;code&gt;inn.conf&lt;/code&gt; später (&lt;code&gt;service inn2 restart&lt;/code&gt;) sollte dann alles funktionieren wie geplant.&lt;/p&gt;

&lt;h3 id=&quot;zertifikat-updates&quot;&gt;Zertifikat-Updates&lt;/h3&gt;

&lt;p&gt;Die nunmehr im Dateisystem verstreuten Zertifikatskopien müssen nach jeder Erneuerung des Zertifikats gleichfalls erneuert werden, damit nicht ein ungültiges Zertifikat ausgeliefert wird. Sinnvollerweise geschieht das ebenso automatisiert wie die Erneuerung des Zertifikats; hilfreich dabei die Möglichkeit, &lt;code&gt;letsencrypt&lt;/code&gt; (bzw. &lt;code&gt;certbot&lt;/code&gt;) mittels &lt;code&gt;--post-hook&lt;/code&gt; nach einem Zertifikatsaustausch ein Script ablaufen zu lassen.&lt;/p&gt;

&lt;h4 id=&quot;-exim-&quot;&gt;&lt;em&gt;Exim&lt;/em&gt;&lt;/h4&gt;

&lt;p&gt;Man könnte sich daher bspw. eine Datei &lt;code&gt;/usr/local/bin/certbot-exim4-renew.sh&lt;/code&gt; mit folgendem Inhalt anlegen:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;#!/bin/dash
cp /etc/letsencrypt/live/domain.example/fullchain.pem /etc/exim4/certs/
cp /etc/letsencrypt/live/domain.example/privkey.pem /etc/exim4/certs/
service exim4 reload
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Dazu passt dann ein &lt;em&gt;Cron&lt;/em&gt;-Eintrag der folgenden Art:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;certbot certonly --quiet -n --webroot -w /var/www/domain.example -d domain.example --keep-until-expiring --post-hook /usr/local/bin/certbot-exim4-renew.sh
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Damit wird versucht, das Zertifikat für diesen Hostnamen (&lt;code&gt;domain.example&lt;/code&gt;) zu erneuern, jedoch nur, wenn es der Erneuerung bedürftig ist.&lt;/p&gt;

&lt;p&gt;Der Aufruf sollte in der &lt;em&gt;Crontab&lt;/em&gt; zeitlich &lt;em&gt;vor&lt;/em&gt; dem allgemeinen Aufruf &lt;code&gt;certbot renew --quiet&lt;/code&gt; erfolgen, damit erst das spezielle Zertifikat aktualisiert (und ggf. umkopiert) wird und danach die übrigen.&lt;/p&gt;

&lt;h4 id=&quot;-inn-&quot;&gt;&lt;em&gt;INN&lt;/em&gt;&lt;/h4&gt;

&lt;p&gt;Für den &lt;em&gt;INN&lt;/em&gt; sähe diese Lösung analog mit einer Datei &lt;code&gt;/usr/local/bin/certbot-inn2-renew.sh&lt;/code&gt; so aus:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;#!/bin/dash
cp /etc/letsencrypt/live/domain.example/cert.pem /etc/news/certs
cp /etc/letsencrypt/live/domain.example/chain.pem /etc/news/certs
cp /etc/letsencrypt/live/domain.example/privkey.pem /etc/news/certs
cd /etc/news/certs
chown news:news *.pem
chmod 600 *.pem
service inn2 reload
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Der &lt;em&gt;Cron&lt;/em&gt;-Eintrag wäre dann entsprechend:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;certbot certonly --quiet -n --webroot -w /var/www/domain.example -d domain.example --keep-until-expiring --post-hook /usr/local/bin/certbot-inn2-renew.sh
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Auch dieser Eintrag muss zeitlich &lt;em&gt;vor&lt;/em&gt; dem allgemeinen Aufruf &lt;code&gt;certbot renew --quiet&lt;/code&gt; liegen.&lt;/p&gt;

&lt;h3 id=&quot;und-ihr-&quot;&gt;Und ihr?&lt;/h3&gt;

&lt;p&gt;So richtig optimal erscheinen mir diese Lösungen noch nicht. Gibt es bessere Ideen? Andere Erfahrungen?&lt;/p&gt;

&lt;p&gt;Nutzt ihr &lt;em&gt;letsencrypt&lt;/em&gt; noch für andere Dienste als die oben genannten?&lt;/p&gt;

&lt;p&gt;An Euren Erfahrungen und Lösungen wäre ich interessiert und freue mich daher über Kommentare, Hinweise und Ergänzungen.&lt;/p&gt;
&lt;img src=&quot;https://ssl-vg03.met.vgwort.de/na/ab58b7fdf4c749689ad4f6dde41d970a&quot; width=&quot;1&quot; height=&quot;1&quot; alt=&quot;&quot;&gt; 
    </content:encoded>

    <pubDate>Tue, 30 Aug 2016 14:30:00 +0000</pubDate>
    <guid isPermaLink="false">https://netz-rettung-recht.de/archives/1943-guid.html</guid>
    <category>anleitung</category>
<category>debian</category>
<category>dovecot</category>
<category>exim</category>
<category>followerpower</category>
<category>inn</category>
<category>jessie</category>
<category>ssl</category>

</item>
<item>
    <title>Open Graph Protocol und Twitter Cards</title>
    <link>https://netz-rettung-recht.de/archives/1906-Open-Graph-Protocol-und-Twitter-Cards.html</link>
            <category>Bits'n'Bytes</category>
    
    <comments>https://netz-rettung-recht.de/archives/1906-Open-Graph-Protocol-und-Twitter-Cards.html#comments</comments>
    <wfw:comment>https://netz-rettung-recht.de/wfwcomment.php?cid=1906</wfw:comment>

    <slash:comments>0</slash:comments>
    <wfw:commentRss>https://netz-rettung-recht.de/rss.php?version=2.0&amp;type=comments&amp;cid=1906</wfw:commentRss>
    

    <author>nospam@example.com (Thomas Hochstein)</author>
    <content:encoded>
    &lt;p&gt;Die sozialen Netzwerke - Facebook, aber auch Twitter - besetzen zunehmend den Platz, den bisher andere, offenere Dienste eingenommen habe. Auf Twitter wird diskutiert; Facebook dient sowieso als allgemeine Informationsquelle, Veröffentlichungsplattform, Diskussions- und Kommunikationsmedium, zum Spielen pp. Das ist - glücklicherweise - nicht jedermanns Sache, aber unstrittig ist wohl, dass beide Netzwerke Reichweite haben und auch schaffen können.&lt;/p&gt;

&lt;p&gt;Es ist also grundsätzlich keine schlechte Idee, Verweise auf aktuelle Beiträge, bspw. im eigenen Blog, auch dort zu veröffentlichen, was den RSS- oder Atom-Feed nicht ersetzt, ihn aber ergänzen kann. Tweets und Facebook-Posts kann man leicht und ohne Medienbruch an die eigenen Leser weitergeben (Retweet, Sharing), positiv hervorheben und - für die eigene Leserschaft - kommentieren. Ich vermute, dass manch einer RSS gar nicht mehr kennt oder nutzt und auch Blogs allein auf Facebook oder Twitter folgt. Kein Wunder also, dass aktuelle Blogsysteme über Plugins verfügen, die neue Beiträge auf Twitter und/oder Facebook veröffentlichen können (hat &lt;em&gt;Serendipity&lt;/em&gt; eigentlich ein Plugin für Facebook?), und sonst hilft oft &lt;a href=&quot;http://ifttt.com/&quot; title=&quot;301 Moved Permanently&quot;&gt;IFTTT&lt;/a&gt; (&lt;em&gt;If this, then that&lt;/em&gt;) weiter.&lt;/p&gt;

&lt;p&gt;In gleicher Weise kann man aber natürlich auch Hinweise auf andere Seiten aus dem eigenen Webangebot veröffentlichen bzw. - im Jargon der Sozialen Netzwerke - diese Seiten teilen, manuell oder automatisiert: ein neues Tutorial, die Ankündigung einer Tagung oder eines Vortrags, die Einladung zur Mitgliederversammlung oder zum Stammtisch, oder was auch immer von Interesse für andere auf dem jeweiligen Kanal sein könnte und nicht in einem Blogeintrag steckt. Wer das schon ausprobiert hat, wird sich vermutlich darüber gewundert haben, wie es anderen gelingt, diese Ankündigungen mit einem Teaser und einem passenden Bild zu versehen - oder etwas verstört irgendein kleines Icon von der betreffenden Seite plötzlich verzerrt in Übergröße als Vorschaubild wiedergesehen haben (gerne genommen: der stilisierte Briefumschlag, der eine Mailadresse kennzeichnet - oder gar ein Zählpixel). Woran liegt das, und wie macht man das richtig?&lt;/p&gt;

&lt;p&gt;Der Schlüssel zur Antwort findet sich in einem &lt;a href=&quot;https://netz-rettung-recht.de/archives/1889-Wellenreiten-122015.html#c3999&quot; title=&quot;&quot;&gt;Kommentar&lt;/a&gt; zu einem älteren Blogeintrag: das &lt;em&gt;&lt;a href=&quot;http://ogp.me/&quot; title=&quot;301 Moved Permanently&quot;&gt;Open Graph protocol&lt;/a&gt;&lt;/em&gt;.&lt;/p&gt;

&lt;h3 id=&quot;open-graph-protocol&quot;&gt;Open Graph Protocol&lt;/h3&gt;

&lt;p&gt;&lt;a href=&quot;https://de.scribd.com/doc/30715288/The-Open-Graph-Protocol-Design-Decisions&quot; title=&quot;Understanding the Open Graph Protocol | PDF | Computers&quot;&gt;Entwickelt von Facebook&lt;/a&gt; bietet das &lt;em&gt;Open Graph Protocol&lt;/em&gt; u.a. die Möglichkeit, zu kontrollieren, welche Daten Facebook beim &amp;#8220;Teilen&amp;#8221; der Seite&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;für die Überschrift (&amp;#8220;title&amp;#8221;),&lt;/li&gt;
&lt;li&gt;als Teaser (&amp;#8220;description&amp;#8221;) und&lt;/li&gt;
&lt;li&gt;als Vorschaubild (&amp;#8220;image&amp;#8221;),&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;verwendet, und außerdem&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;die Art der Seite (Webseite, Artikel, Profilseite, Seite über einen Film oder Song, &amp;#8230;),&lt;/li&gt;
&lt;li&gt;die kanonische URL,&lt;/li&gt;
&lt;li&gt;die verwendete(n) Sprache(n),&lt;/li&gt;
&lt;li&gt;&amp;#8230;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;anzugeben, indem entsprechende &lt;code&gt;&amp;lt;meta&amp;gt;&lt;/code&gt;-Tags in den Kopfbereich (&lt;code&gt;&amp;lt;head&amp;gt;...&amp;lt;/head&amp;gt;&lt;/code&gt;) des Webdokuments eingefügt werden.&lt;/p&gt;

&lt;p&gt;Diese haben eine Form à la &lt;code&gt;&amp;lt;meta property=&quot;og:title&quot; content=&quot;Alles über das Open Graph Protocol&quot; /&amp;gt;&lt;/code&gt; und können natürlich durchaus automatisch erzeugt werden - so machen das die Blogsysteme, wenn sie denn diese Funktionalität bieten. Die Zeichenfolge &lt;code&gt;og&lt;/code&gt; steht dabei für &amp;#8220;Open Graph&amp;#8221;, und der nach einem Doppelpunkt folgende Bezeichner gibt an, welche Eigenschaft in der Folge näher beschrieben wird.&lt;/p&gt;

&lt;h4 id=&quot;definition-und-ein-beispiel&quot;&gt;Definition und ein Beispiel&lt;/h4&gt;

&lt;p&gt;Die komplette Definition des Protokolls findet sich natürlich online: &lt;strong&gt;&lt;a href=&quot;http://ogp.me/&quot; title=&quot;301 Moved Permanently&quot;&gt;The Open Graph protocol&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Ein Beispiel für die konkrete Anwendung bietet bspw. die Stuttgarter Zeitung, deren CMS entsprechende Metadaten (und offenbar direkt auch ein angepasstes Bild) generiert, hier für den Artikel &amp;#8220;&lt;a href=&quot;http://www.stuttgarter-zeitung.de/inhalt.ex-ob-von-stuttgart-manfred-rommel-ist-tot.3bde9a2b-d7ad-4e33-b17a-6267394c76f5.html&quot; title=&quot;301 Moved Permanently&quot;&gt;Manfred Rommel ist tot&lt;/a&gt;&amp;#8221;:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&amp;lt;meta property=&quot;og:type&quot; content=&quot;article&quot; /&amp;gt;
&amp;lt;meta property=&quot;og:title&quot; content=&quot;Ex-OB von Stuttgart: Manfred Rommel ist tot - Stuttgarter Zeitung&quot; /&amp;gt;
&amp;lt;meta property=&quot;og:image&quot; content=&quot;http://www.stuttgarter-zeitung.de/media.facebook.cea3625e-2911-40c9-9c88-68af6718f64f.normalized.jpg&quot; /&amp;gt;           
&amp;lt;meta property=&quot;og:description&quot; content=&quot; Der frühere Stuttgarter Oberbürgermeister Manfred Rommel (CDU) ist tot. „Wir haben einen großen Oberbürgermeister und einen ganz besonderen Bürger verloren. Die Stadt ist in tiefer Trauer“, würdigte Fritz Kuhn (Grüne) den früheren OB. &quot; /&amp;gt;
&amp;lt;meta property=&quot;og:site_name&quot; content=&quot;stuttgarter-zeitung.de&quot;&amp;gt;
&amp;lt;meta property=&quot;og:section&quot; content=&quot; - Stuttgart&quot;&amp;gt; 
&amp;lt;meta property=&quot;og:locale&quot; content=&quot;de_DE&quot;&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Es handelt sich dabei um einen &lt;code&gt;article&lt;/code&gt;, der einen bestimmten &lt;code&gt;title&lt;/code&gt; und eine &lt;code&gt;description&lt;/code&gt; hat, die dann als Teaser ausgegeben wird. Außerdem wird ein Bild (&lt;code&gt;image&lt;/code&gt;) in geeigneter Größe übermittelt; der Name der Website, deren Unterbereich (&lt;code&gt;section&lt;/code&gt;) und die Angabe der Sprache sollen auch nicht fehlen.&lt;/p&gt;

&lt;p&gt;So sieht das dann bei Facebook aus:&lt;/p&gt;

&lt;div class=&quot;serendipity_imageComment_center&quot; style=&quot;width: 546px&quot;&gt;&lt;div class=&quot;serendipity_imageComment_img&quot;&gt;&lt;!-- s9ymdb:415 --&gt;&lt;img class=&quot;serendipity_image_center&quot; width=&quot;546&quot; height=&quot;471&quot;  src=&quot;https://netz-rettung-recht.de/uploads/articles/2016/sz-example-facebook1.png&quot;  alt=&quot;SZ auf Facebook geteilt&quot;&gt;&lt;/div&gt;&lt;div class=&quot;serendipity_imageComment_txt&quot;&gt;Artikel aus der Stuttgarter Zeitung, geteilt auf Facebook&lt;/div&gt;&lt;/div&gt;

&lt;h4 id=&quot;probieren-geht-ber-studieren&quot;&gt;Probieren geht über Studieren&lt;/h4&gt;

&lt;p&gt;Facebook bietet zum Ausprobieren einen &lt;em&gt;&lt;a href=&quot;https://developers.facebook.com/tools/debug/&quot; title=&quot;&quot;&gt;Debugger&lt;/a&gt;&lt;/em&gt; an. Der zeigt nicht nur, welche Informationen aus den Metadaten extrahiert wurden, sondern auch, wie das Ergebnis voraussichtlich aussehen wird.&lt;/p&gt;

&lt;p&gt;Zudem wird auf diese Weise - wichtig! - der interne Bild-Cache gelöscht. Hat man nämlich einmal einen Link geteilt, wird das Vorschaubild gecached; versucht man ihn nach dem Ändern des Bildes erneut zu teilen, erscheint daher wieder das alte Bild. Auch hier kommt der &lt;em&gt;Debugger&lt;/em&gt; zur Hilfe.&lt;/p&gt;

&lt;h4 id=&quot;hinweise-und-tipps-f-r-die-eigene-anwendung&quot;&gt;Hinweise und Tipps für die eigene Anwendung&lt;/h4&gt;

&lt;p&gt;Bei der Auswahl der Texte für Überschrift und Teaser und des Vorschaubilds sollte man u.a. folgendes beachten:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Die Länge der Überschrift begrenzt Facebook bei mehr als 100 Zeichen auf 88 Zeichen. Am besten sollte sie nicht länger als 60-90 Zeichen werden.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Auch der Teaser ist beschränkt auf maximal 300 Zeichen, danach wird er von Facebook verkürzt.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Überschrift (&amp;#8220;title&amp;#8221;) und Teaser (&amp;#8220;description&amp;#8221;) können, müssen aber inhaltlich nicht den entsprechenden HTML-Elementen (&lt;code&gt;&amp;lt;title&amp;gt;...&amp;lt;/title&amp;gt;&lt;/code&gt; und &lt;code&gt;&amp;lt;meta name=&quot;description&quot; content=&quot;...&quot; /&lt;/code&gt;&gt;) entsprechen.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Bilder mit Abmessung ab 600 x 315&amp;#160;px werden als große Bilder im Querformat angezeigt. Empfohlen werden für diesen Zweck Bilder ab 1.200 x 630&amp;#160;px - im Format 1.91:1, wenn möglich.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Alternativ kann ein kleines Bild verwendet werden, das dann nicht über, sondern links neben dem Text erscheint.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Kleiner als 200 x 200&amp;#160;px dürfen die Bilder nicht sein.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Beschnitten werden Bilder ggf. an den Seiten - graphische Elemente oder Text also am besten zentrieren!&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Die Maximalgröße für Bilder liegt bei 8&amp;#160;MB. Aber auch hier ist natürlich weniger immer mehr!&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Links zu weiteren Tipps sind am Ende des Beitrags gesammelt.&lt;/p&gt;

&lt;p&gt;Nicht vergessen: bei Änderungen des Vorschaubildes über den &lt;em&gt;Debugger&lt;/em&gt; den &lt;strong&gt;Bild-Cache aktualisieren&lt;/strong&gt; lassen! Das betrifft allerdings nur neu geteilte Beiträge; in bestehenden Einträgen verbleibt das alte Bild.&lt;/p&gt;

&lt;h3 id=&quot;twitter-cards&quot;&gt;Twitter Cards&lt;/h3&gt;

&lt;p&gt;Es wäre jetzt offenkundig viel zu einfach, wenn Twitter, das andere große &lt;em&gt;Social Network&lt;/em&gt;, die &lt;em&gt;Open-Graph&lt;/em&gt;-Daten von Facebook ebenfalls auswerten würde. Aber nein! Das geht natürlich keineswegs. Da muss etwas eigenes her. Twitter hat deshalb stattdessen die &lt;strong&gt;Twitter Cards&lt;/strong&gt; erfunden.&lt;/p&gt;

&lt;p&gt;Ganz so schlimm ist es aber nicht - immerhin werden Überschrift, Teaser und das Bild aus den &lt;em&gt;Open-Graph&lt;/em&gt;-Daten übernommen, wenn man sie nicht nochmals angibt. Freilich kann man diese Einträge auch für Facebook und Twitter getrennt setzen und so ggf. unterschiedliche Schwerpunkte für Twitter-Follower und Facebook-Freunde schaffen. Twitter bietet zudem ebenfalls verschiedene Arten von Karten an, ähnlich wie Facebook unterschiedliche Typen von &lt;em&gt;Open-Graph&lt;/em&gt;-Objekten kennt; zumeist dürfte die &amp;#8220;Summary&amp;#8221;-Card aber die richtige Wahl sein.&lt;/p&gt;

&lt;p&gt;Einen Unterschied gibt es zu Facebook: die Nutzung von &lt;em&gt;Twitter Cards&lt;/em&gt; muss für jede Website beim ersten Mal freigeschaltet werden, was über den &lt;em&gt;Validator&lt;/em&gt; (s.u.) möglich ist.&lt;/p&gt;

&lt;h4 id=&quot;definition-und-ein-beispiel&quot;&gt;Definition und ein Beispiel&lt;/h4&gt;

&lt;p&gt;Auch für &lt;em&gt;Twitter Cards&lt;/em&gt; gibt es natürlich eine Dokumentation: &lt;a href=&quot;https://dev.twitter.com/cards/overview&quot; title=&quot;&quot;&gt;Twitter Cards&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Das oben bereits verwendete Beispiel aus der Stuttgarter Zeitung sieht dann - für Twitter - im Quellcode so aus:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&amp;lt;meta name=&quot;twitter:card&quot; content=&quot;summary&quot;&amp;gt;
&amp;lt;meta name=&quot;twitter:site&quot; content=&quot;@StZ_News&quot;&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Für den Rest verlässt die Stuttgarter Zeitung sich auf die &lt;em&gt;Open-Graph&lt;/em&gt;-Daten.&lt;/p&gt;

&lt;p&gt;Das Ergebnis sieht dann wie folgt aus:&lt;/p&gt;

&lt;div class=&quot;serendipity_imageComment_center&quot; style=&quot;width: 521px&quot;&gt;&lt;div class=&quot;serendipity_imageComment_img&quot;&gt;&lt;!-- s9ymdb:416 --&gt;&lt;img class=&quot;serendipity_image_center&quot; width=&quot;521&quot; height=&quot;141&quot;  src=&quot;https://netz-rettung-recht.de/uploads/articles/2016/sz-example-twitter1.png&quot;  alt=&quot;SZ auf Twitter geteilt&quot;&gt;&lt;/div&gt;&lt;div class=&quot;serendipity_imageComment_txt&quot;&gt;Artikel aus der Stuttgarter Zeitung, geteilt auf Twitter&lt;/div&gt;&lt;/div&gt;

&lt;h4 id=&quot;probieren-geht-ber-studieren&quot;&gt;Probieren geht über Studieren&lt;/h4&gt;

&lt;p&gt;Auch Twitter bietet einen &lt;em&gt;&lt;a href=&quot;https://cards-dev.twitter.com/validator&quot; title=&quot;&quot;&gt;Validator&lt;/a&gt;&lt;/em&gt; an. Dessen Nutzung ist insofern zumindest beim ersten Mal verpflichtend, weil darüber auch die Freischaltung der jeweiligen Website für &lt;em&gt;Twitter Cards&lt;/em&gt; angestoßen wird, die für die erste Verwendung erforderlich ist.&lt;/p&gt;

&lt;h4 id=&quot;hinweise-und-tipps&quot;&gt;Hinweise und Tipps&lt;/h4&gt;

&lt;p&gt;Twitter hat natürlich nicht soviel Platz wie Facebook - daher gilt:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Die Länge der Überschrift ist auf 70 Zeichen begrenzt.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Der Teaser darf nicht länger als 200 Zeichen werden.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Es ist möglich, entweder ein großes oder ein kleines Vorschaubild zu übermitteln; die Auswahl trifft Twitter nicht automatisch, vielmehr muss sich der Nutzer für eine &lt;em&gt;&lt;a href=&quot;https://dev.twitter.com/cards/types/summary&quot; title=&quot;&quot;&gt;Summary Card&lt;/a&gt;&lt;/em&gt; oder eine &lt;em&gt;&lt;a href=&quot;https://dev.twitter.com/cards/types/summary-large-image&quot; title=&quot;&quot;&gt;Summary Card with Large Image&lt;/a&gt;&lt;/em&gt; entscheiden.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&amp;#8220;Große&amp;#8221; Bilder müssen mindestens 280 x 150&amp;#160;px groß sein.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Alle Bilder dürfen maximal eine Dateigröße von 1&amp;#160;MB erreichen.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Werden &lt;em&gt;title&lt;/em&gt;, &lt;em&gt;description&lt;/em&gt; und &lt;em&gt;image&lt;/em&gt; für Facebook und Twitter verwendet, müssen sie logischerweise den Vorgaben &lt;em&gt;beider&lt;/em&gt; Unternehmen (insbesondere für die Länge bzw. die Abmessungen) genügen.&lt;/p&gt;

&lt;h3 id=&quot;weiterer-lesestoff&quot;&gt;Weiterer Lesestoff&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Kissmetrics Blog: &lt;a href=&quot;https://blog.kissmetrics.com/open-graph-meta-tags/&quot; title=&quot;&quot;&gt;What You Need to Know About Open Graph Meta Tags for Total Facebook and Twitter Mastery&lt;/a&gt;&lt;br /&gt;
Eine anwendungsorientierte Zusammenstellung der wesentlichen Informationen zur Nutzung von &lt;em&gt;Open Graph&lt;/em&gt; und &lt;em&gt;Twitter Cards&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h4 id=&quot;open-graph-und-facebook&quot;&gt;Open Graph und Facebook&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://ogp.me/&quot; title=&quot;301 Moved Permanently&quot;&gt;The Open Graph protocol&lt;/a&gt;&lt;br /&gt;
Die komplette Definition des Protokolls mit einer Vielzahl weiterführender Links.&lt;/li&gt;
&lt;li&gt;Facebook: &lt;a href=&quot;https://developers.facebook.com/docs/sharing/best-practices&quot; title=&quot;&quot;&gt;Sharing Best Practices for Websites &amp;amp; Mobile Apps&lt;/a&gt;&lt;br /&gt;
Hier finden sich u.a. Angaben zu den Maximallängen und -größen für Texte und Bilder.&lt;/li&gt;
&lt;li&gt;Facebooks &lt;a href=&quot;https://developers.facebook.com/tools/debug/&quot; title=&quot;&quot;&gt;Debugger&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Tibor Martini: &lt;a href=&quot;https://tibormartini.de/blog/facebook-vorschaubild-falsch-oder-wird-nicht-angezeigt/&quot; title=&quot;301 Moved Permanently&quot;&gt;Facebook: Vorschaubilder neu einlesen und neue Vorschaubilder gezielt festlegen&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Schnatterente: &lt;a href=&quot;http://www.schnatterente.net/webdesign/facebook-link-vorschau-bild-aktualisieren&quot; title=&quot;&quot;&gt;Facebook: Link-Vorschau (Bild) aktualisieren&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h4 id=&quot;twitter-cards&quot;&gt;Twitter Cards&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://dev.twitter.com/cards/overview&quot; title=&quot;&quot;&gt;Twitter Cards&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Twitters &lt;a href=&quot;https://cards-dev.twitter.com/validator&quot; title=&quot;&quot;&gt;Card Validator&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;img src=&quot;https://ssl-vg03.met.vgwort.de/na/3e3126f43bc746c6a1561d6da607c04f&quot; width=&quot;1&quot; height=&quot;1&quot; alt=&quot;&quot;&gt; 
    </content:encoded>

    <pubDate>Thu, 28 Apr 2016 05:45:00 +0000</pubDate>
    <guid isPermaLink="false">https://netz-rettung-recht.de/archives/1906-guid.html</guid>
    <category>anleitung</category>
<category>facebook</category>
<category>twitter</category>

</item>
<item>
    <title>PHP-FPM - jetzt mit mod_proxy_fcgi</title>
    <link>https://netz-rettung-recht.de/archives/1909-PHP-FPM-jetzt-mit-mod_proxy_fcgi.html</link>
            <category>Bits'n'Bytes</category>
    
    <comments>https://netz-rettung-recht.de/archives/1909-PHP-FPM-jetzt-mit-mod_proxy_fcgi.html#comments</comments>
    <wfw:comment>https://netz-rettung-recht.de/wfwcomment.php?cid=1909</wfw:comment>

    <slash:comments>7</slash:comments>
    <wfw:commentRss>https://netz-rettung-recht.de/rss.php?version=2.0&amp;type=comments&amp;cid=1909</wfw:commentRss>
    

    <author>nospam@example.com (Thomas Hochstein)</author>
    <content:encoded>
    &lt;p&gt;Vergangene Woche hatte ich darüber &lt;a href=&quot;https://netz-rettung-recht.de/archives/1905-PHP-FPM-mit-Debian-Jessie.html&quot; title=&quot;&quot;&gt;berichtet&lt;/a&gt;, wie man - unter &lt;em&gt;Debian Jessie&lt;/em&gt; - &lt;em&gt;PHP-FPM&lt;/em&gt; mit &lt;code&gt;mod_fastcgi&lt;/code&gt; installieren kann. In den &lt;a href=&quot;https://netz-rettung-recht.de/archives/1905-PHP-FPM-mit-Debian-Jessie.html#c4081&quot; title=&quot;&quot;&gt;Kommentaren&lt;/a&gt; hatte &lt;a href=&quot;https://www.svenhartge.de/&quot; title=&quot;&quot;&gt;Sven&lt;/a&gt; mir dann nachfolgend erläutert, wie sich die Einbindung einfacher und besser über &lt;code&gt;mod_proxy_fcgi&lt;/code&gt; lösen lässt, vorausgesetzt, man hat (wie in &lt;em&gt;Debian Jessie&lt;/em&gt;) einen &lt;em&gt;Apache 2.4&lt;/em&gt; vor sich.&lt;/p&gt;

&lt;p&gt;Da mir das ebenfalls vorzugswürdig erscheint, beschreiben ich in der Folge nunmehr diese Variante.&lt;/p&gt;

&lt;h3 id=&quot;-php-fpm-und-mod-proxy-fcgi-installieren&quot;&gt;&lt;em&gt;PHP-FPM&lt;/em&gt; und &lt;code&gt;mod_proxy_fcgi&lt;/code&gt; installieren&lt;/h3&gt;

&lt;p&gt;Unter &lt;em&gt;Debian Jessie&lt;/em&gt; ist die Installation der Pakete hinreichend einfach:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;apt-get install php5-fpm php5
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;em&gt;Debian&lt;/em&gt; hinterlegt dabei die &lt;code&gt;php.ini&lt;/code&gt; für die &lt;em&gt;FastCGI&lt;/em&gt;-Prozesse unter &lt;code&gt;/etc/php5/fpm/php.ini&lt;/code&gt; und die Konfiguration für &lt;em&gt;FPM&lt;/em&gt; unter &lt;code&gt;/etc/php5/fpm/php-fpm.conf&lt;/code&gt;, ergänzt u.a. um die Konfiguration installierter Module in &lt;code&gt;/etc/php5/fpm/conf.d/&lt;/code&gt;, wie man das so kennt.&lt;/p&gt;

&lt;p&gt;Im Verzeichnis &lt;code&gt;/etc/php5/fpm/pool.d/&lt;/code&gt; sind dann die einzelnen Pools definiert, die ebenfalls in die &lt;code&gt;/etc/php5/fpm/php-fpm.conf&lt;/code&gt; inkludiert werden, standardmäßig nur der Pool des Benutzers &lt;code&gt;www-data&lt;/code&gt;, unter dem der Webserver läuft.&lt;/p&gt;

&lt;h3 id=&quot;-mod-proxy-fcgi-f-r-php-fpm-konfigurieren&quot;&gt;&lt;code&gt;mod_proxy_fcgi&lt;/code&gt; für &lt;em&gt;PHP-FPM&lt;/em&gt; konfigurieren&lt;/h3&gt;

&lt;p&gt;Serverweit lässt sich &lt;em&gt;PHP-FPM&lt;/em&gt; dann wie folgt in einer neuen Datei &lt;code&gt;/etc/apache2/conf-available/php5-fpm.conf&lt;/code&gt; konfigurieren:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&amp;lt;IfModule mod_proxy_fcgi.c&amp;gt;
    &amp;lt;Proxy &quot;unix:/var/run/php5-fpm.sock|fcgi://php-fpm&quot;&amp;gt;
        # we must declare a (any) parameter in here 
        # or it won&#039;t register the proxy ahead of time
        ProxySet disablereuse=off
    &amp;lt;/Proxy&amp;gt;
    &amp;lt;FilesMatch &quot;.+\.php$&quot;&amp;gt;
        SetHandler proxy:fcgi://php-fpm
    &amp;lt;/FilesMatch&amp;gt;
&amp;lt;/IfModule&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Auf diese Weise werden auf &lt;code&gt;.php&lt;/code&gt; endende Dateien an den darüber definierten Prxoy durchgereicht. Wer will, kann stattdessen bspw. auch &lt;code&gt;&amp;lt;FilesMatch &quot;.+\.ph(p[345]?|t|tml)$&quot;&amp;gt;&lt;/code&gt; verwenden, wie Sven das empfohlen hat; das deckt auch alle anderen gebräuchlichen Endungen für &lt;em&gt;PHP&lt;/em&gt;-Scripts ab.&lt;/p&gt;

&lt;p&gt;Standardmäßig sorgt Debian übrigens dafür, dass das - mitinstallierte - Modul &lt;code&gt;mod_proxy&lt;/code&gt; &lt;em&gt;nicht&lt;/em&gt; als &lt;em&gt;forward proxy&lt;/em&gt; arbeitet; das ist in der Datei &lt;code&gt;/etc/apache2/mods-available/proxy.conf&lt;/code&gt; konfiguriert und stellt also kein Problem dar.&lt;/p&gt;

&lt;p&gt;Nach Aktivieren des Moduls und der Konfiguration vermittels &lt;code&gt;a2enmod proxy_fcgi&lt;/code&gt; und &lt;code&gt;a2enconf php5-fpm&lt;/code&gt; sowie einem Restart des Webservers (&lt;code&gt;service apache2 restart&lt;/code&gt;) sollte PHP nun zur Verfügung stehen.&lt;/p&gt;

&lt;h3 id=&quot;pools-f-r-einzelne-benutzer-einrichten&quot;&gt;Pools für einzelne Benutzer einrichten&lt;/h3&gt;

&lt;p&gt;Um nun verschiedene Pools für verschiedene Benutzer einzurichten, bedarf es neben einer passenden Konfiguration des jeweiligen Pools in &lt;code&gt;/etc/php5/fpm/pool.d/&lt;/code&gt; und eines geänderten Aufrufs in jedem &lt;em&gt;virtual host&lt;/em&gt;, der diesem Benutzer zugeordnet ist.&lt;/p&gt;

&lt;p&gt;Am einfachsten kopiert man sich die bestehende Konfiguration für den Pool &lt;code&gt;www&lt;/code&gt; und wandelt sie ab:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;cd /etc/php5/fpm/pool.d
cp www.conf user1.conf
vim user1.conf
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Folgende Teile der Konfiguration müssen ersetzt werden: der Name des Pools, &lt;code&gt;user&lt;/code&gt;, &lt;code&gt;group&lt;/code&gt; und &lt;code&gt;listen&lt;/code&gt;:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;; Start a new pool named &#039;user1&#039;.
; the variable $pool can we used in any directive and will be replaced by the
; pool name (&#039;user1&#039; here)
[user1]

[...]

user = user1
group = users

[...]

listen = /var/run/php5-fpm-user1.sock
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Selbstverständlich können auch andere, für diesen Pool spezifische Änderungen vorgenommen werden&lt;/p&gt;

&lt;p&gt;Und danach bekommt der bspw. in &lt;code&gt;/etc/apache2/sites-available/user1-domain.example&lt;/code&gt; konfigurierte &lt;em&gt;virtual host&lt;/em&gt; noch folgende Ergänzung (zwischen &lt;code&gt;&amp;lt;VirtualHost ...&amp;gt;&lt;/code&gt; und &lt;code&gt;&amp;lt;/VirtualHost&amp;gt;&lt;/code&gt;):&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&amp;lt;IfModule mod_proxy_fcgi.c&amp;gt;
    &amp;lt;Proxy &quot;unix:/var/run/php5-fpm-user1.sock|fcgi://php-fpm-user1&quot;&amp;gt;
        # we must declare a (any) parameter in here 
        # or it won&#039;t register the proxy ahead of time
        ProxySet disablereuse=off
    &amp;lt;/Proxy&amp;gt;
    &amp;lt;FilesMatch &quot;.+\.php$&quot;&amp;gt;
        SetHandler proxy:fcgi://php-fpm-user1
    &amp;lt;/FilesMatch&amp;gt;
&amp;lt;/IfModule&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;In diesem &lt;em&gt;virtual host&lt;/em&gt; kommuniziert der &lt;em&gt;Apache&lt;/em&gt; also nicht mit dem &lt;em&gt;FastCGI&lt;/em&gt;-Server über &lt;code&gt;/var/run/php5-fpm.sock&lt;/code&gt;, sondern über &lt;code&gt;/var/run/php5-fpm-user1.sock&lt;/code&gt;, und den haben wir ja anders konfiguriert. Ein &lt;code&gt;service apache2 restart&lt;/code&gt; bzw. &lt;code&gt;service php5-fpm restart&lt;/code&gt; später sollte die geänderte Konfiguration zur Verfügung stehen.&lt;/p&gt;

&lt;p&gt;Soll PHP in mehreren &lt;em&gt;virtual hosts&lt;/em&gt; unter derselben Benutzerkennung laufen, empfiehlt es sich, die o.g. Konfiguration in eine eigene Datei (bspw. &lt;code&gt;/etc/apache2/sites-available/user1.fcgi&lt;/code&gt;) auszulagern und diese Datei dann in die &lt;em&gt;virtual host&lt;/em&gt;-Konfiguration einzubinden:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;Include /etc/apache2/sites-available/user1.fcg
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Das spart nicht nur Tipparbeit, sondern erleichtert auch spätere Änderungen sehr.&lt;/p&gt;

&lt;h3 id=&quot;die-installation-testen&quot;&gt;Die Installation testen&lt;/h3&gt;

&lt;p&gt;Am einfachsten gestaltet sich der Test, wenn man im Webroot des Servers (&lt;em&gt;Debian Jessie&lt;/em&gt;: &lt;code&gt;/var/www/html/&lt;/code&gt;)
und der einzelnen &lt;em&gt;virtual hosts&lt;/em&gt; jeweils eine Datei &lt;code&gt;test.php&lt;/code&gt; speichert, die nur &lt;code&gt;phpinfo()&lt;/code&gt; aufruft:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&amp;lt;?php phpinfo(); ?&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;In der Ausgabe von &lt;code&gt;phpinfo()&lt;/code&gt; wird angezeigt, unter welchem Benutzer das Script ausgeführt wird.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Vielen Dank an Sven für den hilfreichen Tip!&lt;/em&gt;&lt;/p&gt;
&lt;img src=&quot;https://ssl-vg03.met.vgwort.de/na/486e1796375b4333b55dd718167e842b&quot; width=&quot;1&quot; height=&quot;1&quot; alt=&quot;&quot;&gt; 
    </content:encoded>

    <pubDate>Tue, 26 Apr 2016 05:50:00 +0000</pubDate>
    <guid isPermaLink="false">https://netz-rettung-recht.de/archives/1909-guid.html</guid>
    <category>anleitung</category>
<category>debian</category>
<category>jessie</category>
<category>php</category>

</item>
<item>
    <title>SSL/TLS mit Let's Encrypt</title>
    <link>https://netz-rettung-recht.de/archives/1903-SSLTLS-mit-Lets-Encrypt.html</link>
            <category>Bits'n'Bytes</category>
    
    <comments>https://netz-rettung-recht.de/archives/1903-SSLTLS-mit-Lets-Encrypt.html#comments</comments>
    <wfw:comment>https://netz-rettung-recht.de/wfwcomment.php?cid=1903</wfw:comment>

    <slash:comments>0</slash:comments>
    <wfw:commentRss>https://netz-rettung-recht.de/rss.php?version=2.0&amp;type=comments&amp;cid=1903</wfw:commentRss>
    

    <author>nospam@example.com (Thomas Hochstein)</author>
    <content:encoded>
    &lt;p&gt;Bereits &lt;a href=&quot;https://netz-rettung-recht.de/archives/1901-Der-eigene-Webserver-mit-SSLTLS.html&quot; title=&quot;&quot;&gt;vergangene Woche&lt;/a&gt; berichtete ich von meinen Irrungen und Wirrungen des letzten Jahrzehnts mit SSL/TLS im Web. Erst Ende 2015 hatte ich mich aufgerafft, über &lt;a href=&quot;https://www.startssl.com/&quot; title=&quot;Notice to all StartCom subscribers&quot;&gt;StartCom&lt;/a&gt; für einige Domains Zertifikate erstellen zu lassen, und parallel die Berichterstattung über &lt;em&gt;Let&amp;#8217;s Encrypt&lt;/em&gt; verfolgt.&lt;/p&gt;

&lt;p&gt;Der Workflow für die Erstellung und Pflege von HTTPS-Zertifikaten kann schnell komplex werden:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Am Anfang steht die Erzeugung eines Schlüsselpaares, denn das spätere Zertifikat wird nur derjenige verwenden können, der auch den passenden privaten Schlüssel hat.&lt;/li&gt;
&lt;li&gt;Dann ist für jedes Zertifikat ein &lt;em&gt;Certificate Signing Request&lt;/em&gt; (&lt;em&gt;CSR&lt;/em&gt;) zu erstellen; das ist quasi die Roh-Form des späteren Zertifikats mit den notwendigen Informationen, die darin enthalten sein sollen.&lt;/li&gt;
&lt;li&gt;Dieser &lt;em&gt;CSR&lt;/em&gt; muss dann von der Zertifierungsstelle (Certificate Authority, &lt;em&gt;CA&lt;/em&gt;) digital signiert werden.&lt;/li&gt;
&lt;li&gt;Das so entstandene Zertifikat muss gespeichert und in die Webserver-Konfiguration eingebunden werden.&lt;/li&gt;
&lt;li&gt;Der ganze Ablauf ist nur zielführend, wenn die &lt;em&gt;CA&lt;/em&gt; von den verbreiteten Browsern anerkannt ist, den von ihr signierten Zertifikaten also vertraut wird. Dafür wollen die meisten &lt;em&gt;CAs&lt;/em&gt; Geld. Zudem müssen sie sich über einen mehr oder weniger aufwendigen Weg zumindest vergewissern, dass derjenige, der ein Zertifikat für einen bestimmten Hostnamen ausgestellt haben möchte, über diesen auch verfügen kann.&lt;/li&gt;
&lt;li&gt;Zertifikate werden in der Regel nur für einen begrenzten Zeitraum - meistens ein Jahr - ausgestellt. Danach müssen sie (rechtzeitig!) verlängert werden.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;&lt;a href=&quot;https://letsencrypt.org/&quot; title=&quot; Let&amp;#39;s Encrypt&quot;&gt;Let&amp;#8217;s Encrypt&lt;/a&gt;&lt;/em&gt; ist angetreten, diese Abläufe weitestmöglich zu vereinfachen.&lt;/p&gt;

&lt;h3 id=&quot;-let-s-encrypt-die-prinzipien&quot;&gt;&lt;em&gt;Let&amp;#8217;s Encrypt&lt;/em&gt; - die Prinzipien&lt;/h3&gt;

&lt;p&gt;&lt;em&gt;Let&amp;#8217;s Encrypt&lt;/em&gt; arbeitet kostenlos und veröffentlicht die verwendeten Schnittstellen. Es stellt eine &lt;em&gt;CA&lt;/em&gt; zur Verfügung, die automatisch Zertifikate ausstellt, nachdem sie überprüft hat, dass der Anfragende die administrative Kontrolle über den entsprechenden Hostnamen hat - beispielsweise, indem &lt;em&gt;Let&amp;#8217;s Encrypt&lt;/em&gt; verlangt, dass eine bestehende Datei auf dem Webserver unter diesem Hostnamen hinterlegt wird. Die erstellten Zertifikate werden öffentlich gemacht; es kann also jeder jederzeit nachvollziehen, wann &lt;em&gt;Let&amp;#8217;s Encrypt&lt;/em&gt; welche Zertifikate erstellt hat.&lt;/p&gt;

&lt;p&gt;Mittlerweile ist das Zwischenzertifikat von &lt;em&gt;Let&amp;#8217;s Encrypt&lt;/em&gt; nicht nur durch &lt;em&gt;Let&amp;#8217;s Encrypt&lt;/em&gt; selbst, sondern auch durch eine andere &lt;em&gt;CA&lt;/em&gt; (&lt;em&gt;IdenTrust&lt;/em&gt;) signiert und wird daher regelmäßig von den Browsern als vertrauenswürdig anerkannt. Von &lt;em&gt;Let&amp;#8217;s Encrypt&lt;/em&gt; ausgestellte Zertifikate werden also akzeptiert und führen nicht zu irgendwelchen Warnmeldungen. Sie gelten allerdings nur rund 90 Tage und müssen dann erneut werden.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Let&amp;#8217;s Encrypt&lt;/em&gt; stellt Client-Software zur Verfügung, die den gesamten, einleitend dargestellten Workflow automatisiert, ermöglicht es aber auch, die notwendigen Schritte in beliebigem Umfang manuell nachzuvollziehen oder auch eigene Lösungen zu programmieren. Im vollautomatischen Modus erstellt &lt;em&gt;Let&amp;#8217;s Encrypt&lt;/em&gt; das notwendige Schlüsselpaar und den &lt;em&gt;CSR&lt;/em&gt;, überprüft, dass der Antragsteller den Hostnamen kontrolliert, stellt das Zertifikat aus und speichert es, passt die Webserver-Konfiguration an und bindet das Zertifikat ein und kann auf Wunsch rechtzeitig vor Ablauf ein neues Zertifikat erstellen.&lt;/p&gt;

&lt;h3 id=&quot;-let-s-encrypt-und-der-apache-webserver-unter-debian-jessie-&quot;&gt;&lt;em&gt;Let&amp;#8217;s Encrypt&lt;/em&gt; und der &lt;em&gt;Apache&lt;/em&gt;-Webserver unter &lt;em&gt;Debian Jessie&lt;/em&gt;&lt;/h3&gt;

&lt;p&gt;Im Anschluss möchte ich einen weitgehend, aber nicht völlig automatisierten Ablauf zum Erstellen von SSL-Zertifikaten und deren Einbindung in einen &lt;em&gt;Apache&lt;/em&gt; unter &lt;em&gt;Debian Jessie&lt;/em&gt; darstellen. Es ist durchaus möglich, weit weniger auf Automatismen zu setzen; dann muss der Client auch nicht zwingend mit Root-Rechten laufen. &lt;em&gt;Matthias Gutjahr&lt;/em&gt; schildert in seinem Blog eine Möglichkeit dafür; &lt;em&gt;Dirk Deimeke&lt;/em&gt; hat eine weitere Alternative dargestellt. Beide Beiträge sind am Ende dieses Blogbeitrags verlinkt.&lt;/p&gt;

&lt;h4 id=&quot;installation&quot;&gt;Installation&lt;/h4&gt;

&lt;p&gt;Ab &lt;em&gt;Jessie&lt;/em&gt;, der derzeit stabilen &lt;em&gt;Debian&lt;/em&gt;-Version, steht &lt;code&gt;letsencrypt&lt;/code&gt; als Paket zur Verfügung, allerdings nur in den Backports. Wenn sich in der &lt;code&gt;/etc/apt/sources.list&lt;/code&gt; also die Zeile &lt;code&gt;deb http://ftp.debian.org/debian jessie-backports main&lt;/code&gt; findet, ist die Installation daher denkbar einfach:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;apt-get -t jessie-backports install letsencrypt
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Die umfangreichen Abhängigkeiten werden mitinstalliert.&lt;/p&gt;

&lt;p&gt;Wer noch unter &lt;em&gt;Wheezy&lt;/em&gt; arbeitet, benötigt etwas mehr Vertrauen in die Macher von &lt;em&gt;Let&amp;#8217;s Encrypt&lt;/em&gt; - und Platz für ein umfangreicheres Software-Paket (&lt;code&gt;letsencrypt-auto&lt;/code&gt;), das u.a. eine komplette virtuelle &lt;em&gt;Python&lt;/em&gt;-Umgebung mit sich schleppt:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;cd /usr/local
git clone https://github.com/letsencrypt/letsencrypt
cd letsencrypt
./letsencrypt-auto --help
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;code&gt;letsencrypt-auto&lt;/code&gt; akzeptiert dann denselben Input wie &lt;code&gt;letsencrypt&lt;/code&gt;.&lt;/p&gt;

&lt;h4 id=&quot;zertifikat-erstellen-lassen&quot;&gt;Zertifikat erstellen lassen&lt;/h4&gt;

&lt;p&gt;&lt;code&gt;letsencrypt&lt;/code&gt; bietet eine &lt;code&gt;ncurses&lt;/code&gt;-Oberfläche, die es ermöglicht, auf einige Kommandozeilen-Parameter zu verzichten und ggf. notwendige Abfragen im Dialog zu beantworten. Dazu gehört beim ersten Start u.a. die Angabe einer E-Mail-Adresse für eine mögliche Kontaktaufnahme und die Bestätigung der AGB, die erforderlich ist. Danach erstellt &lt;code&gt;letsencrypt&lt;/code&gt; automatisch einen Account samt Schlüsselpaar, so dass weitere Aufrufe in der Regel ohne Interaktion ablaufen können.&lt;/p&gt;

&lt;p&gt;Alle Daten werden standardmäßig unter &lt;code&gt;/etc/letsencrypt/&lt;/code&gt; abgelegt.&lt;/p&gt;

&lt;p&gt;Der folgende Aufruf fordert ein Zertifikat für die Hostnamen &lt;code&gt;domain.example&lt;/code&gt; und &lt;code&gt;www.domain.example&lt;/code&gt; an, deren Dateien auf der Platte im Verzeichnis &lt;code&gt;/var/www/domain.example&lt;/code&gt; (&lt;em&gt;Webroot&lt;/em&gt;) liegen:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;letsencrypt certonly --webroot -w /var/www/domain.example/ -d domain.example -d www.domain.example
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Falls notwendig, werden Mailadresse und Zustimmung zu den AGB (&amp;#8220;Terms of Service&amp;#8221;, &amp;#8220;TOS&amp;#8221;) abgefragt und ein privater Schlüssel (bzw. das Schlüsselpaar) erstellt. Dann wird der &lt;em&gt;CSR&lt;/em&gt; an &lt;em&gt;Let&amp;#8217;s Encrypt&lt;/em&gt; geschickt, temporär eine unter &lt;code&gt;http://domain.example/&lt;/code&gt; abrufbare Datei im &lt;em&gt;Webroot&lt;/em&gt; erstellt und so geprüft, dass man wirklich die Kontrolle über diesen Hostnamen hat, das Zertifikat erstellt, unter &lt;code&gt;/etc/letsencrypt/archive/domain.example/&lt;/code&gt; gespeichert und ein Symlink von &lt;code&gt;/etc/letsencrypt/live/domain.example/&lt;/code&gt; nach dort erstellt.&lt;/p&gt;

&lt;p&gt;Soll das Zertifikat für weitere Hostnamen gelten, können beliebig viele Folgen von &lt;code&gt;-w webroot -d hostname&lt;/code&gt; angeschlossen werden. Es folgt jeweils auf das &lt;code&gt;-w webroot&lt;/code&gt; die Angabe der Hostnames, die zu diesem Webroot gehören.&lt;/p&gt;

&lt;h4 id=&quot;zertifikat-beim-apache-einbinden&quot;&gt;Zertifikat beim &lt;em&gt;Apache&lt;/em&gt; einbinden&lt;/h4&gt;

&lt;p&gt;Eine minimale Konfiguration für den &lt;em&gt;virtual host&lt;/em&gt; könnte im &lt;em&gt;Apache 2.4&lt;/em&gt; (&lt;em&gt;Debian Jessie&lt;/em&gt;) so aussehen:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&amp;lt;VirtualHost *:443&amp;gt;
    ServerName domain.example
    ServerAlias www.domain.example

    DocumentRoot /var/www/domain.example

    SSLEngine on
    SSLCertificateFile /etc/letsencrypt/live/domain.example/fullchain.pem
    SSLCertificateKeyFile /etc/letsencrypt/live/domain.example/privkey.pem
&amp;lt;/VirtualHost&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Der &lt;em&gt;Apache 2.2&lt;/em&gt;, der mit &lt;em&gt;Debian Wheezy&lt;/em&gt; ausgeliefert wird, muss Zertifikat und Zwischenzertifikat der &lt;em&gt;CA&lt;/em&gt; getrennt ausliefern:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&amp;lt;VirtualHost *:443&amp;gt;
    [...]
    SSLEngine on
    SSLCertificateFile /etc/letsencrypt/live/domain.example/cert.pem
    SSLCertificateChainFile /etc/letsencrypt/live/domain.example/chain.pem
    SSLCertificateKeyFile /etc/letsencrypt/live/domain.example/privkey.pem
&amp;lt;/VirtualHost&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;h4 id=&quot;zertifikate-erneuern&quot;&gt;Zertifikate erneuern&lt;/h4&gt;

&lt;p&gt;Folgender &lt;em&gt;Cronjob&lt;/em&gt; prüft täglich um 4 Uhr morgens, ob ein Zertifikat erneuert werden muss, und nimmt diese Erneuerung automatisch vor, wenn sich der Ablaufzeitpunkt nähert:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;00 4 * * * letsencrypt renew --keep-until-expiring
&lt;/code&gt;&lt;/pre&gt;

&lt;h3 id=&quot;weiterer-lesestoff&quot;&gt;Weiterer Lesestoff&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;em&gt;Let&amp;#8217;s Encrypt&lt;/em&gt;: &lt;a href=&quot;https://letsencrypt.org/getting-started/&quot; title=&quot;Getting Started -  Let&amp;#39;s Encrypt&quot;&gt;Getting Started&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Wouter Verhelst im &lt;em&gt;WEBlog — Wouter’s Eclectic Blog&lt;/em&gt;: &lt;a href=&quot;http://grep.be/blog//en/computer/play/Playing_with_Letsencrypt/&quot; title=&quot;301 Moved Permanently&quot;&gt;Playing with Letsencrypt&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Matthias Gutjahr im &lt;em&gt;Sperrobjekt Weblog&lt;/em&gt;: &lt;a href=&quot;http://blog.sperrobjekt.de/content/1000480-Lets-Encrypt-Zertifikate-manuell-erzeugen.html&quot; title=&quot;&quot;&gt;&lt;em&gt;Let&amp;#8217;s Encrypt&lt;/em&gt;-Zertifikate manuell erzeugen&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Dirk Deimeke in &lt;em&gt;Dirks Logbuch&lt;/em&gt;: &lt;a href=&quot;http://www.deimeke.net/dirk/blog/index.php?/archives/3681-Lets-Encrypt-....html&quot; title=&quot;302 Found&quot;&gt;Let&amp;#8217;s Encrypt &amp;#8230;&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;img src=&quot;https://ssl-vg03.met.vgwort.de/na/051a5cf219b94e51bbfd314bc7089125&quot; width=&quot;1&quot; height=&quot;1&quot; alt=&quot;&quot;&gt; 
    </content:encoded>

    <pubDate>Mon, 11 Apr 2016 07:00:00 +0000</pubDate>
    <guid isPermaLink="false">https://netz-rettung-recht.de/archives/1903-guid.html</guid>
    <category>anleitung</category>
<category>apache</category>
<category>debian</category>
<category>jessie</category>
<category>ssl</category>

</item>
<item>
    <title>Der eigene Webserver mit SSL/TLS</title>
    <link>https://netz-rettung-recht.de/archives/1901-Der-eigene-Webserver-mit-SSLTLS.html</link>
            <category>Bits'n'Bytes</category>
    
    <comments>https://netz-rettung-recht.de/archives/1901-Der-eigene-Webserver-mit-SSLTLS.html#comments</comments>
    <wfw:comment>https://netz-rettung-recht.de/wfwcomment.php?cid=1901</wfw:comment>

    <slash:comments>9</slash:comments>
    <wfw:commentRss>https://netz-rettung-recht.de/rss.php?version=2.0&amp;type=comments&amp;cid=1901</wfw:commentRss>
    

    <author>nospam@example.com (Thomas Hochstein)</author>
    <content:encoded>
    &lt;p&gt;Datenströme im Netz zu verschlüsseln ist wichtig, aber auch zunehmend Allgemeingut. Telnet würde sicherlich niemand mehr zum Zugriff auf einen entfernten Rechner nutzen; stattdessen nimmt man SSH. Auch bei anderen Protokollen ist die Übertragung von Passworten im Klartext schon lange out: es fing an mit APOP für den Zugriff über POP3 und CRAM-MD5 für SMTP-Auth, und schon etliche Jahre nutze ich nur noch POP3S/IMAPS/SMTPS, also eine komplette Verschlüsselung des gesamten Datenstroms. So hat auch das auf SSH basierende SCP/SFTP schon lange FTP ersetzt, und nachdem sich mittlerweile auch NNTPS und der verschlüsselte Zugriff auf IRC-Server verbreitet haben, bleiben nur noch wenige Protokolle &amp;#8220;offen&amp;#8221;.&lt;/p&gt;

&lt;p&gt;Selbstverständlich sollte auch - zumindest - die Übertragung von Passworten via HTTP gesichert werden, was die Einrichtung von HTTPS erfordert. Je mehr sich webbasierte Dienste und Apps verbreiten, desto wichtiger ist das. Es ist allerdings - leider - nicht ganz so einfach.&lt;/p&gt;

&lt;h3 id=&quot;ssl-tls-zertifikate-und-deren-pr-fung&quot;&gt;SSL-/TLS-Zertifikate und deren Prüfung&lt;/h3&gt;

&lt;p&gt;Das liegt darin, dass Verschlüsselung allein zumindest im Grundsatz nicht genügt - wichtig ist auch Authentifizierung, also die Überprüfung, ob man auch mit der richtigen Gegenstelle spricht oder sich ein Dritter, der &amp;#8220;Man in the middle&amp;#8221;, dazwischengehängt hat. Zu einer mittels SSL/TLS (in Zukunft: SSL als Sammelbegriff für beides) gesicherten Verbindung gehört daher - eigentlich - auch immer die Überprüfung des Zertifikats der Gegenstelle. Dazu muss man entweder den Fingerprint des Zertifikats kennen und prüfen - PGP/GPG lässt grüßen -, oder man begnügt sich damit, dass eine Zertifizierungsstelle die Echtheit des Zertifikats bestätigt hat (und hofft auf deren Sorgfalt; eine Hoffnung, die die Praxis bereits vielfach enttäuscht hat).&lt;/p&gt;

&lt;p&gt;Will man selbst verschlüsselte Zugänge anbieten, genügt es für die meisten Dienste, ein selbst-signiertes Zertifikat zu erstellen und den Nutzern den Fingerprint mitzuteilen. In der Regel ist der Nutzerkreis selbstgehosteter Dienste nämlich überschaubar: der private Mailserver wird zum Versand und zum Mailabruf in der Regel nur selbst oder allenfalls von Familienmitgliedern und Freunden genutzt, die dem selbst-signierten Zertifikat dann vertrauen können. Nicht unüblich ist es auch, auf eine Zertifikatsprüfung zu verzichten und jedes präsentierte Zertifikat zu akzeptieren, also nur die Verschlüsselung zu nutzen und der Gegenstelle zu vertrauen. Das ist insofern nachvollziehbar, als es deutlich einfacher ist, (unverschlüsselten) Datenverkehr mitzulesen als sich als &amp;#8220;Man in the middle&amp;#8221; mit einem falschen Zertifikat in den verschlüsselten Datenstrom einzuklinken.&lt;/p&gt;

&lt;h4 id=&quot;https-im-speziellen&quot;&gt;HTTPS im Speziellen&lt;/h4&gt;

&lt;p&gt;Bei Webdiensten liegt der Fall hingegen etwas anders: zumeist erfolgt der Zugriff für die Allgemeinheit - der nicht zwingend einer Absicherung durch Verschlüsselung bedürfte - über dieselbe &amp;#8220;Domain&amp;#8221; (ich verwende den Begriff hier umgangssprachlich; richtiger wäre &amp;#8220;Hostname&amp;#8221;) wie die Administration. Ein Blog, bspw., das unter &lt;code&gt;http://meinblog.example/&lt;/code&gt; zugänglich ist, wird meist über &lt;code&gt;http://meinblog.example/admin/&lt;/code&gt; verwaltet, nicht aber über &lt;code&gt;http://admin.meinblog.example/&lt;/code&gt;. Ich muss also damit rechnen, dass auch die Allgemeinheit auf meine Webseiten über HTTPS zugreift, oder ich will das sogar erzwingen, damit ich nicht versehentlich Passwörter über eine ungeschützte Verbindung übertrage.&lt;/p&gt;

&lt;p&gt;Dann habe ich aber ein Problem: mein selbst-signiertes Zertifikat ist den Besuchern der Webseite natürlich unbekannt, und Browser generieren für diesen Anwendungsfall zunehmend auffälligere Warn- und Fehlermeldungen, die einen Zugriff auf die Seite entweder ganz unterbinden oder doch arg erschweren und den Durchschnittsnutzer abschrecken (was ja auch Sinn der Sache ist).&lt;/p&gt;

&lt;h4 id=&quot;-virtual-hosting-&quot;&gt;&lt;em&gt;Virtual Hosting&lt;/em&gt;&lt;/h4&gt;

&lt;p&gt;Zu diesem Problem der Fehlermeldungen bei selbst-signierten Zertifikaten kommt noch ein ein weiteres hinzu: es ist üblich, über einen Webserver (auf ein- und derselben IP-Adresse) eine Vielzahl von &amp;#8220;Domains&amp;#8221; (also getrennten Webseiten) anzubieten. Bei größeren Anbietern können das hunderte oder zigtausende Nutzer sein, die sich da auf einem Host tummeln, aber auch der private Nutzer hat vielleicht neben seiner Homepage unter &lt;code&gt;meine-domain.example&lt;/code&gt; auch noch ein Blog unter &lt;code&gt;blog.meine-domain.example&lt;/code&gt; oder will schlicht seine Webseiten sowohl unter &lt;code&gt;meine-domain.example&lt;/code&gt; als auch unter &lt;code&gt;www.meine-domain.example&lt;/code&gt; erreichbar machen. Das sind aber alles unterschiedliche Hostnamen, und da jedes SSL-Zertifikat angeben muss, für welchen Hostnamen es gültig ist, haben wir das nächste Problem: liefert der Webserver für &lt;code&gt;www.meine-domain.example&lt;/code&gt; das Zertifikat für &lt;code&gt;meine-domain.example&lt;/code&gt; aus, verfallen die Warnmeldungen im Browser nicht selten in eine noch schrillere Tonlage.&lt;/p&gt;

&lt;p&gt;Es ist leider auch nicht so einfach, für jede &amp;#8220;Domain&amp;#8221; ein eigenes Zertifikat zu präsentieren. Der Zugriff auf solche &lt;em&gt;virtual hosts&lt;/em&gt; erfolgt nämlich in der Weise, dass der Browser einen Header mitschickt, aus dem sich ergibt, auf welche &amp;#8220;Domain&amp;#8221; er zugreifen will. Für diesen Zugriff muss aber die verschlüsselte Verbindung schon stehen; andersherum weiss der Server beim Verbindungsaufbau noch nicht, welche &amp;#8220;Domain&amp;#8221; angefragt wird, und kann daher auch nicht das jeweils &amp;#8220;richtige&amp;#8221; Zertifikat ausliefern.&lt;/p&gt;

&lt;p&gt;Was also tun?&lt;/p&gt;

&lt;h3 id=&quot;l-sungswege&quot;&gt;Lösungswege&lt;/h3&gt;

&lt;p&gt;Über die Jahre habe ich verschiedene - allesamt mehr oder weniger unbefriedigende - Möglichkeiten getestet, um diesem Problem zu Leibe zu rücken.&lt;/p&gt;

&lt;h4 id=&quot;die-eigene-ca&quot;&gt;Die eigene CA&lt;/h4&gt;

&lt;p&gt;Angefangen habe ich vor gut einem Jahrzehnt mit einer eigenen Zertifizierungsstelle, die meine SSL-Zertifikate signiert. Dann reicht es nämlich, das Stammzertifikat dieser Zertifizierungsstelle dem Browser (und ggf. dem Mailprogramm) als gültig unterzuschieben, und alle anderen Zertifikate werden automatisch akzeptiert. Das erleichtert zumindest einmal mir selbst (und Freunden und Bekannten, die mir ausreichend trauen) den Umgang mit verschiedenen Servern und ggf. verschiedenen Hostnamen, behebt aber nicht das Problem, dass das Zertifikat immer nur für einen Hostnamen (eine &amp;#8220;Domain&amp;#8221;) gültig ist, und hilft auch den Webseitenbesuchern nicht.&lt;/p&gt;

&lt;p&gt;Ich habe mich daher in der Regel darauf beschränkt, HTTPS nur ergänzend anzubieten oder nur für solche Webseiten, die ausschließlich intern genutzt werden und sich nicht an die Allgemeinheit richten. Professionell geht aber fraglos anders.&lt;/p&gt;

&lt;h4 id=&quot;san&quot;&gt;SAN&lt;/h4&gt;

&lt;p&gt;Danach habe ich mich mit &lt;em&gt;Subject Alternate Names&lt;/em&gt;, kurz &lt;em&gt;SAN&lt;/em&gt;, vertraut gemacht. Es ist nämlich möglich, einem Zertifikat mitzugeben, dass es für mehr als einen Hostnamen gültig ist. Zum einen gibt es - nicht empfehlenswerte - sog. &amp;#8220;Wildcard-Zertifikate&amp;#8221;, die für alle Subdomains einer bestimmten Domain gültig sind, bspw. &lt;code&gt;*.domain.example&lt;/code&gt;. Zum anderen gibt es &lt;em&gt;SAN&lt;/em&gt; - zusätzliche Hostnamen, für die das jeweilige Zertifikat &lt;em&gt;auch&lt;/em&gt; gilt. Die kann man bei der Erstellung des Zertifikats mit angeben.&lt;/p&gt;

&lt;p&gt;Das funktioniert ganz gut, löst aber zum einen nicht das Problem der fehlenden allgemeinen Akzeptanz des Zertifikats und schafft zudem zwei neue Schwierigkeiten. Zum einen kann jeder Besucher durch Ansicht des Zertifikats feststellen, welche Webseiten auf dem Server sonst noch so gehostet werden (was nicht immer optimal ist), zum anderen braucht es für jede neue &amp;#8220;Domain&amp;#8221;, auf die auch per HTTPS zugegriffen werden soll, auch ein komplett neues Zertifikat.&lt;/p&gt;

&lt;h4 id=&quot;sni&quot;&gt;SNI&lt;/h4&gt;

&lt;p&gt;Dem strukturellen Problem, dass der Server &lt;em&gt;erst&lt;/em&gt; die verschlüsselte Verbindung aufbauen muss und danach erfährt, für welche &amp;#8220;Domain&amp;#8221; er das eigentlich tun soll, ist man mit &lt;em&gt;Server Name Indication&lt;/em&gt;, kurz &lt;em&gt;SNI&lt;/em&gt;, zu Leibe gerückt.  Das ist eine Erweiterung des TLS-Protokolls, die es dem Client erlaubt, beim Verbindungsaufbau bereits mitzuteilen, aus welcher &amp;#8220;Domain&amp;#8221; er später Webseiten abrufen will, so dass der Server ihm dann das richtige Zertifikat präsentieren kann. So kann auch der Webserver für jede &amp;#8220;Domain&amp;#8221; ein eigenes Zertifikat anbieten.&lt;/p&gt;

&lt;p&gt;Mittlerweile darf man davon ausgehen, dass &lt;em&gt;SNI&lt;/em&gt; so verbreitet ist, dass man es im praktischen Betrieb voraussetzen kann: Firefox unterstützt es seit Version 2.0, der Internet Explorer seit Version 7 und Windows Vista (nicht unter Windows XP), und auch &lt;code&gt;wget&lt;/code&gt; sollte das seit 2012 beherrschen.&lt;/p&gt;

&lt;h4 id=&quot;kommerzielle-zertifikate&quot;&gt;Kommerzielle Zertifikate&lt;/h4&gt;

&lt;p&gt;Dies wiederum ermöglicht es, auf kommerzielle SSL-Zertifikate zurückzugreifen. Deren Anbieter lassen sich nämlich ihre Dienste bei &amp;#8220;Wildcard-Zertifikaten&amp;#8221; oder solchen mit einer Vielzahl von Hostnamen (oder auch bei erweiterter Validierung der &amp;#8220;Domains&amp;#8221;, für die das Zertifikat gelten soll) geradezu fürstlich bezahlen; Zertifikate für nur ein oder zwei Namen (also bspw. &lt;code&gt;domain.example&lt;/code&gt; und &lt;code&gt;www.domain.example&lt;/code&gt;) sind hingegen erschwinglich oder gar kostenlos. &lt;em&gt;SNI&lt;/em&gt; macht es jetzt möglich, jeder &amp;#8220;Domain&amp;#8221; ihr eigenes günstiges Zertifikat zuzuweisen, bspw. von &lt;a href=&quot;https://www.startssl.com/&quot; title=&quot;Notice to all StartCom subscribers&quot;&gt;StartCom&lt;/a&gt;, einem Anbieter, der Zertifikate für maximal zwei &amp;#8220;Domains&amp;#8221; kostenlos abgibt (dann allerdings für den Widerruf eines kompromittierten Zertifikats Geld verlangt - nun ja).&lt;/p&gt;

&lt;p&gt;So kann man dann allmählich vernünftig mit SSL arbeiten.&lt;/p&gt;

&lt;h4 id=&quot;die-zukunft-letsencrypt&quot;&gt;Die Zukunft: letsencrypt&lt;/h4&gt;

&lt;p&gt;Neuerdings befindet sich zudem mit &lt;a href=&quot;https://letsencrypt.org/&quot; title=&quot; Let&amp;#39;s Encrypt&quot;&gt;Let&amp;#8217;s Encrypt&lt;/a&gt; ein Anbieter am Start, der sich kostenloses, freies und massentaugliches SSL/TLS auf die Fahnen geschrieben hat:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Let’s Encrypt is a new Certificate Authority:&lt;br /&gt;
  It’s free, automated, and open.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Dazu werde ich später mehr berichten.&lt;/p&gt;

&lt;h3 id=&quot;ssl-zertifikate-und-apache&quot;&gt;SSL-Zertifikate und Apache&lt;/h3&gt;

&lt;p&gt;Nach der Theorie nun etwas Praxis: wie richte ich beim &lt;em&gt;Apache&lt;/em&gt;-Webserver einen &lt;em&gt;virtual hosts&lt;/em&gt; mit SSL ein?&lt;/p&gt;

&lt;p&gt;Im Prinzip ist das recht einfach; Debian liefert bspw. eine entsprechende Konfiguration schon mit. Ich setze im Folgenden voraus, dass sowohl passende SSL-Zertifikate (mit dem zugehörigen &lt;em&gt;private key&lt;/em&gt; in entschlüsselter Form, d.h. ohne Passwortschutz) vorhanden als auch &lt;em&gt;virtual hosts&lt;/em&gt; grundsätzlich eingerichtet sind. Die Zertifikate speichere ich im Verzeichnis &lt;code&gt;/etc/apache2/ssl&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Eine Basis-Konfiguration könnte dann - mit einem Zertifikat von &lt;em&gt;StartCom&lt;/em&gt; - bspw. so aussehen:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&amp;lt;VirtualHost *:443&amp;gt;
    ServerName meine-domain.example
    ServerAlias www.meine-domain.example

    DocumentRoot /var/www/meine-domain.example

    SSLEngine on
    SSLCertificateFile /etc/apache2/ssl/meine-domain.example.crt
    SSLCertificateKeyFile /etc/apache2/ssl/meine-domain.example.key
    SSLCertificateChainFile /etc/apache2/ssl/sub.class1.server.ca.pem
&amp;lt;/VirtualHost&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Will man alle Zugriff von HTTP auf HTTPS umleiten, kann man bspw. folgendes ergänzen:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&amp;lt;VirtualHost *:80&amp;gt;
    ServerName meine-domain.example
    ServerAlias www.meine-domain.example

    Redirect / https://meine-domain.example/
&amp;lt;/VirtualHost&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;h3 id=&quot;disclaimer&quot;&gt;Disclaimer&lt;/h3&gt;

&lt;p&gt;SSL/TLS, der Umgang mit Zertifikaten und die Konfiguration des &lt;em&gt;Apache&lt;/em&gt; sind ein weites Feld, für das ich zudem kein Spezialist bin.&lt;/p&gt;

&lt;p&gt;Dieser Beitrag will einen kurzen, knappen und daher notwendigerweise unvollständigen Überblick zu diesem Thema geben und zur eigenen Beschäftigung damit anregen. Ich habe daher manches vereinfacht, anderes weggelassen, wieder anderes - absichtlich oder unabsichtlich - ungenau dargestellt.&lt;/p&gt;

&lt;p&gt;Dies ist &lt;strong&gt;kein&lt;/strong&gt; Tutorial, und die am Schluss genannten Beispiele sind &lt;strong&gt;nicht&lt;/strong&gt; zur 1:1-Übernahme via &lt;em&gt;copy &amp;amp; paste&lt;/em&gt; geeignet.&lt;/p&gt;

&lt;p&gt;Wenn sich Fehler eingeschlichen haben, bin ich über Kommentare dankbar - und auch Ergänzungen nehme ich natürlich gerne entgegen.&lt;/p&gt;
&lt;img src=&quot;https://ssl-vg03.met.vgwort.de/na/78d0b9aa0c014d7e82b6db4a8cdb322a&quot; width=&quot;1&quot; height=&quot;1&quot; alt=&quot;&quot;&gt; 
    </content:encoded>

    <pubDate>Thu, 07 Apr 2016 05:50:00 +0000</pubDate>
    <guid isPermaLink="false">https://netz-rettung-recht.de/archives/1901-guid.html</guid>
    <category>anleitung</category>
<category>apache</category>
<category>ssl</category>

</item>
<item>
    <title>Backups in die Cloud (duply und S3)</title>
    <link>https://netz-rettung-recht.de/archives/1699-Backups-in-die-Cloud-duply-und-S3.html</link>
            <category>Bits'n'Bytes</category>
    
    <comments>https://netz-rettung-recht.de/archives/1699-Backups-in-die-Cloud-duply-und-S3.html#comments</comments>
    <wfw:comment>https://netz-rettung-recht.de/wfwcomment.php?cid=1699</wfw:comment>

    <slash:comments>0</slash:comments>
    <wfw:commentRss>https://netz-rettung-recht.de/rss.php?version=2.0&amp;type=comments&amp;cid=1699</wfw:commentRss>
    

    <author>nospam@example.com (Thomas Hochstein)</author>
    <content:encoded>
    &lt;p&gt;Eigentlich wollte ich schon vor gut drei Jahren, im Januar 2013, über dieses Thema schreiben, als ich die ersten Backup-Jobs dieser Art eingerichtet habe, aber irgendwie ist aus dem angefangenen Entwurf nie ein fertiger Blogeintrag geworden. - Nun denn, auf ein neues.&lt;/p&gt;

&lt;p&gt;Nicht nur der heimische Rechner will regelmäßig gesichert werden; auch bei dedizierten Servern oder vServern ist ein regelmäßiges Backup vonnöten, um im Falle eines Falles nicht ohne (Code und) Daten dazustehen. Früher war es üblich, dass zu einem Server auch ein - meist per FTP zugänglicher - Backupplatz gehörte, der genügend Raum für ein Backup (auch über mehrere Generationen) bot. Mittlerweile müssen solche Angebote aber nicht selten kostenpflichtig hinzugebucht werden oder stehen gar nicht mehr zur Verfügung. Zwar ist es natürlich möglich, die Datensicherung auf einen anderen (eigenen oder fremden) Server durchzuführen, wobei sich die Maschine im heimischen Keller in der Regel wegen der geringen Upload-Bandbreiten nicht anbietet - schließlich will man nicht nur sichern, sondern notfalls auch wiederherstellen können. Eine Alternative ist aber Cloud-Speicher, bspw. Amazons S3 (&lt;em&gt;Simple Storage Service&lt;/em&gt;). Die Kosten sind bei inkrementiellen Backups überschaubar: ein Gigabyte Speicherplatz kostet pro Monat ungefähr 3 Cent, dazu kommen noch geringen Kosten für Zugriffsoperationen in der Größenordnung von einem halben Cent pro 1.000 Zugriffe und für den ausgehenden Traffic - also vor allem für einen Restore - 9 Cent pro GB, jeweils zzgl. MWSt. Wöchentliche inkrementielle Backups mit monatlichen Vollbackups für vier Server kommen auf gut 10$.&lt;/p&gt;

&lt;h3 id=&quot;backup-mit-duply-in-einen-aws-s3-bucket-&quot;&gt;Backup mit &lt;em&gt;duply&lt;/em&gt; in einen &lt;em&gt;AWS&lt;/em&gt; &lt;em&gt;S3&lt;/em&gt;-&amp;#8220;Bucket&amp;#8221;&lt;/h3&gt;

&lt;p&gt;Für verschlüsselte und komprimierte Backups bieten sich &lt;em&gt;duplicity&lt;/em&gt; und &lt;em&gt;duply&lt;/em&gt; an; die grundsätzliche &lt;a href=&quot;https://netz-rettung-recht.de/archives/1651-Backup-mit-duply-und-duplicity.html&quot; title=&quot;&quot;&gt;Einrichtung von duply&lt;/a&gt; habe ich bereits 2011 beschrieben. Zusätzlich benötigen wir für das Cloud-Backup noch dreierlei: einen S3-&amp;#8220;Bucket&amp;#8221;, in dem die Backups landen sollen, Zugangsdaten für diesen &amp;#8220;Bucket&amp;#8221;, und eine Anpassung der &lt;em&gt;duply&lt;/em&gt;-Konfiguration.&lt;/p&gt;

&lt;p&gt;Für die Nutzung der &lt;em&gt;Amazon Web Services&lt;/em&gt; (AWS) ist eine Anmeldung dort erforderlich. Außerdem empfiehlt es sich sehr, nicht mit den Daten des Haupt-Accounts auf unseren S3-&amp;#8220;Bucket&amp;#8221; zuzugreifen, sondern mit einem extra dafür erzeugten Nutzeraccount, der dann auch nur auf diesen &amp;#8220;Bucket&amp;#8221; zugreifen kann. Dazu dient das &lt;em&gt;Identity and Access Management&lt;/em&gt; (IAM).&lt;/p&gt;

&lt;h3 id=&quot;-aws-konfiguration&quot;&gt;&lt;em&gt;AWS&lt;/em&gt;-Konfiguration&lt;/h3&gt;

&lt;p&gt;Fangen wir an mit der Anlage des &lt;em&gt;S3&lt;/em&gt;-Speicherplatzes. Dazu genügt es, in der &lt;em&gt;&lt;a href=&quot;https://console.aws.amazon.com/s3/home&quot; title=&quot;&quot;&gt;S3 Console&lt;/a&gt;&lt;/em&gt; mit Klick auf &lt;code&gt;Create&lt;/code&gt; einen neuen &amp;#8220;Bucket&amp;#8221; anzulegen. Der vergebene Name muss &lt;em&gt;AWS&lt;/em&gt;-weit eindeutig sein, es empfiehlt sich daher etwas in der Form &lt;code&gt;accountname-backup-servername&lt;/code&gt; o.ä. Dabei muss dieser Name eine &lt;strong&gt;gültige Subdomain&lt;/strong&gt; darstellen (vgl. die &lt;a href=&quot;http://docs.aws.amazon.com/AmazonS3/latest/dev/BucketRestrictions.html&quot; title=&quot;301 Moved Permanently&quot;&gt;&lt;em&gt;AWS&lt;/em&gt;-Dokumentation&lt;/a&gt;) und er sollte - um spätere Schwierigkeiten beim Zugriff zu vermeiden - &lt;strong&gt;keine Punkte enthalten&lt;/strong&gt;. (Mit &lt;em&gt;duplicity&lt;/em&gt; und den zugehörigen Libraries unter Debian &lt;em&gt;Wheezy&lt;/em&gt; hatte ich keine Zugriffsprobleme auf Buckets, die Punkte im Namen haben, mit den Versionen in Debian &lt;em&gt;Jessie&lt;/em&gt; jedoch sehr wohl. Better safe than sorry &amp;#8230; ) Außerdem kann die geographische &lt;a href=&quot;http://docs.aws.amazon.com/general/latest/gr/rande.html#s3_region&quot; title=&quot;301 Moved Permanently&quot;&gt;Region&lt;/a&gt; ausgewählt werden, in der der &amp;#8220;Bucket&amp;#8221; angelegt werden soll. Neben Irland ist hier nun auch Frankfurt als Standort auswählbar; für den Zugriff dort wird aber nur die Protokollversion 4 unterstützt, was wiederum zu &lt;a href=&quot;https://raim.codingfarm.de/blog/2015/03/12/backup-with-duply-to-amazon-s3-backendexception-no-connection-to-backend/&quot; title=&quot;301 Moved Permanently&quot;&gt;Schwierigkeiten&lt;/a&gt; führen kann. Ich empfehle daher &lt;code&gt;eu-west-1&lt;/code&gt; (Irland) als Region.&lt;/p&gt;

&lt;p&gt;Jetzt brauchen wir noch einen Benutzer, der auf den Bucket zugreifen kann. Ein solcher lässt sich in der &lt;em&gt;&lt;a href=&quot;https://console.aws.amazon.com/iam/home#users&quot; title=&quot;302 Found&quot;&gt;IAM Console&lt;/a&gt;&lt;/em&gt; anlegen. Die dabei erzeugte &lt;em&gt;Access-Key-ID&lt;/em&gt; und der zugehörige &lt;em&gt;Secret Key&lt;/em&gt; müssen unbedingt heruntergeladen und sicher aufbewahrt werden.&lt;/p&gt;

&lt;p&gt;Danach bekommt der neu erzeugte Benutzer noch eine &lt;em&gt;Policy&lt;/em&gt; mit den nötigen Zugriffsrechten verpasst. Dazu wählen wir ihn in der Benutzerliste aus, wählen den Tab &lt;em&gt;Permissions&lt;/em&gt; an und klicken unter &lt;em&gt;Inline Policies&lt;/em&gt; auf &lt;code&gt;Create User Policy&lt;/code&gt;. Diese Policy sollte dann wie folgt aussehen:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;{
    &quot;Statement&quot;: [
        {
            &quot;Action&quot;: [
                &quot;s3:ListAllMyBuckets&quot;
            ],
            &quot;Effect&quot;: &quot;Allow&quot;,
            &quot;Resource&quot;: &quot;arn:aws:s3:::*&quot;
        },
        {
            &quot;Action&quot;: &quot;s3:*&quot;,
            &quot;Effect&quot;: &quot;Allow&quot;,
            &quot;Resource&quot;: [
                &quot;arn:aws:s3:::accountname-backup-servername&quot;,
                &quot;arn:aws:s3:::accountname-backup-servername/*&quot;
            ]
        }
    ]
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Statt &lt;code&gt;accountname-backup-servername&lt;/code&gt; ist der Name des vorher neu angelegten &lt;em&gt;S3&lt;/em&gt;-Buckets zu verwenden. Dieser Benutzer darf sich also eine Liste aller &amp;#8220;Buckets&amp;#8221; anzeigen lassen und auf den genannten &amp;#8220;Bucket&amp;#8221; und alle Dateien darin zugreifen.&lt;/p&gt;

&lt;h3 id=&quot;-duply-konfiguration&quot;&gt;&lt;em&gt;duply&lt;/em&gt;-Konfiguration&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Update&lt;/strong&gt;: Die Beschreibung der Konfiguration gilt für Debian 8.0&amp;#160;&lt;em&gt;Jessie&lt;/em&gt; und Debian 9.0&amp;#160;&lt;em&gt;Stretch&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;In der &lt;em&gt;duply&lt;/em&gt;-Konfiguration (Datei &lt;code&gt;conf&lt;/code&gt;) treffen wir jetzt noch folgende Einstellungen:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;TARGET=&#039;s3://s3-eu-west-1.amazonaws.com/accountname-backup-servername&#039;
TARGET_USER=&#039;AccessKeyID&#039;
TARGET_PASS=&#039;SecretAccessKey&#039;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;Update&lt;/strong&gt;: Ab Debian &lt;em&gt;Stretch&lt;/em&gt; muss es statt &lt;code&gt;TARGET_USER&lt;/code&gt; und &lt;code&gt;TARGET_PASS&lt;/code&gt; wie folgt heißen:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;export AWS_ACCESS_KEY_ID=&#039;AccessKeyID&#039;
export AWS_SECRET_ACCESS_KEY=&#039;SecretAccessKey&#039;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Für &lt;code&gt;s3-eu-west-1&lt;/code&gt; (Region Irland), &lt;code&gt;accountname-backup-servername&lt;/code&gt;, &lt;code&gt;AccessKeyID&lt;/code&gt; und &lt;code&gt;SecretAccessKey&lt;/code&gt; sind jeweils die passenden Werte zu verwenden; &lt;code&gt;AccessKeyID&lt;/code&gt; und &lt;code&gt;SecretAccessKey&lt;/code&gt; wurden bei der Einrichtung des &lt;em&gt;IAM&lt;/em&gt;-Benutzers erzeugt.&lt;/p&gt;

&lt;p&gt;Außerdem müssen &lt;em&gt;duplicity&lt;/em&gt; noch einige zusätzliche Parameter übergeben werden:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;DUPL_PARAMS=&quot;$DUPL_PARAMS --s3-use-new-style --s3-european-buckets --s3-use-multiprocessing &quot;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;Update&lt;/strong&gt;: Ab Debian &lt;em&gt;Stretch&lt;/em&gt; benötigt auch &lt;em&gt;gpg&lt;/em&gt; zusätzliche Parameter:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;GPG_OPTS=&#039;--pinentry-mode loopback&#039;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Jetzt kann der erste Backuplauf mit &lt;code&gt;duply NAME backup&lt;/code&gt; gestartet werden. Nach dem Abschluss des Backup-Laufs finden sich im &amp;#8220;Bucket&amp;#8221; in der &lt;em&gt;S3 Console&lt;/em&gt; die gesicherten Dateien.&lt;/p&gt;

&lt;p&gt;Fertig!&lt;/p&gt;
&lt;img src=&quot;https://ssl-vg03.met.vgwort.de/na/2956ddea7a7a4c24a3bf2a97d746aed9&quot; width=&quot;1&quot; height=&quot;1&quot; alt=&quot;&quot;&gt; 
    </content:encoded>

    <pubDate>Tue, 29 Mar 2016 13:00:00 +0000</pubDate>
    <guid isPermaLink="false">https://netz-rettung-recht.de/archives/1699-guid.html</guid>
    <category>anleitung</category>
<category>aws</category>
<category>backup</category>
<category>duplicity</category>

</item>
<item>
    <title>nanoc: Auswahl des Templates via YAML</title>
    <link>https://netz-rettung-recht.de/archives/1845-nanoc-Auswahl-des-Templates-via-YAML.html</link>
            <category>Bits'n'Bytes</category>
    
    <comments>https://netz-rettung-recht.de/archives/1845-nanoc-Auswahl-des-Templates-via-YAML.html#comments</comments>
    <wfw:comment>https://netz-rettung-recht.de/wfwcomment.php?cid=1845</wfw:comment>

    <slash:comments>0</slash:comments>
    <wfw:commentRss>https://netz-rettung-recht.de/rss.php?version=2.0&amp;type=comments&amp;cid=1845</wfw:commentRss>
    

    <author>nospam@example.com (Thomas Hochstein)</author>
    <content:encoded>
    &lt;p&gt;Nicht selten lassen sich die meisten Seiten einer Webpräsenz aus demselben Template erzeugen, wohingegen einige Ausnahmefälle einer Sonderbehandlung bedürfen - bspw. die Startseite oder &lt;em&gt;landing page&lt;/em&gt;, die oft anders gestaltet ist als der Rest der Webseiten, und sei es nur, dass sie keine oder andere Navigations-Elemente aufweist oder mehrspaltig statt einspaltig (oder umgekehrt) dargestellt werden soll.&lt;/p&gt;

&lt;p&gt;Mag es bei der Verwendung von &lt;em&gt;nanoc&lt;/em&gt; für eine singuläre Ausnahme noch sinnvoll sein, sie explizit in die - &lt;a href=&quot;https://netz-rettung-recht.de/archives/1844-nanoc-Rules-passthrough-und-ignore.html&quot; title=&quot;&quot;&gt;bereits erläuterte&lt;/a&gt; - &lt;code&gt;Rules&lt;/code&gt;-Datei aufzunehmen, gibt es für diese Aufgabenstellung eine sehr einfache Lösung: ein abweichendes Template kann nämlich im &lt;em&gt;YAML&lt;/em&gt;-Metadatenblock jeder Seite angegeben werden.&lt;/p&gt;

&lt;p&gt;Sollen nun die Webseiten einer Präsenz normalerweise das Template namens &lt;em&gt;default&lt;/em&gt; verwenden, die Startseite aber das Template &lt;em&gt;startpage&lt;/em&gt;, so erhält die Quellcode-Datei der Startseite einen entsprechenden Eintrag in ihre &lt;em&gt;YAML&lt;/em&gt;-Metadaten, bspw. &lt;code&gt;template: startpage&lt;/code&gt;, und die &lt;code&gt;Rules&lt;/code&gt;-Datei erhält dann im &lt;code&gt;compile&lt;/code&gt;-Block an der passenden Stelle - statt &lt;code&gt;layout &#039;default&#039;&lt;/code&gt; - die Anweisung &lt;code&gt;layout item[:template] || &#039;default&#039;&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Man kann auch - wie es der &lt;em&gt;CCCS&lt;/em&gt; &lt;a href=&quot;https://github.com/cccs/cccs-website/blob/master/Rules&quot; title=&quot;cccs-website/Rules at master · cccs/cccs-website · GitHub&quot;&gt;tut&lt;/a&gt; - die Variante &amp;#8220;gar kein Template&amp;#8221; direkt mit aufnehmen:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;if item[:template]!=&#039;none&#039;
  layout item[:template] || &#039;default&#039;
end
&lt;/code&gt;&lt;/pre&gt;
 
    </content:encoded>

    <pubDate>Wed, 29 Apr 2015 05:26:00 +0000</pubDate>
    <guid isPermaLink="false">https://netz-rettung-recht.de/archives/1845-guid.html</guid>
    <category>anleitung</category>
<category>nanoc</category>

</item>
<item>
    <title>Kennzeichnung von Links in HTML-Dokumenten</title>
    <link>https://netz-rettung-recht.de/archives/1813-Kennzeichnung-von-Links-in-HTML-Dokumenten.html</link>
            <category>Bits'n'Bytes</category>
    
    <comments>https://netz-rettung-recht.de/archives/1813-Kennzeichnung-von-Links-in-HTML-Dokumenten.html#comments</comments>
    <wfw:comment>https://netz-rettung-recht.de/wfwcomment.php?cid=1813</wfw:comment>

    <slash:comments>0</slash:comments>
    <wfw:commentRss>https://netz-rettung-recht.de/rss.php?version=2.0&amp;type=comments&amp;cid=1813</wfw:commentRss>
    

    <author>nospam@example.com (Thomas Hochstein)</author>
    <content:encoded>
    &lt;p&gt;Bei der Gestaltung einer Website sollten Links gut als eben solche erkennbar sein - am besten unterstrichen und in dem gewohnten blauen Farbton, damit der Nutzer sie im Fließtext erkennen kann (in der Navigation ist das nicht von vergleichbarer Wichtigkeit, weil dort mit &amp;#8220;klickbaren&amp;#8221; Texten gerechnet wird).&lt;/p&gt;

&lt;p&gt;Bestimmte Arten von Links möchte man oft dennoch abweichend kennzeichnen - zum Beispiel &amp;#8220;&lt;em&gt;mailto:&lt;/em&gt;&amp;#8220;-Links, also solche, die nicht auf eine andere Webressource, sondern auf eine E-Mail-Adresse zeigen, und vielleicht auch andere Links, deren &lt;em&gt;URL&lt;/em&gt; ein ungewohntes Protokoll enthält.&lt;/p&gt;

&lt;h3 id=&quot;kennzeichnung-von-links-mit-grafiken&quot;&gt;Kennzeichnung von Links mit Grafiken&lt;/h3&gt;

&lt;p&gt;Man könnte solche Links in verschiedenen Farben anzeigen, aber das wäre alles andere als selbsterklärend, und der Websurfer heutiger Tage dürfte wohl kaum erst eine Erläuterungseite zur Gestaltung der betrachteten Webpräsenz studieren wollen, um sich zu vergewissern, was ihm ungewohnte Farben und Symbole sagen wollen. Unmissverständlich hingegen ist ein Icon, für eine E-Mail-Adresse bspw. ein Briefumschlag (früher auch gerne ein - am besten blinkendes oder rotierendes - &lt;code&gt;@&lt;/code&gt;-Symbol). Auf diese Weise kann man Links auf E-Mail-Adressen zum Beispiel so auszeichnen:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&amp;lt;img src=&quot;https://netz-rettung-recht.de/imgs/envelope.gif&quot; /&amp;gt; &amp;lt;a href=&quot;mailto:thh@inter.net&quot;&amp;gt;thh@inter.net&amp;lt;/a&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Für den Fall, dass häufiger Mailadressen im Text vorkommen, ist das allerdings etwas aufwendig, vor allem, wenn man das Prinzip auch noch auf andere Arten von Links ausdehnen möchte. Werden die Webseiten ohnehin durch eine Skriptsprache generiert, bspw. durch &lt;em&gt;PHP&lt;/em&gt;, kann man stattdessen natürlich eine passende Funktion verwenden, die bspw. über den Aufruf &lt;code&gt;mailto(&#039;thh@inter.net&#039;)&lt;/code&gt; die obige Ausgabe erzeigt. So richtig elegant ist das aber immer noch nicht.&lt;/p&gt;

&lt;h3 id=&quot;kennzeichnung-mit-grafiken-durch-css-klassen&quot;&gt;Kennzeichnung mit Grafiken durch &lt;em&gt;CSS&lt;/em&gt;-Klassen&lt;/h3&gt;

&lt;p&gt;Deutlich eleganter funktioniert es, wenn man den entsprechenden Links stattdessen eine spezielle &lt;em&gt;CSS&lt;/em&gt;-Klasse zuweist und die passende Grafik auf diese Weise (als Hintergrundgrafik) einblendet, bspw. so:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;a.mailto {
  color          : #00f;
  text-decoration: none;
  margin-left    : 3px;
  padding-left   : 20px;
  background     : url(envelope.gif) no-repeat left;
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Ein Link der Form &lt;code&gt;&amp;lt;a class=&quot;mailto&quot; href=&quot;mailto:thh@inter.net&quot;&amp;gt;thh@inter.net&amp;lt;/a&amp;gt;&lt;/code&gt; wird auf diese Weise in blauer Schriftfarne und ohne Unterstreichung dargestellt; außerdem wird links von dem Linktext das Symbol eines Briefumschlags eingeblendet. Das ist schon ganz schick, erfordert aber jeweils die Zuweisung einer passenden Klasse für jeden einzelnen Link - also wiederum Schreibaufwand. Und was ist mit automatisch generierten HTML-Seiten, bspw. solchen, die aus &lt;em&gt;Markdown&lt;/em&gt; heraus erzeugt werden, oder in denen aus anderen Gründen diesen Links nicht die richtige Klasse zugewiesen ist?&lt;/p&gt;

&lt;h3 id=&quot;kennzeichnung-mit-grafiken-durch-css-attributselektoren&quot;&gt;Kennzeichnung mit Grafiken durch &lt;em&gt;CSS&lt;/em&gt;-Attributselektoren&lt;/h3&gt;

&lt;p&gt;Auch dafür gibt es eine Lösung. Mit &lt;em&gt;CSS 3.0&lt;/em&gt; lässt sich das Prinzip nämlich noch schöner (und einfacher) umsetzen, und zwar mit sog. &lt;em&gt;Attributselektoren&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Damit kann die Anwendung einer &lt;em&gt;CSS&lt;/em&gt;-Definition auf Elemente beschränkt werden, deren Attribute einen bestimmten Wert enthalten oder, ab &lt;em&gt;CSS 3.0&lt;/em&gt;, mit einem bestimmten Wert beginnen. Und unsere vorstehende Definition soll ja gerade nur auf Links (also &lt;code&gt;&amp;lt;a&amp;gt;&lt;/code&gt;-Elemente) angewandt werden, deren Attribut &lt;code&gt;href&lt;/code&gt; mit dem Wert &lt;code&gt;mailto:&lt;/code&gt; beginnt. Voilà:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;a[href^=&quot;mailto:&quot;] {
  color          : #00f;
  text-decoration: none;
  margin-left    : 3px;
  padding-left   : 20px;
  background     : url(envelope.gif) no-repeat left;
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Diese Definition sorgt dafür, dass jeder Link der Form &lt;code&gt;&amp;lt;a href=&quot;mailto:thh@inter.net&quot;&amp;gt;thh@inter.net&amp;lt;/a&amp;gt;&lt;/code&gt; ohne weitere Zuweisung einer &lt;em&gt;CSS&lt;/em&gt;-Klasse automatisch wie im vorigen Beispiel formatiert wird, einschließlich der links davon eingeblendeten Grafik mit dem Briefumschlag.&lt;/p&gt;

&lt;h3 id=&quot;-css-attributselektoren-und-icons&quot;&gt;&lt;em&gt;CSS&lt;/em&gt;-Attributselektoren und Icons&lt;/h3&gt;

&lt;p&gt;Statt der Verwendung einer Grafik kann man jetzt noch einen Schritt weiter gehen und Symbole oder Icons aus einem &lt;em&gt;Iconfont&lt;/em&gt; wie &lt;a href=&quot;http://glyphicons.com/&quot; title=&quot;301 Moved Permanently&quot;&gt;&lt;em&gt;GLYPHICONS&lt;/em&gt;&lt;/a&gt; oder &lt;a href=&quot;http://fontawesome.io/&quot; title=&quot;&quot;&gt;&lt;em&gt;Font Awesome&lt;/em&gt;&lt;/a&gt; zusammen mit dem &lt;em&gt;CSS&lt;/em&gt;-Pseudoelement &lt;code&gt;:before&lt;/code&gt; verwenden, die dann auch von der Größe her an den Text angepasst sind.&lt;/p&gt;

&lt;p&gt;Dazu müssen zunächst die Schriftart an sich und die entsprechenden &lt;em&gt;CSS&lt;/em&gt;-Definitionen (heruntergeladen und) eingebunden werden. In der einfachsten Fassung genügt aber zunächst im &lt;code&gt;&amp;lt;head&amp;gt;&lt;/code&gt;-Segment der Webseite die Zeile:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&amp;lt;link rel=&quot;stylesheet&quot; href=&quot;//maxcdn.bootstrapcdn.com/font-awesome/4.3.0/css/font-awesome.min.css&quot;&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Die &lt;em&gt;CSS&lt;/em&gt;-Definition könnte dann wie folgt aussehen:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;a[href^=&quot;mailto:&quot;]:before {
  /* Unicode-Wert f0e0 fuer &quot;envelope&quot; 
     http://fontawesome.io/icon/envelope/ */
  content: &quot;\f0e0&quot;;
  position: relative;
  top: 2px;
  display: inline-block;
  padding-left: 3px;
  padding-right: 4px;
  line-height: 1;
  font-family: &#039;FontAwesome&#039;;
  font-style: normal;
  font-weight: normal;
  font-size: 90%;
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Ein zusätzliches&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;a[href^=&quot;mailto:&quot;] {
  text-decoration: none;
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;unterbindet dann noch die Unterstreichung des Links.&lt;/p&gt;

&lt;p&gt;Auf dieselbe Weise kann jedes beliebige Icon vor (oder hinter) ein Element gesetzt werden; notwendig ist nur die Angabe der richtigen &lt;code&gt;font-family&lt;/code&gt; und des &lt;em&gt;Unicode&lt;/em&gt;-Wertes des jeweiligen Zeichens, eingeleitet mit dem Backslash &lt;code&gt;\&lt;/code&gt;, als &lt;code&gt;content&lt;/code&gt;-Wert.&lt;/p&gt;

&lt;h3 id=&quot;andere-arten-von-links-kennzeichnen&quot;&gt;Andere Arten von Links kennzeichnen&lt;/h3&gt;

&lt;p&gt;In gleicher Weise lassen sich bspw. externe Links, also solche, die auf Ressourcen außerhalb der eigenen Website zeigen, oder Links, die sich in einem neuen Fenster oder Tab öffnen sollen, kennzeichnen. Ebenso können Links mit anderen Protokollen gekennzeichnet werden.&lt;/p&gt;

&lt;p&gt;Die passenden Attributselektoren würden lauten&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;a[href^=&quot;http&quot;]:before&lt;/code&gt; für externe Links, die mit &lt;code&gt;http&lt;/code&gt; oder &lt;code&gt;https&lt;/code&gt; beginnen,&lt;/li&gt;
&lt;li&gt;&lt;code&gt;a[href^=&quot;ftp&quot;]:before&lt;/code&gt; für das Protokoll &lt;em&gt;FTP&lt;/em&gt; oder auch&lt;/li&gt;
&lt;li&gt;&lt;code&gt;a[target^=&quot;_blank&quot;]:before&lt;/code&gt; für Links, die sich in einem neuen Fenster oder Tab öffnen sollen.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Der Phantasie sind insoweit keine Grenzen gesetzt.&lt;/p&gt;

&lt;h3 id=&quot;ausgabe-der-symbole-unterdr-cken&quot;&gt;Ausgabe der Symbole unterdrücken&lt;/h3&gt;

&lt;p&gt;Soll ein Link einmal ausnahmsweise nicht gekennzeichnet werden, weil er sich bspw. in einem Navigationselement befindet, kann eine &lt;em&gt;CSS&lt;/em&gt;-Klasse wie&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;.no-symbols a:before  {
  content: none;
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;definiert werden, die dann dem &lt;strong&gt;umgebenden&lt;/strong&gt; Element des Links zugewiesen wird, also bspw. so:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&amp;lt;p class=&quot;no-symbols&quot;&amp;gt;&amp;lt;a href=&quot;mailto:thh@inter.net&quot;&amp;gt;thh@inter.net&amp;lt;/a&amp;gt;&amp;lt;/p&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;So lassen sich also mit diesen einfachen Definitionen Links quasi &amp;#8220;magisch&amp;#8221; mit passenden Symbolen versehen - oder eben auch gerade nicht, je nachdem, wie der Kontext es erfordert.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;[Dieser Eintrag wurde nachträglich im Februar 2015 veröffentlicht.]&lt;/em&gt;&lt;/p&gt;
&lt;img src=&quot;https://ssl-vg03.met.vgwort.de/na/b2ff133274444d3d8190835f0c607077&quot; width=&quot;1&quot; height=&quot;1&quot; alt=&quot;&quot;&gt; 
    </content:encoded>

    <pubDate>Thu, 08 Jan 2015 19:30:00 +0000</pubDate>
    <guid isPermaLink="false">https://netz-rettung-recht.de/archives/1813-guid.html</guid>
    <category>anleitung</category>
<category>webdesign</category>

</item>
<item>
    <title>Kommentare des Blogautors hervorheben</title>
    <link>https://netz-rettung-recht.de/archives/1726-Kommentare-des-Blogautors-hervorheben.html</link>
            <category>Bits'n'Bytes</category>
    
    <comments>https://netz-rettung-recht.de/archives/1726-Kommentare-des-Blogautors-hervorheben.html#comments</comments>
    <wfw:comment>https://netz-rettung-recht.de/wfwcomment.php?cid=1726</wfw:comment>

    <slash:comments>0</slash:comments>
    <wfw:commentRss>https://netz-rettung-recht.de/rss.php?version=2.0&amp;type=comments&amp;cid=1726</wfw:commentRss>
    

    <author>nospam@example.com (Thomas Hochstein)</author>
    <content:encoded>
    &lt;p&gt;In anderen Blogs fand ich es immer ganz schön, wenn Kommentare des ursprünglichen Autors - des Blogeintrags - optisch hervorgehoben werden. Wer das gleichfalls schick findet, kann das auch mit &lt;em&gt;Serendipity&lt;/em&gt; umsetzen.&lt;/p&gt;

&lt;p&gt;Voraussetzung ist, dass im verwendeten &lt;em&gt;Theme&lt;/em&gt; (oder &lt;em&gt;Template&lt;/em&gt;) zum einen entsprechender &lt;em&gt;Smarty&lt;/em&gt;-Code vorhanden ist, der auf die Übereinstimmung von &amp;#8220;Kommentarautor&amp;#8221; und &amp;#8220;Blogautor&amp;#8221; prüft, und es zum anderen dort entsprechende CSS-Definitionen gibt, die dann zu einer Hervorhebung führen. Ersteres ist im neuen Standardtheme &amp;#8220;&lt;strong&gt;2k11&lt;/strong&gt;&amp;#8221; der Fall, letzteres nicht.&lt;/p&gt;

&lt;p&gt;Wenn die Überprüfung ergibt, dass der Kommentar vom Autor des Beitrags selbst stammt, bekommt der entsprechende &lt;code&gt;&amp;lt;article&amp;gt;&lt;/code&gt;-Abschnitt die Klasse &lt;code&gt;serendipity_comment_author_self&lt;/code&gt; zugewiesen. Für diese Klasse sind also entsprechende Definitionen vorzunehmen, die dann zu einer optischen Hervorhebung führen. Dazu erstellt - oder ergänzt - man eine entsprechende Datei namens &lt;code&gt;user.css&lt;/code&gt; im Verzeichnis des Themes (&lt;code&gt;templates/2k11&lt;/code&gt;) entsprechend (deren Nutzung freilich in der Konfiguration des Themes aktiviert sein muss), bspw. so wie hier in diesem Blog:&lt;/p&gt;

&lt;p&gt;&lt;div class=&quot;css geshi&quot; style=&quot;text-align: left&quot;&gt;&lt;ol&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;&lt;span style=&quot;color: #6666ff;&quot;&gt;.serendipity_comment_author_self&lt;/span&gt; &lt;span style=&quot;color: #00AA00;&quot;&gt;&amp;#123;&lt;/span&gt; &lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;background&lt;/span&gt;&lt;span style=&quot;color: #00AA00;&quot;&gt;:&lt;/span&gt; &lt;span style=&quot;color: #cc00cc;&quot;&gt;#ff9&lt;/span&gt;&lt;span style=&quot;color: #00AA00;&quot;&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;padding&lt;/span&gt;&lt;span style=&quot;color: #00AA00;&quot;&gt;:&lt;/span&gt; &lt;span style=&quot;color: #933;&quot;&gt;0.5em&lt;/span&gt;&lt;span style=&quot;color: #00AA00;&quot;&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;border-radius&lt;/span&gt;&lt;span style=&quot;color: #00AA00;&quot;&gt;:&lt;/span&gt; &lt;span style=&quot;color: #933;&quot;&gt;0.75em&lt;/span&gt;&lt;span style=&quot;color: #00AA00;&quot;&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;&lt;span style=&quot;color: #00AA00;&quot;&gt;&amp;#125;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;&lt;/p&gt;

&lt;p&gt;Die Überprüfung erfolgt standardmäßig auf Identität der jeweils angegebenen &lt;strong&gt;Namen&lt;/strong&gt; von Kommentar- und Eintragsautor, nicht über die Identität der E-Mail-Adresse. Das lässt sich natürlich ändern, bspw. in der Datei &lt;code&gt;comments_by_author.tpl&lt;/code&gt; im Theme-Verzeichnis (&lt;code&gt;templates/2k11&lt;/code&gt;). Bei einer Überprüfung auf Identität der E-Mail-Adresse wäre aber zu prüfen, ob nicht etwa ein Spamschutz-Plugin die Ausgabe der E-Mail-Adressen unterdrückt; falls doch, stehen die entsprechenden Daten für &lt;em&gt;Smarty&lt;/em&gt; nicht zur Verfügung. Nachdem zumindest in &lt;em&gt;2k11&lt;/em&gt; ohnehin über das Template selbst die Ausgabe der Mailadressen unterbunden wird, kann man die entsprechende Spamschutz-Konfiguration aber auch getrost deaktivieren.&lt;/p&gt;

&lt;p&gt;Im &lt;em&gt;Serendipity&lt;/em&gt;-Forum finden sich zu den näheren Einzelheiten u.a. folgende Threads:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://board.s9y.org/viewtopic.php?f=10&amp;amp;t=19115&quot; title=&quot;301 Moved Permanently&quot;&gt;2k11 und Kommentare vom Autor&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://board.s9y.org/viewtopic.php?f=2&amp;amp;t=13593&quot; title=&quot;301 Moved Permanently&quot;&gt;Way to indicate comments made by (logged in) user/admin&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Beachten sollte man im übrigen, dass natürlich letztlich jedermann Namen und E-Mail-Adresse des Blogautors für Kommentare verwenden kann &amp;#8230;&lt;/p&gt;
&lt;img src=&quot;https://ssl-vg03.met.vgwort.de/na/452ab62e4cc34110bde743f27e4f3f33&quot; width=&quot;1&quot; height=&quot;1&quot; alt=&quot;&quot;&gt; 
    </content:encoded>

    <pubDate>Sun, 01 Jun 2014 07:45:00 +0000</pubDate>
    <guid isPermaLink="false">https://netz-rettung-recht.de/archives/1726-guid.html</guid>
    <category>anleitung</category>
<category>s9y</category>

</item>
<item>
    <title>Dokuwiki als &quot;Multisite&quot;-Installation</title>
    <link>https://netz-rettung-recht.de/archives/1727-Dokuwiki-als-Multisite-Installation.html</link>
            <category>Bits'n'Bytes</category>
    
    <comments>https://netz-rettung-recht.de/archives/1727-Dokuwiki-als-Multisite-Installation.html#comments</comments>
    <wfw:comment>https://netz-rettung-recht.de/wfwcomment.php?cid=1727</wfw:comment>

    <slash:comments>0</slash:comments>
    <wfw:commentRss>https://netz-rettung-recht.de/rss.php?version=2.0&amp;type=comments&amp;cid=1727</wfw:commentRss>
    

    <author>nospam@example.com (Thomas Hochstein)</author>
    <content:encoded>
    &lt;p&gt;&lt;a href=&quot;https://www.dokuwiki.org/&quot; title=&quot;Bot Check&quot;&gt;&lt;strong&gt;DokuWiki&lt;/strong&gt;&lt;/a&gt; ist für mich derzeit und schon länger die generische Antwort auf die Frage nach einem Wiki, nicht nur für Dokumentationszwecke, und auch für die Frage nach einem (simplen) CMS.&lt;/p&gt;

&lt;p&gt;Ich installiere &lt;em&gt;DokuWiki&lt;/em&gt; dabei (wie die meisten Webapplikationen) nicht als Debian-Paket, sondern direkt vom Erzeuger; zum einen, weil ich gerne eine aktuelle Version habe, zum anderen, weil ich dann (wie bei anderen Webseiten) frei entscheiden kann, wo die Dateien liegen sollen - und das ist in der Regel nicht dort, wo Debian sie ablegen würde, insbesondere, wenn es mehr als einen Nutzer mit Webseiten geben soll - und nicht zuletzt, weil das trivial funktioniert. Das führt dazu, dass ich Updates von Hand durchführen muss, und das kann dann schon etwas nervig werden, wenn es mehrere Hosts und mehrere Wikis betrifft.&lt;/p&gt;

&lt;p&gt;Daher überlege ich schon länger, wie ich - zumindest bei Installationen auf demselben Host - den Aufwand (und, natürlich, auch den Platzverbrauch) minimieren kann. Die offenkundige Lösung ist eine &amp;#8220;Farm&amp;#8221;- oder &amp;#8220;Multisite&amp;#8221;-Installation, bei der der Code nur einmal vorhanden ist, aber jedes Wiki seine eigenen Konfiguration und natürlich seinen eigenen Speicherplatz für Inhalte hat. &lt;em&gt;DokuWiki&lt;/em&gt; unterstützt das prinzipiell, aber die nächste Frage ist ja immer, wie gut das auch tatsächlich funktioniert: stabil, flexibel und vor allem ohne krude Hacks.&lt;/p&gt;

&lt;p&gt;Nachdem ich mich diese Woche damit beschäftigt habe, kann ich sagen: es funktioniert gut. Die Flexibilität bleibt erhalten, Hacks braucht man nicht, weil die aktuellen &lt;em&gt;DokuWiki&lt;/em&gt;-Versionen eine &amp;#8220;Multisite&amp;#8221;-Installation unterstützen, und stabil wirkt es bisher auch.&lt;/p&gt;

&lt;p&gt;Der offensichtliche Vorteil liegt darin, dass man für beliebig viele Wikis nur einmal den Code für das Wiki selbst - und den für Plugins und Templates - installieren, updaten und pflegen muss. Der offensichtliche Nachteil liegt darin, dass alle Plugins und Templates im &amp;#8220;Master&amp;#8221;-Wiki installiert werden müssen und in den einzelnen Wikis nicht nachinstalliert werden können, und dass sich alle Wikis in Unterverzeichnissen unter einem &amp;#8220;Stammverzeichnis&amp;#8221; befinden müssen, deren Namen identisch mit der URL des Wikis sind.
Die Vorgehensweise zur Einrichtung ist recht einfach:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Man legt das &amp;#8220;Master&amp;#8221;- (oder &amp;#8220;Farm&amp;#8221;-) Wiki ganz normal an. Dieses Wiki kann man entweder als eigenständige Wiki-Instanz benutzen, oder man nutzt es nur zur Installation der Plugins und Templates, die den einzelnen &amp;#8220;nachrangigen&amp;#8221; Wiki-Installationen (&amp;#8220;Slaves&amp;#8221;, &amp;#8220;Animals&amp;#8221;) zur Verfügung stehen sollen. Auch das &amp;#8220;Master&amp;#8221;-Wiki muss aufrufbar sein, zumindest lokal.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Dieses Wiki konfiguriert man hinreichend sicher und installiert dort alle Plugins und Templates, die in irgendeinem der &amp;#8220;nachrangigen&amp;#8221; Wikis benötigt werden, denn nur diese stehen dort zur Verfügung. Die Installation eigener Plugins und Templates ist nicht möglich.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Man legt ein &amp;#8220;Multisite-Stammverzeichnis&amp;#8221; an, unter dem für jedes &amp;#8220;nachrangige&amp;#8221; Wiki ein eigenes Unterverzeichnis angelegt wird. Dieses Verzeichnis muss dem Hostnamen in der URL des Wikis (der &amp;#8220;Domain&amp;#8221;) entsprechen, also bspw. &amp;#8220;wiki.domain.example&amp;#8221; oder &amp;#8220;blablubb.schwupp.example&amp;#8221; heißen. Will man ein Wiki unter mehreren Namen aufrufen können, wird das nur als Redirect auf einen &amp;#8220;Hauptnamen&amp;#8221; (oder mittels Rewrite auf Ebene des Webservers) möglich sein.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Man aktiviert den &amp;#8220;Multisite&amp;#8221;-Modus im &amp;#8220;Master&amp;#8221;-Wiki.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Für jedes &amp;#8220;nachrangige&amp;#8221; Wiki wird das entsprechend benannte Unterverzeichnis im &amp;#8220;Stammverzeichnis&amp;#8221; angelegt und ein Template einkopiert.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;In der Webserver-Konfiguration legt man den &lt;em&gt;vhost&lt;/em&gt; so an, dass dessen &lt;em&gt;DocumentRoot&lt;/em&gt; auf das Verzeichnis des &amp;#8220;Master&amp;#8221;-Wikis (!) zeigt (&lt;strong&gt;nicht&lt;/strong&gt; auf das Verzeichnis des &amp;#8220;nachrangigen&amp;#8221; Wikis). Die &lt;em&gt;DocumentRoot&lt;/em&gt;-Einträge sind also für jedes &amp;#8220;nachrangige&amp;#8221; Wiki identisch!&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Webserver neustarten, URL des nachrangigen Wikis aufrufen, mit Standardpasswort einloggen, dieses ändern und das Wiki konfigurieren. Ungewollte Plugins kann man dort deaktivieren.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Weitere Wikis legt man durch Wiederholung der Schritte 5-7 an. Das Template für die neuen Wikis kann man nach den eigenen Bedürfnissen modifizieren; auch ist es durch entsprechende Konfiguration möglich, bspw. Benutzerdaten pp. zwischen mehreren Wiki-Instanzen zu teilen.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Updates - von &lt;em&gt;DokuWiki&lt;/em&gt; wie von Plugins und Templates - erfolgen immer nur im &amp;#8220;Master&amp;#8221;-Wiki.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Die entsprechende Dokumentation findet sich im &lt;em&gt;DokuWiki&lt;/em&gt;-Wiki unter &lt;a href=&quot;https://www.dokuwiki.org/farms&quot; title=&quot;Bot Check&quot;&gt;DokuWiki Farms&lt;/a&gt;; dort sind auch weitere Hinweise - u.a. zur Möglichkeit einer Konfiguration via &lt;code&gt;.htaccess&lt;/code&gt; und andere, ältere Lösungsmöglichkeiten - zu finden. Meines Wissens stellt Debian in aktuellen Versionen in seinem &lt;em&gt;DokuWiki&lt;/em&gt;-Paket auch entsprechende Tools zum &amp;#8220;automatischen&amp;#8221; Anlegen und Löschen von &amp;#8220;Multisite&amp;#8221;-Wikis über die Kommandozeile zur Verfügung.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Hinweis&lt;/strong&gt;:&lt;br /&gt;
Eine (un-)regelmäßig aktualisierte Anleitung zu diesem Thema findet sich in meinem Wiki unter &lt;a href=&quot;http://wiki.th-h.de/doku:dokuwiki-multisite&quot; title=&quot;302 Found&quot;&gt;&amp;#8220;Multisite&amp;#8221;-Installation von DokuWiki&lt;/a&gt;.&lt;/p&gt;
&lt;img src=&quot;https://ssl-vg03.met.vgwort.de/na/8fad68f11fa546e08c1619cc22b49692&quot; width=&quot;1&quot; height=&quot;1&quot; alt=&quot;&quot;&gt; 
    </content:encoded>

    <pubDate>Fri, 30 May 2014 10:55:00 +0000</pubDate>
    <guid isPermaLink="false">https://netz-rettung-recht.de/archives/1727-guid.html</guid>
    <category>anleitung</category>
<category>dokuwiki</category>

</item>

</channel>
</rss>
