File size: 2,785 Bytes
b83a9c1 | 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 | #!/usr/bin/env bash
# Create (or update) the RunPod template + serverless endpoint for an endpoint
# image built by build.sh. Idempotent-ish: reuses template/endpoint by name.
#
# ./deploy.sh qwen-edit-turbo v1
#
# Env: RUNPOD_API_KEY (required), DOCKER_HUB_USER (default plx1029),
# GPU_IDS (comma list, default all H100 80GB variants),
# WORKERS_MAX (default 2), IDLE_TIMEOUT (default 60s),
# CONTAINER_DISK_GB (default 20).
set -euo pipefail
ENDPOINT="${1:?endpoint name}"; VER="${2:?version}"
USER="${DOCKER_HUB_USER:-plx1029}"
IMAGE="docker.io/${USER}/comfyui-serverless:${ENDPOINT}-${VER}"
TPL_NAME="serverless-${ENDPOINT}-${VER}"
EP_NAME="serverless-${ENDPOINT}"
GPUS="${GPU_IDS:-NVIDIA H100 80GB HBM3,NVIDIA H100 PCIe,NVIDIA H100 NVL}"
API="https://rest.runpod.io/v1"
AUTH=(-H "Authorization: Bearer $RUNPOD_API_KEY" -H "Content-Type: application/json")
gpu_json=$(python3 -c "import json,sys;print(json.dumps(sys.argv[1].split(',')))" "$GPUS")
# ---- template ----
tpl_id=$(curl -s "${AUTH[@]}" "$API/templates" | python3 -c "
import json,sys
for t in json.load(sys.stdin):
if t.get('name')=='$TPL_NAME': print(t['id']); break")
if [ -z "$tpl_id" ]; then
tpl_id=$(curl -s "${AUTH[@]}" -X POST "$API/templates" -d "{
\"name\": \"$TPL_NAME\",
\"imageName\": \"$IMAGE\",
\"isServerless\": true,
\"containerDiskInGb\": ${CONTAINER_DISK_GB:-20},
\"env\": {}
}" | python3 -c "import json,sys;d=json.load(sys.stdin);print(d.get('id') or sys.exit(json.dumps(d)))")
echo "created template $tpl_id ($TPL_NAME -> $IMAGE)"
else
echo "template $tpl_id ($TPL_NAME) already exists"
fi
# ---- endpoint ----
ep_id=$(curl -s "${AUTH[@]}" "$API/endpoints" | python3 -c "
import json,sys
for e in json.load(sys.stdin):
if e.get('name')=='$EP_NAME': print(e['id']); break")
if [ -z "$ep_id" ]; then
ep_id=$(curl -s "${AUTH[@]}" -X POST "$API/endpoints" -d "{
\"name\": \"$EP_NAME\",
\"templateId\": \"$tpl_id\",
\"computeType\": \"GPU\",
\"gpuTypeIds\": $gpu_json,
\"gpuCount\": 1,
\"workersMin\": 0,
\"workersMax\": ${WORKERS_MAX:-2},
\"idleTimeout\": ${IDLE_TIMEOUT:-60},
\"flashboot\": true,
\"scalerType\": \"QUEUE_DELAY\",
\"scalerValue\": 4,
\"executionTimeoutMs\": 600000
}" | python3 -c "import json,sys;d=json.load(sys.stdin);print(d.get('id') or sys.exit(json.dumps(d)))")
echo "created endpoint $ep_id ($EP_NAME)"
else
echo "endpoint $ep_id ($EP_NAME) exists — pointing it at template $tpl_id"
curl -s "${AUTH[@]}" -X PATCH "$API/endpoints/$ep_id" -d "{\"templateId\": \"$tpl_id\"}" >/dev/null
fi
echo
echo "endpoint id: $ep_id"
echo " POST https://api.runpod.ai/v2/$ep_id/runsync"
|