PHP / Magento Dev Blog

  • Publikacje
  • O autorze
  • Kontakt

DDEV zaawansowany – mutagen, własne serwisy, hooks, współdzielona konfiguracja w teamie

by Henryk Tews / czwartek, 21 sierpnia 2025 / Opublikowano w Środowiska

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.

About Henryk Tews

Co możesz przeczytać następne

Xdebug – konfiguracja, PHPStorm, debugowanie pluginów Magento
Kubernetes dla PHP developera – kubectl debugging, Deployment YAML, HPA, troubleshooting
Blackfire – instalacja w DDEV, profilowanie HTTP i CLI, asercje w CI/CD
  • Publikacje
  • O autorze
  • Kontakt

© 2026 Created by

GÓRA
Zarządzaj zgodą
Aby zapewnić jak najlepsze wrażenia, korzystamy z technologii, takich jak pliki cookie, do przechowywania i/lub uzyskiwania dostępu do informacji o urządzeniu. Zgoda na te technologie pozwoli nam przetwarzać dane, takie jak zachowanie podczas przeglądania lub unikalne identyfikatory na tej stronie. Brak wyrażenia zgody lub wycofanie zgody może niekorzystnie wpłynąć na niektóre cechy i funkcje.
Funkcjonalne Zawsze aktywne
Przechowywanie lub dostęp do danych technicznych jest ściśle konieczny do uzasadnionego celu umożliwienia korzystania z konkretnej usługi wyraźnie żądanej przez subskrybenta lub użytkownika, lub wyłącznie w celu przeprowadzenia transmisji komunikatu przez sieć łączności elektronicznej.
Preferencje
Przechowywanie lub dostęp techniczny jest niezbędny do uzasadnionego celu przechowywania preferencji, o które nie prosi subskrybent lub użytkownik.
Statystyka
Przechowywanie techniczne lub dostęp, który jest używany wyłącznie do celów statystycznych. Przechowywanie techniczne lub dostęp, który jest używany wyłącznie do anonimowych celów statystycznych. Bez wezwania do sądu, dobrowolnego podporządkowania się dostawcy usług internetowych lub dodatkowych zapisów od strony trzeciej, informacje przechowywane lub pobierane wyłącznie w tym celu zwykle nie mogą być wykorzystywane do identyfikacji użytkownika.
Marketing
Przechowywanie lub dostęp techniczny jest wymagany do tworzenia profili użytkowników w celu wysyłania reklam lub śledzenia użytkownika na stronie internetowej lub na kilku stronach internetowych w podobnych celach marketingowych.
  • Zarządzaj opcjami
  • Zarządzaj serwisami
  • Zarządzaj {vendor_count} dostawcami
  • Przeczytaj więcej o tych celach
Zobacz preferencje
  • {title}
  • {title}
  • {title}