Pisałem o DDEV w 2018 jako o narzędziu do stawiania Magento lokalnie. Przez 7 lat stało się moim domyślnym środowiskiem do każdego projektu PHP. Ale większość developerów używa tylko podstaw: ddev start, ddev ssh, ddev exec. Pokazuję zaawansowane możliwości które realnie wpływają na komfort pracy: mutagen dla wydajności na macOS, własne usługi w docker-compose, współdzielone konfiguracje w teamie i hooks automatyzujące setup.
Wydajność na macOS – największy ból DDEV
Na Linuxie DDEV działa z prędkością natywną. Na macOS volumes Docker są historycznie wolne przez warstwy wirtualizacji. DDEV rozwiązuje to przez Mutagen – synchronizację plików która trzyma kopię kodu w kontenerze poza woluminem macOS:
# .ddev/config.yaml - włącz mutagen dla projektów na macOS performance_mode: mutagen # Alternatywy: # performance_mode: nfs - starsze rozwiązanie, wymaga konfiguracji NFS # performance_mode: none - domyślny (wolny na macOS) # performance_mode: mutagen - zalecany dla macOS (szybki, automatyczny)
# Sprawdź aktualny tryb wydajności ddev debug mutagen # Pełna przebudowa mutagen sync (gdy coś się rozjedzie) ddev mutagen reset # Status synchronizacji ddev mutagen status # Porównanie czasów (przykładowe, projekt Magento 2): # Bez mutagen: bin/magento cache:flush = 18s # Z mutagen: bin/magento cache:flush = 2.1s # Różnica: ~8x szybciej na typowym MacBook Pro M2
Własne serwisy – dodaj Redis Insight, MailHog, Adminer
# .ddev/docker-compose.extras.yaml
# Dodatkowe serwisy dostępne przez ddev.site domenę
version: '3.6'
services:
# Redis Insight - GUI dla Redis
redis-insight:
image: redislabs/redisinsight:latest
expose:
- "8001"
labels:
com.ddev.site-name: ${DDEV_SITENAME}
com.ddev.approot: $DDEV_APPROOT
environment:
VIRTUAL_HOST: $DDEV_SITENAME-redis-insight.ddev.site
HTTP_EXPOSE: "8001:8001"
HTTPS_EXPOSE: "8001:8001"
# Adminer - lekki GUI dla bazy danych
adminer:
image: adminer:latest
expose:
- "8080"
labels:
com.ddev.site-name: ${DDEV_SITENAME}
environment:
VIRTUAL_HOST: $DDEV_SITENAME-adminer.ddev.site
HTTP_EXPOSE: "8080:8080"
HTTPS_EXPOSE: "8080:8080"
ADMINER_DEFAULT_SERVER: db
ADMINER_DESIGN: "lucas-sandery"
# Mailhog - przechwytuje emaile wysyłane przez PHP
mailhog:
image: mailhog/mailhog:latest
expose:
- "8025"
- "1025"
labels:
com.ddev.site-name: ${DDEV_SITENAME}
environment:
VIRTUAL_HOST: $DDEV_SITENAME-mail.ddev.site
HTTP_EXPOSE: "8025:8025"
HTTPS_EXPOSE: "8025:8025"
# Po dodaniu serwisów - restart i dostęp ddev restart # URL-e do nowych serwisów ddev describe # pokaże wszystkie dostępne URL-e # Np.: # https://myproject-redis-insight.ddev.site - Redis Insight # https://myproject-adminer.ddev.site - Adminer # https://myproject-mail.ddev.site - MailHog
Hooks – automatyzacja setupu projektu
# .ddev/config.yaml - hooks które uruchamiają się przy określonych zdarzeniach
hooks:
# Po ddev start - uruchom setup jeśli nie zrobiony
post-start:
- exec: "[ -f /var/www/html/app/etc/env.php ] || echo 'UWAGA: env.php nie istnieje - uruchom ddev setup'"
- exec: "cd /var/www/html && php bin/magento maintenance:status"
# Po ddev pull - odśwież pliki statyczne po pobraniu danych
post-pull:
- exec: "cd /var/www/html && bin/magento setup:upgrade --keep-generated"
- exec: "cd /var/www/html && bin/magento cache:flush"
- exec: "echo 'Post-pull setup gotowy'"
# Przed ddev stop - opcjonalnie zapisz cache
pre-stop:
- exec: "echo 'Zatrzymuję DDEV dla projektu ${DDEV_SITENAME}'"
# Własne komendy DDEV - dodaj do .ddev/commands/web/
# Dostępne jako ddev KOMENDA
# .ddev/commands/web/setup
#!/bin/bash
## Description: Pełny setup Magento 2 - run po pierwszym pobraniu projektu
## Usage: setup
## Example: "ddev setup"
set -e
cd /var/www/html
echo "=== Magento 2 Setup ==="
# Instalacja Composer dependencies
composer install --no-interaction
# Konfiguracja Magento
bin/magento setup:install \
--base-url="https://${DDEV_HOSTNAME}" \
--db-host=db \
--db-name=db \
--db-user=db \
--db-password=db \
--admin-firstname=Admin \
--admin-lastname=User \
--admin-email=admin@example.com \
--admin-user=admin \
--admin-password=Admin123! \
--backend-frontname=admin \
--search-engine=opensearch \
--opensearch-host=opensearch \
--opensearch-port=9200 \
--cache-backend=redis \
--cache-backend-redis-server=redis \
--cache-backend-redis-db=0 \
--session-save=redis \
--session-save-redis-host=redis \
--session-save-redis-log-level=4 \
--session-save-redis-db=2 \
--no-interaction
bin/magento deploy:mode:set developer
bin/magento indexer:reindex
echo "=== Setup zakończony ==="
echo "Admin URL: https://${DDEV_HOSTNAME}/admin"
echo "Login: admin / Admin123!"
Współdzielona konfiguracja w teamie – ddev.yaml w repo
# .ddev/config.yaml - komitujesz do repo, współdzielony przez cały team name: myproject-magento type: magento2 docroot: pub php_version: "8.4" webserver_type: nginx-fpm router_http_port: "80" router_https_port: "443" xdebug_enabled: false # każdy włącza sobie lokalnie gdy potrzebuje # Zmienne środowiskowe dostępne w kontenerze web_environment: - MAGE_MODE=developer - COMPOSER_MEMORY_LIMIT=-1 # Porty Redis i Elasticsearch database: type: mariadb version: "10.11" # Serwisy use_dns_when_possible: true performance_mode: mutagen # wymagane dla macOS, nieszkodliwe na Linux # Addons których wymaga projekt # ddev get ddev/ddev-redis # ddev get ddev/ddev-opensearch
# .ddev/README.md - instrukcja dla nowego developera w teamie # Zacommituj razem z config.yaml! # Pierwsze uruchomienie projektu: # 1. git clone git@github.com:company/project.git # 2. cd project # 3. ddev start # uruchom środowisko # 4. ddev setup # zainstaluj Magento i dane deweloperskie # 5. ddev launch # otwórz w przeglądarce # Codzienne użycie: # ddev start / ddev stop # ddev ssh - wejdź do kontenera # ddev exec KOMENDA - wykonaj komendę # ddev logs - logi nginx/php # ddev xdebug on/off - włącz/wyłącz Xdebug
Xdebug on demand – nie zwalnia gdy nie debugujesz
# Xdebug domyślnie wyłączony (nie spowalnia PHP) # Włącz tylko gdy debugujesz ddev xdebug on # włącz - teraz PHPStorm może łapać breakpointy ddev xdebug off # wyłącz po debugowaniu # Sprawdź status ddev xdebug status # PHPStorm - konfiguracja z DDEV: # Settings -> PHP -> Servers -> dodaj serwer # Name: DDEV # Host: myproject.ddev.site # Port: 443 # Use path mappings: /var/www/html -> /path/to/local/project
Debugowanie wydajności DDEV – gdy jest wolno
# Diagnostyka problemów z wydajnością # Sprawdź zasoby kontenerów ddev debug dockercheck # Sprawdź co zajmuje CPU/RAM ddev exec "top -bn1 | head -20" # Wyczyszczenie starych obrazów Docker (zwalnia miejsce i przyspiesza build) docker system prune --volumes # Przebuduj kontenery gdy coś się posypało ddev poweroff ddev start --skip-confirmation # Sprawdź logi Docker daemon na macOS # Często wolność pochodzi z braku RAM dla Docker VM # Settings -> Resources -> Memory: min 6GB dla Magento 2
Podsumowanie
DDEV po 7 latach stało się kompleksowym narzędziem deweloperskim które wykracza daleko poza „uruchom PHP lokalnie”. Mutagen na macOS eliminuje główną bolączkę – wolność volumes Dockera. Własne serwisy przez docker-compose.extras.yaml dają Redis Insight, MailHog i Adminer w minutę. Hooks i własne komendy automatyzują powtarzalne czynności do jednej linii. Commitowanie .ddev/config.yaml do repo gwarantuje że każdy nowy developer w teamie ma identyczne środowisko po trzech komendach.
