{"id":13416238,"url":"https://github.com/mattallty/muguet","last_synced_at":"2025-03-14T23:31:28.450Z","repository":{"id":35762556,"uuid":"40041972","full_name":"mattallty/muguet","owner":"mattallty","description":"DNS Server \u0026 Reverse proxy for Docker - Compatible with docker-compose, boot2docker and docker-machine","archived":true,"fork":false,"pushed_at":"2017-02-04T05:33:51.000Z","size":719,"stargazers_count":166,"open_issues_count":8,"forks_count":13,"subscribers_count":7,"default_branch":"master","last_synced_at":"2024-04-23T22:55:30.383Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"","language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/mattallty.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2015-08-01T09:31:44.000Z","updated_at":"2023-07-01T00:44:42.000Z","dependencies_parsed_at":"2022-09-13T03:01:08.312Z","dependency_job_id":null,"html_url":"https://github.com/mattallty/muguet","commit_stats":null,"previous_names":[],"tags_count":3,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mattallty%2Fmuguet","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mattallty%2Fmuguet/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mattallty%2Fmuguet/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mattallty%2Fmuguet/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/mattallty","download_url":"https://codeload.github.com/mattallty/muguet/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":243663502,"owners_count":20327299,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","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":[],"created_at":"2024-07-30T21:00:55.898Z","updated_at":"2025-03-14T23:31:24.050Z","avatar_url":"https://github.com/mattallty.png","language":"JavaScript","funding_links":[],"categories":["Container Operations","Reverse Proxy"],"sub_categories":["Reverse Proxy"],"readme":"![Muguet](https://github.com/mattallty/muguet/raw/master/assets/muguet.png)\n\n# Muguet\n\n[![Build Status](https://travis-ci.org/mattallty/muguet.svg?branch=master)](https://travis-ci.org/mattallty/muguet) [![Coverage Status](https://coveralls.io/repos/mattallty/muguet/badge.svg?branch=master\u0026service=github)](https://coveralls.io/github/mattallty/muguet?branch=master)\n\n\u003e *Muguet* is a DNS Server \u0026 Reverse proxy for Docker environments. \n\u003e Compatible with [docker-compose](https://docs.docker.com/compose/), [boot2docker](http://boot2docker.io/) and [docker-machine](https://docs.docker.com/machine/)\n\n\n## Introduction\n\nWhen using Docker, it's sometimes a pain to access your containers using specific IPs/ports.\n\n*Muguet* provides you with a [DNS Server](https://en.wikipedia.org/wiki/Domain_Name_System) \nthat resolves auto-generated hostnames to your containers IPs, \nplus a [Reverse Proxy](https://en.wikipedia.org/wiki/Reverse_proxy) to access all your web apps on port 80. \n\n![Muguet](https://github.com/mattallty/muguet/raw/master/assets/muguet-schema.png)\n\n## Prerequisites\n\n  - A running [Docker](https://www.docker.com/) environment\n  - [Node.js](https://nodejs.org/) or [io.js](https://iojs.org)\n\n## Install\n\n - **Install Muguet**\n```bash\nnpm install -g muguet\n```\n\n - **Start Muguet (as root)**\n```bash\nsudo muguet up \n```\n\n## Usage\n\n```bash\nsudo muguet up [options]\n\n# or\nsudo -E bash -c 'muguet up [options]'\n```\n\nNotes:\n  - *Muguet* **must** be run as *root* to be able to bind port 80\n  - *Muguet* needs to read *DOCKER_HOST* and *DOCKER_CERT_PATH* environment variables. If these variables are not available, *Muguet*\n    will try to guess it from `docker-machine` or `boot2docker` (if detected).\n  - If the previous method fails, please consider running *Muguet* like `sudo -E bash -c 'muguet up'` as it makes all needed environment \n  variables (eg. from your normal user env) available to the *muguet* command (eg. to the root user).\n\n\n## Generated hostnames\n\nFor each container, *Muguet* generates several DNS entries:\n\n  - `container_id`.docker\n  - `hostname`.docker (when running a container with -h option)\n  - `compose-service`.docker (if using Docker Compose)\n  - And possibly others based on the `org.muguet.dns.subdomain-map` label (see below) \n\n\n\n## Labels\n\nDocker `labels` are used as configuration settings.\n\n#### org.muguet.reverse-proxy.enabled\n\nSet it to `1` to enable the reverse-proxy (only enable reverse-proxy for web apps).\n\n\n#### org.muguet.reverse-proxy.only-ports\n\nA comma-separated list of ports that you want to *proxify*. \n\n\n#### org.muguet.dns.subdomain-map\n\nA comma-separated list of `subdomain:port` to map.\n\n## Example\n\n```yml\n# site1 will be accessible on http://site1.docker \nsite1:\n  build: ./build/docker/site1\n  ports:\n    - \"8081\"\n  labels:\n    # We enable the reverse-proxy so the app will be available on port 80 rather than 8081\n    - \"org.muguet.reverse-proxy.enabled=1\" \n    \n# site2 will be accessible on http://site2.docker and on http://back-office.docker \nsite2:\n  build: ./build/docker/site2\n  hostname: back-office\n  ports:\n    - \"8082\"\n  labels:\n    # We enable the reverse-proxy so the app will be available on port 80 rather than 8082\n    - \"org.muguet.reverse-proxy.enabled=1\"\n      \n# More complex      \n# despite not recommended, this container expose several services (mysql, apache, node.js)\n# So we have to setup a subdomain-map so each service will be given a distinct hostname\nbigcontainer: \n  image: big/big-container\n  ports:\n    - \"3306\"\n    - \"80\"\n    - \"8990\"\n  labels:\n    # Enable reverse-proxy\n    - \"org.muguet.reverse-proxy.enabled=1\"\n    # Reverse-proxy only web apps, but NOT MySQL\n    - \"org.muguet.reverse-proxy.only-ports=80,8990\"\n    # Will bind:\n    #   apache.bigcontainer.docker\n    #   nodejs.bigcontainer.docker\n    #   mysql.bigcontainer.docker\n    - \"org.muguet.dns.subdomain-map=apache:80,nodejs:8990,mysql:3306\"\n    \n```\n    \n## Dashboard \u0026 REST API\n\nA dashboard and a REST API are available on port `9876` (customizable with `--api-port`) and proxified on port 80. \nA default domain `muguet.docker` (or `muguet.{domain}`) is generated so you can access it \nthrough [http://muguet.docker](http://muguet.docker)\n\n![Muguet Dashboard](https://github.com/mattallty/muguet/raw/master/assets/muguet-dashboard.png)\n\u003e Muguet dashboard screenshot\n\n### Routes\n    \n#### GET /proxy-routes\n\nSample response:\n\n```json\n[\n   {\n      \"hostname\": \"amc.docker\",\n      \"hostname_aliases\": [\n         \"6e99d3b06a96.docker\"\n      ],\n      \"port\": 80,\n      \"container_public_addr\": \"192.168.59.103\",\n      \"container_public_port\": 32807,\n      \"container_private_addr\": \"172.17.0.27\",\n      \"container_private_port\": 8081,\n      \"stats\": {\n         \"requestsPerSecond\": {\n            \"mean\": 0.2966363784797275,\n            \"count\": 31,\n            \"currentRate\": 0,\n            \"1MinuteRate\": 0.10176713940255401,\n            \"5MinuteRate\": 0.07466202401314313,\n            \"15MinuteRate\": 0.030908019247845135\n         }\n      }\n   },\n   {\n      \"hostname\": \"bidder.docker\",\n      \"hostname_aliases\": [\n         \"716aed81e348.docker\"\n      ],\n      \"port\": 80,\n      \"container_public_addr\": \"192.168.59.103\",\n      \"container_public_port\": 32805,\n      \"container_private_addr\": \"172.17.0.26\",\n      \"container_private_port\": 8888,\n      \"stats\": {\n         \"requestsPerSecond\": {\n            \"mean\": 0.1465148084182472,\n            \"count\": 11,\n            \"currentRate\": 0.14651508145817516,\n            \"1MinuteRate\": 0.07930845785007225,\n            \"5MinuteRate\": 0.030976204019790073,\n            \"15MinuteRate\": 0.011553349126873487\n         }\n      }\n   },\n   {\n      \"hostname\": \"ggs.docker\",\n      \"hostname_aliases\": [\n         \"af9fcb68cba5.docker\"\n      ],\n      \"port\": 80,\n      \"container_public_addr\": \"192.168.59.103\",\n      \"container_public_port\": 8977,\n      \"container_private_addr\": \"172.17.0.24\",\n      \"container_private_port\": 80,\n      \"stats\": {\n         \"requestsPerSecond\": {\n            \"mean\": 2.483748695174352,\n            \"count\": 98,\n            \"currentRate\": 2.4837488374391983,\n            \"1MinuteRate\": 1.145862706419387,\n            \"5MinuteRate\": 0.30380239525696306,\n            \"15MinuteRate\": 0.10627732962540533\n         }\n      }\n   },\n   {\n      \"hostname\": \"elastic.elk.docker\",\n      \"hostname_aliases\": [\n         \"elastic.204e82433b37.docker\"\n      ],\n      \"port\": 80,\n      \"container_public_addr\": \"192.168.59.103\",\n      \"container_public_port\": 32799,\n      \"container_private_addr\": \"172.17.0.23\",\n      \"container_private_port\": 9200,\n      \"stats\": {\n         \"requestsPerSecond\": {\n            \"mean\": 0.17819638140552524,\n            \"count\": 3,\n            \"currentRate\": 0.17819639593817688,\n            \"1MinuteRate\": 0.04060856509152555,\n            \"5MinuteRate\": 0.009592005588775196,\n            \"15MinuteRate\": 0.0032873612833828627\n         }\n      }\n   },\n   {\n      \"hostname\": \"kibana.elk.docker\",\n      \"hostname_aliases\": [\n         \"kibana.204e82433b37.docker\"\n      ],\n      \"port\": 80,\n      \"container_public_addr\": \"192.168.59.103\",\n      \"container_public_port\": 8976,\n      \"container_private_addr\": \"172.17.0.23\",\n      \"container_private_port\": 80,\n      \"stats\": {\n         \"requestsPerSecond\": {\n            \"mean\": 3.3543803658698623,\n            \"count\": 19,\n            \"currentRate\": 3.354381223966475,\n            \"1MinuteRate\": 0.3038312244085719,\n            \"5MinuteRate\": 0.06280847547785395,\n            \"15MinuteRate\": 0.021052577581392007\n         }\n      }\n   }\n]\n```\n\n#### GET /dns-entries\n\nSample response:\n\n```json\n{\n  \"amc.docker\": \"127.0.0.1\",\n  \"6e99d3b06a96.docker\": \"127.0.0.1\",\n  \"bidder.docker\": \"127.0.0.1\",\n  \"716aed81e348.docker\": \"127.0.0.1\",\n  \"aerospike.docker\": \"172.17.0.25\",\n  \"7bca6d1858ca.docker\": \"172.17.0.25\",\n  \"ggs.docker\": \"127.0.0.1\",\n  \"af9fcb68cba5.docker\": \"127.0.0.1\",\n  \"elk.docker\": \"127.0.0.1\",\n  \"204e82433b37.docker\": \"127.0.0.1\",\n  \"elastic.elk.docker\": \"127.0.0.1\",\n  \"elastic.204e82433b37.docker\": \"127.0.0.1\",\n  \"kibana.elk.docker\": \"127.0.0.1\",\n  \"kibana.204e82433b37.docker\": \"127.0.0.1\"\n}\n```","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmattallty%2Fmuguet","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmattallty%2Fmuguet","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmattallty%2Fmuguet/lists"}