Docker containers behind NPM proxy
Setup for docker container behind Nginix Proxy Manager reverse proxy not exposing docker container ports.
First step is to create docker network. Either in Portainer -> Networks -> Add Network or
# network name will be proxy
docker network create proxy
In this example, i have created NPM container and Trilium container via Portainer Stack (docker-compose). It can be done other ways as well, important is network part and not exposing ports for Trilium.
services:
npm:
container_name: npm
image: 'jc21/nginx-proxy-manager:2.12.3'
restart: unless-stopped
# Reverse proxy needs to have ports exposed.
ports:
- '80:80'
- '81:81'
- '443:443'
volumes:
- /var/volumes/nginix/:/data
- /var/volumes/nginix/letsencrypt:/etc/letsencrypt
trilium:
# container name will be used later as domain name in NPM
container_name: trilium
image: zadam/trilium
restart: always
# No ports exposed for Trilium, as below rows are commented.
# ports:
# - "8080:8080"
volumes:
- /var/volumes/trilium:/home/node/trilium-data
volumes:
trilium:
# Adding both containers to same network. As network is already existing, external flag is required.
networks:
network:
name: proxy
external: true
Now stack can be deployed.
This example is completelly done in my local network only, nothing is exposed outside to public internet. For DNS purposes, i am using piHole.
One DNS A record and one CNAME record is required for this to be working. This can be create under Local DNS.
A record

CNAME record

Last step to be done in NPM web interface.
From Dashboard -> Proxy hosts -> Add proxy host

trilium.testvm.sk is CNAME record created in piHole. Forward hostname is name of container defined in Stack. 8080 is port that Trilium is exposing from container.
Now, everything should be working fine and container is accessible via hostname.
