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. 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
  2. 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
  3. Gut abgehangen Github Actions Buildkite Circleci Christian Münch / @cmuench

    / muench.dev Christian Münch / @cmuench / muench.dev 4 4
  4. 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
  5. 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
  6. 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
  7. Getestet! Github Actions Buildkite Circleci Christian Münch / @cmuench /

    muench.dev Christian Münch / @cmuench / muench.dev 9 9
  8. 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
  9. Beispiel Projekt Ziel: PHP Anwendung mit Zugriff auf ElasticSearch 12

    12 Christian Münch / @cmuench / muench.dev Christian Münch / @cmuench / muench.dev
  10. Verzeichnis . ├── composer.json └── index.php 13 13 Christian Münch

    / @cmuench / muench.dev Christian Münch / @cmuench / muench.dev
  11. 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
  12. index.php <?php require_once 'vendor/autoload.php'; phpinfo(); 15 15 Christian Münch /

    @cmuench / muench.dev Christian Münch / @cmuench / muench.dev
  13. 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
  14. ❯ 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
  15. PHP Projekt ddev composer install 18 18 Christian Münch /

    @cmuench / muench.dev Christian Münch / @cmuench / muench.dev
  16. ❯ 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
  17. 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
  18. Mac Performance ddev config --nfs-mount-enabled=true 23 23 Christian Münch /

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

    @cmuench / muench.dev Christian Münch / @cmuench / muench.dev
  20. 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
  21. 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
  22. 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
  23. 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
  24. 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
  25. Mutagen aktivieren dev config --mutagen-enabled=true 31 31 Christian Münch /

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

    @cmuench / muench.dev Christian Münch / @cmuench / muench.dev
  27. #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
  28. Homeadditions .ddev/homeadditions ~/.ddev/homeadditions . └── homeadditions ├── bash_aliases.example └── .bashrc

    35 35 Christian Münch / @cmuench / muench.dev Christian Münch / @cmuench / muench.dev
  29. 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
  30. Verzeichnisse . ├── commands │ ├── db │ ├── host

    │ ├── solr │ └── web 38 38 Christian Münch / @cmuench / muench.dev Christian Münch / @cmuench / muench.dev
  31. Host Commands Beispiel: ~/.ddev/commands/host/ide 39 39 Christian Münch / @cmuench

    / muench.dev Christian Münch / @cmuench / muench.dev
  32. !/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
  33. 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 "$@" 42 42 Christian Münch / @cmuench / muench.dev Christian Münch / @cmuench / muench.dev
  34. 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
  35. 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
  36. Beispiel ElasticSearch ... 46 46 Christian Münch / @cmuench /

    muench.dev Christian Münch / @cmuench / muench.dev
  37. 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
  38. 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
  39. ❯ 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
  40. 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
  41. ❯ 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
  42. <?php 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
  43. 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
  44. 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
  45. config.yaml Anpassung hooks: post-start: - composer: install 57 57 Christian

    Münch / @cmuench / muench.dev Christian Münch / @cmuench / muench.dev
  46. ❯ 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
  47. Lokale config.yaml Überschreibungen .ddev/config.<irgendwas>.yaml Nicht im Team geteilt da über

    .gitignore ausgeschlossen. 59 59 Christian Münch / @cmuench / muench.dev Christian Münch / @cmuench / muench.dev
  48. 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
  49. 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
  50. === 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
  51. 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
  52. 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
  53. 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
  54. Vielen Dank! Fragen oder Livedemo? 67 67 Christian Münch /

    @cmuench / muench.dev Christian Münch / @cmuench / muench.dev
  55. 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
  56. 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