Piwik auf Cloud Foundry betreiben

Piwik ist eine Open-Source-Analytics-Plattform auf Basis von PHP und MySQL. Das macht sie zur perfekten Applikation für den Betrieb auf Cloud-Foundry-basierten Plattformen. Falls du es also satt hast, all deine Daten an Google Analytics zu schicken, und stattdessen lieber deine eigene Analytics-Plattform betreiben willst, ist dieses Tutorial für dich. Wir schauen uns an, was es braucht, um Piwik auf Cloud Foundry zu betreiben, und welche Anpassungen nötig sind, um es sauber in unsere Plattform zu integrieren.
In diesem Tutorial verwende ich als Beispiel die Swisscom Application Cloud, aber jede Cloud-Foundry-basierte Plattform tut es.
Piwik beschaffen
Lade die neueste Version von Piwik unter https://piwik.org/download herunter.
Entpacke sie und wechsle mit cd in das Root-Verzeichnis. Der Ordner enthält
einen weiteren Unterordner namens «piwik» und einen Link zur Anleitung. Diese
verschachtelte Struktur brauchen wir nicht. Führe folgenden Befehl aus, um sie
zu begradigen:
$ cp -rf piwik .. && rm -rf piwik
Datenbank einrichten
Als Erstes müssen wir den Service in Cloud Foundry erstellen:
$ cf create-service mariadbent usage piwik-db
In der Swisscom Application Cloud heisst der SQL-Service mariadbent.
Möglicherweise musst du das anpassen, wenn du einen anderen CF-Anbieter
verwendest.
Danach müssen wir Piwik anweisen, sich mit unserer als Cloud-Foundry-Service
bereitgestellten Datenbank zu verbinden. Erstelle im Root deines Projekts eine
neue Datei bootstrap.php mit folgendem Inhalt:
<?php
$_ENV["SQLDB"] = NULL;
$_ENV["SQLHOST"] = NULL;
$_ENV["SQLPORT"] = NULL;
$_ENV["SQLUSER"] = NULL;
$_ENV["SQLPASSWORD"] = NULL;
$application = getenv("VCAP_APPLICATION");
$application_json = json_decode($application,true);
if (isset($application_json["application_uris"])) {
$_ENV["APPURIS"] = $application_json["application_uris"];
}
$services = getenv("VCAP_SERVICES");
$services_json = json_decode($services,true);
if (isset($services_json)) {
if (isset($services_json["mariadbent"][0]["credentials"])) {
$mysql_config = $services_json["mariadbent"][0]["credentials"];
$_ENV["SQLDB"] = $mysql_config["database"];
$_ENV["SQLHOST"] = $mysql_config["host"];
$_ENV["SQLPORT"] = $mysql_config["port"];
$_ENV["SQLUSER"] = $mysql_config["username"];
$_ENV["SQLPASSWORD"] = $mysql_config["password"];
}
}
?>
Dieser Code läuft, bevor Piwik startet, und erlaubt uns damit, die
Standardvariablen für die Datenbankverbindung zu überschreiben. Auch hier musst
du das Schlüsselwort mariadbent im Code anpassen, falls der SQL-Service bei
deinem CF-Anbieter anders heisst.
Beim ersten Start zeigt Piwik einen Konfigurationsassistenten, in dem die
Datenbank-Credentials eingegeben werden müssen. Wir können die Standardwerte
dafür mit jenen aus den Service-Umgebungsvariablen überschreiben, sodass du im
Assistenten einfach auf «Weiter» klicken kannst und sie nicht jedes Mal
nachschlagen musst. Öffne dazu die Datei
plugins/Installation/FormDatabaseSetup.php und navigiere zur Definition der
Methode init. Ersetze dort die folgenden Zeilen:
// default values
$this->addDataSource(new HTML_QuickForm2_DataSource_Array(array(
'host' => '127.0.0.1',
'type' => $defaultDatabaseType,
'tables_prefix' => 'piwik_',
)));
durch diese:
// default values
$this->addDataSource(new HTML_QuickForm2_DataSource_Array(array(
'host' => $_ENV["SQLHOST"].':'.$_ENV["SQLPORT"],
'username' => $_ENV["SQLUSER"],
'password' => $_ENV["SQLPASSWORD"],
'dbname' => $_ENV["SQLDB"],
'type' => $defaultDatabaseType,
'tables_prefix' => 'piwik_',
)));
Sicherheit
Als Nächstes müssen wir die URL unserer Site, die wir in bootstrap.php
ebenfalls aus der CF-Umgebung beziehen, in Piwik als Trusted Host hinterlegen.
Öffne die Datei plugins/Installation/Controller.php und navigiere zur
Definition der Methode addTrustedHosts. Ersetze dort die folgende Zeile
$trustedHosts = array();
durch diese:
$trustedHosts = Config::getInstance()->General['trusted_hosts'];
if (!is_array($trustedHosts)) {
$trustedHosts = array();
}
Wir wollen, dass Piwik die Verwendung von HTTPS statt HTTP erzwingt. Um das zu
aktivieren, öffnest du die Datei config/global.ini.php und änderst die
Einstellung force_ssl auf 1:
force_ssl = 1
Routing
Als Nächstes verbessern wir weitere Standardwerte, die Piwik im
Setup-Assistenten verwendet. Diese Änderungen schlagen vor, dass Piwik sich
selbst als erste Site trackt. Öffne die Datei
plugins/Installation/FormFirstWebsiteSetup.php und ersetze die folgenden
Zeilen der Methode init:
// default values
$this->addDataSource(new HTML_QuickForm2_DataSource_Array(array(
'url' => $urlExample,
)));
durch diese:
// default values
$this->addDataSource(new HTML_QuickForm2_DataSource_Array(array(
'siteName' => $_ENV["APPURIS"][0],
'url' => "https://" . $_ENV["APPURIS"][0],
)));
Composer
Da Piwik seine Abhängigkeiten bereits installiert mitbringt, wollen wir nicht,
dass Composer in Cloud Foundry nochmals läuft. Das
PHP-Buildpack führt Composer nicht aus, wenn es keine Dateien findet, die darauf
hindeuten. Ignorieren wir die Composer-Dateien also beim Pushen. Lege im Root
deines Projekts eine Datei .cfignore an und füge folgende Zeile ein:
/composer.*
Buildpack-Konfiguration
Das PHP-Buildpack erlaubt uns, jede PHP-App über eine dedizierte Datei zu
konfigurieren. Erstelle im Root deines Projekts einen Ordner .bp-config und
darin eine Datei options.json. Diese Datei legt fest, welche PHP-Version
verwendet wird, welche Extensions installiert werden und vieles mehr. Mehr dazu
liest du
hier. Füge
folgenden Inhalt in unsere neue Datei ein, um die benötigten PHP-Extensions zu
installieren und die neueste PHP-Version zu verwenden:
{
"PHP_EXTENSIONS": [
"bz2",
"zlib",
"curl",
"mcrypt",
"gd",
"cli",
"geoip",
"pdo",
"pdo_mysql",
"mbstring",
"openssl"
],
"PHP_VERSION": "{PHP_70_LATEST}"
}
manifest.yml
Um festzulegen, wie sich die App in Cloud Foundry verhalten soll, fügen wir im
Root unseres Projekts eine Datei manifest.yml mit folgendem Inhalt hinzu:
applications:
- name: piwik
host: my-piwik
memory: 256M
buildpacks:
- https://github.com/cloudfoundry/php-buildpack.git
services:
- piwik-db
Sei kreativ beim host, denn der Standardwert ist vermutlich schon vergeben.
Deployen
Jetzt ist es Zeit, unsere App auf Cloud Foundry zu deployen. Da wir in unserer Manifest-Datei bereits alles konfiguriert haben, brauchen wir nur noch
$ cf push
Wenn wir unsere Piwik-Instanz aufrufen, erscheint der Konfigurationsassistent. Da wir oben alle korrekten Standardwerte gesetzt haben, kannst du bei den meisten Schritten einfach auf «Weiter» klicken. Piwik wird sich darüber beschweren, dass die Dateiintegritätsprüfung Fehler meldet – das können wir bedenkenlos ignorieren, da wir es ja waren, die die Dateien geändert haben. Nach dem Assistenten solltest du eine voll funktionsfähige Piwik-Installation auf Cloud Foundry haben. Juhu!
Dieses Tutorial basiert auf einem sehr ähnlichen, aber veralteten Beitrag des Bluemix-Blogs.