内藤 裕二/ 2022年 7月 6日/ 社内勉強会

こんにちは、内藤です!
7/1(金)に18回目のトーチの会を実施しました。
5月に実施したサーバセットアップの後編として、いよいよdjangoのアプリケーションをデプロイしていきます。

なんと今回は、弊社のホームページ改修を手伝ってくれている、Erinaさんも参加してくれました!
社外の人が参加してくださるのは、初めてとなります。

私が講師を務めたのですが、緊張してたのか、写真とるのを忘れてしまったので、今回は文字密度多めです・・・

前回の様子はこちらです

【勉強会】

座学

今回も、前半は座学です。
スライドをベースに解説し、適宜質問を受け付けます。

  • Linuxのデーモン管理
    • sytemd
  • データベース
    • リレーショナルデータベース
    • MariaDBの設定で気を付けること
    • 標準的な権限設定
  • python
    • pythonとは
    • pythonのバージョン管理
    • pythonの仮想環境について
    • pythonのライブラリ管理について
  • pythonを使用したWebアプリケーションの構成
    • Webアプリケーションの標準構成
  • WebサーバとDNS
    • Webサーバ
    • ドメイン名とバケツリレー
    • httpとhttps
    • Let’s EncryptによるSSL証明書の取得
    • Certbotの仕組み
    • Certbotで証明書取得するためには

内容がなかなか盛りだくさんで、かなり駆け足な説明になってしまいました。

ワーク:サーバを設定してみよう

前回セットアップしたサーバに、社内管理のDNSでドメイン名を付与しておきました。
今回は、そのサーバ上にdjagoアプリをデプロイし、HTTPS通信でアクセスするのが目標です。

MariaDBのインストールと設定

aptを使用してインストールします。

$ sudo apt update
$ sudo apt install mariadb-server mariadb-client
$ sudo systemctl start mariadb
$ sudo systemctl status mariadb
$ sudo systemctl enable mariadb
$ sudo mysql
MariaDB [(none)]> show variables like "%char%";
+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | utf8mb4                    |
| character_set_connection | utf8mb4                    |
| character_set_database   | utf8mb4                    |
| character_set_filesystem | binary                     |
| character_set_results    | utf8mb4                    |
| character_set_server     | utf8mb4                    |
| character_set_system     | utf8                       |
| character_sets_dir       | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
MariaDB [(none)]> quit;
Bye

続いて、デフォルトの設定をするためにmysql_secure_installationコマンドを実行します。

$ sudo mysql_secure_installation

最後に、今回デプロイするアプリ用にスキーマとユーザを作成します。

$ sudo mysql
MariaDB [(none)]> GRANT ALL PRIVILEGES ON `sample`.* TO sample@localhost IDENTIFIED BY '<パスワード>' WITH GRANT OPTION;
MariaDB [(none)]> FLUSH PRIVILEGES;
MariaDB [(none)]> quit;

ついでに、pipでmysqlclientを入れるのに必要なパッケージもインストールしておきます。

$ sudo apt install python3-dev libmysqlclient-dev

nginxのインストール

ngnxをインストールします。
本番サーバだと色々と初期設定しますが、今回はデフォルトのまま動かします。

$ sudo apt install nginx

ファイアウォールで、事務所からのhttpアクセスを許可します。

$ sudo ufw allow from <IPアドレス>/32 to any port 80 comment "http from NorthTorch"

各自、ブラウザで、 http://<IPアドレス>/ にアクセスし、nginxのデフォルトページが表示されればOK!

pythonの仮想環境の準備

まずは複数のpythonバージョンを共存させるために、pyenvをインストールします。

$ sudo apt-get install make build-essential libssl-dev zlib1g-dev libbz2-dev libreadline-dev libsqlite3-dev wget curl llvm libncursesw5-dev xz-utils tk-dev libxml2-dev libxmlsec1-dev libffi-dev liblzma-dev
$ git clone https://github.com/pyenv/pyenv.git ~/.pyenv
$ echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bash_profile
$ echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bash_profile
$ echo 'eval "$(pyenv init -)"' >> ~/.bash_profile
$ source ~/.bash_profile
$ which pyenv

続いて、必要なpythonをインストールします。
今回は 3.9.6 を使用します。

$ pyenv install 3.9.6
$ pyenv global 3.9.6
$ pyenv versions

パッケージ管理には、poetryを使用します。

$ curl -sSL https://raw.githubusercontent.com/python-poetry/poetry/master/get-poetry.py | python -
$ source $HOME/.poetry/env
$ which poetry

サンプルアプリのインストール

弊社のリポジトリから、サンプルアプリをデプロイします。
基本的には、git cloneして、設定ファイルにDB接続情報等の、コミットできない情報を記載していきます。
pyproject.tomlはコミットされているので、poetry installを実行してパッケージを復元します。

djangoのアプリケーションなので、忘れずにmigrate``collectstaticします。

uWSGIのサービス化と起動

ngnxからは、Unixソケット経由でuWSGIにバケツリレーをします。
コミット済みのuWSGIの設定ファイルを編集し、systemdのサービス登録して起動します。

nginxにサイトをIPアドレスで登録

コミット済みのnginxの設定ファイルのserver nameをIPアドレスに変更して、/etc/nginx/conf.d/配下にコピーします。
nginxを再起動後、ブラウザで、http://<サーバのIPアドレス>/ にアクセスしてdjangoの画面出ればOKです

nginxにサイトをドメイン名で登録

https://www.cman.jp/network/support/nslookup.html にアクセスして、自分のサーバのドメイン名からIPアドレスが引けることを確認します。
nginxの設定ファイルで、先ほどIPアドレスを記載していた部分をドメイン名に変更し、nginxを再起動します。

各自のブラウザで、http://<サーバのFQDN名>/ にアクセスしてdjangoの画面出ればOKです!

https対応

Certbotと、nginx用のプラグインをインストールします。

$ sudo apt install certbot python3-certbot-nginx

認証局からHTTPアクセスできるように、ファイアウォールの設定変更

$ sudo ufw allow http

SSL証明書を取得します

$ sudo certbot --nginx -d <サーバのFQDN名>

プラグインがnginxの設定を書き換えてくれます。
認証が終わったので、HTTPアクセスを再度遮断します。

$ sudo ufw status numbered
$ sudo ufw delete <HTTP許可している番号>

今度は、事務所からのHTTPSアクセスを許可します。

$ sudo ufw allow from <IPアドレス>/32 to any port 443 comment "HTTPS from NorthTorch"

ブラウザで https://<サーバのFQDN名>/ にアクセスしてdjangoの画面出ればOKです!

これで、デプロイしたdjangoアプリに対して、ドメイン名でアクセスできる環境が作成できました!

参加メンバの感想

  • 実際にサーバをセットアップした際には非常に大変で一日かかったが、環境や手順が整備されていると午前中で終わるんだなと思った。
  • DNSまわりがもやっとしていたので、理解できてよかった。
    意外と証明書の取得が簡単でびっくりした。
  • これまで何度かセットアップの経験はあるが、一部を分担してやっていたので、全部通して経験できたのはよかった。
    ある程度決まった手順の作業なら、毎回全部やるのは無駄だと思うので、自動化すべき。
  • SSL証明書について、過去にGUIでやっていた作業と実際に裏で動いていた内容が紐づいたので、よかった。

分量がかなり多かったのですが、皆さん最後まで完走してくれました!
クラウドサービスを使うと気軽に人数分のサーバを立てることができて、便利ですね。
メンバの感想にもありましたが、かなりな部分定型作業なので、実際には自動化を計るべきかと思います。

【ランチ】

もはや定番になりつつある、麦めしと牛タンの店 牛助さんのお弁当です。
おいしいので、何度もお願いしてしまいますね・・・

お弁当

【終わりに】

アプリケーション開発の立場では、普段はあまり意識しない部分ですが、裏側でどういう経路でデータのバケツリレーが行われているか知っておくことは、無駄ではないと思います。

また、設定系はほとんど定型の作業なのに、慣れていないとどこがおかしいのか追いかけるのも難しかったりします。
その意味で、メンバから「自動化すべき」という感想が出たのは素晴らしいなぁ、と思います。

座学で使用した資料をSlideShareに上げました!