django生产环境正在使用错误的db

时间:2015-01-27 12:20:02

标签: django deployment digital-ocean

我正在撰写我的第一个'自制部署'。使用fabric编写部署脚本。我在生产机器上添加了导出到.bashrc以导出密钥:value {'DIGITAL_OCEAN':True}所以我可以在我的设置中添加一些条件来使用基于本地或生产环境的数据库。

SETTINGS.PY

import os
if 'DIGITAL_OCEAN' in os.environ:
        ON_DO = True
else:
        ON_DO = False

if ON_DO:
        DATABASES = {
        'default': {
                'ENGINE': 'django.db.backends.postgresql_psycopg2',
                'NAME': 'user',
                'USER': 'user',
                'PASSWORD': 'pass',
                'HOST': 'localhost',
                'PORT': '',
                }
        }
else:
    DATABASES = {
        'default': {
            'ENGINE': 'django.db.backends.postgresql_psycopg2',
            'NAME': 'localuser',
            'USER': 'localuser',
            'PASSWORD': 'localpass',
            'HOST': 'localhost',
            'PORT': '',
            }

现在......如果我运行像'$ python manage.py migrate'这样的ssh命令一切顺利ON_DO被发现并且进展顺利,但是在我的部署脚本中,如下所示,ON_DO是假的,我有这种情况在之前自发地发生,然后它自我纠正(可能是用gunicorn或nginx重新启动)所以我尝试在脚本中添加一些重启,但到目前为止没有运气,我没有想法。

def server():

        '''IDK'''
        env.host_string = 'ip.ip.ip.ip'
        env.user = 'root'

def pull_deploy():

        '''Makes the server pull it from git repo at bitbucket'''

        path = '/home/django/'


        print(red('BEGINNING PULL DEPLOY'))

        with cd('%s' % path) :
                run('pwd')
                print(green('Pulling Master from Bitbucket'))
                run('git pull origin master')

                print(green('SKIPPING installing requirements'))
                run('source %spyenv/bin/activate && pip install -r langalang/requirements.txt' % path)

                print('Collecting static files')
                run('source %spyenv/bin/activate && python langalang/manage.py collectstatic' % path)

                print('Restarting Gunicorn')
                run('sudo service gunicorn restart')
                print('Restarting Nginx')
                run('nginx -s reload')

                print('Making migrations')
                run('source %spyenv/bin/activate && python langalang/manage.py makemigrations' % path)

                print('Migrating DB')
                run('source %spyenv/bin/activate && python langalang/manage.py migrate' % path)

                print('Restarting Gunicorn')
                run('sudo service gunicorn restart')
                print('Restarting Nginx')
                run('nginx -s reload')
                print(red('DONE'))

2 个答案:

答案 0 :(得分:0)

问题是我在〜.bashrc或〜.profile中声明了我的环境变量'ON_DO',而那些只从登录shell导出变量。我猜django在单独运行时不算作登录shell。我不得不从django本身的.wsgi文件中导出它们。

该文件仅在生产中运行,据我所知,因此它只将变量输出到生产系统。

答案 1 :(得分:-1)

@deltaskelta为什么要在wsgi.py文件中设置变量?它不会破坏目的,因为此变量也将在您的开发环境中设置。

这是我写的shell脚本。

#!/bin/sh

ps aux | grep usr/bin/[p]ython

if [ $? != 0 ]
then
    export UNIQUE_KEY='value'
    python ~/project_name/manage.py runserver 0:8000
    exit 0
else
    exit 1
fi

这样做,每当它执行时设置UNIQUE_KEY环境变量,并在它停止时立即取消设置。 此外,它也适用于crontab这是有效的,因为通过crontab执行的shell脚本在non-interactive non-login shell session中运行。

可能对不同的shell会话有深入的了解会有所帮助。

  

登录,非登录,互动非互动外壳会话之间的区别

     

bash shell根据会话的启动方式读取不同的配置文件。

     

不同会话之间的一个区别是shell是否以"登录" "非登录" 的形式产生?会话。

     

登录shell是一个shell会话,首先是对用户进行身份验证。如果您要登录终端会话或通过SSH进行身份验证,则您的shell会话将设置为"登录" shell。

     

如果从经过身份验证的会话中启动新的shell会话,就像我们通过从终端调用bash命令所做的那样,将启动非登录 shell会话。启动子shell时,系统没有要求您提供身份验证详细信息。

     

可以做出的另一个区别是shell会话是交互式还是非交互式

     

交互式 shell会话是附加到终端的shell会话。 非交互式 shell会话是一个未附加到终端会话的会话。

Check this link for details - Digital Ocean Tutorials