web-dev-qa-db-ja.com

ローカルのデプロイDjangoアプリをopenshiftを使用して

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で起動して実行するための優れた包括的なリソースはありますか?Googleで見つけることができるもののほとんどは、すでに私のものを持っているのでそれほど役に立たない単なるアプリの例です構築されました。

21
Oliver Burdekin

Editこれはプラットフォーム依存の回答であり、Djangoを提供するOpenShiftプラットフォームが変更される可能性があるため、 、この回答は無効になる可能性があります。 2016年4月1日以降、この回答は引き続き有効です。

これは何度も起こりました。少なくとも5つのアプリケーションをマウントする必要があったため、自分のライフサイクルを作成する必要がありました。

  1. Djangoカートリッジではなく、python 2.7カートリッジを使用してください。 Djangoカートを使用する。 Djangoバージョンを更新しようとすると、多くの問題が生じますが、ゼロから実行する場合は含まれません。
  2. Git経由でリポジトリを複製します。 yourprojectを取得します...

    # git clone [email protected]:app.git yourproject <- replace it with your actual openshift repo address
    
    yourproject/
    +---wsgi.py
    +---setup.py
    *---.openshift/ (with its contents - I omit them now)
    
  3. ローカルマシンに複製された新しいリポジトリのvirtualenvを作成します。それをアクティブにして、Djangoをpipと必要なすべての依存関係(たとえば、新しいPillowパッケージ、MySQLデータベースパッケージなど)を介してインストールします。そこにDjangoプロジェクトを作成します。たとえば、yourdjproject。 Edit空のダミーのファイル(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
    
  4. そこにDjangoアプリを作成します。 yourappと言います。それをプロジェクトに含めます。

  5. 次のようなものになります(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
    
  6. いつものようにDjangoアプリケーションをセットアップします(ここでは詳しく説明しません)。インストールしたすべての依存関係をそれに応じてsetup.pyファイルに含めることを忘れないでください(この回答はWHYを説明する場所ではありませんが、setup.pyはパッケージインストーラーであり、openshiftはデプロイごとにアプリを再インストールするためにそれを使用しますそれは依存関係で最新です)。

  7. モデルのマイグレーションを作成します。
  8. Openshift-given WSGIスクリプトを次のように編集します。 virtualenvを含めた後、Django WSGIアプリケーションを含めます(openshiftはpythonカートリッジ用に作成します)。そのため、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
    
  9. .openshift/action_hooksのフックを編集して、dbの同期化とメディア管理を自動的に実行します。

    ビルドフック

    #!/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
    
  10. これで、インポートによってDjango wsgiを指す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'),)
    
  11. サンプルビュー、サンプルモデル、サンプルの移行を作成し、すべてをプッシュします。

  12. 編集ローカル環境とオープンシフトでテストおよび実行できるように、両方の環境を考慮して適切な設定を行うことを忘れないでください(通常、これには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'),)
    
  13. Gitの追加、コミット、プッシュ、エンジョイ。

    cd path/to/yourproject/
    git add .
    git commit -m "Your Message"
    git Push Origin master # THIS COMMAND WILL TAKE LONG
    # git enjoy
    
  14. サンプルDjangoアプリの準備がほぼ整いました。しかし、アプリケーションに外部依存関係がある場合、明確な理由なしにアプリケーションが爆破します。これが、簡単なアプリケーションを開発するように言った理由です。 ここで、依存関係を機能させるときです

    [untested!]デプロイフックを編集して、コマンドcd $OPENSHIFT_REPO_DIRの後に次のようにコマンドを追加できます:pip install -r requirements.txt、requirements.txtファイルを想定プロジェクトに存在します。 pipはvirtualenvに存在するはずですが、存在しない場合は、次の解決策を見ることができます。

    あるいは、setup.pyはOpenShiftですでに提供されているアプローチです。私が何度もやったことは-requirements.txtファイルが存在することを前提として-です:

    1. そのファイルを開き、すべての行を読み取ります。
    2. 各行に#がある場合は、#とその後のすべてを削除します。
    3. strip先頭と末尾の空白。
    4. 空の行を破棄し、結果(つまり、残りの行)を配列として取得します。
    5. その結果は、setup.pyファイルのsetup呼び出しのinstall_requires=キーワード引数に割り当てる必要があります。

    申し訳ありませんが、以前にこれをチュートリアルに含めていません!しかし、実際にDjangoをサーバーにインストールする必要があります。おそらく明白な提案かもしれませんし、すべてのPython開発者は事前にそれを知っているでしょう。しかし、この機会をつかむと私は言います。他の依存関係を含めるので、適切なDjango依存関係をrequirements.txt(またはrequirements.txtファイルを使用するかどうかに応じてsetup.py)に含めます。

これはDjangoアプリケーションをマウントするのに役立ち、プロセスを標準化するのに長い時間がかかりました。それを楽しんで、何かがうまくいかない場合はコメントで私に連絡することを躊躇しないでください

Edit(この問題が同じで、この投稿のコメントで答えが見つかるとは思わない人向け):ビルドまたはデプロイを編集する場合は、 Windowsでファイルをフックし、ファイルをプッシュすると、Windowsは0644権限でサーバーに移動します。これは、WindowsがUnixが持つこの権限スキームをサポートしておらず、これらのファイルには拡張子がないため、権限を割り当てる方法がないためです。 デプロイ時にスクリプトが実行されないため、これに気づくでしょう。したがって、これらのファイルのみをUnixベースのシステムから展開してみてください。

編集2:gitフック(たとえば、pre_commit)を使用して、パイプラインスクリプト(ビルド、デプロイなど)などの特定のファイルにアクセス許可を設定できます。詳細については、この回答の@StijndeWittおよび@OliverBurdekinによるコメント、および この質問 を参照してください。

41
Luis Masuelli
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='[email protected]',
      url='https://pypi.python.org/pypi',
      install_requires=packages,
)
7
Tanveer Alam

これらは私にとって有効な手順です。手動でいくつかの手順を実行しましたが、後で各プッシュコマンドで実行するように自動化できます。

  1. ウェブサイトウィザードからpython-3.3で新しいDjangoアプリを作成します
  2. Mysqlカートリッジをアプリに追加します(私のオプションはmysqlです)
  3. git cloneで作成したアプリをローカルに
  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.アプリを再起動します

3
Serjik
1
GrvTyagi