Zum Hauptinhalt springen

An dieser Stelle fange ich mal an, meine Pocket-Liste zu entschlacken, in dem ich erwähnenswerte Sites in solchen Artikeln wochenweise zusammenfasse. Vielleicht gibt es ja den ein oder anderen, der auch gefallen an manchen Artikeln findet. Mich selber soll es dazu bringen, Dinge, die ich mir für später merken möchte, auch wirklich abzuarbeiten. Und sei es nur, sie einfach ungelesen zu löschen.
Den Anfang machen folgende Artikel:

Jahrelang war ich stinkend faul und habe als Basis zum Entwickeln MAMP Pro benutzt. Weil ich keine großartige Lust hatte, mich mit dem Installieren und Pflegen von Apache, MySQL und PHP herumzuschlagen. Aber auch habe ich jahrelang geflucht, wenn ein Update der Software irgendetwas kaputt gemacht hat, die Dienste nicht mehr richtig liefen oder Konfigurationsdateien zerstört wurden und man den lauffähigen Zustand aus einem Backup wiederherstellen musste. Auch wenn diese Vorkommnisse in letzter Zeit weniger geworden sind.

Im Zuge meiner aluhutbedingten Einschränkungen meines Benutzerkontos auf einen Standardbenutzer unter macOS verweigerte MAMP Pro aber seinen Dienst, was seinen Ursprung wahrscheinlich darin hat, dass es Zugriff unter anderem auf die hosts-Datei haben möchte. Ich habe kurz geschaut, ob ich mich mit Vagrant oder Docker anfreunden könnte und ob die Entwicklung in virtuellen Maschinen in den Arbeitsablauf zur Agentur, in der ich arbeite, passt. Kurze Antwort: nein. Aus diversen Gründen verlagert man einfach nur das Problem der Versionierung und der Pflege des Systems in eine VM und erleichtert beziehungsweise verbessert man das Entwickeln dadurch nicht. VMs haben schon ihre Daseinsberechtigung wenn es darum geht so einen Container einfach in die Cloud zu packen und wenn dort Systeme laufen, die dadurch einfacher skaliert werden können.

Es sollte daher ein "natives" Apache/MySQL/PHP-System auf macOS-Basis werden. Mit verschiedenen PHPs zum einfachen Wechseln, PHP-Cache und Xdebug. Letzteres bin ich noch schuldig, wie man den Rest recht einfach installiert bekommt, habe ich mal im Folgenden aufgeschrieben. Einfach die folgende Anleitung von oben nach unten abarbeiten und als Erfolg sollte man ein funktionierendes und stabiles System vorfinden. Dafür lege ich meine Hand aber nicht ins Feuer, kann nur sagen, dass es so bei mir geklappt hat.

Xcode installieren

Xcode muss man per App-Store installieren, auch wenn man von dem ganzen Paket lediglich den gcc-Compiler benötigen. Dieser wird mit den "Xcode command line tools" mitgeliefert, die man nachträglich installieren muss.

 

// Ist Xcode überhaupt installiert, Befehl sollte den Pfad zu Xcode auswerfen
xcode-select -p

// Xcode command line tools nachträglich installieren
xcode-select --install

 

Ohne Homebrew läuft nix

Homebrew ist ein Paket-Manager ähnlich wie apt unter Debian/Ubuntu und wird folgendermaßen per Terminal installiert:

 

ruby -e "$(curl -fsSL raw.githubusercontent.com/Homebrew/install/master/install)"

 

Apropos Terminal: ich benutze ja schon seit Jahren iterm und bin damit mehr als zufrieden. Vor allem kann man das Fenstermanagement so einstellen, dass sich das Terminal wie die Quake-Konsole im oberen Bereich des Monitors öffnet.

Externe Repositories für brew hinzufügen

Weil das Master-Repository von Homebrew nicht alle Ressourcen beinhaltet, muss man durch folgende Befehle unter anderem PHP und Apache hinzufügen:

 

brew tap homebrew/dupes
brew tap homebrew/versions
brew tap homebrew/php
brew tap homebrew/apache

 

Nach dem Hinzufügen der Repositories muss folgender Befehl abgesetzt werden, damit Homebrew sich die neuesten brews zieht:

 

brew update

 

Apache installieren

macOS bringt zwar von Hause aus einen Apache mit, der ist aber in vielen Dingen beschnitten und sollte durch einen "richtigen" Apache ersetzt werden.
Mit folgenden Befehlen wird erst der macOS-Apache beendet, aus dem Startskript entfernt und der "neue" Apache per brew installiert:

 

sudo apachectl stop
sudo launchctl unload -w /System/Library/LaunchDaemons/org.apache.httpd.plist 2>/dev/null
brew install httpd24 --with-privileged-ports --with-http2

 

Das Ganze kann ein wenig dauern, weil der Apache von Grund auf kompiliert wird. Nach dem Kompilieren bekommt man eine ähnliche Nachricht angezeigt, die WICHTIG ist:

 

/usr/local/Cellar/httpd24/2.4.25: 212 files, 4.5M, built in 2 minutes 28 seconds

 

An der Kompilierungszeit erkennt man, dass ich das Ganze auf einem kleinen MacBook erledigt habe.
Der Pfad /usr/local/Cellar/httpd24/2.4.25, der sich wahrscheinlich je nach Apache-Version in den letzten Zahlen unterscheiden kann, wird in den nächsten Befehlen entsprechend angepasst. Diese Befehle dienen dazu, den Apache in den Autostart-Daemon von macOS aufzunehmen.

 

sudo cp -v /usr/local/Cellar/httpd24/2.4.25/homebrew.mxcl.httpd24.plist /Library/LaunchDaemons
sudo chown -v root:wheel /Library/LaunchDaemons/homebrew.mxcl.httpd24.plist
sudo chmod -v 644 /Library/LaunchDaemons/homebrew.mxcl.httpd24.plist
sudo launchctl load /Library/LaunchDaemons/homebrew.mxcl.httpd24.plist

 

Apache konfigurieren

Der Webserver läuft und sollte unter localhost erreichbar sein.
Erster Schritt ist nun, das DocumentRoot-Verzeichnis auf einen Ordner unterhalb des Benutzer-Verzeichnisses umzubiegen, damit man dort die Verzeichnisse für die virtuellen Hosts erstellen kann. Mit

 

open -e /usr/local/etc/apache2/2.4/httpd.conf

 

öffnet man das Konfigurationsfile in TextEdit. In diesem nach "DocumentRoot" suchen, diesen und den Eintrag "Directory" unterhalb ändert man und zeigt auf ein Verzeichnis (bei mir "Sites") in seinem Benutzerordner:

 

DocumentRoot "/Users/DEINBENUTZERNAME/Sites"

 

Innerhalb des Directory-Eintrages gibt es die Einstellung AllowOveride, die steuert, welche Konfigurationseinstellungen man per htaccess überschreiben darf. Diesen stellt man auf All.

 

#
# AllowOverride controls what directives may be placed in .htaccess files.
# It can be "All", "None", or any combination of the keywords:
#   AllowOverride FileInfo AuthConfig Limit
#
AllowOverride All

 

Weil ohne mod_rewrite unter anderem keine lesbaren URLs per RealUrl möglich ist, muss man dieses noch laden, per Default wird dieses nicht eingebunden. Also Zeile suchen und den Hash entfernen, damit die Zeile nicht auskommentiert ist:

 

LoadModule rewrite_module libexec/mod_rewrite.so

 

Berechtigungen für Benutzer und Gruppe

Zwar haben wir Apache schon angewiesen, in welchem Verzeichnis er Dateien findet, aber die Berechtigungen stimmen noch nicht. Apache läuft standardmäßig mit dem daemon-User und der daemon-Gruppe. Diese haben aber keinen Zugriff auf die Verzeichnisse in deinem Benutzerverzeichnis.
Als User also den Benutzernamen eintragen und als Gruppe "staff":

 

User DEINBENUTZERNAME
Group staff

 

Nach einem beherzten Neustart des Apache-Daemons sollte der Webserver laufen und auf das angegebene Verzeichnis verweisen.

PHP installieren

Ohne PHP geht gar nichts und wir benötigen für die unterschiedlichen TYPO3-Versionen auch unterschiedliche PHP-Versionen. Diese werden mit folgenden Befehlen schon einmal installiert:

 

brew install php56 --with-httpd24
brew unlink php56
brew install php70 --with-httpd24
brew unlink php70
brew install php71 --with-httpd24

 

Sollten vorher schon per brew PHP-Versionen installiert worden sein, sollte man diese per "brew uninstall" deinstallieren. Der ganze Install-Zirkus hat bei mir knapp eine halbe Stunde gebraucht, da PHP aus den Sourcen kompiliert wird. Danach findet man die Konfigurationsdateien von PHP in folgenden Verzeichnissen:

 

/usr/local/etc/php/5.6/php.ini
/usr/local/etc/php/7.0/php.ini
/usr/local/etc/php/7.1/php.ini

 

In den php.ini-Dateien sollte man für den reibungslosen Betrieb von TYPO3 schon einmal folgende Einstellungen vornehmen (keine vollständige Liste):

 

max_execution_time = 240
max_input_time = 240
memory_limit = 256M
date.timezone = Europe/Berlin
upload_max_filesize = 128M
post_max_size = 128M
always_populate_raw_post_data = -1
max_input_vars = 1500

 

Apache mit PHP konfigurieren

In der schon bekannten Datei /usr/local/etc/apache2/2.4/httpd.conf sind im Bereich "Dynamic Shared Object (DSO) Support" von den Install-Skripten von PHP für die einzelnen Versionen die Modul-Dateien hinterlegt worden.
Diese können wir auch für spätere Updates von PHP auf einen anderen Ort verweisen lassen. Da man immer nur eine PHP-Version laufen lassen kann, werden wir erstmal PHP 5.6 laufen lassen und die anderen beiden Zeilen auskommentieren. Gleich werden wir noch Skripte erstellen, die es uns erlauben, mit einer Befehlszeile zwischen den Versionen zu springen.

 

LoadModule php5_module    /usr/local/opt/php56/libexec/apache2/libphp5.so
#LoadModule php7_module    /usr/local/opt/php70/libexec/apache2/libphp7.so
#LoadModule php7_module    /usr/local/opt/php71/libexec/apache2/libphp7.so

 

Damit PHP-Dateien korrekt ausgeführt werden werden in der Apache-Konfiguration die Handler entsprechend gesetzt (nach "IfModule dir_module" suchen und entsprechend ersetzen):

 


    DirectoryIndex index.php index.html



    SetHandler application/x-httpd-php

 

PHP switcher

Findige Leute haben einen Gist für den PHP Switcher bereit gestellt, den wir clonen und ausführbar machen werden:

 

curl -L gist.github.com/w00fz/142b6b19750ea6979137b963df959d11/raw > /usr/local/bin/sphp
chmod +x /usr/local/bin/sphp

 

Pfade prüfen, Terminals schließen

Homebrew sollte alle Pfade, die es benötigt in die PATH-Variable geschrieben haben. Das kann man mit folgendem Befehl überprüfen, es sollten auf jeden Fall /usr/local/bin und /usr/local/sbin enthalten sein:

 

echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/go/bin:/usr/local/MacGPG2/bin

 

Vor den nächsten Schritten sollte man alle Terminal-Sessions schließen, ansonsten kann es zu Problemen führen. Also: turn it off and on again!

LoadModule-Angaben für PHP-Switcher ändern

Die vorhin gemachten Änderungen im LoadModules-Bereich der Apache-Konfiguration müssen erneut angepasst werden (open -e /usr/local/etc/apache2/2.4/httpd.conf) und mit folgenden zwei Zeilen ersetzt werden. Nur diese zwei Zeilen, auch wenn mehr PHP-Versionen installiert sind, die Zeile für PHP7 ist auch auskommentiert:

 

# PHP Switcher
LoadModule php5_module /usr/local/lib/libphp5.so
#LoadModule php7_module /usr/local/lib/libphp7.so

 

Mit dem Befehl "sphp 70" kann dann zum Beispiel zur 7.0 von PHP gewechselt werden. Was eine ähnliche Ausgabe im Terminal erzeugen sollte:

 

$ sphp 70

PHP version 70 found
Unlinking old binaries...
Linking new binaries...
Linking /usr/local/Cellar/php70/7.0.15_8... 17 symlinks created
Linking new modphp addon...
/usr/local/lib/libphp7.so
Fixing LoadModule...
Updating version file...
Restarting homebrew Apache...
Done.

PHP 7.0.15 (cli) (built: Feb  5 2017 12:27:57) ( NTS )
Copyright (c) 1997-2017 The PHP Group
Zend Engine v3.0.0, Copyright (c) 1998-2017 Zend Technologies

 

MySQL installieren

Datenbanken brauchen wir auch, von daher wird noch MySQL installiert. Es wird MariaDB verwendet, was nichts weiter als MySQL ist (sogar von einigen ehemaligen MySQL-Entwicklern).
Folgende zwei Befehle im Terminal abfeuern:

 

brew install mariadb
mysql_install_db

 

Nach dem Installieren kann der MySQL-Server mit folgenden Befehlen gestartet und gestoppt werden:

 

// MySQL-Daemon starten
mysql.server start

// MySQL-Daemon stoppen
mysql.server stop

// Root-Passwort für den MySQL-Server setzen
/usr/local/bin/mysql_secure_installation

 

Apache Virtual Hosts

Um virtuelle Hosts á la meinsuperwebprojekt.server.tld einzurichten, muss man im Apache noch das vHost-Alias-Modul laden, was bei Default nicht der Fall ist. In der Apache-Konfigurationsdatei /usr/local/etc/apache2/2.4/httpd.conf folgende zwei Parameter auskommentieren:

 

LoadModule vhost_alias_module libexec/mod_vhost_alias.so

# Virtual hosts
Include /usr/local/etc/apache2/2.4/extra/httpd-vhosts.conf

 

Danach kann man in der Datei /usr/local/etc/apache2/2.4/extra/httpd-vhosts.conf entsprechende Einträge erstellen.

 


    DocumentRoot "/Users/DEINBENUTZERNAME/Sites/DEINESEITE.TLD"
    ServerName DEINESEITE.TLD

 

Nach einem Neustart des Apache-Servers weiß der zwar, wohin er mit Anfragen zu seite.machbar hin soll, der Rechner zuckt aber lediglich mit den Schultern. Von daher benötigen wir noch eine Schnittstelle, die die Netzwerkanfragen zum Apache umbiegt: Dnsmasq.

 

// dnsmasq per brew installieren
brew install dnsmasq

// Alle anfragen an *.TLD annehmen
echo 'address=/.TLD/127.0.0.1' > /usr/local/etc/dnsmasq.conf

// dnsmasq starten
sudo brew services start dnsmasq

// Nameserver für *.TLD starten
sudo mkdir -v /etc/resolver
sudo bash -c 'echo "nameserver 127.0.0.1" > /etc/resolver/TLD

 

"TLD" sollte man mit der Domain ersetzen, die man normalerweise zum Entwickeln verwendet.

APCu und Zend OPcache installieren

Um PHP-Caching zu verwenden, um das Kompilieren um einen merkbaren Faktor zu beschleunigen, installieren wir noch APCu und OPcache. Das muss für jede installierte PHP-Version einzeln geschehen, aber das Wechseln funktioniert mit dem Switcher ja ganz einfach.

 

// Cache-Systeme für PHP 5.6 installieren
sphp 56
brew install php56-opcache
brew install php56-apcu

// Cache-Systeme für PHP 7.0 installieren
sphp 70
brew install php70-opcache
brew install php70-apcu

// Cache-Systeme für PHP 7.1 installieren
sphp 71
brew install php71-opcache
brew install php71-apcu

 

Nach einem Neustart des Apache-Servers sollte in der phpinfo() Hinweise zum Zend OPcache und APCu zu finden sein.

Fertig!

Fertig ist man ja nie, aber das jetzt installierte System ist schon einmal eine gute Basis, um TYPO3-Systeme zu installieren. Zum Entwickeln fehlt zum Beispiel noch Xdebug, PEAR und was man noch so alles für Projekte braucht und gewisses Feintuning von PHP-Konfigurationseinstellungen. Die sind aber bei jedem nach Belieben anders, von daher gehe ich da erstmal nicht drauf ein.

Jahrelang konnte man sich schön herausreden, dass man ein Betriebssystem von Apple benutzt und das schon allein aufgrund seiner geringen Verbreitung für Hacker kein Ziel darstellt. Das ist aber schon lange vorbei beziehungsweise hat man sich ja damals eigentlich schon selber etwas vorgelogen. Kein technisches System ist sicher.

Aus diesem Grund habe ich mir schon vor langer Zeit vorgenommen, meine Systeme, die ich so verwende, abzusichern. Sei es aus Aluhutgründen oder einfach der Reiz des technisch Machbaren. Oder aus dem Aspekt, dass Systeme eigentlich von Grund auf sicher sein sollten und es den Anschein hat, dass wir das aufgrund der zunehmenden Komplexität aus den Augen verloren haben.

Schon Ende letzten Jahres bin ich über einen auf GitHub veröffentlichten Guide gestoßen, der es sich zur Aufgabe gemacht hat, ein paar Sicherheitsaspekte unter macOS anzusprechen. Der Artikel behandelt eine gute Bandbreite, die beim Aufsetzen des eigentlichen Systems anfängt, über Software-Firewalls und Verschlüsselung bis hin zur Nutzung des Tor-Netzwerkes geht. Das Ganze wird für einen halbwegs technisch versierten Nutzer so angerissen, dass man gleich in die Umsetzung gehen kann.

Mein Stand sieht mittlerweile so aus, dass ich neben FileVault, das sowieso seitdem ich das kleine Ding hier benutze läuft, mittlerweile Little Snitch als Software-Firwall laufen habe. Zu Windows-Zeiten habe ich über Benutzer solcher Firewalls gelacht, was daran lag, dass ich der Meinung bin, dass selbst aktuelle Lösungen für normale Benutzer einfach nicht zu benutzen sind. Woher soll dein ein (ich bin jetzt mal gemein) unbedarfter DAU wissen, welche Ressourcen beim Besuch einer Website geladen werden dürfen und welche nicht (Tracker)? Oder zu welchen Servern auf welchem Port Systemdienste oder Anwendungen sprechen dürfen? Richtig: gar nicht.

Des weiteren habe ich die Firmware mit einem Passwort versehen, mein Account zu einem Standard-Account runtergestuft, Spotlight-Vorschläge soweit deaktiviert, dass mir wirklich nur noch lokale Dinge angezeigt werden. Ich benutze Spotlight sowieso nur zum Starten von Anwendungen. Seit Jahren verwende ich 1Password als Passwort-Manager, der sich auch mit meinen anderen Rechnern/Telefonen synchronisiert. PGP/GPG habe ich auch seit zig Jahren, seit 2013 pflege ich sogar meinen Schlüssel soweit, dass ich mich an das Passwort erinnern kann und nicht mehr gezwungen bin, einen neuen Key anzulegen. Seit letztem Jahr verwende ich PGP zum Signieren meiner Commits, auch wenn wir das Feature in der Agentur nicht verwenden. Für den Fall der Fälle, dass wir Deployments besser kontrollieren wollen und nur signierte Commits in das Deployment einbeziehen wollen, wäre ich schon mal bereit. Aber da auf unsere Repositories sowieso keiner außerhalb der Firma oder entsprechenden Verträgen zugreifen kann, besteht das Szenario nicht.

Jetzt stehe ich nur vor dem Problem, die Sicherheitsschiene auf diverse Endgeräte wie Smartphones, aber auch Spielkonsolen beziehungsweise das Netzwerk zu Hause auszudehnen. Meine Kinder kommen so langsam in das Alter, in dem zwanglos und nicht mehr unter elterlicher Aufsicht im Web gesurft wird. Ein Horror! Eine Firewall muss her! Ein Proxy-Server für DNS und WWW! Warum habe ich bloss nicht wie geplant ein 19 Zoll-Schrank im Keller installiert?

Manchmal geht es im Leben nach links oder rechts. Mal nach vorne oder nach hinten. Oder gar nicht mehr weiter. Ich vermisse dich, Schwester.

Das mit den Vorsätzen habe ich schon lange aufgegeben. Wenn man sich etwas vornimmt, kommt sowieso irgendwas dazwischen und man ist nur enttäuscht oder hat die passende Ausrede schon parat. Bei mir ist das jedenfalls so.
Und trotzdem habe ich mir diverse Sachen vorgenommen. Eine ist mehr in dieses Blog schreiben. Mehr für mich und nicht für andere, aber vielleicht interessiert es ja den ein oder anderen. Ansonsten gibt es noch eine Liste von Dingen, die ich dieses Jahr schaffen möchte:

  • den Dachboden fertig ausbauen
  • mehr Gitarre spielen
  • mich als TYPO3-Integrator/-Developer zertifizieren lassen
  • eine eigene Extension ins TER veröffentlichen
  • mehr zocken

Und noch ein paar Dinge mehr, die sind aber hier nicht so erwähnenswert. Mal sehen, was ich davon schaffen werde.

Vor ein paar Wochen hat Benjamin auf anmut und demut ein Photo veröffentlicht, was mich sofort wieder elf Jahre alt hat werden lassen. Und mich darüberhinaus veranlasst hat, ein eBay-Konto zu eröffnen. Obwohl ich mir Anfang der 2000er geschworen habe, dies nie wieder zu tun.
Aber Hero Quest wurde nur drei Jahre lang produziert. Und das vor über zwanzig Jahren.

Mein Spiel ist schon damals meinen kleinen Geschwistern zum Opfer gefallen. Die Türen wurden umgeknickt, den Plastik-Figuren die Köpfe und Waffen abgerissen und die Karten verknickt. Und irgendwann wurde es in den Müll geschmissen, weil es nicht mehr vollständig war.
Nun habe ich durch einen glücklichen Zufall eine "Sofort kaufen"-Auktion bei eBay gefunden, die nicht einen horrenden Preis jenseits der 100 Euro verlangt hat. Und in einem tadellosen Zustand ist. Als ob damit nie jemand gespielt hätte. Welch Frevel.

Meine zwei Söhne haben auch gleich große Augen bekommen und heute haben wir die erste Runde gespielt, nachdem wir letztes Wochenende in kleinen Schritten die Regeln gelernt haben. Und nun verkörpere ich Morcar, den Bösen. Und versuche meinen Kindern einen kleinen Teil meines Rollenspiellebens beizubringen. Hat noch jemand die Basis-Bücher von AD&D, DSA, Mers und Rolemaster? Plüsch, Power & Plunder würde auch funktionieren. Und Shadowrun erst...

In der Schule hat man in Geschichte viel über historische Momente und Wendepunkte gehört und sich gefragt, wie es dazu überhaupt gekommen sein kann. So im Nachhinein und mit den ganzen Lehren, die man eigentlich aus den vorhergehenden Ereignissen hätte ziehen können.

Aktuell sind wir wahrscheinlich auch an solch einem Punkt angekommen. Gefühlt bin ich nur noch von Idioten umgeben (außerhalb meiner kleinen Welt) und auch in meinem Freundes- und Familienkreis sind die Auswirkungen der tragischen Ereignisse rund um die Welt (Syrien, Türkei, Frankreich, Belgien, usw. und jetzt auch Deutschland) zu spüren.

Und das bereitet mir Unbehagen. Weil ich immer mehr merke, wie meine Position zur Sicht der Dinge nach außen rückt. Wie ich mich öfter dabei ertappe, anderen meine Meinung sagen zu wollen, um ihnen aufzuzeigen, dass es vielleicht doch anders ist, als Sie denken. Oder einfach, um selber zu verstehen, wie man zu einer anderen Meinung als meiner kommen kann.

Mittlerweile bin ich soweit, dass ich darüber nachdenke, mich politisch zu engagieren. In eine Partei einzutreten und mitzugestalten. Nicht nur immer brav zur Wahl gehen, sondern Richtungen zu erarbeiten, wohin die Reise gehen soll. Idioten gab es schon immer und überall, aber von meiner Position aus, gibt es von denen immer mehr und leider auch an politischen Hebeln, die ich so nicht besetzt sehen möchte.