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で定期実行する。

色々教えてくれたインフラのお兄さん、スーパースペシャルサンクス。

おわり🐶