CodiMDをネイティブインストールしてみた

CodiMDとは

Markdownで編集できるオンラインコラボレーションノートです。

  • 複数人で同時編集可能
  • リアルタイムプレビュー
  • ブラウザで開いてすぐに編集可能

https://github.com/hackmdio/codimd 

利用目的

社内で議事録の作成と確認が早くできるようにしたい。 クローズドネットワークに構築。

前提条件

トラブル発生時のために、仕組みを理解しておきたいので、ネイティブインストールをしてみる。 個人的な学習も目的にあるので、動作の仕組みを把握することを優先しセキュリティは後回し。 正直、導入するだけならDocker版が楽だと思う。

導入環境

  • Windows 10 ProのHyper-V上に仮想マシンを導入して検証
  • 仮想マシンの構成(検証用なのでリソース少なめ)
    • 仮想CPU:2コア
    • メモリ :4GB
    • ディスク:20GB
    • ネットワークインターネットへは接続可能(構築時のみ)
  • ソフトウェア構成
    • OS:CentOS 8.0
    • Database:PostgreSQL

導入手順

OSインストール

CentOS8のISOメディア(CentOS-8.1.1911-x86_64-dvd1.iso)からインストール ソフトウェアの選択は「最小限のインストール」を選択。

前提パッケージのインストール

# dnf -y install nodejs # dnf -y install git python2 make gcc-c++ bzip2 tar <IPAフォントインストール用> # dnf -y install wget unzip fontconfig

(任意)導入されたNode.js、npmのバージョンチェック

# node --version v10.16.3 # npm -v 6.9.0

npmモジュール導入

# npm install -g node-gyp

yarnの導入

# curl --silent --location https://dl.yarnpkg.com/rpm/yarn.repo | sudo tee /etc/yum.repos.d/yarn.repo # dnf -y install yarn # yarn --version 1.21.1 # yarn install

PostgreSQLのセットアップ

PostgreSQLのインストール

# dnf -y install postgresql-server

PostgreSQLの初期セットアップ

# postgresql-setup initdb

postgresql.confを編集(データベースパラメータを設定)

cd /var/lib/pgsql/data ls -l postgresql* cp postgresql.conf postgresql.conf.org ls -l postgresql* echo "listen_addresses = '*'" >> /var/lib/pgsql/data/postgresql.conf diff -u postgresql.conf.org postgresql.conf

pg_hba.confをバックアップ

cd /var/lib/pgsql/data ls -l pg_hba* cp pg_hba.conf pg_hba.conf.org ls -l pg_hba*

pg_hba.confに追記(クライアント認証を設定)

# PostgreSQL Client Authentication Configuration File" # ===================================================" local all all trust host all all 127.0.0.1/32 trust host all all ::1/128 trust

postgresqlサービス再起動&自動起動設定

# service postgresql restart # systemctl enable postgresql

PostgreSQLにCodiMD用のユーザとDBを作成する

PostgreSQLへスーパーユーザで接続

# psql -U postgres

CodiMD用のユーザーを作成する。(パスワードは変更すること)

postgres=# CREATE ROLE role_codimd WITH LOGIN PASSWORD 'Password'; CREATE ROLE postgres=# \du ロール一覧 ロール名 | 属性 | メンバー -------------+----------------------------------------------------------------------+---------- postgres | スーパーユーザ, ロールを作成できる, DBを作成できる, レプリケーション | {} role_codimd | | {}

CodiMD用のデータベースを作成する。前提条件として、キャラクターセットがutf8と指定があるので注意。

postgres=# create database codimd owner role_codimd encoding 'UTF8'; CREATE DATABASE postgres=# \l データベース一覧 名前 | 所有者 | エンコーディング | 照合順序 | Ctype(変換演算子) | アクセス権 -----------+-------------+------------------+-------------+-------------------+----------------------- codimd | role_codimd | UTF8 | ja_JP.UTF-8 | ja_JP.UTF-8 | postgres | postgres | UTF8 | ja_JP.UTF-8 | ja_JP.UTF-8 | template0 | postgres | UTF8 | ja_JP.UTF-8 | ja_JP.UTF-8 | =c/postgres + | | | | | postgres=CTc/postgres template1 | postgres | UTF8 | ja_JP.UTF-8 | ja_JP.UTF-8 | =c/postgres + | | | | | postgres=CTc/postgres (4 行)

Postgreコンソールを終了する

postgres=# \q

CodiMD導入

CodiMDのソースをクローンする

# cd /opt # git clone https://github.com/hackmdio/codimd.git

必要なnpmパッケージをインストールする

# cd codimd # npm install package.json

セットアップスクリプトを実行する

# cd codimd # bin/setup (中略) Edit the following config file to setup CodiMD server and client. Read more info at https://github.com/hackmdio/codimd#configuration-files * config.json -- CodiMD config * .sequelizerc -- db config

CodiMDの設定ファイルを編集する(config.json) developmentモードで検証するので、developmentセクションを編集。

# cp config.json.example config.json # vi config.json ("db"セクションを編集する。config.json.exampleは書式が間違っているので注意) { "test": { "db": { "dialect": "sqlite", "storage": ":memory:" }, "linkifyHeaderStyle": "gfm" }, "development": { "domain":"mydomain", "protocolUseSSL": false, "useSSL": false, "hsts": { "enable": false }, "sessionSecret": "session cookie", "loglevel": "debug", "host": "hostname", "port": 3000, "urlAddPort": true, "dbURL": "postgres://role_codimd:Password@localhost:5432/codimd", "allowFreeURL": true, "linkifyHeaderStyle": "gfm", "useCDN": false, "imageUploadType": "filesystem" }, "production": { "domain":"mydomain", "loglevel": "info", "protocolUseSSL": false, "useSSL": false, "hsts": { "enable": false }, "sessionSecret": "session cookie", "host": "hostname", "port": 3000, "urlAddPort": true, "dbURL": "postgres://role_codimd:Password@localhost:5432/codimd", "allowFreeURL": true, "useCDN": false, "linkifyHeaderStyle": "gfm", "imageUploadType": "filesystem" } }

DB設定ファイルを編集する(.sequelizerc)

# vi .sequelizerc ('url': の行をDBに合わせて編集する) # cat .sequelizerc const path = require('path') const config = require('./lib/config') module.exports = { config: path.resolve('config.json'), 'migrations-path': path.resolve('lib', 'migrations'), 'models-path': path.resolve('lib', 'models'), url: process.env['postgres://role_codimd:Password@localhost:5432/codimd'] || config.dbURL }

DBのマイグレーションを実行する。

# node_modules/.bin/sequelize db:migrate

アセットファイルのビルドをする。

# npm run build

アプリケーション用ポートの解放

本来はwebサーバを前段に置きたいが、今回は動作検証を優先して直接接続。

# firewall-cmd --zone=public --add-port=3000/tcp --permanent # firewall-cmd --reload

CodiMDを起動

サービス化はせずに、とりあえず起動して確認する。developmentモードで起動コマンドを実行。

# NODE_ENV='development' node app.js

動作確認

ブラウザで、ポート番号3000にアクセスして、画面表示が返ってくれば成功。

http://(IPアドレス):3000/

(オプション)IPAフォントのインストール

PDFを生成した時に日本語が表示されないので、IPAフォントを導入する。 このURL ( http://ipafont.ipa.go.jp/ipaexfont/download.html  ) から探す

wget https://ipafont.ipa.go.jp/IPAexfont/IPAexfont00401.zip -O IPAexfont00401.zip unzip IPAexfont00401.zip ls -l IPAexfont00401/*ttf

ttfをフォントディレクトリに移動

mkdir -p /usr/share/fonts/japanese/TrueType mv -i IPAexfont00301/*ttf /usr/share/fonts/japanese/TrueType/ ls -l /usr/share/fonts/japanese/TrueType/

サーバに反映

# fc-cache -fv

確認

# fc-list | grep IPA /usr/share/fonts/japanese/TrueType/ipaexg.ttf: IPAexゴシック,IPAexGothic:style=Regular /usr/share/fonts/japanese/TrueType/ipaexm.ttf: IPAex明朝,IPAexMincho:style=Regular

残課題

  • [解決]CND(cdnjs.cloudflare.com)から取得しているファイルがある。(ネットワークから切り離したら動かない気がする)
    • 設定ファイル(config.json)に、『"useCDN": false,』を追記するとCDN不使用。(一部外部ファイルがあるけど)
    • node.js起動時の環境で、CMD_USECDN='false' を指定しても、CDN不使用となった。
  • [解決]画像がデフォルトで、imgurへアップロードされるので、サーバ内に保存する設定に変更
    • 設定ファイル(config.json)に。 『"imageUploadType": "filesystem",』を追記。
  • アプリ(CodiMD)の自動起動
    • node app.js起動のデーモン化(forever start app.jsとしてもいい)
    • productionモードで動かす場合は、設定ファイルを(config.json)環境に合わせてもう少し編集する必要がある。
  • パフォーマンスチューニング
    • 性能情報の取得をしてみる。(Node.jsのパフォーマンスチューニングを個人的にやってみたい)
  • webサーバの設置
    • 前段にNginxを配置する。

躓いたところ

  • セットアップスクリプト(setup/bin)の前提条件が分からず、途中でERRORとなった。
    • bzip2とnode-gypの事前導入(CentOSのデスクトップ版だと、導入済パッケージが多く進んだが、Minimalだと不足があった。)
    • yarnも事前導入が必要だった(環境によっては入っているかも)

参考にしたサイト