| FOTO | AUTO | EDV | AUDIO |

DokuWiki

Installation von DokuWiki unter DietPi mit lighttpd und HTTPS

Diese Anleitung beschreibt die minimalistische und optimierte Installation von DokuWiki auf einem DietPi-System. Als Webserver wird 'lighttpd' verwendet. Die Installation ist rein dateibasiert und kommt ohne Datenbank aus. Die Absicherung der Verbindung erfolgt über HTTPS mit einem kostenlosen Let's Encrypt Zertifikat.

Voraussetzungen

  • Ein laufendes DietPi-System
  • 'lighttpd' ist installiert und über Port 80 erreichbar (z.B. via `dietpi-software`)
  • Root- oder sudo-Zugriff auf die Konsole
  • Eine aktive Internetverbindung
  • Ein Domainname, der auf die IP-Adresse des Servers zeigt:
creutz.spdns.de → 192.168.178.3

1. PHP und benötigte Erweiterungen installieren

dietpi-software install 89
apt update
apt install php-xml php-gd php-intl php-mbstring -y

2. PHP-FPM in lighttpd aktivieren

lighttpd-enable-mod fastcgi
lighttpd-enable-mod fastcgi-php-fpm
systemctl restart php8.2-fpm
systemctl restart lighttpd

3. DokuWiki herunterladen und installieren

cd /tmp
wget https://download.dokuwiki.org/src/dokuwiki/dokuwiki-stable.tgz
tar xvf dokuwiki-stable.tgz
mv dokuwiki-*/ /var/www/dokuwiki
chown -R www-data:www-data /var/www/dokuwiki
chmod -R 755 /var/www/dokuwiki

4. Angepasste lighttpd-Konfiguration

Bearbeiten der Datei /etc/lighttpd/lighttpd.conf:

server.modules = (
    "mod_indexfile",
    "mod_access",
    "mod_alias",
    "mod_redirect",
    "mod_rewrite",
    "mod_openssl",
    "mod_fastcgi",
    "mod_setenv"
)

server.document-root = "/var/www/dokuwiki"
server.upload-dirs   = ( "/var/cache/lighttpd/uploads" )
server.errorlog      = "/var/log/lighttpd/error.log"
server.pid-file      = "/run/lighttpd.pid"
server.username      = "www-data"
server.groupname     = "www-data"
server.port          = 80

index-file.names = ( "index.php", "index.html" )
url.access-deny = ( "~", ".inc", ".htaccess", "VERSION", "COPYING" )
static-file.exclude-extensions = ( ".php", ".pl", ".fcgi" )

$HTTP["url"] =~ "^/(data|conf|bin|inc)/" {
    url.access-deny = ("")
}
url.rewrite-if-not-file = (
    "^/_media/(.*)"  => "lib/exe/fetch.php?media=$1",
    "^/_detail/(.*)" => "lib/exe/detail.php?media=$1",
    "^/_export/([^/]+)/(.*)" => "doku.php?do=export_$1&id=$2",
    "^(.*)" => "doku.php?id=$1"
)

fastcgi.server = (
    ".php" => (
        "localhost" => (
            "socket" => "/run/php/php8.2-fpm.sock",
            "broken-scriptfilename" => "enable"
        )
    )
)

$SERVER["socket"] == ":80" {
    url.redirect = (
        "" => "https://${url.authority}${url.path}${qsa}"
    )
}

$SERVER["socket"] == ":443" {
    ssl.engine  = "enable"
    ssl.pemfile = "/etc/letsencrypt/live/creutz.spdns.de/fullchain.pem"
    ssl.privkey = "/etc/letsencrypt/live/creutz.spdns.de/privkey.pem"
    ssl.ca-file = "/etc/letsencrypt/live/creutz.spdns.de/chain.pem"

    ssl.use-sslv3 = "disable"
    ssl.honor-cipher-order = "enable"
    ssl.cipher-list = "ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-AES128-GCM-SHA256"
}

server.feature-flags += ("server.h2proto" => "enable")
server.feature-flags += ("server.h2c"     => "enable")
setenv.add-response-header = (
    "X-Frame-Options" => "SAMEORIGIN",
    "X-Content-Type-Options" => "nosniff",
    "X-XSS-Protection" => "1; mode=block"
)

5. HTTPS mit Let's Encrypt einrichten

dietpi-letsencrypt

Gib als Domain creutz.spdns.de an und folge den Anweisungen. Nach Abschluss ist HTTPS automatisch aktiv.

6. DokuWiki im Browser einrichten

Öffne im Browser:

https://creutz.spdns.de/install.php

Fülle die Felder aus, lege den Admin-Account an und bestätige.

7. Installation absichern

mv /var/www/dokuwiki/install.php /var/www/dokuwiki/install.php.bak

Ergebnis

  • ✅ DokuWiki läuft unter lighttpd auf DietPi
  • ✅ Zugriff unter https://creutz.spdns.de
  • ✅ Keine Datenbank nötig
  • ✅ Ressourcenschonend und abgesichert

Rechte nach Updates automatisch wiederherstellen

nano /usr/local/bin/dokuwiki-fix-perms.sh

#!/bin/bash
DOCU_PATH="/var/www/dokuwiki"
 
chown -R www-data:www-data "$DOCU_PATH"
find "$DOCU_PATH" -type d -exec chmod 755 {} \;
find "$DOCU_PATH" -type f -exec chmod 644 {} \;
 
find "$DOCU_PATH/data"        -type d -exec chmod 775 {} \;
find "$DOCU_PATH/data"        -type f -exec chmod 664 {} \;
find "$DOCU_PATH/lib/plugins" -type d -exec chmod 775 {} \;
find "$DOCU_PATH/lib/plugins" -type f -exec chmod 664 {} \;
find "$DOCU_PATH/lib/tpl"     -type d -exec chmod 775 {} \;
find "$DOCU_PATH/lib/tpl"     -type f -exec chmod 664 {} \;

Danach ausführen:

chmod +x /usr/local/bin/dokuwiki-fix-perms.sh

Plugins

Plugin sidebar: Keine störende Sidebar in Admin und Edit

Die neue action.php:

<?php
/**
 * Sidebar Action Plugin
 *
 * @license    GPLv3 (http://www.gnu.org/licenses/gpl.html)
 * @link       http://www.dokuwiki.org/plugin:sidebar
 * @author     Markus Birth <markus@birth-online.de>
 * @author     Christopher Smith <chris@jalakai.co.uk>
 */
 
if(!defined('DOKU_INC')) die();
if(!defined('DOKU_PLUGIN')) define('DOKU_PLUGIN',DOKU_INC.'lib/plugins/');
require_once(DOKU_PLUGIN.'action.php');
 
class action_plugin_sidebar extends DokuWiki_Action_Plugin {
    protected static $done = false;
 
    /**
     * return some info
     */
    function getInfo(){
        return confToHash(dirname(__FILE__).'/INFO.txt');
    }
 
    /**
     * plugin should use this method to register its handlers with the dokuwiki's event controller
     */
    public function register(dokuwiki\Extension\EventHandler $controller) {
        $controller->register_hook('TPL_ACT_RENDER', 'AFTER', $this, '_output');
    }
 
    function _debug(&$event, $param) {
        ptln($param);
        ptln('');
    }
 
    function _output(&$event, $param) {
        // ### ANPASSUNG START ###
        // Verhindert die Anzeige der Sidebar im Admin-Bereich, beim Editieren UND in der Vorschau
        global $ACT; if ($ACT == 'admin' || $ACT == 'edit' || $ACT == 'preview') return;
        // ### ANPASSUNG ENDE ###
 
        if (!$this->getConf('enable') || self::$done) return;
        self::$done = true;    // prevent recursive calls when doing tpl_content() later on
        $bodyClass = 'sidebar sidebar_' . $this->getConf('layout') . '_' . $this->getConf('orientation');
        ptln('</div>', 2);    // close the main content area
        ptln('<script type="text/javascript">', 2);
        ptln('var body = document.getElementsByTagName(\'BODY\')[0].className = \'' . $bodyClass . '\';', 4);
        ptln('</script>', 2);
        ptln('<style type="text/css" media="print">', 2);
        ptln('#sidebar { display: none; }', 4);
        ptln('</style>', 2);
        ptln('<div id="sidebar">', 2);
        ptln('<div id="sidebartop">', 4); $this->tpl_sidebar_editbtn(); ptln('</div>', 4);
        ptln('<div id="sidebar_content">', 4); $this->tpl_sidebar_content(); ptln('</div>', 4);
        // the </div> for closing the "sidebar"-div will be provided by DokuWiki main template
    }
 
    // recursive function to establish best sidebar file to be used
    function getSidebarFN($ns, $file) {
        // check for wiki page = $ns:$file (or $file where no namespace)
        $nsFile = ($ns) ? "$ns:$file" : $file;
        if (file_exists(wikiFN($nsFile)) && auth_quickaclcheck($nsFile)) return $nsFile;
 
        // no namespace left, exit with no file found
        if (!$ns) return '';
 
        // remove deepest namespace level and call function recursively
        $i = strrpos($ns, ":");
        $ns = ($i) ? substr($ns, 0, $i) : false;
        return $this->getSidebarFN($ns, $file);
    }
 
    // print a sidebar edit button - if appropriate
    function tpl_sidebar_editbtn() {
        global $ID;
 
        // check sidebar configuration
        if (!$this->getConf('showeditbtn') || !$this->getConf('page')) return;
 
        // check sidebar page exists
        $fileSidebar = $this->getSidebarFN(getNS($ID), $this->getConf('page'));
        if (!$fileSidebar) return;
 
        // check user has edit permission for the sidebar page
        if (auth_quickaclcheck($fileSidebar) < AUTH_EDIT) return;
 
        ptln('<div class="secedit">', 6);
        ptln('<form class="button" method="post" action="' . wl($fileSidebar, 'do=edit') . '" onsubmit="return svchk()">', 8);
        ptln('<input type="hidden" name="do" value="edit" />', 10);
        ptln('<input type="hidden" name="rev" value="" />', 10);
        ptln('<input type="hidden" name="id" value="' . $fileSidebar . '" />', 10);
        ptln('<input type="submit" value="' . $this->getConf('editbtntxt') . '" class="button" />', 10);
        ptln('</form>', 8);
        ptln('</div>', 6);
    }
 
    // display the sidebar
    function tpl_sidebar_content() {
        global $ID, $REV, $ACT, $conf;
 
        // save globals
        $saveID = $ID;
        $saveREV = $REV;
        $saveACT = $ACT;
 
        // discover file to be displayed in navigation sidebar
        $fileSidebar = '';
 
        if ($this->getConf('page')) {
                $fileSidebar = $this->getSidebarFN(getNS($ID), $this->getConf('page'));
        }
 
        // determine what to display
        if ($fileSidebar) {
            $ID = $fileSidebar;
            $REV = '';
            $ACT = 'show';
            // ptln(p_wiki_xhtml($ID, $REV, false));
            tpl_content();
        } else {
#           global $IDX;
#           html_index($IDX);
#           $ID = getNS($ID);
            $REV = '';
            $ACT = 'index';
            tpl_content();
        }
 
        // restore globals
        $ID = $saveID;
        $REV = $saveREV;
        $ACT = $saveACT;
    }
}

die neue style.css:

/**
 * Extra styles for sidebar template
 *
 * @author Christopher Smith <chris@jalakai.co.uk>
 */
 
/* dokuwiki containers & styles */
 
/* sidebar orientation and position */
#sidebar {
  width:8%;
  margin:0;
  padding:0;
  position: relative;
}
 
#sidebartop {
  position: absolute;
  top: -17em;
  width: 100%;
  height: 1.2em;
  background: __background_neu__;
}
 
.sidebar_inside_left #sidebar {
    float:left;
}
 
.sidebar_inside_right #sidebar {
    float:right;
}
 
.sidebar_inside_left .dokuwiki div.breadcrumbs {
    float: right;
    width: 78%;
    padding: 0 1% 0 0.9%;
}
 
.sidebar_inside_left .dokuwiki .page, .sidebar_inside_left .dokuwiki .meta {
    float:right;
    width:77%;             /* also see IE Win fix below */
    margin-right: 1%;
    margin-left:0;
}
 
.sidebar_inside_right .dokuwiki .page, .sidebar_inside_right .dokuwiki .meta, .sidebar_inside_right .dokuwiki div.breadcrumbs {
    float:left;
    width:77%;
    margin-left: 1%;
    margin-right: 0;
}
 
.sidebar_outside_left #sidebar {
    position:absolute;
    top:11em;
    left:30em;
}
 
.sidebar_outside_right #sidebar {
    position:absolute;
    top:0;
    right:0;
}
 
.sidebar_outside_left .dokuwiki {
    padding-left:21%;
}
 
.sidebar_outside_right .dokuwiki {
    padding-right:21%;
}
 
.sidebar_outside_left .footerinc {
    padding-left: 21%;
}
 
.sidebar_outside_right .footerinc {
    padding-right: 21%;
}
 
/* sidebar presentation */
/* the following three styles use a faux-column image to place a separating line
   between the sidebar and dokuwiku */
.sidebar_outside_left .dokuwiki, .sidebar_inside_left .dokuwiki {
    background: url(images/sidebar-border.gif) repeat-y 20%;
}
 
.sidebar_outside_right .dokuwiki, .sidebar_inside_right .dokuwiki {
    background: url(images/sidebar-border.gif) repeat-y 80%;
}
 
/* hide the line where it passes through .stylehead */
.stylehead {
    background: __background__;
}
 
/* sidebar contents */
#sidebar {
    font-size:10px;
}
 
#sidebar a {
    color: __existing__;
}
 
#sidebar a.wikilink2 {
    color: __text_neu__;
}
 
#sidebar a.wikilink2:hover {
    text-decoration:none;
    cursor:default;
}
 
#sidebar h1 {
    font-size:140%;
    margin-left: 0px;
    padding-left: 2px;
    font-weight:bold;
    padding-bottom:0;
    background-color: __background_alt__;
}
#sidebar h2 {
    font-size:120%;
    margin-left: 4px;
    font-weight:bold;
    padding-bottom:0;
}
#sidebar h3 {
    font-size:120%;
    margin-left: 8px;
    font-weight:normal;
    padding-bottom:0;
}
#sidebar h4 {
    font-size:100%;
    margin-left: 12px;
    font-weight:bold;
    padding-bottom:0;
}
#sidebar h5 {
    font-size:100%;
    margin-left: 16px;
    font-weight:normal;
    padding-bottom:0;
}
#sidebar .toc {
    display:none;
}
 
#sidebar .secedit {
}
 
/* reduced section indentation */
#sidebar div.level1 {margin-left: 2px;}
#sidebar div.level2 {margin-left: 6px;}
#sidebar div.level3 {margin-left: 10px;}
#sidebar div.level4 {margin-left: 14px;}
#sidebar div.level5 {margin-left: 18px;}
 
/* IE fixes (hide from IE Mac) \*/
 
* html .page .toc {height:1px}    /* General Dokuwiki fix. IE needs this to always display TOC contents \*/
* html pre {width:95%;}           /* General Dokuwiki fix - very important for Sidebar. IE needs this to get the overflow:auto style to kick in \*/
* html .stylehead {height:1px;}   /* Get IE in hasLayout mode to ensure the background covers the whole element \*/
 
* html .sidebar_inside_left .page, * html .sidebar_inside_right .page,
* html .sidebar_inside_left .meta, * html .sidebar_inside_right .meta {
    width: 77%;                   /* IE needs extra gap to ensure #sidebar & .page float next to each other \*/
    overflow-x: auto;             /* IE proprietary property to prevent wide images in wiki page forcing sidebar down below wiki page \*/
                                  /* 'overflow-x:auto;' maybe replaced by 'overflow:auto;' to ensure template passes w3c validation \*/
}
 
/* (end IE Mac hiding) */
 
/* duplicate standard DW styles with increased specificity to counter some sidebar styles */
.sidebar_outside_left .insitu-footnote, .sidebar_inside_left .insitu-footnote {
  background-color: __background_other__;
}
/* counteract some inappropriate DW styling */
.sidebar div.dokuwiki #bar__bottom {
  margin-bottom: 0;
}
.sidebar div.dokuwiki p.license {
  background-color: __background_other__;
  padding-top: 3px;
}