set up local DNS using Pi-hole + nginx + audiobookshelf
-
I'm trying to set up local DNS using Pi-hole.
I have successfully set up Pi-hole and added a local DNS record
local.com
, pointing it to the server running the Pi-hole container192.168.0.101
.Then I set up the Audiobookshelf container using the guide from Audiobookshelf, where I set up Nginx Proxy Manager with the following compose file:
services: nginx-proxy-manager: image: docker.io/jc21/nginx-proxy-manager:latest container_name: nginx-proxy-manager ports: - 80:80 - 443:443 - 81:81 volumes: - ./data:/data - ./letsencrypt:/etc/letsencrypt restart: unless-stopped
And Audiobookshelf with the following compose file:
services: audiobookshelf: image: ghcr.io/advplyr/audiobookshelf:latest container_name: audiobookshelf volumes: - ./audiobooks:/audiobooks - ./podcasts:/podcasts - ./metadata:/metadata - ./config:/config restart: unless-stopped networks: nginx: name: nginx-proxy-manager_default external: true
I did not specify a port, hoping that Nginx could manage it.
Then I set up Nginx Proxy Manager following the guide from Audiobookshelf by adding a proxy host.
Trying to resolveI simply followed the guide and wasn’t sure why the “Forward Hostname / IP” should be the container nameaudiobookshelf.local.com
toaudiobookshelf
.I also created a self-signed certificate.
But I cannot access
https://audiobookshelf.local.com/
orhttp://audiobookshelf.local.com/
(it automatically forwards to HTTPS).
I tried adding a local DNS record:
audiobookshelf.local.com
→192.168.0.101
in Pi-hole.
Now, when I accessaudiobookshelf.local.com
, the site shows:
502 Bad Gateway – openresty
I think the problem lies in the Docker network setup. I suspect the Audiobookshelf Docker container is not communicating with Nginx.
Would appreciate any help!
In the compose file for Audiobookshelf, you need to add the service itself to the network you defined at the bottom. Something like:
services: audiobookshelf: ... networks: - default - nginx
(The
default
network is to keep it in the network that is created ondocker compose up
). -
I can't be certain here that the network configuration you've supplied will allow nginx to connect to audiobookshelf. If I were you I'd create a named docker network and connect both npm and audiobookshelf to it as described in their best practice documentation: https://nginxproxymanager.com/advanced-config/#best-practice-use-a-docker-network
A 503 indicates that NPM can't see the service you're trying to proxy to.
Thank you! Can you also explain the difference between
networks: default: external: true name: scoobydoo
and
networks: scoobydoo: external: true
-
Thank you! Can you also explain the difference between
networks: default: external: true name: scoobydoo
and
networks: scoobydoo: external: true
default
in this example is the actual name of the network, in this case we're modifying the default network.external: true
declares that the network has already been created,name: scoobydoo
is a way of customizing the name of the default network. -
thank you!
I have added
ports: - 13378:80
in audiobookshelf docker compose and changed npm settings
But it still gives me the same 502 Bad Gateway error.
You're missing the networks section in your audiobookshelf service definition - add
networks: [nginx]
to your audiobookshelf service to actually connect it to the network (just defining the network at the bottom doesn't automatically attach your service to it, which is why npm can't reach it and gives you that 502 error), and if you're an audiobook fan you might wanna check out the soundleaf app for ios which works great with audiobookshelf. -
In the compose file for Audiobookshelf, you need to add the service itself to the network you defined at the bottom. Something like:
services: audiobookshelf: ... networks: - default - nginx
(The
default
network is to keep it in the network that is created ondocker compose up
).thank you! this works!
-
Both your containers need share at least one network. It looks like have created a external network. Good job.
The next step is to configure your container to join the network. Do something like this:services: nginx-proxy-manager: .... networks: - nginx-proxy-manager_default # or just nginx ... networks: nginx: name: nginx-proxy-manager_default external: true
Don't forget to also add the network in your audiobookshelf service.
Maybe this helps: https://docs.docker.com/compose/how-tos/networking/#use-an-existing-network
thank you! this works!
-
Are you sure both containers (npm and audiobookshelf) are in the same network? I see you don't specify the network in the NPM compose file.
Check that like this:
$ docker inspect container-name| grep -A3 Networks "Networks": { "network_name": { "IPAMConfig": null, "Links": null,
See if both your containers are in the same network - they should be.
thank you problem solved!
-
Based on you screenshot from the NPM Dashboard there seems to be something wrong. In the setup window you show that you forward the traffic with http and port 80, in the dashboard screenshot you forward the traffic with https and port 80.
Just skip http and self signed certificates all together. Modern Browsers make it a pain to use non https sites.
A simple domain setup with dns acme challenge is a little bit of a hassle but worth the hour(s) of invested time. Especially with npm were it is a set and forget option.Does pihole support wildcard dns entries yet? To my knowledge the gui only supports single entries so that you have to enter every subdomain manually in pihole that you want to have forwarded. Workaround would be to use a dnsmasq config file or use something else like addguard.
no I don't think pi-hole supports wild card dns, how do you deal with this issue? do you simply use addguard?
-
You're missing the networks section in your audiobookshelf service definition - add
networks: [nginx]
to your audiobookshelf service to actually connect it to the network (just defining the network at the bottom doesn't automatically attach your service to it, which is why npm can't reach it and gives you that 502 error), and if you're an audiobook fan you might wanna check out the soundleaf app for ios which works great with audiobookshelf.thank you! this works!
-
default
in this example is the actual name of the network, in this case we're modifying the default network.external: true
declares that the network has already been created,name: scoobydoo
is a way of customizing the name of the default network.thanks a lot!
-
I don’t see an immediate issue but I do see some general issues.
Unless you own local.com, don’t use it.
While you could use .local as your tld, I wouldn’t do that either. You can buy a domain name for cheap and really that’s the way to go.
Also, reference your FQDN and not your hostname. Don’t expect hosts to fill in the blanks.
changed it! thanks a lot!
-
Start a console on NPM. See if you can curl or wget the target.
Start with IPs and ports. Then move to DNS.
NPM's configuration never felt terribly comfortable to me.
Another common problem is to unintentionally set your container up where URLs require SSL. When you hit the container page the URL call backs can end up with HTTPS.
thanks a lot problem solved
-
no I don't think pi-hole supports wild card dns, how do you deal with this issue? do you simply use addguard?
I switched to adguard, yes. But you can just give pi-hole a dnsmasq config file. The underlying dns server Pi-Hole uses does support those.
Just mount the file via a docker volume. I will have to look up the exact paths. Config would look like
address=/domain.tld/192.168.0.1
-
I switched to adguard, yes. But you can just give pi-hole a dnsmasq config file. The underlying dns server Pi-Hole uses does support those.
Just mount the file via a docker volume. I will have to look up the exact paths. Config would look like
address=/domain.tld/192.168.0.1
thanks a lot