DjangoからEC2へデプロイ
これubuntu20.04にすると上手くいった。
- 環境変数とデータベースの設定のモジュールをターミナルからインストールする
$ pip install django-environ
$ pip install dj-database-url
- プロジェクトルート/jira_api/settings.pyのファイル下部にSTATIC_ROOTを追加する
ローカルで作成したときに綺麗なGUIができていたと思うが、サーバーにデプロイするときはそのファイルを一つにまとめる必要がある。そのためにSTATIC_ROOTを用いる
STATIC_ROOT = os.path.join(BASE_DIR, 'static')
-
そのためプロジェクトルート/staticフォルダを作成する
-
環境変数を格納するためのenvファイルを作成する(プロジェクトルート/.env)
-
環境変数化したいパラメータを記入する
この時に注意するのは=の前後にスペースなどが入らないようにすること
SECRET_KEY=********************
DEBUG=False
DATABASE_URL=sqlite:///db.sqlite3
-
シークレットキーはsettings.pyの中にあるシークレットキーをコピーして
envファイルに貼り付ける -
settings.pyの戻って環境変数のenvファイルを使用できるためにenvironを使用できるようにする
import environ
env = environ.Env()
env.read_env(os.path.join(BASE_DIR,'.env'))
- debugについてもenvファイルから読み込む
DEBUG = env('DEBUG')
- データベースの設定として環境変数から呼び出す
DATABASES = {
'default': env.db(),
}
- ローカルの仮想環境に色々なモジュールをインポートしたがそちらをpip freezeで読み込みrequirements-dev.txtに依存関係を吐き出して書き込む
$ pip freeze > requirements-dev.txt
- 本番環境用にrequirements.txtを作成しておくその中身も書いていく
requirements-devの内容を読む
gunicornとpsycopg2を使えるようにする
-r requirements-dev.txt
gunicorn
psycopg2
- Djangoのプロジェクトをgithubにあげていく
リポジトリの作成
ignoreは/.envのみ
pushする
- AWSのマネジメントコンソールにログインする
- ec2を選択
- インスタンスの作成
- Ubuntu Server 18.04
- t2.micro
- インスタンスの設定はデフォルト
- ストレージの追加もデフォルト
- タグの追加もデフォルト
- セキュリティグループの設定では(セキュリティグループ名を変更しておく)
- 確認と作成で起動ボタンをクリック
- キーペアの作成で新しいキーペアの作成をする
- インスタンスの起動
- sshまたはセッションマネージャでもいいのでログインをして
- ログインができたら設定を進めていく
- 最新の状態にupdateしておく
sudo apt-get update
- installしたいものを一式取り揃えておく
sudo apt-get install python3-pip python3-dev libpq-dev postgresql postgresql-contrib nginx
- postgresqlのデータベースを作るためにpostgresの編集モードにする
$ sudo -u postgres psql
- DBの作成
postgres=# CREATE DATABASE jiradb;
CREATE DATABASE
- ユーザーの作成
postgres=# CREATE USER jira WITH PASSWORD 'W)jfsaDNG>ge83';
CREATE ROLE
- エンコードをutf8に変更する
postgres=# ALTER ROLE jira SET client_encoding TO 'utf8'
postgres-# ;
ALTER ROLE
- トランザクションレベルの変更
postgres=# ALTER ROLE jira SET default_transaction_isolation TO 'read committed';
ALTER ROLE
- タイムゾーンの設定
postgres=# ALTER ROLE jira SET timezone TO 'UTC+9';
ALTER ROLE
- データベースの全ての権限をjiraのユーザーに付与する
postgres=# GRANT ALL PRIVILEGES ON DATABASE jiradb TO jira;
GRANT
- postgresの編集モードを終了する
postgres=# \q
ubuntu@ip-172-31-46-212:~$
- pipのインストール
ubuntu@ip-172-31-46-212:~$ sudo -H pip3 install --upgrade pip
- 仮想環境を作っていくのでヴァーチャルエンブをインストールする
ubuntu@ip-172-31-46-212:~$ sudo -H pip3 install virtualenv
- 新しく仮想環境を作成する
ubuntu@ip-172-31-46-212:~$ virtualenv jiraec2
created virtual environment CPython3.6.9.final.0-64 in 913ms
creator CPython3Posix(dest=/home/ubuntu/jiraec2, clear=False, no_vcs_ignore=False, global=False)
seeder FromAppData(download=False, pip=bundle, setuptools=bundle, wheel=bundle, via=copy, app_data_dir=/home/ubuntu/.local/share/virtualenv)
added seed packages: pip==21.1.1, setuptools==56.0.0, wheel==0.36.2
activators BashActivator,CShellActivator,FishActivator,PowerShellActivator,PythonActivator,XonshActivator
- 仮想環境に入るためのコマンドを実行
ubuntu@ip-172-31-46-212:~$ source jiraec2/bin/activate
(jiraec2) ubuntu@ip-172-31-46-212:~$
- 仮想環境の中でgitのリポジトリをクローンする
プライベートリポジトリの場合はログインを求められるのでユーザー名とパスワードを入力するように
(jiraec2) ubuntu@ip-172-31-46-212:~$ git clone https://github.com/kazumasamatsumoto/jira_api.git
Cloning into 'jira_api'...
remote: Enumerating objects: 38, done.
remote: Counting objects: 100% (38/38), done.
remote: Compressing objects: 100% (31/31), done.
remote: Total 38 (delta 1), reused 38 (delta 1), pack-reused 0
Unpacking objects: 100% (38/38), done.
- lsコマンドでフォルダの中身をみてみる
(jiraec2) ubuntu@ip-172-31-46-212:~$ ls
jira_api jiraec2
- プロジェクトの階層に移動して中身を確認する
(jiraec2) ubuntu@ip-172-31-46-212:~$ cd jira_api/
(jiraec2) ubuntu@ip-172-31-46-212:~/jira_api$
(jiraec2) ubuntu@ip-172-31-46-212:~/jira_api$ ls
api db.sqlite3 jira_api manage.py media requirements-dev.txt requirements.txt
- pip installを使用してモジュールを一気にインストールしていく
pip install -r requirements.txt
- jwtのバージョンが合わないのでubuntuのpythonのバージョンをあげてみる(ここは多分エラーの原因ubuntu18の時)
30 sudo apt update -y
31 sudo apt upgrade -y
32 sudo apt dist-upgrade -y
33 sudo apt autoremove -y
34 sudo apt autoclean -y
36 sudo apt install -y python3.8
37 sudo update-alternatives --install /usr/bin/python3 python3 /usr/bin/python3.8 1
38 sudo update-alternatives --install /usr/bin/python3 python3 /usr/bin/python3.6 2
39 sudo update-alternatives --config python3
ここでpythonが3.8のバージョンを指定する
40 python3 --version
47 sudo apt-get install build-essential libssl-dev libffi-dev python3-dev
53 sudo apt install python3.8-dev
54 pip install -r requirements.txt
これでファイルの実行ができました。
- ubuntuの環境変数のenvファイルを作成していく
ubuntu@ip-172-31-46-212:~/jira_api$ nano .env
SECRET_KEY=***************************
DEBUG=False
DATABASE_URL=postgres://jira:W)jfsaDNG>ge83@localhost:/jiradb
ALLOWED_HOSTS=175.41.198.50
ALLOWED_HOSTSにはEC2のパブリックIPアドレス
DATABASE_URLは少し特殊でpostgres://ユーザー名:パスワード@localhost:/データベース名
みたいな形になります
シークレットキーとデバッグはローカル開発環境のものをそのまま使います
nonaエディタから抜けるため
コントロール+x yes エンターキーでセーブをする
- settings.pyのALLOWED_HOSTを環境変数から読み取る
ubuntu@ip-172-31-46-212:~/jira_api$ cd jira_api
ubuntu@ip-172-31-46-212:~/jira_api/jira_api$ nano settings.py
settings.pyの編集
ALLOWED_HOSTS = env.list('ALLOWED_HOSTS')
nonaエディタから抜けるため
コントロール+x yes エンターキーでセーブをする
- homeディレクトリを戻る
ubuntu@ip-172-31-46-212:~/jira_api/jira_api$ cd
- postgresの編集モードに入る
sudo -u postgres psql
- uuid-osspを作成する
postgres=# CREATE EXTENSION "uuid-ossp";
CREATE EXTENSION
postgres=# \q
ubuntu@ip-172-31-46-212:~$
- models.pyのデータ構造を展開するためにマイグレートを実施する必要がある
ubuntu@ip-172-31-46-212:~$ cd jira_api
ubuntu@ip-172-31-46-212:~/jira_api$ ls
api db.sqlite3 jira_api manage.py media requirements-dev.txt requirements.txt
- マイグレートを実行してデータベース構造を作っておく
ubuntu@ip-172-31-46-212:~/jira_api$ python3 manage.py migrate
/usr/lib/python3/dist-packages/requests/__init__.py:78: RequestsDependencyWarning: urllib3 (1.25.6) or chardet (3.0.4) doesn't match a supported version!
warnings.warn("urllib3 ({0}) or chardet ({1}) doesn't match a supported "
Operations to perform:
Apply all migrations: admin, api, auth, contenttypes, sessions
Running migrations:
Applying contenttypes.0001_initial... OK
Applying auth.0001_initial... OK
Applying admin.0001_initial... OK
Applying admin.0002_logentry_remove_auto_add... OK
Applying admin.0003_logentry_add_action_flag_choices... OK
Applying api.0001_initial... OK
Applying contenttypes.0002_remove_content_type_name... OK
Applying auth.0002_alter_permission_name_max_length... OK
Applying auth.0003_alter_user_email_max_length... OK
Applying auth.0004_alter_user_username_opts... OK
Applying auth.0005_alter_user_last_login_null... OK
Applying auth.0006_require_contenttypes_0002... OK
Applying auth.0007_alter_validators_add_error_messages... OK
Applying auth.0008_alter_user_username_max_length... OK
Applying auth.0009_alter_user_last_name_max_length... OK
Applying auth.0010_alter_group_name_max_length... OK
Applying auth.0011_update_proxy_permissions... OK
Applying auth.0012_alter_user_first_name_max_length... OK
Applying sessions.0001_initial... OK
- スタティックファイルを一つのstaticファイルにかき集める
ubuntu@ip-172-31-46-212:~/jira_api$ python3 manage.py collectstatic
165 static files copied to '/home/ubuntu/jira_api/static'.
- スーパーユーザの作成
python3 manage.py createsuperuser
username: jirasuperuser
email Address: 飛ばしてOK
password: 複雑なもの
ubuntu@ip-172-31-46-212:~/jira_api$ python3 manage.py createsuperuser
/usr/lib/python3/dist-packages/requests/__init__.py:78: RequestsDependencyWarning: urllib3 (1.25.6) or chardet (3.0.4) doesn't match a supported version!
warnings.warn("urllib3 ({0}) or chardet ({1}) doesn't match a supported "
Username (leave blank to use 'ubuntu'): jirasuperuser
Email address: k.matsumoto@benjamin.co.jp
Password:
Password (again):
Superuser created successfully.
- グニコーンの設定をする
ubuntu@ip-172-31-46-212:~/jira_api$ sudo nano /etc/systemd/system/gunicorn.service
[Unit]
Description=gunicorn daemon
After=network.target
[Service]
User=ubuntu
Group=www-data
WorkingDirectory=/home/ubuntu/jira_api
ExecStart=/home/ubuntu/jiraec2/bin/gunicorn --access-logfile - --workers 3 --bind unix:/home/ubuntu/jira_api/jira_api.sock jira_api.wsgi:application
[Install]
WantedBy=multi-user.target
jira_apiとjiraec2のようにプロジェクト名と仮想環境名が変化する
nonaエディタから抜けるため
コントロール+x yes エンターキーでセーブをする
- nginxの設定ファイルを作成していく
ubuntu@ip-172-31-46-212:~/jira_api$ sudo nano /etc/nginx/sites-available/jira_api
server {
listen 80;
server_name 175.41.198.50;
location = /favicon.ico {access_log off; log_not_found off;}
location /static/ {
root /home/ubuntu/jira_api;
}
location / {
include proxy_params;
proxy_pass http://unix:/home/ubuntu/jira_api/jira_api.sock;
}
}
jira_apiのプロジェクト名とec2のパブリックIP(server_nameのところ)がプロジェクトごとに設定する必要があるもの
nonaエディタから抜けるため
コントロール+x yes エンターキーでセーブをする
- 先ほど作成したnginxのファイルにシンボリックリンクを設定しておく
ubuntu@ip-172-31-46-212:~/jira_api$ sudo ln -s /etc/nginx/sites-available/jira_api /etc/nginx/sites-enabled/
- nginxの起動
ubuntu@ip-172-31-46-212:~/jira_api$ sudo systemctl restart nginx
- 先ほど指定した80番ポートの解放のために次のコマンドを実施
ubuntu@ip-172-31-46-212:~/jira_api$ sudo ufw allow 'Nginx Full'
Rules updated
Rules updated (v6)
-
ec2のセキュリティグループに戻ってインバウンドルールを編集してルールを追加してhttpを解放する
-
ターミナルに戻ってグニコーンを起動する
ubuntu@ip-172-31-46-212:~/jira_api$ sudo systemctl restart gunicorn
ubuntu@ip-172-31-46-212:~/jira_api$ sudo systemctl enable gunicorn
Created symlink /etc/systemd/system/multi-user.target.wants/gunicorn.service → /etc/systemd/system/gunicorn.service.
- パブリックIPアドレスにアクセスして /adminにアクセス スーパーユーザーでログインを実施する
Discussion