ddev für TYPO3 anpassen

ddev ist eine Erweiterung eines normalen Docker Setups die für die Entwicklung von TYPO3 Projekten sehr nützlich sind und bietet eine sehr gute Geschwindigkeit.

Für die Standardinstallation gibt es gute Anleitungen unter:
typo3.org
ddev installation
ddev TYPO3 Quickstart

Diese bietet automatische Projekt URLs, https Zertifikate mit mkcert, hohe Performance und Anpassbarkeit und vieles mehr. Im diesem Beitrag geht es um spezielle Anpassungen für TYPO3. 2019 wurde ddev in zwei Bereichen für die Benutzung mit TYPO3 interessanter. In der Version 1.10.0 kamen konfigurierbare Kommandos dazu und in der Version 1.12.0 deutlich mehr auswählbare Datenbank Versionen.

config.yaml anpassen

APIVersion: v1.12.2
name: ddev-typo3
type: typo3
docroot: public
php_version: "7.2"
webserver_type: apache-fpm
dbaimage: phpmyadmin/phpmyadmin:4.9.4
router_http_port: "80"
router_https_port: "443"
xdebug_enabled: false
additional_hostnames: []
additional_fqdns: []
mysql_version: "5.7"
nfs_mount_enabled: true
provider: default
hooks:
  post-start:
  - exec: echo '*/1 * * * * root TYPO3_CONTEXT=Development/Local /usr/bin/php /var/www/html/public/typo3/sysext/core/bin/typo3
      scheduler:run' | sudo tee -a /etc/cron.d/typo3
  - exec: sudo chmod 0600 /etc/cron.d/typo3 && sudo service cron start
webimage_extra_packages: [cron]
use_dns_when_possible: true
timezone: Europe/Berlin

Den webserver_type setze ich meist auf apache-fpm da nginx keine .htaccess Dateien unterstützt. Das dbaimage kann man seit ddev 1.12.* auf phpmyadmin/phpmyadmin:4.9.4 setzen. Das klingt unspektakulär aber seit phpmyadmin 4.8 kann die Kollation aller Tabellen auf einen Rutsch geändert werden und das original ddev dba Image enthält nur Version 4.7. Trotz des geänderten Images funktionieren die dddev Routing Funktionen und ich kann Phpmyadmin unter der Projektadresse am Port 8036 erreichen.
nfs_mount_enabled setze ich generell auf true da sich die Reaktionszeiten von TYPO3 dadurch stark verbessern. hooks und webimage_extra_packages habe ich so gesetzt das der TYPO3 Planer(Scheduler) funktioniert. Mit webimage_extra_packages können auch weitere Pakete wie graphicsmagick installieren werden.
webimage_extra_packages: [cron, graphicsmagick]
Für sinnvolle Zeiteinstellungen setze ich timezone auf Europe/Berlin.
Seit der Version 1.12 sind die php Versionen 5.6 bis 7.4, die mariadb Versionen 5.5 bis 10.4 und mysql Versionen 5.5 bis 8.0 im Grundprojekt verfügbar.

docker-compose.override.yaml

version: '3.6'

services:
web:
environment:
- TYPO3_CONTEXT=Development/Local
- PHP_IDE_CONFIG=serverName=${DDEV_SITENAME}.ddev.site
volumes:
# add php xdebug profile path
- ./php-profiles/:/tmp/debug/:delegated
# ports:
# - 8899:80

Hier kann der TYPO3_CONTEXT gesetzt werden. Mit PHP_IDE_CONFIG=serverName=*** kann der Servername für Phpstorm xdbug gesetzt werden.
Unter volumes wird der Ordner für xdebug Profiling angegeben. Der auskommentierte port kann für  das testen von TYPO3 auf verschiedenen Geräten/Browsern benutzt werden (###host-ip###:8899).

Homeadditions

Wenn man viel auf der Konsole im Container unterwegs ist sind da Anpassungen hilfreich. Die einfachste Variante ist im homeadditions Ordner die Datei bash_aliases.example in .bash_aliases umzubenennen. Wer, wie ich, die zsh Shell mag, kann dieser Anleitung folgen.
In diesem Ordner kann z. B. auch ein .ssh Ordner mit Keys und config angelegt werden. Bitte nicht vergessen diesen in die .gitignore Datei aufzunehmen wink

Php Settings

Im Ordner .ddev/php können eigene php Settings gesetzt werden. Ich habe hier eine 99-override.ini abgelegt. Die 99 ist um die Settings wirklich zu überschreiben.

; Zend OPCache
opcache.enable = 1
opcache.memory_consumption = 256M
opcache.interned_strings_buffer = 16
opcache.max_accelerated_files = 10000
opcache.fast_shutdown = 1
opcache.enable_cli = 1
opcache.revalidate_freq = 0

;APCu Support
apc.shm_size = 128M

; XDebug
xdebug.remote_enable = 1
xdebug.remote_autostart = 0
xdebug.remote_connect_back = 0
xdebug.remote_host = host.docker.internal
xdebug.idekey = "PHPSTORM"

xdebug.cli_color = 1
xdebug.max_nesting_level = 1000

xdebug.profiler_enable_trigger = 1
xdebug.profiler_output_dir = '/tmp/debug'

Ansonsten sind empfohlene Einstellungen für Zwischespeicher(Caches) und Debugging geändert. Die Apcu Cache Size ist normalerweise auf 32MB gesetzt. Da APCu viel häufiger auf Servern zu finden ist als Redis, nutze ich ihn recht oft und benötige für manche Projekte auch mal mehr Speicher. Für xdebug fand ich das Ausschalten der Autostart Funktion recht sinnvoll.

Anpassbare Konsolen Befehle

Seit der ddev Version 1.10.* können eigene Kommandos angelegt werden. Unter .ddev/commands gibt es für die Standardcontainer jeweils einen Ordner wie z.B. db oder web. Kommandos die im host Ordner liegen werden auf eurem Rechner ausgeführt, die in den anderen Ordnern im jeweiligen Container. In den einzelnen Ordnern liegen Beispielscripte und eine Readme mit Erklärungen und einer Liste Env Variablen die man in den Bash Scripten nutzen kann. In den Commands können alle Möglichkeiten eines normalen Shellscripts genutzt werden. Hier ein paar Beispiele:

host Ordner

db-backup

#!/bin/bash

## Description: Backup db
## Usage: db-backup
## Example: "ddev db-backup"

ddev exec mkdir -p ./.ddev/backup

ddev exec rm -f ./.ddev/backup/mysql-db.sql.gz

ddev export-db -f ./.ddev/backup/mysql-db.sql.gz

db-restore

#!/bin/bash

## Description: Restore db
## Usage: db-restore
## Example: "ddev db-restore"

ddev import-db --src=./.ddev/backup/mysql-db.sql.gz

ddev typo3cms cleanup:updatereferenceindex

Die auskommentierten Zeilen werden von ddev benutzt um Hilfe zum Befehl anzuzeigen. „## Usage:“ ist etwas speziell, wenn da nicht der Dateiname steht, gibt es eine Fehlermeldung beim ausführen. Wenn möglich nutze ich Befehle die im Container ausgeführt werden, damit gibt es eine größere Unabhängigkeit vom Host Betriebssystem.

open

#!/bin/bash

## Description: Open a browser with the current site Backend
## Usage: open
## Example: "ddev open"

BROWSER='Firefox Developer Edition'

open -a "${BROWSER}" ${DDEV_PRIMARY_URL}/typo3

Ist eine Abwandlung des vorhandenen launch Befehls, der mir gleich das TYPO3 Backend im von mir bevorzugten Browser öffnet.

warmup-dev

#!/usr/bin/env bash

## Description: Cache warmup with sitemap.xml
## Usage: warmup-dev
## Example: "ddev warmup-de"

domains=(
ddev-typo3.ddev.site
)

function get {
wget -q --no-check-certificate $1/sitemap.xml --no-cache -O - | egrep -o "$1[^<]+" | while read subsite;
do
subsite=$(echo $subsite | sed 's/\&amp;/\&/g')
echo --- Reading Sub: $subsite ---
wget -q --no-check-certificate $subsite --no-cache -O - | egrep -o "$1[^<]+" | while read line;
do
line=$(echo $line | sed 's/\&amp;/\&/g')
time curl -sL -A 'Cache Warmer' $line > /dev/null 2>&1
echo $line:
done
echo --- FINISHED reading sub-sitemap: $subsite: ---
done
}

for domain in "${domains[@]}" ; do
echo "$domain"
get $domain
done

Lädt alle Seiten der in TYPO3 9.x aktivierbaren sitemap.xml. Das ist eine simple Variante um den Cache aufzubauen oder um alle Bilder neu zu berechnen.

web Ordner

Diese Befehle werden im Server Container ausgeführt.

t3logs

#!/bin/bash

## Description: show TYPO3 logs
## Usage: t3logs
## Example: "ddev t3logs"

tail -F /var/www/html/var/log/* >> /dev/stderr

Das TYPO3 log wird fortlaufend im Terminal angezeigt.

typo3

#!/bin/bash

## Description: run typo3 cli
## Usage: typo3
## Example: "ddev typo3"

TYPO3_CONTEXT=Development/Local ./vendor/bin/typo3 $@

Ohne Parameter werden alle vom TYPO3 Core zur Verfügung gestellten Consolen Befehle aufgelistet. Diese können als Parameter übergeben und ausgeführt werden.
z. B. "ddev typo3 referenceindex:update"

typo3cms

#!/bin/bash

## Description: run typo3cms (typo3 console) in cli
## Usage: typo3cms
## Example: "ddev typo3cms"

TYPO3_CONTEXT=Development/Local ./vendor/bin/typo3cms $@

Funktioniert wie der typo3 Befehl für die Extension typo3-console.
ddev typo3cms cache:flush
Wenn im Container kein TYPO3 läuft, können auf diese Weise zum Beispiel Symfony Consolen Befehle ausgeführt werden.

t3cache

#!/bin/bash

## Description: run typo3cms cache:flush
## Usage: t3cache
## Example: "ddev t3cache"

if [[ $1 = "debug" ]]; then
PHP_IDE_CONFIG=serverName=ddev-typo3.ddev.site XDEBUG_CONFIG=idekey=PHPSTORM TYPO3_CONTEXT=Development/Local ./vendor/bin/typo3cms cache:flush
else
TYPO3_CONTEXT=Development/Local ./vendor/bin/typo3cms cache:flush
fi

Ist ein Beispiel wie Befehle anhand eines Parameters z.B. im Debug Modus ausgeführt werden können. Das ist besonders beim Testen eigener Commands sehr nützlich.

Artikel Suchen