name: stylist services: mysql: image: mysql:8.0 command: --default-authentication-plugin=mysql_native_password restart: unless-stopped environment: MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD:-123456} MYSQL_DATABASE: ${MYSQL_DATABASE:-aitori_stylist} volumes: - mysql-data:/var/lib/mysql healthcheck: test: ["CMD-SHELL", "mysqladmin ping -h 127.0.0.1 -uroot -p$${MYSQL_ROOT_PASSWORD} --silent"] interval: 5s timeout: 3s retries: 30 redis: image: redis:7-alpine command: ["redis-server", "--requirepass", "${REDIS_PASSWORD:-123456}"] restart: unless-stopped environment: REDIS_PASSWORD: ${REDIS_PASSWORD:-123456} volumes: - redis-data:/data healthcheck: test: ["CMD-SHELL", "redis-cli -a $${REDIS_PASSWORD:-123456} ping | grep PONG"] interval: 5s timeout: 3s retries: 30 backend: image: ${REGISTRY:-ghcr.io/gyj2032-byte}/${IMAGE_PREFIX:-stylist}-backend:${IMAGE_TAG:-latest} restart: unless-stopped environment: PORT: 3000 APP_BASE_URL: ${APP_BASE_URL:-http://localhost:8080} DATABASE_URL: mysql://root:${MYSQL_ROOT_PASSWORD:-123456}@mysql:3306/${MYSQL_DATABASE:-aitori_stylist} REDIS_URL: redis://:${REDIS_PASSWORD:-123456}@redis:6379 JWT_SECRET: ${JWT_SECRET:-replace-me} JWT_EXPIRES_IN: ${JWT_EXPIRES_IN:-7d} INITIAL_STYLIST_ID: ${INITIAL_STYLIST_ID:-1} INITIAL_STYLIST_USERNAME: ${INITIAL_STYLIST_USERNAME:-Ogawa} INITIAL_STYLIST_EMAIL: ${INITIAL_STYLIST_EMAIL:-stylist@example.com} INITIAL_STYLIST_PASSWORD: ${INITIAL_STYLIST_PASSWORD:-Passw0rd!} CORS_ORIGIN: ${CORS_ORIGIN:-http://localhost:8080} NODE_ENV: production STORAGE_DRIVER: ${STORAGE_DRIVER:-gcs} GCS_BUCKET: ${GCS_BUCKET:-aitori-public} GCS_PROJECT_ID: ${GCS_PROJECT_ID:-app-aitori-jp} GCS_CLIENT_EMAIL: ${GCS_CLIENT_EMAIL:-oss-227@app-aitori-jp.iam.gserviceaccount.com} GCS_PRIVATE_KEY: ${GCS_PRIVATE_KEY:------BEGIN PRIVATE KEY-----\nreplace-me\n-----END PRIVATE KEY-----\n} CUSTOMER_DEFAULT_AVATAR_URL: ${CUSTOMER_DEFAULT_AVATAR_URL:-https://storage.googleapis.com/aitori-public/style/sample/066c7ba22ea149268444bc2d919d5b97.png} AI_SIMULATION_BASE_URL: ${AI_SIMULATION_BASE_URL:-http://host.docker.internal:8084} AI_SIMULATION_REFRESH_INTERVAL_MS: ${AI_SIMULATION_REFRESH_INTERVAL_MS:-10000} AI_SIMULATION_HTTP_TIMEOUT_MS: ${AI_SIMULATION_HTTP_TIMEOUT_MS:-15000} SEED_DEMO_DATA: ${SEED_DEMO_DATA:-false} extra_hosts: - "host.docker.internal:host-gateway" depends_on: mysql: condition: service_healthy redis: condition: service_healthy healthcheck: test: ["CMD-SHELL", "wget -qO- http://127.0.0.1:3000/api/v1/health >/dev/null"] interval: 10s timeout: 5s retries: 30 frontend: image: ${REGISTRY:-ghcr.io/gyj2032-byte}/${IMAGE_PREFIX:-stylist}-frontend:${IMAGE_TAG:-latest} restart: unless-stopped ports: - "${FRONTEND_PORT:-8080}:80" depends_on: backend: condition: service_healthy volumes: mysql-data: redis-data: