---
version: '3'

# In order to set configuration, please use a .env file in
# your compose project directory (the same directory as your
# docker-compose.yml), and set database options, application
# name, key, and other settings there.
# A list of available settings is available in .env.example
#
# The services should scale properly across a swarm cluster
# if the volumes are properly shared between cluster members.

services:

  app:
    # Comment to use dockerhub image
    build:
      context: .
      dockerfile: contrib/docker/Dockerfile.apache
      #dockerfile: contrib/docker/Dockerfile.fpm
    image: pixelfed
    restart: unless-stopped
    ## If you have a traefik running, uncomment this to expose Pixelfed
    # labels:
    #   - traefik.enable=true
    #   - traefik.frontend.rule=Host:your.url
    #   - traefik.port=80
    ## If you have a standard reverse proxy, uncommit this to expose Pixelfed
    # ports:
    #   - "127.0.0.1:8080:80"
    env_file:
      - ./.env
    volumes:
      - "app-storage:/var/www/storage"
      - "app-bootstrap:/var/www/bootstrap"
      - "./.env:/var/www/.env"
    networks:
      - external
      - internal

  worker:  # Comment this whole block if HORIZON_EMBED is true.
    # Comment to use dockerhub image
    build:
      context: .
      dockerfile: contrib/docker/Dockerfile.apache
      #dockerfile: contrib/docker/Dockerfile.fpm
    image: pixelfed
    restart: unless-stopped
    env_file:
      - ./.env
    volumes:
      - "app-storage:/var/www/storage"
      - "app-bootstrap:/var/www/bootstrap"
    networks:
      - external  # Required for ActivityPub
      - internal
    command: gosu www-data php artisan horizon
    
  db:
    image: mysql:8.0
    restart: unless-stopped
    networks:
      - internal
    command: --default-authentication-plugin=mysql_native_password
    environment:
      - MYSQL_DATABASE=pixelfed
      - MYSQL_USER=${DB_USERNAME}
      - MYSQL_PASSWORD=${DB_PASSWORD}
      - MYSQL_RANDOM_ROOT_PASSWORD=true
    volumes:
      - "db-data:/var/lib/mysql"

  redis:
    image: redis:5-alpine
    restart: unless-stopped
    volumes:
      - "redis-data:/data"
    networks:
      - internal

# Adjust your volume data in order to store data where you wish
volumes:
  redis-data:
  db-data:
  app-storage:
  app-bootstrap:  

networks:
  internal:
    internal: true
  external:
    driver: bridge