Setting up Nginx Proxy Manager with Docker Compose

Self-Hosting Oct 26, 2020

What we'll do:

  • Install docker
  • Setup Nginx Proxy Manager

This guide is aimed at Ubuntu/Debian systems.

Why:
To run multiple services over the same port a reverse proxy service is required. Nginx Proxy Manager is a WebUI frontend for the popular Nginx Reverse Proxy.

To get a good understanding of how a reverse proxy works, it would be worth setting up Nginx without the WebUI.

As Nginx Proxy Manager is running within a docker container you will get slower speeds compared to running Nginx on the host.


Install

  1. Update Linux
    sudo apt update && sudo apt upgrade
  1. Install docker
    Ubuntu: https://docs.docker.com/engine/install/ubuntu/
    Debian: https://docs.docker.com/engine/install/debian/
  1. Install docker-compose
    sudo apt install docker-compose
  1. Create docker network
    This will allow us to set static IP's for the docker containers.
    sudo docker network create --driver=bridge --subnet=10.10.10.0/24 --gateway=10.10.10.1 dockernet
  1. Create directorys to store the volumes within.
    cd - Go to home dir
    sudo mkdir nginxmanager
    cd nginxmanager
    sudo mkdir data
    sudo mkdir letsencrypt
    sudo mkdir sql
  1. Create docker-compose.yaml file
    sudo nano docker-compose.yaml

Use the following template:

version: "3"
services:
  app:
    image: jc21/nginx-proxy-manager:2
    restart: always
    ports:
      # Public HTTP Port:
      - '80:80'
      # Public HTTPS Port:
      - '443:443'
      # Admin Web Port:
      - '81:81'
    networks:
      default:
        ipv4_address: 10.10.10.3
    volumes:
      - /home/USER/nginxmanager/config.json:/app/config/production.json
      - app-data:/data
      - app-letsencrypt:/etc/letsencrypt
    depends_on:
      - db
  db:
    image: jc21/mariadb-aria:10.4
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: 'npm'
      MYSQL_DATABASE: 'npm'
      MYSQL_USER: 'npm'
      MYSQL_PASSWORD: 'npm'
    networks:
      default:
        ipv4_address: 10.10.10.2
    volumes:
      - app-sql:/var/lib/mysql


volumes:
  app-data:
     driver_opts:
           type: none
           device: /home/USER/nginxmanager/data
           o: bind  
  app-letsencrypt:
     driver_opts:
           type: none
           device: /home/USER/nginxmanager/letsencrypt
           o: bind
  app-sql:
     driver_opts:
           type: none
           device: /home/USER/nginxmanager/sql
           o: bind
networks:
  default:
    external:
      name: dockernet

Replace "USER" with your username (there are 4).

  1. Create config.json
    sudo nano config.json

Use the following template:

{
  "database": {
    "engine": "mysql",
    "host": "db",
    "name": "npm",
    "user": "npm",
    "password": "npm",
    "port": 3306
  }
}
  1. Start the docker container
    sudo docker-compose up -d
  1. Access the WebUI

Head to http://SERVER-IP:81

Default login:

Email: admin@example.com
Password: changeme

Sources:
https://nginxproxymanager.com/
https://docs.nginx.com/nginx/admin-guide/web-server/reverse-proxy/

Tags

Great! You've successfully subscribed.
Great! Next, complete checkout for full access.
Welcome back! You've successfully signed in.
Success! Your account is fully activated, you now have access to all content.