Files
codeandClaude Sonnet 5 2bb279f912 nginx-proxy-manager: add upgrade/backup workflow, rename container, fix wording
Documents backing up with restic before upgrading, for both the compose
and docker run workflows. Renames the docker run container to
nginx-proxy-manager to match the directory, and cleans up minor wording
and trailing-slash inconsistencies in the README.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-22 14:52:35 +00:00

3.1 KiB

Nginx Proxy Manager

Remember, if dockhand is using a domain name, this will have to be set up first.

I run one instance of Nginx Proxy Manager (NPM) on each host.

Overview

This Docker Compose configuration sets up the Reverse Proxy application using a Docker container.

Default Login

Create Network

The first thing you want to do is create the network:

docker network create proxy

Expose Ports

80 and 443 must be exposed, but you could proxy to 81 for the admin interface.

Create volumes

Assuming default sample.env is used:

mkdir -p /data/nginx-proxy-manager/data /data/nginx-proxy-manager/letsencrypt /var/log/containers/nginx-proxy-manager

Logs

Nginx Proxy Manager writes access/error logs under /data/logs, which is mounted outside of VOL_PATH. Since logs shouldn't be backed up with the rest of the data, they're mounted separately via LOG_PATH, which defaults to /var/log/containers/nginx-proxy-manager. If you'd rather back up/sync logs with the rest of the data, just remove the logs volume.

mkdir -p /var/log/containers/nginx-proxy-manager

Equivalent docker run command

mkdir -p /data/nginx-proxy-manager/data /data/nginx-proxy-manager/letsencrypt /var/log/containers/nginx-proxy-manager

docker network create proxy

docker run -d \
  --name nginx-proxy-manager \
  --restart unless-stopped \
  --network proxy \
  -e X_FRAME_OPTIONS="sameorigin" \
  -e DB_SQLITE_FILE="/data/database.sqlite" \
  -p 80:80 \
  -p 81:81 \
  -p 443:443 \
  -v "/data/nginx-proxy-manager/data:/data" \
  -v "/data/nginx-proxy-manager/letsencrypt:/etc/letsencrypt" \
  -v "/var/log/containers/nginx-proxy-manager:/data/logs" \
  jc21/nginx-proxy-manager:latest

Upgrade (and backup)

Back up the data volume with restic before upgrading, so you can restore it if the new version doesn't come up cleanly. Logs aren't included since they're not needed for a restore.

restic backup /data/nginx-proxy-manager

Once the backup completes, pull the new image and recreate the container:

docker compose pull
docker compose up -d

Or, if you're running the docker run version instead of compose:

docker pull jc21/nginx-proxy-manager:latest
docker stop nginx-proxy-manager
docker rm nginx-proxy-manager
docker run -d \
  --name nginx-proxy-manager \
  --restart unless-stopped \
  --network proxy \
  -e X_FRAME_OPTIONS="sameorigin" \
  -e DB_SQLITE_FILE="/data/database.sqlite" \
  -p 80:80 \
  -p 81:81 \
  -p 443:443 \
  -v "/data/nginx-proxy-manager/data:/data" \
  -v "/data/nginx-proxy-manager/letsencrypt:/etc/letsencrypt" \
  -v "/var/log/containers/nginx-proxy-manager:/data/logs" \
  jc21/nginx-proxy-manager:latest

If something goes wrong, restore the snapshot with restic restore latest --target / (or restic snapshots to pick an earlier one) and start the old container again.