x-logging: &default-logging options: max-size: "10m" max-file: "3" driver: json-file x-app-volumes: &volumes volumes: - ./.env:/app/.env - ./php/php.ini:/usr/local/etc/php/conf.d/zzz-php.ini:ro - app_cache:/var/www/html/bootstrap/cache - app_storage:/app/storage services: app: build: context: . image: invoiceninja/invoiceninja-debian:${TAG:-latest} restart: unless-stopped ports: - "80:80" env_file: - ./.env environment: LARAVEL_ROLE: app # https://frankenphp.dev/docs/production/#preparing-your-app SERVER_NAME: :80 <<: *volumes # HEALTHCHECK from frankenphp image healthcheck: start_period: 180s depends_on: mariadb: condition: service_healthy valkey: condition: service_healthy logging: *default-logging app-worker: image: invoiceninja/invoiceninja-debian:${TAG:-latest} restart: unless-stopped deploy: mode: replicated replicas: 2 env_file: - ./.env environment: LARAVEL_ROLE: worker <<: *volumes depends_on: app: condition: service_healthy logging: *default-logging app-scheduler: image: invoiceninja/invoiceninja-debian:${TAG:-latest} restart: unless-stopped env_file: - ./.env environment: LARAVEL_ROLE: scheduler <<: *volumes depends_on: app: condition: service_healthy logging: *default-logging mariadb: image: mariadb:11.4 restart: unless-stopped env_file: - ./.env environment: MARIADB_DATABASE: ${DB_DATABASE} MARIADB_USER: ${DB_USERNAME} MARIADB_PASSWORD: ${DB_PASSWORD} MARIADB_ROOT_PASSWORD: ${DB_ROOT_PASSWORD} volumes: - mariadb:/var/lib/mysql healthcheck: test: ["CMD", "healthcheck.sh", "--connect", "--innodb_initialized"] start_period: 60s logging: *default-logging valkey: image: valkey/valkey:8 restart: unless-stopped volumes: - valkey:/data healthcheck: test: [ "CMD", "valkey-cli", "ping" ] start_period: 10s logging: *default-logging volumes: app_cache: driver: local app_storage: driver: local mariadb: driver: local valkey: driver: local