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_KEY
とUTILS_SECRET
は、それぞれ`openssl rand -hex 32`
を実行して生成したシークレットを設定する。URL
は、Outline Wikiの公開URLを指定する。OIDC_AUTH_URI
、OIDC_TOKEN_URI
、OIDC_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を指定する。staticClients
のredirectURIs
は、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を使ってより柔軟な認証の仕組みを実装できないかと思っている。