V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
banks0913
V2EX  ›  Python

django 项目打包部署的正确姿势

  •  
  •   banks0913 · 2016-12-18 16:18:33 +08:00 · 10918 次点击
    这是一个创建于 2888 天前的主题,其中的信息可能已经有所发展或是发生改变。
    小弟有个 django web 项目,部署方式为 uwsgi + nginx 。需要在几十台机器上去挨个部署,并且能够自动更新版本(通过 shell 脚本更新)。

    那么问题来了, django 只能采用源代码发布项目的方式发布吗?有没有一种类似于一键安装的方式?
    如果没有的话,我就只能把项目打成 tar 压缩包,服务器上通过脚本进行解压缩,执行数据库同步(migrate)等操作。。。
    22 条回复    2016-12-20 13:18:59 +08:00
    jessynt
        1
    jessynt  
       2016-12-18 16:24:53 +08:00
    docker ?
    pimin
        2
    pimin  
       2016-12-18 16:29:17 +08:00
    virtuialenv+Git 或者 SVN 才是出路吧
    成熟的方案不用,强行造轮子把自己碾死的还少么
    banks0913
        3
    banks0913  
    OP
       2016-12-18 16:35:18 +08:00
    @pimin 目前用的就是 virtualenv + git, 只不过我们目前的问题有两个,一个是并不是所有服务器都能随时进行 ssh (服务器在客户那边),另一个是 这个项目需要与其他几个功能上上相关的程序同时更新,需要引入版本号的概念。
    banks0913
        4
    banks0913  
    OP
       2016-12-18 16:40:22 +08:00
    @pimin 版本号是公司内部自定义的,比如 1.5.3, 1.5.5 这种形式。并且能够支持回退。请问有什么建议吗?
    messyidea
        5
    messyidea  
       2016-12-18 16:45:47 +08:00
    写个 makefile ? 不过感觉和 shell 脚本差不多
    purebluesong
        6
    purebluesong  
       2016-12-18 16:47:19 +08:00
    写个发布脚本是比较蠢的方式,如果用一些云服务比如阿里云的话这几十台可以直接利用服务的工具同步这几十台机器
    pimin
        7
    pimin  
       2016-12-18 16:50:10 +08:00
    @banks0913
    Git 和 svn 都是版本控制系统,都有版本的概念.
    Git 版本号管理上可能不如 svn 来得直观
    不能实实连过去手动更新是最好的
    写个脚本,定时访问 myweb.com/demo.json,确定是否需要更新,需要更新到的版本号.
    如果几十台服务器需求不一样,就根据每台机器的 mac 之类确定一个 ID.分别生成 mac1,2,3.json
    banks0913
        8
    banks0913  
    OP
       2016-12-18 16:51:51 +08:00
    @messyidea 已经有自动安装和部署的 shell 脚本,包括安装 nginx,uwsgi,git clone 代码,同步数据库,加入 supervisor 监控等。
    不过目前的问题再代码更新这一块,目前需要自己一台一台登录上去执行 git pull , 同步数据库等操作。而且始终是更新到最新的提交,目前要引入版本号的概念,就需要做到每次 git pull 到某个指定版本( 1.4.5 )
    banks0913
        9
    banks0913  
    OP
       2016-12-18 16:54:42 +08:00
    @pimin 目前我也偏向于你这种思路。写脚本自动 git pull 。不过版本号怎么搞还不知道,像 1.5.3 , 1.1.2 这种自定的版本号。用 git 的 tag 功能去实现吗?
    banks0913
        10
    banks0913  
    OP
       2016-12-18 16:59:56 +08:00
    @purebluesong 没办法,我们的服务器是一台一台的实体机,并且安装在客户的机房里那种,而且有些客户不给我们远程 ssh 的权限。。。。
    pimin
        11
    pimin  
       2016-12-18 17:00:49 +08:00
    我对 Git 不是很熟,我有一个比较笨的方法,把 Git 自动生成的版本号和公司自定义的版本在 json 里标示出来.
    比如 1a2b:1.5.3
    你叫我更新到 1.5.3 我脚本里直接 checkout 1a2b 不就好啦
    当然我觉得如果因为对 Git 不熟悉绕了路..还是比较萌蠢的
    jimzhong
        12
    jimzhong  
       2016-12-18 18:54:03 +08:00
    git 有 webhook
    rainysia
        13
    rainysia  
       2016-12-19 01:03:48 +08:00
    以前公司直接打包成 rpm 包
    jswh
        14
    jswh  
       2016-12-19 02:18:46 +08:00
    Fabric?
    jswh
        15
    jswh  
       2016-12-19 02:21:55 +08:00
    @jswh 好吧没有登录权限那就没办法了。不过全打包部署的话有一个已经基本死了的东西 http://platter.pocoo.org/dev/, 可以把应用连同 virtualenv 打包成一个 tar, 直接解压就可以用。
    @banks0913
    lyhapple
        16
    lyhapple  
       2016-12-19 08:31:25 +08:00
    @jswh 我之前也是想做成这样的,但是遇到一个奇葩的 mysql 库的问题 _mysql.so , 好像是这个文件引起的, 把把应用连同 virtualenv 打包成一个 tar, 直接解压后, 总是会提示我没有权限使用这个文件。
    botman
        17
    botman  
       2016-12-19 08:42:16 +08:00 via Android
    用 bitsync 或者 syncthing 做同步吧,修改代码后其他机器自动同步,版本管理直接交给 git 就行。
    jswh
        18
    jswh  
       2016-12-19 09:37:26 +08:00
    @lyhapple 你是在 Windows 下打包的么?我记得 windows 会有这个问题
    leopku
        19
    leopku  
       2016-12-19 10:14:58 +08:00
    既然 python 系的,基于 python 的 ansible 这么好用的部署神器就不能不推荐一把(当然, ansible 不仅仅能做部署,跟 puppet 、 chef 、 salt 是类别的)


    /t/327354#reply11 参见 11 楼
    julyclyde
        20
    julyclyde  
       2016-12-19 14:05:34 +08:00
    @leopku 你这个“既然……就不能不”的道理,我没看出来啊
    yanzixuan
        21
    yanzixuan  
       2016-12-19 16:34:08 +08:00
    我们这边用 docker 。虽然我觉得 virtualenv 也可以。。
    leopku
        22
    leopku  
       2016-12-20 13:18:59 +08:00
    @julyclyde 意思就是相对 puppet 、 chef 这一类来说, ansible 遇到一些问题不需要 ruby 的知识

    我就这么一说,你也别当真 :smile:
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5716 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 37ms · UTC 01:40 · PVG 09:40 · LAX 17:40 · JFK 20:40
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.