SELFHTML-Offline-Wiki
=====================

Ziel des Projektes ist, eine offline verwendbare Version des Wikis bereitzustellen.
Enthalten ist der Inhalt des Wikis abzüglich des Benutzer-Namensraumes in der zum Veröffentlichungszeitpunkt aktuellen Version.


Lizenz-Fragen
-------------
Das SELFHTML-Wiki unterliegt der Lizenz CC-BY-SA 3.0. Darin ist unter anderem Namensnennung enthalten.
In der Offline-Variante soll allerdings nicht der gesamte Datenbestand, insbesondere nicht die Daten der Nutzer, enthalten sein.
Es wird von den Wiki-Seiten und anderen Inhalten nur die zum Zeitpunkt der Erstellung aktuelle Revision übernommen, ohne Versionsgeschichte.
Damit entfallen die Namen der Bearbeiter und somit ist diese Version nicht mehr CC-BY-SA-3.0-konform. Daraus ergibt sich,
dass eine Veröffentlichung außerhalb privater Räume, sprich öffentliche Zugänglichmachung im Internet, nicht von der Lizenz abgedeckt ist.


Installation unter Windows
--------------------------

Dieser Absatz beschreibt die Installation eines eigenständig laufenden Systems. Dazu wird unter anderem der Webserver Nginx installiert.
Soll stattdessen der IIS verwendet werden, was für einen dauerhaft ausgelegten Betrieb besser ist, so ist sinngemäß wie im Absatz zu Linux/Unix beschrieben zu verfahren.

Komplett-Paket-Version
----------------------

- Herunterladen des Komplett-Paketes von https://selfhtml.org/offlinewiki/selfhtml-wiki-komplett.zip
- Entpacken über Rechtsklick und "Alle extrahieren" oder eine entsprechende Option, wenn ein Programm wie WinZip installiert ist.
- Starten der Datei setup.cmd
- Diese Datei führt durch den Installationsprozess und löscht anschließend die für den Betrieb nicht benötigten Dateien sowie sich selbst.
- Die heruntergeladene Datei selfhtml-wiki-komplett.zip wird zum Betrieb nicht benötigt und kann ebenfalls gelöscht werden.
- Die Installation erfolgt in das Verzeichnis, in das die selfhtml-wiki-komplett.zip entpackt wurde und die setup.cmd aufgerufen wurde.
  Dieses Verzeichnis kann problemlos umbenannt oder komplett an eine beliebige andere Stelle verschoben werden.
- Weiter im Abschnitt "Das Offline-Wiki verwenden"

Zu-Fuß-Version
--------------

1. Anlegen eines Verzeichnisses für das Offline-Wiki, z.B. D:\SELFHTML-Offline-Wiki.
    Es spielt sich alles in diesem Verzeichnis und dessen Unterverzeichnissen ab. (Ausnahme siehe unten, Voraussetzung für PHP)
2. Download von Nginx in oben genanntes/angelegtes Verzeichnis
    - getestet mit Version 1.12.1
    - http://nginx.org/en/download.html -> Stable version -> nginx/Windows-versionsnummer
    - Auspacken in das aktuelle Verzeichnis (Extract here), ein Unterverzeichnis nginx-versionsnummer wird dabei angelegt
    - Verzeichnis nginx-versionsnummer umbenennen in nginx (d.h. Versionsnummer entfernen)
    - Die Download-Datei nginx-versionsnummer.zip kann gelöscht werden.
3. Download von PHP für Windows in oben genanntes/angelegtes Verzeichnis
    - getestet mit Version 7.0.23, neuere Versionen des 7.0-Zweiges sollten problemlos gehen, 7.1 ist jedoch nicht von Mediawiki unterstützt
    - http://windows.php.net/download/
    - PHP 7.0.x (nicht die 7.1) in Variante "VCxx x64 Non Thread Safe" -> Zip
    - Auspacken in Unterverzeichnis (Extract to ...), das PHP-Zip-Archiv legt im Gegensatz zu Nginx kein separates Unterverzeichnis an.
    - Verzeichnis php-versionsnummer umbenennen in php
    - Die Download-Datei php-versionsnummer.zip kann gelöscht werden.
4. Voraussetzung für PHP
    - PHP benötigt das "Visual C++ Redistributable for Visual Studio 20..", das separat installiert werden muss.
    - Das ist auf http://windows.php.net/download/ im Kasten auf der linken Seite verlinkt.
        Die VCxx-Version muss mit der vom PHP-Paket übereinstimmen.
5. Download angepasste Mediawiki-Installation in oben genanntes/angelegtes Verzeichnis
    - https://selfhtml.org/offlinewiki/mediawiki-selfhtml.zip
    - Auspacken in das aktuelle Verzeichnis (Extract here), ein Unterverzeichnis mediawiki wird dabei angelegt
    - Die Download-Datei mediawiki-selfhtml.zip kann gelöscht werden.
6. Download der Daten-Datei
    - https://selfhtml.org/offlinewiki/selfhtml-offline.zip
    - Auspacken in das aktuelle Verzeichnis (Extract here), ein Unterverzeichnis install wird dabei angelegt
    - Ausführen der install.cmd im install-Verzeichnis, das kopiert einige Dateien an die richtige Stelle.
    - Die Download-Datei selfhtml-offline.zip kann gelöscht werden.
    - Auch das Verzeichnis install wird nicht mehr benötigt und sollte samt Inhalt gelöscht werden.

Die Verzeichnisstruktur sollte nun so aussehen:
D:\SELFHTML-Offline-Wiki\
    logs\
    mediawiki\ mit Unterverzeichnissen
    nginx\ mit Unterverzeichnissen
    php\ mit Unterverzeichnissen
    temp\
    sowie die Dateien nginx.conf, php.ini, start.cmd und offline-wiki-readme-installation.txt
    
Das Offline-Wiki verwenden
--------------------------

Im Offline-Wiki-Verzeichnis gibt es nun eine Datei start.cmd. Diese startet den Webserver und PHP.
Sie bleibt die ganze Zeit offen, solange der Server laufen soll. Abbrechen, wie angezeigt mit Strg+C. Das beendet das PHP.
Die Batch-Datei sollte danach noch bis zum Ende durchlaufen, um auch den Webserver zu beenden, also mit N antworten.

Im Browser kann nun http://localhost:8000 aufgerufen werden.

Soll ein anderer Port verwendet werden, kann das in der nginx.conf eingestellt werden. Dazu ist die Zeile "listen 8000;" zu ändern.
Die relevante Datei befindet sich im Offline-Wiki-Verzeichnis. Die Datei im nginx/conf-Unterverzeichnis wird nicht verwendet.
Außerdem wird noch der Port 9000 für PHP benötigt. Der muss bei Bedarf an zwei Stellen umgeschrieben werden,
in der start.cmd und in der nginx.conf.

Deinstallation
--------------

Ob Komplett-Paket oder Zu-Fuß-Version, ein einfaches Löschen des Offline-Wiki-Verzeichnises genügt.
Dieser Vorgang wird jedoch misslingen, wenn der Webserver nicht richtig beendet wurde.
Im Zweifelsfall kann vor dem Löschen noch einmal die start.cmd ausgeführt werden. Nach dem Abbrechen mit Strg+C muss mit N geantwortet werden.
Falls die start.cmd bereits gelöscht ist, müssen die Prozesse des nginx über den Task Manager von Windows beendet werden.
Diese sieht man aber nur in der Komplettansicht "Mehr Details". Ein Neustart des Systems hilft aber auch.

Außerdem wurde noch "Visual C++ Redistributable for Visual Studio 20.." installiert.
Es ist empfehlenswert, diese Installation im System zu belassen, da sie eventuell noch von anderen Programmen verwendet wird.
Ansonsten kann die Deinstallation über die Programmverwaltung der Systemsteuerung (Windows 10: Apps & Features) erfolgen.

Neue Version installieren
-------------------------

Die installierte Version kann im Verzeichnis des Offline-Wikis anhand der Dateien version-wiki-*.txt und version-data-*.txt ermittelt werden.

Um eine neue Komplett-Paket-Version zu installieren, kann das Installationsverzeichnis der alten Version gelöscht oder umbenannt werden,
oder die Installation in ein neues Verzeichnis erfolgen. Eine Installation in ein bestehendes Verzeichnis hinein ist nicht getestet und nicht empfehlenswert.
Ansonsten ist wie im Abschnitt "Komplett-Paket-Version" beschrieben zu verfahren.

Nginx und PHP können unabhängig von einer Bereitstellung eines neuen Komplett-Pakets aktualisiert werden.

- Um eine neue Nginx-Version zu installieren, kann das Verzeichnis nginx gelöscht werden.
  Die Installation der neuen Version erfolgt wie im Nginx-Abschnitt der Zu-Fuß-Version beschrieben.
- Um eine neue PHP-7.0.xx-Version zu installieren, kann das Verzeichnis php gelöscht werden.
  Die Installation der neuen Version erfolgt wie im PHP-Abschnitt der Zu-Fuß-Version beschrieben.
  
Wenn eine neue Wiki-Version oder ein neuer Datenbestand nicht als Komplett-Paket installiert werden soll, kann wie folgt verfahren werden.

Für eine neue Wiki-Version ist das Verzeichnis mediawiki zu entfernen.
Anschließend sind die Punkte Mediawiki-Installation und Daten-Dateien aus dem Abschnitt Zu-Fuß-Version auszuführen.

Für eine neue Daten-Version ist nur der Punkt Daten-Dateien aus dem Abschnitt Zu-Fuß-Version auszuführen.

Installation unter Linux/Unix
-----------------------------

1. Zunächst ist ein Webserver (zum Beispiel Apache oder Nginx) und PHP in der Version 7.0 zu installieren.
Version 7.1 ist von Mediawiki nicht unterstützt. Aber auch Versionen ab 5.5.9 aufwärts sind verwendbar.

Die Installation richtet sich nach der jeweiligen Variante von Linux und ist wegen der Vielfalt nicht Gegenstand dieser Dokumentation.
Bitte dazu eine geeignete Anleitung im Internet suchen. Beispielsweise hat https://www.howtoforge.com/ ausführliche Anleitungen für viele Systeme.
Bitte auch https://www.mediawiki.org/wiki/Manual:Installation_requirements#PHP konsultieren, vor allem die Verfügbarkeit der mbstring-Extension
ist gegebenenfalls überprüfen, sowie SQLite 3, alle anderen Extensions sollten im Lieferumfang enthalten sein.

Vorgesehen ist, dass für das Offline-Wiki ein eigener VHost zur Verfügung steht, oder der Webserver nur für das Offline-Wiki verwendet wird.
Der Webserver/VHost sollte so konfiguriert sein, dass index.php als DirectoryIndex verwendet wird.

Der Stand sollte nun sein, dass der Webserver und PHP läuft, und eine Testdatei index.php mit Inhalt 

    <?php phpinfo(); 

im Browser aufgerufen eine Menge PHP-Informationen zeigt.

2. Download angepasste Mediawiki-Installation
    - https://selfhtml.org/offlinewiki/mediawiki-selfhtml.zip
    - Download in ein beliebiges Arbeitsverzeichnis
    - Das zip-Archiv packt sich in ein Unterverzeichnis namens mediawiki aus.
    - Der Inhalt des Verzeichnisses mediawiki ohne das Verzeichnis selbst muss ins DocumentRoot des Webservers kopiert/verschoben werden.
    - Die eventuell zum Testen angelegte index.php muss überschrieben oder vorher gelöscht werden.
    - DocumentRoot ist das Verzeichnis, in dem die oben genannte testweise angelegte index.php liegen muss, um erfolgreich ausgeführt zu werden.
3. Download der Daten-Datei
    - https://selfhtml.org/offlinewiki/selfhtml-offline.zip
    - Download in ein beliebiges Arbeitsverzeichnis
    - Das zip-Archiv packt sich in ein Unterverzeichnis namens install aus.
    - Der Inhalt im Verzeichnis install/images muss ins Verzeichnis images im DocumentRoot kopiert/verschoben werden.
    - Der Inhalt im Verzeichnis install/local muss ins Verzeichnis local im DocumentRoot kopiert/verschoben werden.
    - Der Inhalt im Verzeichnis install/sqlite muss ins Verzeichnis data im DocumentRoot kopiert/verschoben werden.
    - Die anderen Dateien sind für die Linux-Variante nicht relevant.


User admin und sein Passwort
----------------------------

In der Wiki-Datenbank gibt es einen einzelnen Benutzer namens admin mit dem Password Password-1.
Man kann sich damit anmelden, aber nichts weiter tun, weil das Wiki auf Nur-Lesen konfiguriert ist.

Windows: Am Ende der LocalSettings.php im Unterverzeichnis mediawiki gibt es eine Zeile beginnend mit $wgReadOnly.
Linux: Am Ende der LocalSettings.php im DocumentRoot-Verzeichnis gibt es eine Zeile beginnend mit $wgReadOnly.

Diese kann mit einem // oder # am Anfang unwirksam gemacht werden, um das Passwort ändern zu können, aber auch um Bearbeitungen zuzulassen.
Das ist aber nicht Sinn und Zweck des Offline-Wikis.


Warum so und keine statischen Seiten?
-------------------------------------

Die Ausführungen zu dieser Offline-Version begannen damit, den gerenderten Hauptinhalt der jeweiligen Seiten im Wiki
von der Mediawiki-Software erstellen zu lassen und jeweils in einen statischen Seitenrahmen einzufügen. Erste Erfolge waren vielversprechend.
Recht zeitig wurde jedoch klar, dass für statische Seiten eine Nachbearbeitung/Umschreiben der Links notwendig gewesen wäre.
Die Seitentitel sind nicht dateisystemsicher, und für Links von und zu Unterseiten wären relative Pfad-Hangeleien nötig gewesen.
Ein kleiner Webserver, der die Seitentitel zu dateisystemsicheren Dateinamen übersetzt, erschien als eine gute Lösung. Doch dann zeigte sich,
woran auch schon andere Offline-Reader-Projekte gescheitert sind. Seit einigen Mediawiki-Versionen werden die nötigen CSS- und Javascript-Ressourcen 
von einem Resource-Loader eingebettet. Das geschieht teilweise erst per Nachladen zur Laufzeit.
Außerdem sind im Gerüst der Seite Meta-Informationen zum Inhalt eingebettet, die vom CSS und Javascript verwendet werden.
Der statische Seitenrahmen musste also ein Template mit Platzhaltern werden.
Und dafür musste Mediawiki-Funktionalität nachprogrammiert werden, damit die Daten in derselben Form kodiert sind, wie Mediawiki es tut.
Der entscheidenden K.O.-Punkt war jedoch neben den dynamisch nachgeladenen Ressourcen, dass die Suchfunktion so auch nicht geht,
denn die ist serverseitig bereitgestellt und hätte ebenfalls nachprogrammiert werden müssen. Die würde übrigens auch nicht vorhanden sein,
wenn man einen Links-folgenden Downloader auf die Seite ansetzt, weshalb dieser Ansatz bereits früher schon gescheitert war.

Die jetzige Lösung basiert aus diesen Gründen auf einem "handelsüblichen" Webserver (Nginx - relativ klein und für diesen Zweck völlig ausreichend),
einer PHP-Installation und einer SQLite-Datenbank, womit die Notwendigkeit eines Datenbanksystems à la MySQL/MariaDB oder PostgreSQL wegfällt.
Diese beiden Voraussetzungen müssen separat besorgt und gemäß der obigen Anleitungen installiert werden. Vom Offline-Projekt werden
eine Mediawiki-Installation inklusive aller verwendeten Extensions und einer angepassten Konfigurationsdatei geliefert,
die SQLite-Datenbank mit den textlichen Seiteninhalten, die im Wiki verwendeten Bilder, sowie vorgefertigte Konfigurationdateien für Nginx und PHP
und ein Start-Script. So zumindest für Windows, die Vorgehensweise unter Linux ist etwas anders.
