{"id":30196593,"url":"https://github.com/ebayclassifiedsgroup/panteras","last_synced_at":"2025-08-13T05:27:13.454Z","repository":{"id":23593421,"uuid":"26962021","full_name":"eBayClassifiedsGroup/PanteraS","owner":"eBayClassifiedsGroup","description":"PanteraS - PaaS - Platform as a Service in a box","archived":false,"fork":false,"pushed_at":"2021-10-20T12:14:52.000Z","size":522,"stargazers_count":200,"open_issues_count":3,"forks_count":60,"subscribers_count":27,"default_branch":"master","last_synced_at":"2025-05-27T08:50:49.577Z","etag":null,"topics":["consul","docker","fabio","haproxy","marathon","mesos","paas"],"latest_commit_sha":null,"homepage":"","language":"Shell","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"gpl-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/eBayClassifiedsGroup.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":"2014-11-21T13:57:12.000Z","updated_at":"2024-11-12T08:20:36.000Z","dependencies_parsed_at":"2022-08-23T01:20:51.097Z","dependency_job_id":null,"html_url":"https://github.com/eBayClassifiedsGroup/PanteraS","commit_stats":null,"previous_names":[],"tags_count":27,"template":false,"template_full_name":null,"purl":"pkg:github/eBayClassifiedsGroup/PanteraS","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/eBayClassifiedsGroup%2FPanteraS","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/eBayClassifiedsGroup%2FPanteraS/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/eBayClassifiedsGroup%2FPanteraS/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/eBayClassifiedsGroup%2FPanteraS/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/eBayClassifiedsGroup","download_url":"https://codeload.github.com/eBayClassifiedsGroup/PanteraS/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/eBayClassifiedsGroup%2FPanteraS/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":270184219,"owners_count":24541486,"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","status":"online","status_checked_at":"2025-08-13T02:00:09.904Z","response_time":66,"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":["consul","docker","fabio","haproxy","marathon","mesos","paas"],"created_at":"2025-08-13T05:26:43.569Z","updated_at":"2025-08-13T05:27:13.405Z","avatar_url":"https://github.com/eBayClassifiedsGroup.png","language":"Shell","funding_links":[],"categories":[],"sub_categories":[],"readme":"[![Build Status](https://travis-ci.org/eBayClassifiedsGroup/PanteraS.svg?branch=master)](https://travis-ci.org/eBayClassifiedsGroup/PanteraS)\n[![Docker Hub](https://img.shields.io/badge/docker-ready-blue.svg)](https://hub.docker.com/r/panteras/paas-in-a-box/)\n[![Current Release](https://img.shields.io/badge/release-0.4.4-blue.svg)](https://github.com/eBayClassifiedsGroup/PanteraS/releases/tag/v0.4.4)\n\n\n# PanteraS \u003cbr\u003e _entire_ Platform as a Service, in a box\n_\"One container to rule them all\"_\n\nNow you can create a completely dockerized environment for a platform as a service (PaaS) in no time!  \nPanteraS contains all the necessary components for a highly robust, highly available, fault tolerant PaaS.  \nThe goal is to spawn fully scalable, easy to monitor, debug and orchestrate services in seconds. Totally independent of\nthe underlying infrastructure. PanteraS is also fully transferable between development stages. You can run it on your laptop, \ntest and production systems without hassle.\n\n_\"You shall ~~not~~ PaaS\"_\n\n## Architecture\n\n### Components\n- Mesos + Marathon + ZooKeeper (orchestration components)\n- Consul (K/V store, monitoring, service directory and registry) + Registrator (automating register/ deregister)\n- Fabio (load balancer with dynamic config generation)\n\n![PanteraS Architecture](http://s3.amazonaws.com/easel.ly/all_easels/19186/panteras/image.jpg#)\n\n\n##### Master+Slave mode Container\nThis is the default configuration. It will start all components inside a container.  \nIt is recommended to run 3 master containers to ensure high availability of the PasteraS cluster.\n\n![Master Mode](http://s3.amazonaws.com/easel.ly/all_easels/19186/MasterMode/image.jpg#)\n\n##### Only Slave mode Container\nSlave mode is enabled by `MASTER=false`  \nIn this mode only slave components will start (master part is excluded).\nYou can run as many slaves as you wish - this is fully scalable.\n\n![Slave Mode](http://s3.amazonaws.com/easel.ly/all_easels/19186/SlaveMode/image.jpg)\n\n##### Multiple Datacenter supported by Consul\nTo connect multiple datacenters use `consul join -wan \u003cserver 1\u003e \u003cserver 2\u003e`\n\n![Consul multi DC](https://s3.amazonaws.com/easel.ly/all_easels/19186/consul/image.jpg)\n\n##### Combination of daemons startup\n\nDepending on `MASTER` and `SLAVE` you can define role of the container\n\n   daemon\\role    |  default    | Only Master | Only Slave\n   --------------:|:-----------:|:-----------:|:-------------:\n   .               |`MASTER=true`|`MASTER=true`| `MASTER=false`\n   .               |`SLAVE=true `|`SLAVE=false`| `SLAVE=true`\n   Consul         | x | x | x\n   Mesos Master   | x | x | -\n   Marathon       | x | x | -\n   Zookeeper      | x | x | -\n   Mesos Slave    | x | - | x\n   Registrator    | x | - | x\n   Fabio          | x | - | x\n   Traefik        | - | - | x\n   Netdata        | - | - | -\n\nOptional services (disabled by default) require manual override like `START_TRAEFIK=true`\n\n\n## Requirements:\n- docker \u003e= 1.12\n- docker-compose \u003e= 1.8.0\n\n## Usage:\nClone it\n```\ngit clone -b 0.4.4 https://github.com/eBayClassifiedsGroup/PanteraS.git\n\ncd PanteraS\n```\n#### Default: Stand alone mode\n(master and slave in one box)\n```\n# vagrant up\n```\nor\n```\n# IP=\u003cDOCKER_HOST_IP\u003e ./generate_yml.sh\n# docker-compose up -d\n```\n\n\n#### 3 Masters + N slaves:\n\nConfigure zookeeper and consul:\n```\neveryhost# mkdir restricted\neveryhost# echo 'ZOOKEEPER_HOSTS=\"masterhost-1:2181,masterhost-2:2181,masterhost-3:2181\"' \u003e\u003e restricted/host\neveryhost# echo 'CONSUL_HOSTS=\"-join=masterhost-1 -join=masterhost-2 -join=masterhost-3\"' \u003e\u003e restricted/host\neveryhost# echo 'MESOS_MASTER_QUORUM=2' \u003e\u003e restricted/host\n```\nLets set only masterhost-1 to bootstrap the consul\n``` \nmasterhost-1# echo 'CONSUL_PARAMS=\"-bootstrap-expect 3\"' \u003e\u003e restricted/host\nmasterhost-1# echo 'ZOOKEEPER_ID=1' \u003e\u003e restricted/host\nmasterhost-2# echo 'ZOOKEEPER_ID=2' \u003e\u003e restricted/host\nmasterhost-3# echo 'ZOOKEEPER_ID=3' \u003e\u003e restricted/host\n```    \nOptionally, if you have multiple IPs,\nset an IP address of docker host (do not use docker0 interface IP)  \nif you don't set it - it will try to guess `dig +short ${HOSTNAME}`\n``` \nmasterhost-1# echo 'IP=x.x.x.1' \u003e\u003e restricted/host\nmasterhost-2# echo 'IP=x.x.x.2' \u003e\u003e restricted/host\nmasterhost-3# echo 'IP=x.x.x.3' \u003e\u003e restricted/host\n```    \n\n##### Start containers:\n```\nmasterhost-n# ./generate_yml.sh\nmasterhost-n# docker-compose up -d\n```\n```\nslavehost-n# MASTER=false ./generate_yml.sh\nslavehost-n# docker-compose up -d\n```\n\n## Web Interfaces\n\nYou can reach the PaaS components\non the following ports:\n\n- Fabio: http://hostname:81\n- Consul: http://hostname:8500\n- Marathon: http://hostname:8080\n- Mesos: http://hostname:5050\n- Supervisord: http://hostname:9000\n- Netdata:  http://hostname:19999 (must run `START_NETDATA=true`)\n\n## Listening address\n\nAll PaaS components listen default on all interfaces (to all addresses: `0.0.0.0`),  \nwhich might be dangerous if you want to expose the PaaS.  \nUse ENV `LISTEN_IP` if you want to listen on specific IP address.  \nfor example:  \n`echo LISTEN_IP=192.168.10.10 \u003e\u003e restricted/host`  \nThis might not work for all services like Marathon that has some additional random ports.\n\n## Services Accessibility\n\nYou might want to access the PaaS and services\nwith your browser directly via service name like:\n\nhttp://your_service.service.consul\n\nThis could be problematic. It depends where you run docker host.\nWe have prepared two services that might help you solving this problem.\n\nDNS - which supposed to be running on every docker host,\nit is important that you have only one DNS server occupying port 53 on docker host,\nyou might need to disable yours, if you have already configured.\n\nIf you have direct access to the docker host DNS,\nthen just modify your /etc/resolv.conf adding its IP address.\n\nIf you do NOT have direct access to docker host DNS,\nyou can use [SSHuttle](https://github.com/apenwarr/sshuttle) project  \nso you can tunnel DNS traffic over ssh\n\n## Running an example application\n\nThere are two examples available:  \n`SimpleWebappPython` - basic example - spawn 2x2 containers  \n`SmoothWebappPython` - similar to previous one, but with smooth scaling down  \n\nFabio will balance the ports which where mapped and assigned by marathon. \n\nFor non human access like services intercommunication, you can use direct access \nusing DNS consul SRV abilities, to verify answers:\n\n```\n$ dig python.service.consul +tcp SRV\n```\n\nor ask consul DNS directly:\n\n```\n$ dig @$CONSUL_IP -p8600  python.service.consul +tcp SRV\n```\n\n\n## Deploy using marathon_deploy\n\nYou can deploy your services using `marathon_deploy`, which also understand YAML and JSON files.\nAs a benefit, you can have static part in YAML deployment plans, and dynamic part (like version or URL)\nset with `ENV` variables, specified with `%%MACROS%%` in deployment plan.\n\n```apt-get install ruby1.9.1-dev```  \n```gem install marathon_deploy```  \n\nmore info: https://github.com/eBayClassifiedsGroup/marathon_deploy\n\n\n## References\n\n[1] https://www.docker.com/  \n[2] http://docs.docker.com/compose/  \n[3] http://stackoverflow.com/questions/25217208/setting-up-a-docker-fig-mesos-environment  \n[4] http://www.consul.io/docs/  \n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Febayclassifiedsgroup%2Fpanteras","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Febayclassifiedsgroup%2Fpanteras","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Febayclassifiedsgroup%2Fpanteras/lists"}