wsl+ubuntu+python+djangoの開発環境を構築する

windows10でdjangoの開発環境を構築してみます。

Linuxはあまり経験がないのですが、できれば今後、Linuxサーバで運用する場合でも大丈夫なようにしておきたいとおもったので試しにやってみます。まずは開発環境から。

##1.WSLにubuntuをインストールする。

Windows10には、WSL(Windows Subsystem for Linux)という機能があるので、こちらにDjangoの環境を構築します。

下記リンクを参考に作業を進めます。
[Windows Subsystem for Linuxをインストールしてみよう！](https://qiita.com/Aruneko/items/c79810b0b015bebf30bb)

###(1)WSL(Windows Subsystem for Linux)を有効化する。

・windowボタン(左下)を右クリック、「アプリと機能」を選択する。
・右欄の下部にスクロールして、「プログラムと機能」を選択する。
・右欄の「windowsの機能の有効化または無効化」を選択する。
・「Windows Subsystem for Linux」をチェックして「OK」ボタンをクリックする。

###(2)WSL(Windows Subsystem for Linux)として「Ubuntu」をインストールする。

・windowボタン(左下)を左クリックし、「Microsoft Store」を起動する。
・右上の「検索」をクリックして、「Ubuntu」と入力し、「Ubuntu」を選択する。

###(3)初期起動時のユーザ名、パスワードの設定

・windowボタン(左下)を左クリックし、「Ubuntu」を起動する。
・ユーザ名、パスワード（いずれも任意。入力後、忘れないように必ずメモしておく）

###(4)リポジトリを変更
参考サイトに記載されているとおり、ubuntuのリポジトリを変更しておきます。

```
sudo sed -i -e 's%http://.*.ubuntu.com%http://ftp.jaist.ac.jp/pub/Linux%g' /etc/apt/sources.list
```

###(5)日々の作業

以下のコマンドは毎回実施する。

```
sudo apt update
sudo apt upgrade
```

###(6)ホームディレクトリの変更
ホームディレクトリは、わかりやすいディレクトリに移動します。こちらも以下のサイトを参考にさせていただきます。

[WSLのホームディレクトリ用のフォルダをWindows上に作成](【WSL】ホームディレクトリ変更手順)

・「C:\linux_home」いうフォルダをエクスプローラで作成しておきます。
・ubuntuのコマンドラインから、以下のとおり、passwdファイルを編集します。

```
$ sudo vim /etc/passwd

（↓ユーザ名の行を探し/home/xxxを「/mnt/c/linux_home」に変更）
{ubuntu上のユーザ名}:x:1000:1000:,,,:/mnt/c/linux_home:/bin/bash
```

・exitコマンドで一旦ubuntuを終了します。
・再度「ubuntu」を起動して、ホームディレクトリが変更されていることを確認します。

```
XXXXXXX@DESKTOP-B5N6I3B:~$ pwd
/mnt/c/linux_home
XXXXXXX@DESKTOP-B5N6I3B:~$
```

以上でWSLのインストールは完了です。

##2.pythonをインストールする
こちらは、以下のサイトを参考にインストールしていきます。
[Windows10(WSL)で、2018年的Pythonプロジェクト（①pyenv/pipenvの導入）]
(https://qiita.com/Nimimal/items/72c2e2a6a566d1f5d2a2)

###(1)pyenvをインストールする。
参考サイトのまんまです。
gitをインストールして、gitからpyenvをインストールします。

```
sudo apt update
sudo apt upgrade
sudo apt install git
git clone https://github.com/yyuu/pyenv.git ~/.pyenv
echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bashrc
echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bashrc
echo 'eval "$(pyenv init -)"' >> ~/.bashrc
source ~/.bashrc
pyenv
```

###(2)pythonをインストール
参考サイトでは、3.7.1を入れてますが、投稿時の最新である「3.7.2」を入れることにします。

```
sudo apt-get install -y make build-essential libssl-dev zlib1g-dev libbz2-dev libreadline-dev libsqlite3-dev wget curl llvm libncurses5-dev libncursesw5-dev xz-utils tk-dev
sudo apt-get install libffi-dev
pyenv install 3.7.2
pyenv global 3.7.2
```

###(3)pipenvをインストール

```
pip install --upgrade pip
pip install pipenv
```

以上で、pythonのインストールは完了です。

##3.djangoをインストールする。
djangoをインストールしていきます。

・一旦ubuntuをexitして、再度「ubuntu」を起動します。

###(1)pythonのバージョンを確認します。

```
XXXXXXX@DESKTOP-B5N6I3B:~$ python -V
Python 3.7.2
XXXXXXX@DESKTOP-B5N6I3B:~$ pip -V
pip 18.1 from /mnt/c/linux_home/.pyenv/versions/3.7.2/lib/python3.7/site-packages/pip (python 3.7)XXXXXXX@DESKTOP-B5N6I3B:~$
```

###(2)virtualenvで仮想環境を作成する。

mydjangoというディレクトリを作成して、その中に仮想環境を構築します。

```
XXXXXXX@DESKTOP-B5N6I3B:~$ mkdir mydjango
XXXXXXX@DESKTOP-B5N6I3B:~$ cd mydjango/
XXXXXXX@DESKTOP-B5N6I3B:~/mydjango$ virtualenv venv
```

###(4)djangoをインストールする。

・activateは、sourceコマンドで行います。
※windowsの時とは違うので注意

```
XXXXXXX@DESKTOP-B5N6I3B:~/mydjango$ source venv/bin/activate
```

・dijangoをインストールする。

```
XXXXXXX@DESKTOP-B5N6I3B:~/mydjango$ pip install django
```

・確認

```
XXXXXXX@DESKTOP-B5N6I3B:~/mydjango$ pip list
Package    Version
---------- --------
Django     2.1.5
pip        18.1
pytz       2018.9
setuptools 40.6.3
wheel      0.32.3
```

以上でdjangoのインストールが完了

##4.プロジェクトの作成と実行

プロジェクトを作成して、Djangoアプリを起動してみます。

```shell
(venv) XXXXXXX@DESKTOP-B5N6I3B:~/mydjango$ pip list
Package    Version
---------- --------
Django     2.1.5
pip        18.1
pytz       2018.9
setuptools 40.6.3
wheel      0.32.3
(venv) XXXXXXX@DESKTOP-B5N6I3B:~/mydjango$ django-admin startproject mysite
```

#### 2020.08.30 追記

wslの再インストールをした時に、下記のようなメッセージが出た。

```shell
Command 'djnago-admin' not found, did you mean:
  command 'django-admin' from deb python-django-common
Try: sudo apt install <deb name>
```

再インストールしたときのバージョンは以下の通り。

|app|version|
|:--|:--|
|pyenv|pyenv 1.2.20-5-g1ec3c6f1|
|python|3.8.5|

django-adminがインストールされるパッケージの場所が以下のようになっている。

```shell
cd $PYENV_ROOT/versions/3.8.5/bin
```

.bashrcに以下を追加する。

```config:.bashrc
export PATH="$PYENV_ROOT/versions/3.8.5/bin:$PATH"
```

```shell
source .bashrc
```

これでdjango-adminコマンドが有効になった。
改めてdjango-adminコマンドでプロジェクトを作成する。

```shell
(venv) XXXXXXX@DESKTOP-B5N6I3B:~/mydjango$ django-admin startproject mysite
(venv) XXXXXXX@DESKTOP-B5N6I3B:~/mydjango$ cd mysite
(venv) XXXXXXX@DESKTOP-B5N6I3B:~/mydjango/mysite$ python manage.py runserver
Performing system checks...

・・・・

Django version 2.1.5, using settings 'mysite.settings'
Starting development server at http://127.0.0.1:8000/
Quit the server with CONTROL-C.
```

ubuntuのコンソールを開けたまま、windowsのブラウザで[http://127.0.0.1:8000/](http://127.0.0.1:8000/)にアクセスする

![image.png](https://qiita-image-store.s3.amazonaws.com/0/246741/3f6443dc-6821-af66-a55c-57d7db6b2c41.png)

ここまで来るのにかなり試行錯誤しましたが、なんとか無事動かすことができました。
あとは必要な機能をいれていけば、業務アプリを開発できそうです。

##5. ログイン時に「source .bashrc」を自動的に実行する方法

### (1) ルートディレクトリに、「.bash_profile」というファイルを作成して、以下のように編集します。

```bash
if [ -f ~/.bashrc ] ; then
. ~/.bashrc
fi
```

### (2) 保存してexitします。

### (3) 再度ログインしてみます。

```shell
~$ python -V
Python 3.7.2
```

ちゃんと読み込まれてます。

## 6. WSLにpostgresql installする(2020.4.29 追加)

###  リポジトリ追加

```
echo "deb http://apt.postgresql.org/pub/repos/apt/ bionic-pgdg main" | sudo tee -a /etc/apt/sources.list.d/pgdg.list
```

### 認証キー追加

```
curl https://www.postgresql.org/media/keys/ACCC4CF8.asc | sudo apt-key add -
```

### リポジトリ更新

```
$ sudo apt update
$ sudo apt upgrade
```

### install

```
sudo apt install postgresql
```

## postgresqlのサービスを自動起動

インストールが完了したら、windows起動時またはログイン時に、postgresqlのサービスを自動起動します。

### (1) WSL側の設定

sudoをパスワード無しで実行するには「/etc/sudoers.d」を以下のvisudoコマンドで編集します。

```Shell:
$ sudo visudo
```

エディタが開いたら最後行に以下を追加します。
※「username」はubuntuのusername

```D:
#includedir /etc/sudoers.d
username ALL=(ALL) NOPASSWD: ALL
```

### (2) windows側の設定

- バッチファイル（例としてWSL_SEVICE_START.batとする）を作成して、以下のように編集します。

```powershell
@echo off
wsl /bin/bash -l -c "sudo service postgresql start"
```

- タスクスケジューラで作成したバッチファイルを実行するように設定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/246741/5923112a-9b03-837e-60ed-a585d85eca0c.png)

## Using psql 【2020.07.24 追加】

psqlを使うためにpostgresに接続します。以下のコマンドを入力する。

```shell
$ sudo -u postgres psql
psql (12.3 (Ubuntu 12.3-1.pgdg18.04+1))
Type "help" for help.

postgres=#
```