Zurück zum Blog

WordPress auf Cloud Foundry betreiben

Lena Fuhrimann•

WordPress betreibt einen riesigen Teil aller Websites im Internet. Es liegt daher nahe, diese Software auf Cloud Foundry laufen zu lassen. Es gibt nur ein kleines Problem: WordPress speichert alle hochgeladenen Medien im Dateisystem. Auf Cloud Foundry und anderen containerbasierten Systemen funktioniert das nicht, weil der Container jederzeit neu gestartet werden kann, wodurch alle gespeicherten Dateien verschwinden würden. Deshalb müssen wir den gesamten Datei-Storage in einen separaten Service auslagern. In unserem Fall wird das ein S3-kompatibler Storage sein.

WordPress herunterladen

Um WordPress zu erhalten, lädst du einfach die neueste Version von der Website herunter und entpackst sie in ein beliebiges Verzeichnis. Wechsle dann im Terminal mit cd in dieses Verzeichnis und kopiere die Datei wp-config-sample.php nach wp-config.php.

$ cp wp-config-sample.php wp-config.php

Über diese Datei konfigurieren wir WordPress.

Services erstellen

Als Nächstes müssen wir unsere Datenbank und den S3-Storage als Services in Cloud Foundry anlegen. Führe zum Erstellen der Datenbank folgenden Befehl aus:

$ cf create-service mariadbent usage wp-db

Ich verwende die Swisscom Application Cloud. Wenn du einen anderen Cloud-Foundry-Anbieter nutzt, kann dieser Befehl abweichen. Achte einfach darauf, dass du einen SQL-Service namens «wp-db» erstellst.

Als Nächstes brauchen wir einen S3-kompatiblen Storage mit einem öffentlich zugänglichen Bucket. Folge dazu diesem Tutorial und nenne den Service «wp-storage».

WordPress konfigurieren

WordPress selbst läuft nicht out of the box auf Cloud Foundry. Wir müssen einige Anpassungen an der Datei wp-config.php vornehmen. Öffne sie und ersetze diese Zeilen:

// ** MySQL settings - You can get this info from your web host ** //
/** The name of the database for WordPress */
define('DB_NAME', 'database_name_here');

/** MySQL database username */
define('DB_USER', 'username_here');

/** MySQL database password */
define('DB_PASSWORD', 'password_here');

/** MySQL hostname */
define('DB_HOST', 'localhost');

/** Database Charset to use in creating database tables. */
define('DB_CHARSET', 'utf8');

/** The Database Collate type. Don't change this if in doubt. */
define('DB_COLLATE', '');

durch die folgenden:

// ** Read service properties from _ENV['VCAP_SERVICES'] ** //
$services = json_decode(getenv('VCAP_SERVICES'), true);
$db_service = $services['mariadbent'][0];
$db_conf = $db_service['credentials'];
$s3_service = $services['dynstrg'][0];
$s3_conf = $s3_service['credentials'];

// ** MySQL settings - You can get this info from your web host ** //
/** The name of the database for WordPress */
define('DB_NAME', $db_conf['database']);

/** MySQL database username */
define('DB_USER', $db_conf['username']);

/** MySQL database password */
define('DB_PASSWORD', $db_conf['password']);

/** MySQL hostname */
define('DB_HOST', $db_conf['host'] . ':' . $db_conf['port']);

/** Database Charset to use in creating database tables. */
define('DB_CHARSET', 'utf8');

/** The Database Collate type. Don't change this if in doubt. */
define('DB_COLLATE', '');

/** The endpoint of your S3 provider (defaults to AWS) */
define('S3_UPLOADS_ENDPOINT_URL', 'https://' . $s3_conf['accessHost']);

/** The name of your S3 bucket */
define('S3_UPLOADS_BUCKET', 'my-bucket');

/** Your S3 access key ID */
define('S3_UPLOADS_KEY', $s3_conf['accessKey']);

/** Your S3 secret access key */
define('S3_UPLOADS_SECRET', $s3_conf['sharedSecret']);

/** Your S3 region */
define('S3_UPLOADS_REGION', 'none');

/** The URL where your uploads will be available */
define('S3_UPLOADS_BUCKET_URL', 'https://' . $s3_conf['namespace'] . '.ds11s3ns.swisscom.com/' . S3_UPLOADS_BUCKET);

Vergiss nicht, my-bucket durch den tatsächlichen Namen deines Buckets zu ersetzen.

Diese Konfiguration erlaubt es uns, die Credentials für die Datenbank und die Konfiguration für unsere S3-Uploads aus der Umgebung zu beziehen, wie es in Cloud-Foundry-Applikationen üblich ist.

S3-Uploads-Plugin installieren

Zu unserem Glück gibt es ein nettes WordPress-Plugin, mit dem Uploads in S3 statt im lokalen Dateisystem abgelegt werden. Du findest das Plugin auf GitHub. Wir klonen es direkt in das plugins-Verzeichnis unseres WordPress, damit wir es zusammen mit WordPress selbst auf Cloud Foundry pushen können:

$ git clone https://github.com/humanmade/S3-Uploads.git wp-content/plugins/S3-Uploads

Damit steht das Plugin im Admin-GUI von WordPress zur Aktivierung bereit.

S3-Endpoint-Plugin erstellen

Diesen Schritt kannst du überspringen, wenn du AWS S3 verwendest.

Das S3-Uploads-Plugin funktioniert hervorragend mit AWS S3. Wollen wir es aber mit einem Drittanbieter-S3 nutzen (z.B. dem Dynamic Storage der Swisscom Application Cloud), müssen wir etwas zusätzlichen Code ergänzen, damit wir auch einen eigenen S3-Endpunkt angeben können. Dazu erstellen wir ein winziges Plugin, das den Endpunkt aus wp-config.php liest. Lege im Verzeichnis wp-content ein neues Verzeichnis namens mu-plugins an. Es enthält sogenannte Must Use Plugins, die immer geladen werden. Erstelle in diesem Verzeichnis eine Datei namens S3-endpoint.php mit folgendem Inhalt:

<?php
/*
Plugin Name:  S3 Uploads Endpoint
Description:  Add S3_UPLOADS_ENDPOINT_URL to S3-Uploads
Version:      1.0.0
*/

add_filter('s3_uploads_s3_client_params', 's3_uploads_add_endpoint_param');
function s3_uploads_add_endpoint_param($params)
{
    if (S3_UPLOADS_ENDPOINT_URL) {
        $params['endpoint'] = S3_UPLOADS_ENDPOINT_URL;
    }

    return $params;
}

Dieses einfache Ein-Datei-Plugin prüft, ob die Konstante S3_UPLOADS_ENDPOINT_URL definiert ist, und ergänzt sie in diesem Fall als Parameter endpoint in den S3-Parametern. Ist die Variable nicht definiert, setzt es den Parameter endpoint nicht, sodass wieder der AWS-Standard verwendet wird.

manifest.yml erstellen

Zum Schluss erstellen wir eine Datei manifest.yml, um unsere App einfacher in die Cloud zu pushen. Lege die Datei im Root deines wordpress-Verzeichnisses an und fülle sie mit folgendem Inhalt:

applications:
  - name: wordpress
    host: my-wordpress
    memory: 256M
    buildpacks:
      - https://github.com/cloudfoundry/php-buildpack.git
    services:
      - wp-db
      - wp-storage

Falls der Hostname bereits vergeben ist, wähle einen anderen. Du kannst nehmen, was du willst.

Die App pushen

Jetzt ist es Zeit, unsere App in die Cloud zu pushen. Führe folgenden Befehl aus:

$ cf push

Rufe dann deine Site unter der entsprechenden URL auf und folge dem WordPress-Installationsassistenten. Sobald du auf deiner WordPress-Admin-Seite bist, gehst du in den Bereich «Plugins» und aktivierst das Plugin «S3 Uploads». Ab jetzt sollten alle deine Uploads direkt in S3 landen. Du hast nun eine cloud-native WordPress-Installation!