Outline Wiki をホスティングする
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 の peer
を trust
に変更
...
# "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 で停止
ユーザーを作成
- http://{VPS_IP_ADDR}:{MINIO_CONSOLE_PORT} にアクセスすると管理パネルが表示されます
- デフォルトならID/PWは
minioadmin
- デフォルトならID/PWは
- ログインできたら Admin > User から
readwrite
を許可したユーザーを作成
ここで作成したユーザー名とパスワードは後で使用します。
Bucket の作成
- 作成したユーザーで管理パネルにログインし直す
- 管理パネルのAdmin > Bucket から新規作成
- 作成したものを 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 の内容は適宜修正してください
[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
[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
ご丁寧にまとめてくださり大変助かりました。ありがとうございました。
問題なく運用できていたのですが、時がたってバージョン更新はどうすればいいのかなと迷ったので、ログを残します。
といっても、基本的にはパッケージのインストール & ビルド & マイグレーションに書いていただいている通り実行するだけでした。
pg_dump
を使いました)git pull
を実行しました。(私は特にバージョンを指定しませんでした)yarn install
を実行しました。ここまではスムーズにできましたが、私は2GBメモリのVPSを利用していたので、buildでメモリが足りずにエラーが出てしまいました。
低スペックなマシンで npm ビルド時に OOM Killer が発生したらスワップファイルを設定するを参考にさせていただき、スワップ領域を作成しました。
スワップ領域を作成後、
NODE_OPTIONS
のmax-old-space-size
を3GBに設定しました。Node.jsのドキュメントによれば、余裕を持ってとのことでしたので、メモリ2GBとスワップ領域2GBで4GBのところを3GBにしました。
yarn build
を実行しました。yarn db:migrate
を実行しました。(予めバックアップをとりました)v0.66.2
から最新版v0.69.1
にアップデートできたことを確認しました。Node.jsを使い慣れている方には当たり前のことなのだと思いますが、
どなたかの参考になれば幸いです。間違いがあればご指摘ください。
ありがとうございました。