Ich betreue seit ein paar Tagen ein kleines neues Projekt (TYPO3 12), dass von einem Hetzner Level 9 zu AllInkl umgezogen werden sollte. Da ich das Projekt weiter betreuen soll habe ich es zusätzlich lokal aufgesetzt. Das ganze hat mit Absprachen 4 Stunden gedauert.
Lokal arbeite ich mit Linux (Ubuntu 22.04) und Docker Compose. Dazu habe ich eine eigene Docker Compose Boilerplate mit der ich 4 Container hochfahre:
webdevops/php-apache-dev:8.3
Einen Container mit einem Apache Server und PHP 8.3, der die Seite ausliefert. Dieser Container hat ein Persistentes Volume, dass einen Projekt-Ordner von meinem Host in den Container mapped. Der Apache ist so konfiguriert, dass er den Public Ordner des Projekt-Ordners ausliefert. Auf dem Container ist zusätzlich Composer und XDebug installiert.
mariadb:10.9.5
Einen Container mit einer MariaDB zum Speichern der Datenbank. Dieser Container hat ein persistentes Volume, dass die Datenbank auf meinem Host speichert.
phpmyadmin/phpmyadmin
Einen PhpMyAdmin Container, um schnell über den Browser auf die Datenbank zugreifen zu können.
mailhog/mailhog
Einen Mailhog Container, um den TYPO3 Mailversand zu testen/abzufangen. Mailhog werde ich wohl aber nicht mehr lange verwenden, da deprecated. Hier werde ich wohl zeitnah zu Maildev wechseln.
Bei AllInkl war bereits ein Privat+ Paket gebucht und die Hauptdomain war auch schon dahin transferiert worden. Lediglich die A-Records der Domain zeigten noch auf den Hetzner Server, um die bestehende Seite dort auszuliefern.
Im ersten Schritt musste ich das Paket bei AllInkl von Privat+ auf Premium upgraden, da erst ab dem Premium Paket ein SSH Zugang zu dem Server enthalten ist. Da ich leider vergessen hatte beim Paket Upgrade den Haken bei "Serverwechsel - Sofort" zu setzen, musste ich einen Tag warten, da nun der Serverwechsel erst in der Nacht um 2 Uhr stattfand.
Daher habe ich das Projekt erstmal lokal aufgesetzt.
Einen Zugang zu dem Git Repo des bestehenden Projekts konnte ich von dem vorherigen Entwickler leider nicht bekommen. Daher bin ich wie folgt vorgegangen.
- Ich habe zunächst in meinem Gitlab ein leeres Repo angelegt und dies in dem Projekt-Ordner von Container 1 ausgechecked.
- In dem Projekt-Ordner habe ich jetzt 2 Ordner angelegt (public und extensions)
- Vom Hetzner Server habe ich jetzt die Composer.json runtergeladen und in dem Projekt-Ordner abgelegt. Das mache ich per SFTP auf der Konsole.
- Den Fileadmin auf dem Hetzner Server mit tar zu einem Tar-Ball gepackt (
tar -cf
) und diesen runtergeladen und im Projekt-Ordner/public wieder entpackt (tar -xf
).
- Die Sitepackage Extension heruntergeladen und im Projekt-Ordner/extensions gespeichert. (Wieder als Tar-Ball)
- Im Projekt-Ordner hab ich noch eine .gitignore Datei angelegt und darin verschiedene Pfade eingefügt, die nicht ins Git-Repo sollen. (fileadmin, uploads, typo3, .htaccess, index.php, public, var, vendor, composer.lock und die additional.php aud dem config/system Ordner)
- Den config Ordner vom Hetzner Server runtergeladen und im Projekt-Ordner gespeichert.
- In der Datei config/system/additional.php hab ich die Zugangsdaten zur Datenbank auf dem Hetzner-Server ausgelesen. Per SSH verbunden mit dem Hetzner Server kann man jetzt ganz leicht die Datenbank herunterladen mit:
mysqldump -h <host> -u <username> -p <db-name> > complete.projektname.sql
- Datenbank mit
tar -czf
gepackt und per SFTP heruntergeladen und dort wieder entpackt mit tar -xzf
.
- Jetzt habe ich meine Docker Umgebung hochgefahren und als erstes die Datenbank in die MariaDB eingespielt.
- An der composer json musste ich ein paar Anpassungen machen, da die Sitepackage Extension jetzt nicht mehr aus dem vorherigen Git Repo geladen werden konnte, sondern aus dem Projekt-Ordner/extensions geladen werden musste.
- In der config/system/addtional.php habe ich jetzt die Zugangsdaten zur DB zu meiner lokalen DB geändert.
- In der Siteconfig config/sites/projektname/config.yaml habe ich dann noch eine Base-Variante für meine lokale Domain angelegt. Dies ebenso auf meinem Host-System in der /etc/hosts.
- Danach habe ich mich dann auf dem Container 1 eingeloggt und dort ein
composer update
ausgeführt.
- Jetzt musste ich nur noch die Datei aus vendor/typo3/cms-install/Resources/Private/FolderStructureTemplateFiles/root-htaccess in meinen Projekt-Ordner/public kopieren und in .htaccess umbennen und damit lief das Projekt bei mir lokal.
Danach habe ich alle Dateien ins Git eingecheckt und ins Repo gepushed.
Jetzt habe ich mich erstmal um ein anderes Projekt gekümmert, da ich ja einen Tag warten musste auf den Serverwechsel bei AllInkl. 😉
Am nächsten Tag hab ich dann mit der Einrichtung bei AllInkl angefangen:
- Eine leere Datenbank angelegt im KAS und mir die Zugangsdaten in meinen Passwort Safe gespeichert.
- Den SSH Account im KAS aktiviert und meinen Public SSH Key hinterlegt, damit ich mich ohne Passwort am Server einloggen kann.
- Jetzt habe ich die Datenbank von gestern auf den Server hochgeladen per SFTP. Entpackt und in die Datenbank eingespielt.
mysql -u <username> -p <db-name> < complete.projektname.sql
Da die Datenbank bei AllInkl auf localhost läuft, brauch man kein Host angeben hierbei.
- Per SSH auf den Server eingeloggt und im /.ssh Verzeichnis ein RSA Keypair erzeugt mit:
ssh-keygen
- Den erzeugten id_rsa.pub Key habe ich dann in meinem Gitlab Repo hinterlegt, damit der AllInkl Server auf das Repo zugreifen kann.
- Auf dem AllInkl Server habe ich jetzt im Verzeichnis /www/htdocs/benutzername einen Projektordner angelegt. Einen Namen für den Ordner kann man sich selbst ausdenken. Ich habe ihn projektname-prod genannt.
- In dem Projektordner habe ich jetzt das Git Repo ausgecheked. Wichtig dabei ist der Punkt am Ende des Git-Clone befehls, damit das Repo direkt im Projekt-Ordner ausgechecked wird.
git clone git@gitrepo .
- Jetzt musste ich noch ein paar Dateien auf den Server laden:
- den Fileadmin
- die additional.php. Darin habe ich direkt die Datenbank Zugangsdaten angepasst
- Ich musste auf dem Server noch die CLI Version für PHP anpassen. Das geht aber bei AllInkl ganz einfach. Jenachdem welche CLI Version man benötigt muss man nur einen neuen Symlink erzeugen. Bei dem Projekt ging das mit:
ln -sfv /usr/bin/php83 /usr/bin/php
Und jetzt konnte ich auch schon ein composer update --no-dev
ausführen.
- In der Domain Konfiguration habe ich jetzt die Domain schonmal auf den Projekt-Ordner zeigen lassen. Aber die A-Records noch auf den Hetzner Server zeigen lassen.
- Die .htaccess Datei aus der cms-install Extension wie im lokalen Projekt kopiert und dann konnte der erste Test beginnen.
- Zum testen habe ich in meiner lokalen /etc/hosts Datei die Domain des Projekts auf den AllInkl Server zeigen lassen und konnte die Seite schon einmal ohne SSL aufrufen. Danach habe ich den Eintrag aus der hosts Datei wieder entfernt.
- Jetzt konnte also auch die A-Records der Domain im KAS anpassen und diese auf den AllInkl Server zeigen lassen. Obwohl ich die TTL runtergesetzt hatte am Vortag betrug diese noch 2 Stunden. Also erstmal ein anderes Projekt für 2 Stunden auf den Tisch. 😀 Ein guter Befehl um die genaue Restzeit zu ermitteln, die man warten muss, bis die neuen DNS Einstellungen greifen ist auf der Konsole:
dig A https://domain.tld
Da bekommt man die Restzeit angezeigt bis die TTL abgelaufen ist.
- Nach Ablauf der TTL musste ich noch das LetsEncrypt SSL Zertifikat im KAS für die Domain konfigurieren und damit war der Umzug fast abgeschlossen.
- Jetzt musste ich noch im Backend prüfen, ob alles wie gewollt funktioniert. GFX Konfig (Pfade zu GM/IM/GD), Mailconfig, falls benötigt. Zusätzlich sollte man noch einen Cronjob einrichten, falls man den Scheduler verwenden will. Und natürlich einige Tests im Frontend.
Vielleicht hilft Dir das ja ein wenig bei Deinem Umzug weiter.