📌

DjangoからEC2へデプロイ

2021/05/25に公開

これubuntu20.04にすると上手くいった。

  1. 環境変数とデータベースの設定のモジュールをターミナルからインストールする
$ pip install django-environ
$ pip install dj-database-url
  1. プロジェクトルート/jira_api/settings.pyのファイル下部にSTATIC_ROOTを追加する
    ローカルで作成したときに綺麗なGUIができていたと思うが、サーバーにデプロイするときはそのファイルを一つにまとめる必要がある。そのためにSTATIC_ROOTを用いる
STATIC_ROOT = os.path.join(BASE_DIR, 'static')
  1. そのためプロジェクトルート/staticフォルダを作成する

  2. 環境変数を格納するためのenvファイルを作成する(プロジェクトルート/.env)

  3. 環境変数化したいパラメータを記入する
    この時に注意するのは=の前後にスペースなどが入らないようにすること

SECRET_KEY=********************
DEBUG=False
DATABASE_URL=sqlite:///db.sqlite3
  1. シークレットキーはsettings.pyの中にあるシークレットキーをコピーして
    envファイルに貼り付ける

  2. settings.pyの戻って環境変数のenvファイルを使用できるためにenvironを使用できるようにする

import environ

env = environ.Env()
env.read_env(os.path.join(BASE_DIR,'.env'))
  1. debugについてもenvファイルから読み込む
DEBUG = env('DEBUG')
  1. データベースの設定として環境変数から呼び出す
DATABASES = {
    'default': env.db(),
}
  1. ローカルの仮想環境に色々なモジュールをインポートしたがそちらをpip freezeで読み込みrequirements-dev.txtに依存関係を吐き出して書き込む
$ pip freeze > requirements-dev.txt
  1. 本番環境用にrequirements.txtを作成しておくその中身も書いていく
    requirements-devの内容を読む
    gunicornとpsycopg2を使えるようにする
-r requirements-dev.txt
gunicorn
psycopg2
  1. Djangoのプロジェクトをgithubにあげていく

リポジトリの作成
ignoreは/.envのみ
pushする

  1. AWSのマネジメントコンソールにログインする
  2. ec2を選択
  3. インスタンスの作成
  4. Ubuntu Server 18.04
  5. t2.micro
  6. インスタンスの設定はデフォルト
  7. ストレージの追加もデフォルト
  8. タグの追加もデフォルト
  9. セキュリティグループの設定では(セキュリティグループ名を変更しておく)
  10. 確認と作成で起動ボタンをクリック
  11. キーペアの作成で新しいキーペアの作成をする
  12. インスタンスの起動
  13. sshまたはセッションマネージャでもいいのでログインをして
  14. ログインができたら設定を進めていく
  15. 最新の状態にupdateしておく
sudo apt-get update
  1. installしたいものを一式取り揃えておく
sudo apt-get install python3-pip python3-dev libpq-dev postgresql postgresql-contrib nginx
  1. postgresqlのデータベースを作るためにpostgresの編集モードにする
$ sudo -u postgres psql
  1. DBの作成
postgres=# CREATE DATABASE jiradb;
CREATE DATABASE
  1. ユーザーの作成
postgres=# CREATE USER jira WITH PASSWORD 'W)jfsaDNG>ge83';
CREATE ROLE
  1. エンコードをutf8に変更する
postgres=# ALTER ROLE jira SET client_encoding TO 'utf8'
postgres-# ;
ALTER ROLE
  1. トランザクションレベルの変更
postgres=# ALTER ROLE jira SET default_transaction_isolation TO 'read committed';
ALTER ROLE
  1. タイムゾーンの設定
postgres=# ALTER ROLE jira SET timezone TO 'UTC+9';
ALTER ROLE
  1. データベースの全ての権限をjiraのユーザーに付与する
postgres=# GRANT ALL PRIVILEGES ON DATABASE jiradb TO jira;
GRANT
  1. postgresの編集モードを終了する
postgres=# \q
ubuntu@ip-172-31-46-212:~$ 
  1. pipのインストール
ubuntu@ip-172-31-46-212:~$ sudo -H pip3 install --upgrade pip
  1. 仮想環境を作っていくのでヴァーチャルエンブをインストールする
ubuntu@ip-172-31-46-212:~$ sudo -H pip3 install virtualenv
  1. 新しく仮想環境を作成する
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
  1. 仮想環境に入るためのコマンドを実行
ubuntu@ip-172-31-46-212:~$ source jiraec2/bin/activate
(jiraec2) ubuntu@ip-172-31-46-212:~$ 
  1. 仮想環境の中で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.
  1. lsコマンドでフォルダの中身をみてみる
(jiraec2) ubuntu@ip-172-31-46-212:~$ ls
jira_api  jiraec2
  1. プロジェクトの階層に移動して中身を確認する
(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
  1. pip installを使用してモジュールを一気にインストールしていく
pip install -r requirements.txt
  1. 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

これでファイルの実行ができました。

  1. 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 エンターキーでセーブをする

  1. 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 エンターキーでセーブをする

  1. homeディレクトリを戻る
ubuntu@ip-172-31-46-212:~/jira_api/jira_api$ cd
  1. postgresの編集モードに入る
sudo -u postgres psql
  1. uuid-osspを作成する
postgres=# CREATE EXTENSION "uuid-ossp";
CREATE EXTENSION

postgres=# \q
ubuntu@ip-172-31-46-212:~$ 
  1. 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
  1. マイグレートを実行してデータベース構造を作っておく
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

  1. スタティックファイルを一つのstaticファイルにかき集める
ubuntu@ip-172-31-46-212:~/jira_api$ python3 manage.py collectstatic

165 static files copied to '/home/ubuntu/jira_api/static'.
  1. スーパーユーザの作成
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.
  1. グニコーンの設定をする
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 エンターキーでセーブをする

  1. 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 エンターキーでセーブをする

  1. 先ほど作成したnginxのファイルにシンボリックリンクを設定しておく
ubuntu@ip-172-31-46-212:~/jira_api$ sudo ln -s /etc/nginx/sites-available/jira_api /etc/nginx/sites-enabled/
  1. nginxの起動
ubuntu@ip-172-31-46-212:~/jira_api$ sudo systemctl restart nginx
  1. 先ほど指定した80番ポートの解放のために次のコマンドを実施
ubuntu@ip-172-31-46-212:~/jira_api$ sudo ufw allow 'Nginx Full'
Rules updated
Rules updated (v6)
  1. ec2のセキュリティグループに戻ってインバウンドルールを編集してルールを追加してhttpを解放する

  2. ターミナルに戻ってグニコーンを起動する

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.
  1. パブリックIPアドレスにアクセスして /adminにアクセス スーパーユーザーでログインを実施する

Discussion