{"id":13416559,"url":"https://github.com/whatwedo/dde","last_synced_at":"2026-04-14T21:01:55.583Z","repository":{"id":37867236,"uuid":"167178102","full_name":"whatwedo/dde","owner":"whatwedo","description":"Local development environment toolset based on Docker","archived":false,"fork":false,"pushed_at":"2026-04-14T17:57:36.000Z","size":1861,"stargazers_count":46,"open_issues_count":16,"forks_count":9,"subscribers_count":9,"default_branch":"master","last_synced_at":"2026-04-14T19:29:09.165Z","etag":null,"topics":["docker","hacktoberfest"],"latest_commit_sha":null,"homepage":"","language":"Shell","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/whatwedo.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2019-01-23T12:16:48.000Z","updated_at":"2026-02-20T12:25:09.000Z","dependencies_parsed_at":"2024-01-25T11:40:16.530Z","dependency_job_id":"8d121479-ea1b-4b32-b30d-c7e55226c194","html_url":"https://github.com/whatwedo/dde","commit_stats":null,"previous_names":[],"tags_count":17,"template":false,"template_full_name":null,"purl":"pkg:github/whatwedo/dde","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/whatwedo%2Fdde","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/whatwedo%2Fdde/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/whatwedo%2Fdde/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/whatwedo%2Fdde/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/whatwedo","download_url":"https://codeload.github.com/whatwedo/dde/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/whatwedo%2Fdde/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31815080,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-14T18:05:02.291Z","status":"ssl_error","status_checked_at":"2026-04-14T18:05:01.765Z","response_time":153,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["docker","hacktoberfest"],"created_at":"2024-07-30T21:01:00.883Z","updated_at":"2026-04-14T21:01:55.557Z","avatar_url":"https://github.com/whatwedo.png","language":"Shell","readme":"![Logo](assets/img/logo.png)\n\n\n# dde (Docker based Development Environment)\n\nLocal development environment toolset based on Docker supporting multiple projects.\n\nFeatures include:\n\n* Simplified Docker web application development\n* Installation of system wide services:\n    * `*.test` domain lookup based on [dnsmasq](http://www.thekelleys.org.uk/dnsmasq/doc.html)\n    * Reverse Proxy based on [jwilder/nginx-proxy](https://github.com/jwilder/nginx-proxy) to run multiple projects on same port (80/443) with autoconfigured SSL certificates\n    * [MariaDB](https://mariadb.org/) ([MySQL](https://www.mysql.com/) alternative)\n    * [MailCrab](https://github.com/tweedegolf/mailcrab) (SMTP testing server)\n    * [ssh-agent](https://www.ssh.com/ssh/agent) used for sharing your SSH key without adding it to your project Docker containers.\n\n**Note:** dde is currently under heavy development and we don't offer any backward compatibility. However we use it at [whatwedo](https://www.whatwedo.ch/) on daily bases and it's safe to use it in your development environment.\n\n\n## Requirements\n\n* macOS, Linux or Windows (WSL 2)\n* [Docker 17.09.0+](https://docs.docker.com/)\n* [docker-compose 1.22+](https://docs.docker.com/compose/)\n* [Bash](https://www.gnu.org/software/bash/)\n* [openssl](https://www.openssl.org/)\n* No other services listening localhost on:\n    * Port 53\n    * Port 80\n    * Port 443\n    * Port 3306\n\n\n# Architecture\n\n![Architecture](assets/img/architecture.svg)\n\n\n## Installation\n\n```\ncd ~\ngit clone https://github.com/whatwedo/dde.git\n~/dde/dde.sh system:dde:install\n~/dde/dde.sh system:up\n```\n\n`system:dde:install` modifies your .profile files based on your shell:\n\n* autocompletion \n* aliases \n\ndde can now be used in a new shell, enjoy!\n\n### Aliases\n```\n# if you're using bash\necho \"alias dde='~/dde/dde.sh'\" \u003e\u003e ~/.bash_profile\n\n# if you're using zsh\necho \"alias dde='~/dde/dde.sh'\" \u003e\u003e ~/.zshrc\n```\n\n### Autocompletion\n\nadd `eval $(~/dde/dde.sh --autocomplete)`  to  `~/.zshrc` or `~/.bash_profile`  \n\n\n### Additional OS specific installation steps\n\n\n#### macOS\n\nForward requests for `.test`-domains to the local DNS resolver:\n\n```\nsudo mkdir -p /etc/resolver\necho -e \"nameserver 127.0.0.1\" | sudo tee /etc/resolver/test\n```\n\nTrust the newly generated Root-CA for the self-signed certificates\n\n```\nsudo security add-trusted-cert -d -r trustRoot -k /Library/Keychains/System.keychain ~/dde/data/reverseproxy/etc/nginx/certs/ca.pem\n```\n\nTo ensure DNS functionality in Docker on macOS X:\n\nIn the Docker GUI: Go to `\"Settings\" → \"Resources\" → \"Network\"`, then turn off \"Use kernel networking for UDP\".\nIn the configuration file: Set `kernelForUDP` to `false` in `~/Library/Group Containers/group.com.docker/settings.json`.\n\n#### Linux\n\nSet your DNS to `127.0.0.1` with fallbacks of your choice.\n\nTrust the newly generated Root-CA found here:\n\n```\n~/dde/data/reverseproxy/etc/nginx/certs/ca.pem\n```\n\n##### Linux\n\n1. **Convert PEM to CRT and Add Globally:**\n\n   ```bash\n   openssl x509 -outform der -in ~/dde/data/reverseproxy/etc/nginx/certs/ca.pem -out ~/dde/data/reverseproxy/etc/nginx/certs/ca.crt\n   sudo cp ~/dde/data/reverseproxy/etc/nginx/certs/ca.crt /usr/local/share/ca-certificates/\n   sudo update-ca-certificates\n   ```\n\n#### Windows (WSL 2)\n\nSet your DNS to `127.0.0.1` with fallbacks of your choice.\n\n1. In WSL-Terminal, adjust the file `/etc/wsl.conf` to\n\n```\n[network]\ngenerateResolvConf = false\n```\n\n2. Remove the file / link `resolv.conf` and close the WSL-Terminal\n\n3. To restart WSL, run in powershell (admin):\n\n```\nwsl --shutdown\nGet-Service LxssManager | Restart-Service\n```\n\n4. Open a WSL-Terminal and create a file `/etc/resolv.conf` with the following content:\n\n```\nnameserver 127.0.0.1\nnameserver 1.1.1.1\n```\n\n5. Restart WSL again (step #3)\n\n## File-Sync\n\nDefine the exposed volumes in your compose file or compose override file the exposed volumes.\n\n## Tip and Tricks\n\n### Configuring a Custom Shell using `.dde.yml`\n\nTo configure a custom shell in whatwedo/dde using the `.dde.yml` configuration file, specify your preferred shell with the container.shell key. This setting instructs whatwedo/dde to use the specified shell within the container. For instance, to utilize zsh as the container shell, your configuration would appear as follows:\n\n```yml\nversion: \"1\"\n\ncontainer:\n  shell: zsh\n```\n\nAnd in your composer file, add the corresponding environment variable:\n\n```yml\nenvironment:\n  - DDE_CONTAINER_SHELL: ${DDE_CONTAINER_SHELL}\n```\n\nThis ensures that the custom shell setting is effectively utilized within the container.\n\nTo specify a default shell in the Dockerfile, include the ARG directive for customization. For example:\n\n```dockerfile\nARG DDE_CONTAINER_SHELL\n```\n\n### Configuring DNS Forwarding in DDE\n\nThe environment variables `DDE_DNS_FORWARD_1` and `DDE_DNS_FORWARD_2` allow for setting custom DNS servers in the Docker Development Environment (DDE). This is useful when local Internet DNS servers are to be used.\n\n#### Instructions\n\n1. Set `DDE_DNS_FORWARD_1` and `DDE_DNS_FORWARD_2` to the IP addresses of your preferred DNS servers.\n\n   Example:\n\n   ```bash\n   export DDE_DNS_FORWARD_1=192.168.1.100\n   export DDE_DNS_FORWARD_2=192.168.1.101\n   ```\n\n#### Adding `DDE_DNS_FORWARD_1` and `DDE_DNS_FORWARD_2` to `bashrc`\n\nFor a more permanent solution, you can add the `DDE_DNS_FORWARD_1` and `DDE_DNS_FORWARD_2` variables to your `bashrc` file. This ensures that these variables are automatically set every time a new shell session is started.\n\nTo do this, append the `export` commands to your `~/.bashrc` file:\n\n1. Open your `~/.bashrc` file in a text editor, for example, you can use `nano`:\n\n   ```bash\n   nano ~/.bashrc\n   ```\n\nAdd the following lines at the end of the file:\n\n    ```bash\n    export DDE_DNS_FORWARD_1=\u003cYour_First_DNS_IP_Address\u003e\n    export DDE_DNS_FORWARD_2=\u003cYour_Second_DNS_IP_Address\u003e\n    ```\nReplace \u003cYour_First_DNS_IP_Address\u003e and \u003cYour_Second_DNS_IP_Address\u003e with the IP addresses of your preferred DNS servers.\n\nSave and close the file.\n\nTo apply the changes immediately, source your ~/.bashrc file:\n\n```bash\nsource ~/.bashrc\n```\n\nNow, `DDE_DNS_FORWARD_1` and `DDE_DNS_FORWARD_2` will be set automatically in each new shell session.\n\n### Fix Permission\n\nServices such as nginx in Docker containers normally runs with the `root` user. With the `dde exec` command\nyou login into the container with the user `dde`. If services writes files, ex. `var/cache`, `root` is the owner. \nOn the host files also the `root` is the owner. In this case you normally not able to delete or change the files \ncreated by the services.\n\nthe [command](commands/project/fix-permissions.sh) `project:fix-permissions` resolve this issue by `chown dde:dde` \nin the container and `chown {yourLocalUser}:{yourLocalGroup}` in the local host.\n\n\n### OPEN_URL \u0026 DDE_BROWSER\n\nAdd `OPEN_URL` in the `environment` array of your compose file.\n\nOn the `project:up` or `project:open` command the website(s) will be opened in your standard browser.\n\n\n```yaml\nservices:\n    web:\n        ...\n        environment:\n            - VIRTUAL_HOST=cloud.project.test\n            - OPEN_URL=http://cloud.project.test/\n    storage:\n        ...\n        environment:\n            - VIRTUAL_HOST=minio.project.test\n            - OPEN_URL=http://minio.project.test:9000/\n\n```\n\nSet the environment variable `DDE_BROWSER` if you what to start a specific browser.\n\n\n`command/local.sh`\n```bash\nDDE_BROWSER=/usr/bin/firefox\n```\n\n\n## Additional Services\n\nIf you need additional central Services. eg. PostgresSQL just add then in `docker-compose.override.yml` in the \ndde-directory.\n\nAvailable Services\n\n- [PostgresSQL](services/postgres/docker-compose.override.yml)\n- MySql\n- Redis\n- ....\n\n\n\n## Usage\n\n```\n$ dde help\n```\n\n### Project configuration\n\nDue to the early stage of this project there is no full documentation available. We created a [example](example) project with all required and optional configuration. Please checkout the [example](example) directory.\n\n\n## Including custom command\n\nyou can include custom commands by adding them in the `commands/local/` directory. \nCustom commands must be prefixed with the `local:` namespace.\n\n### Anatomy of a command\n\n`commands\\local\\my_command.sh`\n```bash\n## inline help for local:my_command\n#\n# more help for the command\n#\n# this will be displayed with the --help argument on the command\n#\n# e.g dde local:command --help\n#\n\nfunction local:my_command() {\n    echo 'execute local:my_command'\n    _localCommand_someInternalFunction arg1\n}\n\nfunction _localCommand_someInternalFunction() {\n    echo \"do something with ${1}\"\n}\n```\n\n* script must be located in the `command` directory\n* Help text for the commands\n  * `:` will be replaced by `/` for locating the help script\n  * the first line beginning with `##` is the help text displayed be the help command\n  * all following lines beginning with `#` will displayed in the command help \n* you can add as many functions as you want in the script\n* to avoid conflicts prefix internal functions \n* functions and can also be defined in the `command/local.sh` file\n* the `command/local.sh` file is the last loaded source, so you are able to overwrite system variables\nand functions there\n\n`command/local.sh`\n```bash\nfunction _local_someGlobalHelperFunction() {\n    echo \"a global helper function\"\n}\n\n\n# overwrite a variable\nNETWORK_NAME=test\n\n\n# overwrite a function/command\nfunction project:env() {\n    echo \"my custom project env\"\n}\n\n\n```\n\n## Example\nUnder the `example/` directory you can find an example configurations for dde projects.\n\n![Demo](assets/gif/demo.gif)\n\n## Known solutions\n* **failed to remove network dde**  \nIf you get this error, it means your project composer file is wrongly configured.\nBe sure to mark the `dde` network as external, like in our examples:\n```yml\nnetworks:\n    default:\n        name: \"dde\"\n        external: true # \u003c-- important\n```\n\n## Known problems\n\n## Bugs and Issues\n\nIf you have any problems with this image, feel free to open a new issue in our issue tracker https://github.com/whatwedo/dde/issues\n\n\n## License\n\nThis project is under the MIT license. See the complete license in the repository: [LICENSE](LICENSE)\n","funding_links":[],"categories":["Development with Docker"],"sub_categories":["Development Environment"],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fwhatwedo%2Fdde","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fwhatwedo%2Fdde","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fwhatwedo%2Fdde/lists"}