これまでの経緯
- ローカルに Ubuntu Server を用意した
- そこに Docker Compose をインストールした
- Django+MySQL+nginx の開発環境を Docker Compose で構築した
- Django を AWS Fargate で動作させようとした → 失敗した
- AbstractBaseUser を継承したカスタムユーザーで E-mail ログインができるようにした
- Git で晒すとヤバい変数を django-environ と環境変数の設定で隠蔽した
- REST 化した Django の JWT 認証を dj_rest_auth に丸投げした
私にはフロントエンドがわからぬ
Microsoft が IE で Javascript をサポートし始めた時期は、20 年以上前です。そこから Web アプリ全盛の時代を迎えて、Javascript が世界で最もよく使われる言語として君臨することになろうとは、いったい誰が予想できたでしょうか。
モダンなフロントエンドなんて、私は全然わかりません。とはいえ、Web アプリを作ろうとすれば避けて通れないので、「学習コストが低い」と噂の Vue.js を使って個人開発を進めていきたいと思います。
まずは Docker で環境構築する
とにかくまったく分からんのですが、触れる環境を持たないことには話が始まらないので、適当に環境を作っていきます。
全体のディレクトリ構造
docker-compose.dev.yml のあるプロジェクト全体のディレクトリ構造は、次のとおりです。
.
├── docker-compose.dev.yml
├── Makefile
├── mysql
│   ├── Dockerfile
│   └── init.d
├── nginx
│   ├── conf
│   └── uwsgi_params
├── python
│   ├── Dockerfile
│   └── requirements.txt
├── src    ## Django のベースディレクトリ
├── static
│   ├── admin
│   ├── css
│   ├── img
│   ├── rest_framework
│   └── vendor
├── template
└── vue    ## ここを新しく作る
    └── Dockerfile
src は、Django のベースディレクトリです。このディレクトリは、今のところこうなっています。
./src
├── frontend         ## Vue のベースディレクトリ
│   └──・・・           ## ここに Vue 用のファイルを置きたい
├── Makefile
├── manage.py
├── octave           ## バックエンド(Django)の設定ファイルがあるディレクトリ
│   ├── asgi.py
│   ├── __init__.py
│   ├── __pycache__
│   ├── settings.py
│   ├── urls.py
│   └── wsgi.py
└── users            ## カスタムユーザーを定義したアプリ
    ├── admin.py
    ├── apps.py
    ├── __init__.py
    ├── migrations
    ├── models.py
    ├── __pycache__
    ├── tests.py
    └── views.py
frontend は、Vue のベースディレクトリです。docker-compose で vue create すると、ここに Vue のプロジェクトが展開されるようにしたい。
Docker の設定
以前に作った Django+MySQL+nginx の開発環境に Vue を加えます。
よく分からんまま docker-compose.dev.yml を雰囲気で書いたらこうなりました。合ってるかどうかはしらん(全文は以前の記事を見てください)
vue:
  build:
    context: ./vue
    dockerfile: Dockerfile
  restart: unless-stopped
  container_name: Vue
  networks:
    - django_net
  volumes:
    - ./src/frontend:/code  ## これで frontend 以下にファイルが展開される
    - ./static:/static
    - ./template:/template
  expose:
    - "3000"
  depends_on:
    - python
で、Vue 用の Dockerfile は、こんな感じにしました。ごくシンプルです。
FROM node:15.5
WORKDIR /code
RUN npm install -g @vue/cli
ADD . /code/
ここまで設定して、ビルドします。
$ docker-compose -f docker-compose.dev.yml build
Vue のビルドって結構時間かかるのね。。
Vue のプロジェクト作成
次のコマンドで、frontend 以下に Vue のプロジェクトが新しく立ち上がります。
$ docker-compose -f docker-compose.dev.yml run vue vue create .
ちなみに、このコマンドは「docker-compose 上の『vue』という名前のサービスに『vue create .』を実行させる」という意味なので、「vue vue」と重複しているのは誤記ではありません。
これを実行すると、Vue から**「で、今回のプロジェクト、お前はどうしたいの😒 」という質問をいろいろと聞かれるのですが、よく分からんので全部 Yes!Yes!**と答えておきます。
全部の質問に答えると、frontend 以下に(私にとっては)謎のファイルがいろいろとできています。
GitHub のレポジトリを分ける
さて、前回の記事で Django を REST 化したので、フロントエンドとバックエンドが完全に切り離されました。なので、フロント・バックを1つのレポジトリで管理するより、分けて管理する方が後々見通しがいいはず。
また、Docker 関連ファイルはもともと独立していますし、当面いじらないはずなので、これも切り離したい。
というわけで、レポジトリを3つに分けました。
インフラ(Docker):https://github.com/hajime-f/octave_docker
バックエンド(Django):https://github.com/hajime-f/octave_backend
フロントエンド(Vue):https://github.com/hajime-f/octave_frontend
作業しやすいように、インフラ→バックエンド→フロントエンドとシンボリックリンクを張っておきます。
.
├── octave_docker
│   └── src -> ../octave_backend
├── octave_backend
│   └── frontend -> ../octave_frontend
└── octave_frontend
Makefile でレポジトリの更新を自動化する
レポジトリを分けるのはいいとして、絶対に commit & push を忘れます。Vue のソースコードをいじって、Django のソースコードをいじって、Django だけ push するとか。忘れないはずがない。
というわけで、いつものように Makefile で自動化しました。
commit:
	@echo "Running git on octave_docker"
	git add -A .
	git commit -m $(COMMENT)
	git push origin master
	cd "$(PWD)/src" && make commit $(COMMENT)
commit:
	@echo "Running git on octave_backend"
	git add -A
	git commit -m $(COMMENT)
	git push origin master
	cd "$(PWD)/frontend" && make commit $(COMMENT)
commit:
	@echo "Running git on octave_frontend"
	git add -A
	git commit -m $(COMMENT)
	git push origin master
要するに、docker-compose.dev.yml のあるプロジェクトディレクトリで $ make commit COMMENT='**' と打てば、3つのレポジトリが同時に更新される仕組みです。
かなり雑な感じもしますが、、、まあ、とりあえずこれで運用してみよう。