Chapter 01無料公開

全体構成の説明

ArkBig
ArkBig
2022.11.03に更新

そうだ!手間を減らすため共通の開発環境を構築しよう!!

と思い立って、GitHubにDevBaseリポジトリを作りました。
気になった人はぜひ使ってみてください。使用するだけなら、紹介記事を書いていますのでそちらを見てお試しください。
この本では、DevBaseの仕組みについて解説しています。

https://zenn.dev/arkbig/articles/devbase_b8b43191f863f8024a83f824c832f8ca0e5d209254

何個かのプロジェクト作業をしていると、同じツールを立ち上げることがありました。その際ポート番号で各プロジェクトのサービスを振り分けていたのですが、ポート番号の一覧がなく被ったり、どのポートか忘れたりしたのでその解決策としてTraefikを導入しました。
またプロジェクトでメール送信のテストをする場合に自分のメールアドレスに送るのが面倒だし、宛先変更の機能がうまく動いているか見たくてMailHogのダミーメールボックスを使っています。
メール送信つながりで、社内サービスを構築しているのですが、間違えて社外にメールしてしまわないように宛先ドメインを絞りたくてExim4でドメインごとに送信先SMTPサーバーを切り替えるしくみを構築しました。
ついでに"http://*.localhost"ではなくコンテナからホストと同じURLで別コンテナにアクセスできるようにDnsmasqでローカルDNSを構築し、HTTPSを使うため自己証明書も作ってみました。
これらをまとめたものがdevbaseリポジトリとなっています。本書はここで使った各ツールの説明をしつつ、最終的にdevbaseを使ってもらうのを目的に書きました。

devbaseを使うことで、皆さんの開発初期の環境セットアップが楽になることを願っています。

提供するサービス

ツール 提供サービス
Docker コンテナ環境としてDocker Engineを利用。
コンテナを使うとホストの環境が汚れないし、他マシンへのポータビリティも高いのでなるべく使うようにしています。
いずれはクラウドを意識してKubernatesを勉強し、Dockerなしで環境を構築したいところです。
OpenSSL 自己認証局・証明書を作るためOpenSSLを利用。
マルチドメイン&ワイルドカードに対応した証明書を作成し、ブラウザからアクセスで警告が出ないようにします。
OpenSSLの勉強としてコマンドを直接叩いていますが、世の中にはmkcertという便利なツールもあるようです。
Dnsmasq 簡易DNSとしてDnsmasqを利用。
"*.test"の名前解決をして、ホストのIPアドレスを返すようにします。
もし"http://*.localhost/"だけであればChromeを使えばDNS不要です。(Safariはダメでした)
socat UDPトンネルとしてsocatを利用。
ColimaのSSHトンネルがUDPに対応していなかったので、回避策とします。
TCPトンネルのように自動でできるようになると便利ですが、そこまでの機能はまだありません。
Traefik リバースプロキシとしてTraefikを利用。
"*.dev.test"のホスト名から対象のサービスを切り替えるようにします。
MailHog Fake SMTPとしてMailHogを利用。
ダミーメールボックスとしてブラウザからメールを読めるようにします。
Exim4 SMTPリレーとしてExim4を利用。
特定ドメイン宛のみ正規SMTPへリレーして、それ以外はMailHogにリレーします。

動作確認した環境

🍎Mac 🪟Windows 🐧Linux
OS macOS Monterey (12.3) Windows 10 Home (21H2) Ubuntu 20.04.4 LTS
マシン Mac mini (M1, 2020) CHUWI LakeBox Pro (Celeron J4125) WSL2
仮想マシン Colima version 0.3.4 WSL2 Ubuntu 20.04.4 LTS -
Docker client: v20.10.13
server: v20.10.11
client: v20.10.14
server: 20.10.14
client: v20.10.14
server: 20.10.14

LinuxはWSL2上のUbuntuでしか確認していませんが、ほかのLinuxでも動くといいな。(パスは読み替える必要がありそう)

フォルダ構成

${DEVBASE}
📂 devbase/
├── 📄.env(必要なら作る)
├── 📄compose.override.yaml(必要なら作る)
├── 📄compose.yaml
├── 📄sample.env
├── 📁dnsmasq/
├── 📁exim4/
├── 📁sslcert/
├── 📁traefik/
├── 📁udptunnel/
├── 📁util/
└── 📁wsl2/

各フォルダを以降の章で説明していきます。

各章の概要

Dockerの導入と各種設定

ベースとなるDockerのインストールやその後の設定を書いています。
インストール手順は公式に任せてここではチェックリスト的なまとめにしてあります。
その後の設定では、composeプラグイン、起動スクリプト、ルートフォルダ変更、プロキシ設定、ルートレスモード、ログローテーション、ポートフォワーディング、と実際の運用時に行った作業を書きました。

オレオレ証明書の作成とOSへの登録

TLS通信のために、opensslコマンドを利用して、自己認証局の作成&自己証明書の作成をするone-shotコンテナを作ります。
いわゆるオレオレ認証局やオレオレ証明書と呼ばれるものです。
作成した自己認証局をOSに登録して、ブラウザでアクセスしても警告が出ないようにします。

Dnsmasqの構築とOSへの登録

Traefikで使うための簡易DNSを設置します。ワイルドカードDNSとして、"*.dev.test"のホスト名解決をします。
構築したDNSサーバーをOSに登録して、実際に使えるようにします。

socatを使用したUDPトンネル

MacのColimaがUDPポートフォワーディングに対応していないので、socatを使って対応します。
WindowsのWSL2では不要ですが、こういうソフトがあるというのを知っておくと役に立つことがあるでしょう。

WSL2スタートアップ

Windows起動時にWSL2用の固定IPアドレス設定やデーモン起動する方法について書いています。

TraefikでのTLSリバースプロキシ

本書のメイン、Traefikについて書いています。TLSを有効にし、"https://*"で各サービスへアクセスできるようにします。
ここまでの章のオレオレ証明書、Dnsmasqが必要になります。

MailHogの起動

ダミーのメールアドレスを受信するメールボックスとして構築します。ブラウザからメール内容を確認できるので便利です。

Exim4の構築と特定ドメイン転送

一部のドメインに対してのみ正規のSMTPサーバーへリレーするためにExim4を構築します。
社内サービスでメール宛先設定ミスにより外部にメールしてしまうのを防ぐために使用しています。

免責事項

私の環境では動作確認をしていますが、作業をしながらの確認のため新規環境では正しくうごかないこともあるでしょう。
その際はGitHubのIssuesなどでご連絡いただけると幸いです。