Ich habe Anfang des Jahres mein altes Wiki (wikiarchiv.natenom.de), das mit DokuWiki betrieben wurde, in eine statische Website umgewandelt und somit archiviert. Die meisten Bereiche habe ich in mein neues Wiki (wiki.natenom.de) migriert.

Jedoch waren der Einfachheit halber bis heute auch die migrierten Bereiche weiterhin im alten Wiki auf Dateiebene hinterlegt, aber wegen der Weiterleitungen nicht abrufbar.

Die Weiterleitungen führten für migrierte Inhalte via HTTP Status Code 301 zum neuen Wiki.

Heute war es endlich an der Zeit, die alten Inhalte aus dem archivierten, alten Wiki restlos zu löschen.

Damit ich auch in Zukunft noch nachlesen kann, wie ich das gemacht hatte oder falls jemand das selbst für ein eigenes Wiki machen möchte, habe ich hier die Anleitung dazu bereit gestellt.

Überlegungen zum Entfernen der migrierten Bereiche aus dem archivierten Wiki

Ein paar Gedanken dazu, ob es sinnvoll ist, die migrierten Bereiche zu entfernen:

  • Im Seitenindex im Wiki und in der Sitemap fehlen die migrierten URLs. Diese wurden aber sowieso schon seit Monaten mit 301 weitergeleitet aufs neue Wiki und bleiben weiterhin via nginx-Konfiguration im Webserver, sodass auch alte Verlinkungen auf migrierte Inhalte weiterhin richtig zum neuen Wiki auflösen.
  • Man kann jetzt nur nicht mehr im alten Wiki stöbern sondern muss dazu ins neue Wiki.
  • Für Suchmaschinen ist es vermutlich besser, weil die meisten migrierten Inhalte nicht mehr nur aus Weiterleitungen bestehen. Zudem gucken Suchmaschinen dank 301 sowieso seit Langem nur noch im neuen Wiki.

Wenn jemand hierzu Gedanken hat, bitte anschreiben. 😊

Was wird in dieser Anleitung gemacht?

Auf dem lokalen Rechner wird:

  • der Webserver Nginx installiert.
  • eine temporäre lokale Domain eingerichtet und verwendet.
  • das Wiki konfiguriert.
  • das Wiki via wget heruntergeladen und das Ergebnis modifiziert.

Schließlich wird das Ergebnis auf den öffentlichen Webserver (wiki.natenom.de) hochgeladen und bleibt dort auf ewig liegen und wird nie wieder angetastet.

Vorbereitungen

Als Basis habe ich meine damalige Dokumentation verwendet, die beschreibt, wie man ein DokuWiki in eine statische Website umwandelt, siehe hier.

Installation der benötigen Debian-Pakete

apt install nginx php8.1 php-fpm php8.1-xml

Lokale Domain fürs Wiki

Man kann zwar auch die richtige Domain verwenden und diese auf den lokal Rechner verweisen lassen aber das birgt Probleme, falls man z. B. HSTS verwendet. Dann wird man jedes Mal auf https weitergeleitet, was hier in dieser Anleitung aber nicht eingerichtet wird.

Die lokale Domain habe ich einfach mal auf wiki.natenom.me festgelegt und verwende sie hier in allen Shell-Kommandos entsprechend.

In die Datei /etc/hosts trägt man dazu ein:

127.0.0.1 wiki.natenom.me

Lokalen Webserver konfigurieren

Hier die Konfiguration für den lokalen Nginx-Server:

Datei /etc/nginx/sites-enabled/default
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
server {
    listen 80;

    server_name wiki.natenom.me;
    autoindex off;
    index index.html index.htm index.php doku.php;
    root /home/wiki.natenom.de/htdocs/;

    rewrite ^/_media/favicon.ico$ /_cdn/images/natenom_favicon_16x16.ico;
    rewrite ^/_media/wiki/apple-touch-icon.png$ /_cdn/images/natenom_favicon_512x512.png;
    rewrite ^/favicon.png$ /_cdn/images/natenom_favicon_16x16.png;

    location / {
        try_files $uri $uri/ @dokuwiki;
    }

    location ~ ^/lib.*\.(gif|png|ico|jpg)$ {
        expires 96h;
    }

    location = /robots.txt  { access_log off; log_not_found off; }
    location ~ /\.          { access_log off; log_not_found off; deny all; }
    location ~ ~$           { access_log off; log_not_found off; deny all; }

    location @dokuwiki {
        rewrite ^/sitemap.xml.gz /?do=sitemap;
        rewrite ^/_media/(.*) /lib/exe/fetch.php?media=$1 last;
        rewrite ^/_detail/(.*) /lib/exe/detail.php?media=$1 last;
        rewrite ^/_export/([^/]+)/(.*) /doku.php?do=export_$1&id=$2 last;
        rewrite ^/(.*) /doku.php?id=$1 last;
    }

    location ~ \.php$ {
        try_files $uri =404;
        fastcgi_pass unix:/var/run/php/php8.1-fpm.sock;
        fastcgi_index  index.php;
        fastcgi_param  SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include /etc/nginx/fastcgi_params;
        fastcgi_param  QUERY_STRING     $query_string;
        fastcgi_param  REQUEST_METHOD   $request_method;
        fastcgi_param  CONTENT_TYPE     $content_type;
        fastcgi_param  CONTENT_LENGTH   $content_length;
        fastcgi_intercept_errors        on;
        fastcgi_ignore_client_abort     off;
        fastcgi_connect_timeout 60;
        fastcgi_send_timeout 180;
        fastcgi_read_timeout 180;
        fastcgi_buffer_size 128k;
        fastcgi_buffers 4 256k;
        fastcgi_busy_buffers_size 256k;
        fastcgi_temp_file_write_size 256k;
    }

    location ~ /(data|conf|bin|inc)/ {
        deny all;
    }
}
Warnung
In Zeile 35 muss man den genauen Pfad zum php-fpm anpassen, falls man eine andere Version verwendet.

Altes Backup des Wikis ins lokale Webserver-Verzeichnis kopieren

Ich habe natürlich noch ein Backup des gesamten htdocs-Verzeichnisses meines alten Wikis. Dieses habe ich nach /home/wiki.natenom.me/htdocs/ kopiert und anschließend dem Benutzer www-data und der zugehörigen Gruppe zugänglich gemacht.

chown -R www-data: /home/wiki.natenom.de/htdocs/

Das Wiki sollte jetzt per Browser benutzbar sein via http://wiki.natenom.me/.

Lokales Wiki konfigurieren

TopBar

Um deutlich zu zeigen, dass dieses Wiki archiviert wurde, habe ich die TopBar-Funktion von DokuWiki genutzt, sodass oben am Rand auf jeder Seite dieser Text angezeigt wird:

Der Quelltext der Seite /topbar ist:

//Dieses Wiki wurde archiviert und wird nicht mehr gepflegt. Mein neues Wiki gibt es auf [[natwikic>|wiki.natenom.com]]. Details auf der [[:|Startseite]].//

Feeds

Ich habe dieses Mal die Feeds des Wikis deaktiviert.

Indexmenu

Das Indexmenü habe ich dieses Mal so eingestellt, dass weiterhin JavaScript genutzt wird. Der Quelltext von /wiki/sidebar dazu ist:

**Navigation**
{{indexmenu>..#2|js#indextheme useheading navbar tsort noscroll nsort notoc nomenu }}
\\
----
    * [[:datenschutz|Datenschutz]]
    * [[nblog>impressum/|Impressum]]
    * [[:lizenz|Lizenz]]
    * [[:ueber|Über]]

Parameter erklärt:

  • Die #2 bewirkt, dass alle Seiten bis zur zweiten Ebene immer geöffnet sind. So sieht man auch mit deaktiviertem JavaScript noch die großen beiden Bereiche Minecraft und Mumble des Wikis in der Navigation.
  • nomenu deaktiviert das Rechtsklick-Menü im Indexmenüs.

Da die Grafiken für das Indexmenü später nicht mit wget heruntergeladen werden, muss man sie manuell in /lib/plugins/indexmenu/images/ des heruntergeladenen Wikis platzieren. Die passenden Bilder gibt es in /lib/plugins/indexmenu/images/ des Webservers. Da ich das Default-Theme verwende, werden nur die im Hauptverzeichnis benötigt und dazu das Verzeichnis indextheme/.

Verzeichnisauflistung der benötigten Dateien:
    .
    ├── close.gif
    ├── empty.gif
    ├── indexmenu_toolbar.png
    ├── indextheme
    │   ├── base.gif
    │   ├── empty.gif
    │   ├── folder.gif
    │   ├── folderh.gif
    │   ├── folderhopen.gif
    │   ├── folderopen.gif
    │   ├── info.txt
    │   ├── joinbottom.gif
    │   ├── join.gif
    │   ├── line.gif
    │   ├── minusbottom.gif
    │   ├── minus.gif
    │   ├── page.gif
    │   ├── plusbottom.gif
    │   └── plus.gif
    ├── larrow.gif
    ├── msort.gif
    ├── rarrow.gif
    └── toc_bullet.gif
Warnung
Damit das Indexmenü mit JavaScript funktioniert, darf solch ein Header nicht im Webserver gesetzt sein: add_header X-Content-Type-Options nosniff.

Bereiche entfernen

Jetzt werden die bereits migrierten Themenbereiche bzw. Namensräume aus dem Wiki entfernt.

In meinem Fall ist das alles innerhalb von /data/, das nicht zu Mumble, Minecraft oder dem Wiki selbst gehört.

Dazu löscht man die Namensräume (Verzeichnisse) und Dateien in diesen Bereichen:

  • /data/cache/
  • /data/media/
  • /data/media_attic/
  • /data/media_meta/
  • /data/meta/
  • /data/pages/

Danach könnte man sich im Wiki anmelden und den Suchindex neu erstellen lassen, falls man die Suche noch testweise verwenden möchte. Für die archivierte Seite ist der Suchindex jedoch irrelevant, da die Suche PHP benötigt und abgeschaltet sein wird.

Hinweis
Da ich auch später noch in der Lage sein möchte, lokal im Webserver sowohl auf das komplette Wiki als auch auf das reduzierte Wiki (nur noch die im alten Wiki verbliebenen Themenbereiche Mumble, Minecraft, Wiki und Über) zugreifen und Änderungen vornehmen zu können, habe ich das wie folgt gelöst: Es gibt zwei Varianten des Verzeichnisses /data/. Das passende binde ich dann auf dem lokalen Webserver per Symlink ein.

Optional History entfernen

Da mit dieser Anleitung hier immer nur der aktuelle Status einer Seite heruntergeladen wird und die History deaktiviert ist, kann man diese komplett aus dem Wiki entfernen. Oder es einfach sein lassen, weil es darauf keinen Zugriff geben wird.

Ich will es trotzdem hier erwähnt lassen, weil man so Daten löschen kann, die sowieso keinen Zweck mehr haben auf einer statischen Website.

Dazu das Verzeichnis /data/attic/ leeren, aber nicht löschen. Genauso kann man mit /data/media_attic/, mit /data/media_meta/ und mit /data/meta/ verfahren.

Wiki vom lokalen Webserver herunterladen

Nun wird das Wiki vom lokalen Webserver heruntergeladen, die Startseite verfügbar gemacht, die sonst fehlt und die Sitemap heruntergeladen.

Vorsicht beim Ausführen von Shellkommandos via Copy & Paste

Man sollte Shellkommandos aus Anleitungen, die in einem Browser angezeigt werden, grundsätzlich nicht einfach ungeprüft in die Shell einfügen und ausführen.

Denn es ist möglich, Teile des Codes z. B. via CSS zu verstecken. Diese Teile werden aber trotzdem kopiert und landen auch in der Shell, wo sie ausgeführt werden.

Besser ist es, die Kommandos erst in einen lokalen Texteditor einzufügen und dort zu prüfen, bevor man die ausführt.

Kopiere doch mal dieses Beispiel und füge es – in die Shell (!NEIN) – in einen Editor ein:

echo "Befehl 1"; echo "Befehl 3"

mkdir wiki_download
cd wiki_download

wget --recursive --no-clobber --page-requisites --html-extension --convert-links --restrict-file-names=unix --no-parent --reject-regex 'do=' -erobots=off --domains wiki.natenom.me http://wiki.natenom.me

cd wiki.natenom.me
cp index.html start.html
wget http://wiki.natenom.me/sitemap.xml.gz

Nachbearbeitung

Lokal verwendete Domain durch die spätere, richtige Domain ersetzen

Jetzt ersetzt man die massenhaft im heruntergeladenen Wiki hinterlegte lokal Domain durch die spätere, richtige Domain, die online verwendet wird.

Zuerst rekursiv in allen Dateien via sed und dann explizit in der sitemap.xml.gz und auch noch in lib/exe/manifest.php, wo aus irgendwelchen Gründen nur localhost steht.

cd wiki_download

shopt -s globstar ; for file in **/*; do test -f "${file}" && sed -i -e 's#http://wiki.natenom.me/#https://wiki.natenom.de/#g' "${file}"; done

gunzip sitemap.xml.gz
sed -i -e 's#http://localhost/./#https://wiki.natenom.de/#g' sitemap.xml
gzip sitemap.xml

sed -i -e 's#http:\\/\\/wiki.natenom.me\\/#https:\\/\\/wiki.natenom.de\\/#g' lib/exe/manifest.php

Eine 404-Seite

Zusätzlich habe ich noch eine 404-Seite hinzugefügt, die erwähnt, dass das Wiki archiviert wurde. Diese legt man im Hauptverzeichnis des heruntergeladenen Wikis als Datei 404.html ab und verweist in der Nginx-Konfiguration auf diese via error_page 404 /404.html;.

<html>
<body><h1>404 - File not found</h1>
<p>Das Wiki auf wiki.natenom.de wurde archiviert und in eine <a href="https://natenom.de/2022/03/dokuwiki-in-statische-website-umwandeln/">statische Website umgewandelt</a>.</p>
<p>Daher gibt es an vielen Stellen, f&uuml;r die PHP notwendig w&auml;re, eine 404 (File not found) Fehlermeldung.</p>
<p>Du kannst eine externe Suchmaschine benutzen, um Inhalte zu finden.</p>
</body>
</html>

Packen und hochladen

Das lokal heruntergeladene Wiki kann jetzt gepackt und hochgeladen werden.

cd wiki_download
zip -r wiki.natenom.me.zip wiki.natenom.me/

Dann lädt man es, wie auch immer, auf den Webserver hoch und entpackt es in das entsprechende htdocs-Verzeichnis, setzt die Berechtigungen passend und startet den Webserver neu.

Ergebnis

So sah die Startseite des archivierten Wikis bisher aus:

Und so sieht sie jetzt aus:

Und so sieht es ohne JavaScript aus:

Und so, falls der Browser so eingestellt ist, dass das Dark-Theme bevorzugt wird:

Anmerkungen für mich

  • Im Gegensatz zu früher heißt /.cdn/ jetzt /_cdn/ und wurde entsprechend in den Konfigurationen angepasst.