Ubuntu ServerにOutlineをセルフホストするときのメモ
自前サーバーへOutlineをセルフホストした際のメモです。
Outlineってそもそもなに?
Outlineは、チームや組織内での情報共有やナレッジ管理を効率的に行うためのオープンソースナレッジベースソフトウェア。
ナレッジベースインターフェイスとして有名なサービスに「Notion」がありますが、「Outline」は「Notion」と異なり、オープンソースで提供されており、セルフホスト(自前サーバーに展開すること)も可能。
情報を社外サーバーに展開することに規制がある環境や、サブスクサービスの導入が難しい環境においては、「Notion」に変わるナレッジベースソフトウェアとして、選択肢に入ってくるOSSです。
どうして、Outlineを導入するの?
家業において、ナレッジの蓄積・共有を目的として、「Notion」の導入を打診したけども、パート・アルバイト等が多く、比較的従業員の入れ替わりが多い業種であるため、1ユーザーあたり1650円の「Notion」の導入は費用対効果が期待できないと判断されたため、Notion導入は否決された。
そのため、代案として、自社サーバーに展開可能かつ、ランニングコストが抑えられる「Outline」を選定し環境を構築することになった。
事前準備
OutlineログインにはGoogleアカウント(変更可能)を用いるためOAuthのIDおよびSecret keyを取得する必要がある。
Google Cloud consoleにて、新規プロジェクト→APIとサービス→認証情報→認証情報→「OAuth 2.0 クライアント ID」を作成し、認証情報を作成し、ID および Secret Keyを入手メモしておいてください。
また、「OAuth 2.0 クライアント ID」の「承認済みのリダイレクト URI」に「https://<ドメイン>/auth/oidc.callback」を設定しておく必要があります。
また、ドメインが必要となるため取得しているドメインにて、「DNSレコード設定」でOutlineを導入したサーバーのグローバルIPを設定しておく必要があります。
「OAuth 同意画面」において、「承認済みドメイン」にて自社ドメインが許可されていることも確認しておいてください。
ルーターにてポート設定が必要な場合は、80,443ポートを使うため開けておいてください。
セットアップ
環境
Ubuntu 24.04.1 LTS
RAM 16GB
Outline v0.81.1
Docker
Docker Compose
Dockerファイルの作成
mkdir outline && cd outline
# 設定ファイル作成
curl -O https://raw.githubusercontent.com/outline/outline/main/docker-compose.yml
# 環境変数設定
cp .env.sample .env
docker-compose.yml 設定例
version: "3"
services:
outline:
image: docker.getoutline.com/outlinewiki/outline:latest
env_file: ./docker.env
ports:
- "3000:3000"
volumes:
- storage-data:/var/lib/outline/data
depends_on:
- postgres
- redis
environment:
PGSSLMODE: disable
redis:
image: redis
ports:
- "6379:6379"
healthcheck:
test: ["CMD", "redis-cli", "ping"]
interval: 10s
timeout: 30s
retries: 3
postgres:
image: postgres
ports:
- "5432:5432"
volumes:
- database-data:/var/lib/postgresql/data
environment:
POSTGRES_USER: 'user'
POSTGRES_PASSWORD: 'passwrod'
POSTGRES_DB: 'outline'
healthcheck:
test: ["CMD", "pg_isready", "-d", "outline", "-U", "user"]
interval: 30s
timeout: 20s
retries: 3
volumes:
storage-data:
database-data:
docker.envを作成
# 秘密鍵の作成
SECRET_KEY=$(openssl rand -hex 32)
UTILS_SECRET=$(openssl rand -hex 32)
sudo nano docker.env
docker.envの設定例
NODE_ENV=production
SECRET_KEY=「SECRET_KEY=$(openssl rand -hex 32)」で作成した秘密鍵
UTILS_SECRET=「$(openssl rand -hex 32)」で作成した秘密鍵
DATABASE_URL=postgres://user:pass@postgres:5432/outline
REDIS_URL=redis://redis:6379
URL=ドメインURL
PORT=3000
FILE_STORAGE=local
FILE_STORAGE_LOCAL_ROOT_DIR=/var/lib/outline/data
FORCE_HTTPS=true
# Google認証設定(Google Cloud Consoleで取得)
OIDC_CLIENT_ID=Google Cloud OAuthで取得したID
OIDC_CLIENT_SECRET=Google Cloud OAuthで取得した秘密鍵
OIDC_AUTH_URI=https://accounts.google.com/o/oauth2/v2/auth
OIDC_TOKEN_URI=https://oauth2.googleapis.com/token
OIDC_USERINFO_URI=https://openidconnect.googleapis.com/v1/userinfo
# WebSocket関連の設定
COLLABORATION_URL=ドメインURL
Nginxの設定
sudo tee /etc/nginx/sites-available/outline << EOF
server {
server_name your.wiki.domain; # あなたのwikiドメインに変更してください
location / {
proxy_pass http://localhost:3000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-Proto $scheme;
# WebSocket用の設定
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_http_version 1.1;
# 大きなwikiページの転送のためのタイムアウト設定
proxy_connect_timeout 300;
proxy_send_timeout 300;
proxy_read_timeout 300;
send_timeout 300;
# アップロード可能なファイルサイズの制限
client_max_body_size 500M;
}
# Collaboration用のパス
location /collaboration {
proxy_pass http://localhost:3000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_http_version 1.1;
# WebSocketのタイムアウト設定
proxy_connect_timeout 300;
proxy_send_timeout 300;
proxy_read_timeout 300;
}
# 静的ファイル配信の設定(必要な場合)
location /static/ {
alias /path/to/your/wiki/static/; # 実際のパスに変更してください
expires 30d;
add_header Cache-Control "public, no-transform";
}
# セキュリティヘッダー
add_header X-Frame-Options "SAMEORIGIN";
add_header X-Content-Type-Options "nosniff";
add_header X-XSS-Protection "1; mode=block";
# SSL 設定
listen 443 ssl;
ssl_certificate /etc/letsencrypt/live/ your.wiki.domain/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/ your.wiki.domain/privkey.pem;
include /etc/letsencrypt/options-ssl-nginx.conf;
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;
}
# HTTPからHTTPSへのリダイレクト
server {
if ($host = your.wiki.domain) {
return 301 https://$host$request_uri;
}
listen 80;
server_name your.wiki.domain;
return 404;
}
SSL証明書の取得
sudo apt install -y certbot python3-certbot-nginx
sudo certbot --nginx -d your.wiki.domain
ポート開放
sudo ufw status
sudo ufw allow 80,443/tcp
サービスの起動
# Nginxの再起動
sudo systemctl restart nginx
# Outlineの起動
sudo docker-compose up
上記作業が完了すると、該当URLにて、Outlineが表示されると思います
[おまけ]auth0を用いて特定のユーザーのみログイン可能にする
現在の、Google Cloud Consoleの「外部」状態ではGmailアカウントであれば誰でもログインできてしまうため(Workspaceユーザーの場合は内部にて社内のみログイン制限可能)、auth0認証プラットフォームの無料枠を使って特定ユーザーのみログインできるように修正する
Auth0に登録後、「CreateApplication」を選択、「Regular Web Applications」を選択してCreate
「What technology are you using for your project?」にて「Next.js」を選択
「Settings」にて、
「Application Login URL」に自分のドメインを入力
「Allowed Callback URLs」に「https://<yourDomain>/auth/oidc.callback」を設定
AllowedLogout URLは適当
上記内容で保存したら。
「Settings」→「Advanced Settings」→「Endpoints」を開き、「 docker.env」を以下のように設定する
「OAuth Authorization URL」→「OIDC_AUTH_URI」
「OAuth Authorization URL」→「OIDC_TOKEN_URI」
「OAuth User Info URL」→「OIDC_USERINFO_URI」
また、「Settings」上部のCilentID、ClientSecretも「OIDC_CLIENT_ID」「OIDC_CLIENT_SECRET」に設定のこと
「User Management」→「Users」よりログインするアカウントを追加する
上記設定が完了したらDocker環境を消去してから再起動する
sudo docker-compose down -v
sudo docker-compose up --build
その他メモ
Environment 設定一覧
詳細は.env.sampleを参考のこと
基本設定
ENVIRONMENT
実行環境設定 (development/production/staging/test)
デフォルト: "production"
SECRET_KEY
データ暗号化用のキー (32-64バイト)
生成方法: `openssl rand -hex 32`
UTILS_SECRET
cronユーティリティエンドポイント用のシークレット
必須項目
PORT
サーバーのリッスンポート
デフォルト: 3000
DEFAULT_LANGUAGE
デフォルト言語
デフォルト: "en_US"
データベース設定
DATABASE_URL
メインデータベースの接続URL
必須項目、postgres/postgresqlプロトコルのみ
DATABASE_SCHEMA
オプショナルなデータベーススキーマ
オプション項目
DATABASE_CONNECTION_POOL_URL
データベース接続プールのURL
オプション項目
REDIS_URL
Redis接続URL
必須項目
URL/ドメイン設定
URL
サーバーの外部向けFQDN
必須項目、http/httpsプロトコル
CDN_URL
CDNのURL (Cloudfront/Cloudflare等)
オプション項目
COLLABORATION_URL
コラボレーションサービスのURL
デフォルト: メインURLを使用
メール(SMTP)設定
SMTP_HOST
SMTPサーバーのホスト名
メール機能を有効にするために必要
SMTP_PORT
SMTPサーバーのポート
オプション項目
SMTP_USERNAME
SMTP認証用ユーザー名
オプション項目
SMTP_PASSWORD
SMTP認証用パスワード
オプション項目
ストレージ設定
FILE_STORAGE
ファイルストレージシステムの種類
選択肢: "local" または "s3"
デフォルト: "s3"
FILE_STORAGE_LOCAL_ROOT_DIR
ローカルストレージのルートディレクトリ
デフォルト: "/var/lib/outline/data"
FILE_STORAGE_UPLOAD_MAX_SIZE
ファイルアップロードの最大サイズ
デフォルト: 1000000 バイト
AWS S3設定
AWS_ACCESS_KEY_ID
AWS アクセスキーID
S3使用時に必要
AWS_SECRET_ACCESS_KEY
AWS シークレットアクセスキー
アクセスキーIDと共に必要
AWS_REGION
AWS リージョン
オプション項目
監視/分析設定
SENTRY_DSN
Sentry接続用DSN
オプション項目
GOOGLE_ANALYTICS_ID
Google Analytics トラッキングID
オプション項目
DD_API_KEY
DataDog APIキー
オプション項目
レート制限設定
RATE_LIMITER_ENABLED
レート制限機能の有効/無効
デフォルト: false
RATE_LIMITER_REQUESTS
IP毎の最大リクエスト数
デフォルト: 1000
RATE_LIMITER_DURATION_WINDOW
レート制限の時間ウィンドウ(秒)
デフォルト: 60