-
Notifications
You must be signed in to change notification settings - Fork 3
/
Copy pathstart_server.py
154 lines (123 loc) · 4.39 KB
/
start_server.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
import logging
import argparse
import os
import signal
import sys
import json
from pathlib import Path
from comfydock_server.config import ServerConfig
from comfydock_server.server import ComfyDockServer
def parse_str_with_default(default):
def inner(value):
if value.startswith("{{env.") and value.endswith("}}"):
return default
return value
return inner
def parse_int_with_default(default):
def inner(value):
try:
return int(value)
except ValueError:
# If the value looks like a templated env variable, return the default.
if value.startswith("{{env.") and value.endswith("}}"):
return default
# Otherwise, let argparse complain.
raise argparse.ArgumentTypeError(f"Invalid int value: {value}")
return inner
def parse_bool_with_default(default):
def inner(value):
# Allow actual bools (if passed from code) or strings.
if isinstance(value, bool):
return value
val = value.lower()
if val in ["true", "1", "yes"]:
return True
elif val in ["false", "0", "no"]:
return False
elif value.startswith("{{env.") and value.endswith("}}"):
return default
else:
raise argparse.ArgumentTypeError(f"Invalid bool value: {value}")
return inner
def parse_args(config_data):
parser = argparse.ArgumentParser(
description="Start ComfyDock Server with custom configuration."
)
parser.add_argument(
"--db-file-path",
type=parse_str_with_default(config_data["defaults"]["db_file_path"]),
help="Path to environments database file",
)
parser.add_argument(
"--user-settings-file-path",
type=parse_str_with_default(config_data["defaults"]["user_settings_file_path"]),
help="Path to user settings file",
)
parser.add_argument(
"--frontend-host-port",
type=parse_int_with_default(config_data["frontend"]["default_host_port"]),
help="Frontend host port",
)
parser.add_argument(
"--allow-multiple-containers",
type=parse_bool_with_default(config_data["defaults"]["allow_multiple_containers"]),
help="Allow running multiple containers",
)
return parser.parse_args()
def signal_handler(signum, frame):
print(f"\nReceived signal {signum}. Shutting down gracefully...")
if "server" in globals():
print("Stopping server...")
server.stop()
sys.exit(0)
def load_config():
config_path = Path(__file__).parent / "config.json"
try:
with open(config_path) as f:
return json.load(f)
except FileNotFoundError:
print(f"Configuration file not found at {config_path}")
return {}
def setup_logging(logging_config):
logging.config.dictConfig(logging_config)
def run():
config_data = load_config()
args = parse_args(config_data)
setup_logging(config_data["logging"])
# Create configuration with default values
config = ServerConfig(
comfyui_path=os.getcwd(),
db_file_path=args.db_file_path or config_data["defaults"]["db_file_path"],
user_settings_file_path=args.user_settings_file_path
or config_data["defaults"]["user_settings_file_path"],
frontend_image=config_data["frontend"]["image"],
frontend_container_port=config_data["frontend"]["container_port"],
frontend_host_port=args.frontend_host_port
or config_data["frontend"]["default_host_port"],
backend_port=config_data["backend"]["port"],
backend_host=config_data["backend"]["host"],
allow_multiple_containers=(
args.allow_multiple_containers
if args.allow_multiple_containers is not None
else config_data["defaults"]["allow_multiple_containers"]
),
)
# Initialize server
server = ComfyDockServer(config)
# Register signal handlers
signal.signal(signal.SIGINT, signal_handler)
signal.signal(signal.SIGTERM, signal_handler)
try:
print("Starting server...")
server.start()
# Keep server running
while True:
try:
input("")
except KeyboardInterrupt:
signal_handler(signal.SIGINT, None)
finally:
print("Stopping server...")
server.stop()
if __name__ == "__main__":
run()