Install Portainer with Nginx SSL Reverse Proxy
How to install Portainer (Docker management UI) and expose it securely via Nginx with SSL.
Prerequisites
- Docker installed and running
- Nginx installed
- SSL certificate for your domain (e.g., via Let's Encrypt)
- Domain pointing to the server (e.g.,
portainer.example.com)
Step 1 — Run Portainer
docker volume create portainer_data
docker run -d \
--name portainer \
--restart=always \
-p 9000:9000 \
-v /var/run/docker.sock:/var/run/docker.sock \
-v portainer_data:/data \
portainer/portainer-ce:latest
Step 2 — Obtain SSL Certificate
sudo certbot certonly --nginx -d portainer.example.com
Step 3 — Configure Nginx
# /etc/nginx/sites-available/portainer
server {
listen 80;
server_name portainer.example.com;
return 301 https://$host$request_uri;
}
server {
listen 443 ssl;
listen [::]:443 ssl;
server_name portainer.example.com;
ssl_certificate /etc/letsencrypt/live/portainer.example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/portainer.example.com/privkey.pem;
client_max_body_size 0;
location / {
resolver 127.0.0.1 valid=30s;
proxy_pass http://localhost:9000;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
Step 4 — Enable the Site
sudo ln -s /etc/nginx/sites-available/portainer /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl reload nginx
Step 5 — Verify
curl -I https://portainer.example.com
# Should return HTTP 200
Then navigate to https://portainer.example.com to complete the Portainer setup wizard.