Docker'da ngrok kullanımı

2021-08-11 2 dk

Birden fazla servisi docker-compose ile tek bir uygulama olarak ayağa kaldırabiliyoruz. Eğer geliştirme ortamınızda ngrok kullanıyorsanız, bunu da bir Docker servisi haline getirebilirsiniz. Getirmeli misiniz? Muhtemelen hayır. Ancak getirmek isterseniz, bu yazıda nasıl yapabileceğinizi göreceksiniz.

ngrok servisi oluşturmak

Öncelikle ngrok isminde bir klasör oluşturun. Bu klasörde, ngrok çalıştırılabilir dosyasına giden bir sembolik link oluşturun. Örneğin,

ln -s ~/.local/bin/ngrok ./ngrok/ngrok

ngrok klasörünün içinde şimdi bir adet yine ngrok isminde çalıştırılabilir dosya kısayolu oldu. Sırada ise ngrok uygulamasının konfigürasyon dosyasını oluşturmak var. Yine aynı klasör içine şöyle bir dosya ekliyoruz:

ngrok.yml
web_addr: 0.0.0.0:4040
authtoken: <AUTH_TOKEN_BURAYA>
log: stdout

Son olarak docker-compose.yml içerisine ngrok servisimizi ekliyoruz:

docker-compose.yml
services:
  # ...
  ngrok:
    profiles:
      - ngrok
    image: nginx
    volumes:
      - ./ngrok:/code/
    command: /code/ngrok http nginx:80 -config=/code/ngrok.yml
    ports:
      - 4040:4040

Servis içerisindeki profiles kısmı dikkatinizi çekmiştir. Ne olduğunu öğrenmek için bu yazımı okuyun.

ngrok servisine ulaşmak

localhost:4040 üzerinden ngrok servisine ulaşabilirsiniz. Diğer servislerden de ngrok servisine ulaşmanız gerekebilir. Dahası, ngrok adresini dinamik olarak almak isteyebilirsiniz. Bunun için yazdığım örnek bir Python kodu aşağıda yer alıyor:

def get_ngrok_url(startswith: str = 'https://') -> str:
    ngrok_tunnels = 'http://ngrok:4040/api/tunnels'
    r = os.system(f'curl {ngrok_tunnels} > tunnels.json 2> /dev/null')

    if r != 0:
        os.system('rm -f tunnels.json')
        raise OSError('Either ngrok is not running or curl is not installed.')

    with open('tunnels.json', 'r') as f:
        tunnels = json.loads(f.read())
        os.system('rm -f tunnels.json')

        for tunnel in tunnels['tunnels']:
            if tunnel['public_url'].startswith(startswith):
                return tunnel['public_url']
print(get_ngrok_url)
# https://bc2aadf5e32f.ngrok.io

Belirlediğiniz HTTP protokolüne göre ngrok için public URL'i dönecektir.

Tarih: 2021-08-11
Kategoriler: geliştirme
Etiketler: dockerngrok