Markdownで書けるWikiサーバ、Crowiをインストールします。
最近、複数台立ち上げる必要に迫られたので、シェルスクリプトで書いておきます。
もくじ:
はじめに
情報が蓄積されてくると、WikiなりCMSは何かと必要になりますよね。
環境に応じてPukiwikiやらGitlabのWiki機能やらを使っていましたが、いい加減統一したいと思い、機能が魅力的なCrowiに集約することにしました。
HerokuやDockerなどの運用オプションもありますが、認証つきプロキシの中だったり、Raspberry Piだったり、当方なかなか厄介な環境ばかり。やはりクローズドな環境で動くようにする必要がありまして、オンプレで構築することにしました。
最低限の構成は実行基盤のNode.js(サーバサイドJavaScript)と、バックエンドのMongo DB (ドキュメントDB)のようですね。MongoはともかくNodeのほうはバージョン更新が激しく、構築パターンも複数あるので、動いたやり方をメモしておきます。
面倒だったので、全文検索用のElasticSearchなどオプションの構成は省略しています。
検証した環境は次の通り。
- Ubuntu Server 16.04 (Xenial)
- Crowi v1.6.2
- Node.js v6.12.3 (npm 3.10.10)
- MongoDB 3.6.2
今回は下記のように、(bash)スクリプトの他に設定用のファイルをサーバにコピーしておきます。
1 2 3 4 5 | (working directory) ├─setup_crowi.sh ├─mongo ├─crowid └─crowid.conf |
スクリプト(setup_crowi.sh)
今回のスクリプトです。echo
で表示させているだけの行は省略可能です。
プロキシ付きの場合はproxy_url
のところにアカウントやアドレス等を書いておきます。
後に説明するように、プロキシ設定が不要な場合は最初のブロックをコメントアウトするなどして削除して下さい。
また、Mongo shellに渡すDB名やアカウントも実際の設定に応じて書き換えて下さい。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 | #!/bin/bash -eu ### prerequisites # set proxy ##### proxy_url="http://{PROXY_USER}:{PROXY_PASSWORD}@{PROXY_ADDRESS}:{PROXY_PORT}/" export http_proxy=$proxy_url export https_proxy=$proxy_url shopt -s expand_aliases alias sudo='sudo -E ' ################# echo install prerequisites sudo apt update -y sudo apt install -y build-essential libkrb5-dev ### Mongo DB configuration echo adding apt key sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 2930ADAE8CAF5059EE73BB4B58712A2291FA4AD5 echo "deb [ arch=amd64,arm64 ] https://repo.mongodb.org/apt/ubuntu xenial/mongodb-org/3.6 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-3.6.list echo update repository and install mongodb sudo apt update -y sudo apt install mongodb-org -y echo up and enabling mongodb service sudo cp mongod /lib/systemd/system/mongod.service sudo systemctl start mongod sudo systemctl enable mongod sudo systemctl reload mongod ### Node.js configuration echo install default node.js via apt sudo apt install -y nodejs npm echo [debug] show node.js version nodejs -v echo install v6.12.x via n package sudo npm cache clean sudo npm install n -g sudo n 6.12 echo remove distro default packages sudo apt -y purge nodejs npm sudo apt -y autoremove echo [debug] verify specified version is installed node -v npm -v ### Deploy Crowi echo configure mongodb user and dedicated database mongo --eval 'db = db.getSiblingDB("{DB_NAME}")' mongo {DB_NAME} --eval 'db.createUser({user: "{DB_USER}", pwd: "{DB_PASSWORD}", roles: [{role: "readWrite", db: "{DB_NAME}"}]})' mongo admin --eval "db.system.users.find()" echo get crowi sources and start installation git clone -b v1.6.2 https://github.com/crowi/crowi/ sudo mv crowi /usr/local/bin/ # inject daemon configuration files sudo cp crowid.conf /etc/systemd/system/crowi.conf sudo cp crowid /lib/systemd/system/crowi.service cd /usr/local/bin/crowi npm install echo echo use 'sudo systemctl [start/enable] crowi' to configure service echo |
使い方としては、実行権限をつけて実行するだけです。
1 2 3 | $ (スクリプトと同じディレクトリ) $ chmod +x setup_crowi.sh $ ./setup_crowi.sh |
またスクリプト中では明示的にインストールしていませんが、Ubuntu Server 16なのでPython (Python 3.x)やGitはデフォルトで入っているはず。
設定ファイル
Daemonを設定するために各設定ファイルを作成する必要がありますが、面倒なので今回はスクリプト中でシステムのパスへコピーします。
手動で実施する際はvim
やnano
を使って直接記述してしまって構いません。
mongod
Mongo DBをDaemon化するための設定ファイルです。
スクリプト中で/lib/systemd/system/mongod.service
へコピーします。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | [Unit] Description=MongoDB Database Service Wants=network.target After=network.target [Service] ExecStart=/usr/bin/mongod --config /etc/mongod.conf ExecReload=/bin/kill -HUP $MAINPID Restart=always User=mongodb Group=mongodb StandardOutput=syslog StandardError=syslog [Install] WantedBy=multi-user.target |
crowid
CrowiをDaemon化するための設定ファイルです。
スクリプト中で/lib/systemd/system/crowi.service
へコピーします。
ハードコーディングしていますが、インストールパスWorkingDirectory
などは環境に合わせて書き換えて下さい。
1 2 3 4 5 6 7 8 9 10 11 | [Unit] Description=Crowi - The Simple & Powerful Communication Tool Based on Wiki After=network.target mongod.service [Service] WorkingDirectory=/usr/local/bin/crowi EnvironmentFile=/etc/systemd/system/crowi.conf ExecStart=/usr/local/bin/node app.js [Install] WantedBy=multi-user.target |
crowid.conf
CrowiのDaemon設定を書いたファイルです。
スクリプト中で/etc/systemd/system/crowi.conf
へコピーします。
実際の環境に合わせてCrowiの起動パラメータや、Mongo DBの設定を書いておきます。
1 2 3 4 | PORT=3000 MONGO_URI="mongodb://{DB_USER}:{DB_PASSWORD}@{MONGODB_ADDRESS}/{DB_NAME}" PASSWORD_SEED={YOUR_PASSWORD_SEED} FILE_UPLOAD=local |
インストール手順の説明
今回は各手順をスクリプトで書いていますが、ご参考までに内容を説明しておきます。
必要に応じて組み合わせたり、手動で実行することもできると思います。
認証付きプロキシ
(認証付き)プロキシを通すために環境変数http_proxy
を設定しておきます。
また、エイリアスを使うことでsudo
に環境変数を引き継ぎます。
1 2 3 4 5 6 7 | # set proxy ##### proxy_url="http://{PROXY_USER}:{PROXY_PASSWORD}@{PROXY_ADDRESS}:{PROXY_PORT}/" export http_proxy=$proxy_url export https_proxy=$proxy_url shopt -s expand_aliases alias sudo='sudo -E ' ################# |
shopt
の行はスクリプト中でエイリアスを展開するためのものなので、手動で実施する際は不要です。
Mongo DBのインストール
公開鍵をインポートしたのち、apt
でインストールします。
また、設定ファイルをローカルからsystemdのパスへコピーし、systemctl
を使って自動起動に設定しておきます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | # キーのインポート sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 2930ADAE8CAF5059EE73BB4B58712A2291FA4AD5 echo "deb [ arch=amd64,arm64 ] https://repo.mongodb.org/apt/ubuntu xenial/mongodb-org/3.6 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-3.6.list # apt経由でインストール echo update repository and install mongodb sudo apt update -y sudo apt install mongodb-org -y # Daemon設定 echo up and enabling mongodb service sudo cp mongod /lib/systemd/system/mongod.service sudo systemctl start mongod sudo systemctl enable mongod sudo systemctl reload mongod |
Node.jsのインストール
ちょっとややこしいのですが、Node.jsの6.x系以上がCrowiの前提だったので、バージョンを指定してインストールします。
apt
にデフォルトで登録されている安定版は4.x系だったため、nバージョンマネージャを入れて2段構えでインストールしています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | # デフォルトの安定版をインストール echo install default node.js via apt sudo apt install -y nodejs npm # nを入れてバージョン6.x系をインストール echo install v6.12.x via n package sudo npm cache clean sudo npm install n -g sudo n 6.12 # 上で入れたデフォルトの安定版を削除 echo remove distro default packages sudo apt -y purge nodejs npm sudo apt -y autoremove |
バージョン指定はテキトーですが、今回検証した環境では下記のバージョンがインストールされました。
1 2 3 4 5 6 | [debug] show node.js version v4.2.6 --- nodejs ... [debug] verify specified version is installed v6.12.3 --- node 3.10.10 --- npm |
ちなみに、他の環境ではnode
コマンドがNode.jsのエイリアスなのですが、Ubuntuでは既存のコマンドと重複する関係上、apt
経由で入るものはnodejs
コマンドにリンクされます。
今回はnがよしなにやってくれていますが、他のインストール方法によってはリンクの張り直しが必要な場合があります。
Node.js公式サイトが紹介しているインストール方法(↓)は、curlでスクリプトをダウンロードしてapt
のレポジトリ設定を切り替え、任意のバージョンを指定させる、というものですが、その場合はリンクする必要があります。
1 2 3 | # https://nodejs.org/en/download/package-manager/#debian-and-ubuntu-based-linux-distributions curl -sL https://deb.nodesource.com/setup_6.x | sudo -E bash - sudo apt-get install -y nodejs |
DBの設定
Mongo shellを使ってCrowi用のDBを設定しておきます。
DB名、ユーザー名、パスワードは環境に応じて設定して下さい。
1 2 3 4 | echo configure mongodb user and dedicated database mongo --eval 'db = db.getSiblingDB("{DB_NAME}")' mongo {DB_NAME} --eval 'db.createUser({user: "{DB_USER}", pwd: "{DB_PASSWORD}", roles: [{role: "readWrite", db: "{DB_NAME}"}]})' mongo admin --eval "db.system.users.find()" |
最後のadminデータベースへのアクセスは、ユーザが作成されていることを確認しているコマンドなので必須ではありません。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | configure mongodb user and dedicated database MongoDB shell version v3.6.2 connecting to: mongodb://127.0.0.1:27017 MongoDB server version: 3.6.2 ...(DB_NAME) MongoDB shell version v3.6.2 connecting to: mongodb://127.0.0.1:27017/... MongoDB server version: 3.6.2 Successfully added user: { "user" : "...", "roles" : [ { "role" : "readWrite", "db" : "..." } ] } MongoDB shell version v3.6.2 connecting to: mongodb://127.0.0.1:27017/admin MongoDB server version: 3.6.2 { "_id" : "...", "user" : "...", "db" : "...", "credentials"... } |
Crowiのインストール
Githubからチェックアウトしてnpm(Node.jsのパッケージマネージャ、ビルドツール)でインストールします。
下記のインストールパス(/usr/local/bin/crowi
)は例ですが、変更する場合はDaemon化の設定も修正して下さい。
1 2 3 4 5 6 7 8 9 10 11 12 | # ソースをダウンロード echo get crowi sources and start installation git clone -b v1.6.2 https://github.com/crowi/crowi/ sudo mv crowi /usr/local/bin/ # 設定ファイルをコピー sudo cp crowid.conf /etc/systemd/system/crowi.conf sudo cp crowid /lib/systemd/system/crowi.service # インストール cd /usr/local/bin/crowi npm install |
Daemonの設定は上記のように事前に作成したファイルをコピーするか、対象のファイルを編集(新規作成)して定義して下さい。
起動テスト
問題なく構築できている場合はサービスとして設定できます。
1 2 3 4 5 6 7 8 9 10 11 12 13 | $ sudo systemctl enable crowi Created symlink from /etc/systemd/system/multi-user.target.wants/crowi.service to /lib/systemd/system/crowi.service. $ sudo systemctl start crowi $ sudo systemctl status crowi ● crowi.service - Crowi - The Simple & Powerful Communication Tool Based on Wiki Loaded: loaded (/lib/systemd/system/crowi.service; enabled; vendor preset: enabled) Active: active (running) since ... Main PID: ... (node) Tasks: 10 Memory: 85.1M CPU: 3.273s CGroup: /system.slice/crowi.service mq14465 /usr/local/bin/node app.js ... |
今回は使っていませんが、ファイヤウォールを設定している場合は必要なポートを許可しておいて下さい。
ブラウザでhttp://(host address):3000/
にアクセスするとインストールページが表示され、管理者アカウントの設定画面になるはずです。