#54 CloudGarage で Knowledge の環境構築

icon written by Koda at Dec 13, 2017 4:29 AM ( icon updated by Koda at Jan 23, 2018 8:01 PM <History> )
  Edit(Sign in)
  Stock
  Answer survey   Answer survey

  TOC

CloudGarageLogo.png

本記事は #CloudGarage Advent Calendar 2017 Day13 の記事です。
#CloudGarage Advent Calendar 2017 については こちら をご確認ください。


TL;DR


はじめに

Kodaです。こんにちは。
Advent Calendarから訪問いただいた人は、はじめまして。

オープンソースで情報共有のサービスのKnowledgeを作っています。
自分の組織風土改善と、自身の技術力向上(最近は管理業務が多く、コードも書かないと、、、)のために、Knowledgeを作成&公開をはじめました。
公開以来、多くの組織に利用されるようになってきています。
今後もご利用の皆さんのご期待に沿えるように、バージョンアップしていこうと思います。

このコミュニティサイトは、今までは従量課金のところの最安値プランで稼働させていたのですが、
アクセスが増えてきてプランの上限を超えてしまいサービスが停止するようになったので、何か無いかな?と
探していたところ、友人から CloudGarage の DAP を教えてもらいました。

それで、CloudGarageさんにDAPの利用を申請したところ、ご快諾いただき環境を移しました。
CloudGarageさん、DAPの提供ありがとうございます :bow:

本記事では、移行した際の環境構築の説明をしたいと思います。
これからKnowledgeを試してみたいとお考えの人に参考になれば幸いです :smile:

システム構成

  • このコミュニティサイトのシステム構成は以下のようになっています

clip-20171203143956.png

概要

  • DAPで提供される3インスタンスのうちの2インスタンスを使って構成しています
    • Nginxでロードバランスできるように準備だけはしているので、もしパフォーマンスが落ちてきたら、もう一つのインスタンスでもKnowledgeを稼働させようかと検討中
      • ただ、CloudGarageさんの環境は、想像以上に早いのでしばらくは2インスタンス構成で充分かなと思ってます
  • 各インスタンスにDocker & Docker-Composeをインストールし、コンテナでNginx、Tomcat、PosgreSQLを稼働しています
  • CDNはCloudFlareを使っています
    • CDNは私がホストしている各環境の前に置き、独自ドメイン化/SSL化などを行っています
  • SSL証明書はLet's Encryptを利用しています
  • もっとこうしたほうが良い といったご意見はコメント登録をお願いします

インスタンスの準備

まずは、インスタンスを作成します。Web用とDatabase用の2つのインスタンスを作成します。

  • OSイメージは、選択可能ですが、基本的に Dockerさえ動けば何でも良いです
    • 私は慣れている Ubuntsにしました
  • 開放するポートは必要最低限にします
    • Web: 22 と 80, 443
    • Database: 22 と 5432
  • SSH Keyアクセスを設定します
    • SSH Key を設定しても、rootのパスワードは必須で指定するようなので、非常に長いものを設定します
  • 「インスタンス生成」を押すと数分で利用できるようになりました ( 早い :open_mouth: )

clip-20171203133424.png

clip-20171203133701.png

Docker & Docker-Composeのインストール

  • 各インスタンス上にDockerをインストールし、各サービスはコンテナ上で稼働させます
    • こうしておくと、今回のように環境をクラウドを移行するときなど、非常に便利です(Dockerが動く環境であれば直ぐ移行可能)
  • 作成したインスタンスのサーバーに接続
$ ssh -i ~/.ssh/cloudgarage.pem -p 22 root@xxx.xxx.xxx.xxx
$ sudo apt-get update
$ sudo apt-get install \
    apt-transport-https \
    ca-certificates \
    curl \
    software-properties-common
$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
$ sudo apt-key fingerprint 0EBFCD88
$ sudo add-apt-repository \
   "deb [arch=amd64] https://download.docker.com/linux/ubuntu \
   $(lsb_release -cs) \
   stable"
$ sudo apt-get update
$ sudo apt-get install docker-ce
  • Dockerのインストールの確認
$ sudo docker run hello-world
  • Docker-compose のインストール
    • Databaseでは、一つのコンテナしか稼働させていないので、Docker-compose はインストールしませんでした
$ curl -o /usr/local/bin/docker-compose -L "https://github.com/docker/compose/releases/download/1.15.0/docker-compose-$(uname -s)-$(uname -m)"
$ chmod +x /usr/local/bin/docker-compose
  • Docker-compose のインストールの確認
$ docker-compose -v

WebServerの構築

  • CloudFlareは適切を設定します
    • 本題の主旨に外れるので省略します
  • Let's Encrypt を使いSSL証明書を発行します
    • 独自ドメイン化などをしない場合、オレオレ証明書でも良いかと思います
  • まず、ご自身の持っているドメインに、FQDN名を登録してください
  • その後、以下のコマンドでSSL証明書を取得しました
    • コマンド実行ディレクトリの下の letsencrypt/cert ディレクトリに証明書が格納されます
      • こちらの記事 を参考に実施しましたので、詳細は、こちらの記事を参照願います
$ docker run -it --rm -p 443:443 --name letsencrypt \
    -v "$PWD/letsencrypt/cert:/etc/letsencrypt" \
    -v "$PWD/letsencrypt/lib:/var/lib/letsencrypt" \
    quay.io/letsencrypt/letsencrypt:latest certonly
  • Knowledgeのアプリケーションを取得します(knowledge.war)

  • 次に、NginxとTomcatのコンテナを起動するため、docker-compose.yml を作成します

    • 先程ダウンロードしたknowledge.warを tomcat/webapps ディレクトリの下に格納します
    • nginx.conf を作成します
      • 80(Http)アクセスは443(Https)にリダイレクトします
      • 先程取得したSSL証明書を利用するように設定します
      • リバースプロキシで、tomcatのknowledgeを設定します
  • docker-compose.yml

version: '2.1'

services:
  tomcat:
    image: tomcat:8.5-jre8-alpine
    ports:
      - 8080:8080
    expose:
      - 8080
    environment:
      https_proxy: ${https_proxy}
      http_proxy: ${http_proxy}
    volumes:
      - $PWD/.knowledge:/root/.knowledge
      - $PWD/tomcat/webapps:/usr/local/tomcat/webapps

  nginx:
    image: nginx
    container_name: nginx
    ports:
      - "80:80"
      - "443:443"
    links:
      - tomcat:tomcat
    volumes:
      - $PWD/letsencrypt/cert:/etc/nginx/certs:ro
      - $PWD/nginx.conf:/etc/nginx/nginx.conf:ro
      - $PWD/www:/etc/nginx/www:ro
  • nginx.conf
worker_processes  1;
events {
    worker_connections  256;
}
http {
    server {
        listen 80;
        server_name service-knowledge.support-project.org;
        listen [::]:80;
        return 301 https://$host$request_uri; 
    }
    server {
        listen 443 ssl;
        listen [::]:443 ssl;
        ssl_certificate /etc/nginx/certs/live/service-knowledge.support-project.org/fullchain.pem;
        ssl_certificate_key /etc/nginx/certs/live/service-knowledge.support-project.org/privkey.pem;

        server_name service-knowledge.support-project.org;

        client_max_body_size 200M;
        proxy_buffer_size   128k;
        proxy_buffers   4 256k;
        proxy_busy_buffers_size   256k;
        fastcgi_buffers 8 16k;
        fastcgi_buffer_size 32k;

        location / {
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection "upgrade";
            
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-Proto $scheme;
            proxy_set_header X-Forwarded-Host $host;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header X-Forwarded-Server $host;

            proxy_pass    http://tomcat:8080;
        }
    }
}
  • 起動します
$ docker-compose up --build -d nginx
  • ブラウザでアクセスし、動いていることを確認してください
    • Knowledgeでは簡単に動作確認を行えるようにするため、組み込みのDatabaseを起動して、それで動作できるようにしています

clip-20171203143607.png

DatabaseServerの構築

  • 動作確認の際には、組み込みDatabaseで良いのですが、長期の安定稼働にはPostgreSQLへの変更を 強くおすすめしています
  • PostgreSQLの公式イメージを起動するだけです
docker run --name postgres \
    -v $PWD/pgdata:/var/lib/postgresql/data \
    -e POSTGRES_PASSWORD={とっても長いパスワード} -d -p 5432:5432 postgres:9.6.5

作成したKnowledgeのデータベースをPostgreSQLに切り替える

  • Knowledgeに初期管理者ユーザ(admin:admin123)でアクセスします
  • 「システム設定」→「データベースの接続先変更」のページで切り替えを実行してください
  • 運用用の管理者ユーザを登録し、必ず初期管理者ユーザを削除してください

clip-20171203150242.png


おわりに

いかがでしたでしょうか?手順通りに簡単に環境が構築できるのではないかな?と思います。
もしKnowledgeに興味ありましたら、上記手順を参考にお試しください。
また、ここにデモサイト も用意していますので、環境構築をするのが面倒だけで、試してみたいという方は、デモサイトで試用できます。
デモユーザ: [id/password] user1 / user1

最後に 今回の記事で紹介しました、CloudGarageさんは変な癖も無く、また値段に対してのパフォーマンスが良いと思いますので、ぜひ使ってほしいです :+1:

明日は、 ryosms さんです。よろしくお願いします。


 Add Comment