{"id":39397055,"url":"https://github.com/obeone/traefik_network_connector","last_synced_at":"2026-03-15T03:22:40.489Z","repository":{"id":235648439,"uuid":"791061449","full_name":"obeone/traefik_network_connector","owner":"obeone","description":"Dynamically connects Traefik to the required Docker networks, eliminating the need for a shared network for all web services. It listens to Docker events and manages network attachments, ensuring Traefik only joins networks of labeled containers. This improves service isolation and simplifies multi-service deployments.","archived":false,"fork":false,"pushed_at":"2025-11-18T04:13:46.000Z","size":77,"stargazers_count":13,"open_issues_count":3,"forks_count":3,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-11-18T06:14:32.234Z","etag":null,"topics":["docker","docker-compose","docker-network","docker-networking","traefik","traefik-docker"],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/obeone.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2024-04-24T02:54:29.000Z","updated_at":"2025-11-18T02:25:56.000Z","dependencies_parsed_at":"2024-05-31T01:07:42.234Z","dependency_job_id":"1b32b35d-9363-448d-915a-96a3660f273e","html_url":"https://github.com/obeone/traefik_network_connector","commit_stats":null,"previous_names":["obeone/auto_docker_proxy","obeone/traefik_network_connector"],"tags_count":1,"template":false,"template_full_name":null,"purl":"pkg:github/obeone/traefik_network_connector","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/obeone%2Ftraefik_network_connector","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/obeone%2Ftraefik_network_connector/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/obeone%2Ftraefik_network_connector/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/obeone%2Ftraefik_network_connector/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/obeone","download_url":"https://codeload.github.com/obeone/traefik_network_connector/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/obeone%2Ftraefik_network_connector/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28528034,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-18T00:39:45.795Z","status":"online","status_checked_at":"2026-01-18T02:00:07.578Z","response_time":98,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["docker","docker-compose","docker-network","docker-networking","traefik","traefik-docker"],"created_at":"2026-01-18T03:17:17.580Z","updated_at":"2026-03-15T03:22:40.475Z","avatar_url":"https://github.com/obeone.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Traefik Network Connector\n\n![Python](https://img.shields.io/badge/Python-3.6+-blue?logo=python\u0026logoColor=white)\n![Docker](https://img.shields.io/badge/Docker-Ready-blue?logo=docker\u0026logoColor=white)\n![Platforms](https://img.shields.io/badge/Platforms-amd64%20%7C%20arm64%20%7C%20arm%2Fv7-lightgrey)\n[![Ask DeepWiki](https://deepwiki.com/badge.svg)](https://deepwiki.com/obeone/traefik_network_connector)\n\nAutomatically connects Traefik to the right Docker networks —\nno shared network, no manual intervention.\n\n---\n\n## 🤔 Why this exists\n\nWith Traefik and multiple Docker Compose stacks, Traefik must be on the\nsame network as each proxied container. The usual fix is a single shared\nnetwork for everything — but that kills isolation between stacks.\n\n**This daemon solves that.** It listens to Docker events and\nautomatically connects (and disconnects) Traefik to the right networks\nas containers start and stop.\n\n---\n\n## 🚀 Quick start\n\nCreate a `docker-compose.yaml` for your Traefik stack:\n\n```yaml\nservices:\n  traefik:\n    image: traefik:v3\n    container_name: traefik\n    command:\n      - \"--providers.docker=true\"\n      - \"--providers.docker.exposedbydefault=false\"\n      - \"--entrypoints.web.address=:80\"\n      - \"--entrypoints.websecure.address=:443\"\n      - \"--certificatesresolvers.letsencrypt.acme.tlschallenge=true\"\n      - \"--certificatesresolvers.letsencrypt.acme.email=you@example.com\"\n      - \"--certificatesresolvers.letsencrypt.acme.storage=/letsencrypt/acme.json\"\n    ports:\n      - \"80:80\"\n      - \"443:443\"\n    volumes:\n      - /var/run/docker.sock:/var/run/docker.sock\n      - ./letsencrypt:/letsencrypt\n\n  traefik-network-connector:\n    image: obeoneorg/traefik_network_connector:latest\n    volumes:\n      - /var/run/docker.sock:/var/run/docker.sock\n    environment:\n      TRAEFIK_CONTAINERNAME: traefik   # must match container_name above\n    restart: unless-stopped\n```\n\n```bash\ndocker compose up -d\n```\n\nDone. ✅ The connector is now watching Docker events.\n\n---\n\n## 📦 Using it in your app stacks\n\nIn **any other Compose stack**, just add `traefik.enable=true`:\n\n```yaml\n# ~/myapp/docker-compose.yaml\nservices:\n  web:\n    image: myapp:latest\n    labels:\n      - \"traefik.enable=true\"\n      - \"traefik.http.routers.myapp.rule=Host(`myapp.${DOMAIN}`)\"\n      - \"traefik.http.routers.myapp.entrypoints=websecure\"\n      - \"traefik.http.routers.myapp.tls.certresolver=letsencrypt\"\n      - \"traefik.http.services.myapp.loadbalancer.server.port=8080\"\n```\n\n```bash\n# in ~/myapp/\ndocker compose up -d\n# → Traefik is automatically connected to myapp's network 🎉\n# → When you stop it, Traefik disconnects automatically\n```\n\n### 🎯 Targeting a specific network\n\nIf a container has multiple networks, you can restrict which one Traefik\nconnects to:\n\n```yaml\nlabels:\n  - \"traefik.enable=true\"\n  - \"traefik.docker.network=myapp_frontend\"\n  - \"traefik.http.routers.myapp.rule=Host(`myapp.${DOMAIN}`)\"\n  - \"traefik.http.routers.myapp.entrypoints=websecure\"\n  - \"traefik.http.routers.myapp.tls.certresolver=letsencrypt\"\n  - \"traefik.http.services.myapp.loadbalancer.server.port=8080\"\n```\n\n\u003e ⚠️ Docker Compose prefixes network names with the project name.\n\u003e A network named `frontend` in a project folder `myapp` becomes\n\u003e `myapp_frontend`.\n\n---\n\n## ⚙️ Configuration\n\nSettings are loaded in this priority order (highest wins):\n\n```text\nCLI arguments  \u003e  environment variables  \u003e  config.yaml\n```\n\n### Main options\n\n| Option | Env variable | CLI flag | Default |\n| --- | --- | --- | --- |\n| Traefik container name | `TRAEFIK_CONTAINERNAME` | `--traefik.containername` | `traefik` |\n| Docker socket/host | `DOCKER_HOST` | `--docker.host` | Unix socket |\n| General log level | `LOGLEVEL` | `--loglevel.general` | `INFO` |\n| App log level | `LOGLEVEL_APPLICATION` | `--loglevel.application` | `DEBUG` |\n| Monitored label (regex) | `TRAEFIK_MONITOREDLABEL` | `--traefik.monitoredlabel` | `^traefik.enable$` |\n| Network label | `TRAEFIK_NETWORKLABEL` | `--traefik.networklabel` | `traefik.docker.network` |\n\n### config.yaml (full reference)\n\n```yaml\ndocker:\n  host: \"unix:///var/run/docker.sock\"\n  tls:\n    enabled: false\n    verify: \"/path/to/ca.pem\"\n    cert: \"/path/to/cert.pem\"\n    key: \"/path/to/key.pem\"\n\nlogLevel:\n  general: \"INFO\"       # third-party libraries (env: LOGLEVEL or LOGLEVEL_GENERAL)\n  application: \"DEBUG\"  # this daemon\n\ntraefik:\n  containerName: \"traefik\"\n  monitoredLabel: \"^traefik.enable$\"\n  # networkLabel: \"traefik.docker.network\"  # default, rarely changed\n```\n\nMount it into the container:\n\n```bash\ndocker run -d \\\n  --name traefik_network_connector \\\n  -v $PWD/config.yaml:/usr/src/app/config.yaml \\\n  -v /var/run/docker.sock:/var/run/docker.sock \\\n  obeoneorg/traefik_network_connector:latest\n```\n\nRun `python main.py --help` for the full list of CLI flags.\n\n---\n\n## 🔐 Security: Docker socket proxy (optional)\n\nMounting `/var/run/docker.sock` gives full Docker access. Limit exposure\nwith a socket proxy:\n\n```yaml\nservices:\n  traefik-network-connector:\n    image: obeoneorg/traefik_network_connector:latest\n    depends_on:\n      docker-proxy:\n        condition: service_healthy\n    environment:\n      DOCKER_HOST: tcp://docker-proxy:2375\n    networks:\n      - connector-net\n\n  docker-proxy:\n    image: ghcr.io/linuxserver/socket-proxy:latest\n    environment:\n      CONTAINERS: 1   # read container info\n      NETWORKS: 1     # read network info\n      POST: 1         # allow connect/disconnect calls\n    volumes:\n      - /var/run/docker.sock:/var/run/docker.sock:ro\n    networks:\n      - connector-net\n\nnetworks:\n  connector-net:\n    internal: true\n```\n\n---\n\n## 🔒 TLS (optional)\n\nOnly needed when your Docker daemon is exposed over TCP with TLS:\n\n```yaml\ndocker:\n  host: \"tcp://your-docker-host:2376\"\n  tls:\n    enabled: true\n    verify: \"/path/to/ca.pem\"\n    cert: \"/path/to/cert.pem\"\n    key: \"/path/to/key.pem\"\n```\n\n---\n\n## 🖥️ Systemd service (optional)\n\n```bash\n# Edit paths inside the .service file first\nsudo cp traefik_network_connector.service /etc/systemd/system/\nsudo systemctl daemon-reload\nsudo systemctl enable --now traefik_network_connector\nsudo systemctl status traefik_network_connector\n```\n\n---\n\n## 🐳 Docker images\n\nImages are published on\n[Docker Hub](https://hub.docker.com/r/obeoneorg/traefik_network_connector)\nand\n[GHCR](https://ghcr.io/obeone/traefik_network_connector).\n\nAvailable image names:\n\n- `obeoneorg/traefik_network_connector`\n- `obeoneorg/auto_docker_proxy`\n- `ghcr.io/obeone/traefik_network_connector`\n- `ghcr.io/obeone/auto_docker_proxy`\n\nTag strategy for release `v1.2.3`:\n\n| Tag | Meaning |\n| --- | --- |\n| `latest` | Latest stable |\n| `v1.2.3` / `1.2.3` | Exact release |\n| `v1.2` / `1.2` | Latest patch |\n| `v1` / `1` | Latest minor |\n\nPlatforms: `linux/amd64`, `linux/arm64`, `linux/arm/v7`,\n`linux/arm/v6`, `linux/i386`.\n\nThe `APP_VERSION` environment variable inside the container holds the\nrunning version.\n\n---\n\n## 🔍 How it works\n\n```mermaid\nflowchart TB\n    A[Container starts] --\u003e B{traefik.enable=true?}\n    B -- No --\u003e C[Ignore]\n    B -- Yes --\u003e D{traefik.docker.network\\nset?}\n    D -- Yes --\u003e E[Connect Traefik to\\nthat specific network]\n    D -- No --\u003e F[Connect Traefik to\\nall container networks]\n    G[Container stops] --\u003e H{Other labeled containers\\non the same network?}\n    H -- Yes --\u003e I[Keep Traefik connected]\n    H -- No --\u003e J[Disconnect Traefik\\nfrom that network]\n```\n\nAt startup, the daemon also scans all **already-running** containers and\nconnects Traefik to any it missed.\n\n---\n\n## 📌 Versioning\n\n```bash\n# Bump version, commit, and create a git tag\n./scripts/bump-version.sh [major|minor|patch]\n\n# Then push the tag to trigger the CI release\ngit push --follow-tags\n```\n\n---\n\n## 🩺 Troubleshooting\n\n**Traefik isn't connecting to my container?**\n\n- Check `traefik.enable=true` is on the container.\n- Check `TRAEFIK_CONTAINERNAME` matches your actual Traefik container\n  name (`docker ps`).\n- Set `LOGLEVEL_APPLICATION=DEBUG` and read the logs:\n  `docker logs traefik_network_connector`.\n\n**Nothing happens at all?**\n\n- Make sure the Docker socket is mounted (or the proxy is reachable).\n- Check `docker logs traefik_network_connector` for connection errors.\n\n**Traefik connects to the wrong network?**\n\n- Add the `traefik.docker.network` label with the full network name\n  (including the Compose project prefix).\n\n---\n\n## 🤝 Contributing\n\nIssues and pull requests are welcome on\n[GitHub](https://github.com/obeone/traefik_network_connector).\nCheck existing issues before opening a new one.\n\n---\n\n## 👾 Author\n\n**obeone** — \u003chttps://github.com/obeone\u003e\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fobeone%2Ftraefik_network_connector","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fobeone%2Ftraefik_network_connector","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fobeone%2Ftraefik_network_connector/lists"}