Heute möchte ich erklären, wie wir unsere Infrastruktur verwalten und wie wir dies in Zukunft tun wollen. Obwohl wir bei Sandstorm im letzten Jahr stark gewachsen sind, und mittlerweile fünf Personen beschäftigen, zählen wir definitiv noch als kleine Firma.
[English version below]
Aus Datenschutzgründen ist es uns wichtig, möglichst wenige Cloud Services zu verwenden – speziell die kritischen Dienste wollen wir selbst "in der Hand" haben. Damit haben wir die Herausforderung, mit möglichst wenig Aufwand verschiedenste Dienste zu betreiben. Wir haben kein Operations-Team, sondern machen dies alles nebenbei.
Das Problem: Viele kleine Dienste
Wir haben eine Vielzahl von Diensten und Tools, welche wir verwenden – und dabei nutzen wir sehr viele verschiedene Programmiersprachen und Umgebungen wie PHP, Node.js, Java/JVM und Ruby. Außerdem probieren wir gern herum und experimentieren bspw. auch mit der Programmiersprache Go.
Jede Programmierplattform hat einen präferierten Weg, wie Hosting erfolgen sollte. Für uns ist nun die Schwierigkeit, diesen Plattform-Zoo möglichst effizient zu betreiben. Die Performance sollte gut sein, jedoch geht es uns nicht darum, aus unseren Servern das absolut letzte Quentchen an Performance herauszuholen – wir betreiben momentan keine Ultra-High-Performance-Dienste oder Webseiten.
Die Lösung: Platform As A Service mit Dokku
Wir haben vor Kurzem ein System namens Dokku entdeckt, welches die Heroku PAAS basierend auf Docker nachbaut.
Das Grundprinzip: Der Quellcode der Webanwendung (egal in welcher Sprache) liegt in einem Git-Repository; und man pusht auf ein spezielles Git-Remote, um das Deployment zu starten. Dokku findet nun heraus, in welcher Programmiersprache die Anwendung geschrieben ist, installiert die Abhängigkeiten, stoppt die laufende Anwendung und startet letztendlich einen Docker-Container für die neue Anwendung.
Wir verwenden eine spezielle Dokku-Variante namens Dokku-Alt, welche auch Datenbanken, persistente Ordner, SSL und weitere Features unterstützt. Somit haben wir die folgenden Vorteile:
- das ganze Team kann neue Dienste deployen und produktiv schalten, egal in welcher Programmiersprache
- das Deployment ist sehr robust und läuft extrem zuverlässig
- wir haben eine zentrale Stelle für Backups
- man kann sehr einfach Kopien von einem bestehenden Dienst als Test-Instanzen live schalten
- Deployment muss nicht mehr über Jenkins passieren; dies reduziert die Komplexität des Deployments
Zusätzlich haben wir Dokku-Alt etwas erweitert, um eigene Nginx-Konfiguration, Volume Backup und Voll-Backup zu unterstützen. Diese Anpassungen sind natürlich auch auf GitHub verfügbar.
Relation zu anderen Deployment-Tools wie TYPO3 Surf oder Capistrano
Bevor wir Dokku entdeckt haben, hatten wir verschiedenste Programmiersprachen-spezifische Deployment-Strategien. Wir haben beispielsweise TYPO3 Surf verwendet, um PHP-Anwendungen zu deployen. Für die anderen Sprachen gab es meist recht "handgestrickte" Lösungen, die von einer Jenkins-Instanz gestartet wurden.
In nächster Zeit werden wir für unsere interne Infrastruktur nahezu vollständig auf Dokku umsteigen, da beispielsweise TYPO3 Surf für uns zu groß ist:
- wir benötigen keinen Zero-Downtime-Deploy. Near-Zero-Downtime-Deploy ist für uns vollkommen ausreichend
- wir benötigen keine Orchestrierung verschiedener Server
Insgesamt halten wir beispielsweise Capistrano und Surf weiterhin für extrem wertvolle Tools, die in größeren Use Cases sinnvoll sind. Aber für unseren Anwendungsfall passt das Git-basierte Deployment einfach besser.
Blick in die Zukunft
TYPO3 Neos auf Heroku/Dokku: Wir sind gerade dabei, ein kleines Neos-Package zu entwickeln, welches Neos einfacher und direkter auf Heroku oder Dokku deploybar macht. Dies werden wir natürlich als Open Source veröffentlichen und dann auch auf diesem Blog beschreiben.
Single Signon mit vielen kleinen Diensten: Da wir nach dem Umstellen unserer Infrastruktur sehr viele entkoppelte Dienste verwenden, muss man das Problem der gemeinsamen Logins (Single Signon) dediziert lösen. Hierzu wird es bald einen neuen Blog-Post geben, welches unsere bestehende Lösung beschreibt. Stay Tuned!
Wir würden uns sehr über Feedback zu unserem Ansatz freuen – ihr könnt uns zum Beispiel direkt auf Twitter erreichen.