Repository: mageddo/dns-proxy-server
Pull request #362 (2023-03-15 06:06:08)

Bump webpack from 5.75.0 to 5.76.1 in /app
Bumps [webpack](https://github.com/webpack/webpack) from 5.75.0 to 5.76.1.
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a href="https://github.com/webpack/webpack/releases">webpack's releases</a>.</em></p>
<blockquote>
<h2>v5.76.1</h2>
<h2>Fixed</h2>
<ul>
<li>Added <code>assert/strict</code> built-in to <code>NodeTargetPlugin</code></li>
</ul>
<h2>Revert</h2>
<ul>
<li>Improve performance of <code>hashRegExp</code> lookup by <a href="https://github.com/ryanwilsonperkin"><code>@​ryanwilsonperkin</code></a> in <a href="https://redirect.github.com/webpack/webpack/pull/16759">webpack/webpack#16759</a></li>
</ul>
<h2>v5.76.0</h2>
<h2>Bugfixes</h2>
<ul>
<li>Avoid cross-realm object access by <a href="https://github.com/Jack-Works"><code>@​Jack-Works</code></a> in <a href="https://redirect.github.com/webpack/webpack/pull/16500">webpack/webpack#16500</a></li>
<li>Improve hash performance via conditional initialization by <a href="https://github.com/lvivski"><code>@​lvivski</code></a> in <a href="https://redirect.github.com/webpack/webpack/pull/16491">webpack/webpack#16491</a></li>
<li>Serialize <code>generatedCode</code> info to fix bug in asset module cache restoration by <a href="https://github.com/ryanwilsonperkin"><code>@​ryanwilsonperkin</code></a> in <a href="https://redirect.github.com/webpack/webpack/pull/16703">webpack/webpack#16703</a></li>
<li>Improve performance of <code>hashRegExp</code> lookup by <a href="https://github.com/ryanwilsonperkin"><code>@​ryanwilsonperkin</code></a> in <a href="https://redirect.github.com/webpack/webpack/pull/16759">webpack/webpack#16759</a></li>
</ul>
<h2>Features</h2>
<ul>
<li>add <code>target</code> to <code>LoaderContext</code> type by <a href="https://github.com/askoufis"><code>@​askoufis</code></a> in <a href="https://redirect.github.com/webpack/webpack/pull/16781">webpack/webpack#16781</a></li>
</ul>
<h2>Security</h2>
<ul>
<li><a href="https://github.com/advisories/GHSA-3rfm-jhwj-7488">CVE-2022-37603</a> fixed by <a href="https://github.com/akhilgkrishnan"><code>@​akhilgkrishnan</code></a> in <a href="https://redirect.github.com/webpack/webpack/pull/16446">webpack/webpack#16446</a></li>
</ul>
<h2>Repo Changes</h2>
<ul>
<li>Fix HTML5 logo in README by <a href="https://github.com/jakebailey"><code>@​jakebailey</code></a> in <a href="https://redirect.github.com/webpack/webpack/pull/16614">webpack/webpack#16614</a></li>
<li>Replace TypeScript logo in README by <a href="https://github.com/jakebailey"><code>@​jakebailey</code></a> in <a href="https://redirect.github.com/webpack/webpack/pull/16613">webpack/webpack#16613</a></li>
<li>Update actions/cache dependencies by <a href="https://github.com/piwysocki"><code>@​piwysocki</code></a> in <a href="https://redirect.github.com/webpack/webpack/pull/16493">webpack/webpack#16493</a></li>
</ul>
<h2>New Contributors</h2>
<ul>
<li><a href="https://github.com/Jack-Works"><code>@​Jack-Works</code></a> made their first contribution in <a href="https://redirect.github.com/webpack/webpack/pull/16500">webpack/webpack#16500</a></li>
<li><a href="https://github.com/lvivski"><code>@​lvivski</code></a> made their first contribution in <a href="https://redirect.github.com/webpack/webpack/pull/16491">webpack/webpack#16491</a></li>
<li><a href="https://github.com/jakebailey"><code>@​jakebailey</code></a> made their first contribution in <a href="https://redirect.github.com/webpack/webpack/pull/16614">webpack/webpack#16614</a></li>
<li><a href="https://github.com/akhilgkrishnan"><code>@​akhilgkrishnan</code></a> made their first contribution in <a href="https://redirect.github.com/webpack/webpack/pull/16446">webpack/webpack#16446</a></li>
<li><a href="https://github.com/ryanwilsonperkin"><code>@​ryanwilsonperkin</code></a> made their first contribution in <a href="https://redirect.github.com/webpack/webpack/pull/16703">webpack/webpack#16703</a></li>
<li><a href="https://github.com/piwysocki"><code>@​piwysocki</code></a> made their first contribution in <a href="https://redirect.github.com/webpack/webpack/pull/16493">webpack/webpack#16493</a></li>
<li><a href="https://github.com/askoufis"><code>@​askoufis</code></a> made their first contribution in <a href="https://redirect.github.com/webpack/webpack/pull/16781">webpack/webpack#16781</a></li>
</ul>
<p><strong>Full Changelog</strong>: <a href="https://github.com/webpack/webpack/compare/v5.75.0...v5.76.0">https://github.com/webpack/webpack/compare/v5.75.0...v5.76.0</a></p>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a href="https://github.com/webpack/webpack/commit/21be52b681c477f8ebc41c1b0e7a7a8ac4fa7008"><code>21be52b</code></a> Merge pull request <a href="https://redirect.github.com/webpack/webpack/issues/16804">#16804</a> from webpack/chore-patch-release</li>
<li><a href="https://github.com/webpack/webpack/commit/1cce945dd6c3576d37d3940a0233fd087ce3f6ff"><code>1cce945</code></a> chore(release): 5.76.1</li>
<li><a href="https://github.com/webpack/webpack/commit/e76ad9e724410f10209caa2ba86875ca8cf5ed61"><code>e76ad9e</code></a> Merge pull request <a href="https://redirect.github.com/webpack/webpack/issues/16803">#16803</a> from ryanwilsonperkin/revert-16759-real-content-has...</li>
<li><a href="https://github.com/webpack/webpack/commit/52b1b0e4ada7c11e7f1b4f3d69b50684938c684e"><code>52b1b0e</code></a> Revert &quot;Improve performance of hashRegExp lookup&quot;</li>
<li><a href="https://github.com/webpack/webpack/commit/c989143379d344543e4161fec60f3a21beb9e3ce"><code>c989143</code></a> Merge pull request <a href="https://redirect.github.com/webpack/webpack/issues/16766">#16766</a> from piranna/patch-1</li>
<li><a href="https://github.com/webpack/webpack/commit/710eaf4ddaea505e040a24beeb45a769f9e3761b"><code>710eaf4</code></a> Merge pull request <a href="https://redirect.github.com/webpack/webpack/issues/16789">#16789</a> from dmichon-msft/contenthash-hashsalt</li>
<li><a href="https://github.com/webpack/webpack/commit/5d6446822aff579a5d3d9503ec2a16437d2f71d1"><code>5d64468</code></a> Merge pull request <a href="https://redirect.github.com/webpack/webpack/issues/16792">#16792</a> from webpack/update-version</li>
<li><a href="https://github.com/webpack/webpack/commit/67af5ec1f05fb7cf06be6acf27353aef105ddcbc"><code>67af5ec</code></a> chore(release): 5.76.0</li>
<li><a href="https://github.com/webpack/webpack/commit/97b1718720c33f1b17302a74c5284b01e02ec001"><code>97b1718</code></a> Merge pull request <a href="https://redirect.github.com/webpack/webpack/issues/16781">#16781</a> from askoufis/loader-context-target-type</li>
<li><a href="https://github.com/webpack/webpack/commit/b84efe6224b276bf72e4c5e2f4e76acddfaeef07"><code>b84efe6</code></a> Merge pull request <a href="https://redirect.github.com/webpack/webpack/issues/16759">#16759</a> from ryanwilsonperkin/real-content-hash-regex-perf</li>
<li>Additional commits viewable in <a href="https://github.com/webpack/webpack/compare/v5.75.0...v5.76.1">compare view</a></li>
</ul>
</details>
<details>
<summary>Maintainer changes</summary>
<p>This version was pushed to npm by <a href="https://www.npmjs.com/~evilebottnawi">evilebottnawi</a>, a new releaser for webpack since your current version.</p>
</details>
<br />


[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=webpack&package-manager=npm_and_yarn&previous-version=5.75.0&new-version=5.76.1)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)

Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it
- `@dependabot merge` will merge this PR after your CI passes on it
- `@dependabot squash and merge` will squash and merge this PR after your CI passes on it
- `@dependabot cancel merge` will cancel a previously requested merge and block automerging
- `@dependabot reopen` will reopen this PR if it is closed
- `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
- `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
- `@dependabot use these labels` will set the current labels as the default for future PRs for this repo and language
- `@dependabot use these reviewers` will set the current reviewers as the default for future PRs for this repo and language
- `@dependabot use these assignees` will set the current assignees as the default for future PRs for this repo and language
- `@dependabot use this milestone` will set the current milestone as the default for future PRs for this repo and language

You can disable automated security fix PRs for this repo from the [Security Alerts page](https://github.com/mageddo/dns-proxy-server/network/alerts).

</details>


Patch:
diff --git a/.github/workflows/actions-deploy.yml b/.github/workflows/actions-deploy.yml
index a75d6590..78553b81 100644
--- a/.github/workflows/actions-deploy.yml
+++ b/.github/workflows/actions-deploy.yml
@@ -114,7 +114,8 @@ jobs:
     runs-on: ${{ matrix.os }}
     strategy:
       matrix:
-        os: [macos-latest, windows-latest]
+        os: [windows-latest]
+        # disabling mac as the binary isn't working macos-latest, see #341
     env:
       APP_VERSION: ${{ needs.primary_release.outputs.APP_VERSION }}
     steps:
diff --git a/README.md b/README.md
index 6260719d..e5aad27c 100644
--- a/README.md
+++ b/README.md
@@ -27,7 +27,6 @@ or via docker looking at [Dockerhub images][3].
 
 Basic running it on Linux or Mac
 ```bash
-$ curl -s -L https://github.com/mageddo/dns-proxy-server/releases/download/3.11.0/dns-proxy-server-linux-amd64-3.11.0.tgz | tar -vzx &&\
 sudo ./dns-proxy-server
 ```
 
diff --git a/RELEASE-NOTES.md b/RELEASE-NOTES.md
index 9903347c..74f6e978 100644
--- a/RELEASE-NOTES.md
+++ b/RELEASE-NOTES.md
@@ -1,3 +1,12 @@
+## 3.12.1
+* Binding UDP server to anylocalhost just as TCP this way DPS can be used on any interface.
+* Disabling mac as the binary isn't working macos-latest, see #341
+* Fixing DPS network features startup
+
+## 3.12
+* Also configuring resolv.conf on Mac when in standalone mode
+* Fixing random failure on dns configs restore on MacOSX
+
 ## 3.11.0
 * Windows and MacOs binary releases (beta)
 
diff --git a/app/package-lock.json b/app/package-lock.json
index 17dceb8f..114f00c8 100644
--- a/app/package-lock.json
+++ b/app/package-lock.json
@@ -11142,9 +11142,9 @@
       "integrity": "sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w=="
     },
     "webpack": {
-      "version": "5.75.0",
-      "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.75.0.tgz",
-      "integrity": "sha512-piaIaoVJlqMsPtX/+3KTTO6jfvrSYgauFVdt8cr9LTHKmcq/AMd4mhzsiP7ZF/PGRNPGA8336jldh9l2Kt2ogQ==",
+      "version": "5.76.1",
+      "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.76.1.tgz",
+      "integrity": "sha512-4+YIK4Abzv8172/SGqObnUjaIHjLEuUasz9EwQj/9xmPPkYJy2Mh03Q/lJfSD3YLzbxy5FeTq5Uw0323Oh6SJQ==",
       "requires": {
         "@types/eslint-scope": "^3.7.3",
         "@types/estree": "^0.0.51",
diff --git a/build.gradle b/build.gradle
index 8d7e960c..10f3babb 100644
--- a/build.gradle
+++ b/build.gradle
@@ -33,6 +33,7 @@ dependencies {
   annotationProcessor("com.google.dagger:dagger-compiler:2.45")
   implementation("com.google.dagger:dagger:2.45")
 
+  implementation 'org.graalvm.sdk:graal-sdk:22.3.1'
   implementation('jakarta.enterprise:jakarta.enterprise.cdi-api:2.0.2')
   implementation('jakarta.ws.rs:jakarta.ws.rs-api:2.1.6')
   implementation('com.mageddo.commons:commons-lang:0.1.6')
diff --git a/builder.bash b/builder.bash
index 14e72619..9b6e7559 100755
--- a/builder.bash
+++ b/builder.bash
@@ -152,7 +152,7 @@ case $1 in
     # Generate link for generated docs versions
     versionsFile=docs/content/versions/_index.en.md
     { git ls-tree origin/gh-pages | grep -E -o '[0-9]+\.[0-9]+'; echo "${MINOR_VERSION}"; } |\
-    sort -h -r |\
+    sort -V -r |\
     while read -r v; do echo "* [${v}](http://mageddo.github.io/dns-proxy-server/${v})"; done |\
     cat >> $versionsFile
 
diff --git a/docker-compose-dev.yml b/docker-compose-dev.yml
index 5520d48b..5f9b37c8 100644
--- a/docker-compose-dev.yml
+++ b/docker-compose-dev.yml
@@ -1,26 +1,30 @@
 version: '3'
 services:
   backend:
-    image: openjdk:17-jdk
+    image: openjdk:19-jdk
     environment:
-      - MG_LOG_LEVEL=DEBUG
-      - MG_REGISTER_CONTAINER_NAMES=1
-#      - MG_RESOLVCONF=/host/etc/systemd/resolved.conf
+      MG_LOG_LEVEL: DEBUG
+      MG_DPS_NETWORK: true
+      MG_DPS_NETWORK_AUTO_CONNECT: true
+    #      - MG_LOG_LEVEL=DEBUG
+    #      - MG_REGISTER_CONTAINER_NAMES=1
+    #      - MG_RESOLVCONF=/host/etc/systemd/resolved.conf
     labels:
       - dps.container=true
     volumes:
-      - ./build:/app
+      - ./build/libs:/app
       - /var/run/docker.sock:/var/run/docker.sock
-      - /etc/systemd/:/host/etc/systemd/
+      - /etc/resolv.conf:/etc/resolv.conf
+    #      - /etc/systemd/:/host/etc/systemd/
     working_dir: /app
-    command: java -jar dns-proxy-server.jar
-#    ports:
-#      - "172.17.0.1:53:53/udp"
-#      - "192.168.0.128:53:53/udp"
-#      - "192.168.0.128:53:53/tcp"
-#      - "127.0.0.1:53:53/udp"
-#      - "127.0.0.1:53:53/tcp"
-    network_mode: host
+    command: java -jar dns-proxy-server-3.12.0-all.jar
+    #    ports:
+    #      - "172.17.0.1:53:53/udp"
+    #      - "192.168.0.128:53:53/udp"
+    #      - "192.168.0.128:53:53/tcp"
+    #      - "127.0.0.1:53:53/udp"
+    #      - "127.0.0.1:53:53/tcp"
+#    network_mode: host
 
   # https://github.com/gohugoio/hugo/releases/tag/v0.55.4
   docs:
diff --git a/docs/content/1-getting-started/_index.en.md b/docs/content/1-getting-started/_index.en.md
index 29160427..ede5cf4a 100755
--- a/docs/content/1-getting-started/_index.en.md
+++ b/docs/content/1-getting-started/_index.en.md
@@ -9,3 +9,4 @@ Redirecting to [running it][1] page ...
 <meta http-equiv="refresh" content="0; url={{%relref "1-getting-started/running-it/_index.md" %}}" />
 
 [1]: {{%relref "1-getting-started/running-it/_index.md" %}}
+
diff --git a/docs/content/1-getting-started/requirements/_index.en.md b/docs/content/1-getting-started/requirements/_index.en.md
index 7fd8bf8f..0f5755eb 100755
--- a/docs/content/1-getting-started/requirements/_index.en.md
+++ b/docs/content/1-getting-started/requirements/_index.en.md
@@ -5,9 +5,6 @@ weight: 2
 
 ### Requirements
 
-* Linux/Windows
+* Linux/Windows/Mac
 * Docker 1.9.x (Only if you run DPS using docker or want to solve docker containers hostname using DPS)
-
-### MAC Support
-Based on users feedback, DPS don't work on MAC, unfortunatly I don't have a MAC computer to work on that, 
-if you want to contribute please try to fix it then open a pull request, sorry for the inconvenience.
+* Jre 19+ (When running the jar version)
diff --git a/docs/content/1-getting-started/running-it/_index.en.md b/docs/content/1-getting-started/running-it/_index.en.md
index f1e20e31..627d81dc 100644
--- a/docs/content/1-getting-started/running-it/_index.en.md
+++ b/docs/content/1-getting-started/running-it/_index.en.md
@@ -7,6 +7,12 @@ weight: 1
 
 {{%children style="li"  %}}
 
+### Running as Service
+
+If you are using Docker on your machine I recommend to run DPS as a docker service,
+this way it will automatically be configured whenever you restart the machine,
+checkout the instructions for [Linux][6], [Mac][7] and [Windows][5]
+
 ### General Instructions
 The process to running DPS is basically the same for all platforms:
 
@@ -36,7 +42,7 @@ PING nginx.dev (172.17.0.4) 56(84) bytes of data.
 *Not supported on Windows
 
 
-## Running on Docker
+### Running on Docker
 
 You probably want to check on [specific running instructions][3] to configure all DPS features when running on docker,
 set as default DNS and docker container solving have different docker run options for each platform.
@@ -56,9 +62,13 @@ $ docker run --rm --hostname dns.mageddo -p 5380:5380 -p 127.0.0.1:53:53/udp def
 
 Runining on docker limitations:
 
-* You have to configure docker as default DNS [by yourself][3], you can check more [details here][4] for the reason
+* You have to configure docker as default DNS by yourself, check [specific instructions][3],
+to see how to do that you can check more [details here][4] for the reason.
 
 [1]: https://github.com/mageddo/dns-proxy-server/issues/326
 [2]: https://github.com/mageddo/dns-proxy-server/releases
 [3]: #specific-instructions
 [4]: {{%relref "2-features/auto-configuration-as-default-dns/_index.md#docker-limitations" %}}
+[5]: {{%relref "1-getting-started/running-it/windows/_index.md#running-as-docker-service" %}}
+[6]: {{%relref "1-getting-started/running-it/linux/_index.md#running-as-docker-service" %}}
+[7]: #
diff --git a/docs/content/1-getting-started/running-it/linux/_index.en.md b/docs/content/1-getting-started/running-it/linux/_index.en.md
index 4c41765a..8c8c6a45 100644
--- a/docs/content/1-getting-started/running-it/linux/_index.en.md
+++ b/docs/content/1-getting-started/running-it/linux/_index.en.md
@@ -3,9 +3,9 @@ title: Linux running instructions
 weight: 1
 ---
 
-### Running on Linux
+## Running on Linux
 
-#### Standalone run (Recommended)
+## Standalone run
 
 Download the [latest release][3], extract and run:
 ```bash
@@ -13,28 +13,19 @@ $ sudo ./dns-proxy-server
 ```
 Now DNS Proxy Server is your DNS server, to back everything to original state just press <kbd>CTRL</kbd> + <kbd>C</kbd>;
 
-#### On Docker
+[Click here][1] to see usage samples
 
-> Actually, I recommend you to run DPS using standalone method when you want DPS to be automatically configured as the
-> default DNS
+## Running as Docker Service
+
+If you are using docker on your machine that's the best choice as it will automatically start DPS on every boot:
 
 ```bash
-$ docker run --rm --hostname dns.mageddo --name dns-proxy-server -p 5380:5380 \
-  --network host \
+$ docker run --hostname dns.mageddo --restart=unless-stopped -d \
+  -p 5353:53 \
   -v /var/run/docker.sock:/var/run/docker.sock \
-  -v /etc/systemd/:/host/etc/systemd \
-  -v /etc/:/host/etc \
   defreitas/dns-proxy-server
 ```
-
-If you're using **system-resolved** then run command below to restart systemd-resolved service
-and make DPS as default DNS changes to take effect.
-
-```bash
-$ service systemd-resolved restart
-```
-
-Explaining:
+Explaining the running params:
 
 `--network host`: Running on host mode make it possible to DPS bind the
 DNS server port to the host network interface, this way all containers will have access to DPS address
@@ -43,9 +34,55 @@ If you don't want to use that option then you can consider use [DPS Network feat
 
 `/var/run/docker.sock`: Docker socket, so DPS can query the running containers and solve their IP when asked.
 
-`/etc/systemd/:/host/etc/systemd` / `/etc/:/host/etc`: Depending on your distro you may are using system-resolved or
-vanila resolv.conf to configure available DNS Servers, DPS will look at both and choose the best to be configured.
+`5353:53` publishing on port 5353 instead of 53 to evict port conflicts
+
+#### In case you do have `systemd-resolved` installed:
+
+You can run DPS on different port if you are having conflicts as system-resolved suports custom ports.
+But you will need to configure DPS as default DPS manually, check the instructions below:
+
+Get your local network card IP, to list available networks run:
+```bash
+$ ip addr
+1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
+    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
+    inet 127.0.0.1/8 scope host lo
+       valid_lft forever preferred_lft forever
+    inet6 ::1/128 scope host 
+       valid_lft forever preferred_lft forever
+2: eno1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
+    link/ether e0:d5:5f:b7:8a:1a brd ff:ff:ff:ff:ff:ff
+    altname enp0s31f6
+    inet 192.168.0.128/24 brd 192.168.0.255 scope global dynamic noprefixroute eno1
+       valid_lft 3011sec preferred_lft 3011sec
+```
+In my case the right Network is `en01` with  IP `192.168.0.128`,
+`127.0.0.1` will partially works because this way containers won't be able
+to solve each other, just the host solve the containers.
+
+Edit systemd-resolved conf file with the found IP
+```bash
+$ cat /etc/systemd/resolved.conf 
+...
+[Resolve]
+DNS=192.168.0.128:5353
+```
+
+Then restart the service:
+
+```bash
+$ service systemd-resolved restart
+```
+
+#### In case you don't have systemd-resolved installed:
+
+If you don't have systemd-resolved installed then you can volume resolv.conf with the option `-v /etc/:/host/etc` 
+when running the container but will need to publish DPS on port 53 instead of 5353,
+don't use that if you have systemd-resolved installed because it will cause docker DNS misconfiguration.
 
+#### Testing
+Once configured, [click here][1] to see usage samples.
 
+[1]: {{%relref "2-features/_index.md#main-features-use-cases" %}}
 [2]: {{%relref "2-features/dps-network-resolution/_index.md" %}}
 [3]: https://github.com/mageddo/dns-proxy-server/releases
diff --git a/docs/content/1-getting-started/running-it/mac/_index.en.md b/docs/content/1-getting-started/running-it/mac/_index.en.md
index 00b8167f..4634934a 100644
--- a/docs/content/1-getting-started/running-it/mac/_index.en.md
+++ b/docs/content/1-getting-started/running-it/mac/_index.en.md
@@ -2,25 +2,38 @@
 title: MacOSX running instructions
 weight: 1
 ---
+## Running on MAC
 
+DPS actually is fully supported on MAC knowing [docker limitation features][5].
 
-### Running on MAC
+## Running as Docker as service
 
-DPS actually is fully supported on MAC except by [docker limitation features][5]. Despite on this,
-there is no additional configuration to run DPS on Mac, you can do just like [on Linux](#running-on-linux).
+Running DPS as docker service
+```bash
+$ docker run -d -p 5380:5380 -p 53:53/udp -p 53:53/tcp --restart=unless-stopped \
+  -v /var/run/docker.sock:/var/run/docker.sock \
+  defreitas/dns-proxy-server
+```
+
+* Go to [configuring DPS as default DNS][7] to complete DPS configuration.
+* [Check this][1] for usage samples.
 
-Download the [latest release][3], extract and run:
+## Standalone run
+
+Download the [latest release][3] (I recomend the jar one), extract and run:
 ```bash
-$ sudo ./dns-proxy-server
+$ sudo java -jar ./dns-proxy-server
 ```
 
-When running on standalone mode (not on docker container) DPS will be able to auto-configure itself as OSX default DNS,
+[Check this][1] for usage samples.
+
+When running on standalone mode (not on docker container) DPS will be able to auto configure itself as OSX default DNS,
 after 5 seconds you see something like `usingDnsConfigurator=DnsConfiguratorOSx` at the logs.
 
-### Configuring DPS as default DNS manually
+## Configuring DPS as default DNS manually
 
-If by some reason it doesn't work or you want to configure it manually because are running DPS on a docker conainer,
-then check the instructions bellow:
+When not running in standalone mode you will need to configure DPS as default DPS manually,
+check the instructions below:
 
 To list available networks:
 ```bash
@@ -36,10 +49,13 @@ configured DNS server:
 $ networksetup -getdnsservers Wi-Fi
 There aren't any DNS Servers set on Wi-Fi. 
 ```
-If it returns some server IP then is a good idea to save it to restore the configurations later.
+If it returns some server IP then is a good idea to backup it then you can restore the configurations later.
+
+Let's set DPS as the default DNS Server, best option here is to get your network IP address, `Wi-Fi` in my case which
+has `192.168.0.14` set, `127.0.0.1` will partially works because this way containers won't be able 
+to solve each other, just the host solve the containers.
 
-Let's set DPS as the default DNS Server, you can get DPS IP by search for `Starting UDP server` at the starting logs,
-it's `192.168.0.14` in my case, remember you need to run DPS in port 53 as MAC doesn't accept custom port especification.
+**Obs**: Be aware you need to run DPS in port **53** as MAC doesn't accept custom port especification.
 
 ```bash
 $ networksetup -setdnsservers Wi-Fi 192.168.0.14
@@ -52,6 +68,8 @@ $ networksetup -setdnsservers Wi-Fi Empty
 
 See [this thread][6] with more use cases.
 
+[1]: {{%relref "2-features/_index.md#main-features-use-cases" %}}
 [3]: https://github.com/mageddo/dns-proxy-server/releases
 [5]: https://docs.docker.com/desktop/networking/#there-is-no-docker0-bridge-on-the-host
 [6]: https://github.com/mageddo/dns-proxy-server/issues/44#issuecomment-1454379761
+[7]: #configuring-dps-as-default-dns-manually
diff --git a/docs/content/1-getting-started/running-it/windows/_index.en.md b/docs/content/1-getting-started/running-it/windows/_index.en.md
index 284d6d6d..a48ee657 100644
--- a/docs/content/1-getting-started/running-it/windows/_index.en.md
+++ b/docs/content/1-getting-started/running-it/windows/_index.en.md
@@ -4,82 +4,90 @@ weight: 1
 ---
 
 ## Running on Windows
-You can run DPS on Windows host without any issues except by DPS isn't capable yet ([see backlog issue][4])
-to connect to docker API and solve containers.
+You can run DPS on Windows host without any issues except by DPS isn't capable yet
+to connect to docker API and solve containers ([see backlog issue][4]).
 
-### Standalone Run
-* Download the [latest release][5], currently only the jar binary is available for DPS, JRE 19+ is required.
-* Run dps by `java -jar dns-proxy-server.jar`
+## Running as Docker Service
 
-If you run DPS as administrator (using administrator prompt) then it will capable of configure itself as the [default DNS][6]
-or check instructions below of how to set DPS as default DNS manually.
-
-### Running on Docker
-DPS on Docker have one limitation, it won't be able to set itself as default DNS automatically (instructions below)
+1- If you are using docker on your machine that's the best choice as it will automatically start DPS on every boot:
 
-1. Start up DPS
 ```bash
-docker run --name dns-proxy-server -p 5380:5380 -p 53:53/udp \
-  -v /var/run/docker.sock:/var/run/docker.sock \ 
-  defreitas/dns-proxy-server
+$ docker run -d --restart=unless-stopped -p 53:53/udp -p 53:53/tcp -p 5380:5380 defreitas/dns-proxy-server
 ```
 
-2. Change your default internet adapter DNS to `127.0.0.1`
+2- Set DPS as the default DNS on Windows, check the instructions below on 
+(_Configure DPS as default DNS on Windows_) or [click here][7]
 
-* Press `Windows + R` and type `ncpa.cpl` then press **enter** or go to your network interfaces Window
-* Change your default internet adapter DNS to `127.0.0.1` by following the
-  pictures below
+3- Now you are able  to solve containers form local configuration, also network addresses keep solving as well
 
-![Screenshot](https://i.imgur.com/UAVUgLf.png?width=10pc&classes=shadow)
+```bash
+> nslookup dps-sample.dev
+Server:  UnKnown
+Address:  127.0.0.1
 
-Uncheck IPV6 because Windows can try to solve hostnames by using a IPV6 DNS server,
-then requests won't be sent to DPS, actually DPS doesn't support IPV6.
+Non-authoritative answer:
+Name:    dps-sample.dev
+Addresses:  192.168.0.254
+          192.168.0.254
 
-![Screenshot](https://i.imgur.com/DGPdFRD.png?width=10pc&classes=shadow)
+> nslookup acme.com
+Server:  UnKnown
+Address:  127.0.0.1
 
-![screenshot](https://i.imgur.com/EcZF6mG.png?width=10pc&classes=shadow)
+Non-authoritative answer:
+Name:    acme.com
+Address:  23.93.76.124
+```
 
-![Screenshot](https://i.imgur.com/0bxASqd.png?width=10pc&classes=shadow)
+You can access the GUI by the address http://localhost:5380/ , see [GUI Dashboard feature][8]
 
-#### Testing the DNS server
+## Standalone Run
+* Download the [latest release][5] for Windows
+* Run dps by `dns-proxy-server.exe`
 
-Starting some docker container and keeping it alive for DNS queries
+If you run DPS as administrator (using administrator prompt) then it will capable of configure itself as the [default DNS][6]
+or check instructions below of how to set DPS as default DNS manually.
 
-```bash
-$ docker run --rm --hostname nginx.dev.intranet \
-  -e 'HOSTNAMES=nginx2.dev.intranet,nginx3.dev.intranet' nginx
-```
+## Configure DPS as default DNS on Windows
 
-Solving the docker container hostname from Dns Proxy Server
+**1. Find the host network ip v4 address**
+
+You can also use `127.0.0.1` or if don't work your you try the following.
+On prompt command run `ipconfig` and get one of the ipv4 addresses, it's recommended to get the IP from the real
+network card, `192.168.0.128` in my case.
 
 ```bash
-$ nslookup nginx.dev.intranet
-Server:		172.22.0.6
-Address:	172.22.0.6#53
+> ipconfig
 
-Non-authoritative answer:
-Name:	debian.dev.intranet
-Address: 172.22.0.7
+Windows IP Configuration
+Ethernet adapter Ethernet:
+
+Connection-specific DNS Suffix  . : spo.virtua.com.br
+IPv4 Address. . . . . . . . . . . : 192.168.0.128
+Subnet Mask . . . . . . . . . . . : 255.255.255.0
+Default Gateway . . . . . . . . . : 192.168.0.1
 ```
 
-Google keep working was well
+**2. Change your default internet adapter DNS to IP got on the last step**
 
-```bash
-$ nslookup google.com
-Server:		172.22.0.6
-Address:	172.22.0.6#53
+* Press `Windows + R` and type `ncpa.cpl` then press **enter** or go to your network interfaces Window
+* Change your default internet adapter DNS to ip you get the last step `127.0.0.1` or `192.168.0.128` in my case
+by following the pictures below
 
-Non-authoritative answer:
-Name:	google.com
-Address: 172.217.29.206
-```
+![Screenshot](https://i.imgur.com/UAVUgLf.png?width=10pc&classes=shadow)
+
+Uncheck IPV6 because Windows can try to solve hostnames by using a IPV6 DNS server,
+then requests won't be sent to DPS, actually DPS doesn't support IPV6.
 
-Start the server at [custom port](#configure-your-dns) and solving from it
+![Screenshot](https://i.imgur.com/DGPdFRD.png?width=10pc&classes=shadow)
+
+![screenshot](https://i.imgur.com/EcZF6mG.png?width=10pc&classes=shadow)
+
+![Screenshot](https://i.imgur.com/0bxASqd.png?width=10pc&classes=shadow)
 
-```bash
-$ nslookup -port=8980 google.com 127.0.0.1
-```
 [1]: https://imgur.com/a/LlDH8AM
 [4]: https://github.com/mageddo/dns-proxy-server/issues/314
 [5]: https://github.com/mageddo/dns-proxy-server/releases
 [6]: {{%relref "2-features/auto-configuration-as-default-dns/_index.md" %}}
+[7]: #configure-dps-as-default-dns-on-windows
+[8]: {{%relref "2-features/gui/_index.md" %}}
diff --git a/docs/content/2-features/_index.en.md b/docs/content/2-features/_index.en.md
index 8a460172..695c8bbb 100755
--- a/docs/content/2-features/_index.en.md
+++ b/docs/content/2-features/_index.en.md
@@ -3,14 +3,63 @@ title: Features
 weight: 2
 pre: "<b>2. </b>"
 ---
-### Features
+## Features
 
 {{%children style="li"  %}}
 
-### DNS resolution order
+## Main features use cases
+
+Solving container hostname
+```bash
+$ nslookup dns.mageddo
+Server:         127.0.0.53
+Address:        127.0.0.53#53
+
+Non-authoritative answer:
+Name:   dns.mageddo
+Address: 172.157.5.1
+```
+
+Solving host machine IP
+```bash
+$ nslookup host.docker
+Server:         127.0.0.53
+Address:        127.0.0.53#53
+
+Non-authoritative answer:
+Name:   host.docker
+Address: 172.157.5.1
+```
+
+Solving from Internet
+```bash
+$ nslookup acme.com
+Server:         127.0.0.53
+Address:        127.0.0.53#53
+
+Non-authoritative answer:
+Name:   acme.com
+Address: 23.93.76.124
+```
+
+Solving from local database
+```bash
+$ nslookup dps-sample.dev
+Server:         127.0.0.53
+Address:        127.0.0.53#53
+
+Non-authoritative answer:
+Name:   dps-sample.dev
+Address: 192.168.0.254
+```
+
+Access the gui by using http://localhost:5380 , see [this link][1].
+
+## DNS resolution order
 **DPS** follow the below order to solve hostnames
 
 * Try to solve the hostname from **docker** containers
 * Then from local database file
 * Then from 3rd configured remote DNS servers
 
+[1]: {{%relref "2-features/gui/_index.md" %}}
diff --git a/docs/content/5-developing/_index.en.md b/docs/content/4-developing/_index.en.md
similarity index 96%
rename from docs/content/5-developing/_index.en.md
rename to docs/content/4-developing/_index.en.md
index ac993db1..f5e04028 100644
--- a/docs/content/5-developing/_index.en.md
+++ b/docs/content/4-developing/_index.en.md
@@ -1,5 +1,5 @@
 ---
-title: Developing at the project
+title: Developing
 weight: 5
 pre: "<b>5. </b>"
 ---
diff --git a/docs/content/4-compiling/_index.en.md b/docs/content/4-developing/compiling.en.md
similarity index 100%
rename from docs/content/4-compiling/_index.en.md
rename to docs/content/4-developing/compiling.en.md
diff --git a/docs/content/6-generating-docs/_index.en.md b/docs/content/4-developing/generating-docs.en.md
similarity index 100%
rename from docs/content/6-generating-docs/_index.en.md
rename to docs/content/4-developing/generating-docs.en.md
diff --git a/docs/content/5-tutorials/_index.en.md b/docs/content/5-tutorials/_index.en.md
new file mode 100644
index 00000000..b9a160eb
--- /dev/null
+++ b/docs/content/5-tutorials/_index.en.md
@@ -0,0 +1,20 @@
+---
+title: Tutorials
+weight: 4
+pre: "<b>4. </b>"
+---
+
+## Tutorials
+
+{{%children style="li"  %}}
+
+* [Click here][1] to see a set of pratical samples using docker and docker-compose
+
+## 3rd Tutorials
+
+* [Resolve Docker Container From Host - @Ankur][2]
+
+<_Contribute by opening a Pull Request and link a DPS tutorial here_>
+
+[1]: https://github.com/mageddo/dns-proxy-server/tree/master/examples
+[2]: https://medium.com/opstree-technology/resolve-docker-container-from-host-fbb2a43a5d80
diff --git a/docs/content/5-tutorials/docker-reverse-proxy.en.md b/docs/content/5-tutorials/docker-reverse-proxy.en.md
new file mode 100644
index 00000000..1e639735
--- /dev/null
+++ b/docs/content/5-tutorials/docker-reverse-proxy.en.md
@@ -0,0 +1,121 @@
+---
+title: Configuring a Service Discovery solution on Docker using DNS Proxy Server and NGINX
+menuTitle: Create a Service Discovery solution
+---
+
+##### Requirements
+* DPS already configured, [see the docs][4] if you haven't yet.
+
+##### Tested on: 
+
+* DPS 3.11
+* OS: Mac, Linux
+
+#### Introducing
+
+You will see how to develop with docker containers solving them by hostnames from your host machine
+as the following picture shows:
+
+![](https://i.imgur.com/wr9GSeR.png) 
+
+if you know about DPS you will figure out that's a very basic DPS feature and you don't need complex configurations to
+achieve that, except on MAC and Windows as docker runs its containers on a virtual machine so
+DPS default feature to solve containers names will work but the solved IPs are worthless because they aren't 
+accessible from the host.
+
+To fix that we will configure an API Gateway, Service Discovery, Reverse Proxy solution combining DPS with Nginx,
+see final solution below:
+
+> Obs: This tutorial won't work on Windows yet because containers solving is not support yet,
+> follow the [feature request issue][1] on github.
+
+![][2]
+Source: [excalidraw][3]
+
+### Configuring 
+The pratice is simpler than the theory, let's get it working: 
+
+Configuring Nginx reverse proxy and two web apps for test
+```bash
+$ git clone https://github.com/mageddo/dns-proxy-server.git
+$ cd examples/api-gateway_service-discovery_reverse-proxyame-compose-file
+$ docker-compose up --build
+```
+
+`docker-compose up` created three containers, the first is a nginx reverse proxy which will listen to the host machine
+80 port and two others are web apps which the reverse proxy will proxy to depending on the hostname queried.
+
+Reverse Proxy will listen all `.webapp` hostnames and proxy to `.container` containers.  
+See [docker-compose.yml][5] for more details about each docker service. 
+
+The final step is to configure a wildcard to handle when something on the host queries for `.webapp`:
+
+![][6]
+
+### Testing
+
+#### From the hostname
+
+Web app 1 is working:
+```bash
+$ curl -i -X GET http://web-app.webapp
+HTTP/1.1 200 OK
+Server: nginx/1.23.3
+Date: Thu, 16 Mar 2023 03:18:53 GMT
+Content-Type: text/html
+Content-Length: 37
+Connection: keep-alive
+Last-Modified: Thu, 16 Mar 2023 02:35:50 GMT
+ETag: "64128086-25"
+Accept-Ranges: bytes
+
+<h1>Hello World from web-app!!!</h1>
+```
+
+Web app 2 is also working:
+```bash
+$ curl -i -X GET http://web-app-2.webapp
+HTTP/1.1 200 OK
+Server: nginx/1.23.3
+Date: Thu, 16 Mar 2023 03:30:19 GMT
+Content-Type: text/html
+Content-Length: 615
+Connection: keep-alive
+Last-Modified: Tue, 13 Dec 2022 15:53:53 GMT
+ETag: "6398a011-267"
+Accept-Ranges: bytes
+
+<!DOCTYPE html>
+<html>
+<head>
+<title>Welcome to nginx!</title>
+...
+```
+
+#### Apps can also access each other by its hostname
+No reverse proxy is necessary here, so you can connect a web-app to a database container by its hostname for example.
+
+web-app-1 connecting to web-app-2
+```bash
+$ docker-compose run web-app curl -I web-app-2.webapp.container
+HTTP/1.1 200 OK
+Server: nginx/1.23.3
+Date: Thu, 16 Mar 2023 03:55:02 GMT
+Content-Type: text/html
+Content-Length: 615
+Last-Modified: Tue, 13 Dec 2022 15:53:53 GMT
+Connection: keep-alive
+```
+
+
+That's all, if you have any contribution or question feel free to open a pull request or an issue on the Github repo,
+thanks for reading.
+
+> Service Discovery, API Gateway, Service Discovery, Reverse Proxy
+
+[1]: https://github.com/mageddo/dns-proxy-server/issues/314
+[2]: https://i.imgur.com/poI0sKZ.png
+[3]: https://excalidraw.com/#json=BuYYx179GhmvHCexDZHGv,2hN_IgZo9HTfID-neSACQw
+[4]: {{%relref "1-getting-started/running-it/_index.md" %}}
+[5]: https://github.com/mageddo/dns-proxy-server/blob/master/examples/api-gateway_service-discovery_reverse-proxy/docker-compose.yml
+[6]: https://i.imgur.com/xRrk2Mk.png
diff --git a/docs/content/api/_index.en.md b/docs/content/api/_index.en.md
index c5297bed..0284ee57 100644
--- a/docs/content/api/_index.en.md
+++ b/docs/content/api/_index.en.md
@@ -1,7 +1,7 @@
 ---
 title: API
-weight: 7
-pre: "<b>7. </b>"
+weight: 6
+pre: "<b>6. </b>"
 ---
 
 ### APIs
diff --git a/docs/content/versions/_index.en.md b/docs/content/versions/_index.en.md
index 66fcb8a0..eb096210 100644
--- a/docs/content/versions/_index.en.md
+++ b/docs/content/versions/_index.en.md
@@ -1,7 +1,7 @@
 ---
 title: Versions
-weight: 8
-pre: "<b>8. </b>"
+weight: 7
+pre: "<b>7. </b>"
 ---
 
 * [latest](http://mageddo.github.io/dns-proxy-server/latest)
diff --git a/examples/api-gateway_service-discovery_reverse-proxy/Dockerfile b/examples/api-gateway_service-discovery_reverse-proxy/Dockerfile
new file mode 100644
index 00000000..b50b050c
--- /dev/null
+++ b/examples/api-gateway_service-discovery_reverse-proxy/Dockerfile
@@ -0,0 +1,5 @@
+FROM nginx:1.23
+COPY nginx/reverse-proxy.conf /etc/nginx/conf.d/default.conf
+COPY nginx/nginx.conf /etc/nginx/nginx.conf
+COPY nginx/entrypoint.sh /app/entrypoint.sh
+ENTRYPOINT /app/entrypoint.sh
diff --git a/examples/api-gateway_service-discovery_reverse-proxy/docker-compose.yml b/examples/api-gateway_service-discovery_reverse-proxy/docker-compose.yml
new file mode 100644
index 00000000..2276db5e
--- /dev/null
+++ b/examples/api-gateway_service-discovery_reverse-proxy/docker-compose.yml
@@ -0,0 +1,25 @@
+version: '2'
+services:
+
+  # Nginx Reverse Proxy which will listen at host machine and forward the
+  # request to the web-app container depending
+  # on the requested hostname.
+  # this app will reverse proxy all host names which connects to its 80 port querying in ${host}.container format.
+  # ex: web-app.webapp will be proxied to a container with the name: web-app.webapp.container
+  reverse-proxy:
+    build:
+      context: .
+      dockerfile: Dockerfile
+    ports:
+      - ':80:80'
+
+  # Sample web app which listen a custom HTML file and registered itself as web-app.webapp.container
+  web-app:
+    image: nginx:1.23
+    hostname: web-app.webapp.container
+    volumes:
+      - ./index.html:/usr/share/nginx/html/index.html
+
+  web-app-2:
+    image: nginx:1.23
+    hostname: web-app-2.webapp.container
diff --git a/examples/api-gateway_service-discovery_reverse-proxy/index.html b/examples/api-gateway_service-discovery_reverse-proxy/index.html
new file mode 100644
index 00000000..949b5412
--- /dev/null
+++ b/examples/api-gateway_service-discovery_reverse-proxy/index.html
@@ -0,0 +1,1 @@
+<h1>Hello World from web-app!!!</h1>
diff --git a/examples/api-gateway_service-discovery_reverse-proxy/nginx/README.md b/examples/api-gateway_service-discovery_reverse-proxy/nginx/README.md
new file mode 100644
index 00000000..4676b988
--- /dev/null
+++ b/examples/api-gateway_service-discovery_reverse-proxy/nginx/README.md
@@ -0,0 +1,3 @@
+Read the tutorial at [this link][1]
+
+[1]: http://mageddo.github.io/dns-proxy-server/latest/en/5-tutorials/docker-reverse-proxy/
diff --git a/examples/api-gateway_service-discovery_reverse-proxy/nginx/entrypoint.sh b/examples/api-gateway_service-discovery_reverse-proxy/nginx/entrypoint.sh
new file mode 100755
index 00000000..c139085a
--- /dev/null
+++ b/examples/api-gateway_service-discovery_reverse-proxy/nginx/entrypoint.sh
@@ -0,0 +1,14 @@
+#!/bin/bash
+
+export NAMESERVER=`cat /etc/resolv.conf | grep "^nameserver" | awk '{print $2}' | tr '\n' ' '`
+echo "> setup dns server $NAMESERVER"
+
+CONFIG_FILE=/etc/nginx/nginx.conf
+CONFIG_FILE_TPL=/etc/nginx/nginx.conf.tpl
+cp ${CONFIG_FILE} ${CONFIG_FILE_TPL}
+
+envsubst '${NAMESERVER}'  <${CONFIG_FILE_TPL} >${CONFIG_FILE}
+echo "> configured: $(cat $CONFIG_FILE)"
+echo "> starting nginx server"
+
+exec nginx -g 'daemon off;'
diff --git a/examples/api-gateway_service-discovery_reverse-proxy/nginx/nginx.conf b/examples/api-gateway_service-discovery_reverse-proxy/nginx/nginx.conf
new file mode 100644
index 00000000..621c8eb1
--- /dev/null
+++ b/examples/api-gateway_service-discovery_reverse-proxy/nginx/nginx.conf
@@ -0,0 +1,35 @@
+
+user  nginx;
+worker_processes  auto;
+
+error_log  /var/log/nginx/error.log notice;
+pid        /var/run/nginx.pid;
+
+
+events {
+    worker_connections  1024;
+}
+
+
+http {
+
+    resolver ${NAMESERVER}  ipv6=off valid=5s;
+
+    include       /etc/nginx/mime.types;
+    default_type  application/octet-stream;
+
+    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
+                      '$status $body_bytes_sent "$http_referer" '
+                      '"$http_user_agent" "$http_x_forwarded_for"';
+
+    access_log  /var/log/nginx/access.log  main;
+
+    sendfile        on;
+    #tcp_nopush     on;
+
+    keepalive_timeout  65;
+
+    #gzip  on;
+
+    include /etc/nginx/conf.d/*.conf;
+}
diff --git a/examples/api-gateway_service-discovery_reverse-proxy/nginx/reverse-proxy.conf b/examples/api-gateway_service-discovery_reverse-proxy/nginx/reverse-proxy.conf
new file mode 100644
index 00000000..e845d186
--- /dev/null
+++ b/examples/api-gateway_service-discovery_reverse-proxy/nginx/reverse-proxy.conf
@@ -0,0 +1,17 @@
+# server {
+#     listen 443;
+#     server_name _;
+#     return 301 http://$server_name$request_uri;
+# }
+
+server {
+
+  listen       80;
+  listen  [::]:80;
+  server_name  localhost;
+
+  location / {
+    proxy_pass "http://${host}.container";
+  }
+
+}
diff --git a/gradle.properties b/gradle.properties
index 44e1c4ac..72bc992c 100644
--- a/gradle.properties
+++ b/gradle.properties
@@ -1,1 +1,1 @@
-version=3.11.0
+version=3.12.1
diff --git a/src/main/java/com/mageddo/dnsproxyserver/di/StartupEvent.java b/src/main/java/com/mageddo/dnsproxyserver/di/StartupEvent.java
index 4e7f32e3..0cd5fa9c 100644
--- a/src/main/java/com/mageddo/dnsproxyserver/di/StartupEvent.java
+++ b/src/main/java/com/mageddo/dnsproxyserver/di/StartupEvent.java
@@ -1,7 +1,5 @@
 package com.mageddo.dnsproxyserver.di;
 
-import dagger.Module;
-
 public interface StartupEvent {
   void onStart();
 }
diff --git a/src/main/java/com/mageddo/dnsproxyserver/di/module/ModuleStartup.java b/src/main/java/com/mageddo/dnsproxyserver/di/module/ModuleStartup.java
index 8e0cf38b..ffc395d0 100644
--- a/src/main/java/com/mageddo/dnsproxyserver/di/module/ModuleStartup.java
+++ b/src/main/java/com/mageddo/dnsproxyserver/di/module/ModuleStartup.java
@@ -2,15 +2,22 @@ package com.mageddo.dnsproxyserver.di.module;
 
 import com.mageddo.dnsproxyserver.di.StartupEvent;
 import com.mageddo.dnsproxyserver.dnsconfigurator.DnsConfigurators;
-import dagger.Binds;
+import com.mageddo.dnsproxyserver.docker.EventListener;
 import dagger.Module;
-import dagger.multibindings.IntoSet;
+import dagger.Provides;
+import dagger.multibindings.ElementsIntoSet;
+
+import javax.inject.Singleton;
+import java.util.Set;
 
 @Module
 public interface ModuleStartup {
 
-  @Binds
-  @IntoSet
-  StartupEvent startupBeans(DnsConfigurators b1);
+  @Provides
+  @Singleton
+  @ElementsIntoSet
+  static Set<StartupEvent> startupBeans(DnsConfigurators b1, EventListener b2){
+    return Set.of(b1, b2);
+  }
 
 }
diff --git a/src/main/java/com/mageddo/dnsproxyserver/dnsconfigurator/DnsConfiguratorOSX.java b/src/main/java/com/mageddo/dnsproxyserver/dnsconfigurator/DnsConfiguratorOSX.java
index d1f02ed5..887757a4 100644
--- a/src/main/java/com/mageddo/dnsproxyserver/dnsconfigurator/DnsConfiguratorOSX.java
+++ b/src/main/java/com/mageddo/dnsproxyserver/dnsconfigurator/DnsConfiguratorOSX.java
@@ -1,5 +1,6 @@
 package com.mageddo.dnsproxyserver.dnsconfigurator;
 
+import com.mageddo.dnsproxyserver.dnsconfigurator.linux.DnsConfiguratorLinux;
 import com.mageddo.dnsproxyserver.server.dns.IpAddr;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
@@ -14,15 +15,17 @@ import javax.inject.Singleton;
 public class DnsConfiguratorOSX implements DnsConfigurator {
 
   private final DnsConfiguratorDefault configuratorDefault;
-//  private final DnsConfiguratorLinux configuratorLinux; // todo also use linux configurator to configure resolvconf
+  private final DnsConfiguratorLinux configuratorLinux;
 
   @Override
   public void configure(IpAddr addr) {
     this.configuratorDefault.configure(addr);
+    this.configuratorLinux.configure(addr);
   }
 
   @Override
   public void restore() {
     this.configuratorDefault.restore();
+    this.configuratorLinux.restore();
   }
 }
diff --git a/src/main/java/com/mageddo/dnsproxyserver/server/dns/UDPServerPool.java b/src/main/java/com/mageddo/dnsproxyserver/server/dns/UDPServerPool.java
index 3902bc57..cb7f220b 100644
--- a/src/main/java/com/mageddo/dnsproxyserver/server/dns/UDPServerPool.java
+++ b/src/main/java/com/mageddo/dnsproxyserver/server/dns/UDPServerPool.java
@@ -1,6 +1,5 @@
 package com.mageddo.dnsproxyserver.server.dns;
 
-import com.mageddo.net.Networks;
 import com.mageddo.dnsproxyserver.utils.Ips;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
@@ -9,6 +8,7 @@ import javax.inject.Inject;
 import javax.inject.Singleton;
 import java.net.SocketAddress;
 import java.util.ArrayList;
+import java.util.Collections;
 import java.util.List;
 import java.util.stream.Collectors;
 
@@ -21,12 +21,8 @@ public class UDPServerPool {
   private List<UDPServer> servers = new ArrayList<>();
 
   public void start(int port) {
-    this.servers = Networks
-      .findMachineIps()
-      .stream()
-      .map(it -> new UDPServer(Ips.toSocketAddress(it.raw(), port), this.requestHandler))
-      .peek(UDPServer::start)
-      .toList();
+    this.servers = Collections.singletonList(new UDPServer(Ips.getAnyLocalAddress(port), this.requestHandler));
+    this.servers.forEach(UDPServer::start);
     final var addresses = this.servers
       .stream()
       .map(UDPServer::getAddress)
@@ -37,8 +33,8 @@ public class UDPServerPool {
 
   public void stop() {
     this.servers
-        .parallelStream()
-        .forEach(UDPServer::stop)
+      .parallelStream()
+      .forEach(UDPServer::stop)
     ;
   }
 }
diff --git a/src/main/java/com/mageddo/dnsproxyserver/utils/Ips.java b/src/main/java/com/mageddo/dnsproxyserver/utils/Ips.java
index 3f3d1312..342fe5c6 100644
--- a/src/main/java/com/mageddo/dnsproxyserver/utils/Ips.java
+++ b/src/main/java/com/mageddo/dnsproxyserver/utils/Ips.java
@@ -51,4 +51,8 @@ public class Ips {
       return null;
     }
   }
+
+  public static InetSocketAddress getAnyLocalAddress(int port) {
+    return new InetSocketAddress(getAnyLocalAddress(), port);
+  }
 }
diff --git a/src/main/java/com/mageddo/net/osx/NetworkOSX.java b/src/main/java/com/mageddo/net/osx/NetworkOSX.java
index d04d18e1..504dee7f 100644
--- a/src/main/java/com/mageddo/net/osx/NetworkOSX.java
+++ b/src/main/java/com/mageddo/net/osx/NetworkOSX.java
@@ -17,6 +17,6 @@ public class NetworkOSX implements Network {
 
   @Override
   public List<String> findNetworkDnsServers(String network) {
-    return Networks.findNetworkDnsServersOrNull(network);
+    return Networks.findNetworkDnsServersOrEmpty(network);
   }
 }
diff --git a/src/main/java/com/mageddo/net/osx/Networks.java b/src/main/java/com/mageddo/net/osx/Networks.java
index d3cced9b..450bf33a 100644
--- a/src/main/java/com/mageddo/net/osx/Networks.java
+++ b/src/main/java/com/mageddo/net/osx/Networks.java
@@ -2,6 +2,7 @@ package com.mageddo.net.osx;
 
 import com.mageddo.commons.exec.CommandLines;
 import com.mageddo.commons.exec.ExecutionValidationFailedException;
+import com.mageddo.commons.lang.Objects;
 import org.apache.commons.lang3.StringUtils;
 
 import java.util.Collections;
@@ -40,6 +41,10 @@ public class Networks {
       .toList();
   }
 
+  public static List<String> findNetworkDnsServersOrEmpty(String networkName) {
+    return Objects.firstNonNull(findNetworkDnsServersOrNull(networkName), Collections.emptyList());
+  }
+
   /**
    * @return the configured dns servers or null when network service is disabled or not available.
    */


Test patch:
diff --git a/src/test/java/com/mageddo/dnsproxyserver/docker/EventListenerCompTest.java b/src/test/java/com/mageddo/dnsproxyserver/docker/EventListenerCompTest.java
new file mode 100644
index 00000000..26b06d39
--- /dev/null
+++ b/src/test/java/com/mageddo/dnsproxyserver/docker/EventListenerCompTest.java
@@ -0,0 +1,35 @@
+package com.mageddo.dnsproxyserver.docker;
+
+import com.mageddo.dnsproxyserver.di.Context;
+import com.mageddo.dnsproxyserver.di.StartupEvent;
+import dagger.sheath.junit.DaggerTest;
+import org.junit.jupiter.api.Test;
+
+import javax.inject.Inject;
+import java.util.Objects;
+import java.util.Set;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+
+@DaggerTest(component = Context.class)
+class EventListenerCompTest {
+
+  @Inject
+  Set<StartupEvent> events;
+
+  @Test
+  void mustConfigureNetworkEventListener(){
+
+    // arrange
+
+    // act
+    final var size = this.events
+        .stream()
+        .filter(it -> Objects.equals(EventListener.class, it.getClass()))
+        .count();
+
+    // assert
+    assertEquals(1, size);
+
+  }
+}