难部署的taiga,式微的circus——趋势从进程管理到容器管理,简单才是美
一直需要一个项目管理系统,一直没时间弄。
taiga是github上搜project management star最多的项目,又是基于django用python写的后端,所以就用它:

但是,集中精力折腾了一下,给我的感觉并不好。
taiga的部署,总的来说非常难受。
我没想到一个后端用django做api 前端coffee-script的玩意,竟然搞这么多配置文件,各种配置项互相引用。
它完全没赶上容器化的趋势,没有提供官方的docker镜像。
官方的部署教程, 读下来总体感觉就是乱。东1个配置文件,西1个配置文件,往下读后面还经常给出另外版本的配置文件。把http改成https,居然是多配置文件,每个给2个版本。TM有病啊。
越是难部署的过程,就越值得脚本化、容器化部署。但它复杂到搜taiga docker 项目好几个,但星级都不高,而且做法也都五花八门。

这些星级多的,也仅仅是按官方的前后,分成了2个镜像而已。有的也没有配官方给的taiga-events 没有celery。
我真正参考的是一个只有10星的(有颗还是我打的)项目:https://github.com/douglasmiranda/docker-taiga
优点是
1除了3个官方工程backend frontend events之外,还独立出了postgres的db,rabbitmq,celery_worker
2用了docker-compose,-配置了端口和存储路径,docker-compse up 直接启动
这才真正有点体现容器化的优势的意思。而且rabbitmq和celery的部署套路,对手里自己的项目的容器化部署,也有很好的借鉴意义(自己写的docker版的rabbitmq和celery的小demohttps://github.com/xuqinghan/celery-with-docker-compose)。还是给作者点个赞.
不爽的地方集中在:
1 把git clone写在dockerfile里了,但是taiga工程本身是会演进变化,有BUG的!这样看都不看直接打包进去,直接后果就是taiga配置项变化和小错误导致的部署失败,有些taiga docker 的作者都不知道怎么改。(其实老实把代码下载下来看看,都不难的)
2 因为难部署,所以为每个镜像再写点sh。本来就觉得配置复杂了啊,还要每个镜像再加点sh脚本。虽然一时配好了没问题,但是更增加了复杂度
总的来说——不满足:一处修改,多次执行的要求,而是到处修改,1次执行。
最终,这些用docker部署taiga的项目,我哪个都觉得别扭,参考它们之后,自己搞了一套。
总的原则是:
1代码和配置文件尽量都放在镜像外,启动时用-v挂进去。
2保证眼睛能看到到挂进去、COPY进去的都是什么东西.而且位置要集中,不要让我到处翻看(git clone 肯定得放外面)
3配置项太杂,配置文件太多,互相依赖(各端口号、主机名、本地路径、SERECT_KEY之类)需要脚本自动产生配置文件,自动添加配置文件
简单说:把所有值得配置的参数集中到唯一1个yml配置文件里,然后搞一套各种配置文件模板(包括全局的docker-compose, 和back front events db rabbitmq celery_work的dockerfile 以及需要COPY进各image的配置文件)。
运行的时候大致步骤:
读全局yml参数
用jinja2渲染出各配置文件
git clone下载好taiga各工程代码
执行docker-compose up(用它调用各镜像的build和容器启动)
——结果几天下来,一不留神就写成了1个工程https://github.com/xuqinghan/taiga-docker-compose。
回头看,其实是taiga的开发、部署统统落伍了。
taiga是2014年开发的,2015年获各种奖。

它官方安装文档里 部署时的进程管理工具,不是常用的supervisor,而用是circus。星级不高,近期也不活跃了。因为没人维护,导致在容器环境下,难安装(debian系的没有官方apt源,只有ppa,但其实也是2013年的,现在不能用),难用(自己添加服务脚本):
而它当年(2013)打出的卖点是:
1它支持py3,而supervisor不支持,
2它1个可以负责各种服务,取代 supervisor 和gunicorn 两个


但是今天:
circus:

supervisor

gunicorn

注意虽然这些年这些都不再活跃了,但是在2014-2017,后两个的人气还是比circus大太多了(2013之后几乎没人管了)
再看它的2个卖点:
1 py3:
直到今天,supervisor 官方还是说不要在生产环境用py3版。
但是我照样用supervisor。为啥?因为gunicorn 有py3的版本!
单机上的服务启动是 supervisor(py2)-> [ gunicorn(py3), nginx]
gunicorn(py3)再启动app 就OK了
2 1个人伺候多种服务:
这个问题更有意思了,可以说,随着容器的崛起,这个问题直接不存在了。
为什么对进程的管理变得更简单了(或者说,保存简单就够了,不需要更复杂的管理工具)?
因为单机运行多个服务的方式变了,从多进程,变成了多容器。
当年它图里的redis等等这些玩意,都拿出去放到单独的容器里了。
所以,不再是进程管理工具之间的竞争,而是加入了docker, k8s这些容器管理工具。
从更高抽象层次(虚拟环境 操作系统),对配置工作进行了切分。
监控、控制服务的启动停止 从使用进程管理工具,到在docker-compose里设置restart 就可以管起来,端口设置ports就管起来了。
这样就保证了每个容器内部,跑的进程都不复杂(甚至比原来还简单,种类还少),但还多少需要点管理工具,所以supervisor gunicorn仍然活的很好,而试图取代它两个的复杂的circus,却衰落了。
应对复杂问题的演进:共性是:
通过建立多个抽象层次,在每个层次上让任务保持、或者变得更简单;而不是在某1个维度上,变得更复杂。
知识不是1条线,也不是2维的书架和窗格,而是一个宫殿。
而跨抽象级别的映射,决不孤立。所以架构和套路,是可以复用的。
taiga项目显示出技术发展快速的残酷性:3年前这种前后分离的架构,也许是惊艳的,但是现在优劣互现了:
优势:
1后端用古老的django做api(易开发);
2前端分离出来,可以搞得很好看;
但现在:
1部署方式落后,进程管理工具circus完全式微;
2前端的coffee-script angularjs已经落伍(ts+ ngx了);
——对taiga要学习优点(前后端分离,前后端的技术寿命完全不一样),对缺点要尽量避免(难部署)。
——对circus,要引以为戒,不要把产品搞成这个样子,这是犯了路线错误啊啊啊。
难部署的taiga,式微的circus——趋势从进程管理到容器管理,简单才是美的更多相关文章
- 基于docker 如何部署surging分布式微服务引擎
1.前言 转眼间surging 开源已经有1年了,经过1年的打磨,surging已从最初在window 部署的分布式微服务框架,到现在的可以在docker部署利用rancher 进行服务编排的分布式微 ...
- Docker容器管理平台Rancher高可用部署——看这篇就够了
记得刚接触Rancher时,看了官方文档云里雾里,跟着官网文档部署了高可用Rancher,发现不管怎么折腾都无法部署成功(相信已尝试的朋友也有类似的感觉),今天腾出空来写个总结,给看到的朋友留个参考( ...
- docker部署PiggyMetrics分布式微服务
在上一篇文章里http://www.cnblogs.com/lyhero11/p/8686058.html, 讲解了如何在windows10下安装docker社区版. 那如何利用docker落地一个分 ...
- 时间序列预测——深度好文,ARIMA是最难用的(数据预处理过程不适合工业应用),线性回归模型简单适用,预测趋势很不错,xgboost的话,不太适合趋势预测,如果数据平稳也可以使用。
补充:https://bmcbioinformatics.biomedcentral.com/articles/10.1186/1471-2105-15-276 如果用arima的话,还不如使用随机森 ...
- ASP.NET Core开发期间部署到IIS自定义主机域名并附加进程调试
在.NET Framework环境下,我们经常会这么做 把一个web项目不经过发布直接部署到IIS里去,配置上主机名,修改一下hosts文件,就可以用自定义的域名来访问我们的应用程序,使用附加到进程( ...
- 集群容器管理之swarm ---集群部署
集群部署及节点管理 使用swarm前提: Docker版本1.12+ 集群节点之间保证TCP 2377.TCP/UDP 7946和UDP 4789端口通信 节点规划: 操作系统:centos7.4.1 ...
- IIS安装和ASP.NET Web应用程序开发期间部署到IIS自定义主机域名并附加进程调试
一.IIS安装,此处以Windows10操作系统为例 首先依次进入控制面板=>程序=>程序与功能=>启用或关闭Windows功能 将Internet开头的三个选项全部打钩后点击确定安 ...
- Centos7安装gitlab11 学习笔记之基础概念、部署安装、权限管理、issue管理
一.基础介绍 1.简介 一个基于GIT的源码托管解决方案 基于rubyonrails开发 集成了nginx postgreSQL redis sidekiq等组件 2.安装要求 2g内存以上,有点占内 ...
- docker 部署mysql tomcat时 在root@localhost~下——-——docker exec -it 容器名 /bin/bash 报错
在docker部署mysql时 报错 找不到 容器不自动启动 , docker start 容器名 也没有效果 多次尝试发现 原因是创建容器时在 下面创建的 更改为下创建 问题解决
随机推荐
- 用python实现一个简单的socket网络聊天通讯 (Linux --py2.7平台与windows--py3.6平台)
windows --> windows 写法均在py3.6 客户端写法 import socket client = socket.socket() client.connect(('192 ...
- Learning to Rank算法介绍:RankNet,LambdaRank,LambdaMart
之前的博客:http://www.cnblogs.com/bentuwuying/p/6681943.html中简单介绍了Learning to Rank的基本原理,也讲到了Learning to R ...
- 消息系统之Apache ActiveMQ
一.下载运行MQ服务 1.下载ActiveMQ :http://activemq.apache.org/ 2.解压缩: 进入bin目录 win32和win64对应不同位的操作系统,选择进入 点击act ...
- MAVEN打包丢失xml文件解决办法
MAVEN打包默认只包含src/main/java下的class文件,如果需要包含xml.properties等文件,请在build节点下面添加如下代码 <resources> <r ...
- Python之路----迭代器与生成器
一.迭代器 L=[1,,2,3,4,5,] 取值:索引.循环for 循环for的取值:list列表 dic字典 str字符串 tuple元组 set f=open()句柄 range() enumer ...
- python之路----继承的抽象类和接口类
抽象类与接口类 接口类 继承有两种用途: 一:继承基类的方法,并且做出自己的改变或者扩展(代码重用) 二:声明某个子类兼容于某基类,定义一个接口类Interface,接口类中定义了一些接口名(就是函数 ...
- 从1.6W名面试者中收集的Java面试题精选汇总(内附知识脑图)
本篇的面试题是接之前读者的要求,发出来的. 首先,声明下,以下知识点并非全部来自BAT的面试题. 如果觉得在本文中笔者总结的内容能对你有所帮助,可以点赞关注一下. 本文会以引出问题为主,后面有时间 ...
- UVA1714 Keyboarding(bfs)
UVA1714 Keyboarding bfs 坑点很多的一题(由于一本通的辣鸡翻译会错题意*n). 1.多组数据 2.如果某方向上没有不同字符光标不会动 我们每次预处理出每个点向四个方向下次到达的点 ...
- Mysql的序列
Mysql的序列 Mysql自带的序列:字段设置为int,属性里面选上“自动增长”即可: 在插入数据的时候可以不插入该字段的值,mysql会自动处理:
- Android实践项目汇报(三)
Google天气客户端 本周学习计划 调试代码使之成功运行并实现天气预报功能. 实际完成情况 由于google取消api接口服务,天气源的传输.所以我换了一个使用 haoserver API接口的程序 ...