概要
参考文献
- 『Pythonプロフェッショナルプログラミング 第3版』の「Chapter 11 環境構築とデプロイの自動化」
- 『現場で使える Django の教科書《実践編》』の「第7章 デプロイ」
その3:ソースコードの配置
方針
・ディレクトリ構成は以下とする。
/var/application/ └── sources ├── mysite -> /var/application/sources/versions/django-tutorial/mysite └── versions └── django-tutorial └── mysite
手順
ディレクトリを作成する。
・adminユーザーで作業する。
$ whoami admin $
・ディレクトリを作成する。
※ tree
コマンドは便宜上インストールした。
$ sudo mkdir -p /var/application/sources/versions $ sudo tree /var/application /var/application └── sources └── versions 2 directories, 0 files $
・/var/application/
以下の所有者とパーミッションを確認する。
$ ls -ld /var/application drwxr-xr-x 3 root root 21 5月 24 20:15 /var/application $ ls -ld /var/application/sources drwxr-xr-x 3 root root 22 5月 24 20:15 /var/application/sources $ ls -ld /var/application/sources/versions drwxr-xr-x 2 root root 6 5月 24 20:15 /var/application/sources/versions
・/var/application/sources
以下の所有者をrelease:release
に変更する。
$ sudo chown -R release:release /var/application/sources
・所有者がrelease:release
、パーミッションが755
になっていることを確認する。
$ ls -ld /var/application/sources drwxr-xr-x 3 release release 22 5月 24 20:15 /var/application/sources $ ls -ld /var/application/sources/versions drwxr-xr-x 2 release release 6 5月 24 20:15 /var/application/sources/versions
ソースコードを配置する。
・releaseユーザーで作業する。
$ sudo su release $ whoami release
$ cd /var/application/sources/versions $ pwd /var/application/sources/versions
$ git clone https://github.com/kamatimaru/django-tutorial.git Cloning into 'django-tutorial'... remote: Enumerating objects: 312, done. remote: Counting objects: 100% (312/312), done. remote: Compressing objects: 100% (187/187), done. remote: Total 312 (delta 180), reused 229 (delta 100), pack-reused 0 Receiving objects: 100% (312/312), 108.08 KiB | 7.72 MiB/s, done. Resolving deltas: 100% (180/180), done. $
・シンボリックリンクを作成する。
$ cd .. $ pwd /var/application/sources $ ln -s /var/application/sources/versions/django-tutorial/mysite mysite
動作確認のはずが...
今回はappserver
ユーザーでGunicornから起動するが、その前にrelease
ユーザーからpython3 manage.py runserver
で起動できるかどうか試してみたところ、以下のエラーが発生した。
$ python3 manage.py runserver Watching for file changes with StatReloader Exception in thread django-main-thread: Traceback (most recent call last): File "/usr/lib64/python3.7/threading.py", line 926, in _bootstrap_inner self.run() File "/usr/lib64/python3.7/threading.py", line 870, in run self._target(*self._args, **self._kwargs) File "/usr/local/lib64/python3.7/site-packages/django/utils/autoreload.py", line 53, in wrapper fn(*args, **kwargs) File "/usr/local/lib64/python3.7/site-packages/django/core/management/commands/runserver.py", line 109, in inner_run autoreload.raise_last_exception() File "/usr/local/lib64/python3.7/site-packages/django/utils/autoreload.py", line 76, in raise_last_exception raise _exception[1] File "/usr/local/lib64/python3.7/site-packages/django/core/management/__init__.py", line 357, in execute autoreload.check_errors(django.setup)() File "/usr/local/lib64/python3.7/site-packages/django/utils/autoreload.py", line 53, in wrapper fn(*args, **kwargs) File "/usr/local/lib64/python3.7/site-packages/django/__init__.py", line 24, in setup apps.populate(settings.INSTALLED_APPS) File "/usr/local/lib64/python3.7/site-packages/django/apps/registry.py", line 114, in populate app_config.import_models() File "/usr/local/lib64/python3.7/site-packages/django/apps/config.py", line 211, in import_models self.models_module = import_module(models_module_name) File "/usr/lib64/python3.7/importlib/__init__.py", line 127, in import_module return _bootstrap._gcd_import(name[level:], package, level) File "<frozen importlib._bootstrap>", line 1006, in _gcd_import File "<frozen importlib._bootstrap>", line 983, in _find_and_load File "<frozen importlib._bootstrap>", line 967, in _find_and_load_unlocked File "<frozen importlib._bootstrap>", line 677, in _load_unlocked File "<frozen importlib._bootstrap_external>", line 728, in exec_module File "<frozen importlib._bootstrap>", line 219, in _call_with_frames_removed File "/var/application/sources/versions/django-tutorial/mysite/polls/models.py", line 7, in <module> class Question(models.Model): File "/usr/local/lib64/python3.7/site-packages/django/db/models/base.py", line 121, in __new__ new_class.add_to_class('_meta', Options(meta, app_label)) File "/usr/local/lib64/python3.7/site-packages/django/db/models/base.py", line 325, in add_to_class value.contribute_to_class(cls, name) File "/usr/local/lib64/python3.7/site-packages/django/db/models/options.py", line 208, in contribute_to_class self.db_table = truncate_name(self.db_table, connection.ops.max_name_length()) File "/usr/local/lib64/python3.7/site-packages/django/db/__init__.py", line 28, in __getattr__ return getattr(connections[DEFAULT_DB_ALIAS], item) File "/usr/local/lib64/python3.7/site-packages/django/db/utils.py", line 207, in __getitem__ backend = load_backend(db['ENGINE']) File "/usr/local/lib64/python3.7/site-packages/django/db/utils.py", line 111, in load_backend return import_module('%s.base' % backend_name) File "/usr/lib64/python3.7/importlib/__init__.py", line 127, in import_module return _bootstrap._gcd_import(name[level:], package, level) File "<frozen importlib._bootstrap>", line 1006, in _gcd_import File "<frozen importlib._bootstrap>", line 983, in _find_and_load File "<frozen importlib._bootstrap>", line 967, in _find_and_load_unlocked File "<frozen importlib._bootstrap>", line 677, in _load_unlocked File "<frozen importlib._bootstrap_external>", line 728, in exec_module File "<frozen importlib._bootstrap>", line 219, in _call_with_frames_removed File "/usr/local/lib64/python3.7/site-packages/django/db/backends/sqlite3/base.py", line 68, in <module> check_sqlite_version() File "/usr/local/lib64/python3.7/site-packages/django/db/backends/sqlite3/base.py", line 65, in check_sqlite_version raise ImproperlyConfigured('SQLite 3.8.3 or later is required (found %s).' % Database.sqlite_version) django.core.exceptions.ImproperlyConfigured: SQLite 3.8.3 or later is required (found 3.7.17).
どうやらAmazon Linux2のSQLite3のバージョンがDjangoの要件よりも古いバージョンのようである。
django.core.exceptions.ImproperlyConfigured: SQLite 3.8.3 or later is required (found 3.7.17).
このエラーの対応はその4に続く。