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 development image does not clone source code from git.
# Instead, it runs from source code on your local machine.
# The django server will auto-detect any code changes and reload the server.

# If you have cloned the InvenTree git repo, and not made any changes to this file,
# then the default setup in this file should work straight out of the box, without modification

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:
            - ${INVENTREE_DB_PORT:-5432}/tcp
        environment:
            - PGDATA=/var/lib/postgresql/data/dev/pgdb
            - POSTGRES_USER=${INVENTREE_DB_USER:?You must provide the 'INVENTREE_DB_USER' variable in the .env file}
            - POSTGRES_PASSWORD=${INVENTREE_DB_PASSWORD:?You must provide the 'INVENTREE_DB_PASSWORD' variable in the .env file}
            - POSTGRES_DB=${INVENTREE_DB_NAME:?You must provide the 'INVENTREE_DB_NAME' variable in the .env file}
        volumes:
          # Map 'data' volume such that postgres database is stored externally
          - inventree_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
        # Cache the built image to be used by the inventree-dev-worker process
        image: inventree-dev-image
        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
            - inventree_src:/home/inventree
        env_file:
            - .env
        restart: unless-stopped

    # Background worker process handles long-running or periodic tasks
    inventree-dev-worker:
        container_name: inventree-dev-worker
        image: inventree-dev-image
        command: invoke worker
        depends_on:
            - inventree-dev-server
        volumes:
            # Ensure you specify the location of the 'src' directory at the end of this file
            - inventree_src:/home/inventree
        env_file:
            - .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.dev.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
    #        - inventree_src:/var/www
    #    restart: unless-stopped

volumes:
    # Persistent data, stored external to the container(s)
    inventree_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: ${INVENTREE_EXT_VOLUME:-../}