V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
guoqiao
V2EX  ›  程序员

在 Linux 上部署 Python 站点,大家一般是如何处理目录和权限的?

  •  
  •   guoqiao · 2014-03-07 05:05:34 +08:00 · 5636 次点击
    这是一个创建于 3918 天前的主题,其中的信息可能已经有所发展或是发生改变。
    1. 你一般把代码放在哪个目录?
    2. 代码的owner是谁?
    3. 文件和目录的权限如何设置?
    4. 你在服务器上使用git库还是打包后传过去?
    16 条回复    2014-12-31 16:21:36 +08:00
    humiaozuzu
        1
    humiaozuzu  
       2014-03-07 07:26:00 +08:00
    1. /var/www/app-name
    2. deploy
    3. www-data
    4. git pull(Forward Agent)
    clino
        2
    clino  
       2014-03-07 08:50:16 +08:00
    我一般都是新建一个用户,所有部署的代码和数据都放在这个用户的用户目录下
    guoqiao
        3
    guoqiao  
    OP
       2014-03-07 08:51:08 +08:00
    @humiaozuzu 你的方式很有代表性, 但是有几个问题:
    1. /var/www/目录对于apache, lighttpd等是默认的开放目录, 放在这里, 万一哪天犯错设置不当, 会不会泄露源码? 并且, 代码放在/var/www下应该是沿用php的习惯? 因为php需要把文件扔到http server的目录下. 但python并不需要. 所以,放在/opt/之类的目录下,是不是更好?

    2. 你的意思应该是: 代码的owner是deploy, 而文件和目录的权限给www-data开放, 是吗? 当然,可能我提问不当. 代码的owner设置成www-data合理, 但是麻烦之处在于, 如果你后来新增了一个文件或目录, git pull 下来, owner是deploy, 你可能会忘记修改chown, 会导致一些问题.
    clino
        4
    clino  
       2014-03-07 08:51:50 +08:00   ❤️ 1
    1 我一般都是新建一个用户,所有部署的代码和数据都放在这个用户的用户目录下
    2 就是这个用户
    3 默认
    4 在这个用户目录下新建一个bare的git,然后往这个git库推,然后git clone 一个出来用作实际部署
    guoqiao
        5
    guoqiao  
    OP
       2014-03-07 08:54:16 +08:00
    @clino 恩, 这是我想说的. 尝试各种方式后, 我也发现这是我感觉最方便问题最少的方法.
    但我不确定这是否通行. 因为看到很多有经验的程序员都把代码放在/var/www/或者/opt, /srv之类的目录下, 代码的owner则五花八门, root, www-data, deploy, 都有.
    humiaozuzu
        6
    humiaozuzu  
       2014-03-07 09:08:18 +08:00
    @guoqiao
    1. 这里你说的也有道理
    2. 我的 deploy 在 www-data 组里面,不过也觉得有些不对劲

    其实这个问题我在很久前有专门折腾过,看各种 fabric/ansible 部署的脚本是怎样规范化这些东西的,得到的结果五花八门,有用有sudo权限的用户部署的,好一点的在home目录下部署,在 /srv/www/ /var/www /opt/company-name 下这样的很少。
    不知道你有好的解决方案吗?另外方便加一下 gtalk(maplevalley8#gmail) or qq 方便以后交流?
    BOYPT
        7
    BOYPT  
       2014-03-07 09:42:44 +08:00
    既然都考虑自动化deploy了,还会有“忘记chown”这种事吗,反正要做的事情都那样,都不知道你要纠结啥。
    yueyoum
        8
    yueyoum  
       2014-03-07 10:09:12 +08:00
    自己的代码 和 大部分编译的软件都放在 /opt 下

    直接用登录用户跑。

    如果可以git,直接git pull部署,不能,就scp 上传 tar.gz
    guoqiao
        9
    guoqiao  
    OP
       2014-03-07 10:23:41 +08:00
    @BOYPT 对于小项目或者项目代码尚未完全稳定, 未必每次部署都使用自动化, 而且自动化也未必覆盖到所有的修改需求.我可能经常需要ssh到服务器,手工修改一些东西,或者增加一个文件. 这时文件的权限就很可能忘记修改. "反正要做的事情都那样,都不知道你要纠结啥", 我要做的事,未必每次都一样.
    guoqiao
        10
    guoqiao  
    OP
       2014-03-07 10:57:24 +08:00
    @yueyoum /opt下的代码文件夹, owner是谁? root? www-data? 还是$USER?
    1. 如果是root, 那意味着你每次pull代码,或者操作任何文件, 都得用sudo,比较危险.
    2. 如果是www-data, 那意味着你每次pull完代码后,如果有新的文件,都需要修改文件owner为www-data. (很多时候不修改也没问题,但是当有一天问题出现,就很难发现.而且对于有强迫症的人,没法容忍新老文件的owner不一致...)
    3. 如果是$USER, 与其在/opt下sudo创建一个文件夹然后chown成自己, 还不如直接放在自己的home目录下呢, 都不用cd过去,何必舍近求远呢?
    Ever
        11
    Ever  
       2014-03-07 12:09:13 +08:00
    通用的自编译软件和动态链接库放/opt下, 项目文件放在自己创建的非sudo用户$HOME下, 涉及多个应用, 创建多个用户.

    静态文件确保www-data可读, 应用文件本身不和www-data组和用户产生任何关系, 应用和nginx交互通过gunicorn绑定tcp socket进行.

    部署通过git hooks.
    yueyoum
        12
    yueyoum  
       2014-03-07 12:09:29 +08:00
    @guoqiao $USER

    放哪真是个人习惯问题。
    clino
        13
    clino  
       2014-03-07 12:42:31 +08:00
    @guoqiao /opt 我也是有用的
    我的用法大概是这样:
    -/opt下除了某些目录外基本用于批量部署,即所有服务器的 /opt 目录下都保持一致性(除了部分目录),这样一些需要保持一致的工具,配置等等都分门别类放在 /opt 下
    -/opt/下非同步的一些目录,如 /opt/www 用于安装或者放置一些本服务器自己独立配置安装的文件应用等

    批量部署和批量配置我用的是ansible
    clino
        14
    clino  
       2014-03-07 12:43:45 +08:00
    对了 /opt 下全用 root 操作,因为基本上这里放的都是影响整个系统的
    只影响某个用户的部分就放在用户目录下
    guoqiao
        15
    guoqiao  
    OP
       2014-03-07 16:38:50 +08:00
    @yueyoum 习惯也分好坏.
    何况我觉得不是习惯, 大部分人不过是在沿袭别人的习惯. 而别人的习惯可能是个错误.
    yingluck
        16
    yingluck  
       2014-12-31 16:21:36 +08:00
    1. /home/root
    2. root
    3. root
    4. .gitignore git-pull
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3204 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 22ms · UTC 13:10 · PVG 21:10 · LAX 05:10 · JFK 08:10
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.