O ngrok é uma ferramenta poderosa que cria um túnel seguro para seu servidor local, permitindo acesso externo à sua aplicação através da internet. Isso é especialmente útil para testes, demonstrações e desenvolvimento sem a necessidade de configurar regras de firewall ou DNS.
Importante
O ngrok é primariamente uma ferramenta para desenvolvimento e testes. Para ambientes de produção, considere soluções mais robustas como configuração adequada de firewall, VPN ou serviços de hospedagem na nuvem.
Configuração do Ngrok
-
Baixe e instale o ngrok
Acesse https://ngrok.com/download e baixe a versão adequada para seu sistema operacional.
-
Extraia o arquivo baixado
Extraia o conteúdo do arquivo zip para uma pasta de sua preferência, por exemplo:
C:\inetpub\wwwroot\joomla\python_apps\ngrok\
-
Crie uma conta no ngrok (opcional para funcionalidades básicas)
Registre-se em https://dashboard.ngrok.com/signup para obter um token de autenticação e recursos adicionais.
-
Autentique o ngrok (se tiver criado uma conta)
ngrok authtoken seu_token_de_autenticacao
Iniciando o Túnel Ngrok
Existem duas maneiras de iniciar o túnel ngrok:
Método 1: Execução Manual
ngrok http 5000
Isso criará um túnel para a porta 5000 (onde está rodando a aplicação Python) e exibirá uma interface com informações sobre o túnel, incluindo a URL pública.
ngrok (Ctrl+C to quit)
Session Status online
Account exemplo@email.com (Plan: Free)
Version 3.3.1
Region South America (sa)
Latency 23ms
Web Interface http://127.0.0.1:4040
Forwarding https://a1b2c3d4e5f6.sa.ngrok.io -> http://localhost:5000
Connections ttl opn rt1 rt5 p50 p90
0 0 0.00 0.00 0.00 0.00
A URL pública (no exemplo acima: https://a1b2c3d4e5f6.sa.ngrok.io) pode ser compartilhada com qualquer pessoa para acessar sua aplicação Python através da internet.
Método 2: Execução como Serviço
Para uma solução mais permanente, você pode configurar o ngrok para ser executado como um serviço usando o NSSM:
@echo off
TITLE Configuração do Serviço Ngrok
ECHO Instalando o serviço Ngrok...
:: Variáveis
SET NGROK_PATH=C:\inetpub\wwwroot\joomla\python_apps\ngrok
SET NSSM_PATH=C:\inetpub\wwwroot\joomla\python_apps\minha_aplicacao\nssm\nssm.exe
SET SERVICE_NAME=NgrokTunnel
:: Verificar se o serviço já existe
sc query %SERVICE_NAME% > NUL
if not errorlevel 1 (
ECHO O serviço já existe. Removendo...
"%NSSM_PATH%" remove %SERVICE_NAME% confirm
)
:: Instalar o serviço
ECHO Instalando o serviço Ngrok...
"%NSSM_PATH%" install %SERVICE_NAME% "%NGROK_PATH%\ngrok.exe"
"%NSSM_PATH%" set %SERVICE_NAME% AppParameters "http 5000 --log=stdout"
"%NSSM_PATH%" set %SERVICE_NAME% DisplayName "Túnel Ngrok para Aplicação Python"
"%NSSM_PATH%" set %SERVICE_NAME% Description "Cria um túnel seguro para acesso externo à aplicação Python"
"%NSSM_PATH%" set %SERVICE_NAME% AppDirectory "%NGROK_PATH%"
"%NSSM_PATH%" set %SERVICE_NAME% AppStdout "%NGROK_PATH%\ngrok.log"
"%NSSM_PATH%" set %SERVICE_NAME% AppStderr "%NGROK_PATH%\ngrok-error.log"
"%NSSM_PATH%" set %SERVICE_NAME% AppExit Default Restart
"%NSSM_PATH%" set %SERVICE_NAME% AppRestartDelay 10000
sc config %SERVICE_NAME% depend= PythonAppJoomla
:: Iniciar o serviço
ECHO Iniciando o serviço...
net start %SERVICE_NAME%
ECHO Serviço instalado e iniciado com sucesso.
ECHO Você pode acessar a interface de status do Ngrok em: http://localhost:4040
ECHO A URL pública para acesso à sua aplicação estará disponível nessa interface.
PAUSE
Salve este script como setup_ngrok_service.bat e execute-o como administrador.
Obtendo a URL Pública
Depois de iniciar o ngrok, você pode obter a URL pública de duas maneiras:
-
Interface Web do Ngrok
Acesse http://localhost:4040 em seu navegador para visualizar a interface de status do ngrok, que exibe informações detalhadas sobre o túnel, incluindo a URL pública.
-
API Local do Ngrok
Você pode obter a URL programaticamente através da API do ngrok:
import requests
import json
try:
# Obtenha a URL pública do ngrok via sua API local
ngrok_api = requests.get('http://localhost:4040/api/tunnels').json()
ngrok_url = ngrok_api['tunnels'][0]['public_url']
print(f"URL pública do ngrok: {ngrok_url}")
except Exception as e:
print(f"Erro ao obter URL do ngrok: {e}")
Atualização Automática do iframe
Para atualizar automaticamente o iframe no Joomla com a URL atual do ngrok, você pode criar um script que:
- Obtenha a URL atual do ngrok
- Atualize o conteúdo do artigo ou módulo no banco de dados do Joomla
# update_ngrok_url.py
import requests
import mysql.connector
import time
import logging
from datetime import datetime
# Configuração de logging
logging.basicConfig(
filename='ngrok_updater.log',
level=logging.INFO,
format='%(asctime)s - %(levelname)s - %(message)s'
)
# Configurações do banco de dados Joomla
db_config = {
'host': 'localhost',
'user': 'usuario_joomla',
'password': 'senha_joomla',
'database': 'banco_joomla'
}
# ID do artigo ou módulo contendo o iframe
article_id = 123 # Substitua pelo ID do seu artigo
# Função para obter a URL atual do ngrok
def get_ngrok_url():
try:
response = requests.get('http://localhost:4040/api/tunnels')
data = response.json()
# Obtenha a URL pública (HTTPS de preferência)
for tunnel in data['tunnels']:
if tunnel['proto'] == 'https':
return tunnel['public_url']
# Se não houver HTTPS, use HTTP
return data['tunnels'][0]['public_url']
except Exception as e:
logging.error(f"Erro ao obter URL do ngrok: {e}")
return None
# Função para atualizar o artigo no Joomla
def update_joomla_article(ngrok_url):
try:
# Conectar ao banco de dados Joomla
conn = mysql.connector.connect(**db_config)
cursor = conn.cursor()
# Obter o conteúdo atual do artigo
cursor.execute("SELECT introtext FROM #__content WHERE id = %s", (article_id,))
content = cursor.fetchone()[0]
# Substituir a URL no iframe
import re
pattern = r'src="https?://[^"]*"'
new_content = re.sub(pattern, f'src="{ngrok_url}"', content)
# Atualizar o artigo
cursor.execute(
"UPDATE #__content SET introtext = %s, modified = %s WHERE id = %s",
(new_content, datetime.now().strftime('%Y-%m-%d %H:%M:%S'), article_id)
)
conn.commit()
cursor.close()
conn.close()
logging.info(f"Artigo atualizado com URL: {ngrok_url}")
return True
except Exception as e:
logging.error(f"Erro ao atualizar artigo: {e}")
return False
# Loop principal
def main():
logging.info("Iniciando atualizador de URL do ngrok")
while True:
# Obter a URL atual do ngrok
ngrok_url = get_ngrok_url()
if ngrok_url:
# Atualizar o artigo no Joomla
update_joomla_article(ngrok_url)
# Verificar novamente após um intervalo
time.sleep(3600) # Verificar a cada hora
if __name__ == "__main__":
main()
Este script pode ser executado como um serviço adicional usando o NSSM, garantindo que seu iframe sempre use a URL correta do ngrok.
Limitações e Considerações
Limitações do Ngrok
O plano gratuito do ngrok tem algumas limitações importantes:
- URLs aleatórias que mudam sempre que o serviço é reiniciado
- Número limitado de conexões simultâneas
- Sem suporte para domínios personalizados (requer plano pago)
- Sessões expiram após algumas horas de inatividade
Para uso em produção, considere:
- Atualizar para um plano pago do ngrok
- Configurar adequadamente seu roteador/firewall para encaminhamento de portas
- Usar um serviço de DNS dinâmico como No-IP ou DynDNS
- Hospedar sua aplicação em um servidor web acessível publicamente
Segurança
Lembre-se que o ngrok torna sua aplicação acessível publicamente através da internet. Certifique-se de implementar medidas de segurança adequadas:
- Autenticação de usuários
- Limitação de taxa de requisições
- Validação de entradas
- Comunicação HTTPS
- Proteção contra vulnerabilidades comuns (CSRF, XSS, injeção SQL, etc.)
Com o ngrok configurado, sua aplicação Python agora está acessível tanto localmente quanto através da internet, permitindo testes e demonstrações para usuários externos. Na próxima seção, abordaremos a solução de problemas comuns que podem surgir durante este processo de integração.