📔

Outline Wiki をホスティングする

2021/09/04に公開
1

Outline is 何?

Outline というのはオープンソースで開発されているナレッジベースです。
Slack や Google Workspace などを用いてチームメンバー内での共有はもちろん、一部の記事だけを一般公開することもできる優れたツールです。
私は個人用のメモとして活用しています。
Markdownも使用でき、編集画面がそのままプレビューになっているのでとても使いやすいです。

概要

今回は以下の環境で Outline をホスティングする方法をまとめます。

  • Ubuntu 20.04 (さくら VPS)
    • CPU: 仮想2Core
    • メモリ: 1GB

また、今回のやり方では Docker は使用しませんが、Dockerを使用する場合は適宜読み替えて設定すればできるとおもいます。

インストール

Outline #Installation
Outline をホスティングするには以下のアプリケーションが必要です。

  • Yarn
  • Node.js
  • Postgresql
  • Redis
  • AWS S3 または minio (この記事ではminioを使用します)
  • Slack や Google Workspace など

ここからは VPS に SSH 接続をしてから構築していきます。
作業ユーザーがわかるようユーザー名やパスも記入してあります。
コピペする場合は面倒ですが頑張って下さい

Node.js & Yarn

# nodejs npm をインストール
ubuntu@ ~ $ sudo apt install -y nodejs npm
# n をインストール
ubuntu@ ~ $ sudo npm install -g n
# 安定版の nodejs npm をインストール
ubuntu@ ~ $ sudo n stable
# 最初に入れたものが競合しないよう削除
ubuntu@ ~ $ sudo apt purge -y nodejs npm

ubuntu@ ~ $ node -v # or $ npm -v でバージョンを確認する
# Yarn をインストール
ubuntu@ ~ $ sudo npm install -g yarn

Postgresql

ubuntu@ ~ $ sudo apt install -y postgresql

インストールすると postgres というユーザーが作成されます

# ユーザー postgres にログイン
ubuntu@ ~   $ sudo su - postgres

# postgresql へ接続
postgres@ ~ $ psql

# postgresql用新規ユーザーの作成 パスワード(hogehoge)は各自で設定して下さい
postgres=# CREATE USER outline WITH PASSWORD 'hogehoge';
postgres=# CREATE DATABASE outline;
postgres=# exit;

postgres@ ~ $ exit

Trust認証に変更する

ubuntu@ ~ $ sudo nano /etc/postgresql/13/main/pg_hab.conf

local の peertrust に変更

...
# "local" is for Unix domain socket connections only
local   all             all                                     trust
...

Postgresql の再起動

ubuntu@ ~ $ sudo systemctl restart postgresql

Redis

ubuntu@ ~ $ sudo apt install -y redis-server

minio

ubuntu@ ~ $ sudo useradd -m minio
ubuntu@ ~ $ sudo su - minio

minio@ ~  $ wget https://dl.min.io/server/minio/release/darwin-amd64/minio
minio@ ~  $ chmod +x minio

minio@ ~  $ mkdir data
# minio を起動
minio@ ~ $ ./minio server ./data

# Ctrl + C で停止

ユーザーを作成

  1. http://{VPS_IP_ADDR}:{MINIO_CONSOLE_PORT} にアクセスすると管理パネルが表示されます
    • デフォルトならID/PWは minioadmin
  2. ログインできたら Admin > User から readwrite を許可したユーザーを作成

ここで作成したユーザー名とパスワードは後で使用します。

Bucket の作成

  1. 作成したユーザーで管理パネルにログインし直す
  2. 管理パネルのAdmin > Bucket から新規作成
  3. 作成したものを Public に変更

設定が終わったら minio は一度終了させておきましょう


ここまでで一段落終了です。

Outlineのセットアップ

ubuntu@ ~  $ sudo useradd -m outline
ubuntu@ ~  $ sudo su - outline

outline@ ~ $ git cline https://github.com/outline/outline.git app
outline@ ~ $ cd app
outline@ ~ $ cp .env.example .env
outline@ ~ $ nano .env

.env の設定

環境変数名 説明
SECRET_KEY openssl rand -hex 32 で生成された値を設定
UTILS_SECRET openssl rand -hex 32 で生成された値を設定
DATABASE_URL user pass の部分を Postgresql で作成したものに変更 デフォルトのポートは :5432
PGSSLMODE コメントに合致する場合は # を外す
REDIS_URL ポートを変更した場合は該当する値に、変更してない場合は:6379
URL 外部からアクセスする際に使用するものを入力
PORT そのままでもいいが他のアプリと競合する場合は変更
AWS_ACCESS_KEY_ID 先程 minio の管理パネルで作成したユーザーのユーザー名を設定
AWS_SECRET_ACCESS_KEY 先程 minio の管理パネルで作成したユーザーのパスワードを設定
AWS_REGION minio で設定していない場合は空欄
AWS_S3_UPLOAD_BUCKET_URL 使用するURLを指定 外部からアクセス可能なもの
AWS_S3_UPLOAD_BUCKET_NAME minio で作成した Bucket 名を設定
AWS_S3_FORCE_PATH_STYLE true
SLACK_KEY https://api.slack.com/apps で作成したものを設定
SLACK_SECRET https://api.slack.com/apps で作成したものを設定

必要であれば .env 内部に NODE_ENV=production-ssl-disabled を記入する

パッケージのインストール & ビルド & マイグレーション

outline@ ~/app $ yarn install
outline@ ~/app $ yarn build
outline@ ~/app $ yarn db:migrate

Nginx の設定とCertbot

ubuntu@ ~ $ sudo apt install -y certbot python3-certbot-nginx
ubuntu@ ~ $ sudo certbot certonly --standalone -d <your app domain>
ubuntu@ ~ $ sudo certbot certonly --standalone -d <your minio domain>

Virtual Host の設定

outline

ubuntu@ ~ $ sudo nano /etc/nginx/sites-available/your.app.domain
server {
  listen 80;
  server_name your.app.domain; # !!要修正!!
  return 301 https://$host$request_uri;
}
server {
  listen 443 ssl http2;
  server_name your.app.domain; # !!要修正!!
  
  ssl_certificate /etc/letsencrypt/live/your.app.domain/fullchain.pem; # !!要修正!!
  ssl_certificate_key /etc/letsencrypt/live/your.app.domain/privkey.pem; # !!要修正!!
  ssl_protocols TLSv1.1 TLSv1.2;
  ssl_ciphers 'ECDH !aNULL !eNULL !SSLv2 !SSLv3';
  ssl_prefer_server_ciphers on;        
  proxy_set_header Host $host;
  proxy_set_header Upgrade $http_upgrade;
  proxy_set_header Connection "upgerade";
  
  location / {
    proxy_pass http://localhost:3000; # 設定したポートを指定
  }
}
ubuntu@~ $ sudo ln -s /etc/nginx/sites-available/your.app.domain /etc/nginx/sites-enable/your.app.domain

minio

ubuntu@ ~ $ sudo nano /etc/nginx/sites-available/your.minio.domain
server {
  listen 80;
  server_name your.minio.domain; # !!要修正!!
  return 301 https://$host$request_uri;
}

server {
  listen 443 ssl http2;
  server_name your.minio.domain; # !!要修正!!

  ssl_certificate /etc/letsencrypt/live/your.minio.domain/fullchain.pem; # !!要修正!!
  ssl_certificate_key /etc/letsencrypt/live/your.minio.domain/privkey.pem; # !!要修正!!
  ssl_protocols TLSv1.1 TLSv1.2;
  ssl_ciphers 'ECDH !aNULL !eNULL !SSLv2 !SSLv3';
  ssl_prefer_server_ciphers on;


  # To allow special characters in headers
  ignore_invalid_headers off;
  # Allow any size file to be uploaded.
  # Set to a value such as 1000m; to restrict file size to a specific value
  client_max_body_size 0;
  # To disable buffering
  proxy_buffering off;

  location / {
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $scheme;
    proxy_set_header Host $http_host;

    proxy_connect_timeout 300;
    # Default is HTTP/1, keepalive is only enabled in HTTP/1.1
    proxy_http_version 1.1;
    proxy_set_header Connection "";
    chunked_transfer_encoding off;

    proxy_pass http://localhost:9000; # If you are using docker-compose this would be the hostname i.e. minio
    # Health Check endpoint might go here. See https://www.nginx.com/resources/wiki/modules/healthcheck/
    # /minio/health/live;
  }
}
ubuntu@~ $ sudo ln -s /etc/nginx/sites-available/your.minio.domain /etc/nginx/sites-enable/your.minio.domain

nginxの再起動

ubuntu@ ~ $ sudo systemctl restart nginx

自動実行

このままでも、minio と outline を手動で実行すれば使用することが可能ですが、いちいち起動するのは面倒なので systemd で自動実行可能にします。

minio

ubuntu@ ~ $ sudo nano /etc/systemd/system/minio.service

↓Environment の内容は適宜修正してください

minio.service
[Unit]
Description=Minio File Storage
After=network.target

[Service]
Type=simple
User=minio
ExecStart=/home/minio/minio server ./data/
Restart=on-abort
WorkingDirectory=/home/minio
Environment=MINIO_SERVER_URL="your.minio.domain" MINIO_ROOT_USER=hogehoge MINIO_ROOT_PASSWORD=fugafuga MINIO_BROWSER_REDIRECT_URL="http://localhost"

[Install]
WantedBy=multi-user.target
ubuntu@ ~ $ sudo systemctl enable minio.service

Outline

ubuntu@ ~ $ sudo nano /etc/systemd/system/outline.service
outline.service
[Unit]
Description=Outline App
After=redis-server.service postgresql.service minio.service

[Service]
WorkingDirectory=/home/outline/app
Type=simple
ExecStart=/usr/bin/yarn start
Restart=always
RestartSec=10
StandardOutput=syslog
StandardError=syslog
SyslogIdentifier=outline-app

[Install]
WantedBy=multi-user.target
ubuntu@ ~ $ sudo systemctl enable outline.service

あとは再起動、もしくは以下のコマンド実行で起動できるはずです

ubuntu@ ~ $ sudo systemctl start minio.service
ubuntu@ ~ $ sudo systemctl start outline.service

実行状況の確認方法

ここまでですべてのサービスが systemd で実行されるようになりました。
それぞれのサービスがちゃんと起動できているかの確認をする方法を書いておきます。

ubuntu@ ~ $ sudo systemctl status minio.service

下の画像のように Active: active(running) と書かれていれば起動ができている状態です。

上のコマンドを実行した様子

おわりに

これで自由にメモを作成できますね。実はいろいろなオープンソースのナレッジベースアプリを見てきましたが、これが一番見た目も使い方もしっくりきました。
みなさんもたくさん使用してメモオタクになりましょう!


VPS初心者のため、修正するべきところや不要なものがあればコメントなどで指摘お願いします。

Discussion

yringhringyringhring

ご丁寧にまとめてくださり大変助かりました。ありがとうございました。
問題なく運用できていたのですが、時がたってバージョン更新はどうすればいいのかなと迷ったので、ログを残します。

といっても、基本的にはパッケージのインストール & ビルド & マイグレーションに書いていただいている通り実行するだけでした。

  1. DBのバックアップを取りました(pg_dumpを使いました)
  2. appディレクトリで、git pullを実行しました。(私は特にバージョンを指定しませんでした)
  3. pullが終わったら、yarn installを実行しました。

ここまではスムーズにできましたが、私は2GBメモリのVPSを利用していたので、buildでメモリが足りずにエラーが出てしまいました。

低スペックなマシンで npm ビルド時に OOM Killer が発生したらスワップファイルを設定するを参考にさせていただき、スワップ領域を作成しました。

$ fallocate -l 2G /swapfile
$ chmod 600 /swapfile
$ mkswap /swapfile
$ swapon /swapfile

スワップ領域を作成後、NODE_OPTIONSmax-old-space-sizeを3GBに設定しました。
Node.jsのドキュメントによれば、余裕を持ってとのことでしたので、メモリ2GBとスワップ領域2GBで4GBのところを3GBにしました。

export NODE_OPTIONS="--max-old-space-size=3072"
  1. 上記作業後に、yarn buildを実行しました。
  2. 無事buildできたので、yarn db:migrateを実行しました。(予めバックアップをとりました)
  3. 最後にすべてを再起動して、元の版v0.66.2から最新版v0.69.1にアップデートできたことを確認しました。

Node.jsを使い慣れている方には当たり前のことなのだと思いますが、
どなたかの参考になれば幸いです。間違いがあればご指摘ください。

ありがとうございました。