03b — Installation ohne DDEV
Für einen Server, ein Hosting-Konto oder jeden lokalen Stack, der nicht DDEV ist. Dasselbe Paket, dieselben zwei Extensions — aber init-yavi.sh gehört nicht zu diesem Weg. Dieses Skript steuert DDEV von Anfang bis Ende; ohne DDEV hat es niemanden, mit dem es reden könnte.
Was folgt, ist dieselbe Abfolge von Hand. Sie ist länger als ein Befehl, aber jeder Schritt ist eine Zeile, und man sieht, was jeder davon tut.
Wenn DDEV infrage kommt, ist 03 — Installation mit DDEV der bessere Weg. Dieses Kapitel gibt es, weil das ZIP ein TYPO3-Projekt ist — und ein TYPO3-Projekt braucht keine Container, um zu laufen.
Was gebraucht wird
| PHP | 8.2 oder neuer, CLI und Web, mit pdo_mysql, gd, intl, zip |
| Bildverarbeitung | die Kommandozeilenwerkzeuge von ImageMagick oder GraphicsMagick — siehe unten |
memory_limit | 512 MB für die Kommandozeile. Die Vorgabe von 128 MB reicht nicht — siehe unten |
| Composer | 2.x |
| Datenbank | MySQL 8 oder MariaDB 10.6+, eine leere Datenbank und ein Benutzer, der Tabellen anlegen darf |
| Webserver | Document Root auf public/, PHP über FPM oder mod_php |
typo3 cache:flush mit „Allowed memory size of 134217728 bytes exhausted“ in der TcaSchemaFactory — TYPO3 v14 baut das gesamte Schema im Speicher auf. DDEV setzt memory_limit = -1 und verdeckt das. Entweder in der php.ini anheben oder jedem Befehl php -d memory_limit=512M voranstellen.1. Entpacken
unzip yavi-lucerne.zip
cd yavi-lucerneDer Ordner .ddev/ und init-yavi.sh werden hier nicht gebraucht. Sie liegen zu lassen ist unschädlich; sie zu löschen ebenso in Ordnung.
2. Umgebungsdatei anpassen
.env kommt mit den Container-Werten von DDEV — Host db, Port 3306, Datenbank db. Auf jeder anderen Maschine zeigen sie ins Leere. Die eigenen eintragen:
TYPO3_CONTEXT='Production'
TYPO3_DB_HOST='127.0.0.1'
TYPO3_DB_PORT='3306'
TYPO3_DB_DATABASE='your_database'
TYPO3_DB_USERNAME='your_user'
TYPO3_DB_PASSWORD='your_password'
IMAGEMAGICK_PATH='/usr/bin/'IMAGEMAGICK_PATH ist das Verzeichnis, in dem die Binärdatei liegt, nicht die Binärdatei selbst: /usr/bin/ für ImageMagick 6 (convert), /opt/homebrew/bin/ für eine Homebrew-Installation von ImageMagick 7 (magick) oder GraphicsMagick (gm). dirname $(which convert magick gm 2>/dev/null | head -1) findet es.
Gemeint sind die Kommandozeilenwerkzeuge, nicht die PHP-Erweiterung. TYPO3 skaliert und beschneidet Bilder, indem es diese Binärdateien aufruft; die Erweiterung gd ersetzt sie nicht.
ImageMagick in /usr/bin/, es ruft also weiter eine Binärdatei auf, die es nicht gibt — die Site rendert, aber nichts wird je skaliert oder beschnitten, und fileadmin/_processed_/ bleibt leer. Entweder ImageMagick oder GraphicsMagick installieren oder die Verarbeitung bewusst in config/system/settings.php abschalten: ``php 'GFX' => [ 'processor_enabled' => false, ], `` Bilder werden dann in Originalgröße ausgeliefert. Für einen ersten Blick in Ordnung, für eine Live-Site nicht — die Bildvarianten des Themes hängen an der Verarbeitung.3. Abhängigkeiten installieren
composer installDas löst TYPO3 v14 und Bootstrap Package über Packagist auf und bindet packages/yavi-core und packages/yavi-lucerne über das in der composer.json deklarierte path-Repository ein. Es ist nichts zu registrieren; die Extensions kommen aus dem ZIP.
4. TYPO3 installieren
php -d memory_limit=512M vendor/bin/typo3 setup \
--no-interaction \
--driver=mysqli \
--server-type=other \
--host=127.0.0.1 --port=3306 \
--dbname=your_database --username=your_user --password=your_password \
--admin-username=admin --admin-user-password='choose-a-strong-one' \
--admin-email=you@example.com \
--project-name="Your Project"--server-type entscheidet, ob TYPO3 eine .htaccess schreibt: apache für Apache, iis, oder other für nginx und alles Übrige. Die Option sieht optional aus — sie führt other als deklarierte Vorgabe —, doch diese Vorgabe gilt nur im interaktiven Modus. Zusammen mit --no-interaction muss sie angegeben werden, sonst bricht der Befehl mit „Argument #1 ($serverType) must be of type ?string, false given“ ab.
Ohne --no-interaction fragt der Befehl stattdessen jeden Wert einzeln ab, --server-type eingeschlossen.
5. Über die Demo-Inhalte entscheiden
Ab hier zwei Wege. Beide enden bei einer lauffähigen Site.
5a. Mit den Demo-Inhalten
gunzip -c .tarballs/yavi-demo.sql.gz | mysql -h 127.0.0.1 -u your_user -p your_databaseOder dieselbe Datei über phpMyAdmin einspielen oder über das, was der Hoster anbietet.
DROP TABLE IF EXISTS für jede Tabelle, auch für die be_users-Tabelle, die Schritt 4 gerade angelegt hat. Das ist Absicht — der Dump kommt ohne Konten, und das eigene wird in Schritt 8 angelegt. Es heißt aber auch, dass der Import die gesamte Datenbank ersetzt: niemals auf eine Installation richten, deren Inhalte erhalten bleiben sollen.Danach die Medien kopieren, denn die Dateidatensätze des Dumps erwarten sie unterhalb von fileadmin/:
cp -R packages/yavi-lucerne/Initialisation/Files/. public/fileadmin/5b. Ohne die Demo-Inhalte
Den Import auslassen. Nach Schritt 6 läuft dann ein Hilfsskript, das eine Wurzelseite anlegt und die Grundstruktur des Themes einspielt — Topbar, Footer und die Seiten, auf die das Footer-Menü verlinkt. Einzelheiten unter Ohne die Demo installieren; es ist dieselbe Struktur, die der DDEV-Installer einrichtet.
6. Extensions aktivieren
php -d memory_limit=512M vendor/bin/typo3 extension:setup7. Site-Konfiguration einrichten
mkdir -p config/sites/<id>
cp -R packages/yavi-lucerne/Initialisation/Site/yavilucerne/. config/sites/<id>/<id> ist ein frei gewählter Name — er ist nur der Ordnername und erscheint nirgends auf der Site. Der Ordner enthält drei Dateien, und das Theme braucht alle drei: config.yaml für Base, Sprachen und die Sets, page.tsconfig für die Backend-Layouts, das RTE-Preset und die Definitionen der Inhaltselemente sowie settings.yaml für die Theme-Einstellungen und den Lizenzschlüssel. Die beiden letzten liest TYPO3 selbstständig aus dem Site-Ordner.
Danach config/sites/<id>/config.yaml öffnen und die DDEV-Teile ersetzen. Die mitgelieferte Vorlage führt einen baseVariants-Block und %env(DDEV_BASE)%-Platzhalter, die ohne DDEV leer bleiben:
base: 'https://example.com/'
# den ganzen baseVariants-Block loeschen
languages:
-
base: 'https://example.com/' # war %env(DDEV_BASE)%
-
base: 'https://example.com/de/' # war %env(DDEV_BASE_DE)%Ohne Demo wird das Hilfsskript jetzt ausgeführt — es braucht die Site-Konfiguration, weil es hineinschreibt:
php -d memory_limit=512M init-static-elements.php <id>
php -d memory_limit=512M vendor/bin/typo3 cache:flushEs gibt die vergebenen uids aus. Der Cache-Flush ist nicht optional: Das Hilfsskript schreibt Einstellungen, nachdem TypoScript bereits gebaut wurde; Topbar und Footer bleiben bis zum nächsten Flush leer.
8. Den eigenen Backend-Benutzer anlegen
Nach dem Import der Demo nicht überspringen. Schritt 4 hat ein Konto angelegt, aber der Dump aus 5a enthält DROP TABLE IF EXISTS be_users und bringt selbst keine Konten mit — dieses Konto ist also weg, und es ist niemand mehr da, mit dem man sich anmelden könnte. Das Anmeldeformular erscheint wie gewohnt und weist schlicht jeden Versuch ab, was die Suche in die falsche Richtung lenkt.
php -d memory_limit=512M vendor/bin/typo3 backend:user:create9. Den Webserver auf public/ richten
Document Root ist public/, nicht der Projektordner. Die .htaccess des Projekts liegt für Apache bereits bereit; für nginx die Konfiguration aus der TYPO3-Dokumentation verwenden.
Für den Webserver-Benutzer beschreibbar:
config/sites/<id>/settings.yaml hierhin speichert das Backend-Modul
var/ Caches, Logs, Sessions
public/typo3temp/ kompiliertes CSS
public/fileadmin/ nur für selbst gehostete Google-SchriftenEin kurzer Blick mit dem eingebauten Server von PHP
Reicht, um zu sehen, ob das Frontend rendert. Für das Backend reicht es nicht — siehe unten.
php -d memory_limit=512M -S localhost:8099 -t public public/index.phpMit einem Router-Skript hört dieser Server auf, statische Dateien auszuliefern; Bilder antworten dann mit 404. Entweder das Router-Argument weglassen oder eines verwenden, das vorhandene Dateien durchreicht:
<?php // public/_router.php
$path = parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH);
if ($path !== '/' && is_file(__DIR__ . urldecode($path))) { return false; }
require __DIR__ . '/index.php';Das Backend läuft darauf nicht zuverlässig: Man meldet sich an, links erscheint das Modulmenü, und die Fläche daneben bleibt leer. Nichts in der Browser-Konsole erklärt das — jedes Stylesheet und jedes Skript antwortet mit
PHP_CLI_SERVER_WORKERSsieht nach der Lösung aus und ist keine; unter
macOS füllt es das Log mit Failed to poll event und verschlimmert die Lage.
Für das Backend einen echten Webserver verwenden. Welchen, spielt kaum eine Rolle — Apache mit mod_proxy_fcgi, nginx mit einem PHP-FPM-Pool, Caddy, Valet, Herd, MAMP. Die TYPO3-Dokumentation führt aktuelle Konfigurationen für Apache und nginx.
/usr/sbin/httpd daran, irgendetwas unterhalb von /Volumes/ zu lesen; ein Projekt auf einem externen oder Netzlaufwerk antwortet deshalb mit 403 und file permissions deny server access im Fehlerlog — obwohl die Dateien einem selbst gehören und einwandfrei lesbar sind. Über Homebrew installiertes PHP-FPM unterliegt dieser Beschränkung nicht, was das Symptom verwirrend macht: Seiten rendern, aber jedes Bild und jedes Stylesheet unter fileadmin/ wird verweigert. Das Projekt unterhalb des eigenen Home-Verzeichnisses halten oder dem Webserver Full Disk Access geben.10. Prüfen
php -d memory_limit=512M vendor/bin/typo3 extension:list | grep yaviyavi_core und yavi_lucerne, beide aktiv. Danach die Site öffnen. Mit Demo landet man auf der fertigen Standard-Site, ohne sie auf einer Seite mit dem Rahmen des Themes darum herum.
Weiter mit 05 — Die erste Site einrichten für den Lizenzschlüssel und die ersten Inhalte.
Was sich vom DDEV-Weg unterscheidet
| DDEV | hier | |
|---|---|---|
| Datenbankverbindung | von DDEV nach config/system/additional.php geschrieben | selbst, in .env |
memory_limit | unbegrenzt | selbst, mindestens 512 MB für die CLI |
trustedHostsPattern | von DDEV auf .* gesetzt | die Vorgabe von TYPO3, die gegen SERVER_NAME prüft |
| Base-URLs | %env(DDEV_BASE)% | die eigene Domain, baseVariants entfernt |
| Demo-Import | ddev import-db | das eigene Datenbankwerkzeug |
| Backend-Benutzer | vom Installer neu angelegt | backend:user:create |
Die Zeile zu trustedHostsPattern lohnt einen Blick, wenn die Site mit „The current host header value does not match the configured trusted hosts pattern“ antwortet. TYPO3 vergleicht den Host-Header mit dem SERVER_NAME des Webservers; wo beide auseinandergehen — ein Proxy, ein Container, ein Hostname-Alias —, wird das Muster ausdrücklich in config/system/settings.php gesetzt.