version: '3.8' x-logging: &default-logging options: max-size: "10m" max-file: "3" driver: json-file services: app: image: invoiceninja/invoiceninja-debian:latest restart: unless-stopped env_file: - ./.env volumes: - ./.env:/var/www/html/.env - app_storage:/var/www/html/storage - app_cache:/var/www/html/bootstrap/cache - public_storage:/var/www/html/public/storage networks: - app-network depends_on: mysql: condition: service_healthy redis: condition: service_healthy deploy: resources: limits: memory: 512M logging: *default-logging nginx: image: nginx:alpine restart: unless-stopped ports: - "80:80" volumes: - ./nginx/conf.d:/etc/nginx/conf.d:ro - ./nginx/nginx.conf:/etc/nginx/nginx.conf:ro volumes_from: - app networks: - app-network depends_on: - app deploy: resources: limits: memory: 128M logging: *default-logging mysql: image: mysql:8.0 restart: unless-stopped env_file: - ./.env environment: MYSQL_DATABASE: ${DB_DATABASE} MYSQL_USER: ${DB_USERNAME} MYSQL_PASSWORD: ${DB_PASSWORD} MYSQL_ROOT_PASSWORD: ${DB_ROOT_PASSWORD} volumes: - mysql_data:/var/lib/mysql networks: - app-network healthcheck: test: ["CMD", "mysqladmin", "ping", "-h", "localhost", "-u${MYSQL_USER}", "-p${MYSQL_PASSWORD}"] interval: 10s timeout: 5s retries: 5 deploy: resources: limits: memory: 1G logging: *default-logging redis: image: redis:alpine restart: unless-stopped volumes: - redis_data:/data networks: - app-network healthcheck: test: ["CMD", "redis-cli", "ping"] interval: 10s timeout: 5s retries: 5 deploy: resources: limits: memory: 256M logging: *default-logging networks: app-network: driver: bridge volumes: app_storage: driver: local app_cache: driver: local public_storage: driver: local # Persistent storage for user files mysql_data: driver: local redis_data: driver: local