Quick start
Run Traefik Proxy Admin with Docker — no need to clone the source. Pick the path that matches how you want to run Traefik:
- All-in-one bundle — the panel runs Traefik for you. Easiest if you're starting fresh.
- Bring your own Traefik — run just the panel + database next to a Traefik you already operate.
Not sure which? See Deployment modes.
Developing or contributing?
This page is for running the app. To work on the code (clone, pnpm, dev server), see Development setup.
Download links
The download URLs below point at the project's main branch. They become live once the Docker bundle is merged to main; until then, replace main with redesign/traefik-ui in the URLs.
Option A — All-in-one bundle
The fully-managed bundle brings up PostgreSQL + the panel + Traefik together, with the panel owning Traefik's configuration end to end. Download the three files it needs into a folder:
mkdir traefik-manager && cd traefik-manager
mkdir -p docker/managed
base=https://raw.githubusercontent.com/Janhouse/traefik-proxy-admin/main
curl -fsSL "$base/docker-compose.managed.yml" -o docker-compose.yml
curl -fsSL "$base/docker/managed/.env.example" -o .env
curl -fsSL "$base/docker/managed/traefik-wrapper.sh" -o docker/managed/traefik-wrapper.sh
chmod +x docker/managed/traefik-wrapper.shEdit .env and set the three required values:
POSTGRES_PASSWORD= # any strong password — e.g. openssl rand -hex 24
MANAGED_SECRETS_KEY= # encrypts DNS credentials at rest — openssl rand -base64 32
ADMIN_PANEL_AUTH= # htpasswd entry that protects the panel (see below)Generate the panel login (single-quote it so $ in the hash isn't interpolated):
docker run --rm httpd:alpine htpasswd -nB admin
# → ADMIN_PANEL_AUTH='admin:$2y$05$....'Then start it:
docker compose up -dTraefik comes up with sensible defaults (web :80 → redirect to websecure :443, a Let's Encrypt resolver). The panel image is pulled from ghcr.io/janhouse/traefik-proxy-admin. Finish setup (Admin Panel Domain, ACME email, DNS) following Fully-managed bundle.
Option B — Bring your own Traefik
If you already run Traefik, run just the panel and its database, and add the panel as an HTTP provider. Create a docker-compose.yml:
name: traefik-proxy-admin
services:
postgres:
image: postgres:16-alpine
restart: unless-stopped
environment:
POSTGRES_DB: traefik_share
POSTGRES_USER: admin
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:?set POSTGRES_PASSWORD in .env}
volumes:
- postgres_data:/var/lib/postgresql/data
healthcheck:
test: ["CMD", "pg_isready", "-U", "admin"]
interval: 10s
timeout: 3s
retries: 5
panel:
image: ghcr.io/janhouse/traefik-proxy-admin:latest
restart: unless-stopped
environment:
DATABASE_URL: postgresql://admin:${POSTGRES_PASSWORD}@postgres:5432/traefik_share
# Optional — enables the runtime explorer, metrics and conflict detection:
# TRAEFIK_API_URL: http://your-traefik:8080
ports:
- "3000:3000" # so your Traefik can reach the panel (or use a shared network)
depends_on:
postgres:
condition: service_healthy
volumes:
postgres_data:Set POSTGRES_PASSWORD in a .env next to it, then:
docker compose up -dFinally point Traefik's HTTP provider at the panel and reference your entrypoints/resolvers — see Externally-managed Traefik.
Updating
Pull the latest panel image and recreate the containers:
docker compose pull
docker compose up -dFor the all-in-one bundle, re-download the files (same curl commands) if the bundle's structure changes between releases; your .env and data volumes are preserved.
Next steps
- Choose how to run Traefik: Deployment modes
- Create your first proxied service: Services & routing
- Add a domain and certificates: Domains & certificates