django mcfirst/settings.py　編集

#背景

今までaws、GCP、さくらインターネット(高火力)ラズパイなどデプロイしてきましたが、今回はロリポップ社マネージクラウドにteratermを用いながらdjangoをデプロイしたいと思います。後学の為、また自分自身が忘れっぽい為に敢えてエラー内容も記載しています。エラーの内容など大変稚拙でみづらい点も多々あるかもしれませんが予めご了承下さい。なおロリポップ社マネージクラウドpythonは、レンタルサーバーのため管理者権限が使えません。sudoなど利用不可です。


#環境
__LOCAL__
localOS：WIN10
SSH：TERATERM
APP：django

__SERVER__
FIRM：ロリポップマネージドクラウド
OS：Linux Ubuntu-4ubuntu2.8, OpenSSL 1.0.2g
LANG：Python3.6.8
ディスク容量10GB （SSD + HDD）
メモリ：512MB
データセンター 東京
管理者権限：なし

#０　ロリポップ社のマネージクラウドサービスに登録
Python のプロジェクトを作成します。プロジェクト作成ページ から Python のアプリケーションを選んでプロジェクトを作成します。以下のような写真がチェックできたら成功です。

![00000001.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/140071/135de8b4-ec6e-38ee-7cbd-945c80acaabb.jpeg)

#１　前処理
まず各種ライブラリをインストールします。マネージクラウドは管理者権限は利用不可の為sudoが使えませんので注意してください。



```
pip install --upgrade pip --user
pip install gunicorn --user
pip install uwsgi --user  #uWSGIはNginxとDjangoをつなぐ
```

#２　ssh接続　teraterm

さてteratermとサーバー間で使用する各鍵を設定し秘密鍵をダウンロードしましょう。SSHの鍵取得は以下URLになります。

```
https://mc.lolipop.jp/console/sshkeys
```
上記ブラウザ上で秘密鍵と公開鍵を作成します。秘密鍵は自動で作成されダウンロードされます。一方で公開鍵はマネージドクラウドに登録されます。秘密鍵は自動ダウンロードされますのでteratermなどSSHやSFTPクライアントツールから利用できます。以下赤線から鍵を新規作成して登録を押してください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/140071/aa5c6d34-b5af-8bf1-861d-5e7ae6d13364.png)

続いてteratermを開いてください。「ファイル」→「新しい接続」からホスト情報を入力します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/140071/302031c0-2c90-21fd-6ff2-ee1204ccb1e8.png)


以下のようにご自身の環境で作成してください。
ホスト名：ssh-1.mc.lolipop.jp
TCPポート：3XXXX3
SSH　SSHバージョン:SSH2

teraterm上で入力しエンターを押すと以下のようなSSH認証画面が出てきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/140071/601c6039-c6b7-1cae-0559-bf5f92ee9c73.png)


ユーザ名：yeXXXXXXX4
パスフレーズ：空白
RSA/DSA/ECDSA/ED25519鍵を使う　を選択し
秘密鍵を使いますので「秘密鍵」ボタンをクリックしてください。

開いたら右下のファイルの種類を開き全てのファイルを指定して先程ダウンロードした秘密鍵ファイルを指定してください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/140071/3a07fe39-6402-1900-4d90-eb2664434f62.png)

画面が以下のようになればローカルとサーバー間でSSH接続完了です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/140071/f2a18ae8-2902-3dd0-4961-cf40912a555c.png)

お疲れ様でした。さて続いてアプリを入れましょう。


#３Djangoインストール

djangoや周辺ライブラリをインストールしていきます。

#PIPENVインストール
pipenvは、pipでインストールできます。いつも通り以下のコマンドを実行してインストールしましたが既に導入されていました。

```
$ pip install pipenv
```

#Djangoインストール
まずアプリケーションの起動に必要なDjangoパッケージを取得します。pip を使用して Django のコマンドラインツールをインストールします。 (インストール済みの場合はスキップ)

```
$ pip install django
```

# エラー：パーミッションエラーが発生
ここで以下のようにパーミッションエラーが発生しました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/140071/12a6ce06-a7f1-fe30-8ae6-6363fde6257c.png)


```
Could not install packages due to an EnvironmentError: [Errno 13] Permission denied: '/usr/local/lib/python3.6/site-packages/pytz-2019.1.dist-info'
Consider using the `--user` option or check the permissions.
```

単にディレクトリを作る権限が無いというだけのようでしたのでpipインストール時にsudoを付けて管理者権限で実行しましたが管理者権限がない為エラーが出ます。

```
$ sudo pip install django
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/140071/5b996899-57a2-a1b6-f4f7-f093cfaa6e91.png)

```
-bash: sudo: command not found
```

どうやらpathが通っていないようです。余談ですが管理者権限でコマンドを実行する場合に用いるsudoですが、環境変数が引き継がれないのでコマンドが見つからないなど不便なことがあります。その場合はvisudoを用いて/etc/sudoersのsecure_pathなどを書き換えれば良いです。※なおロリポップではSSHではroot権限の利用はできませんでした。ソースは以下を参照してください。

管理者権限　なし
https://mc.lolipop.jp/specs

そこで以下コマンドでインストールを正常終了する事ができました。

```
$ sudo pip install django --user
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/140071/9a40c447-758c-ea46-af09-fb8bddecc1f6.png)

pipでinstallする場合--userオプションをつけるとユーザーディレクトリにインストールしてくれて権限の都合とかがある際は便利です。

#４PROJECTを作成する

続いてdjango-admin を使ってソースコードを自動生成します。ここではapp という名前のアプリケーションを作成します。

```
django-admin startproject first
```
first ディレクトリが作成されるので移動します。

```
cd first
```

#first/settings.py　編集

サーバーにアップロードしたときに正常動作させる為、いま作成されたディレクトリ　この場合firstの first/settings.py の設定を変更します。
具体的には、ALLOWED_HOSTS を下記のように変更します。 まずはもう一回cdでfirstにはいります(注意：firstは二回目)。yellow-aso-5384@gitpush-python-billowing-obi-0729:~/__first/first__$ ls -al

```
cd first
```

そうしたらいつも確認コマンドで中身をみてあげましょう。
```
ls -al
```

```
$ ls -al
total 20
...

setting.pyがありました。

...
 __init__.py
 settings.py
 urls.py
 wsgi.py
```

vimで開いて

```
vim setting.py
```

以下お決まりの3行ともいえるホストを許可しコードとゾーンもかえましょう（挿入はI、保存し閉じる時は:wq）

```
ALLOWED_HOSTS = ['*']
LANGUAGE_CODE = 'ja'
TIME_ZONE = 'Asia/Tokyo'
```

なお、ここではすべてのドメインを許可していますが、アプリケーションに対して使用するドメインがわかっている場合は、セキュリティのため個別にドメインを指定することを強く推奨いたします。

$ cd path/to/first

(先ほどのコマンドから継続して打つなら、$ cd first だけで大丈夫です。このディレクトリを "master directory" と呼ぶことにします)

# 確認のため

$ ls

manage.py first
# となっていますか？(一つ上のfirstの中に入ってください)

firstというプロジェクトに対してmyappというアプリケーションを作成します。

$ python manage.py startapp myapp


#パッケージインストール　gunicorn 
最後に pipenv を使用してサーバー上で必要になるパッケージを設定しますgunicorn, django をインストールします。Gunicornは、UNIX向けのPython WSGI HTTPサーバーです。RubyのUnicornから移植されたサーバーです。様々なWebフレームワークと互換性がありシンプルな実装の為リソース消費が少ないですね。Python 2.6以上、Python 3.2以上に対応しています。

```
pipenv install gunicorn django
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/140071/c8a44dd1-7168-da8b-2715-b49b5722a46d.png)

一階層ディレクトリを戻します。その後manage.pyがあるかを確認します。

```
$ cd ../
$ ls -al
total 16
 app
 manage.py

```

manage.pyがある場所へ移動してmigrationを実施して

```
$ python manage.py makemigrations
$ python manage.py migrate
```


ターゲットファイルmanage.pyがありました。runserverを起動させましょう。

```
 python manage.py runserver
```

ローダーが立ち上がりました。

```
Watching for file changes with StatReloader
Performing system checks...

System check identified no issues (0 silenced).

You have 17 unapplied migration(s). Your project may not work properly until you apply the migrations for app(s): admin, auth, contenttypes, sessions.
Run 'python manage.py migrate' to apply them.

July 07, 2019 - 03:02:54
Django version 2.2.3, using settings 'app.settings'
Starting development server at http://127.0.0.1:8000/
Quit the server with CONTROL-C.
^Cyellow-aso-5384@gitpush-python-billowing-obi-0729:~/app$
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/140071/8b5b473a-9a77-b77a-0a59-749a971748ee.png)


#５git設定


```
$ git init
Initialized empty Git repository in /var/app/.git/
```


変更のあったファイルをすべて登録します。

```
git add .
```

登録された変更を確認します。

```
git status
```

コミットします。

```
git commit -m "ここにコミットメッセージを記載します (例: ファーストコミット)"
```

エラーが出ますのでgitの初期設定をしましょう。
エラーの内容は以下になりますので参考にしてください。

```
*** Please tell me who you are.

Run

  git config --global user.email "you@example.com"
  git config --global user.name "Your Name"

to set your account's default identity.
Omit --global to set the identity only in this repository.

fatal: empty ident name (for <yellow-aso-5384@gitpush-python-billowing-obi-0729.lolipop.io-816b5acde6>) not allowed
```

エラー文に記載されている通りgitに自分を分からせるために
gitに登録しているアドレスとユーザーネームを指定してあげましょう。
ターミナルで以下を実行します。

```
git config --global user.email ここに自分のアドレスを入力してください
git config --global user.name ここに自分の名前を入力してください。
```
アドレスと名前の部分は""が無くても大丈夫です。これで再度コミットします。再度コミットします。今後は通りました。

```
git commit -m firstcommit
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/140071/60d5e105-2d7e-c6b7-1263-42cb13af53e2.png)

#６　Gitデプロイ準備
Pythonプロジェクトで リポジトリの push を行った際に依存するパッケージの取得を自動化します。まず作成したプロジェクトへ SSH でログインします。接続情報はプロジェクトの詳細ページを表示し「SSH / SFTP」の項目をチェックしてください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/140071/fec2b493-6f67-9646-25bf-a686c926934f.png)

```
$ ssh -p 39126 yellow-aso-5384@ssh-1.mc.lolipop.jp
```

エラーPermission denied (publickey).が出ました。

```
The authenticity of host '[ssh-1.mc.lolipop.jp]:41709 ([157.6.124.210]:41709)' can't be established.
ECDSA key fingerprint is SHA256:DFKJANDOFHAOFNASJKEFNA;OSEIHFAWEF.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '[ssh-1.mc.lolipop.jp]:41709,[157.6.124.210]:41709' (ECDSA) to the list of known hosts.
Permission denied (publickey).
```

そこでPUTTYを使って公開鍵と秘密鍵を作成します。

https://mclolipop.zendesk.com/hc/ja/articles/360001057808-%E5%85%AC%E9%96%8B%E9%8D%B5%E3%81%AE%E4%BD%9C%E6%88%90-%E7%99%BB%E9%8C%B2%E6%96%B9%E6%B3%95

作成したら再度以下に記載されているSSHコマンドをたたきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/140071/fec2b493-6f67-9646-25bf-a686c926934f.png)

公開鍵にも拘わらずパーミッションがないと言われています。

```
$ ssh -p 38453 yellow-aso-5384@ssh-1.mc.lolipop.jp
Permission denied (publickey).
```

```
git remote add lolipop ssh://yellow-aso-5384@ssh-1.mc.lolipop.jp:38453/
```

やはりパーミッションエラーがでました。

```
git push lolipop master
```

```
Permission denied (publickey).
fatal: Could not read from remote repository.
Please make sure you have the correct access rights
and the repository exists.
```

この問題のポイントは対象のリモートリポジトリへのアクセス権限がなく失敗していますので解決策として鍵認証周りを再設定し直す事が重要です。具体的に解決の流れは
１：鍵を作成する。
２：作成した鍵をコピーする。
３：gitghubに公開鍵を登録する。
４：configファイルを作成し直す。(接続確認）
だと思いますが３から実施します。

#githubで鍵を登録する

まず鍵を入れるフォルダに移動しましょう。
はじめて鍵を生成するときは何も入っていないはずです。
```
$ cd ~/.ssh
```

次のコマンドで鍵を生成します。

```
$ ssh-keygen -t rsa
```

3回エンターを押せばid_rsaとid_rsa.pubの2つの鍵が生成されます。
鍵が生成されました。

```
Generating public/private rsa key pair.
Enter file in which to save the key (/var/app/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /var/app/.ssh/id_rsa.
Your public key has been saved in /var/app/.ssh/id_rsa.pub.
The key fingerprint is:
Sfafafauhflabndflabliufha;sdfaiO1k yellow-aso-5384@gitpush-python-billowing-obi-0729.lolipop.io-816b5acde6
The key's randomart image is:
+---[RSA 2048]----+
|          . =+  .|
|           * += +|
|          + +o.+.|
|           + oo..|
|        S o.o.o..|
|         . o+oEo.|
|            .X+++|
|            O.===|
|           oo*+oO|
+----[SHA256]-----+
yellow-aso-5384@gitpush-python-billowing-obi-0729:~/.ssh$ clip < ~/.ssh/id_rsa.pub
```

#公開鍵をGitHubにアップロードする

```
yellow-aso-5384@gitpush-python-billowing-obi-0729:~/.ssh$ vi id_rsa.pub
```

で公開鍵(pub)の中身をチェックしエディタに保存しておきます。

githubのマイページで、この鍵を登録します。右上のアイコンをクリックし、settings → SSH and GPG keysをクリックしてください。次に、右上のnew keysをクリックしてください。

https://github.com/settings/keys

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/140071/152d0baf-2142-22bd-9a38-0ea389ce874e.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/140071/a3937d60-822d-abee-da0e-93ba9023824c.png)

先ほど作成した公開鍵 id_ras.pubの文字列をkeyの箇所に貼り付けてください（titleは任意の値です。）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/140071/9f529a7b-aaf7-94d3-95e6-d8bf30b2fa27.png)

#config作成
鍵を作るときに名前を指定していれば、うまくいかないかもしれません。ssh接続の際「~/.ssh/id_rsa」、「~/.ssh/id_dsa」、「~/.ssh/identity」のみデフォルトでは見にいかないからです。それに対応するため~/.ssh/configを作成します。

vimで作成してあげて

```
Host github github.com
  HostName github.com
  IdentityFile ~/.ssh/id_git_rsa #ここに自分の鍵のファイル名
  User git
```

作成しましょう。これで以下のようにコマンドを打って確かめて見ましょう。

```
ssh -T github
```

#接続を確かめましょう。

```
yellow-aso-5384@gitpush-python-billowing-obi-0729:~/.ssh$ ssh -T git@github.com
```

SSH接続には成功していますがGitHubはシェルアクセスは許していない旨のメッセージす。OKですね。

```
The authenticity of host 'github.com (13.114.40.48)' can't be established.
RSA key fingerprint is SHAasldkjfasdjfajf;aosdf;asdnfaY8.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'github.com,13.114.40.48' (RSA) to the list of known hosts.
Hi KENOSIN! You've successfully authenticated, but GitHub does not provide shell access.
```

続いてデプロイしましょう。

```
git push lolipop master
```

同じエラーがでました。

```
Permission denied (publickey).
fatal: Could not read from remote repository.
Please make sure you have the correct access rights
and the repository exists.
```

リモートリポジトリが読めません。あなたが正しいアクセス権を持っているかそのリポジトリが存在することを確認してください。というエラー内容です。一言で言えば鍵が合ってない可能性が高いですね。アクセス権がない、またはリポジトリが存在しない、いずれかが原因と考えられます。そこでまずそのリモートリポジトリが存在するかコマンドで一覧を確認してみました。

```
git remote -v
```

```
lolipop ssh://yellow-aso-5384@ssh-1.mc.lolipop.jp:38453/ (fetch)
lolipop ssh://yellow-aso-5384@ssh-1.mc.lolipop.jp:38453/ (push)
```
ちゃんとsshになっています。
そこで以下サイトを参考に鍵を生成しなおす事にしました。
http://tusukuru.hatenablog.com/entry/2018/08/29/021651

鍵は無事生成されましたが、このままではまだ稼働しませんので以下２つの手順を踏みます。

#１つめ　puttygenで生成されたid_rsaをppkに変換する

.sshの中に生成したid_rsaが入っています。
しかしまだppkになっていません。このファイルをwin10のローカルにダウンロードして
puttygenでppk化して、linuxサーバーへアップロードしました。
puttygenの使い方は以下を参考にしてください。
http://www.puniokid.com/tips/linux/69/

```
yellow-aso-5384@gitpush-python-billowing-obi-0729:~/.ssh$ ls -al
total 28
drwxr-xr-x 2 yellow-aso-5384 www-data 4096 Jul  8 07:55 .
drwxrwxr-x 9 yellow-aso-5384 www-data 4096 Jul  8 08:00 ..
-rw-r--r-- 1 yellow-aso-5384 www-data   74 Jul  8 05:50 config
-rw-r--r-- 1 yellow-aso-5384 www-data  275 Jul  8 05:21 environment
-rw------- 1 yellow-aso-5384 www-data 1675 Jul  8 05:43 id_rsa
-rw-r--r-- 1 yellow-aso-5384 www-data  406 Jul  8 05:43 id_rsa.pub
-rw-r--r-- 1 yellow-aso-5384 www-data 2212 Jul  7 06:49 known_hosts
```

名前をid_rsa.ppkに整形します。

```
yellow-aso-5384@gitpush-python-billowing-obi-0729:~/.ssh$ mv sample.ppk id_rsa.ppk
```

#２つめ　マネージドクラウド側へGITHUBの公開鍵の設定を行う
公開鍵の内容はこんな感じです。メールアドレスは含めなくていいので注意してください。

```
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABDAF;AOIJFOAWEJFA;POENF;AWOENFLAWBFKQAJAWGBAWLAGA:WIAE@8WHOIEBBGVL;UAAWHFaC1yc2EAAAADAQABDAF;AOIJFOAWEJFA;POENF;AWOENFLAWBFKQAJAWGBAWLAGA:WIAE@8WHOIEBBGVL;UAAWHFaC1yc2EAAAADAQABDAF;AOIJFOAWEJFA;POENF;AWOENFLAWBFKQAJAWGBAWLAGA:WIAE@8WHOIEBBGVL;UAAWHFaC1yc2EAAAADAQABDAF;AOIJFOAWEJFA;POENF;AWOENFLAWBFKQAJAWGBAWLAGA:WIAE@8WHOIEBBGVL;UAAWHFZ2K6yd
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/140071/b74b40e0-4207-84c3-3cb9-73dd570946cf.png)


3回目のデプロイです。

```
git push lolipop master
```

今回はデプロイが通りました。

```
Counting objects: 9507, done.
Delta compression using up to 48 threads.
Compressing objects: 100% (8320/8320), done.
Writing objects: 100% (9507/9507), 34.87 MiB | 221.00 KiB/s, done.
Total 9507 (delta 3035), reused 0 (delta 0)
remote: Run python build process...
remote: Syncing...
remote: Deploy :ok:
remote: Build success! Thanks for using Lolipop! Managed Cloud.
remote: Restarting app...
To ssh://yellow-aso-5384@ssh-1.mc.lolipop.jp:38453/
 * [new branch]      master -> master
```

manage.pyがある場所へ移動してmigrationを実施して

```
$ python manage.py makemigrations
$ python manage.py migrate
```

runserverコマンドを叩きます。

```
$ python manage.py runserver 8000
```