version: '3' services: backend: container_name: backend build: context: . dockerfile: docker/dev.Dockerfile # TODO: Try using cache_from pointed at a Docker Hub image built from master # Though may need to also use the workaround for local vs remote: # https://github.com/moby/moby/issues/32612#issuecomment-294055017 # cache_from: TODO image: treeherder-backend environment: # Development/CI-specific environment variables only. # Those that do not vary across environments should go in `Dockerfile`. - BROKER_URL=amqp://guest:guest@rabbitmq// - DATABASE_URL=${DATABASE_URL:-mysql://root@mysql/treeherder} - GITHUB_TOKEN=${GITHUB_TOKEN:-} - UPSTREAM_DATABASE_URL=${UPSTREAM_DATABASE_URL:-} - PERF_SHERIFF_BOT_CLIENT_ID=${PERF_SHERIFF_BOT_CLIENT_ID:-} - PERF_SHERIFF_BOT_ACCESS_TOKEN=${PERF_SHERIFF_BOT_ACCESS_TOKEN:-} - NOTIFY_CLIENT_ID=${NOTIFY_CLIENT_ID:-} - NOTIFY_ACCESS_TOKEN=${NOTIFY_ACCESS_TOKEN:-} - PULSE_AUTO_DELETE_QUEUES=True - REDIS_URL=redis://redis:6379 - SITE_URL=http://backend:8000/ - TREEHERDER_DEBUG=True - NEW_RELIC_INSIGHTS_API_KEY=${NEW_RELIC_INSIGHTS_API_KEY:-} - PROJECTS_TO_INGEST=${PROJECTS_TO_INGEST:-autoland,try} - TLS_CERT_PATH=${TLS_CERT_PATH} entrypoint: './docker/entrypoint.sh' # We *ONLY* initialize the data when we're running the backend command: './initialize_data.sh ./manage.py runserver 0.0.0.0:8000' # Django's runserver doesn't listen to the default of SIGTERM, so docker-compose # must send SIGINT instead to avoid waiting 10 seconds for the time out. stop_signal: SIGINT shm_size: 2g # 2 Gig seems like a good size volumes: - .:/app ports: - '8000:8000' depends_on: - mysql - redis - rabbitmq stdin_open: true tty: true frontend: container_name: frontend # https://hub.docker.com/_/node image: node:16.6.2-alpine environment: # Allows `.neutrinorc.js` to adjust filesystem watching and browser opening behaviour. - IN_DOCKER=1 # Installing JS dependencies at runtime so that they share the `node_modules` from the # host, improving speed (both install and build due to the webpack cache) and ensuring # the host copy stays in sync (for people that switch back and forth between UI-only # and full stack Treeherder development). working_dir: /app command: sh -c "yarn && yarn start --env.BACKEND=http://backend:8000 --host 0.0.0.0" volumes: - .:/app ports: - '5000:5000' mysql: container_name: mysql # https://hub.docker.com/r/library/mysql/ image: mysql:5.7.35 environment: - MYSQL_ALLOW_EMPTY_PASSWORD=true - MYSQL_DATABASE=treeherder volumes: - ./docker/mysql.cnf:/etc/mysql/conf.d/mysql.cnf - mysql_data:/var/lib/mysql ports: - '3306:3306' redis: container_name: redis # https://hub.docker.com/_/redis/ image: redis:6.2.5-alpine # Messages after starting the redis-server # WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128 # WARNING you have Transparent Huge Pages (THP) support enabled in your kernel. This will create latency and memory usage issues with Redis. To fix this issue run the command 'echo never > /sys/kernel/mm/transparent_hugepage/enabled' as root, and add it to your /etc/rc.local in order to retain the setting after a reboot. Redis must be restarted after THP is disabled. # Hide Redis `notice` log level startup output spam. command: redis-server --loglevel warning ports: - '6379:6379' rabbitmq: container_name: rabbitmq # https://hub.docker.com/r/library/rabbitmq/ image: rabbitmq:3.8-alpine environment: # Hide INFO and WARNING log levels to reduce log spam. - 'RABBITMQ_SERVER_ADDITIONAL_ERL_ARGS=-rabbit log [{console,[{level,error}]}]' ports: - '5672:5672' pulse-task-push: build: context: . dockerfile: docker/dev.Dockerfile environment: - PULSE_URL=${PULSE_URL:-amqp://docker-shared-user:oGv7P5%H94@pulse.mozilla.org:5671/?ssl=1} - LOGGING_LEVEL=INFO - PULSE_AUTO_DELETE_QUEUES=True - DATABASE_URL=mysql://root@mysql:3306/treeherder - BROKER_URL=amqp://guest:guest@rabbitmq// - SKIP_INGESTION=${SKIP_INGESTION:-False} entrypoint: './docker/entrypoint.sh' command: ./manage.py pulse_listener volumes: - .:/app depends_on: - mysql - rabbitmq celery: build: context: . dockerfile: docker/dev.Dockerfile environment: - CELERY_BROKER_URL=amqp://guest:guest@rabbitmq:5672// - DATABASE_URL=mysql://root@mysql:3306/treeherder - PROJECTS_TO_INGEST=${PROJECTS_TO_INGEST:-autoland,try} entrypoint: './docker/entrypoint.sh' command: celery worker -A treeherder --uid=nobody --gid=nogroup --without-gossip --without-mingle --without-heartbeat -Q store_pulse_pushes,store_pulse_tasks --concurrency=1 --loglevel=WARNING volumes: - .:/app depends_on: - mysql - redis - rabbitmq volumes: # TODO: Experiment with using tmpfs when testing, to speed up database-using Python tests. mysql_data: {}