For the complete documentation index, see llms.txt. This page is also available as Markdown.

Deploying Portainer behind nginx reverse proxy

Before deploying, review the security considerations for reverse proxy deployments to understand how Portainer's cookie, CSRF, and CSP behaviour interacts with your proxy configuration.

Deploying in a Docker Standalone scenario

To deploy Portainer behind an nginx proxy in a Docker standalone scenario you must use a Docker Compose file. In the following docker-compose.yml you will find the configuration of the nginx proxy and the Portainer Server.

This example uses the excellent nginxproxy/nginx-proxy image as the proxy container, which requires no additional configuration beyond the two environment variables added to the portainer container's definition.

version: "2"

services:
  nginx-proxy:
    image: nginxproxy/nginx-proxy
    restart: always
    ports:
      - "80:80"
    volumes:
      - "/var/run/docker.sock:/tmp/docker.sock:ro"

  portainer:
    image: portainer/portainer-ee:lts
    command: -H unix:///var/run/docker.sock
    restart: always
    environment:
      - VIRTUAL_HOST=portainer.yourdomain.com
      - VIRTUAL_PORT=9000
    ports:
      - 8000:8000
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
      - portainer_data:/data

volumes:
  portainer_data:

To start working with this recipe, change the VIRTUAL_HOST value then deploy Portainer by running the following:

When this has finished, run docker ps . You should see an output similar to this:

Once the deployment has finished you can browse portainer.yourdomain.com.

Deploying in a Docker Swarm scenario

Deploying Portainer in Docker Swarm behind nginx has similar steps to the Docker Standalone scenario. Before deploying, you need to create two elements: networks and volumes.

First, create two networks:

  • One for the agent and the communication with the Portainer Server.

  • One to 'expose' the Portainer container to the same network as the reverse proxy.

Next, create the volume:

And finally, save the following recipe as portainer.yml:

To start working with this recipe, change the VIRTUAL_HOST value then deploy Portainer by running the following:

To check the deployment, run docker service ls. You should see an output similar to the following:

Once the services are running, you will be able to access Portainer from the URL you defined earlier, for example: portainer.yourdomain.com.

Last updated

Was this helpful?