diff --git a/README.md b/README.md
index ccd26d0..61b4432 100644
--- a/README.md
+++ b/README.md
@@ -1,31 +1,43 @@
-
Comprehensive Middleware, Router, and Service Management for Traefik
+
+
-
+

+

+

+

+

+

+

+

+

+

+

+
The Traefik Middleware Manager is a specialized microservice that empowers you to attach custom Traefik middlewares to your HTTP/TCP/UDP resources, manage router configurations, define custom Traefik services, and install Traefik plugins—all through a user-friendly web interface. It provides crucial functionality for implementing authentication, security headers, rate limiting, custom routing logic, and other middleware-based protections with ease.
## Overview
-The Middleware Manager monitors resources from your chosen data source (either Pangolin API or a direct Traefik API connection) and provides a web UI to:
+The Middleware Manager monitors resources from your chosen data source (either a Pangolin API or a direct Traefik API connection) and provides a web UI to:
-* Define and manage custom Traefik middlewares.
-* Attach these middlewares to your resources with specific priorities.
-* Configure advanced router settings for each resource, including entrypoints, TLS Subject Alternative Names (SANs), TCP SNI routing rules, custom request headers, and router priority.
-* Create, update, and delete custom Traefik services (LoadBalancer, Weighted, Mirroring, Failover).
-* Assign these custom services to your resources, overriding default service behavior.
-* Discover, install, and manage Traefik plugins directly from the UI.
+* **Define and manage custom Traefik middlewares.**
+* **Attach these middlewares to your resources** with specific priorities.
+* **Configure advanced router settings** for each resource, including entrypoints, TLS Subject Alternative Names (SANs), TCP SNI routing rules, custom request headers, and router priority.
+* **Create, update, and delete custom Traefik services** (LoadBalancer, Weighted, Mirroring, Failover).
+* **Assign these custom services to your resources**, overriding default service behavior.
+* **Discover, install, and manage Traefik plugins** directly from the UI.
-When you make changes, the Middleware Manager generates the necessary Traefik dynamic configuration files, ensuring proper cross-provider references and seamless integration.
+When you make changes, the Middleware Manager generates the necessary Traefik dynamic configuration files (e.g., `resource-overrides.yml`), ensuring proper cross-provider references and seamless integration with your Traefik setup.
## Key Features
@@ -50,50 +62,149 @@ When you make changes, the Middleware Manager generates the necessary Traefik dy
## Prerequisites
* Docker and Docker Compose
-* Traefik v2.x or v3.x (either as part of a Pangolin stack or standalone)
-* Network connectivity between the Middleware Manager and your API endpoints (Pangolin or Traefik).
+* Traefik v2.x or v3.x (can be part of a Pangolin stack or standalone)
+* Network connectivity between the Middleware Manager container and your API endpoints (Pangolin or Traefik).
-## Quick Start
+## Quick Start & Deployment Examples
-You can run the Middleware Manager with either Pangolin or a standalone Traefik setup.
+### 1. Full Stack with Pangolin, Gerbil, and Traefik (Recommended for Pangolin Users)
-### Base `docker-compose.yml` Structure
+This example demonstrates integrating Middleware Manager into a typical Pangolin setup.
```yaml
+networks:
+ pangolin_network: # Define your network
+ driver: bridge
+ name: pangolin # Or your preferred network name
+
services:
- middleware-manager:
- image: hhftechnology/middleware-manager:v3.0.0 # Or :latest for the stable main branch
- container_name: middleware-manager
+ pangolin:
+ image: fosrl/pangolin:1.3.0 # Use your desired Pangolin version
+ container_name: pangolin
restart: unless-stopped
volumes:
- - ./data:/data # For the SQLite database
- - ./config/traefik/rules:/conf # For dynamic configuration files generated by Middleware Manager
- - ./config/middleware-manager/templates.yaml:/app/config/templates.yaml # Optional: Custom middleware templates
- - ./config/middleware-manager/templates_services.yaml:/app/config/templates_services.yaml # Optional: Custom service templates
- - ./config/middleware-manager/config.json:/app/config/config.json # For data source and other persistent settings
- - ./config/traefik:/etc/traefik # Mount Traefik's static config directory if managing plugins
+ - ./pangolin_config:/app/config # Map your Pangolin config directory
+ healthcheck:
+ test: ["CMD", "curl", "-f", "http://localhost:3001/api/v1/"]
+ interval: "3s"
+ timeout: "3s"
+ retries: 5
+ networks:
+ - pangolin_network
+
+ gerbil: # Gerbil VPN and reverse proxy (often includes Traefik)
+ image: fosrl/gerbil:1.0.0 # Use your desired Gerbil version
+ container_name: gerbil
+ restart: unless-stopped
+ depends_on:
+ pangolin:
+ condition: service_healthy
+ command:
+ - --reachableAt=http://gerbil_container_name_or_ip:3003
+ - --generateAndSaveKeyTo=/var/config/gerbil_key
+ - --remoteConfig=http://pangolin:3001/api/v1/gerbil/get-config
+ - --reportBandwidthTo=http://pangolin:3001/api/v1/gerbil/receive-bandwidth
+ volumes:
+ - ./gerbil_config:/var/config # Map your Gerbil config directory
+ cap_add:
+ - NET_ADMIN
+ - SYS_MODULE
+ # Gerbil often exposes Traefik's ports if network_mode: service:gerbil is used for Traefik
+ ports:
+ - "51820:51820/udp" # Gerbil VPN port
+ # Traefik ports might be exposed here or directly by Traefik service depending on setup
+ - "80:80"
+ - "443:443"
+ - "8080:8080" # Traefik API/Dashboard if exposed through Gerbil
+ networks:
+ - pangolin_network
+
+ traefik:
+ image: traefik:v3.3.3
+ container_name: traefik
+ restart: unless-stopped
+
+ network_mode: service:gerbil # Ports appear on the gerbil service
+
+ depends_on:
+ pangolin:
+ condition: service_healthy
+ command:
+ - --configFile=/etc/traefik/traefik_config.yml
+ volumes:
+ - ./config/traefik:/etc/traefik:ro # Volume to store the Traefik configuration
+ - ./config/letsencrypt:/letsencrypt # Volume to store the Let's Encrypt certificates
+ - ./config/traefik/logs:/var/log/traefik # Volume to store Traefik logs
+ - ./traefik/plugins-storage:/plugins-storage:rw
+ - ./traefik/plugins-storage:/plugins-local:rw
+ - ./config/traefik/rules:/rules
+ - ./public_html:/var/www/html:ro
+
+ middleware-manager:
+ image: hhftechnology/middleware-manager:v3.0.0 # Use the specific branch tag
+ container_name: middleware-manager
+ restart: unless-stopped
+ depends_on: # Optional, but good practice
+ - pangolin
+ - traefik
+ volumes:
+ - ./mm_data:/data # For the SQLite database
+ - ./traefik_rules:/conf # MUST MATCH Traefik's rule directory
+ - ./mm_config/templates.yaml:/app/config/templates.yaml # Optional custom middleware templates
+ - ./mm_config/templates_services.yaml:/app/config/templates_services.yaml # Optional custom service templates
+ - ./mm_config/config.json:/app/config/config.json # For data source settings
+ # Mount Traefik's static config directory for plugin management
+ - ./traefik_static_config:/etc/traefik
+ environment:
+ - PANGOLIN_API_URL=http://pangolin:3001/api/v1 # If ACTIVE_DATA_SOURCE is pangolin
+ - TRAEFIK_API_URL=http://traefik:8080 # Or http://gerbil:8080 if Traefik API is via Gerbil
+ - TRAEFIK_CONF_DIR=/conf
+ - DB_PATH=/data/middleware.db
+ - PORT=3456
+ - ACTIVE_DATA_SOURCE=pangolin # Set to 'pangolin' or 'traefik'
+ # Path to Traefik's main static config file *inside this container* (due to volume mount)
+ - TRAEFIK_STATIC_CONFIG_PATH=/etc/traefik/traefik.yml
+ - PLUGINS_JSON_URL=https://raw.githubusercontent.com/hhftechnology/middleware-manager/traefik-int/plugin/plugins.json
+ # - DEBUG=true # Optional for development
ports:
- "3456:3456"
- networks: # Ensure it's on the same network as Traefik and Pangolin (if used)
- - your_traefik_network
- # - pangolin_network # If using Pangolin
+ networks:
+ - pangolin_network
+
+ # Optional: Other services like error-pages, traefik-relay, redis
+ # Ensure they are on the same pangolin_network
+````
- # Your Traefik service (example)
+**Create necessary directories on your host before starting:**
+`mkdir -p ./pangolin_config ./gerbil_config ./traefik_static_config ./letsencrypt ./traefik_rules ./traefik_plugins ./mm_data ./mm_config`
+And place your `traefik.yml` in `./traefik_static_config/`.
+
+### 2\. Standalone Traefik (Without Pangolin)
+
+This setup connects Middleware Manager directly to Traefik.
+
+```yaml
+networks:
+ traefik_network:
+ name: traefik_proxy
+ driver: bridge
+
+services:
traefik:
- image: traefik:v3.0 # Or your preferred version
+ image: traefik:v3.0
container_name: traefik
+ restart: unless-stopped
command:
- - "--api.insecure=true" # Required for Middleware Manager to connect
+ - "--api.insecure=true"
- "--api.dashboard=true"
- "--providers.docker=true"
- "--providers.docker.exposedbydefault=false"
- "--entrypoints.web.address=:80"
- "--entrypoints.websecure.address=:443"
- - "--providers.file.directory=/rules" # Directory for Middleware Manager's generated rules
+ - "--providers.file.directory=/rules" # For Middleware Manager rules
- "--providers.file.watch=true"
- # For Plugin Management:
- - "--experimental.plugins.examplePlugin.moduleName=https://github.com/user/example-plugin
- - "--experimental.plugins.examplePlugin.version=vx.y.z"
+ # Static config for plugins etc.
+ - "--configFile=/etc/traefik/traefik.yml"
# - "--log.level=DEBUG" # For troubleshooting
ports:
- "80:80"
@@ -101,31 +212,72 @@ services:
- "8080:8080" # Traefik API/Dashboard
volumes:
- /var/run/docker.sock:/var/run/docker.sock:ro
- - ./config/traefik/traefik.yml:/traefik.yml # Traefik static config (if managing plugins)
- - ./config/traefik/rules:/rules # Must match TRAEFIK_CONF_DIR for Middleware Manager rules
- - ./config/letsencrypt:/letsencrypt
+ - ./traefik_config/static:/etc/traefik # For traefik.yml
+ - ./traefik_config/rules:/rules # For Middleware Manager's generated rules
+ - ./traefik_config/letsencrypt:/letsencrypt
+ - ./traefik_config/plugins:/plugins-storage # For Traefik v2 plugins
networks:
- - your_traefik_network
+ - traefik_network
-networks:
- your_traefik_network:
- # driver: bridge # or specify existing external network
- # pangolin_network:
- # external: true
-````
+ middleware-manager:
+ image: hhftechnology/middleware-manager:traefik-int
+ container_name: middleware-manager
+ restart: unless-stopped
+ depends_on:
+ - traefik
+ volumes:
+ - ./middleware_manager_data:/data
+ - ./traefik_config/rules:/conf # MUST MATCH Traefik's rule directory
+ - ./middleware_manager_config/templates.yaml:/app/config/templates.yaml
+ - ./middleware_manager_config/templates_services.yaml:/app/config/templates_services.yaml
+ - ./middleware_manager_config/config.json:/app/config/config.json
+ # Mount Traefik's static config dir for plugin management
+ - ./traefik_config/static:/etc/traefik
+ environment:
+ - TRAEFIK_API_URL=http://traefik:8080
+ - TRAEFIK_CONF_DIR=/conf
+ - DB_PATH=/data/middleware.db
+ - PORT=3456
+ - ACTIVE_DATA_SOURCE=traefik # IMPORTANT for standalone mode
+ - TRAEFIK_STATIC_CONFIG_PATH=/etc/traefik/traefik.yml # Path inside MM container
+ - PLUGINS_JSON_URL=https://raw.githubusercontent.com/hhftechnology/middleware-manager/traefik-int/plugin/plugins.json
+ ports:
+ - "3456:3456"
+ networks:
+ - traefik_network
+
+ # Example service managed by Traefik
+ whoami:
+ image: traefik/whoami
+ container_name: whoami
+ labels:
+ - "traefik.enable=true"
+ - "traefik.http.routers.whoami.rule=Host(`whoami.localhost`)" # Replace with your host
+ - "traefik.http.routers.whoami.entrypoints=websecure"
+ - "traefik.http.routers.whoami.tls.certresolver=myresolver" # Configure your cert resolver
+ networks:
+ - traefik_network
+```
+
+**Create necessary directories on your host:**
+`mkdir -p ./traefik_config/static ./traefik_config/rules ./traefik_config/letsencrypt ./traefik_config/plugins ./middleware_manager_data ./middleware_manager_config`
+Place your `traefik.yml` in `./traefik_config/static/`.
+
+After configuring, start services: `docker-compose up -d`.
+Access the UI at `http://your-server-ip:3456`.
### Environment Variables for Middleware Manager
| Variable | Description | Default |
| ----------------------------- | --------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------- |
-| `PANGOLIN_API_URL` | URL to your Pangolin API (if using Pangolin mode) | `http://pangolin:3001/api/v1` |
+| `PANGOLIN_API_URL` | URL to your Pangolin API (if `ACTIVE_DATA_SOURCE` is `pangolin`) | `http://pangolin:3001/api/v1` |
| `TRAEFIK_API_URL` | URL to your Traefik API | `http://host.docker.internal:8080` (tries auto-discovery if empty) |
| `TRAEFIK_CONF_DIR` | Directory inside Middleware Manager to write Traefik dynamic configs | `/conf` |
| `DB_PATH` | Path to SQLite database inside the container | `/data/middleware.db` |
| `PORT` | Port for Middleware Manager web UI and API | `3456` |
| `CONFIG_DIR` | Directory for Middleware Manager's internal config files (templates, etc.) | `/app/config` |
| `ACTIVE_DATA_SOURCE` | Initial data source: `pangolin` or `traefik` | `pangolin` |
-| `TRAEFIK_STATIC_CONFIG_PATH` | Path to Traefik's main static config file (e.g., `traefik.yml`) | `/etc/traefik/traefik.yml` |
+| `TRAEFIK_STATIC_CONFIG_PATH` | Path to Traefik's main static config file (e.g., `traefik.yml`) **inside this container** | `/etc/traefik/traefik.yml` |
| `PLUGINS_JSON_URL` | URL to fetch the list of available Traefik plugins | `https://raw.githubusercontent.com/hhftechnology/middleware-manager/traefik-int/plugin/plugins.json` |
| `CHECK_INTERVAL_SECONDS` | How often to check for new resources (seconds) | `30` |
| `SERVICE_INTERVAL_SECONDS` | How often to check for new services (seconds) | `30` |
@@ -134,57 +286,9 @@ networks:
| `ALLOW_CORS` | Enable CORS for API | `false` |
| `CORS_ORIGIN` | Allowed CORS origin (if `ALLOW_CORS` is true; empty means allow all) | `""` |
-### 1\. Using with Pangolin (Default Mode)
-
-Set `ACTIVE_DATA_SOURCE=pangolin` (or leave it as default) and configure `PANGOLIN_API_URL`.
-
-```yaml
-# In middleware-manager service definition:
-services:
- middleware-manager:
- # ... other config ...
- environment:
- - PANGOLIN_API_URL=http://pangolin_container_name:3001/api/v1 # Adjust if needed
- - TRAEFIK_API_URL=http://traefik_container_name:8080 # Still useful for some operations
- - TRAEFIK_CONF_DIR=/conf
- - DB_PATH=/data/middleware.db
- - PORT=3456
- - ACTIVE_DATA_SOURCE=pangolin
- - TRAEFIK_STATIC_CONFIG_PATH=/etc/traefik/traefik.yml # Path inside Traefik container, for plugin management
- - PLUGINS_JSON_URL=[https://raw.githubusercontent.com/hhftechnology/middleware-manager/traefik-int/plugin/plugins.json](https://raw.githubusercontent.com/hhftechnology/middleware-manager/traefik-int/plugin/plugins.json)
- # ... volumes and ports ...
-```
-
-### 2\. Using with Standalone Traefik (Without Pangolin)
-
-Set `ACTIVE_DATA_SOURCE=traefik` and configure `TRAEFIK_API_URL`.
-
-```yaml
-# In middleware-manager service definition:
-services:
- middleware-manager:
- # ... other config ...
- environment:
- - TRAEFIK_API_URL=http://traefik_container_name:8080 # Ensure this matches your Traefik API
- - TRAEFIK_CONF_DIR=/conf
- - DB_PATH=/data/middleware.db
- - PORT=3456
- - ACTIVE_DATA_SOURCE=traefik
- - TRAEFIK_STATIC_CONFIG_PATH=/etc/traefik/traefik.yml # Path inside Traefik container, for plugin management
- - PLUGINS_JSON_URL=[https://raw.githubusercontent.com/hhftechnology/middleware-manager/traefik-int/plugin/plugins.json](https://raw.githubusercontent.com/hhftechnology/middleware-manager/traefik-int/plugin/plugins.json)
- # ... volumes and ports ...
-```
-
-You can also manage data source settings via `config.json` (see "Data Source Configuration" below).
-
-After configuring, start the services: `docker-compose up -d`
-Access the UI at `http://your-server-ip:3456`.
-
-## Configuration Details
-
### Data Source Configuration (`config.json`)
-The Middleware Manager can connect to either Pangolin or Traefik as a data source for discovering resources. You can configure this via the `config.json` file, which will be created by default in the path specified by the `CONFIG_DIR` environment variable (inside the container, e.g., `/app/config/config.json`). Mount a volume to this path to persist your settings.
+The Middleware Manager can connect to either Pangolin or Traefik as a data source for discovering resources. Settings are managed via `/app/config/config.json` (volume mount this path).
Example `config.json`:
@@ -202,7 +306,7 @@ Example `config.json`:
},
"traefik": {
"type": "traefik",
- "url": "http://traefik:8080",
+ "url": "http://traefik_container_name:8080",
"basic_auth": {
"username": "",
"password": ""
@@ -212,151 +316,71 @@ Example `config.json`:
}
```
-You can switch the `active_data_source` and update URLs/credentials through the **Settings** panel in the UI.
+Switch `active_data_source` and update URLs/credentials via the **Settings** panel in the UI.
### Custom Templates
- * **Middleware Templates**: Create `templates.yaml` in your mapped `CONFIG_DIR` (e.g., `./config/middleware-manager/templates.yaml`).
- ```yaml
- middlewares:
- - id: "my-custom-headers"
- name: "My Strong Security Headers"
- type: "headers"
- config:
- browserXssFilter: true
- contentTypeNosniff: true
- # ... other header options
- ```
- * **Service Templates**: Create `templates_services.yaml` in your mapped `CONFIG_DIR` (e.g., `./config/middleware-manager/templates_services.yaml`).
- ```yaml
- services:
- - id: "my-custom-lb"
- name: "My Custom Load Balancer"
- type: "loadBalancer"
- config:
- servers:
- - url: "http://mybackend1:8000"
- - url: "http://mybackend2:8000"
- healthCheck:
- path: "/healthz"
- interval: "5s"
- ```
+ * **Middleware Templates**: Create `templates.yaml` in your mapped `CONFIG_DIR` (e.g., `./middleware_manager_config/templates.yaml`).
+ * **Service Templates**: Create `templates_services.yaml` in your mapped `CONFIG_DIR` (e.g., `./middleware_manager_config/templates_services.yaml`).
+
+(Refer to previous README for example template structures).
## Usage Guide
-### Dashboard
-
-The dashboard provides an at-a-glance overview of your resources, middlewares, services, and their protection status.
+(This section remains largely the same as the previous README, covering Dashboard, Managing Resources, Middlewares, Services, and Plugins. Key updates are integrated below.)
### Managing Resources
-1. Navigate to the **Resources** tab.
-2. Resources are automatically discovered from your active data source (Pangolin or Traefik).
-3. Click **Manage** next to a resource to configure it.
-4. **Advanced Router Configuration**:
- * **HTTP Entrypoints**: Click the button to specify which Traefik entrypoints this HTTP router should listen on (e.g., `web`, `websecure`). Comma-separated. Default: `websecure`.
- * **TLS Domains**: Click to add Subject Alternative Names (SANs) for the TLS certificate. The primary host is automatically included. Comma-separated.
- * **TCP Routing**: Click to enable and configure TCP SNI routing. Specify TCP entrypoints and the SNI matching rule (e.g., `HostSNI(\`https://www.google.com/search?q=your-tcp-host.example.com\`)\`).
- * **Custom Headers**: Click to define custom request headers that Traefik will add to requests forwarded to this resource's backend service. Useful for setting `Host` headers or other custom values.
- * **Router Priority**: Adjust the numerical priority of the router. Higher numbers are evaluated first by Traefik. Default: `100`.
-5. **Assigning Middlewares**:
- * In the "Attached Middlewares" section, click **Add Middleware**.
- * Select one or more middlewares from the list of available (unassigned) middlewares.
- * Set a **Priority** (higher numbers run first, e.g., an auth middleware should have a higher priority than a headers middleware).
- * Click **Assign Selected**.
-6. **Assigning a Custom Service**:
- * In the "Service Configuration" section, the default service (usually from Docker or Pangolin) is shown.
- * Click **Assign Custom Service** (or **Change Assigned Service**).
- * Select a service from the list of services you've defined in the "Services" tab.
- * Click **Assign Service**. This will make the resource's router use your custom Traefik service definition.
- * To revert to the default service, remove the custom assignment.
-
-### Managing Middlewares
-
-1. Navigate to the **Middlewares** tab.
-2. View existing middlewares or click **Create Middleware**.
-3. Provide a **Name**, select a **Type** (e.g., `headers`, `basicAuth`, `rateLimit`, `plugin`).
-4. Configure the middleware using the JSON editor. Templates are provided for common types.
- * For `chain` middlewares, select other existing middlewares to include in the chain.
- * For `plugin` middlewares, ensure the plugin is declared in your Traefik static configuration. The config key here should match the plugin's name as defined in Traefik (e.g., if plugin is `crowdsec`, the key in JSON would be `"crowdsec": { ...plugin_config... }`).
-5. Click **Create Middleware** or **Update Middleware**.
+ * **Advanced Router Configuration**:
+ * **Custom Headers**: Useful for setting the `Host` header correctly if Traefik terminates TLS but your backend expects the original host, or for passing other specific headers.
+ * **Assigning a Custom Service**: When you assign a custom service, the resource's router will use your defined Traefik service (e.g., a load balancer with specific health checks) instead of the default one (e.g., the Docker container itself).
### Managing Services
-1. Navigate to the **Services** tab.
-2. View existing services or click **Create Service**.
-3. Provide a **Name** (e.g., `my-app-blue-green`). This name will be used for referencing (e.g., `my-app-blue-green@file`).
-4. Select a **Type**:
- * `loadBalancer`: Distributes requests among multiple backend servers.
- * **Protocol**: Choose HTTP, TCP, or UDP for the backend servers.
- * `servers`: Define backend servers with `url` (for HTTP) or `address` (for TCP/UDP). Can include `weight`.
- * `healthCheck`: Configure health checks for servers.
- * `sticky`: Configure session stickiness (e.g., cookie-based).
- * `weighted`: Distributes requests across multiple other *named* services based on weights.
- * `services`: List of `{ "name": "service-id@provider", "weight": 2 }`.
- * `mirroring`: Sends requests to a primary service and mirrors a percentage of traffic to other services.
- * `service`: The primary service ID (e.g., `main-production@file`).
- * `mirrors`: List of `{ "name": "analytics-mirror@file", "percent": 10 }`.
- * `failover`: Routes to a primary service, falling back to another if the primary fails.
- * `service`: The main service ID.
- * `fallback`: The fallback service ID.
-5. Configure the service options using the JSON editor. Templates and help text are provided.
-6. Click **Create Service** or **Update Service**.
+ * **Protocol (for LoadBalancer)**:
+ * **HTTP**: For standard web services. Servers are defined with `"url": "http://backend:port"`.
+ * **TCP**: For raw TCP traffic. Servers are defined with `"address": "backend_ip_or_host:port"`.
+ * **UDP**: For UDP-based services. Servers are defined with `"address": "backend_ip_or_host:port"`.
+ * **Service Naming**: When referencing services within other service definitions (e.g., in `weighted` or `failover` types), ensure you use the correct name and provider, typically `service-id@file` for services created in Middleware Manager.
### Managing Plugins (Plugin Hub)
-1. Navigate to the **Plugin Hub** tab.
-2. **Set Traefik Static Configuration Path**:
- * Input the **absolute path** to your main Traefik static configuration file (e.g., `/etc/traefik/traefik.yml` or `/data/traefik.yml`) *as it exists inside the Middleware Manager container*. This path must be volume-mounted from your host to be accessible by Middleware Manager.
- * **Important**: For this setting to persist across Middleware Manager restarts, set the `TRAEFIK_STATIC_CONFIG_PATH` environment variable for the Middleware Manager container. Setting it in the UI is temporary for the current session.
-3. Browse or search for available plugins.
-4. For each plugin:
- * Specify the **Version** you want to install (e.g., `v1.2.3`). If left blank, it usually defaults to the latest recommended by the plugin source.
- * Click **Install Plugin**. This action modifies your Traefik static configuration file to declare the plugin under the `experimental.plugins` section.
- * To remove a plugin, click **Remove Plugin**.
-5. **Restart Traefik**: After installing or removing plugins, you **must restart your Traefik container** for the changes to take effect and for the plugin to be loaded/unloaded.
-6. Once a plugin is installed and Traefik is restarted, you can create a middleware of type `plugin` and configure it. The configuration key in the JSON editor should match the plugin's name (e.g., if you installed a plugin named `myawesomeplugin` in `traefik.yml`, your middleware config would be `{"myawesomeplugin": { /* plugin-specific options */ }}`).
-
-Example of how Middleware Manager adds a plugin to `traefik.yml`:
-
-```yaml
-# In your traefik.yml (or equivalent)
-experimental:
- plugins:
- statiq: # This key is derived from the moduleName
- moduleName: [github.com/hhftechnology/statiq](https://github.com/hhftechnology/statiq)
- version: v0.3.0
- crowdsecbouncer: # Another example
- moduleName: [github.com/maxlerebourg/crowdsec-bouncer-traefik-plugin](https://github.com/maxlerebourg/crowdsec-bouncer-traefik-plugin)
- version: v1.4.2
-# ... other Traefik static configurations ...
-```
+ * **TRAEFIK\_STATIC\_CONFIG\_PATH**: This environment variable (or UI setting) tells Middleware Manager where to find Traefik's main `traefik.yml` (or `.toml`) file. **This path must be accessible from within the Middleware Manager container** (via a volume mount). For example, if your host's Traefik config is at `./traefik_config/static/traefik.yml` and you mount `./traefik_config/static` to `/etc/traefik` in the Middleware Manager container, then `TRAEFIK_STATIC_CONFIG_PATH` should be `/etc/traefik/traefik.yml`.
+ * **Plugin Installation**: Adds a declaration to your Traefik static config.
+ ```yaml
+ # In your traefik.yml (managed by Middleware Manager's Plugin Hub)
+ experimental:
+ plugins:
+ myplugin: # Key derived from moduleName
+ moduleName: https://github.com/vendor/my-traefik-plugin
+ version: v1.0.0
+ ```
+ * **Restart Traefik**: **Crucial step\!** After installing/removing plugins via Middleware Manager, Traefik must be restarted to load/unload the plugin code.
+ * **Using Plugins**: Create a middleware of type `plugin`. The JSON config key must match the plugin's key in `traefik.yml`.
+ ```json
+ // Middleware config in Middleware Manager UI for 'myplugin'
+ {
+ "myplugin": {
+ "optionA": "value1",
+ "anotherOption": true
+ }
+ }
+ ```
## Troubleshooting
-### Connection Issues
+(Similar to previous README, with emphasis on checking container names and network for API connectivity, and ensuring `TRAEFIK_STATIC_CONFIG_PATH` is correctly set for plugin management.)
- * **Container Naming**: For Docker, use container names (e.g., `http://traefik:8080`, `http://pangolin:3001/api/v1`) not `localhost`.
- * **Traefik API**: Ensure Traefik API is enabled (`--api.insecure=true`).
- * **Networking**: Verify containers are on the same Docker network.
- * `curl` Tests:
- * `docker exec curl http://pangolin_container_name:3001/api/v1/traefik-config`
- * `docker exec curl http://traefik_container_name:8080/api/http/routers`
-
-### "The service does not exist" or "The middleware does not exist" in Traefik
-
- * **Provider Suffixes**: Middleware Manager generally handles this. Manually created services/middlewares in the UI are typically from the `@file` provider. Services/middlewares from the data source (Docker, Pangolin) will have their respective providers (e.g., `@docker`, `@http`).
- * **Generated Files**: Check `resource-overrides.yml` in your mapped `/conf` directory for correctness.
- * **Plugin Not Loaded**: If it's a plugin middleware, ensure the plugin is correctly declared in Traefik's static config and Traefik has been restarted.
-
-### Service Templates Not Loading
-
- * Ensure `templates_services.yaml` is correctly volume-mounted to `/app/config/templates_services.yaml` inside the container.
- * Verify the YAML syntax in your `templates_services.yaml` file is correct.
- * Check Middleware Manager logs for errors during template loading.
+ * **Plugin Issues**:
+ * Verify `TRAEFIK_STATIC_CONFIG_PATH` in Middleware Manager points to the *correct path inside its own container* where Traefik's static config is mounted.
+ * Ensure Traefik was restarted after plugin installation/removal.
+ * Check Traefik logs for plugin loading errors.
+ * The plugin `moduleName` and `version` in the static config must be exact.
## Development
+(Same as previous README)
+
### Prerequisites
* Go (version as per `go.mod`)
@@ -367,27 +391,23 @@ experimental:
```bash
# Navigate to the project root
-go run main.go # For development with auto-restart, consider tools like air
+go run main.go
# For build:
-go build -o middleware-manager main.go
+# go build -o middleware-manager main.go
```
### Frontend
```bash
cd ui
-npm install # or yarn install
-npm start # or yarn start
+# If node_modules is missing: npm install (or yarn install)
+npm start # or yarn start
```
-The UI will be available at `http://localhost:3000` and will proxy API requests to the Go backend (defaulting to `http://localhost:3456` as per `ui/package.json` proxy setting).
-
## License
MIT License
## Contributing
-Contributions, issues, and feature requests are welcome\! Please feel free to submit a Pull Request or open an issue.
-
-
+Contributions, issues, and feature requests are welcome\! Please feel free to submit a Pull Request or open an issue on the GitHub repository.
diff --git a/plugin/plugins.json b/plugin/plugins.json
index b386816..acece56 100644
--- a/plugin/plugins.json
+++ b/plugin/plugins.json
@@ -1,17 +1,4 @@
[
- {
- "displayName": "Statiq",
- "type": "middleware",
- "iconPath": ".assets/statiq/icon.png",
- "import": "github.com/hhftechnology/statiq",
- "summary": "A feature-rich static file server inside Traefik.",
- "author": "HHF Technology",
- "version": "v0.3.0",
- "tested_with": "Traefik v2.9+, v3.0+",
- "stars": 150,
- "homepage": "https://github.com/hhftechnology/statiq",
- "docs": "https://github.com/hhftechnology/statiq#readme"
- },
{
"displayName": "CrowdSec Bouncer",
"type": "middleware",
@@ -38,6 +25,19 @@
"homepage": "https://github.com/PascalMinder/geoblock",
"docs": "https://plugins.traefik.io/plugins/623c53a712c0b093a60f441a/geo-block"
},
+ {
+ "displayName": "Statiq",
+ "type": "middleware",
+ "iconPath": ".assets/statiq/icon.png",
+ "import": "github.com/hhftechnology/statiq",
+ "summary": "A feature-rich static file server inside Traefik.",
+ "author": "HHF Technology",
+ "version": "v0.3.0",
+ "tested_with": "Traefik v2.9+, v3.0+",
+ "stars": 2,
+ "homepage": "https://github.com/hhftechnology/statiq",
+ "docs": "https://github.com/hhftechnology/statiq#readme"
+ },
{
"displayName": "BlockPath",
"type": "middleware",
@@ -75,5 +75,292 @@
"tested_with": "Traefik v2.x",
"homepage": "https://github.com/BetterCorp/cloudflarewarp",
"docs": "https://plugins.traefik.io/plugins/62830a3ea380546bcf5399e7/cloudflare-warp-authentication"
+ },
+ {
+ "displayName": "Statiq",
+ "type": "middleware",
+ "iconPath": ".assets/statiq/icon.png",
+ "import": "github.com/hhftechnology/statiq",
+ "summary": "A feature-rich static file server inside Traefik.",
+ "author": "HHF Technology",
+ "version": "v0.3.0",
+ "tested_with": "Traefik v2.9+, v3.0+",
+ "stars": 150,
+ "homepage": "https://github.com/hhftechnology/statiq",
+ "docs": "https://github.com/hhftechnology/statiq#readme"
+ },
+ {
+ "displayName": "Statiq",
+ "type": "middleware",
+ "iconPath": ".assets/statiq/icon.png",
+ "import": "github.com/hhftechnology/statiq",
+ "summary": "A feature-rich static file server inside Traefik.",
+ "author": "HHF Technology",
+ "version": "v0.3.0",
+ "tested_with": "Traefik v2.9+, v3.0+",
+ "stars": 150,
+ "homepage": "https://github.com/hhftechnology/statiq",
+ "docs": "https://github.com/hhftechnology/statiq#readme"
+ },
+ {
+ "displayName": "Statiq",
+ "type": "middleware",
+ "iconPath": ".assets/statiq/icon.png",
+ "import": "github.com/hhftechnology/statiq",
+ "summary": "A feature-rich static file server inside Traefik.",
+ "author": "HHF Technology",
+ "version": "v0.3.0",
+ "tested_with": "Traefik v2.9+, v3.0+",
+ "stars": 150,
+ "homepage": "https://github.com/hhftechnology/statiq",
+ "docs": "https://github.com/hhftechnology/statiq#readme"
+ },
+ {
+ "displayName": "Statiq",
+ "type": "middleware",
+ "iconPath": ".assets/statiq/icon.png",
+ "import": "github.com/hhftechnology/statiq",
+ "summary": "A feature-rich static file server inside Traefik.",
+ "author": "HHF Technology",
+ "version": "v0.3.0",
+ "tested_with": "Traefik v2.9+, v3.0+",
+ "stars": 150,
+ "homepage": "https://github.com/hhftechnology/statiq",
+ "docs": "https://github.com/hhftechnology/statiq#readme"
+ },
+ {
+ "displayName": "Statiq",
+ "type": "middleware",
+ "iconPath": ".assets/statiq/icon.png",
+ "import": "github.com/hhftechnology/statiq",
+ "summary": "A feature-rich static file server inside Traefik.",
+ "author": "HHF Technology",
+ "version": "v0.3.0",
+ "tested_with": "Traefik v2.9+, v3.0+",
+ "stars": 150,
+ "homepage": "https://github.com/hhftechnology/statiq",
+ "docs": "https://github.com/hhftechnology/statiq#readme"
+ },
+ {
+ "displayName": "Statiq",
+ "type": "middleware",
+ "iconPath": ".assets/statiq/icon.png",
+ "import": "github.com/hhftechnology/statiq",
+ "summary": "A feature-rich static file server inside Traefik.",
+ "author": "HHF Technology",
+ "version": "v0.3.0",
+ "tested_with": "Traefik v2.9+, v3.0+",
+ "stars": 150,
+ "homepage": "https://github.com/hhftechnology/statiq",
+ "docs": "https://github.com/hhftechnology/statiq#readme"
+ },
+ {
+ "displayName": "Statiq",
+ "type": "middleware",
+ "iconPath": ".assets/statiq/icon.png",
+ "import": "github.com/hhftechnology/statiq",
+ "summary": "A feature-rich static file server inside Traefik.",
+ "author": "HHF Technology",
+ "version": "v0.3.0",
+ "tested_with": "Traefik v2.9+, v3.0+",
+ "stars": 150,
+ "homepage": "https://github.com/hhftechnology/statiq",
+ "docs": "https://github.com/hhftechnology/statiq#readme"
+ },
+ {
+ "displayName": "Statiq",
+ "type": "middleware",
+ "iconPath": ".assets/statiq/icon.png",
+ "import": "github.com/hhftechnology/statiq",
+ "summary": "A feature-rich static file server inside Traefik.",
+ "author": "HHF Technology",
+ "version": "v0.3.0",
+ "tested_with": "Traefik v2.9+, v3.0+",
+ "stars": 150,
+ "homepage": "https://github.com/hhftechnology/statiq",
+ "docs": "https://github.com/hhftechnology/statiq#readme"
+ },
+ {
+ "displayName": "Statiq",
+ "type": "middleware",
+ "iconPath": ".assets/statiq/icon.png",
+ "import": "github.com/hhftechnology/statiq",
+ "summary": "A feature-rich static file server inside Traefik.",
+ "author": "HHF Technology",
+ "version": "v0.3.0",
+ "tested_with": "Traefik v2.9+, v3.0+",
+ "stars": 150,
+ "homepage": "https://github.com/hhftechnology/statiq",
+ "docs": "https://github.com/hhftechnology/statiq#readme"
+ },
+ {
+ "displayName": "Statiq",
+ "type": "middleware",
+ "iconPath": ".assets/statiq/icon.png",
+ "import": "github.com/hhftechnology/statiq",
+ "summary": "A feature-rich static file server inside Traefik.",
+ "author": "HHF Technology",
+ "version": "v0.3.0",
+ "tested_with": "Traefik v2.9+, v3.0+",
+ "stars": 150,
+ "homepage": "https://github.com/hhftechnology/statiq",
+ "docs": "https://github.com/hhftechnology/statiq#readme"
+ },
+ {
+ "displayName": "Statiq",
+ "type": "middleware",
+ "iconPath": ".assets/statiq/icon.png",
+ "import": "github.com/hhftechnology/statiq",
+ "summary": "A feature-rich static file server inside Traefik.",
+ "author": "HHF Technology",
+ "version": "v0.3.0",
+ "tested_with": "Traefik v2.9+, v3.0+",
+ "stars": 150,
+ "homepage": "https://github.com/hhftechnology/statiq",
+ "docs": "https://github.com/hhftechnology/statiq#readme"
+ },
+ {
+ "displayName": "Statiq",
+ "type": "middleware",
+ "iconPath": ".assets/statiq/icon.png",
+ "import": "github.com/hhftechnology/statiq",
+ "summary": "A feature-rich static file server inside Traefik.",
+ "author": "HHF Technology",
+ "version": "v0.3.0",
+ "tested_with": "Traefik v2.9+, v3.0+",
+ "stars": 150,
+ "homepage": "https://github.com/hhftechnology/statiq",
+ "docs": "https://github.com/hhftechnology/statiq#readme"
+ },
+ {
+ "displayName": "Statiq",
+ "type": "middleware",
+ "iconPath": ".assets/statiq/icon.png",
+ "import": "github.com/hhftechnology/statiq",
+ "summary": "A feature-rich static file server inside Traefik.",
+ "author": "HHF Technology",
+ "version": "v0.3.0",
+ "tested_with": "Traefik v2.9+, v3.0+",
+ "stars": 150,
+ "homepage": "https://github.com/hhftechnology/statiq",
+ "docs": "https://github.com/hhftechnology/statiq#readme"
+ },
+ {
+ "displayName": "Statiq",
+ "type": "middleware",
+ "iconPath": ".assets/statiq/icon.png",
+ "import": "github.com/hhftechnology/statiq",
+ "summary": "A feature-rich static file server inside Traefik.",
+ "author": "HHF Technology",
+ "version": "v0.3.0",
+ "tested_with": "Traefik v2.9+, v3.0+",
+ "stars": 150,
+ "homepage": "https://github.com/hhftechnology/statiq",
+ "docs": "https://github.com/hhftechnology/statiq#readme"
+ },
+ {
+ "displayName": "Statiq",
+ "type": "middleware",
+ "iconPath": ".assets/statiq/icon.png",
+ "import": "github.com/hhftechnology/statiq",
+ "summary": "A feature-rich static file server inside Traefik.",
+ "author": "HHF Technology",
+ "version": "v0.3.0",
+ "tested_with": "Traefik v2.9+, v3.0+",
+ "stars": 150,
+ "homepage": "https://github.com/hhftechnology/statiq",
+ "docs": "https://github.com/hhftechnology/statiq#readme"
+ },
+ {
+ "displayName": "Statiq",
+ "type": "middleware",
+ "iconPath": ".assets/statiq/icon.png",
+ "import": "github.com/hhftechnology/statiq",
+ "summary": "A feature-rich static file server inside Traefik.",
+ "author": "HHF Technology",
+ "version": "v0.3.0",
+ "tested_with": "Traefik v2.9+, v3.0+",
+ "stars": 150,
+ "homepage": "https://github.com/hhftechnology/statiq",
+ "docs": "https://github.com/hhftechnology/statiq#readme"
+ },
+ {
+ "displayName": "Statiq",
+ "type": "middleware",
+ "iconPath": ".assets/statiq/icon.png",
+ "import": "github.com/hhftechnology/statiq",
+ "summary": "A feature-rich static file server inside Traefik.",
+ "author": "HHF Technology",
+ "version": "v0.3.0",
+ "tested_with": "Traefik v2.9+, v3.0+",
+ "stars": 150,
+ "homepage": "https://github.com/hhftechnology/statiq",
+ "docs": "https://github.com/hhftechnology/statiq#readme"
+ },
+ {
+ "displayName": "Statiq",
+ "type": "middleware",
+ "iconPath": ".assets/statiq/icon.png",
+ "import": "github.com/hhftechnology/statiq",
+ "summary": "A feature-rich static file server inside Traefik.",
+ "author": "HHF Technology",
+ "version": "v0.3.0",
+ "tested_with": "Traefik v2.9+, v3.0+",
+ "stars": 150,
+ "homepage": "https://github.com/hhftechnology/statiq",
+ "docs": "https://github.com/hhftechnology/statiq#readme"
+ },
+ {
+ "displayName": "Statiq",
+ "type": "middleware",
+ "iconPath": ".assets/statiq/icon.png",
+ "import": "github.com/hhftechnology/statiq",
+ "summary": "A feature-rich static file server inside Traefik.",
+ "author": "HHF Technology",
+ "version": "v0.3.0",
+ "tested_with": "Traefik v2.9+, v3.0+",
+ "stars": 150,
+ "homepage": "https://github.com/hhftechnology/statiq",
+ "docs": "https://github.com/hhftechnology/statiq#readme"
+ },
+ {
+ "displayName": "Statiq",
+ "type": "middleware",
+ "iconPath": ".assets/statiq/icon.png",
+ "import": "github.com/hhftechnology/statiq",
+ "summary": "A feature-rich static file server inside Traefik.",
+ "author": "HHF Technology",
+ "version": "v0.3.0",
+ "tested_with": "Traefik v2.9+, v3.0+",
+ "stars": 150,
+ "homepage": "https://github.com/hhftechnology/statiq",
+ "docs": "https://github.com/hhftechnology/statiq#readme"
+ },
+ {
+ "displayName": "Statiq",
+ "type": "middleware",
+ "iconPath": ".assets/statiq/icon.png",
+ "import": "github.com/hhftechnology/statiq",
+ "summary": "A feature-rich static file server inside Traefik.",
+ "author": "HHF Technology",
+ "version": "v0.3.0",
+ "tested_with": "Traefik v2.9+, v3.0+",
+ "stars": 150,
+ "homepage": "https://github.com/hhftechnology/statiq",
+ "docs": "https://github.com/hhftechnology/statiq#readme"
+ },
+ {
+ "displayName": "Statiq",
+ "type": "middleware",
+ "iconPath": ".assets/statiq/icon.png",
+ "import": "github.com/hhftechnology/statiq",
+ "summary": "A feature-rich static file server inside Traefik.",
+ "author": "HHF Technology",
+ "version": "v0.3.0",
+ "tested_with": "Traefik v2.9+, v3.0+",
+ "stars": 150,
+ "homepage": "https://github.com/hhftechnology/statiq",
+ "docs": "https://github.com/hhftechnology/statiq#readme"
}
+
]
diff --git a/screenshots/ResourcesV3.png b/screenshots/ResourcesV3.png
new file mode 100644
index 0000000..d260b4c
Binary files /dev/null and b/screenshots/ResourcesV3.png differ
diff --git a/screenshots/Resources_ManageV3.png b/screenshots/Resources_ManageV3.png
new file mode 100644
index 0000000..3237b96
Binary files /dev/null and b/screenshots/Resources_ManageV3.png differ
diff --git a/screenshots/Resources_Manage_Assign_Custom_MiddlewareV3.png b/screenshots/Resources_Manage_Assign_Custom_MiddlewareV3.png
new file mode 100644
index 0000000..20a9c40
Binary files /dev/null and b/screenshots/Resources_Manage_Assign_Custom_MiddlewareV3.png differ
diff --git a/screenshots/Resources_Manage_Assign_Custom_ServiceV3.png b/screenshots/Resources_Manage_Assign_Custom_ServiceV3.png
new file mode 100644
index 0000000..94ccb1b
Binary files /dev/null and b/screenshots/Resources_Manage_Assign_Custom_ServiceV3.png differ
diff --git a/screenshots/Resources_Manage_HTTP_RouterV3.png b/screenshots/Resources_Manage_HTTP_RouterV3.png
new file mode 100644
index 0000000..dbd4468
Binary files /dev/null and b/screenshots/Resources_Manage_HTTP_RouterV3.png differ
diff --git a/screenshots/Resources_Manage_TCP_SNI_RoutingV3.png b/screenshots/Resources_Manage_TCP_SNI_RoutingV3.png
new file mode 100644
index 0000000..68efb38
Binary files /dev/null and b/screenshots/Resources_Manage_TCP_SNI_RoutingV3.png differ
diff --git a/screenshots/Resources_Manage_TLS_CertificateV3.png b/screenshots/Resources_Manage_TLS_CertificateV3.png
new file mode 100644
index 0000000..67596e8
Binary files /dev/null and b/screenshots/Resources_Manage_TLS_CertificateV3.png differ
diff --git a/screenshots/dashboardV3.png b/screenshots/dashboardV3.png
new file mode 100644
index 0000000..8260cea
Binary files /dev/null and b/screenshots/dashboardV3.png differ
diff --git a/screenshots/data_source_settingV3.png b/screenshots/data_source_settingV3.png
new file mode 100644
index 0000000..1dfa50f
Binary files /dev/null and b/screenshots/data_source_settingV3.png differ
diff --git a/screenshots/middleware-listV3.png b/screenshots/middleware-listV3.png
new file mode 100644
index 0000000..e238d93
Binary files /dev/null and b/screenshots/middleware-listV3.png differ
diff --git a/screenshots/plugin_hubV3.png b/screenshots/plugin_hubV3.png
new file mode 100644
index 0000000..9669c49
Binary files /dev/null and b/screenshots/plugin_hubV3.png differ
diff --git a/screenshots/services-listV3.png b/screenshots/services-listV3.png
new file mode 100644
index 0000000..8afa0be
Binary files /dev/null and b/screenshots/services-listV3.png differ