version: "3.8"

# Docker compose recipe for InvenTree development server
# - Runs PostgreSQL as the database backend
# - Uses built-in django webserver
# - Runs the InvenTree background worker process
# - Serves media and static content directly from Django webserver

# IMPORANT NOTE:
# The InvenTree docker image does not clone source code from git.
# Instead, you must specify *where* the source code is located,
# (on your local machine).
# The django server will auto-detect any code changes and reload the server.

services:

    # Database service
    # Use PostgreSQL as the database backend
    # Note: This can be changed to a different backend if required
    inventree-dev-db:
        container_name: inventree-dev-db
        image: postgres:13
        ports:
            - 5432/tcp
        environment:
          - PGDATA=/var/lib/postgresql/data/dev/pgdb
          # The pguser and pgpassword values must be the same in the other containers
          # Ensure that these are correctly configured in your dev-config.env file
          - POSTGRES_USER=pguser
          - POSTGRES_PASSWORD=pgpassword
        volumes:
          # Map 'data' volume such that postgres database is stored externally
          - src:/var/lib/postgresql/data
        restart: unless-stopped

    # InvenTree web server services
    # Uses gunicorn as the web server
    inventree-dev-server:
        container_name: inventree-dev-server
        depends_on:
          - inventree-dev-db
        build:
            context: .
            target: dev
        ports:
            # Expose web server on port 8000
            - 8000:8000
        # Note: If using the inventree-dev-proxy container (see below),
        # comment out the "ports" directive (above) and uncomment the "expose" directive
        #expose:
        #    - 8000
        volumes:
            # Ensure you specify the location of the 'src' directory at the end of this file
            - src:/home/inventree
        env_file:
            # Environment variables required for the dev server are configured in dev-config.env
            - dev-config.env
        restart: unless-stopped

    # Background worker process handles long-running or periodic tasks
    inventree-dev-worker:
        container_name: inventree-dev-worker
        build:
            context: .
            target: dev
        command: invoke worker
        depends_on:
            - inventree-dev-server
        volumes:
            # Ensure you specify the location of the 'src' directory at the end of this file
            - src:/home/inventree
        env_file:
            # Environment variables required for the dev server are configured in dev-config.env
            - dev-config.env
        restart: unless-stopped

    ### Optional: Serve static and media files using nginx
    ### Uncomment the following lines to enable nginx proxy for testing
    ### Note: If enabling the proxy, change "ports" to "expose" for the inventree-dev-server container (above)
    #inventree-dev-proxy:
    #    container_name: inventree-dev-proxy
    #    image: nginx:stable
    #    depends_on:
    #        - inventree-dev-server
    #    ports:
    #        # Change "8000" to the port that you want InvenTree web server to be available on
    #        - 8000:80
    #    volumes:
    #        # Provide ./nginx.conf file to the container
    #        # Refer to the provided example file as a starting point
    #        - ./nginx.dev.conf:/etc/nginx/conf.d/default.conf:ro
    #        # nginx proxy needs access to static and media files
    #        - src:/var/www
    #    restart: unless-stopped

volumes:
    # NOTE: Change "../" to a directory on your local machine, where the InvenTree source code is located
    # Persistent data, stored external to the container(s)
    src:
        driver: local
        driver_opts:
            type: none
            o: bind
            # This directory specified where InvenTree source code is stored "outside" the docker containers
            # By default, this directory is one level above the "docker" directory
            device: ../