# UNIARE v4 프로덕션 스택 (NAS Docker) # 사용: docker compose -f docker-compose.prod.yml up -d --build # # 정적 파일(HTML, images, datas)은 필요한 경로만 read-only 마운트 — 카드/이미지 추가 시 재빌드 불필요 services: uniare-api: build: ./api container_name: uniare-api restart: unless-stopped expose: - "3000" environment: - PORT=3000 - JWT_SECRET=${JWT_SECRET} - JWT_EXPIRES=${JWT_EXPIRES:-7d} - ADMIN_EMAIL=${ADMIN_EMAIL} - ADMIN_PASSWORD=${ADMIN_PASSWORD} - ADMIN_USERNAME=${ADMIN_USERNAME:-admin} - CORS_ORIGINS=${CORS_ORIGINS:-*} - PREVIEWS_PATH=/data/previews - AVATARS_PATH=/data/avatars - DB_PATH=/data/uadeck.db - DATAS_PATH=/datas volumes: - uniare-data:/data - ./datas:/datas:ro - ./api/data/previews:/data/previews - ./api/data/avatars:/data/avatars healthcheck: test: ["CMD-SHELL", "node -e \"fetch('http://127.0.0.1:3000/api/v1/health').then(r=>process.exit(r.ok?0:1)).catch(()=>process.exit(1))\""] interval: 30s timeout: 10s retries: 3 start_period: 15s uniare-web: build: context: . dockerfile: nginx/Dockerfile image: uniare-web:latest container_name: uniare-web restart: unless-stopped ports: - "${WEB_PORT:-44082}:80" volumes: - ./index.html:/usr/share/nginx/html/index.html:ro - ./cardList.html:/usr/share/nginx/html/cardList.html:ro - ./result.html:/usr/share/nginx/html/result.html:ro - ./login.html:/usr/share/nginx/html/login.html:ro - ./signup.html:/usr/share/nginx/html/signup.html:ro - ./deckHistory.html:/usr/share/nginx/html/deckHistory.html:ro - ./preset.html:/usr/share/nginx/html/preset.html:ro - ./profile.html:/usr/share/nginx/html/profile.html:ro - ./admin.html:/usr/share/nginx/html/admin.html:ro - ./favicon.ico:/usr/share/nginx/html/favicon.ico:ro - ./script:/usr/share/nginx/html/script:ro - ./style:/usr/share/nginx/html/style:ro - ./i18n:/usr/share/nginx/html/i18n:ro - ./datas:/usr/share/nginx/html/datas:ro - ./images:/usr/share/nginx/html/images:ro - ./nginx/default.conf:/etc/nginx/conf.d/default.conf:ro depends_on: uniare-api: condition: service_healthy volumes: uniare-data: