はじめに
ローカル開発環境で複数のプロジェクトを管理していると、それぞれのnginxにHTTPS対応させたい場面がありますよね。でも、それぞれに証明書やリバースプロキシを設定するのは面倒……。
そんな時に便利なのが、steveltn/https-portal を使った「HTTPSリバースプロキシの一元管理」です。
この記事では、「複数プロジェクト向けHTTPSポータル構成」を紹介します。
http://localhost:8080はAプロジェクトのwebサーバ、http://localhost:8081はBプロジェクトのwebサーバ、8082は…とても面倒でやってられません。
この仕組みを使えば、https://a.localhost で Aプロジェクトのwebサーバ、https://b.localhost で Bプロジェクトのwebサーバへアクセスできるようになり、管理が簡単です。もちろん追加も簡単です。
システム概要
以下の構成で、複数のnginxコンテナに対してhttps-portalがHTTPSプロキシを提供するようにしています。
簡単な構成図
https-portalコンテナ:HTTPS終端 & リバースプロキシ
nginxコンテナ:各プロジェクトが使用するWebサーバ
共通ネットワーク:proxyネットワークで全コンテナが通信可能
ディレクトリ構成
https-portal/
├── docker-compose.yml # https-portal定義
├── domains.json # コンテナとドメインのマッピング
├── start-https-portal.sh # プロキシ設定の自動生成スクリプト
├── start.sh # 起動コマンド。
├── stop.sh # 停止コマンド。
└── .env #ドメイン。
docker-compose.yml(https-portal)
services: https-portal: image: steveltn/https-portal ports: - "443:443" environment: DOMAINS: ${HTTPS_DOMAINS} STAGE: local FORCE_SSL: "true" networks: - proxy # アプリケーションサーバは別プロジェクト側で定義されている前提 # それらをこの proxy ネットワークに接続しておくこと networks: proxy: name: proxy driver: bridge
domains.json(ドメインマッピング)
fooやbarがdocker-composeで設定するプロジェクト名です。
{ "foo-nginx-1": "foo.localhost", "bar-nginx-1": "bar.localhost" }
.env
# 値は自動生成されるので空でOK HTTPS_DOMAINS=
start-https-portal.sh
#!/bin/bash cd "$(dirname "$0")" ENV_FILE=".env" DOMAIN_JSON="domains.json" echo "🔍 proxyネットワークに接続されているコンテナを検索中..." # proxyネットワークに接続されている全てのコンテナ名を取得 ALL_CONTAINERS=$(docker network inspect proxy -f '{{range .Containers}}{{.Name}}{{"\n"}}{{end}}') if [ -z "$ALL_CONTAINERS" ]; then echo "⚠️ proxyネットワークに属するコンテナが見つかりません。" echo "" > "$ENV_FILE" exit 0 fi DOMAINS="" for container in $ALL_CONTAINERS; do domain=$(jq -r --arg key "$container" '.[$key]' "$DOMAIN_JSON") if [ "$domain" != "null" ] && [ -n "$domain" ]; then entry="$domain -> http://$container" echo "✅ マッピング: $entry" if [ -z "$DOMAINS" ]; then DOMAINS="$entry" else DOMAINS="$DOMAINS, $entry" fi else echo "ℹ️ ドメインマッピングが存在しない: $container → スキップ" fi done if [ -z "$DOMAINS" ]; then echo "⚠️ 有効なHTTPSドメインが1つもありません。https-portalの起動はスキップします。" echo "" > "$ENV_FILE" exit 0 fi echo "HTTPS_DOMAINS=$DOMAINS" > "$ENV_FILE" echo "✅ .env に書き出しました:" cat "$ENV_FILE" echo "🚀 docker compose --env-file $ENV_FILE up -d" docker compose --env-file "$ENV_FILE" up -d
start.sh
#!/bin/bash PROJECT_DIR="$(cd "$(dirname "$0")" && pwd)" HTTPS_PORTAL_DIR="/usr/local/https-portal" # 好きなところでOK HTTPS_PORTAL_CONTAINER="https-portal-https-portal-1" echo "🚀 プロジェクトを起動します..." # ① foo プロジェクト(自身)の docker を先に起動(nginxも含めて) echo "📦 プロジェクトの docker-compose を起動中..." docker compose up -d # ② https-portal が動いていたら止める if docker ps --format '{{.Names}}' | grep -q "^$HTTPS_PORTAL_CONTAINER$"; then echo "🛑 https-portal を一旦停止します..." docker stop "$HTTPS_PORTAL_CONTAINER" else echo "ℹ️ https-portal は起動していません" fi # ③ https-portal の .env 再生成 → 再起動 echo "🔄 https-portal を再起動します..." ( cd "$HTTPS_PORTAL_DIR" || exit 1 ./start-https-portal.sh ) # ④ foo プロジェクトのログをリアルタイム表示 echo "📺 プロジェクトのログ出力(Ctrl + C で停止)" docker compose logs -f
stop.sh
#!/bin/bash PROJECT_DIR="$(cd "$(dirname "$0")" && pwd)" HTTPS_PORTAL_DIR="/usr/local/https-portal" # 好きなところでOK HTTPS_PORTAL_CONTAINER="https-portal-https-portal-1" echo "🚀 プロジェクトを終了します..." # ① プロジェクト(自身)の docker を停止 echo "📦 プロジェクトの docker-compose を停止中..." docker compose stop # ② https-portal を停止 echo "🛑 https-portal を一旦停止します..." docker stop "$HTTPS_PORTAL_CONTAINER" # ③ https-portal の .env 再生成 → 再起動 echo "🔄 https-portal を再起動します..." ( cd "$HTTPS_PORTAL_DIR" || exit 1 ./start-https-portal.sh )
リバースプロキシで接続するプロジェクト側の設定
domains.jsonで定義したdockerコンテナが定義されているdocker-compose.ymlでの設定となります。
docker-compose.yml の nginx と networks
services: nginx: build: context: ./nginx volumes: - /home/user/project/code:/var/www - ./nginx/nginx.conf:/etc/nginx/nginx.conf - ./nginx/conf.d/default.conf:/etc/nginx/conf.d/default.conf environment: TZ: "Asia/Tokyo" networks: - default - proxy # 省略 networks: default: driver: bridge ipam: config: - subnet: ${DOCKER_SUBNET} # お好きなIPセグメントで gateway: ${DOCKER_GATEWAY} # お好きなゲートウェイIPで proxy: external: true
解説
🗑 start-https-portal.sh の仕組み
proxyネットワークに接続されている全コンテナを列挙
domains.jsonと照合してドメイン名を割り出し
.envにHTTPS_DOMAINS 環境変数を動的に生成
https-portalコンテナを再起動してプロキシ設定を反映
🚀 プロジェクト起動(start.sh)
リバースプロキシで接続するプロジェクトのdocker開発環境のディレクトリに .start.sh をコピーしておく。
- ./start.sh 実行。
- 対象プロジェクトのコンテナ起動
- https-portalを一時停止
- 再度 start-https-portal.sh を実行してプロキシ更新
- 対象プロジェクトのログ表示
🚫 プロジェクト停止(stop.sh)
リバースプロキシで接続するプロジェクトのdocker開発環境のディレクトリに .stop.sh をコピーしておく。
- ./stop.sh 実行。
- 対象プロジェクトのコンテナ停止
- https-portalを一時停止
- 残りのプロジェクトに対してプロキシ設定を再構築
🆕新しいプロジェクトを追加するには?
- domains.json にnginxコンテナ名とローカルドメインを追加
- プロジェクトの docker-compose.yml に proxy ネットワークを接続
- プロジェクトに start.sh / stop.sh を設置して、パスなどを調整
メリットまとめ
- ✅ HTTPS対応が簡単:証明書発行不要!自動でHTTPS化
- ✅ 一元管理:全プロジェクトをまとめて管理
- ✅ 動的設定:コンテナの起動/ 停止に応じて自動で反映
- ✅ ローカル開発に最適:複数ドメインのテストも楽々!
注意点
- ⚠️ 各nginxコンテナは proxy ネットワークに接続されている必要があります
- ⚠️ domains.json のキーは 実際のコンテナ名 に一致させましょう。
- ⚠️ start.sh / stop.sh の中で使っている HTTPS_PORTAL_DIR は環境に合わせて変更してください
最後に
複数プロジェクトの開発をしていると、HTTPS対応の整備って意外と手間ですよね。でもこの構成を一度作っておけば、新しいプロジェクトを追加するたびに楽になります。
興味がある方はぜひ真似してみてくださいね!

安達棒とアンバサダーで色々釣りたいおじさん。
Macでプログラムを書いて暮らしています。 趣味はルアーフィッシング、ギター、アクアリウムとストリートファイター(格ゲー) 。
宮崎県在住。