{"id":17925014,"url":"https://github.com/zerowidth/ringleader","last_synced_at":"2025-07-06T16:32:38.260Z","repository":{"id":3910254,"uuid":"4999073","full_name":"zerowidth/ringleader","owner":"zerowidth","description":"A proxy server for on-demand socket applications","archived":false,"fork":false,"pushed_at":"2016-02-24T04:30:31.000Z","size":380,"stargazers_count":103,"open_issues_count":1,"forks_count":11,"subscribers_count":9,"default_branch":"master","last_synced_at":"2025-05-20T15:05:44.252Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"","language":"Ruby","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/zerowidth.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGES.md","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":"2012-07-12T04:48:56.000Z","updated_at":"2025-05-06T11:46:52.000Z","dependencies_parsed_at":"2022-08-21T01:20:12.297Z","dependency_job_id":null,"html_url":"https://github.com/zerowidth/ringleader","commit_stats":null,"previous_names":[],"tags_count":18,"template":false,"template_full_name":null,"purl":"pkg:github/zerowidth/ringleader","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zerowidth%2Fringleader","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zerowidth%2Fringleader/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zerowidth%2Fringleader/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zerowidth%2Fringleader/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/zerowidth","download_url":"https://codeload.github.com/zerowidth/ringleader/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zerowidth%2Fringleader/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":261224294,"owners_count":23126930,"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-10-28T20:51:58.562Z","updated_at":"2025-07-06T16:32:38.237Z","avatar_url":"https://github.com/zerowidth.png","language":"Ruby","funding_links":[],"categories":[],"sub_categories":[],"readme":"```plain\n       _____\n      (, /   ) ,          /)          /)\n        /__ /   __   _   //  _  _   _(/  _  __\n     ) /   \\__(_/ (_(_/_(/__(/_(_(_(_(__(/_/ (_\n    (_/            .-/\n                  (_/\n```\n\nRingleader is an application proxy for socket applications.\n\n## Is it any good?\n\n[Yes](http://news.ycombinator.com/item?id=3067434).\n\n## What's it for?\n\nI designed this for a large suite of apps running behind nginx with a somewhat\ncomplex routing configuration. Additionally, many of the apps required active\n[resque](https://github.com/defunkt/resque/) pollers to run properly. Ultimately\nthis meant having many terminal windows open just to make a few requests to the\napps. Instead, I wanted something to manage all that for me.\n\nBefore, each app in a terminal, started manually:\n\n                                    +-------+\n                                 +-\u003e| app 1 |\n                                 |  +-------+\n                  +-----------+  |\n      http        |           |  |  +-------+\n    requests ---\u003e |   nginx   +--+-\u003e| app 2 |\n                  |           |  |  +-------+\n                  +-----------+  |\n                                 |  +-------+\n                                 +-\u003e| app n |\n                                    +-------+\n\nAfter, apps managed by ringleader, started on demand:\n\n                                                        +-------+\n                                                     +-\u003e| app 1 |\n                                                     |  +-------+\n                  +-----------+    +--------------+  |\n      http        |           |    |              |  |  +-------+\n    requests ---\u003e |   nginx   +---\u003e|  ringleader  +--+-\u003e| app 2 |\n                  |           |    |              |  |  +-------+\n                  +-----------+    +--------------+  |\n                                                     |  +-------+\n                                                     +-\u003e| app n |\n                                                        +-------+\n\nRingleader gives on-demand startup and proxying for any TCP server program. It\ncan be a rails app managed with foreman, a node app, or simply a shell command\nto start netcat.\n\n## Isn't this just like inetd?\n\nPretty much. But with pretty colors in console and a nice web interface.\n\n## Web interface?\n\nYep. Hook it up with [fluid](http://fluidapp.com) and put it in the menu bar. By\ndefault it runs at [http://localhost:42000](http://localhost:42000).\n\n\n![screenshot of ringleader control panel](screenshot.png)\n\n## Installation\n\n    $ gem install ringleader\n    $ ringleader --help\n\n## Configuration\n\nRingleader requires a yml configuration file to start. It should look something\nlike this:\n\n```yml\n---\n# name of app (used in logging)\nmain_app:\n\n  # Required settings\n  dir: \"~/apps/main\"       # Working directory\n  command: \"foreman start\" # The command to run to start up the app server.\n                           # Executed under \"bash -c\".\n  server_port: 3000        # The port ringleader listens on\n  app_port: 4000           # The port the application listens on\n\n  # Optional settings\n  host: 127.0.0.1          # The host ringleader should listen on\n  idle_timeout: 6000       # Idle timeout in seconds, 0 for infinite\n  startup_timeout: 180     # Application startup timeout\n  disabled: true           # Set the app to be disabled when ringleader starts\n  env:                     # Override or set environment variables inherited\n    FOO: hello             # from the current environment. Use nil to unset a\n    BAR: nil               # var.\n  kill_with: INT           # Signal to use to kill the process tree with. Use\n                           # TERM or KILL if the default is leaving zombies.\n  run_on_load: false       # Set this to true to start an app when ringleader\n                           # loads.\n\n  # If you have an application managed by rvm, this setting automatically adds\n  # the rvm-specific shell setup before executing the given command. This\n  # supersedes the `command` setting.\n  rvm: \"foreman start\"\n\n  # Likewise for rbenv:\n  rbenv: \"foreman start\"\n\n  # And chruby:\n  chruby: \"foreman start\"\n\nother_app:\n  [...]\n```\n\n## Known issues\n\n### Too many open files - pipe (Errno::EMFILE)\n\nYou may get this error if you have a high number of projects in your ringleader file. It happens because Celluloid::IO is trying to opens more file descriptors that your OS allows. This number is different for each version of SO and you can check it running ```ulimit -a```.\n\nYou can increase the maximum number of open file descriptors using the ```ulimit -n NUMBER```. Currently I'm using  ```ulimit -n 1024``` with a huge ringleader file.\n\nIf you are using OS X [check it](http://superuser.com/questions/827984/open-files-limit-does-not-work-as-before-in-osx-yosemite).\n\n## License\n\nMIT, see `LICENSE`.\n\nTop hat icon by [Luka Taylor](http://lukataylo.deviantart.com/gallery/#/d2g95fp)\nunder a Creative Commons Attribution/Non-commercial license.\n\n## Contributing\n\n1. Fork it\n2. Create your feature branch (`git checkout -b my-new-feature`)\n3. Commit your changes (`git commit -am 'Add some feature'`)\n4. Push to the branch (`git push origin my-new-feature`)\n5. Create new Pull Request\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fzerowidth%2Fringleader","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fzerowidth%2Fringleader","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fzerowidth%2Fringleader/lists"}