commit ba69c6357c4429d58537d3aa7fe92ba8ec7696b0 Author: qornwh1 Date: Wed Feb 25 15:11:33 2026 +0900 Chore: project init diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..e6b4798 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +*.safetensors \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..f5f1be3 --- /dev/null +++ b/README.md @@ -0,0 +1,93 @@ +# ComfyUI - Skybox 이미지 생성 환경 + +게임용 360° Skybox 이미지를 생성하기 위한 ComfyUI Docker 환경입니다. + +--- + +## 워크플로우 + +| 파일 | 설명 | +|------|------| +| `workflows/skybox360_v1.0.0.json` | 게임용 Skybox 이미지 생성 워크플로우 | + +--- + +## 설치 및 실행 + +### 사전 조건 +- Docker 및 Docker Compose 설치 +- NVIDIA GPU 및 NVIDIA Container Toolkit 설치 +- sdxl_360_diffusion.safetensors 체크포인트 파일 다운로드 필요 (https://huggingface.co/ProGamerGov/sdxl-360-diffusion) +- SkyboxV1.safetensors 로라 파일 다운로드 필요 (https://civitai.com/models/81168/skybox) +- 다운로드 후 디렉토리 구조를 참고하여 위치에 파일을 배치 +- 필요시 모델 교체 + +### 설치 + +```bash +docker compose pull +``` + +### 실행 (백그라운드) + +```bash +docker compose up -d +``` + +### 종료 + +```bash +docker compose down +``` + +--- + +## 접속 방법 + +### 1단계 — 서비스 포털 로그인 (포트 1111) + +브라우저에서 아래 주소로 접속 후 로그인합니다. + +``` +http://localhost:1111 +``` + +| 항목 | 값 | +|------|----| +| ID | `myname` | +| PW | `mypassword123` | + +### 2단계 — ComfyUI 이동 (포트 8188) + +로그인 후 아래 주소로 이동하면 ComfyUI 화면이 열립니다. + +``` +http://localhost:8188 +``` + +--- + +## 워크플로우 사용 방법 + +1. ComfyUI 화면 우측 상단 메뉴 → **Browse templates** 또는 직접 `workflows/skybox360_v1.0.0.json` 파일을 불러옵니다. +2. 원하는 프롬프트 및 설정을 조정합니다. (긍정, 부정 프롬프트 입력) +3. 화면 우측의 **Queue** 버튼을 클릭하면 이미지 생성이 시작됩니다. + +> **참고:** 메뉴 위치는 None으로 설정되어 있습니다.(Top으로 바꾸는게 보기가 좋습니다) 설정 변경이 필요할 경우 우측 상단 톱니바퀴(⚙) 아이콘 → Menu Position에서 조정할 수 있습니다. + +--- + +## 디렉토리 구조 + +``` +comfyui/ +├── docker-compose.yml # Docker 실행 설정 +├── workflows/ +│ └── skybox360_v1.0.0.json # Skybox 생성 워크플로우 +├── workspace/ +│ └── ComfyUI/ +│ └── models/ +│ ├── checkpoints/ # 체크포인트 모델 +│ └── loras/ # LoRA 모델 +└── README.md +``` diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..b85082d --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,27 @@ +version: '3.8' + +services: + comfyui: + image: ghcr.io/ai-dock/comfyui:latest-cuda + container_name: comfyui_server + ports: + - "8188:8188" # 기본 접속 + - "1111:1111" # 서비스 포털 (관리 화면) + - "18188:18188" # 실제 프로세스 포트 + deploy: + resources: + reservations: + devices: + - driver: nvidia + count: all + capabilities: [gpu] + volumes: + - ./workspace/ComfyUI/models/checkpoints:/opt/ComfyUI/models/checkpoints + - ./workspace/ComfyUI/models/loras:/opt/ComfyUI/models/loras + - ./workspace/storage:/opt/storage + environment: + - CLI_ARGS=--listen 0.0.0.0 --port 8188 + - DIRECT_ADDRESS=127.0.0.1 + - WEB_USER=myname + - WEB_PASSWORD=mypassword123 + restart: unless-stopped \ No newline at end of file diff --git a/workflows/skybox360_v1.0.0.json b/workflows/skybox360_v1.0.0.json new file mode 100644 index 0000000..893c513 --- /dev/null +++ b/workflows/skybox360_v1.0.0.json @@ -0,0 +1,492 @@ +{ + "id": "8c2f481c-625a-4772-b414-fef116772eed", + "revision": 0, + "last_node_id": 9, + "last_link_id": 17, + "nodes": [ + { + "id": 3, + "type": "CLIPTextEncode", + "pos": [ + -266.5776077305407, + 174.6998710597806 + ], + "size": [ + 400, + 200 + ], + "flags": {}, + "order": 4, + "mode": 0, + "inputs": [ + { + "name": "clip", + "type": "CLIP", + "link": 16 + } + ], + "outputs": [ + { + "name": "CONDITIONING", + "type": "CONDITIONING", + "links": [ + 5 + ] + } + ], + "title": "Positive Prompt", + "properties": { + "Node name for S&R": "CLIPTextEncode" + }, + "widgets_values": [ + "360 panorama, equirectangular, (futuristic megalopolis:1.3), towering skyscrapers reaching the clouds, advanced urban architecture, flying vehicles, vibrant neon lights, busy city life, nighttime, (cyberpunk aesthetic:1.2), seamless, photorealistic, 8k resolution, cinematic lighting, ultra detailed" + ], + "color": "#232", + "bgcolor": "#353" + }, + { + "id": 2, + "type": "KSampler", + "pos": [ + 265.26466459515734, + 90.975202467434 + ], + "size": [ + 270, + 262 + ], + "flags": {}, + "order": 6, + "mode": 0, + "inputs": [ + { + "name": "model", + "type": "MODEL", + "link": 14 + }, + { + "name": "positive", + "type": "CONDITIONING", + "link": 5 + }, + { + "name": "negative", + "type": "CONDITIONING", + "link": 6 + }, + { + "name": "latent_image", + "type": "LATENT", + "link": 9 + } + ], + "outputs": [ + { + "name": "LATENT", + "type": "LATENT", + "links": [ + 10 + ] + } + ], + "properties": { + "Node name for S&R": "KSampler" + }, + "widgets_values": [ + 90652639393558, + "randomize", + 25, + 8, + "euler", + "simple", + 1 + ] + }, + { + "id": 8, + "type": "VAEDecodeTiled", + "pos": [ + 587.0831482170611, + 105.73660366521936 + ], + "size": [ + 270, + 150 + ], + "flags": {}, + "order": 7, + "mode": 0, + "inputs": [ + { + "name": "samples", + "type": "LATENT", + "link": 10 + }, + { + "name": "vae", + "type": "VAE", + "link": 11 + } + ], + "outputs": [ + { + "name": "IMAGE", + "type": "IMAGE", + "links": [ + 12 + ] + } + ], + "properties": { + "Node name for S&R": "VAEDecodeTiled" + }, + "widgets_values": [ + 512, + 64, + 64, + 8 + ] + }, + { + "id": 9, + "type": "LoraLoader", + "pos": [ + -573.3163306123124, + -62.99459364441078 + ], + "size": [ + 270, + 126 + ], + "flags": {}, + "order": 3, + "mode": 0, + "inputs": [ + { + "name": "model", + "type": "MODEL", + "link": 13 + }, + { + "name": "clip", + "type": "CLIP", + "link": 15 + } + ], + "outputs": [ + { + "name": "MODEL", + "type": "MODEL", + "links": [ + 14 + ] + }, + { + "name": "CLIP", + "type": "CLIP", + "links": [ + 16, + 17 + ] + } + ], + "properties": { + "Node name for S&R": "LoraLoader" + }, + "widgets_values": [ + "SkyboxV1.safetensors", + 1, + 1 + ] + }, + { + "id": 4, + "type": "VAEDecode", + "pos": [ + 960.4787096468392, + -124.73440762022136 + ], + "size": [ + 140, + 46 + ], + "flags": {}, + "order": 0, + "mode": 0, + "inputs": [ + { + "name": "samples", + "type": "LATENT", + "link": null + }, + { + "name": "vae", + "type": "VAE", + "link": null + } + ], + "outputs": [ + { + "name": "IMAGE", + "type": "IMAGE", + "links": [] + } + ], + "properties": { + "Node name for S&R": "VAEDecode" + }, + "widgets_values": [] + }, + { + "id": 7, + "type": "EmptyLatentImage", + "pos": [ + -870.1116369256109, + 222.80535972156463 + ], + "size": [ + 270, + 106 + ], + "flags": {}, + "order": 1, + "mode": 0, + "inputs": [], + "outputs": [ + { + "name": "LATENT", + "type": "LATENT", + "links": [ + 9 + ] + } + ], + "properties": { + "Node name for S&R": "EmptyLatentImage" + }, + "widgets_values": [ + 2048, + 1024, + 1 + ] + }, + { + "id": 6, + "type": "SaveImage", + "pos": [ + 586.5284890751892, + 317.7512366359076 + ], + "size": [ + 270, + 270 + ], + "flags": {}, + "order": 8, + "mode": 0, + "inputs": [ + { + "name": "images", + "type": "IMAGE", + "link": 12 + } + ], + "outputs": [], + "properties": {}, + "widgets_values": [ + "Image360" + ] + }, + { + "id": 5, + "type": "CLIPTextEncode", + "pos": [ + -266.38617988178174, + 426.43051789958037 + ], + "size": [ + 400, + 200 + ], + "flags": { + "collapsed": false + }, + "order": 5, + "mode": 0, + "inputs": [ + { + "name": "clip", + "type": "CLIP", + "link": 17 + } + ], + "outputs": [ + { + "name": "CONDITIONING", + "type": "CONDITIONING", + "links": [ + 6 + ] + } + ], + "title": "Negative Prompt", + "properties": { + "Node name for S&R": "CLIPTextEncode" + }, + "widgets_values": [ + "seam, visible line, blur, distortion, low resolution, ugly, ancient, rural, nature, water, trees, text, watermark, out of focus" + ], + "color": "#322", + "bgcolor": "#533" + }, + { + "id": 1, + "type": "CheckpointLoaderSimple", + "pos": [ + -871.4772569789588, + 69.00680820295105 + ], + "size": [ + 270, + 98 + ], + "flags": {}, + "order": 2, + "mode": 0, + "inputs": [], + "outputs": [ + { + "name": "MODEL", + "type": "MODEL", + "links": [ + 13 + ] + }, + { + "name": "CLIP", + "type": "CLIP", + "links": [ + 15 + ] + }, + { + "name": "VAE", + "type": "VAE", + "links": [ + 11 + ] + } + ], + "properties": { + "Node name for S&R": "CheckpointLoaderSimple" + }, + "widgets_values": [ + "sdxl_360_diffusion.safetensors" + ] + } + ], + "links": [ + [ + 5, + 3, + 0, + 2, + 1, + "CONDITIONING" + ], + [ + 6, + 5, + 0, + 2, + 2, + "CONDITIONING" + ], + [ + 9, + 7, + 0, + 2, + 3, + "LATENT" + ], + [ + 10, + 2, + 0, + 8, + 0, + "LATENT" + ], + [ + 11, + 1, + 2, + 8, + 1, + "VAE" + ], + [ + 12, + 8, + 0, + 6, + 0, + "IMAGE" + ], + [ + 13, + 1, + 0, + 9, + 0, + "MODEL" + ], + [ + 14, + 9, + 0, + 2, + 0, + "MODEL" + ], + [ + 15, + 1, + 1, + 9, + 1, + "CLIP" + ], + [ + 16, + 9, + 1, + 3, + 0, + "CLIP" + ], + [ + 17, + 9, + 1, + 5, + 0, + "CLIP" + ] + ], + "groups": [], + "config": {}, + "extra": { + "workflowRendererVersion": "LG", + "ds": { + "scale": 0.9621899440109732, + "offset": [ + 971.5551054739246, + 262.79673218780925 + ] + }, + "frontendVersion": "1.38.14" + }, + "version": 0.4 +} \ No newline at end of file