Install Docker
Update the repo to get latest versions
sudo apt update
Install the latest version
sudo apt install docker.io
Set Docker to start on startup
sudo systemctl enable --now docker
Give your user permissions to docker, replacing user
with your username
sudo usermod -aG docker user
Once you have run this command close and reopen your session if you accessing remotely. This is to apply the permissions in the above step
Test it has installed correctly by getting the docker version
docker --version
Docker Compose
I also install docker-compose as some dockers need you to compose from a yml file. This downloads v2.16.0, just change this if the version updates to a later version
sudo curl -L "https://github.com/docker/compose/releases/download/v2.16.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
Give permissions to this
sudo chmod +x /usr/local/bin/docker-compose
Test it has installed correctly by getting the docker-compose version
docker-compose --version
Install Nginx Proxy Manager
I keep all my dockers in a dockers folder in my home directory. If it doesn’t exist already, create this folder:-
mkdir ~/dockers
Now create a folder for Nginx Proxy Manager to live in.
mkdir ~/dockers/nginxproxymanager
Change directory to this folder
cd ~/dockers/nginxproxymanager
Create 2 directories, data and letsencrypt, for nginxproxymanager to save to:-
mkdir data letsencrypt
Create a docker-compose.yml file
nano docker-compose.yml
Paste the following. If you want to save the data to another directory change the volumes to point to the directories you want to.
version: '3'
services:
app:
image: 'jc21/nginx-proxy-manager:latest'
restart: unless-stopped
ports:
- '80:80'
- '81:81'
- '443:443'
environment:
DB_MYSQL_HOST: "db"
DB_MYSQL_PORT: 3306
DB_MYSQL_USER: "npm"
DB_MYSQL_PASSWORD: "npm"
DB_MYSQL_NAME: "npm"
volumes:
- ./data:/data
- ./letsencrypt:/etc/letsencrypt
db:
image: 'jc21/mariadb-aria:latest'
restart: unless-stopped
environment:
MYSQL_ROOT_PASSWORD: 'npm'
MYSQL_DATABASE: 'npm'
MYSQL_USER: 'npm'
MYSQL_PASSWORD: 'npm'
volumes:
- ./data/mysql:/var/lib/mysql
Save the file with ctl + x, then y to save.
Run the docker-compose file with the following:-
docker-compose up -d
First run Nginx Proxy Manger
Browse to http://serverip:81 and you will get the login screen. Default login is [email protected] password changeme. You will then get the edit user screen. Update the user email and press Save. You will then be prompted to change the password. Save this and you will get the main login screen.
Creating a wildcard certificate with DNS Challenge
Go to SSL Certificates, select “Add SSL Certificate”.
In the domain name type *.domainname, so *.llewellynhughes.co.uk for example. Edit the email if you need to. Tick “Use DNS Challenge”. Select your DNS provider. If your current DNS provider isn’t there, sign up for a free Cloudflare account and use their DNS, pointing your existing DNS Name Servers (ns) to Cloudflare. Agree to the terms and conditions and Save.
Your SSL Certificate should now be created and renewed automatically.
Proxying to an existing site
This presumes you have set your DNS record for your domain name. I use Adguard as my DNS server, so added a DNS Rewrite here to point back to my Nginx Proxy Manager. For this example I am showing my Photoprism setup. I have a DNS record for photos.llewellynhughes.co.uk, with a DNS rewrite for that URL to go to my server ip.
Go to Hosts, Proxy Hosts, Add Proxy Host.
Domain names, fill in the url you have setup. In my example it’s photos.llewellynhughes.co.uk.
Scheme is http Forward Hostname/IP is my server ip Port is my photoprism install port, so 2342.
Tick Block Known Exploits and WebSocket Support.
Leave custom locations blank. For other projects you might need to use this for subfolders.
SSL, select your SSL Certificate created. I tick Force SSL, HTTP/2 Support, HSTS Enabled.
Nothing in advanced. These are for advanced Nginx configs.
Once done, Click Save.
After this, test going to your https url and it should work