为生产部署缓存Python依赖项
我正在做一些基于Python的项目,使用pip和buildout来安装需要的库。不过,我不喜欢有人把GitHub上的项目删掉,这样会导致我的应用程序瘫痪,或者因为网络故障我无法进行部署。
其他人是怎么解决这个问题的呢?
我有一些想法,但我觉得最有前景的可能是建立一个缓存代理服务器。我可以把pip指向这个内部的代理服务器,这样它就会缓存下载的项目副本,并定期检查更新(如果有网络连接的话),然后再提供缓存的版本。
有没有类似的东西已经存在呢?
使用场景:
我有一个项目要部署到服务器1。我添加了一个新的功能,需要用到一个远程的库,但当我准备更新生产服务器时,PyPi(Python的库管理网站)却宕机了,这样我就无法部署了。或者当我准备设置一个新的服务器时,某个依赖库已经从GitHub或其他地方消失了。
我该如何确保我的部署和开发环境无论外界发生什么都能正常启动呢?
另外,在我进行部署时,我不会直接覆盖现有的代码。相反,我会建立一个新的虚拟环境,然后切换过去,这样如果出现问题我可以回滚。所以每次部署时,我都需要重建我的环境,并且需要依赖库存在。
所以我在寻找一个解决方案,能够让我抵御短期的网络故障,以及防止项目被删除带来的影响。
3 个回答
我有和你一样的需求,也在用buildout来管理我的部署。我尽量不把任何包的依赖项安装到系统中,而是让buildout把所有的依赖包安装到我的buildout环境里。这样,如果我在项目的N+1版本中依赖某个包的更新版本,而在“上线”时N+1出现了问题,我就可以回退到N版本,这样就能自动获得N版本所需的依赖包。
我们运行一个私有的egg篮子服务器,并配置buildout只从这个服务器获取包。服务器的内容是通过让buildout从网络上抓取包一次,然后复制下载的包来初始化的。
这样,每个包的升级都完全在我的控制之中,我可以确保对同一代码快照的两次buildout会生成相同的结果。当我想要升级所有包时,我会让buildout再次获取最新版本,进行测试,然后把我的包复制到egg篮子服务器上,准备进入生产模式。
你应该保留一个“参考副本”,也就是你依赖的项目的备份。
如果有人把这个项目从GitHub(还有PyPi、所有镜像站点,以及网络上的其他地方)删除了,那么你就有了源代码,可以继续使用和分享它。