Skip to content

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.