services: db: image: docker.iranserver.com/mysql:8 container_name: croplogic-db environment: MYSQL_DATABASE: ${DB_NAME:-croplogic} MYSQL_USER: ${DB_USER:-croplogic} MYSQL_PASSWORD: ${DB_PASSWORD:-changeme} MYSQL_ROOT_PASSWORD: ${DB_ROOT_PASSWORD:-root} volumes: - backend_mysql_data:/var/lib/mysql healthcheck: test: ["CMD", "mysqladmin", "ping", "-h", "localhost", "-u", "root", "-p${DB_ROOT_PASSWORD:-root}"] interval: 5s timeout: 5s retries: 5 networks: - crop_network phpmyadmin: image: docker-mirror.liara.ir/phpmyadmin:latest container_name: backend-phpmyadmin environment: PMA_HOST: croplogic-db PMA_PORT: 3306 UPLOAD_LIMIT: 64M ports: - "8082:80" depends_on: db: condition: service_healthy networks: - crop_network redis: image: redis:7-alpine container_name: backend-redis command: ["redis-server", "--appendonly", "yes", "--save", "60", "1"] restart: unless-stopped healthcheck: test: ["CMD", "redis-cli", "ping"] interval: 5s timeout: 3s retries: 10 ports: - "6380:6379" volumes: - backend_redis_data:/data networks: - crop_network web: build: context: . args: APT_MIRROR: mirror2.chabokan.net PIP_INDEX_URL: https://package-mirror.liara.ir/repository/pypi/simple PIP_EXTRA_INDEX_URL: https://mirror2.chabokan.net/pypi/simple PYTHON_MIRROR: mirror2.chabokan.net container_name: backend-web command: ["python", "manage.py", "runserver", "0.0.0.0:8000"] volumes: - .:/app - ./logs:/app/logs ports: - "8000:8000" env_file: - .env.example environment: DOCKER_VERSION: ${DOCKER_VERSION:-develop} ALLOWED_HOSTS: ${ALLOWED_HOSTS:-localhost,127.0.0.1,0.0.0.0,web,backend-web} AI_SERVICE_BASE_URL: ${AI_SERVICE_BASE_URL:-http://ai-web:8000} DB_HOST: croplogic-db CELERY_BROKER_URL: redis://backend-redis:6379/0 CELERY_RESULT_BACKEND: redis://backend-redis:6379/0 QDRANT_HOST: qdrant QDRANT_PORT: 6333 SKIP_MIGRATE: "0" ACCESS_CONTROL_AUTHZ_BASE_URL: http://croplogic-accsess-opa:8181 depends_on: db: condition: service_healthy redis: condition: service_healthy restart: unless-stopped networks: - crop_network celery: build: context: . args: APT_MIRROR: mirror2.chabokan.net PIP_INDEX_URL: https://package-mirror.liara.ir/repository/pypi/simple PIP_EXTRA_INDEX_URL: https://mirror2.chabokan.net/pypi/simple PYTHON_MIRROR: mirror2.chabokan.net container_name: backend-celery command: ["celery", "-A", "config", "worker", "-l", "info"] volumes: - .:/app - ./logs:/app/logs env_file: - .env.example environment: DOCKER_VERSION: ${DOCKER_VERSION:-develop} ALLOWED_HOSTS: ${ALLOWED_HOSTS:-localhost,127.0.0.1,0.0.0.0,web,backend-web} AI_SERVICE_BASE_URL: ${AI_SERVICE_BASE_URL:-http://ai-web:8000} DB_HOST: croplogic-db CELERY_BROKER_URL: redis://backend-redis:6379/0 CELERY_RESULT_BACKEND: redis://backend-redis:6379/0 CELERY_BROKER_CONNECTION_RETRY_ON_STARTUP: "true" SKIP_MIGRATE: "1" ACCESS_CONTROL_AUTHZ_BASE_URL: http://croplogic-accsess-opa:8181 depends_on: db: condition: service_healthy redis: condition: service_healthy restart: unless-stopped networks: - crop_network celery-beat: build: context: . args: APT_MIRROR: mirror2.chabokan.net PIP_INDEX_URL: https://package-mirror.liara.ir/repository/pypi/simple PIP_EXTRA_INDEX_URL: https://mirror2.chabokan.net/pypi/simple PYTHON_MIRROR: mirror2.chabokan.net container_name: backend-celery-beat command: ["celery", "-A", "config", "beat", "-l", "info"] volumes: - .:/app - ./logs:/app/logs env_file: - .env.example environment: DOCKER_VERSION: ${DOCKER_VERSION:-develop} ALLOWED_HOSTS: ${ALLOWED_HOSTS:-localhost,127.0.0.1,0.0.0.0,web,backend-web} AI_SERVICE_BASE_URL: ${AI_SERVICE_BASE_URL:-http://ai-web:8000} DB_HOST: croplogic-db CELERY_BROKER_URL: redis://backend-redis:6379/0 CELERY_RESULT_BACKEND: redis://backend-redis:6379/0 CELERY_BROKER_CONNECTION_RETRY_ON_STARTUP: "true" SKIP_MIGRATE: "1" ACCESS_CONTROL_AUTHZ_BASE_URL: http://croplogic-accsess-opa:8181 depends_on: db: condition: service_healthy redis: condition: service_healthy restart: unless-stopped networks: - crop_network volumes: backend_mysql_data: backend_redis_data: backend_qdrant_data: networks: crop_network: external: true