| #!/bin/bash |
| set -Eeuo pipefail |
| set -x |
|
|
| COMFY_DIR="${COMFY_DIR:-/root/ComfyUI}" |
| COMFY_URL="${COMFY_URL:-http://127.0.0.1:8188}" |
| |
| |
| NEMOFLIX_API_URL="${NEMOFLIX_API_URL:-}" |
| HF_BASE_FLUX2="https://huggingface.co/Comfy-Org/flux2-dev/resolve/main/split_files" |
| HF_BASE_Z_IMAGE="https://huggingface.co/Comfy-Org/z_image_turbo/resolve/main/split_files" |
| RUN_IMAGE_STACK_TEST="${RUN_IMAGE_STACK_TEST:-0}" |
| IMAGE_STACK_TEST_PROMPT="${IMAGE_STACK_TEST_PROMPT:-realistic social media creator photo, confident person filming lifestyle content, modern studio setup, smartphone camera, soft natural light, polished Instagram aesthetic}" |
| IMAGE_STACK_TEST_CHECKPOINT="${IMAGE_STACK_TEST_CHECKPOINT:-latest}" |
|
|
| mkdir -p \ |
| "$COMFY_DIR/models/diffusion_models" \ |
| "$COMFY_DIR/models/loras/nemoflix-amd" \ |
| "$COMFY_DIR/models/text_encoders" \ |
| "$COMFY_DIR/models/vae" |
|
|
| download_if_missing() { |
| local url="$1" |
| local dest="$2" |
| if [ -s "$dest" ]; then |
| echo "exists: $dest" |
| return 0 |
| fi |
| mkdir -p "$(dirname "$dest")" |
| wget -q --show-progress "$url" -O "$dest.tmp" |
| test -s "$dest.tmp" |
| mv "$dest.tmp" "$dest" |
| } |
|
|
| |
| |
| download_if_missing "$HF_BASE_FLUX2/diffusion_models/flux2_dev_fp8mixed.safetensors" "$COMFY_DIR/models/diffusion_models/flux2_dev_fp8mixed.safetensors" |
| download_if_missing "$HF_BASE_FLUX2/vae/flux2-vae.safetensors" "$COMFY_DIR/models/vae/flux2-vae.safetensors" |
| download_if_missing "$HF_BASE_FLUX2/text_encoders/mistral_3_small_flux2_bf16.safetensors" "$COMFY_DIR/models/text_encoders/mistral_3_small_flux2_bf16.safetensors" |
| download_if_missing "$HF_BASE_Z_IMAGE/text_encoders/qwen_3_4b.safetensors" "$COMFY_DIR/models/text_encoders/qwen_3_4b.safetensors" |
|
|
| if command -v systemctl >/dev/null 2>&1 && systemctl list-unit-files comfyui.service >/dev/null 2>&1; then |
| systemctl restart comfyui.service |
| fi |
|
|
| for i in {1..60}; do |
| if curl -sS --max-time 5 "$COMFY_URL/system_stats" >/dev/null; then |
| break |
| fi |
| echo "Waiting for ComfyUI API... ($i/60)" |
| sleep 5 |
| done |
|
|
| curl -sS --max-time 10 "$COMFY_URL/system_stats" |
| curl -sS --max-time 10 "$COMFY_URL/models/diffusion_models" |
| curl -sS --max-time 10 "$COMFY_URL/models/text_encoders" |
| curl -sS --max-time 10 "$COMFY_URL/models/vae" |
| curl -sS --max-time 10 "$COMFY_URL/models/loras" |
|
|
| if [ -n "$NEMOFLIX_API_URL" ]; then |
| curl -sS --max-time 10 "$NEMOFLIX_API_URL/api/health" |
| fi |
|
|
| if [ "$RUN_IMAGE_STACK_TEST" = "1" ]; then |
| if [ -z "$NEMOFLIX_API_URL" ]; then |
| echo "ERROR: RUN_IMAGE_STACK_TEST=1 requires NEMOFLIX_API_URL pointing at the VPS control-plane API." |
| exit 1 |
| fi |
| curl -sS -X POST "$NEMOFLIX_API_URL/api/lora-training/generate" \ |
| -H "Content-Type: application/json" \ |
| -d "{\"checkpoint\":\"${IMAGE_STACK_TEST_CHECKPOINT}\",\"prompt\":\"${IMAGE_STACK_TEST_PROMPT}\",\"submit\":false}" |
| fi |
|
|
| echo "FLUX.2 image stack installed" |
|
|