Uberspace 7 - Episode 6

Posted by moritz on Saturday, December 17, 2016
Update 18.01.2017

Der erste Server ist (voll automatisch) aufgesetzt, alle Kollegen haben einen Account, schauen sich um und finden (und beheben) gerade die ersten Bugs. Die letzten grundlegenden Funktionen sind (oder werden gerade) implementiert und in ein paar Tagen trauen wir uns, die ersten User auf das System zu lassen. Wir haben bereits eine Hand voll Tester rekrutiert und werden diese Gruppe langsam vergrößern. Auch hier wird dann zu gegebener Zeit ein Update erfolgen, in dem wir euch die Möglichkeit geben, einen Account zu testen.

Wir sind aufgeregt!


Seit dem letzten Blogartikel ist einige Zeit vergangen, auch vor uns macht die kalte Jahreszeit nicht halt und wir sind krankheits- und personalbedingt etwas hinterher. Nichts desto trotz haben wir einiges geschafft und sind weiterhin auf einem guten Weg. Full disclosure: Wir versuchen noch dieses Jahr etwas vorzeigbares für euch zu basteln, auch wenn dies einen Alpha-Status haben wird und wir uns vorbehalten, die Server jederzeit wieder platt zu machen, wenn uns da wirklich etwas auf die Füße fallen sollte.

Was ist fertig?

Let’s Encrypt für alle

Jede Domain, die aufgeschaltet wird, bekommt automatisch ein passendes Zertifikat von Let’s Encrypt. Wir kümmern uns dabei um alles, auch um die Erneuerung der Zertifikate. Der Code ist fast fertig, unsere Testsysteme holen sich bereits Zertifikate.

Hier ein echtes Beispiel aus unserer Testumgebung. Das Zertifikat beziehen wir in diesem Fall von der staging-CA von Let’s Encrypt, da wir hier auf Grund unseres CIs recht oft anklopfen und ansonsten in deren Limits laufen würden. In unserer Alpha werden wir das natürlich ändern.

[moritz@localhost ~]$ uberspace-add-domain -w -d u7.moritz.in
The webserver's configuration has been adpated.
Now you can use the following records for your dns:
    A -> 10.0.2.15
    AAAA -> dead:beef

Nach dem Aufschalten (Die IP-Adressen sind unserem Staging System zu verdanken, wir testen in VMs) dann ein openssl-check:

[moritz@localhost ~]$ echo | openssl s_client -connect u7.moritz.in:443 -servername u7.moritz.in | grep issuer=
depth=1 CN = Fake LE Intermediate X1
verify error:num=20:unable to get local issuer certificate
verify return:0
DONE
issuer=/CN=Fake LE Intermediate X1

Und siehe da, die Domain bekommt sofort ein passendes Zertifikat (sofort ist unter realen Umständen ein Zeitraum unter 10 Sekunden).

PHP

Wir binden PHP - wie bereits im letzten Artikel erwähnt - per PHP-FPM an. Damit dauert der erste Aufruf einer Seite keine 2 Sekunden mehr, der Pool läuft immer “ondemand” und kann damit sehr schnell reagieren. Jeder Account bekommt einen eigenen PHP-FPM-Pool und damit auch einen eigenen, prozessübergreifenden Cache. Dieser Pool läuft über einen Socket und ist unabhängig vom verwendeten Webserver. Wir starten wie gewohnt mit Apache, werden in Zukunft aber die Möglichkeit bieten, nginx und jegliche anderen Backends zu nutzen - ohne RewriteRule-Krücke. Die Versionswahl haben wir abstrahiert, damit gibt es weniger Chancen, etwas kaputt zu machen und das Editieren von Dateien wie ~/etc/phpversion fällt weg.

Auch hier ein echtes Beispiel aus unserer Testumgebung.

[moritz@localhost ~]$ uberspace-select-version php 7.0
Selected PHP version 7.0
The new configuration is adapted immediately. Patch updates will be applied automatically.

[moritz@localhost ~]$ php --version
PHP 7.0.14 (cli) (built: Dec  7 2016 09:19:11) ( NTS )
Copyright (c) 1997-2016 The PHP Group
Zend Engine v3.0.0, Copyright (c) 1998-2016 Zend Technologies
    with Zend OPcache v7.0.14, Copyright (c) 1999-2016, by Zend Technologies

Der folgende etwas umständliche Aufruf testet den Webserver, hier liegt eine index.php:

[moritz@localhost ~]$ cat /var/www/virtual/moritz/html/index.php
<?php
phpinfo();
?>

Und los geht’s:

[moritz@localhost ~]$ curl -H 'Host: moritz.localhost.localdomain' localhost | grep "<td class=\"e\">PHP Version </td>"

Hier die Antwort:

<tr><td class="e">PHP Version </td><td class="v">7.0.14 </td></tr>

Nun soll es vorkommen, dass PHP in Version 5.6 benötigt wird, auch diese Version liefern wir mit:

[moritz@localhost ~]$ uberspace-select-version php 5
Selected PHP version 5
The new configuration is adapted immediately. Minor updates will be applied automatically.

Es ist kein erneutes Einloggen oder manuelles Laden der ~/.bash_profile oder Abschießen von php-cgi-Prozessen notwendig:

[moritz@localhost ~]$ php --version
PHP 5.6.29 (cli) (built: Dec  8 2016 08:26:58)
Copyright (c) 1997-2016 The PHP Group
Zend Engine v2.6.0, Copyright (c) 1998-2016 Zend Technologies
    with Zend OPcache v7.0.6-dev, Copyright (c) 1999-2016, by Zend Technologies

Auch hier der Aufruf über den Webserver:

[moritz@localhost ~]$ curl -H 'Host: moritz.localhost.localdomain' localhost | grep "<td class=\"e\">PHP Version </td>"
<tr><td class="e">PHP Version </td><td class="v">5.6.29 </td></tr>
Webserver

Wie versprochen gibt’s HTTP/2:

alt

Außerdem OCSP:

[moritz@localhost ~]$ openssl s_client -connect u7.moritz.in:443 -tls1  -tlsextdebug  -status -servername u7.moritz.in
[...]
OCSP response:
======================================
OCSP Response Data:
    OCSP Response Status: successful (0x0)
    Response Type: Basic OCSP Response
[...]
MySQL

Hier gibt’s wenig zu schreiben, wir installieren MariaDB 10:

[moritz@localhost ~]$ mysql --version
mysql  Ver 15.1 Distrib 10.1.19-MariaDB, for Linux (x86_64)     using readline 5.1
Mehr Demokratie wagen

Ein Webserver, PHP und MySQL ist natürlich nicht alles, was ihr bisher von Uberspace gewohnt seid. Wir werden mit eurer Hilfe nach und nach weitere Features implementieren und laden Euch in einen Slack Channel ein, um mit Euch über Uberspace 7 zu sprechen. Da wir nur 5 Gäste pro bezahltem Account in unser Slack einladen können, müssen wir hier noch mal in uns gehen, wie das genau von Statten gehen soll. An dieser Stelle wird es in kurzer Zeit ein Update geben und wir werden Euch auch über Twitter auf dem Laufenden halten.


Alte Zöpfe

Wir haben nun so ziemlich alles von Grund auf neu implementiert und dabei auch einige Entscheidungen überdacht. Eines steht bereits fest:

Keine Wildcard Domains mehr

Durch den konsequenten Einsatz von Let’s Encrypt sind Wildcard Domains einfach unpraktisch und bevor wir hier Abstriche bei den Zertifikaten machen, schaffen wir Wildcard Domains lieber ganz ab. Einerseits sind wir eh der Meinung, dass pro Uberspace Account auch nur ein Projekt laufen sollte, andererseits begrenzen wir die Anzahl von aufgeschalteten Domains nicht. Wenn ihr also z.B. 10 Subdomains nutzen wollt und dies bisher über einen Wildcard-Eintrag geregelt habt, tragt einfach die 10 Subdomains ein, bekommt automatisch gültige Zertifikate für alle Domains, und gut ist ☺️. Wir halten das - gerade weil es eine einmalige Aktion ist - für zumutbar.

Soweit erst mal zur Informationslage im Kaninchenbau, wir lesen uns bald an dieser Stelle oder quatschen auf dem 33c3! 🚀🤘


Header von Carl Offterdinger, Public Domain