HackMD 超便利ですよね。PCとスマホで同時に開き、編集がリアルタイムに同期するさまを見たときは感動&興奮しました。
そんな HackMD を職場のオンプレミス環境に導入したときの備忘録です。そのサーバーではすでに Apache Web Server が動いているので、リバースプロキシを使ってサブディレクトリに公開します。
条件
- CentOS 7.4
- Apache 2.4
- 公開URL:
https://example.com/hackmd/
- HackMD データ保存先: MySQL
- HackMD 認証方法: GitLab OAuth のみ
HackMD インストール
※ 公式の README 通りに進めます
- Node.js, npm をインストール:
sudo yum install -y nodejs npm
- MySQL にて HackMD 用のユーザーおよびデータベースを作成
- GitLab にてアプリケーション登録
- Redirect URI:
https://example.com/hackmd/auth/gitlab/callback
- Scopes:
api
- Redirect URI:
- ソースをダウンロード:
git clone https://github.com/hackmdio/hackmd.git
- セットアップスクリプトを実行:
bin/setup
- 設定ファイル(
config.json
)を編集 - DB設定ファイル(
.sequelizerc
)を編集- url:
mysql://USERNAME:PASSWORD@localhost:3306/DBNAME
- url:
- DBマイグレーション実行:
node_modules/.bin/sequelize db:migrate
- アセットファイルをビルド:
npm run build
- ちなみにRAM:4GB環境ではスラッシングが発生しOSごと死にました。アイドル時に最低3GBは空いてないとダメかも
-
emitError: EMFILE: too many open files
エラーが出てうまくいかない場合は、ulimit -n 4096
にしてファイルオープン上限数を一時的に上げてから実行 - どうしてもうまくいかない時は、
rm -rf public/build/ public/views/build/
でビルド済みファイルを削除すると直るかも
- 動作確認:
NODE_ENV='production' node app.js
- "HTTP Server listening at port 8001" と表示されればOK
{
"production": {
"domain": "example.com", //公開ドメイン名
"urlpath": "hackmd", //公開サブディレクトリ名
"port": 8001, //ポートを変更
"usessl": false, //リバプロ〜HackMDはHTTPで通信
"protocolusessl": true, //URLはhttps://で表記
"usecdn": false, //ネット接続できない環境なのでCDN使わず
"imageUploadType": "filesystem", // もちろんクラウドなど使えるはずもないのでローカル
"allowanonymous": false, //ゲストを不許可
"email": false, //メールでのサインアップ不許可
"db": {
"username": "DB_USERNAME",
"password": "DB_PASSWORD",
"database": "DB_DBNAME",
"host": "localhost",
"port": "3306",
"dialect": "mysql"
},
"gitlab": {
"baseURL": "https://gitlab.ipnoc.net",
"clientID": "GITLAB_APPLICATION_ID",
"clientSecret": "GITLAB_APPLICATION_SECRET"
}
}
}
usessl を false、protocolusessl を true とすることで HackMD サーバーはHTTPで待ち受けるが、URLは https://
で出力されるというリバプロ向けセッティングになります。
Apache リバースプロキシ設定
HackMD はリアルタイム更新を実現するため WebSocket を使います。なので特定URLおよび、Upgrade header もしくは Connection header があったら、WebSocket へアップグレードするようにします。
#
# HackMD configuration
#
# WebSocket upgrade
ProxyPreserveHost On
RewriteEngine On
RewriteCond %{REQUEST_URI} ^/hackmd/socket.io [NC,OR]
RewriteCond %{HTTP:UPGRADE} ^WebSocket$ [NC,OR]
RewriteCond %{HTTP:CONNECTION} ^Upgrade$ [NC]
RewriteRule .* ws://localhost:8001%{REQUEST_URI} [P,QSA,L]
# Reverse proxy
ProxyPass /hackmd http://localhost:8001
ProxyPassReverse /hackmd http://localhost:8001
設定が終わったら、sudo apachectl configtest
で設定をチェックしましょう。
Systemd で HackMD 自動起動
- サービス定義ファイルを
/etc/systemd/system
に作成 - サービス定義を反映:
sudo systemctl daemon-reload
- サービス起動:
sudo systemctl start hackmd
- サービス自動起動設定:
sudo systemctl enable hackmd
[Unit]
Description=HackMD
After=syslog.target network.target
[Service]
Type=simple
Environment=NODE_ENV='production'
ExecStart=/usr/bin/node /path/to/hackmd/app.js
WorkingDirectory=/path/to/hackmd
KillMode=process
Restart=always
User=root
Group=root
[Install]
WantedBy=multi-user.target
最後に Apache を再起動して正常に見られるかチェックします。また可能であればOSごと再起動して自動起動するかもチェックしておくとベターですね。
それでは良いリアルタイム Markdown ライフを!!
バグ情報
2017/11/1 現在、サブディレクトリに公開すると一部のWebフォントが404になってしまう不具合があります。バグレポしたのでそのうち修正してもらえると思いますが、それまでは asset ファイルを検索してURLを手動で修正するなどしてください。