Skip to main content

A Traefik-like reverse proxy implemented in Python (asyncio + Starlette).

Project description

python-traefik

A production-grade, Traefik-inspired reverse proxy implemented in Python using asyncio and Starlette.

Python 3.10+ License: MIT

Features

Core (Implemented ✔)

  • Dynamic Routing — rule-based routing with Host(), PathPrefix(), Path(), HostRegexp(), Headers(), Method(), ClientIP() matchers
  • Compound Rules — combine matchers with &&, ||, and parentheses: (Host(\a.com`) || Host(`b.com`)) && PathPrefix(`/api`)`
  • Load Balancing — round-robin across backend servers with health-aware selection
  • Health Checks — periodic async health probes; unhealthy backends are automatically removed from rotation
  • Prometheus Metrics — request count and latency histograms at /metrics
  • Reverse Proxy — full HTTP forwarding with hop-by-hop header filtering and X-Forwarded-* injection
  • Connection Pooling — shared httpx.AsyncClient for efficient backend connections

Middleware Pipeline ✔

  • Rate Limiting — per-IP token bucket rate limiter
  • Basic Auth — HTTP Basic authentication
  • Circuit Breaker — trips open after N failures, auto-recovers after timeout
  • Retry — configurable retry with exponential back-off
  • Headers — set, add, or remove response headers
  • Redirect Scheme — HTTP → HTTPS redirect

TCP/UDP Support ✔

  • TCP Proxy — layer-4 TCP reverse proxy with bidirectional streaming
  • UDP Proxy — layer-4 UDP relay with client address tracking
  • TLS Termination — optional TLS on TCP entrypoints

SSL/TLS Certificate Management ✔

  • Static Certificates — load PEM cert/key from files
  • Self-Signed Generation — auto-generate dev certs via cryptography
  • ACME Stub — provisioning framework (full Let's Encrypt client TBD)
  • Certificate Store — in-memory store with wildcard domain support

Service Discovery ✔

  • Consul — discover services from Consul catalog with health filtering
  • Kubernetes — discover services from K8s API with in-cluster token auto-detection
  • Hot Reload — discovered services update the registry without restart

Dashboard API ✔

  • Web UI — dark-themed dashboard at /dashboard
  • REST API — JSON endpoints for overview, routers, services, and certificates
  • Real-time Status — backend health status with visual indicators

Architecture

┌──────────────┐     ┌──────────────┐     ┌──────────────┐
│  Entrypoint  │────▶│    Router    │────▶│  Middleware   │
│  :8000 HTTP  │     │  Rule Match  │     │   Pipeline   │
│  :3306 TCP   │     │  Priority    │     │  rate-limit  │
│  :5353 UDP   │     │              │     │  basic-auth  │
└──────────────┘     └──────────────┘     │  retry       │
                                          └──────┬───────┘
                                                 │
                     ┌──────────────┐     ┌──────▼───────┐
                     │   Backend    │◀────│ Load Balancer│
                     │  :5000       │     │ Round-Robin  │
                     │  :5001       │     │ Health-Aware │
                     └──────────────┘     └──────────────┘

Quickstart

Install

pip install -e .

Install with dev dependencies

pip install -e ".[dev]"

Run

python-traefik run --config examples/config.yml

Validate config without starting

python-traefik validate --config examples/config.yml

Check version

python-traefik version

Test routing

# Route by host
curl -H "Host: example.com" http://localhost:8000/

# Prometheus metrics
curl http://localhost:8000/metrics

# Dashboard
open http://localhost:8080/dashboard

# Dashboard API
curl http://localhost:8080/api/overview
curl http://localhost:8080/api/routers
curl http://localhost:8080/api/services

Configuration

See examples/config.yml for a basic setup and examples/config_full.yml for a full reference.

Minimal Config

entryPoints:
  web:
    address: ":8000"

routers:
  app:
    rule: "Host(`example.com`) && PathPrefix(`/`)"
    service: "app_service"

services:
  app_service:
    loadBalancer:
      servers:
        - url: "http://localhost:5000"

Config Sections

Section Description
entryPoints HTTP listener addresses
tcpEntryPoints TCP proxy listeners
udpEntryPoints UDP proxy listeners
routers Rule → service mapping with optional middlewares and priority
services Backend server groups with load balancer
middlewares Named middleware definitions
tls TLS certificates and ACME configuration
metrics Prometheus endpoint toggle
healthcheck Backend health probe settings
dashboard Dashboard UI and API
providers Service discovery (Consul, Kubernetes)
logging Log level and access log toggle

Development

Run tests

pytest tests/ -v

Lint

ruff check python_traefik/

License

MIT — see LICENSE.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

python_traefik-0.3.0.tar.gz (31.9 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

python_traefik-0.3.0-py3-none-any.whl (29.3 kB view details)

Uploaded Python 3

File details

Details for the file python_traefik-0.3.0.tar.gz.

File metadata

  • Download URL: python_traefik-0.3.0.tar.gz
  • Upload date:
  • Size: 31.9 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.12.10

File hashes

Hashes for python_traefik-0.3.0.tar.gz
Algorithm Hash digest
SHA256 a79b63e4fcb7c3cb9653a07fcd9be7791b8a8240d3c80c8c68241ac4e4a36fd9
MD5 d119748f526af936f3ca8d915e001442
BLAKE2b-256 62b7f22188b9c2119e5329723929c12a286a8304a87c43679e3b39ecfc23e240

See more details on using hashes here.

File details

Details for the file python_traefik-0.3.0-py3-none-any.whl.

File metadata

  • Download URL: python_traefik-0.3.0-py3-none-any.whl
  • Upload date:
  • Size: 29.3 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.12.10

File hashes

Hashes for python_traefik-0.3.0-py3-none-any.whl
Algorithm Hash digest
SHA256 b7567f9f06e5e96050998c1f17bc9129e3d416c7f009a2ffd1d8d31a586e7796
MD5 8aa83b314d0fff0a3f61b1e6d3ab545f
BLAKE2b-256 5aadfdf4c24052d9b8e79d13a416c9e0b251ee221f9da7fe8024c51e558a84d9

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page