【OSSでWiki構築】第2回(環境構築編)
Docker ComposeでOutlineとDBを連携させる Docker Composeによる構築手順 1. はじめに この記事は、オープンソースのWikiツール「Outline」を、Docker Composeを利用してローカルPC上に構築するまでの一連の手順をまとめたものです。 最終的に、自己署名証明書による安全なHTTPS環境でOutlineが動作する状態を目指します。 第1回はこちら。【OSSでWiki構築】第1回:OSSの選定 使用技術スタック アプリケーション: Outline 実行環境: Docker / Docker Compose データベース: PostgreSQL キャッシュ: Redis リバースプロキシ (HTTPS化): Caddy 2. 事前準備 構築を始める前に、以下のツールがPCにインストールされていることを確認します。 Docker Desktop: 公式サイトからダウンロード。 (macOSの場合) Homebrewを使ったインストールが便利です: brew install --cask docker テキストエディタ: Visual Studio Codeなど、コードを編集できるもの。 ターミナル (コマンドラインツール) 3. 構築手順 ステップ1: プロジェクトフォルダの作成 まず、作業用のフォルダを作成し、その中に移動します。 # 例としてデスクトップに作成 cd ~/Desktop # フォルダを作成 mkdir outline-project # 作成したフォルダに移動 cd outline-project ステップ2: hostsファイルにカスタムドメインを追加 localhostに紐づくブラウザの強力なキャッシュ(HSTS)を回避し、クリーンな状態でローカルHTTPS環境を構築するため、PCのhostsファイルにoutline.testというカスタムドメインを追加します。 ターミナルで以下のコマンドを実行し、hostsファイルを開きます。(パスワード入力が必要です) sudo nano /etc/hosts ファイルの末尾に、以下の一行を追記します。 127.0.0.1 outline.test Control + O → Enterで保存し、Control + Xでエディタを終了します。 ステップ3: Caddyの設定ファイルを作成 HTTPS通信を担当する「SSL執事」であるCaddyの設定ファイルを作成します。 outline-projectフォルダ内に、Caddyfileという名前のファイル(拡張子なし)を新規作成し、以下の内容を記述します。 outline.test { # これはインターネットに公開しない、内部用の証明書を使うという指示 tls internal # outline.testに来たアクセスを、outlineコンテナの3000番ポートに中継する reverse_proxy outline:3000 } ステップ4: シークレットキーの生成 Outlineのセキュリティ設定に必要な、2つのランダムな文字列(シークレットキー)を生成します。 ターミナルで以下のコマンドを2回実行し、表示された文字列をそれぞれメモしておきます。 openssl rand -hex 32 ステップ5: docker-compose.ymlの作成と編集 プロジェクトの心臓部である設計図docker-compose.ymlを作成します。 outline-projectフォルダ内にdocker-compose.ymlを新規作成し、以下の内容を貼り付けます。 その後、SECRET_KEYとUTILS_SECRETの値を、ステップ4で生成した2つのキーに置き換えます。 # 動かしたいコンテナ(サービス)を定義していく services: # 1番目のサービス:Caddy(リバースプロキシ兼SSL執事) # ブラウザからのアクセスを全て受け取り、安全なHTTPS通信を提供する caddy: image: caddy:2-alpine restart: unless-stopped # PCのポート80(HTTP)と443(HTTPS)をCaddyコンテナに接続する # CaddyがHTTPからHTTPSへのリダイレクトも自動で行う ports: - "80:80" - "443:443" # Caddyの設定ファイル(Caddyfile)をコンテナ内に読み込ませる volumes: - ./Caddyfile:/etc/caddy/Caddyfile # 2番目のサービス:PostgreSQLデータベース db: image: postgres:15-alpine restart: unless-stopped volumes: - postgres_data:/var/lib/postgresql/data environment: POSTGRES_USER: outline POSTGRES_PASSWORD: StrongPassword POSTGRES_DB: outline # 3番目のサービス:Redis(キャッシュなど一時データ用) redis: image: redis:7-alpine restart: unless-stopped # 4番目のサービス:Outline本体 outline: image: outlinewiki/outline:latest restart: unless-stopped # ポートはCaddyが全て管理するため、Outlineは外部にポートを公開しない depends_on: - db - redis environment: # ステップ4で生成した2つのキーに置き換える SECRET_KEY: 'ここに1つ目のキーを貼り付け' UTILS_SECRET: 'ここに2つ目のキーを貼り付け' # アプリケーションの公開URL(httpsとカスタムドメインに変更) URL: '<https://outline.test>' DATABASE_URL: 'postgres://outline:StrongPassword@db:5432/outline' REDIS_URL: 'redis://redis:6379' PGSSLMODE: 'disable' # データを保存しておくボリューム(保管庫)を定義 volumes: postgres_data: ステップ6: コンテナの起動 全ての準備が整いました。ターミナルで以下のコマンドを実行し、コンテナを起動します。 docker compose up -d 初回はイメージのダウンロードに数分かかる場合があります。 ステップ7: 動作確認とアクセス コンテナが正常に起動したか、以下のコマンドで確認します。 docker compose ps 4つのサービス(caddy, db, redis, outline)がすべてUpまたはrunningになっていればOKです。outlineのSTATUSが(healthy)に変わるまで1〜2分待ちます。 Webブラウザで以下のURLにアクセスします。https://outline.test ブラウザに「保護されていない通信」などの警告が表示されますが、これは正常な動作です。「詳細設定」などをクリックし、「outline.testにアクセスする(安全ではありません)」を選択して先に進みます。 Outlineの初期設定画面が表示されれば、環境構築は成功です! 4. まとめ 以上の手順で、4つのコンテナが連携して動作する、安全なローカルHTTPS環境のOutlineを構築することができました。 構築過程で発生した様々なエラーとその解決策については、別の記事でまとめます。