Outline Wikiを​セルフホストする

2 min read
outline

概要

構築

Docker Composeで実装する方法を解説します。

以下、コピペで動きます。

services:
  outline:
    image: docker.getoutline.com/outlinewiki/outline:latest
    volumes:
      - outline_data:/var/lib/outline/data
    depends_on:
      postgres:
        condition: service_healthy
      redis:
        condition: service_healthy
    environment:
      DATABASE_HOST: postgres
      DATABASE_NAME: $POSTGRES_DB
      DATABASE_PASSWORD: $POSTGRES_PASSWORD
      DATABASE_USER: $POSTGRES_USER
      DISCORD_CLIENT_ID: $DISCORD_CLIENT_ID 
      DISCORD_CLIENT_SECRET: $DISCORD_CLIENT_SECRET 
      DISCORD_SERVER_ID: $DISCORD_SERVER_ID 
      DISCORD_SERVER_ROLES: $DISCORD_SERVER_ROLES 
      ENABLE_UPDATES: "false"
      FORCE_HTTPS: "true"
      NODE_ENV: "production" 
      PGSSLMODE: "disable"
      PORT: 3000
      REDIS_URL: redis://redis:6379
      SECRET_KEY: $SECRET_KEY
      URL: https://DOMAIN_NAME # 必ず公開するURLと合わせること
      UTILS_SECRET: $UTILS_SECRET
 
  redis:
    image: redis:latest
    volumes:
      - redis_data:/data
    healthcheck:
      test: [ "CMD", "redis-cli", "ping" ]
      interval: 10s
      timeout: 10s
      retries: 5
 
  postgres:
    image: postgres:latest
    volumes:
      - postgres_data:/var/lib/postgresql
    environment:
      POSTGRES_USER: $POSTGRES_USER
      POSTGRES_PASSWORD: $POSTGRES_PASSWORD
      POSTGRES_DB: $POSTGRES_DB
    healthcheck:
      test: [ "CMD", "pg_isready", "-d", "${POSTGRES_DB}", "-U", "${POSTGRES_USER}" ]
      interval: 10s
      timeout: 10s
      retries: 5
 
  cloudflared:
    image: cloudflare/cloudflared:latest
    container_name: cloudflared
    restart: unless-stopped
    command:
      - tunnel
      - run
    environment:
      TUNNEL_TOKEN: $TUNNEL_TOKEN
 
volumes:
  outline_data:
    driver: local
  redis_data:
    driver: local
  postgres_data:
    driver: local

Cloudflare Tunnelでホスティングしていたのですが、最初DNS解決が遅すぎてちゃんと動いているのか不安になりました。

環境変数について

  • POSTGRES_USER
  • POSTGRES_DB
  • POSTGRES_PASSWORD
  • DISCORD_CLIENT_ID
  • DISCORD_CLIENT_SECRET
  • DISCORD_SERVER_ID
  • DISCORD_SERVER_ROLES
  • TUNNEL_TOKEN

SECRET_KEYUTILS_SECRETはコマンドで生成します。

$ openssl rand -hex 32
ca0941238c15d311a5bbbfb5276e63d2e604f1e374ec8091fb3658b53a27d4a6

これを二回実行して生成されたランダムなハッシュを設定しましょう。当然、シークレットなので外部には洩らさないように。

TUNNEL_TOKENは人によっては不要ですが、Cloudflare Tunnelで外部にサーバーを公開したい場合には必要です。OutlineはどうやらHTTPSでの動作を標準としているみたいで、HTTPのままだと動作が不安定でした。

POSTGRES系の環境変数は適当に設定すればよいです。公式ドキュメントではDB名はoutlineが指定されていましたが、結局outlineのサービスにも環境変数を渡すので、何でも良いようです。

redisのデータは公式ドキュメントだと保存しない設定になっていたのですが、念の為保存するようにしています。

認証方法

Outlineは様々な認証が利用できるのですが、個人的にはDiscord OIDCが便利かと思います。

Discord OIDCは別途作っていたのですが、それとは別に設定することをオススメします。

自分は適当にアプリケーションを作成して、Outline専用の認証アプリとして実装しました。

これも、公式ドキュメントをそのまま読めばいいのかと思います。

サーバーを設定すると、Outlineのサーバー自体の初期設定にDiscordのサーバーの設定がそのまま反映されていました。

Discordログインを許可していれば、サーバーに参加していて特定のロールがあるユーザーは自由に参加できるので便利でした。

まとめ

Outlineって便利だなって。