Try free on Pangolin Cloud
Fastest way to get started with Pangolin using the hosted control plane. No credit card required.
install/config/* in the Pangolin source tree. Use it if you want the installer’s defaults, but you want to create and maintain the files yourself.
This guide assumes you already have a Linux server with Docker and Docker Compose installed, plus root or sudo access.
Prerequisites
Review the quick install guide and DNS & networking first. At minimum you need:- A public Linux server
- A base domain such as
example.com - A dashboard hostname such as
pangolin.example.com - An email address for Let’s Encrypt
- TCP ports
80and443open - UDP ports
51820and21820open if you are using tunneling
base domain is the parent domain you will attach resources to, such as example.com. dashboard hostname is the specific hostname for the Pangolin UI and API, such as pangolin.example.com.File Layout
Create the following project structure:config/db/db.sqliteis created by Pangolin on first startup.config/keyis created by Gerbil when tunneling is enabled.config/GeoLite2-Country.mmdbis optional and only needed for geo-blocking. It is not downloaded by the running services in a manual install; download it manually before enabling geo-blocking.
Create the Directories
Create the project folders:Create the Configuration Files
Create docker-compose.yml
This file defines the Pangolin, Gerbil, and Traefik containers, their shared volumes, and the ports exposed on the host.
docker-compose.yml
This is the installer’s default community layout with Gerbil enabled. If you want to pin releases instead of using
latest, replace the image tags with the versions you intend to run.Create config/traefik/traefik_config.yml
This file configures Traefik’s providers, Badger plugin, Let’s Encrypt resolver, entry points, logs, and health check endpoint.
config/traefik/traefik_config.yml
Traefik stores Let’s Encrypt certificates at
/letsencrypt/acme.json inside the container. The Compose file mounts that path from ./config/letsencrypt, so Traefik will create config/letsencrypt/acme.json when it needs certificate storage.Create config/traefik/dynamic_config.yml
This file defines the routers, middleware, and services that send dashboard, API, and WebSocket traffic to Pangolin.
config/traefik/dynamic_config.yml
Create config/config.yml
This file contains Pangolin’s application settings, dashboard domain, base domain, CORS origin, and server secret.Replace these values before starting the stack:
config/config.yml
pangolin.example.comwith your dashboard hostnameexample.comwith your base domainreplace-with-a-long-random-secretwith a strong random secretadmin@example.comintraefik_config.ymlwith your Let’s Encrypt email
Optional Email Configuration
If you want Pangolin to send email, add this block toconfig/config.yml and set flags.require_email_verification to true:
config/config.yml
Optional Geo-blocking Configuration
If you want geo-blocking, download the MaxMind database and add this line underserver:
config/config.yml
Start the Stack
Verify the containers are healthy
pangolin, traefik, and gerbil should all report as running after the first startup finishes.Get the setup token from the Pangolin logs
Check the Pangolin container logs:Pangolin prints a setup token to stdout on first boot. Copy that token before continuing.
Verify the Setup
You should expect the following on a healthy first install:docker compose psshowspangolin,traefik, andgerbilas running.docker compose logs pangolinincludes the one-time setup token for the first admin account.- Visiting
https://<your-dashboard-domain>/auth/initial-setuploads the setup page. config/db/db.sqliteexists after Pangolin starts.config/keyexists after Gerbil starts.
If Something Fails
- If the setup page does not load, confirm your DNS record points to the server and ports
80and443are reachable. - If you cannot complete first-time signup, check
sudo docker compose logs pangolinand copy the setup token printed by Pangolin. - If certificates are not issued, confirm
admin@example.comwas replaced and that nothing else is already bound to ports80or443. - If
pangolinnever becomes healthy, inspectsudo docker compose logs -f pangolin. - If tunneling does not work, inspect
sudo docker compose logs -f gerbiland confirm UDP ports51820and21820are open. - If Traefik serves the wrong host, re-check every
pangolin.example.comreplacement in both Traefik files andconfig/config.yml.
Without Tunneling
If you do not want Gerbil:- Remove the
gerbilservice. - Remove
network_mode: service:gerbilfromtraefik. - Add ports
80:80and443:443directly totraefik. - Remove the
gerbilblock fromconfig/config.yml.

