From a66f4e6775f0521587ebb4e4d3845a9d42b5fc4b Mon Sep 17 00:00:00 2001 From: Randy Fay Date: Fri, 8 Jan 2021 14:06:13 -0700 Subject: [PATCH] Spellcheck docs, fixes #2365 (#2735) --- .github/workflows/docscheck.yml | 34 ++ .github/workflows/macos_github_vm_setup.sh | 58 --- .github/workflows/multiplesites.sh | 59 --- .github/workflows/nginx-tmpl.yml | 37 -- .github/workflows/testsite/index.php | 4 - .gitignore | 8 +- .spellcheck.yml | 21 + .spellcheckwordlist.txt | 471 ++++++++++++++++++ Makefile | 13 +- .../developers/buildkite-testmachine-setup.md | 2 +- docs/developers/release-checklist.md | 8 +- docs/index.md | 8 +- docs/users/alternate-uses.md | 14 +- docs/users/cli-usage.md | 23 +- docs/users/developer-tools.md | 6 +- docs/users/docker_installation.md | 2 +- docs/users/extend/config_yaml.md | 16 +- docs/users/extend/custom-commands.md | 6 +- docs/users/performance.md | 4 +- docs/users/shell-completion.md | 4 +- docs/users/step-debugging.md | 14 +- docs/users/troubleshooting.md | 14 +- docs/users/uninstall.md | 2 +- 23 files changed, 602 insertions(+), 226 deletions(-) create mode 100644 .github/workflows/docscheck.yml delete mode 100755 .github/workflows/macos_github_vm_setup.sh delete mode 100755 .github/workflows/multiplesites.sh delete mode 100644 .github/workflows/nginx-tmpl.yml delete mode 100644 .github/workflows/testsite/index.php create mode 100644 .spellcheck.yml create mode 100644 .spellcheckwordlist.txt diff --git a/.github/workflows/docscheck.yml b/.github/workflows/docscheck.yml new file mode 100644 index 00000000000..fdf755e20e0 --- /dev/null +++ b/.github/workflows/docscheck.yml @@ -0,0 +1,34 @@ +name: Check docs +on: + push: + branches: + - master + pull_request: + paths: + - "docs/**" + - "index.md" + - ".spellcheckwordlist.txt" + - ".spellcheck.yml" + - ".markdownlintrc" + - "mkdocs.yml" + +jobs: + build: + name: Docs check (spellcheck, markdownlint) + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@master + - uses: rojopolis/spellcheck-github-actions@0.8.0 + name: Spellcheck + - name: Run markdownlint on docs + uses: docker://avtodev/markdown-lint:v1 + with: + config: '.markdownlintrc' + args: '*.md docs' +# - name: Debugging with tmate +# uses: mxschmitt/action-tmate@v3.1 + - name: Test mkdocs + run: | + sudo pip3 install setuptools + sudo pip3 install mkdocs==0.17.5 + mkdocs -q build -d /tmp/mkdocsbuild diff --git a/.github/workflows/macos_github_vm_setup.sh b/.github/workflows/macos_github_vm_setup.sh deleted file mode 100755 index 300c575f29f..00000000000 --- a/.github/workflows/macos_github_vm_setup.sh +++ /dev/null @@ -1,58 +0,0 @@ -#!/usr/bin/env bash - -set -o errexit -set -x - -# Docker desktop after 31259 refuses to install using root -DOCKER_URL=https://download.docker.com/mac/stable/31259/Docker.dmg -curl -O -sSL $DOCKER_URL -open -W Docker.dmg && cp -r /Volumes/Docker/Docker.app /Applications - -export HOMEBREW_NO_AUTO_UPDATE=1 -export HOMEBREW_NO_INSTALL_CLEANUP=1 - -# Get docker in first so we can install it and work on other things -sudo /Applications/Docker.app/Contents/MacOS/Docker --quit-after-install --unattended -nohup /Applications/Docker.app/Contents/MacOS/Docker --unattended & - -brew cask install ngrok >/dev/null -brew tap drud/ddev >/dev/null -brew unlink python@2 >/dev/null || true - -brew install mysql-client zip makensis jq expect coreutils golang ddev mkcert osslsigncode ghr gnu-getopt libgsf glib pcre bats-core >/dev/null || true -brew link mysql-client zip makensis jq expect coreutils golang ddev mkcert osslsigncode ghr gnu-getopt libgsf glib pcre >/dev/null - -brew link --force mysql-client >/dev/null - -# Get the Plugins for NSIS -curl -fsSL -o /tmp/EnVar-Plugin.zip https://github.com/GsNSIS/EnVar/releases/latest/download/EnVar-Plugin.zip && sudo unzip -o -d /usr/local/share/nsis /tmp/EnVar-Plugin.zip -curl -fsSL -o /tmp/INetC.zip https://github.com/DigitalMediaServer/NSIS-INetC-plugin/releases/latest/download/INetC.zip && sudo unzip -o -d /usr/local/share/nsis/Plugins /tmp/INetC.zip - -# homebrew sometimes removes /usr/local/etc/my.cnf.d -sudo mkdir -p /usr/local/etc/my.cnf.d - -mkcert -install - -pip3 install -q yq - -sudo bash -c "cat </etc/exports -${HOME} -alldirs -mapall=$(id -u):$(id -g) localhost -/private/var -alldirs -mapall=$(id -u):$(id -g) localhost -EOF" - -LINE="nfs.server.mount.require_resv_port = 0" -FILE=/etc/nfs.conf -grep -qF -- "$LINE" "$FILE" || ( sudo echo "$LINE" | sudo tee -a $FILE > /dev/null ) - -sudo nfsd enable && sudo nfsd restart - -timeout -v 10m bash -c 'while ! docker ps 2>/dev/null ; do - sleep 5 - echo "Waiting for docker to come up: $(date)" -done' - -#if [ ! -z "${DOCKERHUB_PULL_USERNAME:-}" ]; then -# set +x -# echo "${DOCKERHUB_PULL_PASSWORD:-}" | docker login --username "${DOCKERHUB_PULL_USERNAME}" --password-stdin -# set -x -#fi diff --git a/.github/workflows/multiplesites.sh b/.github/workflows/multiplesites.sh deleted file mode 100755 index 874155debdf..00000000000 --- a/.github/workflows/multiplesites.sh +++ /dev/null @@ -1,59 +0,0 @@ -#!/bin/bash - -# Attempt to recreate multiple-site-creation failure from -# https://github.com/drud/ddev/issues/2648 -# Copied from https://gist.github.com/rfay/378a377aa4f695799ee2b36e2847c2e6 - -# This is NOT INTENDED to live on, it's really just for a little while in v1.16.2-alpha* -# and then should be removed - -set -eu -o pipefail -sitedir=~/tmp/testsites -mkdir -p ${sitedir} -logdir=~/tmp/testlogs -mkdir -p ${logdir} -sites="" - -function cleanup { - printf "\n\nClean up with:\n" - printf "ddev delete -Oy ${sites} && rm -rf ${sitedir} ${logdir}\n" -} -trap cleanup EXIT - -function captureState { - printf "Capturing state after failure on ${site} ( https://${hostname} )\n" - ddev list > ${logdir}/ddevlist.txt - docker ps -a > ${logdir}/dockerps.txt - docker inspect ddev-${site}-web > ${logdir}/webinspect.txt - docker inspect ddev-router > ${logdir}/routerinspect.txt - curl -s --unix-socket /var/run/docker.sock "http://foo/containers/json" >${logdir}/docker_api_containers.txt - docker logs ddev-router > ${logdir}/routerLogs.txt 2>&1 - docker cp ddev-router:/etc/nginx/conf.d/default.conf ${logdir} - docker cp ddev-router:/gen-cert-and-nginx-config.sh ${logdir} - ddev logs > ${logdir}/weblogs.txt - tarball=~/tmp/testfailurelogs.$(date '+%Y%m%d%H%M%S').tgz - tar -czf ${tarball} ${logdir} ${dir} ~/.ddev/.*.yaml ~/.ddev/global_config.yaml - echo "Full state tarball at ${tarball}" -} - -uname -a -ddev --version -docker --version -docker-compose --version - -#ddev poweroff -for i in {1..5}; do - site=testsite-${i} - sites="$sites $site" - printf "\n\nStarting ${site}...\n" - hostname=${site}.ddev.site - dir=${sitedir}/${site} - mkdir -p ${dir} && pushd ${dir} >/dev/null - ddev config --project-type=php - echo $site >index.html - ddev start - curl --fail -slL https://${hostname} || ( printf "\ncurl of https://${hostname} failed\n" && captureState && exit $i ) - popd >/dev/null -done - -echo "All project starts succeeded." diff --git a/.github/workflows/nginx-tmpl.yml b/.github/workflows/nginx-tmpl.yml deleted file mode 100644 index 267232cc21d..00000000000 --- a/.github/workflows/nginx-tmpl.yml +++ /dev/null @@ -1,37 +0,0 @@ -# This temporary test of nginx.tmpl is here to demonstrate that -# ddev (ddev-router) can now run successfully on github actions linux -on: - push: - branches: - - master - pull_request: - -name: test ddev-router's nginx.tmpl generation - -jobs: - test: - defaults: - run: - shell: bash - runs-on: ${{ matrix.os }} - strategy: - fail-fast: false - matrix: - os: [ ubuntu-20.04 ] - steps: - - uses: actions/checkout@v1 - - name: Set environment variables - run: printf "OS=$(go env GOOS)\nARCH=$(go env GOARCH)\n" >> $GITHUB_ENV && cat $GITHUB_ENV - - name: macOS setup - if: env.OS == 'darwin' - run: .github/workflows/macos_github_vm_setup.sh - - run: make - - run: sudo cp .gotmp/bin/${OS}_${ARCH}/ddev /usr/local/bin - - run: sudo curl --fail -lL -s -o /usr/local/bin/mkcert https://github.com/drud/mkcert/releases/download/v1.4.6/mkcert-v1.4.6-${OS}-${ARCH} && sudo chmod +x /usr/local/bin/mkcert && mkcert -install - - run: ddev config global --instrumentation-opt-in=false --omit-containers=dba,ddev-ssh-agent - - run: cd .github/workflows/testsite && ddev config --project-type=php && ddev start - - run: docker inspect --format "{{json .State.Health }}" ddev-router | jq -r .Log[-1].Output | grep "ddev-router is healthy with 2 upstreams" - # - uses: mxschmitt/action-tmate@v3 - - run: curl --fail -s https://testsite.ddev.site | grep "This is testsite" || curl https://testsite.ddev.site - - run: .github/workflows/multiplesites.sh - diff --git a/.github/workflows/testsite/index.php b/.github/workflows/testsite/index.php deleted file mode 100644 index 28a21a2aa61..00000000000 --- a/.github/workflows/testsite/index.php +++ /dev/null @@ -1,4 +0,0 @@ -/dev/null 2>&1 ; then \ + $$CMD; \ + else \ + echo "Not running pyspelling because it's not installed"; \ + fi + darwin_amd64_signed: $(GOTMP)/bin/darwin_amd64/ddev @if [ -z "$(DDEV_MACOS_SIGNING_PASSWORD)" ] ; then echo "Skipping signing ddev for macOS, no DDEV_MACOS_SIGNING_PASSWORD provided"; else echo "Signing $< ..."; \ set -o errexit -o pipefail; \ diff --git a/docs/developers/buildkite-testmachine-setup.md b/docs/developers/buildkite-testmachine-setup.md index 3b18764fdd4..b68aeaf38b0 100644 --- a/docs/developers/buildkite-testmachine-setup.md +++ b/docs/developers/buildkite-testmachine-setup.md @@ -6,7 +6,7 @@ We are using [Buildkite](https://buildkite.com/drud) for Windows and macOS testi 1. Create the user "testbot" on the machine. The password should be the password of testbot@drud.com (available in 1password) 2. In admin PowerShell, `Set-ExecutionPolicy -Scope "CurrentUser" -ExecutionPolicy "RemoteSigned"` -3. In admin Powershell, download and run [windows_buildkite_start.ps1](scripts/windows_buildkite_start.ps1) (Use `curl -O windows_buildkite_start.ps1`) +3. In admin PowerShell, download and run [windows_buildkite_start.ps1](scripts/windows_buildkite_start.ps1) (Use `curl -O windows_buildkite_start.ps1`) 4. After restart, in administrative git-bash window, `Rename-Computer -1` and then `export BUILDKITE_AGENT_TOKEN=` 5. Now download and run [windows_buildkite-testmachine_setup.sh](scripts/windows_buildkite_setup.sh) 6. Launch Docker. It may require you to take further actions. diff --git a/docs/developers/release-checklist.md b/docs/developers/release-checklist.md index bf896dc1e36..eb08686ebb6 100644 --- a/docs/developers/release-checklist.md +++ b/docs/developers/release-checklist.md @@ -8,7 +8,7 @@ The following environment variables must be added to the **org context** named [ * CHOCOLATEY_API_KEY: API key for chocolatey. -* DDEV_GITHUB_TOKEN: The github token that gives access to create releases and push to the homebrew repositories. +* DDEV_GITHUB_TOKEN: The GitHub token that gives access to create releases and push to the homebrew repositories. * DDEV_MACOS_APP_PASSWORD: The password used for notarization, see [signing_tools](https://github.com/drud/signing_tools) @@ -16,9 +16,9 @@ The following environment variables must be added to the **org context** named [ * DDEV_WINDOWS_SIGNING_PASSWORD: The windows signing password. -* HOMEBREW_EDGE_REPOSITORY: The name of the github repo used for the edge channel on homebrew, drud/homebrew-ddev-ege +* HOMEBREW_EDGE_REPOSITORY: The name of the GitHub repo used for the edge channel on homebrew, drud/homebrew-ddev-ege -* HOMEBREW_STABLE_REPOSITORY: The name of the github repo used for the stable channel on homebrew/ drud/homebrew-ddev +* HOMEBREW_STABLE_REPOSITORY: The name of the GitHub repo used for the stable channel on homebrew/ drud/homebrew-ddev * SegmentKey: The key that enabled the Segment reporting @@ -26,7 +26,7 @@ The following environment variables must be added to the **org context** named [ 1. Create provisional tagged images. `git fetch upstream && git checkout upstream/master && cd containers` and `for item in *; do pushd $item; make push VERSION= DOCKER_ARGS=--no-cache ; popd; done` 2. Update the default container versions in `pkg/version/version.go` and create a pull request -3. Create a release for the new version using the github UI. It should be "prerelease" if it's only an edge release. +3. Create a release for the new version using the GitHub UI. It should be "prerelease" if it's only an edge release. 4. Add the commit list (`git log vXXX..vYYY --oneline --decorate=no`) to the release page. 5. Update the release page with full details about the current release 6. Verify that homebrew (linux and macOS) and Chocolatey and AUR are working correctly with the right versions diff --git a/docs/index.md b/docs/index.md index 548d69b9316..a20bd69e036 100644 --- a/docs/index.md +++ b/docs/index.md @@ -29,7 +29,7 @@ _When upgrading, please run `ddev poweroff` and check the [release notes](https: Docker and docker-compose are required before anything will work with DDEV. This is pretty easy on most environments; see the [docker_installation](users/docker_installation.md) page to help sort out the details, especially on Windows and Linux. -### Homebrew/Linuxbrew - macOS/Linux +### Homebrew - macOS/Linux For macOS and Linux users, we recommend installing and upgrading via [Homebrew](https://brew.sh/) (macOS) or [Homebrew on Linux](https://docs.brew.sh/Homebrew-on-Linux) (Linux): @@ -79,7 +79,7 @@ We'll walk through these in more detail. You may prefer other techniques of inst 14. Check that docker is working inside Ubuntu (or your distro): `docker ps` 15. Optional: If you prefer to use the *Windows* ddev instead of working inside WSL2, install it with `choco install -y ddev`. The Windows ddev works fine with the WSL2-based Docker engine. 16. Open the WSL2 terminal, for example `Ubuntu` from the Windows start menu. -17. Install Linuxbrew: `/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install.sh)"` (See [brew.sh](brew.sh).) +17. Install Homebrew: `/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install.sh)"` (See [brew.sh](brew.sh).) 18. Add brew to your path as prompted, for example, `echo 'eval $(/home/linuxbrew/.linuxbrew/bin/brew shellenv)' >> ~/.profile && source ~/.profile` 19. `brew install gcc && brew tap drud/ddev && brew install ddev` 20. `sudo apt-get update && sudo apt-get install -y xdg-utils` to install the xdg-utils package that allows `ddev launch` to work. @@ -107,7 +107,7 @@ curl -LO https://raw.githubusercontent.com/drud/ddev/master/scripts/install_ddev The installation script can also take a version argument in order to install a specific version or a prerelease version. For example, ``` -curl -LO https://raw.githubusercontent.com/drud/ddev/master/scripts/install_ddev.sh && bash install_ddev.sh v1.16.0-alpha5 +curl -LO https://raw.githubusercontent.com/drud/ddev/master/scripts/install_ddev.sh && bash install_ddev.sh v1.17.0-alpha2 ``` Later, to upgrade DDEV to the latest version, just run `ddev poweroff` and run the script again. @@ -124,7 +124,7 @@ You can also easily perform the installation or upgrade manually if preferred. D ### Installation via package managers - Linux -The preferred Linux package manager is [Linuxbrew](http://linuxbrew.sh/) : `brew tap drud/ddev && brew install ddev` +The preferred Linux package manager is [Homebrew](http://brew.sh/) : `brew tap drud/ddev && brew install ddev` We also currently maintain a package on [Arch Linux (AUR)](https://aur.archlinux.org/packages/ddev-bin/) diff --git a/docs/users/alternate-uses.md b/docs/users/alternate-uses.md index 2c13129c747..df17921afd2 100644 --- a/docs/users/alternate-uses.md +++ b/docs/users/alternate-uses.md @@ -2,21 +2,21 @@ ### Continuous Integration (CI) for a project -Although it has not a primary goal of DDEV-Local, a number of people have found it easy to use DDEV-Local on a CI system like Github Actions or TravisCI or CircleCI to test out their projects. Instead of setting up a hosting environment for testing, they just start the project using DDEV and run their tests. +Although it has not a primary goal of DDEV-Local, a number of people have found it easy to use DDEV-Local on a CI system like GitHub Actions or TravisCI or CircleCI to test out their projects. Instead of setting up a hosting environment for testing, they just start the project using DDEV and run their tests. -Examples of this approach are shown in [Codeception tests in Travis CI with DDEV and Selenium](https://dev.to/tomasnorre/codeception-tests-in-travis-ci-with-ddev-and-selenium-1607) and [Github Action Setup Ddev](https://github.com/jonaseberle/github-action-setup-ddev) +Examples of this approach are shown in [Codeception tests in Travis CI with DDEV and Selenium](https://dev.to/tomasnorre/codeception-tests-in-travis-ci-with-ddev-and-selenium-1607) and [GitHub Action Setup Ddev](https://github.com/jonaseberle/github-action-setup-ddev) ### Integration of DDEV-Local Docker Images Into Other Projects -It is possible to use DDEV-Local Docker images outside the context of the DDEV-Local environment. People have used the ddev-webserver image for running tests in PHPStorm, for example. +It is possible to use DDEV-Local Docker images outside the context of the DDEV-Local environment. People have used the ddev-webserver image for running tests in PhpStorm, for example. -### Casual Project Webosting on the Internet (including Let's Encrypt) +### Casual Project Webhosting on the Internet (including Let's Encrypt) An experimental feature of DDEV-local is simplified small-project hosting on the internet. One can run DDEV-Local on an internet server and point their DNS to it and use it as a regular (though limited) hosting environment. This may be completely appropriate for small or abandoned sites that have special requirements like old versions of PHP that aren't supported elsewhere. -**Note that this is no replacement for a scaleable managed hosting offering like [DDEV-Live](https://www.ddev.com/ddev-live/) or other similar services. It's unknown how much traffic it can handle in a given environment. And it's EXPERIMENTAL. And it will never replace managed hosting.** +**Note that this is no replacement for a scalable managed hosting offering like [DDEV-Live](https://www.ddev.com/ddev-live/) or other similar services. It's unknown how much traffic it can handle in a given environment. And it's EXPERIMENTAL. And it will never replace managed hosting.** 1. Install DDEV-Local on a regular Linux server that is directly connected to the Internet. You're responsible for your firewall and maintenance of the server, of course. 2. On Debian/Ubuntu, you can set up a simple firewall with `ufw allow 80 && ufw allow 443 && ufw allow 22 && ufw enable` @@ -24,11 +24,11 @@ This may be completely appropriate for small or abandoned sites that have specia 4. Before proceeding, your system and your project must be accessible on the internet on port 80 and your project DNS name (myproject.example.com) must resolve to the appropriate server. 5. Configure your project with `ddev config` 6. Import your database and files using `ddev import-db` and `ddev import-files`. -7. Use `ddev config global --router-bind-all-interfaces --omit-containers=dba,ddev-ssh-agent --use-hardened-images --use-letsencrypt --letsencrypt-email=you@example.com` to tell DDEV to listen to all network interfaces (not just localhost), not provide PHPMyAdmin or ddev-ssh-agent, use the hardened images, and turn on Let's Encrypt. +7. Use `ddev config global --router-bind-all-interfaces --omit-containers=dba,ddev-ssh-agent --use-hardened-images --use-letsencrypt --letsencrypt-email=you@example.com` to tell DDEV to listen to all network interfaces (not just localhost), not provide phpMyAdmin or ddev-ssh-agent, use the hardened images, and turn on Let's Encrypt. 8. Create your DDEV-Local project as you normally would, but `ddev config --additional-fqdns=Supported file types +#### Supported file types Database import supports the following file types: @@ -581,7 +581,7 @@ Successfully imported database for drupal8 ``` -

Non-interactive usage

+#### Non-interactive usage If you want to use import-db without answering prompts, you can use the `--src` flag to provide the path to the import asset. If you are importing an archive, and wish to specify the path within the archive to extract, you can use the `--extract-path` flag in conjunction with the `--src` flag. Examples: @@ -591,7 +591,7 @@ gzip -dc /tmp/mydb.sql.gz | ddev import-db ddev import-db Database import notes +#### Database import notes * Importing from a dumpfile via stdin will not show progress because there's no way the import can know how far along through the import it has progressed. * Use `ddev import-db --target-db ` to import to a non-default database (other than the default "db" database). This will create the database if it doesn't exist already. @@ -627,7 +627,7 @@ Import path: Successfully imported files for drupal8 ``` -

Supported file types

+#### Supported archive types for file import Static asset import supports the following file types: @@ -649,7 +649,8 @@ Successfully imported files for drupal8 ``` -

Non-interactive usage

+#### Non-interactive usage for ddev import-files + If you want to use import-files without answering prompts, you can use the `--src` flag to provide the path to the import asset. If you are importing an archive, and wish to specify the path within the archive to extract, you can use the `--extract-path` flag in conjunction with the `--src` flag. Example: `ddev import-files --src=/tmp/files.tgz` diff --git a/docs/users/developer-tools.md b/docs/users/developer-tools.md index 210ece3fa8f..2386977986d 100755 --- a/docs/users/developer-tools.md +++ b/docs/users/developer-tools.md @@ -38,7 +38,7 @@ To execute a fully-featured `composer create-project` command, you can execute t `ddev exec composer create-project ...` -Note: if you run `ddev composer global require`, (or run `composer global require` inside the web container) the global packages will be installed in the in-container user's home directory ( ~/.composer) and will disappear on the next container restart, requiring rerun of the command. You may need an additional step of synchronizing created composer configuration and installed packages with the DDev's [homeadditions folder](extend/in-container-configuration.md) on the host. +Note: if you run `ddev composer global require`, (or run `composer global require` inside the web container) the global packages will be installed in the in-container user's home directory ( ~/.composer) and will disappear on the next container restart, requiring rerun of the command. You may need an additional step of synchronizing created composer configuration and installed packages with the DDEV's [homeadditions folder](extend/in-container-configuration.md) on the host. @@ -68,7 +68,7 @@ If you encounter any other scenario, consider using `ddev ssh` and run composer ### Email Capture and Review -[MailHog](https://github.com/mailhog/MailHog) is a mail catcher which is configured to capture and display emails sent by PHP in the development environment. +[MailHog](https://github.com/MailHog/MailHog) is a mail catcher which is configured to capture and display emails sent by PHP in the development environment. After your project is started, access the MailHog web interface at its default port: @@ -76,7 +76,7 @@ After your project is started, access the MailHog web interface at its default p http://mysite.ddev.site:8025 ``` -Please note this will not intercept emails if your application is configured to use SMTP or a 3rd-party ESP integration. If you are using SMTP for outgoing mail handling ([Swiftmailer](https://www.drupal.org/project/swiftmailer) or [SMTP](https://www.drupal.org/project/smtp) modules for example), update your application configuration to use `localhost` on port `1025` as the SMTP server locally in order to use MailHog. +Please note this will not intercept emails if your application is configured to use SMTP or a 3rd-party ESP integration. If you are using SMTP for outgoing mail handling ([Swift Mailer](https://www.drupal.org/project/swiftmailer) or [SMTP](https://www.drupal.org/project/smtp) modules for example), update your application configuration to use `localhost` on port `1025` as the SMTP server locally in order to use MailHog. ### Database Management diff --git a/docs/users/docker_installation.md b/docs/users/docker_installation.md index ab15f9d9bbd..231f5c86caa 100644 --- a/docs/users/docker_installation.md +++ b/docs/users/docker_installation.md @@ -23,7 +23,7 @@ Docker installation on Linux depends on what flavor you're using. Where possible * [Fedora](https://docs.docker.com/install/linux/docker-ce/fedora/). Recent versions of Fedora (32, 33+) require a [different approach, installing the original CGroups](https://fedoramagazine.org/docker-and-fedora-32/). In addition, you must [disable SELinux](https://www.cyberciti.biz/faq/disable-selinux-on-centos-7-rhel-7-fedora-linux/). * [binaries](https://docs.docker.com/install/linux/docker-ce/binaries/) -After installing Docker you *must* install docker-compose separately except on Ubuntu 20.04+: If using Linuxbrew you can `brew install docker-compose`, otherwise [Follow download instructions](https://docs.docker.com/compose/install/#install-compose) (select "linux" tab). This really is just downloading docker-compose binary from and installing it in /usr/local/bin with executable permissions. On ARM64 computers you may have to install docker-compose using `pip install docker-compose` or `pip3 install docker-compose`. +After installing Docker you *must* install docker-compose separately except on Ubuntu 20.04+: If using Homebrew you can `brew install docker-compose`, otherwise [Follow download instructions](https://docs.docker.com/compose/install/#install-compose) (select "linux" tab). This really is just downloading docker-compose binary from and installing it in /usr/local/bin with executable permissions. On ARM64 computers you may have to install docker-compose using `pip install docker-compose` or `pip3 install docker-compose`. ### Linux Post-installation steps (required) diff --git a/docs/users/extend/config_yaml.md b/docs/users/extend/config_yaml.md index 06b67e82983..b205cf3d6ba 100644 --- a/docs/users/extend/config_yaml.md +++ b/docs/users/extend/config_yaml.md @@ -28,23 +28,23 @@ the .ddev/config.yaml is the primary configuration for the project. | additional_fqdns | extra fully-qualified domain names | `additional_fqdns: ["example.com", "sub1.example.com"]` would provide http and https URLs for "example.com" and "sub1.example.com". Please take care with this because it can cause great confusion and adds extraneous items to your /etc/hosts file. | | upload_dir | Relative path to upload directory used by `ddev import-files` | | | working_dir | explicitly specify the working directory used by `ddev exec` and `ddev ssh` | `working_dir: { web: "/var/www", db: "/etc" }` would set the working directories for the web and db containers. | -| omit_containers | Allows the project to not load specified containers | For example, `omit_containers: [db, dba, ddev-ssh-agent]`. Currently only these containers are supported. Some containers can also be omitted globally in the ~/.ddev/global_config.yaml and the result is additive; all containers named in both places will be omitted. Note that if you omit the "db" container, several standard features of ddev that access the database container will be unusuable. | -| nfs_mount_enabled | Allows using NFS to mount the project into the container for performance reasons | See [nfsmount_enabled documentation](../performance.md). This requires configuration on the host before it can be used. Note that project-level configuration of nfs_mount_enabled is unusual, and that if it's true in the global config, that overrides the project-specific nfs_mount_enabled| +| omit_containers | Allows the project to not load specified containers | For example, `omit_containers: [db, dba, ddev-ssh-agent]`. Currently only these containers are supported. Some containers can also be omitted globally in the ~/.ddev/global_config.yaml and the result is additive; all containers named in both places will be omitted. Note that if you omit the "db" container, several standard features of ddev that access the database container will be unusable. | +| nfs_mount_enabled | Allows using NFS to mount the project into the container for performance reasons | See [nfs_mount_enabled documentation](../performance.md). This requires configuration on the host before it can be used. Note that project-level configuration of nfs_mount_enabled is unusual, and that if it's true in the global config, that overrides the project-specific nfs_mount_enabled| | fail_on_hook_fail | Decide whether `ddev start` should be interrupted by a failing hook | | host_https_port | Specify a specific and persistent https port for direct binding to the localhost interface | This is not commonly used, but a specific port can be provided here and the https URL will always remain the same. For example, if you put "59001", the project will always use " for the localhost URL. (Note that the named URL is more commonly used and for most purposes is better.) If this is not set the port will change from `ddev start` to `ddev start` | | host_webserver_port | Specify a specific and persistent http port for direct binding to the localhost interface | This is not commonly used, but a specific port can be provided here and the https URL will always remain the same. For example, if you put "59000", the project will always use " for the localhost URL. (Note that the named URL is more commonly used and for most purposes is better.) If this is not set the port will change from `ddev start` to `ddev start` | | host_db_port | localhost binding port for database server | If specified here, the database port will remain consistent. This is useful for configuration of host-side database browsers. Note, though, that `ddev sequelpro` and `ddev mysql` do all this automatically, as does the sample command `ddev mysqlworkbench`. | -| phpmyadmin_port | port used for PHPMyAdmin URL | This is sometimes changed from the default 8036 when a port conflict is discovered | -| phpmyadmin_https_port | port used for PHPMyAdmin URL (https) | This is sometimes changed from the default 8037 when a port conflict is discovered | -| mailhog_port | port used in Mailhog URL | this can be changed from the default 8025 in case of port conflicts | -| mailhog_https_port | port used in Mailhog URL | this can be changed from the default 8026 in case of port conflicts | +| phpmyadmin_port | port used for phpMyAdmin URL | This is sometimes changed from the default 8036 when a port conflict is discovered | +| phpmyadmin_https_port | port used for phpMyAdmin URL (https) | This is sometimes changed from the default 8037 when a port conflict is discovered | +| mailhog_port | port used in MailHog URL | this can be changed from the default 8025 in case of port conflicts | +| mailhog_https_port | port used in MailHog URL | this can be changed from the default 8026 in case of port conflicts | | webimage_extra_packages| Add extra Debian packages to the ddev-webserver. | For example, `webimage_extra_packages: [php-yaml, php-bcmath]` will add those two packages | | dbimage_extra_packages| Add extra Debian packages to the ddev-dbserver. | For example, `dbimage_extra_packages: ["less"]` will add those that package. | | use_dns_when_possible | defaults to true (using DNS instead of editing /etc/hosts) | If set to false, ddev will always update the /etc/hosts file with the project hostname instead of using DNS for name resolution | | project_tld | defaults to "ddev.site" so project urls become "someproject.ddev.site" | This can be changed to anything that works for you; to keep things the way they were before ddev v1.9, use "ddev.local" | | ngrok_args | Extra flags for ngrok when using the `ddev share` command | For example, `--subdomain mysite --auth user:pass`. See [ngrok docs on http flags](https://ngrok.com/docs#http) | | disable_settings_management | defaults to false | If true, ddev will not create or update CMS-specific settings files | | -| provider| hosting provider for `ddev pull` | "pantheon" or "drud-aws" or "default" | +| provider| hosting provider for `ddev pull` | "pantheon" or "ddev-live" or "default" | | hooks | | See [Extending Commands](../extending-commands.md) for more information. | | no_project_mount | Skip mounting the project into the web container | If true, the project will not be mounted by ddev into the web container. This is to enable experimentation with alternate file mounting strategies. Advanced users only! | @@ -58,7 +58,7 @@ The $HOME/.ddev/global_config.yaml has a few key global config options. | fail_on_hook_fail | Enables `ddev start` interruption globally for all projects when a hook fails | Decide whether `ddev start` should be interrupted by a failing hook | | omit_containers | Allows the project to not load specified containers | For example, `omit_containers: [ "dba", "ddev-ssh-agent"]`. Currently only these containers are supported. Note that you cannot omit the "db" container in the global configuration, but you can in the per-project .ddev/config.yaml. | | instrumentation_opt_in | Opt in or out of instrumentation reporting | If true, anonymous usage information is sent to ddev via [segment](https://segment.com) | -| router_bind_all_interfaces | Bind on all network interfaces | If true, ddev-router will bind on all network interfaces instead of just localhost, exposing ddev projects to your local network. If you set this to true, you may consider `omit_containers: ["dba"]` so that the PHPMyAdmin port is not available. | +| router_bind_all_interfaces | Bind on all network interfaces | If true, ddev-router will bind on all network interfaces instead of just localhost, exposing ddev projects to your local network. If you set this to true, you may consider `omit_containers: ["dba"]` so that the phpMyAdmin port is not available. | | internet_detection_timeout_ms | Internet detection timeout | ddev must detect whether the internet is working to determine whether to add hostnames to /etc/hosts. It uses a DNS query and times it out by default at 750ms. In rare cases you may need to increase this value if you have slow but working internet. See [FAQ](../faq.md) and [issue link](https://github.com/drud/ddev/issues/2409#issuecomment-662448025).| | use_hardened_images | If true, use more secure 'hardened' images for an actual internet deployment | The most important thing about hardened images is that sudo is not included in the web container, and the container is run without elevated privileges. This is generally used with experimental casual hosting feature. | | use_letsencrypt | If true, enables experimental Let's Encrypt integration | 'ddev global --use-letsencrypt' or `ddev global --use-letsencrypt=false'. This requires letsencrypt_email to be set, and can't work if the system is not available on the internet. Used with experimental casual hosting feature. | diff --git a/docs/users/extend/custom-commands.md b/docs/users/extend/custom-commands.md index 94bf893a7f7..921172bc1de 100644 --- a/docs/users/extend/custom-commands.md +++ b/docs/users/extend/custom-commands.md @@ -11,17 +11,17 @@ There are example commands provided in `ddev/commands/*/*.example` that can just ### Host commands -To provide host commands, place a bash script in .ddev/commands/host. For example, a PHPStorm launcher to make the `ddev PHPStorm` command might go in .ddev/commands/host/phpstorm` with these contents: +To provide host commands, place a bash script in .ddev/commands/host. For example, a PhpStorm launcher to make the `ddev PhpStorm` command might go in .ddev/commands/host/phpstorm` with these contents: ```bash #!/usr/bin/env bash -## Description: Open PHPStorm with the current project +## Description: Open PhpStorm with the current project ## Usage: phpstorm ## Example: "ddev phpstorm" # Example is macOS-specific, but easy to adapt to any OS -open -a PHPStorm.app ${DDEV_APPROOT} +open -a PhpStorm.app ${DDEV_APPROOT} ``` ### Container commands diff --git a/docs/users/performance.md b/docs/users/performance.md index d6c2c322136..2c231df95e8 100644 --- a/docs/users/performance.md +++ b/docs/users/performance.md @@ -8,7 +8,7 @@ Every project you run uses system resources, and may compete for those resources ## Docker Desktop for Mac Settings -Docker Desktop for Mac has a number of settings that you'll want to pay attention to. Under "Advanced" in the "Resources" section in "Preferences", you can adjust the amount of memory, disk, and CPUs allocated to Docker. While the defaults work well for a small project or two, you may want to adjust these upward based on your experience. The default memory allocation is 2GB, but many people raise it to 4-5GB or even higher. The disk allocation almost always needs to be raised to accomodate increased downloaded images. Your experience will determine what to do with CPUs. +Docker Desktop for Mac has a number of settings that you'll want to pay attention to. Under "Advanced" in the "Resources" section in "Preferences", you can adjust the amount of memory, disk, and CPUs allocated to Docker. While the defaults work well for a small project or two, you may want to adjust these upward based on your experience. The default memory allocation is 2GB, but many people raise it to 4-5GB or even higher. The disk allocation almost always needs to be raised to accommodate increased downloaded images. Your experience will determine what to do with CPUs. ## Using NFS to Mount the Project into the Web Container @@ -45,7 +45,7 @@ Also see the debugging section below, and the special Windows debugging section. ### Debian/Ubuntu Linux NFS Setup -The nfsmount_enabled feature does not really add performance on Linux systems because Docker on Linux is already quite fast. The primary reason for using it on a Linux system would be just to keep consistent with other team members working on other host OSs. However, since one can now set up NFS globally with `ddev config global --nfs-mount-enabled` it no longer needs to be set up on a project-by-project basis, so most teams can get by with just leaving NFS mounting out of the project-level config.yaml. +The nfs_mount_enabled feature does not really add performance on Linux systems because Docker on Linux is already quite fast. The primary reason for using it on a Linux system would be just to keep consistent with other team members working on other host OSs. However, since one can now set up NFS globally with `ddev config global --nfs-mount-enabled` it no longer needs to be set up on a project-by-project basis, so most teams can get by with just leaving NFS mounting out of the project-level config.yaml. Note that for all Linux systems, you can and should install and configure the NFS daemon and configure /etc/exports as you see fit and share the directories that you choose to share. The Debian/Ubuntu Linux script is just one way of accomplishing it. diff --git a/docs/users/shell-completion.md b/docs/users/shell-completion.md index 2ea4133dfa7..7cb98a4637b 100644 --- a/docs/users/shell-completion.md +++ b/docs/users/shell-completion.md @@ -8,7 +8,7 @@ Shells like bash and zsh need help to do this though, they have to know what the Although most people will use techniques like homebrew for installation, a tar archive of the shell completion scripts is available in each release, called "ddev_shell_completion_scripts.\.tar.gz". If you need to manually install, you can download and untar the scripts, then copy them as needed to where they have to go. For example, `sudo cp ddev_bash_completion.sh /etc/bash_completion.d/ddev`. -Note that scripts for the fish shell and Windows Powershell are also provided, but no instructions are given here for deploying them. +Note that scripts for the fish shell and Windows PowerShell are also provided, but no instructions are given here for deploying them. ## Bash Completion with Homebrew @@ -19,7 +19,7 @@ Add the following line to your ~/.bash_profile: [[ -r "/usr/local/etc/profile.d/bash_completion.sh" ]] && . "/usr/local/etc/profile.d/bash_completion.sh" ``` -*You need to add the suggested line to your ~/.bash_profile or ~/.profile to get it to work*, and then in the current shell you need tou `source ~/.bash_profile` or `source ~/.profile` to make it take effect. (You can also just open a new shell window.) +*You need to add the suggested line to your ~/.bash_profile or ~/.profile to get it to work*, and then in the current shell you need to `source ~/.bash_profile` or `source ~/.profile` to make it take effect. (You can also just open a new shell window.) Then, if you're installing ddev from homebrew, each new release will automatically get a refreshed completions script. diff --git a/docs/users/step-debugging.md b/docs/users/step-debugging.md index dbad3858708..4037e575d3e 100644 --- a/docs/users/step-debugging.md +++ b/docs/users/step-debugging.md @@ -69,7 +69,7 @@ If you need to debug command-line PHP processes, especially code that is outside * If you have used PhpStorm with xdebug you already have a PhpStorm "server" with the same name as your primary URL (see "Languages and Frameworks" -> "PHP" -> "Servers"). The key job of the "server" is to map filesystem locations on the workstation (your computer) to filesystem locations on the remote server (in this case the ddev-webserver container). Often, PhpStorm has automatically set up a mapping that doesn't include the entire project (so the vendor directory is not mapped, for example). So map the top-level directory of your project to /var/www/html in the container, as in this image: ![PhpStorm mapping](images/PHPStormServerMapping.png) -* When debugging a command-line script inside the container, the environment variable PHP_IDE_CONFIG is automatically set for you, so it will be something like `PHP_IDE_CONFIG=serverName=d8composer.ddev.site`. If debugging Drupal's drush command, you may find that launching the site-installed drush directly will avoid confusing PHPStorm with the execution of /usr/local/bin/drush (which is the drush launcher). Run it as `ddev exec /var/www/html/vendor/bin/drush` or wherever it was installed. It's often easiest to just `ddev ssh` into the web container and execute command-line scripts directly. +* When debugging a command-line script inside the container, the environment variable PHP_IDE_CONFIG is automatically set for you, so it will be something like `PHP_IDE_CONFIG=serverName=d8composer.ddev.site`. If debugging Drupal's drush command, you may find that launching the site-installed drush directly will avoid confusing PhpStorm with the execution of /usr/local/bin/drush (which is the drush launcher). Run it as `ddev exec /var/www/html/vendor/bin/drush` or wherever it was installed. It's often easiest to just `ddev ssh` into the web container and execute command-line scripts directly. @@ -129,15 +129,15 @@ xdebug.remote_port=11011 ### Troubleshooting Xdebug -Debugging Xdebug in any setup can be a little trouble, but here are the steps to take. The steps here assume that you're using PHPStorm, but they can be adapted to any IDE. +Debugging Xdebug in any setup can be a little trouble, but here are the steps to take. The steps here assume that you're using PhpStorm, but they can be adapted to any IDE. -* Make sure you have a 2019+ version of PHPStorm. Many PHPStorm versions up to and (including?) 2018.3 were incompatible with current XDebug versions. +* Make sure you have a 2019+ version of PhpStorm. Many PhpStorm versions up to and (including?) 2018.3 were incompatible with current XDebug versions. * Make sure xdebug has been enabled in ddev; it's disabled by default for performance reasons. Most people use `ddev xdebug on` to enable it when they want it, and `ddev xdebug off` when they're done with it, but it can also be enabled in `.ddev/config.yaml`. * Don't assume that some obscure piece of code is being executed and put a breakpoint there. Start by putting a breakpoint at the first executable line in your index.php. Oh-so-many times people think it should be stopping, but their code is not being executed. * `ddev ssh` into the web container. Can you `ping host.docker.internal` (and get responses)? If you can't, you might have an over-aggressive firewall. Try to disable it, or add a rule that would allow the connection to pass through. For example, on Debian/ Ubuntu that would be `sudo ufw allow 9000/tcp`. -* In PHPStorm, disable the "listen for connections" button so it won't listen. Or just exit PHPStorm. -* `ddev ssh`: Can `telnet host.docker.internal 9000` connect? If it does, you have something else running on port 9000, probably php-fpm. On the host, use `sudo lsof -i :9000 -sTCP:LISTEN` to find out what is there and stop it, or [change the xdebug port and configure PHPStorm to use the new one](#using-xdebug-on-a-port-other-than-the-default) . Don't continue debugging until your telnet command does not connect. -* Now click the listen button on PHPStorm to start it listening for connections. -* `ddev ssh` and try the `telnet host.docker.internal 9000` again. It should connect. If not, maybe PHPStorm is not listening, or not configured to listen on port 9000? +* In PhpStorm, disable the "listen for connections" button so it won't listen. Or just exit PhpStorm. +* `ddev ssh`: Can `telnet host.docker.internal 9000` connect? If it does, you have something else running on port 9000, probably php-fpm. On the host, use `sudo lsof -i :9000 -sTCP:LISTEN` to find out what is there and stop it, or [change the xdebug port and configure PhpStorm to use the new one](#using-xdebug-on-a-port-other-than-the-default) . Don't continue debugging until your telnet command does not connect. +* Now click the listen button on PhpStorm to start it listening for connections. +* `ddev ssh` and try the `telnet host.docker.internal 9000` again. It should connect. If not, maybe PhpStorm is not listening, or not configured to listen on port 9000? * Check to make sure that Xdebug is enabled. You can use `php -i | grep grep Xdebug` inside the container, or use any other technique you want that gives the output of `phpinfo()`, including Drupal's admin/reports/status/php. You should see `with Xdebug v2.9.6, Copyright (c) 2002-2020` and `php -i | grep "xdebug.remote_enable"` should give you `xdebug.remote_enable: On`. * Set a breakpoint in the first relevant line of the index.php of your project and then visit the site in a browser. It should stop at that first line. diff --git a/docs/users/troubleshooting.md b/docs/users/troubleshooting.md index a78cf1c1f3c..a9afce6929d 100644 --- a/docs/users/troubleshooting.md +++ b/docs/users/troubleshooting.md @@ -9,7 +9,7 @@ Things might go wrong! Besides the suggestions on this page don't forget about [ * If you have customizations (PHP overrides, nginx or Apache overrides, MySQL overrides, custom services, config.yaml changes) please back them out while troubleshooting. It's important to have the simplest possible environment while troubleshooting. * Check your Docker disk space and memory allocation if you're using Docker Desktop on Windows or macOS. * Restart Docker. Consider a Docker factory reset in serious cases (this will destroy any databases you've loaded). See [Docker Troubleshooting](docker_installation.md#troubleshooting) for more. -* Try the simplest possible ddev project to try to get i to work: `ddev poweroff && mkdir ~/tmp/testddev && cd ~/tmp/testddev && ddev config --project-type=php && ddev start`. Does that start up OK? If so, maybe something is wrong with the more complicated project you're trying to start. +* Try the simplest possible ddev project to try to get it to work: `ddev poweroff && mkdir ~/tmp/testddev && cd ~/tmp/testddev && ddev config --project-type=php && ddev start`. Does that start up OK? If so, maybe something is wrong with the more complicated project you're trying to start. @@ -23,7 +23,7 @@ Failed to start yoursite: Unable to listen on required ports, localhost port 80 This means there is another webserver listening on the named port(s) and ddev cannot access the port. -(In some cases the conflict could be over port 8036 (PHPMyAdmin) or port 8025 (mailhog)). +(In some cases the conflict could be over port 8036 (phpMyAdmin) or port 8025 (MailHog)). To resolve this conflict, choose one of two methods: @@ -43,13 +43,13 @@ router_http_port: 8000 Then run `ddev start`. This changes the project's http URL to -If the conflict is over port 8025, it's normally a conflict over the default port for mailhog. You can add to your .ddev/config.yaml +If the conflict is over port 8025, it's normally a conflict over the default port for MailHog. You can add to your .ddev/config.yaml ```yaml mailhog_port: 8300 ``` -If the conflict is over port 8036, it's normally about PHPMyAdmin, and you can add to your .ddev/config.yaml +If the conflict is over port 8036, it's normally about phpMyAdmin, and you can add to your .ddev/config.yaml ```yaml phpmyadmin_port: 8302 @@ -75,8 +75,8 @@ Here are some of the other common processes that could be using port 80 and meth or `sudo launchctl stop homebrew.mxcl.nginx` * nginx (Ubuntu): `sudo service nginx stop` * apache (often named "httpd") (many environments): `sudo apachectl stop` or on Ubuntu `sudo service apache2 stop` -* vpnkit (macOS): You likely have a docker container bound to port 80, do you have containers up for Kalabox or another docker-based development environment? If so, stop the other environment. -* Kalabox: If you have previously used Kalabox try running `kbox poweroff` +* vpnkit (macOS): You likely have a docker container bound to port 80, do you have containers up for Lando or another docker-based development environment? If so, stop the other environment. +* Lando: If you have previously used Lando try running `lando poweroff` To dig deeper, you can use a number of tools to find out what process is listening. @@ -189,7 +189,7 @@ While ddev can create a webserver and a docker network infrastructure for a proj ## Windows WSL2 Name resolution on non-ddev.site hostnames or when not internet-connected -On Windows WSL2, there is a hosts file inside the WSL2 instance (`/etc/hosts`), and there is also one on the Windows side (`C:\Windows\systsem32\drivers\etc\hosts`). Most people use a browser on the Windows side, which has no idea about hostnames that may be set up in the WSL2 /etc/hosts file. So a WSL2 project which uses `*.ddev.site` works fine when accessed by a browser on the Windows side, as long as internet connectivity is available (DNS lookups of `*.ddev.site` succeed). +On Windows WSL2, there is a hosts file inside the WSL2 instance (`/etc/hosts`), and there is also one on the Windows side (`C:\Windows\system32\drivers\etc\hosts`). Most people use a browser on the Windows side, which has no idea about hostnames that may be set up in the WSL2 /etc/hosts file. So a WSL2 project which uses `*.ddev.site` works fine when accessed by a browser on the Windows side, as long as internet connectivity is available (DNS lookups of `*.ddev.site` succeed). However, if the project uses non-ddev.site hostnames, or if not connected to the Internet, a Windows-side browser will be unable to look up project hostnames, and you'll get complaints from the browser like " server IP address could not be found" or "We can’t connect to the server at ". In this case, you can diff --git a/docs/users/uninstall.md b/docs/users/uninstall.md index e8d27c9d477..2b3db53db40 100644 --- a/docs/users/uninstall.md +++ b/docs/users/uninstall.md @@ -28,6 +28,6 @@ Otherwise: To remove the ddev binary: -* On macOS with Homebrew or Linux with Linuxbrew, `brew uninstall ddev` +* On macOS or Linux with Homebrew, `brew uninstall ddev` * For linux or other simple installs, just remove the binary, for example `sudo rm /usr/local/bin/ddev` * On Windows (if you used the ddev Windows installer) use the uninstall on the start menu or in the "Add or Remove Programs" section of Windows settings.