使用Openshift部署本地Django应用

24
我用django构建了一个webapp。为了托管它,我试图使用openshift,但是在让任何东西工作方面遇到了困难。这方面似乎缺乏详细步骤。到目前为止,我的git很好用,在本地开发环境中应用程序可以正常工作,我已经成功地在openshift上创建了一个应用程序。
在创建后打开openshift的URL后,我只得到了标准页面“欢迎来到您的Openshift应用程序”。
我按照https://developers.openshift.com/en/python-getting-started.html#step1尝试更改wsgi.py文件。将其更改为hello world,推送并且仍然得到openshift默认页面。
有没有一个全面的资源可以使本地Django应用程序在Openshift上运行起来?我在谷歌上找到的大多数只是示例应用程序,对于我已经构建的应用程序并不太有用。

我也曾经尝试过在Openshift上部署Django应用程序,并成功完成了一次。如果您需要,我可以分享我使用的所有命令步骤。 - Tanveer Alam
部署 Django 实例很麻烦,因为版本不同。我会放一个我用的示例代码。 - Luis Masuelli
1
请查看答案并享受 :D - Luis Masuelli
4个回答

42

编辑: 请记住此答案受平台限制,并且由于OpenShift服务Django的平台可能会更改,因此此答案可能会失效。截至2016年4月1日,此答案在其全部范围内仍然有效。

很多时候我也遇到过这种情况,由于我必须挂载至少5个应用程序,所以我不得不创建自己的生命周期:

  1. 不要使用Django插件,而是使用Python 2.7插件。使用Django插件并尝试更新Django版本会带来许多麻烦,除非您从头开始建立。
  2. 通过git克隆您的存储库。您将获得yourproject和...

# git clone yourrepo@rhcloud.com:app.git yourproject <- replace it with your actual openshift repo address

yourproject/
+---wsgi.py
+---setup.py
*---.openshift/ (with its contents - I omit them now)
  • 为您在本地机器上克隆的全新存储库创建一个虚拟环境。激活它并通过 pip 安装 Django 和所有需要的依赖项(例如新的 Pillow 包,MySQL 数据库包等)。在其中创建一个 django 项目,比如说yourdjproject。同时,创建一个 wsgi/static 目录,并在其中放置一个空的、虚拟的文件(例如.gitkeep - 这只是约定俗成的名称:你可以使用任何你想要的名称)。

  •  #assuming you have virtualenv-wrapper installed and set-up
     mkvirtualenv myenvironment
     workon myenvironment
     pip install Django[==x.y[.z]] #select your version; optional.
     #creating the project inside the git repository
     cd path/to/yourproject/
     django-admin.py startproject yourjdproject .
     #creating dummy wsgi/static directory for collectstatic
     mkdir -p wsgi/static
     touch wsgi/static/.gitkeep
    
  • 在那里创建一个Django应用程序。比如,你的应用程序为yourapp。将其包含到你的项目中。

  • 你会得到类似于以下内容(对于Django 1.7):

  • yourproject/
    +---wsgi/
    |   +---static/
    |       +---.gitkeep
    +---wsgi.py
    +---setup.py
    +---.openshift/ (with its contents - I omit them now)
    +---yourdjproject/
    |   +----__init__.py
    |   +----urls.py
    |   +----settings.py
    |   +----wsgi.py
    +---+yourapp/
        +----__init__.py
        +----models.py
        +----views.py
        +----tests.py
        +----migrations
             +---__init__.py
    
  • 按照惯例设置你的Django应用程序(此处不详细描述)。请记得在setup.py文件中相应地包含你安装的所有依赖项(此处不介绍原因,但是setup.py是包安装程序,openshift在每个部署时使用它来重新安装你的应用程序,所以要随时更新依赖项)。

  • 为你的模型创建迁移。
  • 编辑openshift提供的WSGI脚本如下。你将在包含虚拟环境之后包含django WSGI应用程序(openshift为Python Cartridges创建了一个虚拟环境),因此pythonpath将被正确设置。

  • #!/usr/bin/python
    import os
    virtenv = os.environ['OPENSHIFT_PYTHON_DIR'] + '/virtenv/'
    virtualenv = os.path.join(virtenv, 'bin/activate_this.py')
    try:
        execfile(virtualenv, dict(__file__=virtualenv))
    except IOError:
        pass
    
    from yourdjproject.wsgi import application
    
  • 编辑.openshift/action_hooks中的钩子以自动执行数据库同步和媒体管理:

    构建钩子

  • #!/bin/bash
    #this is .openshift/action/hooks/build
    #remember to make it +x so openshift can run it.
    if [ ! -d ${OPENSHIFT_DATA_DIR}media ]; then
        mkdir -p ${OPENSHIFT_DATA_DIR}media
    fi
    ln -snf ${OPENSHIFT_DATA_DIR}media $OPENSHIFT_REPO_DIR/wsgi/static/media
    
    ######################### end of file
    
    部署钩子。
    #!/bin/bash
    #this one is the deploy hook .openshift/action_hooks/deploy
    source $OPENSHIFT_HOMEDIR/python/virtenv/bin/activate
    cd $OPENSHIFT_REPO_DIR
    echo "Executing 'python manage.py migrate'"
    python manage.py migrate
    echo "Executing 'python manage.py collectstatic --noinput'"
    python manage.py collectstatic --noinput
    
    ########################### end of file
    
    现在你已经准备好了WSGI,通过导入指向Django WSGI,并且你的脚本正在运行。现在是考虑静态文件和媒体文件存放位置的时候了。编辑Django设置,告诉程序你想要这些文件存放的位置:
    STATIC_URL = '/static/'
    MEDIA_URL = '/media/'
    STATIC_ROOT = os.path.join(BASE_DIR, 'wsgi', 'static')
    MEDIA_ROOT = os.path.join(BASE_DIR, 'wsgi', 'static', 'media')
    STATICFILES_DIRS = (os.path.join(BASE_DIR, 'yourjdproject', 'static'),)
    TEMPLATE_DIRS = (os.path.join(BASE_DIR, 'yourjdproject', 'templates'),)
    
  • 创建一个示例视图、示例模型、示例迁移,并将所有内容PUSH。

  • 编辑请记得设置正确的环境参数,以便您可以在本地环境和openshift中进行测试和运行(通常这涉及到有一个local_settings.py文件,在必要时导入该文件,但我将省略该部分,并将所有内容放在同一个文件中)。请仔细阅读此文件,因为像yourlocaldbname这样的值您必须根据实际情况进行设置

  • """
    Django settings for yourdjproject project.
    
    For more information on this file, see
    https://docs.djangoproject.com/en/1.7/topics/settings/
    
    For the full list of settings and their values, see
    https://docs.djangoproject.com/en/1.7/ref/settings/
    """
    
    # Build paths inside the project like this: os.path.join(BASE_DIR, ...)
    import os
    BASE_DIR = os.path.dirname(os.path.dirname(__file__))
    
    ON_OPENSHIFT = False
    if 'OPENSHIFT_REPO_DIR' in os.environ:
        ON_OPENSHIFT = True
    
    
    # Quick-start development settings - unsuitable for production
    # See https://docs.djangoproject.com/en/1.7/howto/deployment/checklist/
    
    # SECURITY WARNING: keep the secret key used in production secret!
    SECRET_KEY = '60e32dn-za#y=x!551tditnset(o9b@2bkh1)b$hn&0$ec5-j7'
    
    # Application definition
    
    INSTALLED_APPS = (
        'django.contrib.admin',
        'django.contrib.auth',
        'django.contrib.contenttypes',
        'django.contrib.sessions',
        'django.contrib.messages',
        'django.contrib.staticfiles',
        'yourapp',
        #more apps here
    )
    
    MIDDLEWARE_CLASSES = (
        'django.contrib.sessions.middleware.SessionMiddleware',
        'django.middleware.common.CommonMiddleware',
        'django.middleware.csrf.CsrfViewMiddleware',
        'django.contrib.auth.middleware.AuthenticationMiddleware',
        'django.contrib.auth.middleware.SessionAuthenticationMiddleware',
        'django.contrib.messages.middleware.MessageMiddleware',
    )
    
    ROOT_URLCONF = 'yourdjproject.urls'
    
    WSGI_APPLICATION = 'yourdjproject.wsgi.application'
    
    # Database
    # https://docs.djangoproject.com/en/1.7/ref/settings/#databases
    
    if ON_OPENSHIFT:
        DEBUG = True
        TEMPLATE_DEBUG = False
        ALLOWED_HOSTS = ['*']
        DATABASES = {
            'default': {
                'ENGINE': 'django.db.backends.mysql',
                'NAME': 'youropenshiftgenerateddatabasename',
                'USER': os.getenv('OPENSHIFT_MYSQL_DB_USERNAME'),
                'PASSWORD': os.getenv('OPENSHIFT_MYSQL_DB_PASSWORD'),
                'HOST': os.getenv('OPENSHIFT_MYSQL_DB_HOST'),
                'PORT': os.getenv('OPENSHIFT_MYSQL_DB_PORT'),
                }
        }
    else:
        DEBUG = True
        TEMPLATE_DEBUG = True
        ALLOWED_HOSTS = []
        DATABASES = {
            'default': {
                'ENGINE': 'django.db.backends.mysql', #If you want to use MySQL
                'NAME': 'yourlocaldbname',
                'USER': 'yourlocalusername',
                'PASSWORD': 'yourlocaluserpassword',
                'HOST': 'yourlocaldbhost',
                'PORT': '3306', #this will be the case for MySQL
            }
        }
    
    # Internationalization
    # https://docs.djangoproject.com/en/1.7/topics/i18n/
    
    LANGUAGE_CODE = 'yr-LC'
    TIME_ZONE = 'Your/Timezone/Here'
    USE_I18N = True
    USE_L10N = True
    USE_TZ = True
    
    # Static files (CSS, JavaScript, Images)
    # https://docs.djangoproject.com/en/1.7/howto/static-files/
    
    STATIC_URL = '/static/'
    MEDIA_URL = '/media/'
    STATIC_ROOT = os.path.join(BASE_DIR, 'wsgi', 'static')
    MEDIA_ROOT = os.path.join(BASE_DIR, 'wsgi', 'static', 'media')
    STATICFILES_DIRS = (os.path.join(BASE_DIR, 'yourdjproject', 'static'),)
    TEMPLATE_DIRS = (os.path.join(BASE_DIR, 'yourdjproject', 'templates'),)
    
  • Git add、commit、push,尽情享受。

  • cd path/to/yourproject/
    git add .
    git commit -m "Your Message"
    git push origin master # THIS COMMAND WILL TAKE LONG
    # git enjoy
    
    您的Django示例应用程序即将准备就绪!但是,如果您的应用程序具有外部依赖项,它将会毫无明显原因地崩溃。这就是我告诉您开发一个简单应用程序的原因。现在是让您的依赖项正常工作的时候了
    [未经测试!] 您可以编辑部署挂钩,并在命令 cd $OPENSHIFT_REPO_DIR 后添加一个命令,例如:pip install -r requirements.txt,假设该文件在您的项目中存在。 pip 应该存在于您的虚拟环境中,但如果不存在,则可以查看下一个解决方案。
    另外,setup.py 在 OpenShift 中是一种已提供的方法。我多次尝试过——假设 requirements.txt 文件存在——如下所示:
    1. 打开文件并读取所有行。 2. 对于每一行,如果它有 #,则删除 # 及其后面的内容。 3. 剥离前导和尾随空格。 4. 丢弃空行,并将结果(即剩余行)作为数组分配给 setup.py 文件中的 install_requires= 关键字参数。 5. 该结果必须分配给 setup.py 文件中的 setup 调用中的 install_requires= 关键字参数。 很抱歉我没有在教程中包括这些内容! 但是您需要在服务器上安装 Django。也许这是一个显而易见的建议,每个 Python 开发人员都应该事先知道。但是,借此机会我强调:将适当的 Django 依赖项包含在 requirements.txt 中(或者根据您是否使用 requirements.txt 文件而包含在 setup.py 中),就像包含任何其他依赖项一样。
    这应该有助于您挂载 Django 应用程序,并且花费了我很多时间来标准化该过程。享受它,并且如果出现问题,请毫不犹豫地通过评论联系我。 编辑(对于那些不希望在本文的评论中找到答案的同类人员):请记住,如果您在 Windows 下编辑构建或部署挂钩文件并推送文件,则它们将以 0644 权限飞到服务器上,因为 Windows 不支持 Unix 的此权限方案,并且无法分配权限,因为这些文件没有任何扩展名。 您会注意到这一点,因为在部署时不会执行您的脚本。因此,请尽量仅从基于 Unix 的系统部署这些文件。 编辑 2:您可以使用 Git 钩子(例如 pre_commit)为某些文件设置权限,例如流水线脚本(构建、部署等)。有关详细信息,请参见 @StijndeWitt 和 @OliverBurdekin 在此答案中的评论,以及此问题

    1
    第二点仍不清楚。请解释如何做以及在哪里进行。(从下面的答案中,我认为您的意思是 rhc git-clone mysite - Pynchia
    1
    我读第二点和第三点的时候越来越不理解了。你克隆你的项目(现有且工作正常的Django项目),然后在第三步中你又从头开始创建另一个Django项目? - Pynchia
    1
    关于Windows和权限问题,我发现你可以设置action_hooks在每次推送时运行。在git add --all之后,更改的权限将返回到644。但是,如果您在.git/hooks/pre-commit中添加一个git hook,您可以自动将它们更改为可执行文件。例如,在.git/hooks/pre-commit中,这将在推送之前更新构建权限: #!/bin/sh git update-index --chmod=+x .openshift/action_hooks/build这是一个特定于Windows的问题,但我花了一段时间才解决。 - Oliver Burdekin
    1
    点9.在Postgres或MySQL数据库的构建操作钩子中,python manage.py migrate将无法工作,因为在构建和部署期间会关闭数据库。相反,它应该放置在post_deploy钩子中。 - Ivan
    1
    我想在这里提一下,尽管Windows不知道权限,但Git知道。这意味着即使在Windows上,您也可以在提交到Git时设置权限标志,并且当它们被推送到OpenShift时,它们将被正确地复制。例如,请参见此答案:https://dev59.com/C2Ei5IYBdhLWcg3wD4ku - Stijn de Witt
    显示剩余20条评论

    7
    1)  Step 1 install  Rubygems
    Ubuntu - https://rubygems.org/pages/download
    Windows - https://forwardhq.com/support/installing-ruby-windows
    $ gem
    or
    C:\Windows\System32>gem
    RubyGems is a sophisticated package manager for Ruby.  This is a
    basic help message containing pointers to more information……..
    
    2)  Step 2:
    $ gem install rhc
    Or
    C:\Windows\System32> gem install rhc
    
    3)  $ rhc
    Or
    C:\Windows\System32> rhc
    
    Usage: rhc [--help] [--version] [--debug] <command> [<args>]
    Command line interface for OpenShift.
    
    4)  $ rhc app create -a mysite -t python-2.7
    Or 
    C:\Windows\System32>  rhc app create -a mysite -t python-2.7
    # Here mysite would be the sitename of your choice
    #It will ask you to enter your openshift account id and password
    
    Login to openshift.redhat.com: Enter your openshift id here
    Password : **********
    
    
    Application Options
    ---------------------
    Domain:    mytutorials
    Cartridges: python-2.7
    Gear Size:  Default
    Scaling:    no
    
    ......
    ......
    
    Your application 'mysite' is now available.
    
     URL : http://mysite.....................
     SSH to :  39394949......................
     Git remote: ssh://......................
    
    Run 'rhc show-app mysite' for more details about your app.
    
    5)  Clone your site
    $ rhc git-clone mysite
    Or
    D:\> rhc git-clone mysite
    .......................
    Your application Git repository has been cloned to "D:\mysite"
    
    6)  #”D:\mysite>” is the location we cloned.
    D:\mysite> git remote add upstream -m master git://github.com/rancavil/django-openshift-quickstart.git
    
    D:\mysite> git pull -s recursive -X theirs upstream master
    
    7)  D:\mysite> git push
    remote : ................
    remote: Django application credentials
                   user: admin
                   xertefkefkt
    
    remote: Git Post-Receive Result: success
    .............
    
    8)  D:\mysite>virtualenv venv --no-site-packages
    D:\mysite>venv\Scripts\activate.bat
    <venv> D:\mysite> python setup.py install
    creating .....
    Searching for Django<=1.6
    .............
    Finished processing dependencies for mysite==1.0
    
    9)  Change admin password
    <venv> D:\mysite\wsgi\openshift> python manage.py changepassword admin
    password:
    ...
    Password changed successfully for user 'admin'
    <venv> D:\mysite\wsgi\openshift> python manage.py runserver
    Validating models….
    
    10) Git add
    <venv> D:\mysite> git add.
    <venv> D:\mysite> git commit -am"activating the app on Django / Openshift"
       .......
    <venv> D:\mysite> git push
    
    
    
    #----------------------------------------------------------------------------------
    #-----------Edit your setup.py in mysite with packages you want to install----------
    
    from setuptools import setup
    
    import os
    
    # Put here required packages
    packages = ['Django<=1.6',  'lxml', 'beautifulsoup4', 'openpyxl']
    
    if 'REDISCLOUD_URL' in os.environ and 'REDISCLOUD_PORT' in os.environ and 'REDISCLOUD_PASSWORD' in os.environ:
         packages.append('django-redis-cache')
         packages.append('hiredis')
    
    setup(name='mysite',
          version='1.0',
          description='OpenShift App',
          author='Tanveer Alam',
          author_email='xyz@gmail.com',
          url='https://pypi.python.org/pypi',
          install_requires=packages,
    )
    

    谢谢Tanveer。这看起来很适合从头开始开发一个应用程序。 - Oliver Burdekin
    1
    它并没有回答问题。 - Oliver Burdekin

    3
    这是我的步骤: 我已经手动完成了一些步骤,但您可以随后自动化地使用每个推送命令来完成它们。
    1. 使用python-3.3从网站向导创建新的django应用程序
    2. 将mysql cartridge添加到应用程序中(我的选择是mysql)
    3. git克隆创建的应用程序到本地
    4. 在根文件夹中添加requirements.txt
    5. 将myapp添加到wsgi文件夹中
    6. 修改应用程序以引用myapp
    7. 执行git add、commit、push
    8. 浏览应用程序并使用“rhc tail myapp”调试错误
    9. 连接到ssh控制台

      rhc ssh myapp

    10.执行这个

    source $OPENSHIFT_HOMEDIR/python/virtenv/venv/bin/activate
    
    1. 如有缺少的包,请安装
    2. 进入应用程序目录

      cd ~/app-root/runtime/repo/wsgi/app_name

    3. 执行迁移命令:

      python manage.py migrate

    4. 创建超级用户:

      python manage.py createsuperuser

    15. 重新启动应用程序


    13 makemigrations|migrate - Kairat Kempirbaev


    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接