ryota commited on
Commit
34b6a6d
·
1 Parent(s): d1ee284

Spaces では 0.0.0.0 で待ち受ける

Browse files

Docker 版は Dockerfile で HOST=0.0.0.0 を渡していたが、Gradio SDK には
Dockerfile が無いためその指定が消え、127.0.0.1 のまま起動していた。
外側の入口からコンテナ内へ届かず RUNTIME_ERROR になる。

自分のPCでは 127.0.0.1 のまま(外から入れない状態を保つ)。

- spaces の読み込み失敗も握るようにした(環境によっては ImportError 以外も出る)

Files changed (2) hide show
  1. app.py +15 -2
  2. tests/test_app.py +14 -0
app.py CHANGED
@@ -29,10 +29,12 @@ try:
29
  import spaces # type: ignore
30
 
31
  HAS_SPACES = True
32
- except ImportError: # 自分のPCで動かす
33
  spaces = None
34
  HAS_SPACES = False
35
 
 
 
36
  ON_ZERO_GPU = HAS_SPACES and os.environ.get("SPACES_ZERO_GPU") is not None
37
  GPU_DEVICE = "cuda" if ON_ZERO_GPU else ""
38
 
@@ -405,10 +407,21 @@ with gr.Blocks(title="商談文字起こし") as demo:
405
  component.change(remember, inputs=settings, outputs=saved)
406
 
407
 
 
 
 
 
 
 
 
 
 
 
 
408
  if __name__ == "__main__":
409
  password = os.environ.get("APP_PASSWORD")
410
  demo.launch(
411
- server_name=os.environ.get("HOST", "127.0.0.1"),
412
  server_port=int(os.environ.get("PORT", "7860")),
413
  auth=(os.environ.get("APP_USER", "spin"), password) if password else None,
414
  allowed_paths=[str(WORK_ROOT)],
 
29
  import spaces # type: ignore
30
 
31
  HAS_SPACES = True
32
+ except Exception: # 自分のPCには無い。Spaces も環境次第で読めないこがある
33
  spaces = None
34
  HAS_SPACES = False
35
 
36
+ ON_SPACES = os.environ.get("SPACE_ID") is not None
37
+
38
  ON_ZERO_GPU = HAS_SPACES and os.environ.get("SPACES_ZERO_GPU") is not None
39
  GPU_DEVICE = "cuda" if ON_ZERO_GPU else ""
40
 
 
407
  component.change(remember, inputs=settings, outputs=saved)
408
 
409
 
410
+ def listen_on() -> str:
411
+ """待ち受け先。
412
+
413
+ 自分のPCでは 127.0.0.1(外から入れない)。Spaces では外側の入口から
414
+ コンテナ内へ届かないと起動失敗になるので 0.0.0.0 にする。
415
+ """
416
+ if os.environ.get("HOST"):
417
+ return os.environ["HOST"]
418
+ return "0.0.0.0" if ON_SPACES else "127.0.0.1"
419
+
420
+
421
  if __name__ == "__main__":
422
  password = os.environ.get("APP_PASSWORD")
423
  demo.launch(
424
+ server_name=listen_on(),
425
  server_port=int(os.environ.get("PORT", "7860")),
426
  auth=(os.environ.get("APP_USER", "spin"), password) if password else None,
427
  allowed_paths=[str(WORK_ROOT)],
tests/test_app.py CHANGED
@@ -109,3 +109,17 @@ def test_GPUの飾りは環境で切り替わる():
109
 
110
  if not web.ON_ZERO_GPU:
111
  assert web.on_gpu(plain) is plain
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
109
 
110
  if not web.ON_ZERO_GPU:
111
  assert web.on_gpu(plain) is plain
112
+
113
+
114
+ def test_待ち受け先は環境で変わる(monkeypatch):
115
+ """Spaces で 127.0.0.1 のままだと外から届かず起動に失敗する。"""
116
+ monkeypatch.delenv("HOST", raising=False)
117
+
118
+ monkeypatch.setattr(web, "ON_SPACES", False)
119
+ assert web.listen_on() == "127.0.0.1" # 自分のPCでは外に開かない
120
+
121
+ monkeypatch.setattr(web, "ON_SPACES", True)
122
+ assert web.listen_on() == "0.0.0.0" # Spaces では外から届くように
123
+
124
+ monkeypatch.setenv("HOST", "1.2.3.4")
125
+ assert web.listen_on() == "1.2.3.4" # 指定があればそれに従う