97 lines
2.5 KiB
Bash
Executable file
97 lines
2.5 KiB
Bash
Executable file
#!/usr/bin/env bash
|
||
set -euo pipefail
|
||
|
||
ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
|
||
COMPOSE_FILE="${ROOT_DIR}/docker-compose.webapp-test.yml"
|
||
ENV_FILE="${ROOT_DIR}/.env"
|
||
PROJECT_NAME="fenya-webapp-test"
|
||
|
||
if [[ ! -f "${COMPOSE_FILE}" ]]; then
|
||
echo "Не найден ${COMPOSE_FILE}" >&2
|
||
exit 1
|
||
fi
|
||
|
||
if [[ ! -f "${ENV_FILE}" ]]; then
|
||
echo "Не найден ${ENV_FILE}" >&2
|
||
exit 1
|
||
fi
|
||
|
||
if ! grep -qE '^NGROK_AUTHTOKEN=' "${ENV_FILE}"; then
|
||
fallback_token="$(python - <<'PY'
|
||
import re
|
||
from pathlib import Path
|
||
|
||
p = Path("webapp/ngrok_tunnel.py")
|
||
if not p.exists():
|
||
print("")
|
||
raise SystemExit
|
||
txt = p.read_text(encoding="utf-8", errors="ignore")
|
||
m = re.search(r'auth_token\s*=\s*"([^"]+)"', txt)
|
||
print(m.group(1) if m else "")
|
||
PY
|
||
)"
|
||
if [[ -n "${fallback_token}" ]]; then
|
||
printf '\nNGROK_AUTHTOKEN=%s\n' "${fallback_token}" >> "${ENV_FILE}"
|
||
echo "Добавил NGROK_AUTHTOKEN в .env из webapp/ngrok_tunnel.py"
|
||
else
|
||
echo "NGROK_AUTHTOKEN не найден. Добавь в .env строку NGROK_AUTHTOKEN=..." >&2
|
||
exit 1
|
||
fi
|
||
fi
|
||
|
||
cd "${ROOT_DIR}"
|
||
docker compose -p "${PROJECT_NAME}" -f "${COMPOSE_FILE}" up -d --build
|
||
|
||
echo "Жду инициализацию ngrok..."
|
||
public_url=""
|
||
for _ in $(seq 1 45); do
|
||
public_url="$(python - <<'PY'
|
||
import json
|
||
import urllib.request
|
||
|
||
try:
|
||
with urllib.request.urlopen("http://127.0.0.1:4041/api/tunnels", timeout=2) as resp:
|
||
data = json.load(resp)
|
||
tunnels = data.get("tunnels", [])
|
||
for t in tunnels:
|
||
url = str(t.get("public_url", ""))
|
||
if url.startswith("https://"):
|
||
print(url)
|
||
break
|
||
except Exception:
|
||
pass
|
||
PY
|
||
)"
|
||
if [[ -n "${public_url}" ]]; then
|
||
break
|
||
fi
|
||
sleep 1
|
||
done
|
||
|
||
if [[ -z "${public_url}" ]]; then
|
||
echo "Не удалось получить ngrok URL. Проверь логи: docker logs fenyabot-ngrok-test" >&2
|
||
exit 1
|
||
fi
|
||
|
||
python - <<'PY' "${ENV_FILE}" "${public_url}"
|
||
import re
|
||
import sys
|
||
from pathlib import Path
|
||
|
||
env_path = Path(sys.argv[1])
|
||
url = sys.argv[2]
|
||
text = env_path.read_text(encoding="utf-8")
|
||
if re.search(r"^WEBAPP_URL=.*$", text, flags=re.MULTILINE):
|
||
text = re.sub(r"^WEBAPP_URL=.*$", f"WEBAPP_URL={url}", text, flags=re.MULTILINE)
|
||
else:
|
||
text = text.rstrip() + f"\nWEBAPP_URL={url}\n"
|
||
env_path.write_text(text, encoding="utf-8")
|
||
PY
|
||
|
||
echo
|
||
echo "Готово."
|
||
echo "NGROK URL: ${public_url}"
|
||
echo "WEBAPP_URL обновлён в .env"
|
||
echo
|
||
echo "Для остановки тест-контура:"
|
||
echo " docker compose -p ${PROJECT_NAME} -f ${COMPOSE_FILE} down"
|