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:
web_addr: 0.0.0.0:4040
authtoken: <AUTH_TOKEN_BURAYA>
log: stdout
Son olarak docker-compose.yml
içerisine ngrok servisimizi ekliyoruz:
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.