はじめに
ローカル開発環境で複数のプロジェクトを管理していると、それぞれの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: bridgedomains.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 -dstart.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 -fstop.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でプログラムを書いて暮らしています。 趣味はルアーフィッシング、ギター、アクアリウムとストリートファイター(格ゲー) 。
宮崎県在住。





