見出し画像

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」にて、

上記内容で保存したら。
「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

いいなと思ったら応援しよう!