succi0303 blog

This is my personal blog. All posts are my own.

Dexを利用してOutline Wikiのセルフホスト環境を構築する

Outline Wikiは、チームで共同編集できるナレッジ管理ツール、いわゆるWikiの一種である。有償のSaaSが提供されていることに加え、セルフホスト版のCommunity Editionを無償で利用することができる。見た目と操作感はNotionに近く、セルフホストできるWikiツールの中ではモダンな見た目と機能性の高さが際立っていると思う。

一方で、ファイル保存にS3を利用する(MinIOなどS3互換ストレージも可)、組み込みの認証機能がなくOpen ID Connect (OIDC)で認証を行う、という2つの点でセルフホスト環境構築のハードルが高く、私自身過去に環境構築を諦めたことがあった。

今回改めて確認したところ、2023年10月のアップデート、v0.72.0でS3の代わりにローカルファイルストレージの利用できるようになってセルフホストしやすくなったことがわかったため、環境構築に再挑戦した。

OIDCの認証については、SlackやGitHubをプロバイダーとして利用することもできるが、できれば全て手元の環境で完結させたかった。そこで、OIDCプロバイダのDexを併せてホストし、Dexのビルトインプロバイダを使って認証機能を提供することにした。

以下に設定手順をまとめる。

Outline Wiki用のフォルダを作成

Outline Wiki用のフォルダを作成する。今回の設定ではOutlineのデータも同じフォルダの中に保存する。

mkdir outline
cd outline
mkdir -p storage-data database-data dex

compose.yamlを作成

outlineフォルダ内にcompose.yamlを作成し、以下の通り編集する。

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
    env_file: ./docker.env
    ports:
      - "6379:6379"
    healthcheck:
      test: [ "CMD", "redis-cli", "ping" ]
      interval: 10s
      timeout: 30s
      retries: 3

  postgres:
    image: postgres
    env_file: ./docker.env
    ports:
      - "5432:5432"
    volumes:
      - ./database-data:/var/lib/postgresql/data
    healthcheck:
      test: [ "CMD", "pg_isready", "-d", "outline", "-U", "user" ]
      interval: 30s
      timeout: 20s
      retries: 3
    environment:
      POSTGRES_USER: 'user'
      POSTGRES_PASSWORD: 'pass'
      POSTGRES_DB: 'outline'

  dex:
    image: dexidp/dex:v2.35.3
    ports:
      - "5556:5556"
    volumes:
      - ./dex:/etc/dex
    command: [ "dex", "serve", "/etc/dex/config.yaml" ]

volumes:
  storage-data:
  database-data:

outlineフォルダにdocker.envを作成し、以下の通り編集する。

  • SECRET_KEYUTILS_SECRETは、それぞれ`openssl rand -hex 32`を実行して生成したシークレットを設定する。
  • URLは、Outline Wikiの公開URLを指定する。
  • OIDC_AUTH_URIOIDC_TOKEN_URIOIDC_USERINFO_URIは、それぞれDexの公開URLを指定する。
NODE_ENV=production

SECRET_KEY=generate_a_new_key
UTILS_SECRET=generate_a_new_key

DATABASE_URL=postgres://user:pass@postgres:5432/outline
PGSSLMODE=disable
REDIS_URL=redis://redis:6379

URL=https://<your outline host>
PORT=3000

FILE_STORAGE=local
FILE_STORAGE_LOCAL_ROOT_DIR=/var/lib/outline/data
FILE_STORAGE_UPLOAD_MAX_SIZE=262144000

OIDC_CLIENT_ID=outline
OIDC_CLIENT_SECRET=outline-secret
OIDC_AUTH_URI=https://<your dex host>/dex/auth
OIDC_TOKEN_URI=https://<your dex host>/dex/token
OIDC_USERINFO_URI=https://<your dex host>/dex/userinfo
OIDC_USERNAME_CLAIM=<your user name>
OIDC_DISPLAY_NAME=Dex
OIDC_SCOPES=openid profile email

FORCE_HTTPS=false
ENABLE_UPDATES=true
WEB_CONCURRENCY=1
DEBUG=http
LOG_LEVEL=info

DEFAULT_LANGUAGE=ja_JP

Dexを設定

outlineフォルダ内にdex/config.yamlを作成し、Dexの設定を記述する。

  • issuerは、Dexの公開URLを指定する。
  • staticClientsredirectURIsは、Outlineの公開URLを指定する。
  • staticPasswordsにログインに利用するユーザー情報を記述する。
    • hashにはパスワードをbcryptでハッシュ化した値を設定する。ストレッチングの回数は10回
    • userIDは、任意のuuidを生成して設定する。
issuer: https://<your dex host>/dex

storage:
  type: sqlite3
  config:
    file: /var/dex/dex.db

web:
  http: 0.0.0.0:5556

staticClients:
  - id: outline
    redirectURIs:
      - "https://<your outline host>/auth/oidc.callback"
    name: "Outline"
    secret: outline-secret

oauth2:
  skipApprovalScreen: true

enablePasswordDB: true

staticPasswords:
  - email: "admin@example.com"
    hash: "$2y$10$3hJFaDaAm50OXLMXf77WZOYRF2rtd7z2ruJePbwHzCuAJkogs.8da"
    username: "admin"
    userID: "799a62d3-6eaf-4720-82c0-3f415b0c8fa3"   

参考リンク

Outlineの起動と動作確認

docker compose upを実行してOutlineを起動する。

ブラウザを起動して、https://<your outline host>にアクセスする。Dexのログイン画面へリダイレクトされるのでdex/config.yamlに設定したユーザー名とパスワードを入力する。

ログインに成功するとOutlineの画面に遷移し、Outlineを利用可能な状態になる。

まとめ

Dexのビルトインプロバイダを利用することで、セルフホスト環境の中に完結する形でOutline Wikiの環境を構築することができた。閉域環境でOutline Wikiを使いたい場合などに有効な手段だと考えられる。

OIDC認証については正直なところよくわかっていないことが多いので、Dexのドキュメントを読んだり設定ファイルをいじったりして知見を蓄えたい。また、Dexの代わりにKeycloakを使ってより柔軟な認証の仕組みを実装できないかと思っている。

参考リンク