services: mysql: image: mysql:8.4 container_name: sinka-mysql restart: unless-stopped ports: - "127.0.0.1:${SINKA_MYSQL_PORT:-3306}:3306" environment: MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD:-root} MYSQL_DATABASE: sinka_platform MYSQL_USER: sinka MYSQL_PASSWORD: ${MYSQL_PASSWORD:-sinka} volumes: - sinka_mysql_data:/var/lib/mysql - ./docker/mysql-init:/docker-entrypoint-initdb.d healthcheck: test: ["CMD", "mysqladmin", "ping", "-h", "localhost", "-uroot", "-p${MYSQL_ROOT_PASSWORD:-root}"] interval: 5s timeout: 5s retries: 20 redis: image: redis:7-alpine container_name: sinka-redis restart: unless-stopped ports: - "127.0.0.1:${SINKA_REDIS_PORT:-6379}:6379" healthcheck: test: ["CMD", "redis-cli", "ping"] interval: 5s timeout: 3s retries: 20 api: profiles: ["full"] build: context: ./api dockerfile: Dockerfile container_name: sinka-api restart: unless-stopped depends_on: mysql: condition: service_healthy redis: condition: service_healthy env_file: - path: .env required: false environment: PORT: 3001 NODE_ENV: production COOKIE_SECURE: ${COOKIE_SECURE:-false} WEB_ORIGIN: ${WEB_ORIGIN:-http://localhost:3000} DATABASE_URL: mysql://sinka:${MYSQL_PASSWORD:-sinka}@mysql:3306/sinka_platform MYSQL_ADMIN_URL: mysql://root:${MYSQL_ROOT_PASSWORD:-root}@mysql:3306 REDIS_URL: redis://redis:6379 UPLOAD_DIR: /data/uploads volumes: - sinka_uploads:/data/uploads ports: - "127.0.0.1:${SINKA_API_PORT:-3001}:3001" healthcheck: test: [ "CMD", "node", "-e", "fetch('http://127.0.0.1:3001/api/health').then((r)=>process.exit(r.ok?0:1)).catch(()=>process.exit(1))", ] interval: 10s timeout: 5s retries: 12 start_period: 40s web: profiles: ["full"] build: context: ./web dockerfile: Dockerfile args: API_INTERNAL_URL: http://api:3001/api container_name: sinka-web restart: unless-stopped depends_on: api: condition: service_healthy environment: PORT: 3000 HOSTNAME: 0.0.0.0 API_INTERNAL_URL: http://api:3001/api ports: - "${SINKA_WEB_PORT:-3000}:3000" healthcheck: test: [ "CMD", "node", "-e", "fetch('http://127.0.0.1:3000').then((r)=>process.exit(r.ok?0:1)).catch(()=>process.exit(1))", ] interval: 10s timeout: 5s retries: 8 volumes: sinka_mysql_data: sinka_uploads: