📱

無料でサブドメイン固定可能なLocaltunnelをngrokの代替としてDockerで使う

2022/12/01に公開

はじめに

ローカル環境で開発しているアプリケーションを、httpsで外部公開したいときに、まず思いつくのは「ngrok(エングロック)」ではないでしょうか。

https://ngrok.com/

OAuthのCallBackやWebhooksでlocalhostが使えないサービス(LINE BotやLINE loginなど)に対してngrokは非常に有用なサービスです。

ngrokには有料/無料プランがあり、無料プランではサブドメインを固定することができずランダムなものが割り当てられます。
サブドメインを固定できないと、頻繁にCallBackURLやWebhooksを変更しなければなりません。

ngrokの有料プランに入ればサブドメイン固定できるので、問題は解消するのですが、無料でどうにかできないかと思い調べました。
その結果、ngrokと似たサービスで「Localtunnel」というものがあり、簡単に使えたので紹介します。

https://theboroer.github.io/localtunnel-www/

ngrokやLocaltunnel、別の代替サービスとの比較は以下の記事が分かりやすかったです。

https://asur.dev/en/tutorials/how-to-share-your-local-on-the-internet-with-ngrok/

環境

Windows11 WSL2
Docker Desktop v20.10.17

手順

Dockerを使用する場合の手順です。localtunnel自体はNode.jsで書かれていて、npmでinstallできます。Docker使わない場合の使い方は公式GitHubのリポジトリを見てください。

docker-compose作成

ローカルの適当なフォルダを作成して、docker-compose.ymlを作成します。

$ mkdir LocalTunnelOnDocker
$ cd LocalTunnelOnDocker
$ touch docker-compose.yml
docker-compose.yml
version: '3.8'

services:
  web:
    image: nginx:latest
    ports:
      - 80

  localtunnel:
    image: efrecon/localtunnel
    command:
      --local-host web --port 80 --subdomain ${SUB_DOMAIN}
    links:
      - web
    depends_on:
      - web

localtunnelのDockerImageがあるので使います。
efrecon/localtunnel

上記のImageですが7年前から更新が止まっているため、別の方法も一応探してみました。
以下の記事のような方法がありました。

https://medium.com/@baldrailers/localtunnel-me-with-docker-compose-b432b1d48f7f

commandの--subdomainを指定すると、https://指定したサブドメイン.loca.lt/ として固定したドメインにすることができます。
※すでに予約済みの場合は使用できないので、複雑なものにした方がよいです

.env

docker-compose.ymlのSUB_DOMAINは環境変数として渡すため、.envを作成します。

.env
SUB_DOMAIN=st-man-subdomain

コンテナ起動・ページ確認

コンテナを起動します。

$ docker-compose up -d

起動が完了したら「https://st-man-subdomain.loca.lt」にアクセスしてみます。

すると下記のような画面が表示されます。

「7日に1回このページが表示されます」と書いてあるので、「Click to Continue」をクリックします。

ページ遷移すると、NginxのWelcomeページが表示されます!

さいごに

Localtunnelは便利ではありますが、IP制限などのアクセス制限には対応していないので、セキュリティなどが必要なものを公開したい場合は、ngrok有料プランになるかなと思います。

Localtunnelでもプルリクは出ているようですが、取り込みはされていないようでした。

コンテナ起動中は外部公開されているので、確認が終わったらすぐにコンテナを停止するなどした方がよいです。

もっと良い方法があったり、不都合があるなどする場合はご教示いただければと思います。

Discussion