ngrok をセルフホストできる・でも DNS が大事
ngrok というサービスを使うと、ローカルホストのポートと ngrok とのトンネルを作ってくれて、サブドメイン形式の URL を発行してもらえる。このサービスを使う方法は以前紹介した。
- 過去記事 : ngrok を使ってローカル環境を一時的に公開してみる
この ngrok、どうやらセルフホスティングできるらしいので調べてみたのだが、結果からいうと実現できなかった。今日の記事は特に成果のないメモ。
セルフホスト ngrok の要件
クラウド VM なんかに ngrok.io
相当のサイトを構築して、自分だけの ngrok を立てられる。サーバサイドとなる ngrok は ngrokd
と命名されている。
やり方などは以下のページ群を見れば分かるだろう。
- ngrok/SELFHOSTING.md at master · inconshreveable/ngrok
- How to setup Ngrok with a self-signed SSL cert
- Self Hosted ngrokd fails to allow client to connect · Issue #84 · inconshreveable/ngrok
- 自分用ngrokを構築する(self hosted ngrok) - Qiita
- A self-hosted ngrok. Exposing local services can sometimes… | by Shivansh Vij | Medium
セルフホスト ngrok サーバを構築するには、example.com
という独自ドメインと、*.example.com
というワイルドカード DNS を登録しないといけない。
この「ワイルドカード DNS」というモノは、DNS サービスによっては対応していないところがあり、例えば無料ドメインの Freenom が提供する DNS では、ワイルドカード DNS は作成できなかった。
自分が使っている DNS サービスでいうと、Value Domain はワイルドカード DNS が登録できるようだが、Freenom で取得しているドメインを Value Domain の DNS で管理するための設定が面倒臭そうだったので、諦めてしまった。
ということで、セルフホスト ngrok 用の独自ドメインと、それに対応するワイルドカード DNS が登録できるようなクラウドプロバイダを選択しないと、簡単に操作できないワケだ。よく使われているのは AWS とか GCP とからしい。API で DNS 設定も出来たりするからその方が良いのだろうな。無料のサービスだけで何とかするのは厳しそうだ。
んで、DNS が解決したあとは、SSL 証明書が必要になる。DNS と同じく、ワイルドカード対応の SSL 証明書を取得する必要がある。Let's Encrypt でもワイルドカード証明書を作ることはできるが、DNS レコードで所有を証明しないといけないので、やはり DNS サービスは使いやすいモノが良いだろう。
ちなみに、SSL 証明書は自己署名証明書でも動かせるようだ。
ワイルドカードなサブドメインに対応した DNS と SSL 証明書を準備できたら、いよいよ ngrokd の準備となる。ngrok は Go 言語ベースなのだが、あまり新しすぎる Go 環境だと動かないらしいので注意。
あまりGoが新しいとエラーになるので、Go1.7をインストールする。
ココまでやって、ようやくホスティングできる感じ。面倒臭い…。
Docker で構築する
ちなみに、ngrok 自体を Docker イメージで利用することもできる。
ngrokd も Docker イメージとして用意できるようだ。
このコメントによると。
- Dockerfile
FROM alpine:latest
WORKDIR /opt
ADD ngrokd device.key device.crt ./
EXPOSE 80
EXPOSE 443
EXPOSE 4443
ENTRYPOINT ["./ngrokd","-tlsKey","device.key","-tlsCrt","device.crt","-domain","yourdomain.com"]
- Build and push the image
env GOOS=linux GOARCH=amd64 make release-server
cp bin/ngrokd
docker build . -t yourname/ngrok:latest
docker push yourname/ngrok:latest
- Run on server
On the server, just execute
docker run -d --restart=always -p 80:80 -p 443:443 -p 4443:4443 yourname/ngrok:latest
.
…こんな感じで作れるらしい。
Awesome Tunneling
ローカルホストのポートを直接開けてサイトを公開するのって、色々と難易度高いので、ngrok みたいなトンネリングを利用して公開できるのは手軽だが、ngrok 自体のセルフホスティングはなかなか面倒だった。
ngrok 以外の「トンネリング」関係の情報は、以下の Awesome Tunneling にまとまっている。
メモ終わり。