Eine einfache Web-Galerie

Es kommt immer ganz gut, wenn man Freunden und Verwandten unkompliziert ein paar Fotos zeigen kann,  z.B. nach einer Party oder um den Nachwuchs zu dokumentieren. Bisher habe ich da immer Gallery für genommen, aber da das Projekt faktisch tot und eigentlich schon seit Version 2 deutlich überdimensioniert ist muß etwas neues her. Ein Großteil der Alternativen scheint mir allerdings auch unnötig mächtig für meine bescheidenen Ansprüche und daher dachte ich mir, das mache ich lieber selbst.

Mein erster Instinkt für eine Web-Anwendung wäre php, aber eigentlich benötige ich keine Web-Anwendung dafür. Eine Galerie, die nur sporadisch aktualisiert wird, muß nicht dynamisch sein, da reicht einfaches HTML.

Man nehme: Galerie1.png

  • eine Ordnerstruktur mit
  • entsprechend benamten Bildern
  • ImageMagick
  • ein paar Zeilen Shell-Skript:
#!/bin/bash

BASE=/var/www/html
TITLE="Bilder"
PICSIZE="256"
DIVSIZE=$( expr $PICSIZE + 30 )
CLEANUP=0

makeHTML() {
        cd "$1"
        [ $CLEANUP -gt 0 ] && {
                echo "cleaning up $(pwd)"
                rm *.png *.html 2>/dev/null
        }
        cat > index.html << EOF
<HTML>
        <HEAD>
                <TITLE>$TITLE</TITLE>
                <META http-equiv="Content-Type" content="text/html; charset=utf-8"/>
                <STYLE>
                        body {background-color:#eeeeff; }
                        .thumb { display:inline-block;width:${PICSIZE}px;height:${DIVSIZE}px;margin:20px; }
                        .caption { width:${PICSIZE}px;height:40px;vertical-align:bottom;text-align:center; }
                        img { box-shadow:10px 10px 10px grey; }
                </STYLE>
        </HEAD>
        <BODY>
EOF
        [ "$(pwd)" == "$BASE" ] || echo "<A href=..> <== </A><BR>" >> index.html
        echo "<DIV style=\"width:100%;text-align:center\"><H2>$TITLE</H2></DIV>" >> index.html
        [ "$(pwd)" == "$BASE" ] || echo "<DIV style=\"width:100%;text-align:center\"><H4>$1</H4></DIV>" >> index.html
        echo "<DIV style=\"text-align:center;\">" >> index.html

        for DIRITEM in *
        do
                SUFFIX=$(echo "$DIRITEM" | awk -F "." '{print $NF}')
                suffix=$(echo "$SUFFIX" | tr '[:upper:]' '[:lower:]')
                if [ -d "$DIRITEM" ]
                then
                        ( makeHTML "$DIRITEM" )
                        echo "<DIV class=thumb><A HREF=\"$DIRITEM\"><DIV><IMG src=\"$DIRITEM/folder.png\"></DIV></A><BR><DIV class=caption> $DIRITEM </DIV></DIV>" >> index.html
                elif [ $suffix == "jpg" ]
                then
                        FILENAME=$(basename "$DIRITEM" .$SUFFIX)
                        convert "$DIRITEM" -thumbnail ${PICSIZE}x${PICSIZE}^ -gravity center -extent ${PICSIZE}x${PICSIZE} "${FILENAME}.png"
                        [ -f folder.png ] || cp "${FILENAME}.png" folder.png
                        echo "<DIV class=thumb><A HREF=\"$DIRITEM\"><DIV><IMG src=\"${FILENAME}.png\"></DIV></A><BR><DIV class=caption>${FILENAME}</DIV></DIV>" >> index.html
                fi
        done
        [ "$(pwd)" == "$BASE" ] || [ -f folder.png ] || cp */folder.png . 2>/dev/null
        echo "</DIV></BODY></HTML>" >> index.html
        cd ..
}

makeHTML $BASE

Damit erhält man eine einfache kleine Galerie:

Galerie2.png

Das ganze kann man lokal laufen lassen und per FTP hochladen oder für maximale Faulheit alle paar Minuten per cronjob direkt auf dem Server. Wenn man den Bilder-Ordner dann noch irgendwie lokal synchronisiert (rsync, btsync, Dropbox…) reicht es neue Bilder in einen lokalen Ordner einzusortieren und wenige Minuten später ist die Galerie aktualisiert.

Virtualisierung mit KVM und WebVirtMgr (Teil 1) – update

Nicht ohne Grund haben sich in der modernen IT virtuelle Systeme für die meisten Serversysteme durchgesetzt. Aber auch für den ambitionierteren Privatanwender bietet es einige Vorteile. Für mich war insbesonders die fehlende Wechselwirkung zwischen den Systemen, wenn man pro Anwendung eine VM benutzt, und die einfache Portierbarkeit ausschlaggebend.

Eine gewisse Problematik, wenn man einen Rootserver eines typischen Hosters benutzt, ist daß der Großteil der verbreiteten Virtualisierungslösungen nicht trivial zu installieren sind. Normalerweise werden eine handvoll Linuxversionen in Standardausführung angeboten, die Installation von XenServer oder VMware erfordert hingegen oft einige Klimmzüge, z.B. per aufpreispflichtiger Remote-Konsole.

Nach etwas rumprobieren fiel meine Wahl also auf KVM, da es bei jedem aktuellen Linux bereits dabei ist, so daß ein Standard-Debian (oder eine andere Distribution, ich bevorzuge eben Debian) ausreicht. Um bei der Administration nicht nur auf der Kommandozeile rumzuhacken kombiniere ich das mit WebVirtMgr, eine WebGUI für libvirt.

UPDATE: leicht aktualisierte Version, außerdem benutze ich inzwischen Ubuntu-Server (16.04LTS) statt Debian, da ich ZFS verwenden möchte.

Im Folgenden gehe ich von einem frisch installiertem Ubuntu-Server und dem User root aus. Ein Großteil der Anleitung stammt von hier.

Teil 1: Installation WebVirtMgr

Benötigte Pakete installieren:

  • apt-get install -y libvirt-bin libvirt-daemon libvirt-daemon-system libvirt0 policykit-1 bridge-utils apache2-utils git python-pip python-libvirt python-libxml2 novnc supervisor apache2 qemu qemu-kvm

WebVirtMgr installieren:

  • cd /var/www
  • git clone git://github.com/retspen/webvirtmgr.git
  • cd webvirtmgr
  • pip install -r requirements.txt 
  • ./manage.py syncdb
  • ./manage.py collectstatic
  • nach Aufforderung einen User für das Webinterface erstellen

apache konfigurieren:

Da WebVirtMr normalerweise nur auf localhost erreichbar ist verwenden wir apache2 als Reverse Proxy

  • Datei /etc/apache/sites-available/000-default.conf editieren
<VirtualHost *:80>
  ServerAdmin mail@adres.se
  ServerName serverna.me

  ProxyPreserveHost On
  ProxyPass        "/" "http://127.0.0.1:8000/"
  ProxyPassReverse "/" "http://127.0.0.1:8000/"

  <Location />
    AuthType  Basic
    AuthName  "Nisch mit den Schuhn!"
    AuthUserFile  /etc/apache2/authfiles/htpasswd-virt
    Require   valid-user
  </Location>
</VirtualHost>

Weil sicher ist sicher richten wir einen zusätzlichen Passwortschutz ein (der Location-Block oben):

  • htpasswd -c /etc/apache2/authfiles/htpasswd-virt BENUTZERNAME

Sofern man verschlüsselt darauf zugreifen will (empfehlenswert!) analog mit der Datei /etc/apache2/sites-available/default-ssl.conf verfahren

zu guter Letzt die notwendigen Module aktivieren und den Dienst restarten:

a2enmod proxy

a2enmod proxy_http

a2enmod proxy_html

a2enmod ssl

a2enmod remoteip

service apache2 restart

Supervisor einrichten:

  • chown -R www-data /var/www/webvirtmgr
  • /etc/supervisor/conf.d/webvirtmgr.conf anlegen:
[program:webvirtmgr]
command=/usr/bin/python /var/www/webvirtmgr/manage.py run_gunicorn -c /var/www/webvirtmgr/conf/gunicorn.conf.py
directory=/var/www/webvirtmgr
autostart=true
autorestart=true
stdout_logfile=/var/log/supervisor/webvirtmgr.log
redirect_stderr=true
user=www-data

[program:webvirtmgr-console]
command=/usr/bin/python /var/www/webvirtmgr/console/webvirtmgr-console
directory=/var/www/webvirtmgr
autostart=true
autorestart=true
stdout_logfile=/var/log/supervisor/webvirtmgr-console.log
redirect_stderr=true
user=www-data
  • service supervisor stop
  • service supervisor start

Jetzt sollte WebVirtMgr auf Port 80 und 443 (also standard http/s) laufen und mit den eingerichteten Benutzerdaten zugänglich sein. Blöderweise reicht das noch nicht um die lokalen VMs zu managen, da man sich noch mit libvirt verbinden muß. Theoretisch funktioniert das lokal einfach per Socket, praktisch fehlt da noch ein authentication agent. Da ich nach 3 Sekunden googlen keine Lösung dafür gefunden habe  löse ich das Problem mit bekannten Mitteln: SSH.

lokale passwortlose ssh-Anmeldung einrichten:

  • adduser webvirtmgr
  • chown www-data /var/www
  • su - www-data -s /bin/bash
  • ssh-keygen -t rsa -b 2048 -N “” -f ~/.ssh/id_rsa
  • ssh-copy-id webvirtmgr@127.0.0.1

zum Testen einmal „ssh webwirtmgr@127.0.0.1“ als www-data ausführen, sollte ohne Passwortabfrage funktionieren. Stolperfalle: damit der User webvirtmgr auch die VMs verwalten darf muß er Mitglied der passenden Gruppe (libvirtd) sein.

(Update: scheint nicht mehr notwendig zu sein) Managementrechte einrichten:

Siehe auch hier (vermutlich verbirgt sich da auch die Lösung für den lokalen Socket).

  • Datei /etc/polkit-1/localauthority/50-local.d/org.libvirt.unix.manage.pkla anlegen:
Identity=unix-user:webvirtmgr
Action=org.libvirt.unix.manage
ResultAny=yes
ResultInactive=yes
ResultActive=yes

fertig:

Im WebVirtMgr unter Add Connection -> SSH Connection noch mit IP 127.0.0.1 und User webvirtmgr eine neue Verbindung anlegen und jetzt sollte man in der Lage sein die lokalen VMs und die zugehörige Infrastruktur zu administrieren.

Ausblick

Im 2. Teil beschreibe ich einige Tücken bei der Netzwerkkonfiuration und etwas zur Migration.

Rückschlag mit Ansage

Weihnachten ist böse. Im Dezember arbeite ich bevorzugt gar nicht. Freunde und Familie sind zu Besuch, dauernd gibt es Gelegenheiten zu feiern und gemütlich beisammen zu sein. Eine schöne Zeit. Aber auch eine gefährliche Zeit. Vermutlich war es schlimmer dadurch, daß ich davor noch halbherzig auf Diät war und die Weihnachtszeit zur Cheat-Zeit erklärt habe. Die Woche vom 4. Advent bis nach Weihnachten habe ich mein Essen nicht erfaßt und auch quasi keinen Sport und sonstige körperlichen Aktivitäten gemacht.

Das Ergebnis ist wie zu erwarten war: 3-4kg zugenommen (ja, 30.000kcal über Bedarf sind leider nicht unrealistisch, ein Großteil wird tatsächlich Fett sein)

Suenden.jpg

Das Gute ist, nach der massiven Völlerei bin ich wieder motivierter und ich weiß, daß ich das wieder wegkriege. Vorsatz für’s nächste Weihnachten: vorher moderat sündigen, damit ich nicht wieder so übertreiben muß.