Skip to content

Commit be278b5

Browse files
committed
cli-74
1 parent 8f44a43 commit be278b5

File tree

2 files changed

+45
-10
lines changed

2 files changed

+45
-10
lines changed

backend/apps/dev_combined.py

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
"""
1818

1919
import logging
20+
import os
2021
import modal
2122

2223
from shared.config import get_environment, get_secrets
@@ -37,10 +38,25 @@
3738
f"Current environment: {env}. Use separate apps for staging/prod."
3839
)
3940

40-
logger.info("Starting Combined Dev App - all services in one app for local iteration")
41+
# Get dev name prefix (required in dev mode to avoid naming conflicts)
42+
# Only validate locally - Modal containers re-import but don't need DEV_NAME
43+
# since the app name is already determined by the local import
44+
dev_name = os.environ.get("DEV_NAME")
45+
if not dev_name:
46+
if modal.is_local():
47+
raise ValueError(
48+
"DEV_NAME environment variable is required for dev mode. "
49+
"Run with: uv run dev <name>"
50+
)
51+
else:
52+
# Inside Modal container - use placeholder (app name already set)
53+
dev_name = "container"
54+
55+
app_name = f"{dev_name}-{env}-server"
56+
logger.info(f"Starting Combined Dev App '{app_name}' - all services in one app for local iteration")
4157

4258
app = modal.App(
43-
name=f"{env}-server",
59+
name=app_name,
4460
image=get_dev_image(),
4561
secrets=[get_secrets()]
4662
)

backend/cli.py

Lines changed: 27 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
"""CLI for serving Modal apps locally."""
22

3+
import os
34
import signal
45
import subprocess
56
import sys
@@ -31,16 +32,33 @@ def _prefix_output(process, name, color):
3132
def serve_all():
3233
"""
3334
Serve the combined dev app (all services in one).
34-
35+
3536
For local development, we use dev_combined.py which includes
3637
Server, Search, and Processing in a single Modal app.
3738
This allows hot-reload on all services without cross-app lookup issues.
39+
40+
Usage: uv run dev <name>
41+
42+
The name parameter is required and will prefix the Modal app name
43+
to avoid conflicts when multiple developers run dev instances.
3844
"""
39-
print("Starting combined dev app (all services in one)...\n")
40-
print(f" \033[32m●{RESET} dev-combined (server + search + processing)\n")
45+
if len(sys.argv) < 2:
46+
print("Error: Name parameter is required for dev mode.")
47+
print("Usage: uv run dev <name>")
48+
print("\nExample: uv run dev john")
49+
print("This creates a Modal app named 'john-dev-server'")
50+
sys.exit(1)
51+
52+
dev_name = sys.argv[1]
53+
54+
# Set environment variable for the Modal app to read
55+
os.environ["DEV_NAME"] = dev_name
56+
57+
print(f"Starting combined dev app for '{dev_name}'...\n")
58+
print(f" \033[32m●{RESET} {dev_name}-dev-server (server + search + processing)\n")
4159
print("Note: For staging/prod, deploy individual apps separately.\n")
4260
print("-" * 60 + "\n")
43-
61+
4462
# Run with color-coded output prefixing
4563
color = "\033[32m" # Green for combined dev app
4664
process = subprocess.Popen(
@@ -49,18 +67,19 @@ def serve_all():
4967
stderr=subprocess.STDOUT,
5068
text=True,
5169
bufsize=1,
70+
env={**os.environ, "DEV_NAME": dev_name},
5271
)
53-
72+
5473
# Handle graceful shutdown
5574
def signal_handler(sig, frame):
5675
process.terminate()
5776
sys.exit(0)
58-
77+
5978
signal.signal(signal.SIGINT, signal_handler)
6079
signal.signal(signal.SIGTERM, signal_handler)
61-
80+
6281
# Stream output with color prefix
63-
_prefix_output(process, "dev", color)
82+
_prefix_output(process, dev_name, color)
6483
process.wait()
6584

6685

0 commit comments

Comments
 (0)