Docker + Next.jsでつくったウェブサイトをWerckerで雑にデプロイ自動化してみた
安いIDCFクラウドでSSR用のNodeサーバーを立てて実験/運用してみようと思ったので、デプロイを自動化してみた。
一番お手軽に作れそうなのでNext.js + Dockerでやってみる。(Next.jsは今回は触れない)
とにかくいろいろ気にせず、「とりあえず動く」ところまで持っていく。
事前準備
VPSにDockerとdocker-composeいれておく。 今回VPSはCentOS7.2が入ってます。
やる
起動スクリプトが
package.json
"scripts": {
"dev": "next",
"build": "next build",
"start": "NODE_ENV=production node server.js"
}
よくあるこんな感じの時、
docker/node/Dockerfile
FROM node:7.10.0-alpine
RUN mkdir ${ディレクトリ名}
WORKDIR ${ディレクトリ名}
ADD . ${ディレクトリ名}
RUN yarn
RUN yarn run build
EXPOSE 8080
CMD ["yarn", "run", "start"]
docker/nginx/Dockerfile
FROM nginx:1.11
COPY nginx.conf /etc/nginx/
nodeとnginxのDockerfileを用意。別途nginx.confも用意しておく。 (ちなみにCOPYとADDの違いよくわかっていない)
docker-compose.yml
version: '2'
services:
nginx:
build:
context: ./docker/nginx
dockerfile: Dockerfile
links:
- node
ports:
- "80:80"
node:
build:
context: .
dockerfile: docker/node/Dockerfile
container_name: "node"
ports:
- '8080:8080'
とする。ここまでで、手動でgit pullしてdocker-compose up -d –buildとか打てば動くはず。 本来はビルドサーバーでビルドしたイメージを持ってきて…などするようだけど、面倒なのでVPS上でビルドしてしまう。
Wercker設定していく
Werckerに自分のリポジトリを連携し(自分はBitBucketのプライベートリポジトリ)、deployのステップを作成していく。
Werckerの管理画面からデプロイ用のWorkflowを作成し、Generate SSH KeysからSSHの鍵を発行する。(例ではWERCKERという名前で作った) この時気をつけるのは、例えばWERCKERで作ると、WERCKER_PRIVATE,WERCKER_PUBLICの名前で鍵が生成されるが、add-ssh-keyのステップでは、登録した名前のみで登録すること。(下記の例を参照するとわかると思う)
その後、VPS側の.ssh/authorized_keysにWercker側で作成した公開鍵をはりつけておく。
これでWerckerがsshでVPSにログインできるようになる。
後はgit pullしてdocker-composeコマンドを実行するようにstepを組めば、動く。
wercker.yml
box: debian
build:
steps:
- script:
name: echo
code: |
echo "build"
deploy:
steps:
- install-packages:
packages: openssh-client
- add-ssh-key:
keyname: WERCKER
- add-to-known_hosts:
hostname: ${ホスト名}
- create-file:
name: write key
filename: $HOME/.ssh/id_rsa
overwrite: true
content: $WERCKER_PRIVATE
- script:
name: change permission
code: |
chmod 600 $HOME/.ssh/id_rsa
- script:
name: pull and restart application
code: |
ssh -p ${ポート番号} -i $HOME/.ssh/id_rsa -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null ${ユーザー名}@${ホスト名} "cd ディレクトリ名 && git pull origin master && docker-compose up -d --build"
残りやっておくべきこと
このままだとディスクが逼迫するので、docker system prune -fをcronで定期実行する。
色々教えてくれたインフラのお兄さん、スーパースペシャルサンクス。
おわり🐶