Release.php 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524
  1. <?php
  2. namespace FD3;
  3. use Symfony\Component\Console\Command\Command;
  4. use Symfony\Component\Console\Input\InputInterface;
  5. use Symfony\Component\Console\Input\InputArgument;
  6. use Symfony\Component\Console\Input\InputOption;
  7. use Symfony\Component\Console\Output\OutputInterface;
  8. use Docker\Composer\FileFormat2;
  9. use Symfony\Component\Yaml\Yaml;
  10. class Release extends Command
  11. {
  12. protected function configure()
  13. {
  14. $this
  15. ->setName('make:install')
  16. ->setDescription('Create a new install.')
  17. ->setHelp('This command allows you to create a new installation...')
  18. ->addArgument('dir', InputArgument::REQUIRED, 'The directory where to create the installation.')
  19. ->addOption('base-repo',null, InputOption::VALUE_REQUIRED, 'Git clone Url fot the app Base', "git@bitbucket.org:ikflowdat/base.git")
  20. ->addOption('base-ref', null, InputOption::VALUE_REQUIRED, 'Git reference (branch or tag) to clone the Base app', "master")
  21. ->addOption('ftth-repo',null, InputOption::VALUE_REQUIRED, 'Git clone Url fot the app FTTH', "git@bitbucket.org:ikflowdat/ftth.git")
  22. ->addOption('ftth-ref', null, InputOption::VALUE_REQUIRED, 'Git reference (branch or tag) to clone the Ftth ', "master")
  23. ->addOption('mapas-repo',null, InputOption::VALUE_REQUIRED, 'Git clone Url fot the app Mapas', "git@bitbucket.org:ikflowdat/mapas.git")
  24. ->addOption('mapas-ref', null, InputOption::VALUE_REQUIRED, 'Git reference (branch or tag) to clone the Mapas app', "master")
  25. ->addOption('radius-repo',null, InputOption::VALUE_REQUIRED, 'Git clone Url fot the app radius', "git@bitbucket.org:ikflowdat/radius.git")
  26. ->addOption('radius-ref', null, InputOption::VALUE_REQUIRED, 'Git reference (branch or tag) to clone the radius app', "master")
  27. ->addOption('stats-repo',null, InputOption::VALUE_REQUIRED, 'Git clone Url fot the app Base', "git@bitbucket.org:ikflowdat/stats.git")
  28. ->addOption('stats-ref', null, InputOption::VALUE_REQUIRED, 'Git reference (branch or tag) to clone the Stats app', "master")
  29. ->addOption('extra-repo',null, InputOption::VALUE_REQUIRED, 'Git clone Url fot the app Base', "git@bitbucket.org:ikflowdat/extra.git")
  30. ->addOption('extra-ref', null, InputOption::VALUE_REQUIRED, 'Git reference (branch or tag) to clone the Extra files and apps', "master")
  31. ->addOption('host-ip', null, InputOption::VALUE_REQUIRED, 'Ip of the runnning host to be added to the /etc/hosts file, eventually', "127.0.1.1")
  32. ->addOption('domain', null, InputOption::VALUE_REQUIRED, 'Domain where the flowdat will be installed', "fd3.flowdat.com")
  33. ->addOption('docker-tag', null, InputOption::VALUE_REQUIRED, 'Docker tag to be used', "latest")
  34. ;
  35. }
  36. protected function execute(InputInterface $input, OutputInterface $output)
  37. {
  38. $dir = $input->getArgument('dir');
  39. $domain = $input->getOption("domain");
  40. $docker_tag = $input->getOption("docker-tag");
  41. $dObj = new DevOps\FileSystem($dir);
  42. $dObj->dirExists()->realpath();
  43. $install_config = array(
  44. "base" => array(
  45. 'url' => $input->getOption("base-repo"),
  46. 'branch' => $input->getOption("base-ref"),
  47. ),
  48. "ftth" => array(
  49. 'url' => $input->getOption("ftth-repo"),
  50. 'branch' => $input->getOption("ftth-ref"),
  51. ),
  52. "mapas" => array(
  53. 'url' => $input->getOption("mapas-repo"),
  54. 'branch' => $input->getOption("mapas-ref"),
  55. ),
  56. "radius" => array(
  57. 'url' => $input->getOption("radius-repo"),
  58. 'branch' => $input->getOption("radius-ref"),
  59. ),
  60. "stats" => array(
  61. 'url' => $input->getOption("stats-repo"),
  62. 'branch' => $input->getOption("stats-ref"),
  63. ),
  64. "extra" => array(
  65. 'url' => $input->getOption("extra-repo"),
  66. 'branch' => $input->getOption("extra-ref"),
  67. ),
  68. );
  69. $dObj->file("git.ini")->writeIniConfig($install_config);
  70. $dObj->file("docker-compose.yml")->content(
  71. $this->getDockerComposer( $docker_tag, "host.env", "docker.infra.flowdat.com/", $domain)
  72. );
  73. $config_ip = $input->getOption("host-ip");
  74. $hostConfig = $this->getHostConfig($config_ip, $domain);
  75. $hostfile_content = "";
  76. foreach($hostConfig as $host => $ip){
  77. $hostfile_content .= $ip . "\t". $host. "\n";
  78. }
  79. $dObj->file("hostsFile")->content($hostfile_content);
  80. $hostEnvConfig = $this->getHostEnv($domain);
  81. $env_content = "";
  82. foreach($hostEnvConfig as $var => $val){
  83. $env_content .= $var."=".$val."\n";
  84. }
  85. $dObj->file('host.env')->content($env_content);
  86. foreach(array("ftth", "mapas", "stats") as $app){
  87. $dObj->file($app.'.oauth.env')->content("");
  88. }
  89. $dObj->file('install.yml')->content(
  90. yaml::dump(array(
  91. "install_dir" => realpath($dir),
  92. 'docker_apps' => array('base', /*'stats', 'ftth', 'mapas'*/),
  93. 'domain' => $domain,
  94. )
  95. )
  96. );
  97. $dObj->file('ansible.cfg')->content(
  98. "[defaults]
  99. inventory=inventory.ini
  100. "
  101. );
  102. }
  103. function getHostEnv($fd_domain = "fd3.flowdat.com"){
  104. return array(
  105. "HOST_BASE" => "base.". $fd_domain,
  106. "HOST_FTTH" => "ftth.". $fd_domain,
  107. "HOST_MAPAS" => "mapas.".$fd_domain,
  108. "HOST_STATS" => "stats.".$fd_domain,
  109. "HOST_GRAFANA" => "grafana.".$fd_domain,
  110. "HOST_PMA" => "pma.".$fd_domain,
  111. );
  112. }
  113. function getHostConfig($config_ip, $fd_domain = "fd3.flowdat.com"){
  114. return array(
  115. "base.". $fd_domain => $config_ip,
  116. "ftth.". $fd_domain => $config_ip,
  117. "mapas.". $fd_domain => $config_ip,
  118. "stats.". $fd_domain => $config_ip,
  119. "grafana.". $fd_domain => $config_ip,
  120. "pma.". $fd_domain => $config_ip,
  121. );
  122. }
  123. function addBase($composer, $config = array(), $flavor = "dev"){
  124. $version = "latest";
  125. $domain = "fd3.flowdat.com";
  126. extract($config);
  127. $composer->addService("base")
  128. ->image($registry."fd3/base:" . $version)
  129. ->build("./base/")
  130. ->restart("always")
  131. ->addLinks("mysql")
  132. ->addLinks("amqp")
  133. ->addEnviroment("VIRTUAL_HOST", "base.".$domain)
  134. ->addEnviroment("HOST_FTTH", "ftth.".$domain)
  135. ->addEnviroment("HOST_STATS", "stats.".$domain)
  136. ->addEnviroment("HOST_MAPAS", "mapas.".$domain)
  137. ->addEnviroment("HOST_BASE", "base." .$domain)
  138. ->addVolumes("./base/", "/opt/base")
  139. ;
  140. }
  141. function addFtth($composer, $config = array(), $flavor = "dev"){
  142. $version = "latest";
  143. $domain = "fd3.flowdat.com";
  144. extract($config);
  145. $composer->addService("ftth")
  146. ->image($registry."fd3/ftth:" . $version)
  147. ->build("./ftth/")
  148. ->restart("always")
  149. ->addLinks("mysql")
  150. ->addLinks("base")
  151. ->addLinks("amqp")
  152. ->addLinks("base", "base.".$domain)
  153. ->addEnv_file("ftth.oauth.env")
  154. ->addEnviroment("VIRTUAL_HOST", "ftth.".$domain)
  155. ->addEnviroment("HOST_FTTH", "ftth.".$domain)
  156. ->addEnviroment("HOST_STATS", "stats.".$domain)
  157. ->addEnviroment("HOST_MAPAS", "mapas.".$domain)
  158. ->addEnviroment("HOST_BASE", "base.".$domain)
  159. //->addEnviroment("OAUTH_CLIENT_ID", $oauth_client)
  160. //->addEnviroment("OAUTH_CLIENT_SECRET", $oauth_client_secret)
  161. //->addEnviroment("HTTPS_METHOD", "nohttps")
  162. ->addVolumes("./ftth/", "/opt/ftth")
  163. ;
  164. }
  165. function addStats($composer, $config = array(), $flavor = "dev"){
  166. $version = "latest";
  167. $domain = "fd3.flowdat.com";
  168. extract($config);
  169. $composer->addService("stats")
  170. ->image($registry."fd3/stats:" . $version)
  171. ->build("./stats/")
  172. ->addLinks("mysql")
  173. ->addLinks("base")
  174. ->addLinks("amqp")
  175. ->addLinks("base", "base.".$domain)
  176. //->addLinks("jsendpoint", "endpoint")
  177. //->addLinks("statsd", "statsd")
  178. ->addVolumes("./stats/", "/opt/stats")
  179. ->addEnv_file("stats.oauth.env")
  180. ->addEnviroment("VIRTUAL_HOST", "stats.".$domain)
  181. ->addEnviroment("HOST_FTTH", "ftth.".$domain)
  182. ->addEnviroment("HOST_STATS", "stats.".$domain)
  183. ->addEnviroment("HOST_MAPAS", "mapas.".$domain)
  184. ->addEnviroment("HOST_BASE", "base.".$domain)
  185. //->addEnviroment("OAUTH_CLIENT_ID", $oauth_client)
  186. //->addEnviroment("OAUTH_CLIENT_SECRET", $oauth_client_secret)
  187. //->addEnviroment("HTTPS_METHOD", "nohttps")
  188. ;
  189. }
  190. function addMapas($composer, $config = array(), $flavor = "dev"){
  191. $version = "latest";
  192. $domain = "fd3.flowdat.com";
  193. extract($config);
  194. $composer->addService("mapas")
  195. ->image($registry."fd3/mapas:" . $version)
  196. ->build("./mapas/")
  197. ->addLinks("mysql")
  198. ->addLinks("base")
  199. ->addLinks("amqp")
  200. ->addLinks("base", "base.".$domain)
  201. ->addEnv_file("mapas.oauth.env")
  202. ->addEnviroment("VIRTUAL_HOST", "mapas.".$domain)
  203. ->addEnviroment("HOST_FTTH", "ftth.".$domain)
  204. ->addEnviroment("HOST_STATS", "stats.".$domain)
  205. ->addEnviroment("HOST_MAPAS", "mapas.".$domain)
  206. ->addEnviroment("HOST_BASE", "base.".$domain)
  207. ->addVolumes("./mapas/", "/opt/mapas")
  208. ->addVolumes("./mapas/web/uploads", "/opt/mapas/web/uploads")
  209. ;
  210. }
  211. function addNginx($composer, $config = array(), $flavor = "dev"){
  212. $version = "latest";
  213. $domain = "fd3.flowdat.com";
  214. $host_env_file = "host.env";
  215. extract($config);
  216. $composer->addService("nginx")->build("extra/nginx/")
  217. ->image($registry."fd3/nginx:".$version)
  218. ->addEnv_file($host_env_file)
  219. ->restart("always")
  220. ->addPorts(80, 80)
  221. ->addPorts(443, 443)
  222. ->addVolumes("/var/run/docker.sock", "/tmp/docker.sock:ro")
  223. ->addVolumes("./extra/nginx/certs", "/etc/nginx/certs:ro")
  224. ->addVolumes("./extra/nginx/vhost.d", "/etc/nginx/vhost.d")
  225. ->addVolumes("./extra/nginx/share", "/usr/share/nginx/html")
  226. ;
  227. }
  228. function addMongDb($composer, $config = array(), $flavor = "dev"){
  229. $version = "latest";
  230. $domain = "fd3.flowdat.com";
  231. $mongdb_version = "3.4";
  232. extract($config);
  233. $composer->addService("mongodb")
  234. ->image("mongo:". $mongdb_version)
  235. ->addVolumes("./mongodb", "/data/db")
  236. ;
  237. }
  238. function addSupervisord($composer, $config = array(), $flavor = "dev"){
  239. $version = "latest";
  240. extract($config);
  241. $composer->addService("supervisord")->build("./extra/supervisord")
  242. ->image($registry."fd3/supervisord:$version")
  243. ->privileged(true)
  244. ->restart("always")
  245. ->addEnviroment("./extra/supervisord/", "/etc/supervisord/")
  246. ->addEnviroment("./extra/supervisord/var/", "/var/log/supervisor/")
  247. ->addEnviroment("./extra/supervisord/sshd_config", "/etc/ssh/sshd_config")
  248. ->addEnviroment("./extra/supervisord/bin/fiberhome", "/usr/bin/fiberhome")
  249. ->addEnviroment("./extra/supervisord/bin/fiberlink", "/usr/bin/fiberlink")
  250. ;
  251. }
  252. function addMySql($composer, $config = array(), $flavor = "dev"){
  253. $version = "latest";
  254. $domain = "fd3.flowdat.com";
  255. extract($config);
  256. $composer->addService("mysql")->image($registry."fd3/mysql:". $version)
  257. ->build("./extra/mysql")
  258. ->addVolumes("./mysql/", "/var/lib/mysql/")
  259. ->addEnviroment("MYSQL_ROOT_PASSWORD", $mysql_root_pass)
  260. ->addEnviroment("MYSQL_USER", $mysql_user)
  261. ->addEnviroment("MYSQL_PASSWORD", $mysql_pass)
  262. ;
  263. }
  264. function addGrafana($composer, $config = array(), $flavor = "dev"){
  265. $version = "latest";
  266. $domain = "fd3.flowdat.com";
  267. extract($config);
  268. $composer->addService("grafana")->image("grafana/grafana")
  269. //->addLinks("jsendpoint","endpoint")
  270. ->addLinks("mysql")
  271. ->restart("always")
  272. ->addEnviroment("VIRTUAL_HOST", "grafana.".$domain)
  273. ->addEnviroment("HTTPS_METHOD", "nohttps")
  274. ->addEnviroment("./statsd/grafana/lib", "/var/lib/grafana")
  275. ->addEnviroment("GF_SECURITY_ADMIN_PASSWORD", "queRini6")
  276. ->addEnviroment("GF_INSTALL_PLUGINS", "grafana-simple-json-datasource")
  277. ->addEnviroment("GF_DEFAULT_THEME", "light")
  278. ->addEnviroment("GF_AUTH_ANONYMOUS_ORG_NAME", "Main Org.")
  279. ->addEnviroment("GF_AUTH_ANONYMOUS_ORG_ROLE", "Viewer")
  280. ->addEnviroment("GF_AUTH_ANONYMOUS_ENABLED", "true")
  281. ->addEnviroment("GF_DATABASE_URL", "mysql://root:".$mysql_root_pass."@mysql:3306/grafana")
  282. ->addEnviroment("GF_SERVER_ROOT_URL", "http://grafana.".$domain."/")
  283. ;
  284. }
  285. function addJsonEndPoints($composer, $config = array(), $flavor = "dev"){
  286. $version = "latest";
  287. $domain = "fd3.flowdat.com";
  288. extract($config);
  289. $composer->addService("statsd")->build("./extra/statsd/statsd")
  290. ->image($registry."fd3/statsd:$version")
  291. ->addPorts("8125", "8125/udp")
  292. ->addLinks("mysql")
  293. ->addLinks("mongodb")
  294. ->restart("always")
  295. ->addVolumes("./extra/statsd/statsd/statsd.config.js", "/opt/config/statsd.config.js")
  296. ;
  297. $composer->addService("jsendpoint")
  298. ->build("./extra/statsd/endpoint/json")
  299. ->image($registry."fd3/jsonep:$version")
  300. ->addVolumes("./extra/statsd/endpoint/json", "/opt/datasource")
  301. ->addLinks("jsonep_mysql")
  302. ->addLinks("jsonep_mongo")
  303. ->restart("always")
  304. ;
  305. $composer->addService("jsonep_mysql")
  306. ->build("./extra/statsd/endpoint/mysql")
  307. ->image($registry."fd3/jsonep_mysql:$version")
  308. ->addVolumes("./extra/statsd/endpoint/mysql", "/opt/datasource")
  309. ->addLinks("mysql")
  310. ->addEnviroment("MYSQL_ROOT_PASSWORD", $mysql_root_pass)
  311. ->restart("always")
  312. ;
  313. $composer->addService("jsonep_mongo")
  314. ->build("./extra/statsd/endpoint/mongodb")
  315. ->image($registry."fd3/jsonep_mongo:$version")
  316. ->addVolumes("./extra/statsd/endpoint/mongodb", "/opt/datasource")
  317. ->addLinks("mongodb")
  318. ->restart("always")
  319. ;
  320. }
  321. function addCommandWorkers($composer, $config = array(), $flavor = "dev"){
  322. $version = "latest";
  323. $domain = "fd3.flowdat.com";
  324. extract($config);
  325. $composer->addService("base_log_worker")->image($registry."fd3/base:" . $version)
  326. ->build("./base/")
  327. ->command("bin/console rabbitmq:consumer log_consumer")
  328. ->restart("always")
  329. ->addLinks("mysql")
  330. ->addLinks("base")
  331. ->addLinks("amqp")
  332. ->addLinks("nginx", "base.".$domain)
  333. ->addVolumes("./base/", "/opt/base")
  334. ;
  335. $composer->addService("ftth_command_worker")->image($registry."fd3/ftth:" . $version)
  336. ->build("./ftth/")
  337. ->command("bin/console rabbitmq:consumer command_consumer")
  338. ->restart("always")
  339. ->addLinks("mysql")
  340. ->addLinks("base")
  341. ->addLinks("amqp")
  342. ->addLinks("nginx", "base.".$domain)
  343. ->addVolumes("./ftth/", "/opt/ftth")
  344. ;
  345. $composer->addService("ftth_tasklogger_worker")->image($registry."fd3/ftth:" . $version)
  346. ->build("./ftth/")
  347. ->command("bin/console rabbitmq:consumer flowdat_tasklogger")
  348. ->restart("always")
  349. ->addLinks("mysql")
  350. ->addLinks("base")
  351. ->addLinks("amqp")
  352. ->addLinks("nginx", "base.".$domain)
  353. ->addVolumes("./ftth/", "/opt/ftth")
  354. ;
  355. $composer->addService("stats_command_worker")->image($registry."fd3/ftth:" . $version)
  356. ->build("./stats/")
  357. ->command("bin/console rabbitmq:consumer command_consumer")
  358. ->restart("always")
  359. ->addLinks("mysql")
  360. ->addLinks("base")
  361. ->addLinks("amqp")
  362. ->addLinks("nginx", "base.".$domain)
  363. ->addVolumes("./stats/", "/opt/stats")
  364. ;
  365. }
  366. function getDockerComposer( $version = "latest", $host_env_file = "host.env", $registry = "docker.infra.flowdat.com/", $fd_domain = "fd3.flowdat.com")
  367. {
  368. $mysql_root_pass="235r2342gtfsw";
  369. $mysql_user="iksop";
  370. $mysql_pass="235r2342gtfsw";
  371. $oauth_client = "1_3323sq6urn8kwccg8s4ok848ggwwgkw4c08wsc4cwkc08osocc";
  372. $oauth_client_secret = "5w7gx6ptdoo4g8cwwo88o8gowosgco84sso08ssow0osg88g8k";
  373. $composer = new FileFormat2("../");
  374. $base_vars = array("version" => $version, "host_env_file" => $host_env_file, "domain" => $fd_domain, "registry" => $registry);
  375. $this->addNginx($composer, $base_vars);
  376. /**************************************************************************************/
  377. /* Apps / Web UI */
  378. /**************************************************************************************/
  379. $this->addBase($composer, $base_vars);
  380. $this->addFtth($composer, $base_vars);
  381. $this->addStats($composer, $base_vars);
  382. $this->addMapas($composer, $base_vars);
  383. /**************************************************************************************/
  384. /* Servicios */
  385. /**************************************************************************************/
  386. $this->addMySql($composer, $base_vars + array(
  387. 'mysql_root_pass' => $mysql_root_pass,
  388. 'mysql_user' => $mysql_user,
  389. 'mysql_pass' => $mysql_pass,
  390. ));
  391. $composer->addService("amqp")->image("rabbitmq:3-management")
  392. ->restart("always")
  393. ;
  394. $this->addMongDb($composer, $base_vars);
  395. /**************************************************************************************/
  396. /* Grafana y compoenentes de las estadisticas*/
  397. /**************************************************************************************/
  398. $this->addGrafana($composer, $base_vars + array(
  399. 'mysql_user' => $mysql_user,
  400. 'mysql_pass' => $mysql_pass,
  401. 'mysql_root_pass' => $mysql_root_pass,
  402. ));
  403. $this->addJsonEndPoints($composer, $base_vars + array(
  404. 'mysql_root_pass' => $mysql_root_pass,
  405. ));
  406. /**************************************************************************************/
  407. /* Workers */
  408. /**************************************************************************************/
  409. $this->addSupervisord($composer, $base_vars);
  410. $this->addCommandWorkers($composer, $base_vars);
  411. //$composer->addService("phpmyadmin")->image("phpmyadmin/phpmyadmin")
  412. // ->restart("always")
  413. // ->addPorts(8080, 80)
  414. // ->addLinks("mysql", "db")
  415. // ->addEnviroment("MYSQL_ROOT_PASSWORD", $mysql_root_pass)
  416. // ->addEnviroment("VIRTUAL_HOST", "pma.".$fd_domain)
  417. // ->addEnviroment("HTTPS_METHOD", "nohttps")
  418. //;
  419. return $composer->render();
  420. }
  421. }