Follow knop

WordPress.com heeft sinds september 2011 de Follow button, een knop rechtsonderin waarmee bezoekers zich eenvoudig kunnen abonneren op nieuwe artikelen van een blog. Dit werkt alleen op WordPress.com websites maar er is een plugin geschreven die werkt met Jetpack.

Helaas was de code een beetje verouderd en daarom heb ik de code van WordPress.com gepakt en de code van de plugin geupdate zodat de layout exact overeenkomt met die van WordPress.com. Bewonder hem nu op MaartenvandeKamp.nl!

Herken de knop

Ingeklapt zie je het volgende rechtsonderin het scherm verschijnen:
Follow button WordPress.com

En uitgeklapt:

Follow Button ExpandedAlle gegevens worden doorgegeven aan de Subscription Widget die met Jetpack meekomt zodat een registratie zonder problemen aan WordPress.com wordt doorgegeven.

Statistieken December 2012 en heel 2012

Sinds augustus 2012 worden bezoekersstatistieken geregistreerd voor verschillende websites die ik beheer. Vooral de groei van MaartenvandeKamp.nl is enorm. De maand December heeft een grotere groei gekend dan November, wat al een flinke groei was t.o.v. Oktober.

Dit zijn kort de gegevens voor oktober, november en december:

Maand Bezoeken Pageviews Percentage bezoeken Percentage pageviews
Oktober 2012 2626 6734
November 2012 3268 8170 + 24.45% + 21.32%
December 2012 3864 10 332 + 17.5% + 26%

De pageviews zijn procentueel harder gestegen en heeft zelfs de grens van 10 000 doorbroken! Het aantal bezoeken ligt 7 procent lager dan de maand daarvoor maar dat vind ik niet gek voor de maand December met de vele feestdagen.

Het hele jaar

Zoals ik eerder al zei, sinds augustus meet ik de bezoekersstatistieken en hiervoor gebruik ik Piwik, een gratis open-source alternatief voor Google Analytics.

Piwik Statistieken 2012
Piwik Statistieken 2012

Ook is uit de grafiek te lezen dat het aantal pageviews harder stijgt dan het aantal bezoekers, wat betekent dat elke bezoeker meer pagina’s bekijkt dan de maanden daarvoor. Daaruit kan ik herleiden dat de site steeds meer de moeite waard wordt om te lezen.

Op naar 2013!

Zimbra 8 FOSS shell backup script – update

Eerder schreef ik al over een backupscript voor Zimbra 8 Open Source Edition, maar na het lezen van een post op de bugtracker, heb ik besloten om het enigszins aan te passen. Er werd namelijk afgeraden om de LDAP database te backuppen met rsync en in plaats daarvan moet er een export van de LDAP database worden gemaakt.

#!/bin/bash

# Zimbra Backup Script
# Requires that you have ssh-keys: https://help.ubuntu.com/community/SSHHowto#Public key authentication
# This script is intended to run from the crontab as root
# Date outputs and su vs sudo corrections by other contributors, thanks, sorry I don't have names to attribute!
# Free to use and free of any warranty!  Daniel W. Martin, 5 Dec 2008
## Adapted for rsync over ssh instead of ncftp by Ace Suares, 24 April 2009 (Ubuntu 6.06 LTS)

# Outputs the time the backup started, for log/tracking purposes
echo Starttijd backup = $(date +%T)
before="$(date +%s)"
# all the destination variables
ZIMBRADIR=/opt/zimbra/
LOCALBACKUPDIR=/backup/zimbra/$(date +%F-%H-%M-%S)
REMOTEBACKUPDIR=192.168.2.20:/volume1/Backups/zimbra
# Live sync before stopping Zimbra to minimize sync time with the services down
# Comment out the following line if you want to try single cold-sync only
#rsync -aHK --delete --backup /opt/zimbra/ /backup/zimbra/$(date +%F-%H-%M-%S)
# Now we need to shut down Zimbra to rsync any files that were/are locked
# whilst backing up when the server was up and running.
before2="$(date +%s)"
# Create LDAP config + database backup from zmslapcat (as user ZImbra from root crontab)
echo $(date +%T) Export the LDAP config database into LDIF format for backup purposes...
su - zimbra -c "/opt/zimbra/libexec/zmslapcat -c /tmp/zimbraldap"
echo $(date +%T) Export the primary LDAP database into LDIF format for backup purposes...
su - zimbra -c "/opt/zimbra/libexec/zmslapcat /tmp/zimbraldap"
echo $(date +%T) Backup van LDAP config + database gemaakt in /tmp/zimbraldap
# Move LDAP config + database backup to $LOCALBACKUPDIR
echo $(date +%T) Bestanden van /tmp/zimbraldap verplaatsen naar $LOCALBACKUPDIR...
mv /tmp/zimbraldap $LOCALBACKUPDIR
echo $(date +%T) LDAP backup verplaatst naar $LOCALBACKUPDIR...
# Stop Zimbra Services (as user Zimbra from root crontab)
echo $(date +%T) Zimbra wordt nu afgesloten...
su - zimbra -c "/opt/zimbra/bin/zmcontrol stop"
echo $(date +%T) Zimbra is afgesloten...
echo $(date +%T) 60 seconden wachten en dan alle overgebleven Zimbra processen killen...
sleep 60
# Kill any orphaned Zimbra processes
ORPHANED=`ps -u zimbra -o "pid="` && kill -9 $ORPHANED
echo $(date +%T) Mogelijke Zimbraprocessen zijn gekilld...
# Sync to local backup directory
echo $(date +%T) Rsync start met backup van /opt/zimbra naar /backup/zimbra...
rsync -aHK --delete --backup --exclude-from '/root/exclude.txt' $ZIMBRADIR $LOCALBACKUPDIR
echo $(date +%T) Lokale backup maken afgerond...
# Restart Zimbra Services (as user Zimbra from root crontab)
echo $(date +%T) Zimbra starten...
su - zimbra -c "/opt/zimbra/bin/zmcontrol start"
echo $(date +%T) Zimbra starten uitgevoerd...
# Calculates and outputs amount of time the server was down for
after="$(date +%s)"
elapsed="$(expr $after - $before2)"
hours=$(($elapsed / 3600))
elapsed=$(($elapsed - $hours * 3600))
minutes=$(($elapsed / 60))
seconds=$(($elapsed - $minutes * 60))
echo Server downtime: "$hours uur $minutes minuten $seconds seconden"
# Create a txt file in the backup directory that'll contains the current Zimbra
# server version. Handy for knowing what version of Zimbra a backup can be restored to.
echo $(date +%T) Zimbra versie toevoegen aan /opt/zimbra/conf/zimbra_version.txt...
su - zimbra -c "zmcontrol -v > /opt/zimbra/conf/zimbra_version.txt"
echo $(date +%T) Zimbra versie toegevoegd /opt/zimbra/conf/zimbra_version.txt...
# Display Zimbra services status
echo $(date +%T) Zimbra services status:
su - zimbra -c "/opt/zimbra/bin/zmcontrol status"
# backup the $localbackupdir to $remotebackupdir
echo $(date +%T) Remote backup starten...
rsync -aHK --delete-during $LOCALBACKUPDIR $REMOTEBACKUPDIR
echo $(date +%T) Remote backup uitgevoerd...
echo $(date +%T) Lokale backupmap verwijderen...
rm -Rf $LOCALBACKUPDIR
echo $(date +%T) Lokale backupmap verwijderd...
# Outputs the time the backup finished
echo Backupprocedure afgerond om = $(date +%T)
# Calculates and outputs total time taken
after="$(date +%s)"
elapsed="$(expr $after - $before)"
hours=$(($elapsed / 3600))
elapsed=$(($elapsed - $hours * 3600))
minutes=$(($elapsed / 60))
seconds=$(($elapsed - $minutes * 60))
echo Totale benodigde tijd: "$hours uur $minutes minuten $seconds seconden"
# end

Groei MaartenvandeKamp.nl

Er is weer een maand voorbij en ik wil zo af en toe gaan terugkijken op de maand. Afgelopen maand is een maand van groei geweest voor MaartenvandeKamp.nl.

Dit zijn kort de gegevens voor oktober en november:

Maand Bezoeken Pageviews Percentage bezoeken Percentage pageviews
Oktober 2012 2626 6734
November 2012 3268 8170 + 24.45% + 21.32%

Dat ziet er goed uit he? Ik ben zeer tevreden over mijn website en ik hoop dat de site blijft groeien!

Beveiliging van email in Zimbra met DKIM

Ik ben al een poosje bezig om mijn mailserver betrouwbaarder te maken door SPF-records aan de DNS toe te voegen. Tot nu toe is het nog niet helemaal geslaagd, maar vandaag heb ik wel een andere stap gezet, namelijk met DKIM.

Hoe werkt DKIM?

DKIM voegt het veld “DKIM-Signature” toe aan de header van een e-mail. Dit veld bevat een digitale handtekening van de inhoud van de e-mail (op basis van zowel headers als de body van de e-mail). Deze handtekening wordt gemaakt door middel van SHA-256-encryptie, waarbij gebruik wordt gemaakt van RSA voor het afhandelen van de encryptie van de sleutel.

De ontvangende SMTP-server gebruikt de domeinnaam van de afzender, de string “_domainkey” en een selector uit het DKIM-Signature veld om een DNS-aanvraag te doen. Als antwoord op het DNS-verzoek ontvangt de mailserver de publieke sleutel van de afzender. De ontvanger gebruikt deze om de handtekening opnieuw te berekenen en deze te vergelijken met de waarde die meegestuurd was in het bericht. Als de twee handtekeningen overeenkomen bewijst dat dat de e-mail daadwerkelijk afkomstig is van het desbetreffende domein en niet aangepast is gedurende het transport.

DKIM blokkeert een “vervalste” e-mail niet zelf. Het markeert deze enkel als ongeldig, waarna een spamfilter op basis daarvan de e-mail kan blokkeren of als verdacht kan beschouwen.

Bron: http://nl.wikipedia.org/wiki/DomainKeys_Identified_Mail

Vanaf Zimbra Collaboration Suite versie 8 is het mogelijk om emailberichten te ondertekenen met DKIM. Hier staat de handleiding die ik succesvol heb toegepast.

Geef wp-config.php hackers een koekje van eigen deeg..

Een van de vuistregels van het beveiligen van WordPress is om wp-config.php van buitenaf ontoegankelijk te maken. Dat kan met nginx in één regel:

location ~* wp-config.php { return 404; }

Dat is vrij standaard, een 404 error geven..

Leuker is om ze door te sturen met een redirect naar een willekeurige pagina, bijvoorbeeld een video op YouTube!

location ~* wp-config.php { return 301 http://www.youtube.com/watch?v=oHg5SJYRHA0; }

Het is niet mogelijk om dit te omzeilen, omdat de webserver deze redirect uitvoert. Intern blijft alles gewoon werken omdat de webserver het bestand vanaf een ander pad opent.

Zimbra 8 FOSS shell backup script

Het ondenkbare is pas uitgekomen, mijn mailserver was compleet onbruikbaar na een update. De LDAP database gaf alleen maar meldingen terug dat accounts niet bestonden en alle email werd gebounced, omdat de mailbox niet werd herkent.

Snel een nieuwe mailserver opzetten heeft verdere problemen weten te verhelpen, want de mail kon weer binnenstromen. Ondanks dat dit het probleem enigszins oploste, was het probleem van de kapotte mailserver nog niet opgelost. Uiteindelijk is het mij vandaag, na een week, gelukt om de mailserver weer werkend te krijgen! Het bleek dat een oudere versie van de LDAP database terugzetten het probleem oploste.

Het enige wat nog ontbrak aan deze server was een backup, tja, het heeft altijd gewerkt.. Vanaf vandaag is er een backupscript wat elke 2 dagen loopt.

Er is niet veel informatie te vinden over backupscripts van de Open-Source editie van de Zimbra Collaboration Server, versie 8. Daarom ben ik gaan sleutelen aan bestaande scripts om deze in te kunnen zetten in mijn eigen serveromgeving.

Dat script staat hieronder:

#!/bin/bash

# Zimbra Backup Script
# Requires that you have ssh-keys: https://help.ubuntu.com/community/SSHHowto#Public%20key%20authentication
# This script is intended to run from the crontab as root
# Date outputs and su vs sudo corrections by other contributors, thanks, sorry I don't have names to attribute!
# Free to use and free of any warranty! Daniel W. Martin, 5 Dec 2008
## Adapted for rsync over ssh instead of ncftp by Ace Suares, 24 April 2009 (Ubuntu 6.06 LTS)

# Outputs the time the backup started, for log/tracking purposes
echo Starttijd backup = $(date +%T)
before="$(date +%s)"
# all the destination variables
ZIMBRADIR=/opt/zimbra/
LOCALBACKUPDIR=/backup/zimbra/$(date +%F-%H-%M-%S)
REMOTEBACKUPDIR=192.168.2.20:/volume1/Backups/zimbra

# Live sync before stopping Zimbra to minimize sync time with the services down
# Comment out the following line if you want to try single cold-sync only
#rsync -aHK --delete --backup /opt/zimbra/ /backup/zimbra/$(date +%F-%H-%M-%S)

# Now we need to shut down Zimbra to rsync any files that were/are locked
# whilst backing up when the server was up and running.
before2="$(date +%s)"

# Stop Zimbra Services (as user Zimbra from root crontab)
echo Zimbra wordt afgesloten...
su - zimbra -c "/opt/zimbra/bin/zmcontrol stop"
echo Zimbra is afgesloten...
echo 60 seconden wachten en dan alle overgebleven Zimbra processen killen...
sleep 60
# Kill any orphaned Zimbra processes
ORPHANED=`ps -u zimbra -o "pid="` && kill -9 $ORPHANED
echo Mogelijke Zimbraprocessen zijn gekilld...

# Sync to local backup directory
echo Rsync start met backup van /opt/zimbra...
rsync -aHK --delete --backup $ZIMBRADIR $LOCALBACKUPDIR
echo Lokale backup maken afgerond...

# Restart Zimbra Services (as user Zimbra from root crontab)
echo Zimbra starten...
su - zimbra -c "/opt/zimbra/bin/zmcontrol start"
echo Zimbra starten uitgevoerd...

# Calculates and outputs amount of time the server was down for
after="$(date +%s)"
elapsed="$(expr $after - $before2)"
hours=$(($elapsed / 3600))
elapsed=$(($elapsed - $hours * 3600))
minutes=$(($elapsed / 60))
seconds=$(($elapsed - $minutes * 60))
echo Server downtime: "$hours uur $minutes minuten $seconds seconden"

# Create a txt file in the backup directory that'll contains the current Zimbra
# server version. Handy for knowing what version of Zimbra a backup can be restored to.
echo Zimbra versie toevoegen aan /opt/zimbra/conf/zimbra_version.txt...
su - zimbra -c "zmcontrol -v > /opt/zimbra/conf/zimbra_version.txt"
echo Zimbra versie toegevoegd /opt/zimbra/conf/zimbra_version.txt...

# Display Zimbra services status
echo Zimbra services status:
su - zimbra -c "/opt/zimbra/bin/zmcontrol status"

# backup the $localbackupdir to $remotebackupdir
echo Remote backup starten...
rsync -aHK --delete-during $LOCALBACKUPDIR $REMOTEBACKUPDIR
echo Remote backup uitgevoerd...
echo Lokale backupmap verwijderen...
rm -Rf $LOCALBACKUPDIR
echo Lokale backupmap verwijderd...

# Outputs the time the backup finished
echo Backup geslaagd om = $(date +%T)

# Calculates and outputs total time taken
after="$(date +%s)"
elapsed="$(expr $after - $before)"
hours=$(($elapsed / 3600))
elapsed=$(($elapsed - $hours * 3600))
minutes=$(($elapsed / 60))
seconds=$(($elapsed - $minutes * 60))
echo Totale benodigde tijd: "$hours uur $minutes minuten $seconds seconden"

# end

Allereerst wordt Zimbra gestopt. Dan wordt 60 seconden gewacht om eventuele overgebleven Zimbra-processen te laten ‘sterven’ en anders worden ze gekilld.

Daarna wordt er een lokale backup van /opt/zimbra/ naar /backup/zimbra/ gemaakt met behoudt van alle (hard/soft)links. Direct hierna wordt Zimbra weer gestart en de downtime wordt weergegeven.

Dan wordt de huidige versie van Zimbra opgeslagen in /opt/zimbra/conf/zimbra_version.txt, zodat zelfs een versiebackup mogelijk is.

Als dit uitgevoerd is, dan wordt er een statuscheck uitgevoerd op Zimbra, om te zien of alle processen weer opgestart zijn.

Vervolgens wordt de backup van de lokale backupmap naar de remote backupmap gestart. In mijn geval is dit de NAS in het interne netwerk. Het is ook mogelijk om hier een server op afstand aan toe te voegen, mits deze met SSH-verbindingen overweg kan. Lees hier meer over Public Key Authentication, wat nodig is voor deze overdracht!

Is dit allemaal uitgevoerd? Dan wordt de lokale backup verwijderd van de server en wordt een overzicht gegeven van de totale tijd die de backup in beslag heeft genomen…

MaartenvandeKamp.nl naar een VPS

Het duurt nog een jaar voordat ik beschik over een glasvezelverbinding aan huis. Dat betekent dat mijn websites niet kunnen groeien, want de snelheid waarmee de site wordt verstuurd is beperkt. Daarom heb ik besloten om MaartenvandeKamp.nl, en misschien nog wel wat andere websites, te verplaatsen naar een VPS van TransIP.nl.

De website draait er nu een dag en tot nu toe is de ervaring matig positief.. De upload snelheid valt nogal tegen, kijken of daar nog iets aan te verbeteren valt! Het betekent ook dat ik grotere foto’s kan plaatsen en dat is wel prettig op een website zoals MaartenvandeKamp.nl!

Piwik

Ik heb iets tegen Google Analytics.. Google plaatst ongevraagd cookies met een enorme lange levensduur die op elke site (gebruikmakend van GA) terugkomen. Dat kan beter en netter en daarom gebruik ik sinds 3 weken Piwik. Het opensource alternatief van Google Analytics.

En het bevalt goed! Het is niet zo uitgebreid als GA maar ik ben ook geen bedrijf wat afhankelijk is van de inkomsten vanuit een of meerdere websites. Daarnaast wordt de DoNotTrack-functie door Piwik ondersteund, net als een opt-out functie. Die informatie is terug te vinden op de Privacy-pagina!

Verder rol ik Piwik uit op een aantal websites die ik gemaakt heb, gewoon als extra gratis service. Om iets terug te doen voor mijn klanten!