version: '3' x-logging: &default-logging driver: "json-file" options: max-size: "150m" max-file: "2" services: nginx: image: nginx:1.25.2 logging: *default-logging restart: unless-stopped ports: - "80:80" - "443:443" depends_on: - web networks: - main volumes: - ./nginx:/etc/nginx/conf.d - ./certbot/conf:/etc/nginx/ssl - ./certbot/data:/var/www/certbot - static_volume:/app/static - media_volume:/app/images certbot: image: certbot/certbot:latest command: certonly --webroot --webroot-path=/var/www/certbot --email ${EMAIL} --agree-tos --no-eff-email -d ${DOMAIN} -d www.${DOMAIN} #command: renew --webroot --webroot-path /var/www/certbot logging: *default-logging volumes: - ./certbot/conf:/etc/letsencrypt - ./certbot/logs:/var/log/letsencrypt - ./certbot/data:/var/www/certbot db: build: postgres-docker env_file: .env entrypoint: /bookwyrm-entrypoint.sh command: cron postgres volumes: - pgdata:/var/lib/postgresql/data - backups:/backups networks: - main web: build: . env_file: .env command: gunicorn bookwyrm.wsgi:application --threads=8 --bind 0.0.0.0:8000 logging: *default-logging volumes: - .:/app - static_volume:/app/static - media_volume:/app/images depends_on: - db - celery_worker - redis_activity networks: - main ports: - "8000" redis_activity: image: redis:7.2.1 command: redis-server --requirepass ${REDIS_ACTIVITY_PASSWORD} --appendonly yes --port ${REDIS_ACTIVITY_PORT} logging: *default-logging volumes: - ./redis.conf:/etc/redis/redis.conf - redis_activity_data:/data env_file: .env networks: - main restart: on-failure redis_broker: image: redis:7.2.1 command: redis-server --requirepass ${REDIS_BROKER_PASSWORD} --appendonly yes --port ${REDIS_BROKER_PORT} logging: *default-logging volumes: - ./redis.conf:/etc/redis/redis.conf - redis_broker_data:/data env_file: .env networks: - main restart: on-failure celery_worker: env_file: .env build: . networks: - main command: celery -A celerywyrm worker -l info -Q high_priority,medium_priority,low_priority,streams,images,suggested_users,email,connectors,lists,inbox,imports,import_triggered,broadcast,misc logging: *default-logging volumes: - .:/app - static_volume:/app/static - media_volume:/app/images depends_on: - db - redis_broker restart: on-failure celery_beat: env_file: .env build: . networks: - main command: celery -A celerywyrm beat -l INFO --scheduler django_celery_beat.schedulers:DatabaseScheduler logging: *default-logging volumes: - .:/app - static_volume:/app/static - media_volume:/app/images depends_on: - celery_worker restart: on-failure flower: build: . command: celery -A celerywyrm flower --basic_auth=${FLOWER_USER}:${FLOWER_PASSWORD} --url_prefix=flower logging: *default-logging env_file: .env volumes: - .:/app - static_volume:/app/static networks: - main depends_on: - db - redis_broker restart: on-failure dev-tools: build: dev-tools env_file: .env volumes: - /app/dev-tools/ - .:/app profiles: - tools volumes: pgdata: backups: static_volume: media_volume: redis_broker_data: redis_activity_data: networks: main: