|
|
@@ -0,0 +1,83 @@
|
|
|
+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:
|