Ubuntu Weekly Recipe

第704回 高機能でMarkdownや作図もサポートするWiki.js

この記事を読むのに必要な時間:およそ 6 分

Wiki.jsはNode.jsベースのWikiシステムです。モダンな作りとスタイリッシュなデザインで,⁠とりあえずWikiだけあれば良い」という用途には最善な選択肢のひとつでしょう。今回はそんなWiki.jsをUbuntuにデプロイしてみます。

あなたのWikiはどこから?

一般的に「Wiki(ウィキ⁠⁠」と言えばWikipediaを暗黙的に意味することが多い昨今の状況ですが,本連載の読者ならおそらく誰でもご存知のように,現在ではウィキソフトウェアで動いている,ウェブブラウザーで複数のユーザーが共同で編集可能なコンテンツ管理システムの総称です。

生のHTMLを書くのに疲れた人にとって,Wikiの「人に優しいマークアップ言語※1⁠」は魅力的に映り,現在では非常に多くの環境で様々なWikiが活用されています。その最も成功した例が,Wikipediaを支えているMediaWikiでしょう。

※1
個人の感想です。

他にもPerlで作られたYukiWikiPHPで作られたPukiWikiRubyで作られたHikiPythonで作られたMoinMoinデータベース不要なDokuWikiなど多種多様なウィキソフトウェアが登場しました。これらの中にははじめて触ったWikiや,実際に運用してみたWikiなどいろいろあるのではないでしょうか※2⁠。

※2
「最初のWiki」であるWikiWikWebはPerl製のようです。

最近ではGitHub・GitLab・Redmineなどのプロジェクト管理・チケット管理システムは当然のようにWiki機能を備えるようになり,それらを使うことのほうが多くなったかもしれません。これはWiki自身がブログなどより,多人数で執筆するナレッジベースとしての使い方に向いているのが理由でしょう。

結果的にウィキソフトウェアを単体でインストールすることは,一時期に比べて減ってきました。それでも「プロジェクト管理システムほどではないものの,軽く共有できる仕組みはほしい」という要望自体はなくなったわけではありません。そんなときの選択肢として,ここ数年で主力に躍り出てきたのが今回紹介するWiki.jsです。

Wiki.jsの主な機能は次のとおりです。

  • Markdownエディター・WYSIWYGエディター・HTMLエディターのサポート
  • gitリポジトリやクラウド上にデータを保存可能
  • 多種多様な認証システムのサポート
  • 柔軟なアクセス管理機能
  • 図の作成・埋め込み
  • 画像などのメディアコンテンツのアップロードにも対応
  • モバイルデバイスでも使いやすいUI

今風のWikiなら必要な機能は一通り備わっていると思って問題ありません。またアカウント認証・アクセス管理の機能が充実しているのも特色のひとつです。

ちなみにWiki.jsは実質,ほぼ一人で開発・維持している状態です。業務で利用したり継続的な開発を期待するなら,金銭的にサポートすることもぜひ検討してみてください。

Wiki.jsのデプロイ

それではWiki.jsをデプロイしていきましょう。Wiki.jsにはレガシーな1.0系,安定版の2.0系,現在開発中の3.0系が存在します。このうち3.0系は大幅な改良が予定されているものの,現時点ではまだコードが公開されていません※3⁠。よって,当面は2.0系を使うことになります。

※3
Wiki.jsのサイトや設定画面で「coming soon」と書かれているものは,おおよそ3.0かそれ以降で投入を予定している機能だと思ってください。

公式ドキュメントのRequirementsには,システム要件として次のような記載があります。

  • 2コア以上のCPUを推奨
  • 少なくとも1GBのRAM(Wiki.js自身は通常は70MBぐらいしか使わないが,たまにより多く使うことも)
  • ストレージ容量はコンテンツ次第,Wiki.js自身は数MB程度使用
  • アップデートや各種アドオンのインストールのためのインターネットへのアクセス(ただしインターネットから隔離されていても利用は可能)
  • アクセス可能なドメインかIPアドレス(サブフォルダーを使うのは不可,ただしリバースプロキシーを経由すれば可)

あとはSQLデータベース(一般的なSQLデータベースならどれでも良いが推奨はPostgreSQL 9.5以降⁠⁠,Node.js 10以降が必要になります。ウェブサーバーは必須ではありません。またDockerによるデプロイ等もサポートしています。

最後の要件はhttps://foo.examle.com/wikijs/みたいな使い方は,Wiki.js単体ではサポートしないということです。もちろん,Nginxなどリバースプロキシーを前段に用意すれば実現可能です。

公式ドキュメントのUbuntuのインストール方法ではDockerを使ったインストールを紹介しているものの,Dockerによるインストール方法のほうにdocker-compose.yamlの例が掲載されているのでそれを使うほうがかんたんです。

DockerそのものはDocker公式のリポジトリのそれでも,Ubuntuのリポジトリにあるdocker.ioパッケージでもかまいません。

他にもサービスごとにサーバーを分離したいのであれば,システムコンテナーであるLXDを使って,Ubuntuインスタンスを作るという手もあります。LXDの使い方は第521回の入門システムコンテナマネージャーLXD 3.0にまとめていますが,2ページ目のsudo lxd initさえ実施してしまえば,あとは次の方法でWiki.js用のシステムコンテナーを構築できます。

$ lxc launch ubuntu:20.04 wikijs
$ lxc exec wikijs -- sh -c 'apt update && apt full-upgrade -y && apt autoremove -y'
$ lxc config set wikijs security.privileged true
$ lxc config set wikijs security.nesting true
$ lxc restart wikijs
$ lxc shell wikijs
# sudo -i -u ubuntu

システムコンテナーの中でさらにdocker-composeを使うために,特権コンテナーかつcgroupのnestingを有効化しています※4⁠。

※4
LXDのセキュリティ的な隔離機能は使えなくなってしまいますが,サービス単位でグループ化できるのと,ホストOSとは独立したファイルシステムになるため,別サーバーへのマイグレーションが楽になるというメリットがあります。

もちろん,上記手順はスキップして,直接UbuntuにDocker環境をインストールしてもかまいません。

ここからは,LXDを使ったかどうかに関係なく共通の手順となります。まずは必要なパッケージをインストールして,docker-compose.ymlファイルを置く場所を決めます。これはどこでもかまいません。

$ sudo apt install -y docker.io docker-compose
$ sudo mkdir /etc/wikijs && cd /etc/wikijs

次に例の内容をそのままにdocker-compose.ymlファイルを作成します。

$ cat <<'EOF' | sudo tee docker-compose.yml
version: "3"
services:

  db:
    image: postgres:11-alpine
    environment:
      POSTGRES_DB: wiki
      POSTGRES_PASSWORD: wikijsrocks
      POSTGRES_USER: wikijs
    logging:
      driver: "none"
    restart: unless-stopped
    volumes:
      - db-data:/var/lib/postgresql/data

  wiki:
    image: requarks/wiki:2
    depends_on:
      - db
    environment:
      DB_TYPE: postgres
      DB_HOST: db
      DB_PORT: 5432
      DB_USER: wikijs
      DB_PASS: wikijsrocks
      DB_NAME: wiki
    restart: unless-stopped
    ports:
      - "80:3000"

volumes:
  db-data:
EOF

最後にデータベースのパスワードを変更して準備完了です。

$ sudo sed -i "s,wikijsrocks,$(openssl rand -base64 32)," docker-compose.yml

本来であればこのパスワード情報はsecretsを使うのが正しいやり方だと思うのですが,wikiコンテナー側がファイルからの設定ファイルの読み出しに対応していないようなので,ここではもう直接パスワードをYAMLファイルに書いてしまっています。気になるようなら,requaraks/wiki:2イメージではなく,自分でイメージを作ってしまっても良いでしょう。

環境変数に関しては公式ドキュメントのDockerのページに記載があります。基本的にその設定のままで良いはずです。ただしもしLet’s EncryptなどでWiki.js用にサーバー証明書の取得まで行いたいのであれば,SSL_ACTIVELETSENCRYPT_DOMAIN等の設定が必要になります。今回は前段のNginxでこれらを行うこととし,Wiki.jsそのものは80番ポートでのみ待ち受けることにします。

docker-compose.ymlports80:3000となっているため,ホストの80番ポートが使われることになります。このあたりもホストの状況に合わせて変更してください。特にリバースプロキシーを使う場合は,- 127.0.0.1:3000:3000のようにローカルループバックの3000番ポートに限定したほうが良いでしょう※5⁠。これにより余計なサービスがインターネットに公開されなくなります。LXDコンテナーに閉じ込める場合,この80番ポートもLXDコンテナー内部の話となり,特に変更せずにWiki.jsだけが使えるようになるので便利です。

※5
LXD上にDockerをインストールして構築する場合,上記手順で構築したLXDインスタンス上の80番ポートはインターネットに公開されず,ホスト上のリバースプロキシーはLXDインスタンスの80番を見ることになため- 80:3000のままで問題ありません。

docker-compose.ymlの準備ができたら,インスタンスを立ち上げます。

$ sudo docker-compose pull
$ sudo docker-compose up -d
$ sudo docker-compose ps
    Name                   Command               State                       Ports
-------------------------------------------------------------------------------------------------------
wikijs_db_1     docker-entrypoint.sh postgres    Up      5432/tcp
wikijs_wiki_1   docker-entrypoint.sh node  ...   Up      0.0.0.0:80->3000/tcp,:::80->3000/tcp, 3443/tcp

オリジナルのdocker-compose.ymlのままだと,すべてのネットワークインターフェースの80番ポートをlistenします。つまり,すでに80番ポートを誰かが使っていたら起動に失敗しますし,起動に成功した場合はホストマシンの外からアクセスできるようになる旨,注意してください。ちなみに3443はHTTPS経由の接続です。今回は使わないため,Dockerのネットワーク内部にのみ公開されています。

この状態になったらhttp://サーバーのアドレス/でWiki.jsにアクセスできます。ただし,本来はサーバー証明書とTLSを用いて経路を暗号化することが望まれます。そこでリバースプロキシーの設定も紹介しておきましょう※6⁠。

※6
TLS接続を構築する上で,必ずしもリバースプロキシーを使わなければいけないということはありません。ただし,そういう設定をしておいたほうが楽になるケースは多いです。今回の場合,LXDコンテナーの中にWiki.jsを閉じ込めるなら,ホスト側にあるNginxでリバースプロキシーを構築するのが一番かんたんな対応となります。

著者プロフィール

柴田充也(しばたみつや)

Ubuntu Japanese Team Member株式会社 創夢所属。数年前にLaunchpad上でStellariumの翻訳をしたことがきっかけで,Ubuntuの翻訳にも関わるようになりました。