bookmark_borderXKeyScore: Warum nicht selbst Email-Provider (Website-Betreiber, Cloud-Anbieter) sein?

Ubuntu 12.04 ServerMit einem VServer kann man relativ einfach und für wenig Geld einen Server betreiben, der fast vollständig unter der eigenen Kontrolle liegt. Ich habe seit 2006 einen solchen Server (das V steht für „virtuell“, es ist also kein eigenes Stück Hardware, sondern eine virtuelle Maschine) bei Strato. Dort betreibe ich unter Linux einen Email-Server und mehrere Webseiten (natürlich auch dieses Blog) sowie das Backend für meine App ScribMaster. Ebenso läuft dort ein Cloud-Speicher (owncloud), auf den ich von meinem Desktop, Tablet und Handy aus zugreifen kann. Der Server wird in Deutschland (Frankfurt) gehostet und ich habe ROOT-Zugriff. Ich mache das nicht, weil ich Angst um meine Privatsphäre habe, sondern eher weil ich gerne alles so einrichte, wie es mir passt und aus Spaß an der Technik. GMail ist sicherlich komfortabler, aber so kann ich vom Spam-Schutz über das Web-Interface alles bis ins kleinste selbst konfigurieren und aufsetzen. Der Vorteil wird aber auch schnell zum Nachteil, da man sich auch wirklich kümmern muss.

Jahrelang habe ich dabei auf SuSE Linux als Betriebssystem mit einem Plesk für die einfachere Konfiguration gesetzt, jetzt ist allerdings die verwendete Version so alt, dass mal wieder was neues fällig wird, schon allein aus Sicherheitsgründen. Das Plesk lässt sich schon lange nicht mehr updaten und verursacht auch manchmal einfach mehr Ärger, als dass es Arbeit spart (beispielsweise gab es im Laufe der Zeit doch einige gravierende Sicherheitslücken), so dass ich mich jetzt dazu entschieden habe, ein frisches Ubuntu 12.04 LTS (Long Time Support) ohne Plesk aufzusetzen. Ubuntu 12.04 wird nach Erscheinen noch fünf Jahre mit Updates (vor allem Sicherheitspatches) versorgt.

Um nicht alles selbst konfigurieren zu müssen, installiere ich noch ein ISPConfig, das ist eine komfortable Weboberfläche ähnlich zu Plesk, aber Open Source und etwas durchsichtiger, wenn man doch mal etwas manuell konfigurieren will. Ich habe mich dabei an diese Anleitung gehalten: Der perfekte Server.

Meinen ursprünglicher Plan, alles händisch einzurichten habe ich aufgrund der sehr komplexen Email-Server Konfiguration aufgegeben. Mit ISPConfig lassen sich mehrere Email-Postfächer einfacher einrichten und verwalten.

Über das Config-Panel von Strato kann man jederzeit eine von einigen zur Auswahl stehenden Linux-Distributionen zur Neuinstallation auswählen. Der Hostname und das (initiale) Root-Passwort kann man ebenfalls dort ablesen, so dass man schnell mit diesen Daten per SSH beispielsweise mithilfe von Putty eine Verbindung aufbauen kann. Ohne Plesk ist das Ubuntu noch recht nackt, es besitzt noch nicht einmal einen eingerichteten Webserver. Das wollen wir ändern!

Die folgenden Abschnitte sind nicht ganz vollständig und dienen eher dazu, dass ich noch nachvollziehen kann, was ich wie eingerichtet habe. Trotzdem sollte man damit und mit den verlinkten Tutorials einen eigenen Server aufsetzen können.

(Alle Befehle werden als „root“-User eingegeben!) Continue reading „XKeyScore: Warum nicht selbst Email-Provider (Website-Betreiber, Cloud-Anbieter) sein?“

bookmark_borderFotos/Videos verwalten und automatisiert herunterladen

Mittlerweile besteht meine Fotosammlung aus ca 22.000 Dateien mit einer Gesamtgröße von fast 100GB. Höchste Zeit mir ein paar Gedanken zur Verwaltung sowie Backups zu machen. Das wichtigste ist meiner Meinung nach eine gute Ordnung, mit der man die Fotos später auch wiederfindet. Ich habe mir mittlerweile folgende Ordnerstruktur überlegt:

fotos/yyyy/yyyy-mm-dd_beschreibung

Beispiel:

fotos/2011/2011-04-21_Stadtpark

Für die Dateien im RAW-Format meiner alten Canon EOS 1000D oder der neuen 60D gibt es noch bei Bedarf einen Unterordner namens raw. Aufgrund des hohen Speicherplatzbedarfs (bei der 60D verbraucht ein Foto im RAW-Format über 20 (!) MB) behalte ich nur sehr gute Fotos die ich nachbearbeiten möchte in diesem Format. Ebenso verfahre ich mit Videos, diese sind bei der 60D in Full-HD oder HD-Ready äußerst groß. Mit Hilfe des Kommandozeilen-Tools ffmpeg codiere ich diese um so dass sie bei geringem Qualitätsverlust nur noch ein zehntel bis zwanzigstel an Speicherplatz verbrauchen (im mp4-Format, der Codec ist x264):
ffmpeg -i EINGABEDATEI.MOV -y -f mp4 -vcodec libx264 -crf 28 -threads 0 -flags +loop -cmp +chroma -deblockalpha -1 -deblockbeta -1 -refs 3

-bf 3 -coder 1 -me_method hex -me_range 18 -subq 7 -partitions +parti4x4+parti8x8+partp8x8+partb8x8 -g 320 -keyint_min 25 -level 41 -qmin 10

-qmax 51 -qns 2 -qcomp 0.7 -trellis 1 -sc_threshold 40 -i_qfactor 0.71 -flags2 +mixed_refs+dct8x8+wpred+bpyramid -padcolor 000000 -padtop 0

-padbottom 0 -padleft 0 -padright 0 -acodec libfaac -ab 128kb -ar 48000 -ac 2 AUSGABEDATEI.mp4

Auf die Bedeutung der einzelnen Kommandozeilenparameter möchte ich nicht eingehen, x264 ist extrem komplex zu konfigurieren.

Zur eigentlichen Verwaltung der Fotos setze ich auf Picasa. Hier gibt es die Linux-Version. Diese Version (3.0) ist gegenüber der aktuellen Windows-Version schon ziemlich veraltet, es gibt aber einen Trick mit dem man die neueste Windows-Version auch unter Linux laufen lassen kann. Dazu installiert man zunächst die verlinkte Linux-Version (diese ist eigentlich ein Windows-Programm welches etwas optimiert mit einem WINE unter Linux ausführbar gemacht wird). Dann kann man nach dieser Anleitung die aktuelle Windows-Version dort einbinden. So kann man auch die geniale Gesichtserkennung von Picasa unter Linux nutzen!

Picasa

Für Backups verwende ich eine externe Festplatte welche ich aus Geschwindigkeitsgründen über eSata angeschlossen habe. Ab und an mache ich auch ein Backup auf meine Netzwerkfestplatte (NAS). Dazu verwende ich rsync inkrementell, und zwar so dass gelöschte Dateien auf meinem Rechner dann auch im Backup-Ordner gelöscht werden. Ab und an mache ich ein Full-Backup in einem gesonderten Verzeichnis falls ich versehentlich mal etwas wichtiges gelöscht haben sollte. Ein Beispiel für rsync:

rsync -r -t -v Bilder/ /media/274cec77-ec0d-4fd4-8ac2-c08a1f3e4eea/backups/fotos/

-r sorgt dafür dass in die Verzeichnisse rekursiv hinabgestiegen wird, -t behält den Zeitstempel der Ursprungsdatei bei und -v sorgt für ausführliche Ausgaben.

Zusätzlich habe ich noch ein Skript geschrieben welches automatisch ausgeführt wird wenn ich eine SD-Karte in den Kartenleser einlege. Es fragt mich dann ob ich die Bilder/Videos von der Karte automatisch in den entsprechenden Ordner herunterladen möchte (es wird dazu das aktuelle Datum verwendet). Es verwendet zenity um Dialogboxen unter Gnome darzustellen. Da ich es von udev als root ausführen lasse muss am Anfang noch das richtige DISPLAY gesucht werden. Die Pfade und Usernamen müssen natürlich noch an eigene Bedürfnisse angepasst werden:

#!/bin/bash

#Skript wird ausgeführt wenn SD-Karte eingesteckt wird...

#Muss von udev ausgeführt werden, mit nohup abkoppeln!

albumdir=/home/oster/Bilder/

sdcarddir=/media/EOS_DIGITAL/DCIM/

raw=raw/

video=./

pids=`pgrep -u oster gnome-panel`

DISPLAY_OSTER=`grep -z DISPLAY /proc/$pids/environ | sed -e 's/DISPLAY=//'`

mount /dev/sdcardcamera

if ! su oster -c "zenity --display=$DISPLAY_OSTER --question --title Fotos --text 'Fotos von Speicherkarte laden?'"; then

exit

fi

year=`date +%Y`

day=`date +%Y-%m-%d`

destdir=$albumdir$year/$day

if [ -e $destdir* ];then

echo $destdir already exists!

else

su oster -c "mkdir $destdir"

echo $destdir created.

su oster -c "mkdir $destdir/$raw"

su oster -c "mkdir $destdir/$video"

fi

su oster -c "nohup zenity --display=$DISPLAY_OSTER --info --text 'Kopiere Bilder..' &"

su oster -c "find $sdcarddir -name *.JPG -exec cp {} $destdir ;"

su oster -c "nohup zenity --display=$DISPLAY_OSTER --info --text 'Kopiere Raws..' &"

su oster -c "find $sdcarddir -name *.CR2 -exec cp {} $destdir/$raw ;"

su oster -c "nohup zenity --display=$DISPLAY_OSTER --info --text 'Kopiere Videos..' &"

su oster -c "find $sdcarddir -name *.MOV -exec cp {} $destdir/$video ;"

if su oster -c "zenity --display=$DISPLAY_OSTER --question --title Videos --text 'Videos umkonvertieren?'"; then

su oster -c "cd $destdir/$video && /home/oster/bin/videotox264.sh"

fi

su oster -c "zenity --display=$DISPLAY_OSTER --info --text 'Fertig!'"

Um dieses Skript nun automatisiert ausführen zu lassen lässt sich prima UDEV verwenden, nach dieser Anleitung muss man mittels

sudo lsusb -v

herausfinden welche Seriennummer die gewünschte Karte besitzt. Nun kann man unter

/etc/udev/rules.d/

eine neue Regel namens

99-sdcard.rules

anlegen mit folgendem Inhalt (Seriennummer und Pfade sollten natürlich noch angepasst werden):

BUS=="usb", KERNEL=="sd?1",SYSFS{serial}=="058F312D81B",SYMLINK+="sdcardcamera",RUN+="/home/oster/bin/fork /home/oster/bin/import_fotos.sh"

Das Skript namens

fork

sorgt dafür, dass UDEV nicht wartet dass das Import-Skript beendet ist bevor die SD-Karte eingehangen wird:

#!/bin/sh

#Entkoppeln des Skripts von udev:

/usr/bin/nohup $@ 1>/dev/null 2>&1

Das referenzierte Skript zum Umkodieren der Videos sieht folgendermaßen aus:

#!/bin/bash

# Komprimiert x264-Videos von Canon-DSLRs platzsparend (und qualitativ hochwertig).

# 2011 Stefan Ostermann#$1 input, $2 resolution

function recode {

ffmpeg -i $1 -y -f mp4 -vcodec libx264 $2 -crf 28 -threads 0 -flags +loop -cmp +chroma -deblockalpha -1 -deblockbeta -1 -refs 3 -bf 3 -coder 1 -me_method hex -me_range 18 -subq 7 -partitions +parti4x4+parti8x8+partp8x8+partb8x8 -g 320 -keyint_min 25 -level 41 -qmin 10 -qmax 51 -qns 2 -qcomp 0.7 -trellis 1 -sc_threshold 40 -i_qfactor 0.71 -flags2 +mixed_refs+dct8x8+wpred+bpyramid -padcolor 000000 -padtop 0 -padbottom 0 -padleft 0 -padright 0 -acodec libfaac -ab 128kb -ar 48000 -ac 2 "${1%.MOV}.mp4"

}function getwidth {

export width=`mplayer -frames 0 -vo null -ao null -identify -quiet 2>/dev/null $1 | grep -E -i "width"`

echo Width: $width

}

if [ $# -gt 0 ]; then

getwidth $1

elif [ $# -eq 0 ]; then

echo No Commandline-Parameter, decoding all MOVs...

for mov in *.MOV; do

if [ -e "${mov%.MOV}.mp4" ]; then

echo File "${mov%.MOV}.mp4" already exists, skipping...

else

recode $mov ""

fi

done

fiif [ "$width" == "ID_VIDEO_WIDTH=640" ]; then

echo 640x480-Video gefunden!

recode $1 "640x480"

elif [ $# -eq 1 ]; then

echo Found 16:9, keeping resolution

recode $1 ""

elif [ "$2" == "420p" ]; then

echo Found 16:9, Recode to 420p

recode $1 "-s 746x420"

elif [ "$2" == "720p" ]; then

echo Found 16:9, Recoding to 720p

recode $1 "-s 1280x720"

fi
Wie man die benötigten Programme/Codecs zum Umkodieren unter Ubuntu installiert habe ich hier beschrieben.

Das Anlegen dieser ganzen Skripte ist zwar recht kompliziert, automatisiert aber weitestgehend die Verwaltungs- und Umkodieraufgaben die mit so einer Kamera anfallen. Ich hoffe sie sind auch für andere nützlich.