Upgrade to Pro — share decks privately, control downloads, hide ads and more …

ddev Extended

ddev Extended

PHP Projekte auf Basis von DDEV erweitern und konfigurieren.

Christian Münch

November 11, 2020
Tweet

More Decks by Christian Münch

Other Decks in Technology

Transcript

  1. Christian Münch / @cmuench / muench.dev
    Christian Münch / @cmuench / muench.dev 1
    1

    View Slide

  2. Was ist ddev?
    https://ddev.readthedocs.io/en/stable/
    DDEV is an open source tool that makes it dead
    simple to get local PHP development environments
    up and running within minutes.
    2
    2
    Christian Münch / @cmuench / muench.dev
    Christian Münch / @cmuench / muench.dev

    View Slide

  3. Unter der Haube
    Docker
    docker-compose (also v2)
    go (kompiliert für Windows, Mac (auch M1), Linux)
    3
    3
    Christian Münch / @cmuench / muench.dev
    Christian Münch / @cmuench / muench.dev

    View Slide

  4. Gut
    abgehangen
    Github Actions
    Buildkite
    Circleci
    Christian Münch / @cmuench / muench.dev
    Christian Münch / @cmuench / muench.dev 4
    4

    View Slide

  5. Tests on
    physical
    hardware!
    https://twitter.com/rand
    yfay/status/147952388
    5179543557
    Christian Münch / @cmuench / muench.dev
    Christian Münch / @cmuench / muench.dev 5
    5

    View Slide

  6. Einfache Installation
    ddev ist nur ein einzelnes Binary!
    Es gibt auch Pakete
    Homebrew
    Chocolatey
    Arch Linux (AUR)
    Bash Script für andere Distributionen
    https://ddev.readthedocs.io/en/stable/#installation
    6
    6
    Christian Münch / @cmuench / muench.dev
    Christian Münch / @cmuench / muench.dev

    View Slide

  7. Du bekommst alles was du für die
    PHP Entwicklung brauchst!
    PHP 5.6, 7.0, 7.1, 7.2, 7.3, 7.4, 8.0, 8.1
    Mailcatcher (mailhog)
    MySQL 5.6, 5.7, 8.0 / MariaDB 10.2, 10.3 / Postgres (ab 1.19) ...
    Composer 1 / Composer 2
    Projekt-Typ spezifische Tools (n98-magerun FTW!)
    Blackfire, xhprof
    7
    7
    Christian Münch / @cmuench / muench.dev
    Christian Münch / @cmuench / muench.dev

    View Slide

  8. Projekt-Typen
    Backdrop
    Drupal 6 / 7 / 8 / 9
    Laravel
    Magento (OpenMage)
    Magento 2
    PHP (generisch)
    Shopware 6
    TYPO3
    Wordpress
    8
    8
    Christian Münch / @cmuench / muench.dev
    Christian Münch / @cmuench / muench.dev

    View Slide

  9. Getestet!
    Github Actions
    Buildkite
    Circleci
    Christian Münch / @cmuench / muench.dev
    Christian Münch / @cmuench / muench.dev 9
    9

    View Slide

  10. Tests auf
    physischer
    Hardware!
    https://twitter.com/rand
    yfay/status/147952388
    5179543557
    Christian Münch / @cmuench / muench.dev
    Christian Münch / @cmuench / muench.dev 10
    10

    View Slide

  11. Architektur
    ddev-router
    (Reverse Proxy)
    Project 1
    web db dba
    Project 2
    web db dba
    Custom Service 1
    z.B. Elasticsearch
    Custom Service 2
    z.b Redis
    ...
    ...
    11
    11
    Christian Münch / @cmuench / muench.dev
    Christian Münch / @cmuench / muench.dev

    View Slide

  12. Beispiel Projekt
    Ziel: PHP Anwendung mit Zugriff auf ElasticSearch
    12
    12
    Christian Münch / @cmuench / muench.dev
    Christian Münch / @cmuench / muench.dev

    View Slide

  13. Verzeichnis
    .

    ├── composer.json

    └── index.php

    13
    13
    Christian Münch / @cmuench / muench.dev
    Christian Münch / @cmuench / muench.dev

    View Slide

  14. Minimale composer.json
    {

    "name": "muench-dev/example-project",

    "description": "ddev Example Project",

    "type": "project",

    "license": "MIT",

    "authors": [

    {

    "name": "Christian Münch",

    "email": "[email protected]"

    }

    ],

    "require": {

    "elasticsearch/elasticsearch": "^7.9"

    }

    }

    14
    14

    View Slide

  15. index.php



    require_once 'vendor/autoload.php';


    phpinfo();



    15
    15
    Christian Münch / @cmuench / muench.dev
    Christian Münch / @cmuench / muench.dev

    View Slide

  16. Let's go!
    ddev config --project-name=example-project --php-version=7.4 --project-
    ddev start

    16
    16
    Christian Münch / @cmuench / muench.dev
    Christian Münch / @cmuench / muench.dev

    View Slide

  17. ❯ ddev start

    Starting example-project...

    Pushed mkcert rootca certs to ddev-global-cache/mkcert

    Running Command=ip address show dev docker0

    Building db

    Building web
    Creating ddev-example-project-db ... done

    Creating ddev-example-project-web ... done

    Creating ddev-example-project-dba ... done



    Creating ddev-router ... done



    Successfully started example-project

    Project can be reached at https://example-project.ddev.site https://127.0.0.1:32786

    17
    17
    Christian Münch / @cmuench / muench.dev
    Christian Münch / @cmuench / muench.dev

    View Slide

  18. PHP Projekt
    ddev composer install

    18
    18
    Christian Münch / @cmuench / muench.dev
    Christian Münch / @cmuench / muench.dev

    View Slide

  19. ❯ ddev composer install

    No lock file found. Updating dependencies instead of installing from lo
    Loading composer repositories with package information

    Updating dependencies

    Lock file operations: 5 installs, 0 updates, 0 removals

    - Locking elasticsearch/elasticsearch (v7.9.1)

    - Locking ezimuel/guzzlestreams (3.0.1)

    - Locking ezimuel/ringphp (1.1.2)

    - Locking psr/log (1.1.3)

    - Locking react/promise (v2.8.0)

    Writing lock file

    Installing dependencies from lock file (including require-dev)

    Package operations: 5 installs, 0 updates, 0 removals

    - Installing psr/log (1.1.3): Extracting archive

    - Installing react/promise (v2.8.0): Extracting archive

    - Installing ezimuel/guzzlestreams (3.0.1): Extracting archive

    - Installing ezimuel/ringphp (1.1.2): Extracting archive

    - Installing elasticsearch/elasticsearch (v7.9.1): Extracting archive

    1 package suggestions were added by new dependencies, use `composer sug
    Generating autoload files
    19
    19

    View Slide

  20. 20
    20

    View Slide

  21. 21
    21

    View Slide

  22. PHP Ausführen
    ddev exec php -v

    ddev . php -v # shortcut

    22
    22
    Christian Münch / @cmuench / muench.dev
    Christian Münch / @cmuench / muench.dev

    View Slide

  23. Mac Performance
    ddev config --nfs-mount-enabled=true

    23
    23
    Christian Münch / @cmuench / muench.dev
    Christian Münch / @cmuench / muench.dev

    View Slide

  24. NFS ist für jeden angeschaltet!
    24
    24
    Christian Münch / @cmuench / muench.dev
    Christian Münch / @cmuench / muench.dev

    View Slide

  25. Lösung
    anlegen einer lokalen Config
    Dateien /config.*.y*ml sind per .gitignore ausgeschlossen.
    25
    25
    Christian Münch / @cmuench / muench.dev
    Christian Münch / @cmuench / muench.dev

    View Slide

  26. Beispiel config.local.yaml
    nfs_mount_enabled: false

    26
    26
    Christian Münch / @cmuench / muench.dev
    Christian Münch / @cmuench / muench.dev

    View Slide

  27. Tipp: Bash Alias
    ddev-disable-nfs-mount-locally='echo "nfs_mount_enabled: false" >> .ddev/config.local.yaml'

    27
    27
    Christian Münch / @cmuench / muench.dev
    Christian Münch / @cmuench / muench.dev

    View Slide

  28. NFS Problematiken
    NFS muss installiert sein -> Sonst kommen komische
    Fehlermeldungen
    NFS Installation je Betriebssystem unter schiedlich
    Unterschiedliche Partitionierung
    Unterschiedliche Benutzer-IDs
    Keine Inotify Events (Watch-Tasks z.B. grunt, webpack, Magento
    Cache Clean)
    28
    28
    Christian Münch / @cmuench / muench.dev
    Christian Münch / @cmuench / muench.dev

    View Slide

  29. Inotify Proxy
    Diverse Lösungen erhältlich
    Bekanntes NPM Paket ist nur ein Wrapper für eine C-Lib und
    benötigt installierte Build-Tools.
    Kleiner, schneller, golang

    https://github.com/cmuench/inotify-proxy
    ddev Command:

    https://github.com/cmuench/inotify-proxy/wiki/ddev-inotify-
    Command
    29
    29
    Christian Münch / @cmuench / muench.dev
    Christian Münch / @cmuench / muench.dev

    View Slide

  30. Mutagen Sync
    Zwei-Wege-Synchronisation
    Vorteil: Performance da alle Dateien im Container liegen
    Nachteil: Redundante Datenhaltung (Es werden nicht alle
    Dateien synchonisiert)
    Seit ddev 1.18 verfügbar.
    Beste Integration von Mutgagen in einem Dev-Tool die mir
    bekannt ist.
    30
    30
    Christian Münch / @cmuench / muench.dev
    Christian Münch / @cmuench / muench.dev

    View Slide

  31. Mutagen aktivieren
    dev config --mutagen-enabled=true

    31
    31
    Christian Münch / @cmuench / muench.dev
    Christian Münch / @cmuench / muench.dev

    View Slide

  32. 32
    32

    View Slide

  33. Mutagen Finetuning
    Über Konfiguration: .ddev/mutagen/mutagen.yml
    33
    33
    Christian Münch / @cmuench / muench.dev
    Christian Münch / @cmuench / muench.dev

    View Slide

  34. #ddev-generated

    sync:

    defaults:

    mode: "two-way-resolved"

    stageMode: "neighboring"

    ignore:

    paths:

    - "/.git"

    - "/.tarballs"

    - "/.ddev/db_snapshots"

    - "/.ddev/.importdb*"

    - ".DS_Store"

    - ".idea"

    # - "/var"

    # vcs like .git can be ignored for safety, but then some

    # composer operations may fail if they use dev versions/git.

    # vcs: true

    symlink:

    mode: "posix-raw"

    34
    34

    View Slide

  35. Homeadditions
    .ddev/homeadditions
    ~/.ddev/homeadditions
    .

    └── homeadditions

    ├── bash_aliases.example

    └── .bashrc

    35
    35
    Christian Münch / @cmuench / muench.dev
    Christian Münch / @cmuench / muench.dev

    View Slide

  36. Beispiel .bashrc
    export PS1="\[\e[32m\][\[\e[m\]\[\e[36m\]\[\e[m\]\[\e[32m\]\h\[\e[m\]:\


    alias ls='ls --color=auto'

    alias ll='ls -la'

    alias cd-root="cd /var/www/html"

    36
    36
    Christian Münch / @cmuench / muench.dev
    Christian Münch / @cmuench / muench.dev

    View Slide

  37. 37
    37

    View Slide

  38. Verzeichnisse
    .

    ├── commands

    │ ├── db

    │ ├── host

    │ ├── solr

    │ └── web

    38
    38
    Christian Münch / @cmuench / muench.dev
    Christian Münch / @cmuench / muench.dev

    View Slide

  39. Host Commands
    Beispiel: ~/.ddev/commands/host/ide
    39
    39
    Christian Münch / @cmuench / muench.dev
    Christian Münch / @cmuench / muench.dev

    View Slide

  40. !/bin/bash



    #ddev-generated

    ## Description: Open project in IDE
    ## Usage: ide

    ## Example: "ddev ide"



    /opt/intellij-idea-ultimate-edition/bin/idea.sh ${DDEV_APPROOT} \

    > /dev/null 2>&1 &

    40
    40
    Christian Münch / @cmuench / muench.dev
    Christian Münch / @cmuench / muench.dev

    View Slide

  41. Container Commands
    41
    41
    Christian Münch / @cmuench / muench.dev
    Christian Münch / @cmuench / muench.dev

    View Slide

  42. Magento Kommando
    #!/bin/bash



    #ddev-generated

    ## Description: Run magento CLI inside the web container

    ## Usage: magento [flags] [args]

    ## Example: "ddev magento list" or "ddev magento maintenance:enable"

    ## ProjectTypes: magento2



    bin/magento "[email protected]"

    42
    42
    Christian Münch / @cmuench / muench.dev
    Christian Münch / @cmuench / muench.dev

    View Slide

  43. 43
    43

    View Slide

  44. docker-compose Konfiguration
    docker-compose up -d

    docker-compose -f docker-compose.yaml up -d



    docker-compose -f foo.yaml -f bar.yaml -f zoz.yaml up -d



    44
    44
    Christian Münch / @cmuench / muench.dev
    Christian Münch / @cmuench / muench.dev

    View Slide

  45. Verzeichnisstruktur
    .ddev

    ├── .ddev-docker-compose-base.yaml

    ├── .ddev-docker-compose-full.yaml

    ├── config.yaml

    ├── db-build

    │ └── Dockerfile.example

    └── web-build

    └── Dockerfile.example

    45
    45
    Christian Münch / @cmuench / muench.dev
    Christian Münch / @cmuench / muench.dev

    View Slide

  46. Beispiel ElasticSearch ...
    46
    46
    Christian Münch / @cmuench / muench.dev
    Christian Münch / @cmuench / muench.dev

    View Slide

  47. version: '3.6'

    services:

    elasticsearch:

    container_name: 'ddev-${DDEV_SITENAME}-elasticsearch'

    hostname: '${DDEV_SITENAME}-elasticsearch'

    image: elasticsearch:7.6.2

    ports:

    - '9200'

    - '9300'

    environment:

    - VIRTUAL_HOST=elasticsearch-$DDEV_HOSTNAME

    - HTTP_EXPOSE=9200

    - discovery.type=single-node

    labels:

    com.ddev.site-name: '${DDEV_SITENAME}'

    com.ddev.approot: $DDEV_APPROOT

    volumes:

    - 'elasticsearch:/usr/share/elasticsearch/data'

    47
    47

    View Slide

  48. version: '3.6'

    services:

    elasticsearch:

    ...



    web:

    depends_on:

    - elasticsearch

    links:

    - 'elasticsearch:elasticsearch'

    volumes:

    elasticsearch:

    name: '${DDEV_SITENAME}-elasticsearch'

    48
    48
    Christian Münch / @cmuench / muench.dev
    Christian Münch / @cmuench / muench.dev

    View Slide

  49. ❯ ddev start

    Starting example-project...

    Running Command=ip address show dev docker0

    Creating volume "example-project-elasticsearch" with default driver

    Building db

    Building web

    Creating ddev-example-project-elasticsearch ... done

    Recreating ddev-example-project-db ... done

    Recreating ddev-example-project-dba ... done

    Recreating ddev-example-project-web ... done

    49
    49
    Christian Münch / @cmuench / muench.dev
    Christian Münch / @cmuench / muench.dev

    View Slide

  50. ddev describe
    $> ddev describe

    ...



    Other Services

    --------------

    MailHog (https): https://example-project.ddev.site:8026

    MailHog: http://example-project.ddev.site:8025

    phpMyAdmin (https): https://example-project.ddev.site:8037

    phpMyAdmin: http://example-project.ddev.site:8036

    elasticsearch: http://example-project.ddev.site:9200



    ...

    50
    50
    Christian Münch / @cmuench / muench.dev
    Christian Münch / @cmuench / muench.dev

    View Slide

  51. ❯ ddev exec "curl http://elasticsearch:9200"

    {

    "name" : "example-project-elasticsearch",

    "cluster_name" : "docker-cluster",

    "cluster_uuid" : "fX7_HMTxRiC_1KL4nbTqAg",

    "version" : {

    "number" : "7.6.2",

    "build_flavor" : "default",

    "build_type" : "docker",

    "build_hash" : "ef48eb35cf30adf4db14086e8aabd07ef6fb113f",

    "build_date" : "2020-03-26T06:34:37.794943Z",

    "build_snapshot" : false,

    "lucene_version" : "8.4.0",

    "minimum_wire_compatibility_version" : "6.8.0",

    "minimum_index_compatibility_version" : "6.0.0-beta1"

    },

    "tagline" : "You Know, for Search"

    }

    51
    51
    Christian Münch / @cmuench / muench.dev
    Christian Münch / @cmuench / muench.dev

    View Slide




  52. require_once 'vendor/autoload.php';



    use Elasticsearch\ClientBuilder;



    $params = [

    'hosts' => [

    'elasticsearch:9200'

    ]

    ];



    try {

    $client = ClientBuilder::fromConfig($params);

    $client->ping();

    echo "ElasticSearch connection established";

    } catch (Exception $exception) {

    echo $exception->getMessage();

    exit(1);

    }
    52
    52
    Christian Münch / @cmuench / muench.dev
    Christian Münch / @cmuench / muench.dev

    View Slide

  53. Christian Münch / @cmuench / muench.dev
    Christian Münch / @cmuench / muench.dev 53
    53

    View Slide

  54. 54
    54

    View Slide

  55. Command Hooks
    pre-
    post-
    Beispiel:
    pre-start

    post-import-db

    post-composer
    55
    55
    Christian Münch / @cmuench / muench.dev
    Christian Münch / @cmuench / muench.dev

    View Slide

  56. Tasks
    exec -> Im Container (genormte Umgebung)
    exec_host -> Auf dem Host (Achtung!)
    composer -> Führt ein Composer Kommando aus
    56
    56
    Christian Münch / @cmuench / muench.dev
    Christian Münch / @cmuench / muench.dev

    View Slide

  57. config.yaml Anpassung
    hooks:

    post-start:

    - composer: install

    57
    57
    Christian Münch / @cmuench / muench.dev
    Christian Münch / @cmuench / muench.dev

    View Slide

  58. ❯ ddev start

    Starting example-project...

    ...



    Executing post-start hook...

    === Running task: Composer command 'install' in web container, output below

    Installing dependencies from lock file (including require-dev)

    Verifying lock file contents can be installed on current platform.

    Nothing to install, update or remove

    Generating autoload files



    ...

    Successfully started example-project

    58
    58

    View Slide

  59. Lokale config.yaml
    Überschreibungen
    .ddev/config..yaml
    Nicht im Team geteilt da über .gitignore
    ausgeschlossen.
    59
    59
    Christian Münch / @cmuench / muench.dev
    Christian Münch / @cmuench / muench.dev

    View Slide

  60. Beispiel: fester DB Port
    echo "host_db_port: 33002" > .ddev/config.local.yaml

    60
    60
    Christian Münch / @cmuench / muench.dev
    Christian Münch / @cmuench / muench.dev

    View Slide

  61. Shell Scripte
    hooks:

    post-start:

    - exec: bash .ddev/step1_install_special_tools.sh

    - exec: bash .ddev/step2_setup_myapplication.sh



    # other container

    - exec: bash .ddev/do_some_db_stuff.sh

    service: db

    - exec: bin/elasticsearch-plugin install analysis-icu

    service: elasticsearch

    61
    61
    Christian Münch / @cmuench / muench.dev
    Christian Münch / @cmuench / muench.dev

    View Slide

  62. === Running task: Exec command 'bin/elasticsearch-plugin

    install analysis-icu' in container/service 'elasticsearch', output below

    -> Installing analysis-icu

    -> Downloading analysis-icu from elastic

    [=================================================] 100%??

    -> Installed analysis-icu



    Successfully started example-project

    62
    62
    Christian Münch / @cmuench / muench.dev
    Christian Münch / @cmuench / muench.dev

    View Slide

  63. Troubleshooting
    63
    63

    View Slide

  64. Typisches Problem: Router gibt
    Fehler aus
    Lösung: Projekte beim herunterfahren des Rechners
    mit ddev stop -a alle Projekte stoppen.
    64
    64
    Christian Münch / @cmuench / muench.dev
    Christian Münch / @cmuench / muench.dev

    View Slide

  65. PHP Memory Limit / Composer
    ddev ssh

    COMPOSER_MEMORY_LIMIT=-1 php -d memory_limit=-1 \

    /usr/local/bin/composer require magento/extension-b2b

    65
    65
    Christian Münch / @cmuench / muench.dev
    Christian Münch / @cmuench / muench.dev

    View Slide

  66. Linux Systemd
    Automatisch Projekte mit Docker Service zusammen
    stoppen.
    sudo systemctl edit docker.service

    Im Editor folgendes Eintragen:
    [Service]

    ExecStop=sudo -u cmuench /usr/bin/ddev stop -a

    (username durch eigenen ersetzen)
    66
    66
    Christian Münch / @cmuench / muench.dev
    Christian Münch / @cmuench / muench.dev

    View Slide

  67. Vielen Dank!
    Fragen oder Livedemo?
    67
    67
    Christian Münch / @cmuench / muench.dev
    Christian Münch / @cmuench / muench.dev

    View Slide

  68. Appendinx
    68
    68
    Christian Münch / @cmuench / muench.dev
    Christian Münch / @cmuench / muench.dev

    View Slide

  69. Magento 2 Demo Projekt
    https://github.com/netz98/ddev-magento-demo 69
    69

    View Slide

  70. Wordpress installieren
    ddev config --project-type=wordpress

    ddev start

    ddev exec wp core download

    ddev exec 'wp core install --url=$DDEV_PRIMARY_URL

    --title="New WordPress" --admin_user=admin

    [email protected]

    --prompt=admin_password'



    # frontend

    ddev launch



    # admin

    ddev launch wp-admin/

    70
    70
    Christian Münch / @cmuench / muench.dev
    Christian Münch / @cmuench / muench.dev

    View Slide

  71. Magento 2 installieren
    https://ddev.readthedocs.io/en/stable/users/cli-
    usage/#magento-2-quickstart
    ddev start

    ddev composer create

    --repository=https://repo.magento.com/ magento/project-community-edition

    ddev ssh

    bin/magento setup:install

    --base-url=https://ddev-magento2.ddev.site/

    --cleanup-database --db-host=db --db-name=db --db-user=db --db-password=db

    --elasticsearch-host=elasticsearch --admin-firstname=Magento --admin-lastname=User [email protected]

    --admin-user=admin --admin-password=admin123 --language=en_US

    bin/magento deploy:mode:set developer

    bin/magento setup:di:compile

    bin/magento cache:flush
    71
    71
    Christian Münch / @cmuench / muench.dev
    Christian Münch / @cmuench / muench.dev

    View Slide