@@ -18,10 +18,14 @@ API_PORT="${DOCKER_GIT_API_PORT:-3334}"
1818API_HOST=" ${DOCKER_GIT_API_BIND_HOST:- 127.0.0.1} "
1919API_BASE_URL=" http://127.0.0.1:${API_PORT} "
2020DOCKER_CMD=()
21+ PARSED_ARGS=()
22+ CONTROLLER_CPU_LIMIT=" ${DOCKER_GIT_CONTROLLER_CPUS:- } "
23+ CONTROLLER_RAM_LIMIT=" ${DOCKER_GIT_CONTROLLER_MEMORY:- } "
24+ CONTROLLER_PIDS_LIMIT=" ${DOCKER_GIT_CONTROLLER_PIDS:- } "
2125
2226usage () {
2327 cat << 'USAGE '
24- Usage: ./ctl <command>
28+ Usage: ./ctl <command> [controller options]
2529
2630Controller:
2731 up Build and start the API controller
4145 ./ctl request POST /projects '{"repoUrl":"https://github.com/org/repo.git"}'
4246 ./ctl request POST /projects/<projectId>/up
4347
48+ Controller options:
49+ --cpu, --cpus, --controller-cpu <value> CPU cap intent, percent or cores (default: 90%)
50+ --ram, --memory, --controller-ram <value> RAM cap intent, percent or size (default: 90%)
51+ --pids, --controller-pids <n> PID cap (default: 4096)
52+
4453USAGE
4554}
4655
@@ -62,6 +71,76 @@ prepare_controller_revision() {
6271 export DOCKER_GIT_CONTROLLER_REV=" $revision "
6372}
6473
74+ parse_controller_limit_args () {
75+ while [[ $# -gt 0 ]]; do
76+ case " $1 " in
77+ --cpu|--cpus|--controller-cpu|--controller-cpus)
78+ if [[ $# -lt 2 ]]; then
79+ echo " Missing value for option: $1 " >&2
80+ exit 1
81+ fi
82+ CONTROLLER_CPU_LIMIT=" $2 "
83+ shift 2
84+ ;;
85+ --cpu=* |--cpus=* |--controller-cpu=* |--controller-cpus=* )
86+ CONTROLLER_CPU_LIMIT=" ${1#* =} "
87+ shift
88+ ;;
89+ --ram|--memory|--controller-ram|--controller-memory)
90+ if [[ $# -lt 2 ]]; then
91+ echo " Missing value for option: $1 " >&2
92+ exit 1
93+ fi
94+ CONTROLLER_RAM_LIMIT=" $2 "
95+ shift 2
96+ ;;
97+ --ram=* |--memory=* |--controller-ram=* |--controller-memory=* )
98+ CONTROLLER_RAM_LIMIT=" ${1#* =} "
99+ shift
100+ ;;
101+ --pids|--controller-pids)
102+ if [[ $# -lt 2 ]]; then
103+ echo " Missing value for option: $1 " >&2
104+ exit 1
105+ fi
106+ CONTROLLER_PIDS_LIMIT=" $2 "
107+ shift 2
108+ ;;
109+ --pids=* |--controller-pids=* )
110+ CONTROLLER_PIDS_LIMIT=" ${1#* =} "
111+ shift
112+ ;;
113+ * )
114+ PARSED_ARGS+=(" $1 " )
115+ shift
116+ ;;
117+ esac
118+ done
119+ }
120+
121+ prepare_controller_resource_limits () {
122+ local env_output
123+ env_output=" $(
124+ DOCKER_GIT_CONTROLLER_CPUS=" $CONTROLLER_CPU_LIMIT " \
125+ DOCKER_GIT_CONTROLLER_MEMORY=" $CONTROLLER_RAM_LIMIT " \
126+ DOCKER_GIT_CONTROLLER_PIDS=" $CONTROLLER_PIDS_LIMIT " \
127+ bun --cwd " $ROOT /packages/app" scripts/print-controller-resource-env.ts
128+ ) "
129+
130+ local key
131+ local value
132+ while IFS=' =' read -r key value; do
133+ if [[ -z " $key " ]]; then
134+ continue
135+ fi
136+ case " $key " in
137+ DOCKER_GIT_CONTROLLER_CPUS|DOCKER_GIT_CONTROLLER_MEMORY|DOCKER_GIT_CONTROLLER_PIDS)
138+ export " $key =$value "
139+ ;;
140+ esac
141+ done <<< " $env_output"
142+ }
143+
65144require_running () {
66145 if ! " ${DOCKER_CMD[@]} " ps --format ' {{.Names}}' | grep -Fxq " $CONTAINER_NAME " ; then
67146 echo " Controller is not running. Start it with: ./ctl up" >&2
@@ -192,8 +271,12 @@ resolve_docker_cmd() {
192271
193272resolve_docker_cmd
194273
274+ parse_controller_limit_args " $@ "
275+ set -- " ${PARSED_ARGS[@]} "
276+
195277case " ${1:- } " in
196278 up)
279+ prepare_controller_resource_limits
197280 prepare_controller_revision
198281 compose up -d --build
199282 wait_for_health
@@ -209,6 +292,7 @@ case "${1:-}" in
209292 compose logs -f --tail=200
210293 ;;
211294 restart)
295+ prepare_controller_resource_limits
212296 prepare_controller_revision
213297 compose up -d --build --force-recreate
214298 wait_for_health
0 commit comments