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
- (macOSの場合) Homebrewを使ったインストールが便利です:
- テキストエディタ: 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 ps4つのサービス(caddy, db, redis, outline)がすべて
UpまたはrunningになっていればOKです。outlineのSTATUSが(healthy)に変わるまで1〜2分待ちます。 -
Webブラウザで以下のURLにアクセスします。
https://outline.test -
ブラウザに「保護されていない通信」などの警告が表示されますが、これは正常な動作です。「詳細設定」などをクリックし、「outline.testにアクセスする(安全ではありません)」を選択して先に進みます。
-
Outlineの初期設定画面が表示されれば、環境構築は成功です!
4. まとめ
以上の手順で、4つのコンテナが連携して動作する、安全なローカルHTTPS環境のOutlineを構築することができました。
構築過程で発生した様々なエラーとその解決策については、別の記事でまとめます。