diff --git a/docker/Dockerfile b/docker/Dockerfile index d68236b91f..5a9059ec7f 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -73,8 +73,6 @@ RUN apk add --no-cache git make bash \ # Install required python packages RUN pip install --no-cache-dir -U psycopg2 mysqlclient pgcli mariadb -ENTRYPOINT ["/sbin/tini", "--"] - FROM base as production # Clone source code @@ -96,7 +94,7 @@ USER inventree RUN pip3 install --no-cache-dir --disable-pip-version-check -r ${INVENTREE_HOME}/requirements.txt # Server init entrypoint -ENTRYPOINT ./docker/init-server.sh +ENTRYPOINT ["/bin/bash", "./docker/init.sh"] # Launch the production server CMD ["gunicorn -c ./docker/gunicorn.conf.py -b ${INVENTREE_WEB_ADDR}:${INVENTREE_WEB_PORT} InvenTree.wsgi"] @@ -120,8 +118,9 @@ ENV INVENTREE_SECRET_KEY_FILE="${INVENTREE_DEV_DIR}/secret_key.txt" WORKDIR ${INVENTREE_HOME} -# Entrypoint -ENTRYPOINT ./docker/init-server.sh +# Entrypoint ensures that we are running in the python virtual environment +ENTRYPOINT ["/bin/bash", "./docker/init.sh"] # Launch the development server -CMD ["python3 manage.py runserver ${INVENTREE_WEB_ADDR}:${INVENTREE_WEB_PORT}"] +CMD ["invoke", "server", "-a", "${INVENTREE_WEB_ADDR}:${INVENTREE_WEB_PORT}"] + diff --git a/docker/docker-compose.dev.yml b/docker/docker-compose.dev.yml index ba8ed774ee..c4be092189 100644 --- a/docker/docker-compose.dev.yml +++ b/docker/docker-compose.dev.yml @@ -35,7 +35,7 @@ services: build: context: . target: dev - entrypoint: /home/inventree/docker/start_dev_worker.sh + command: invoke worker depends_on: - inventree-dev-server volumes: diff --git a/docker/init-server.sh b/docker/init.sh similarity index 57% rename from docker/init-server.sh rename to docker/init.sh index 48603815fc..9be8ffe44b 100644 --- a/docker/init-server.sh +++ b/docker/init.sh @@ -32,38 +32,25 @@ if [[ -n "$INVENTREE_PY_ENV" ]]; then # Activate the virtual environment source ${INVENTREE_PY_ENV}/bin/activate - echo "Installing required packages..." - pip install --no-cache-dir -U -r ${INVENTREE_HOME}/requirements.txt + # Note: Python packages will have to be installed on first run + # e.g docker-compose -f docker-compose.dev.yml run inventree-dev-server invoke install fi # Wait for the InvenTree database to be ready -cd ${INVENTREE_MNG_DIR} -echo "InvenTree: Waiting for database connection" -python3 manage.py wait_for_db && echo "InvenTree: db found, sleeping 10" || { echo "InvenTree: Failed to connect to db due to errors, aborting"; exit 1; } -sleep 10 +# cd ${INVENTREE_MNG_DIR} +# echo "InvenTree: Waiting for database connection" +# invoke wait && echo "InvenTree: Database connection successful" || { echo "InvenTree: Failed to connect to db due to errors, aborting"; exit 1; } +# sleep 5 -# Check database migrations cd ${INVENTREE_HOME} # We assume at this stage that the database is up and running -# Ensure that the database schema are up to date -echo "InvenTree: Checking database..." -invoke check || exit 1 -echo "InvenTree: Check successful" -echo "InvenTree: Database Migrations..." -invoke migrate || exit 1 -echo "InvenTree: Migrations successful" -echo "InvenTree: Collecting static files..." -# Note: "translate" calls "static" also -invoke translate || exit 1 -echo "InvenTree: static successful" +# echo "InvenTree: Checking database..." +# invoke check || exit 1 # Can be run as a cron job or directly to clean out expired sessions. -cd ${INVENTREE_MNG_DIR} -python3 manage.py clearsessions || exit 1 -echo "InvenTree: migrations complete" +# cd ${INVENTREE_MNG_DIR} +# python3 manage.py clearsessions || exit 1 -#Launch the CMD -#echo "init-server launching $@" -#exec "$@" -#echo "init-server exiting" +# Launch the CMD *after* the ENTRYPOINT completes +exec "$@" diff --git a/docker/start_dev_server.sh b/docker/start_dev_server.sh deleted file mode 100644 index a12a958a9a..0000000000 --- a/docker/start_dev_server.sh +++ /dev/null @@ -1,51 +0,0 @@ -#!/bin/sh - -# Create required directory structure (if it does not already exist) -if [[ ! -d "$INVENTREE_STATIC_ROOT" ]]; then - echo "Creating directory $INVENTREE_STATIC_ROOT" - mkdir -p $INVENTREE_STATIC_ROOT -fi - -if [[ ! -d "$INVENTREE_MEDIA_ROOT" ]]; then - echo "Creating directory $INVENTREE_MEDIA_ROOT" - mkdir -p $INVENTREE_MEDIA_ROOT -fi - -# Check if "config.yaml" has been copied into the correct location -if test -f "$INVENTREE_CONFIG_FILE"; then - echo "$INVENTREE_CONFIG_FILE exists - skipping" -else - echo "Copying config file to $INVENTREE_CONFIG_FILE" - cp $INVENTREE_HOME/InvenTree/config_template.yaml $INVENTREE_CONFIG_FILE -fi - -# Setup a virtual environment (within the "dev" directory) -python3 -m venv ./dev/env - -# Activate the virtual environment -source ./dev/env/bin/activate - -echo "Installing required packages..." -pip install --no-cache-dir -U -r ${INVENTREE_HOME}/requirements.txt - -echo "Starting InvenTree server..." - -# Wait for the database to be ready -cd ${INVENTREE_HOME}/InvenTree -python3 manage.py wait_for_db - -sleep 10 - -echo "Running InvenTree database migrations..." - -# We assume at this stage that the database is up and running -# Ensure that the database schema are up to date -python3 manage.py check || exit 1 -python3 manage.py migrate --noinput || exit 1 -python3 manage.py migrate --run-syncdb || exit 1 -python3 manage.py clearsessions || exit 1 - -invoke static - -# Launch a development server -python3 manage.py runserver ${INVENTREE_WEB_ADDR}:${INVENTREE_WEB_PORT} diff --git a/docker/start_dev_worker.sh b/docker/start_dev_worker.sh deleted file mode 100644 index 7ee59ff28f..0000000000 --- a/docker/start_dev_worker.sh +++ /dev/null @@ -1,19 +0,0 @@ -#!/bin/sh - -echo "Starting InvenTree worker..." - -cd $INVENTREE_HOME - -# Activate virtual environment -source ./dev/env/bin/activate - -sleep 5 - -# Wait for the database to be ready -cd InvenTree -python3 manage.py wait_for_db - -sleep 10 - -# Now we can launch the background worker process -python3 manage.py qcluster diff --git a/docker/start_prod_server.sh b/docker/start_prod_server.sh deleted file mode 100644 index 1660a64e60..0000000000 --- a/docker/start_prod_server.sh +++ /dev/null @@ -1,42 +0,0 @@ -#!/bin/sh - -# Create required directory structure (if it does not already exist) -if [[ ! -d "$INVENTREE_STATIC_ROOT" ]]; then - echo "Creating directory $INVENTREE_STATIC_ROOT" - mkdir -p $INVENTREE_STATIC_ROOT -fi - -if [[ ! -d "$INVENTREE_MEDIA_ROOT" ]]; then - echo "Creating directory $INVENTREE_MEDIA_ROOT" - mkdir -p $INVENTREE_MEDIA_ROOT -fi - -# Check if "config.yaml" has been copied into the correct location -if test -f "$INVENTREE_CONFIG_FILE"; then - echo "$INVENTREE_CONFIG_FILE exists - skipping" -else - echo "Copying config file to $INVENTREE_CONFIG_FILE" - cp $INVENTREE_HOME/InvenTree/config_template.yaml $INVENTREE_CONFIG_FILE -fi - -echo "Starting InvenTree server..." - -# Wait for the database to be ready -cd $INVENTREE_MNG_DIR -python3 manage.py wait_for_db - -sleep 10 - -echo "Running InvenTree database migrations and collecting static files..." - -# We assume at this stage that the database is up and running -# Ensure that the database schema are up to date -python3 manage.py check || exit 1 -python3 manage.py migrate --noinput || exit 1 -python3 manage.py migrate --run-syncdb || exit 1 -python3 manage.py prerender || exit 1 -python3 manage.py collectstatic --noinput || exit 1 -python3 manage.py clearsessions || exit 1 - -# Now we can launch the server -gunicorn -c $INVENTREE_HOME/gunicorn.conf.py InvenTree.wsgi -b 0.0.0.0:$INVENTREE_WEB_PORT diff --git a/docker/start_prod_worker.sh b/docker/start_prod_worker.sh deleted file mode 100644 index d0762b430e..0000000000 --- a/docker/start_prod_worker.sh +++ /dev/null @@ -1,14 +0,0 @@ -#!/bin/sh - -echo "Starting InvenTree worker..." - -sleep 5 - -# Wait for the database to be ready -cd $INVENTREE_MNG_DIR -python3 manage.py wait_for_db - -sleep 10 - -# Now we can launch the background worker process -python3 manage.py qcluster diff --git a/tasks.py b/tasks.py index 837207f1ec..9088efb12f 100644 --- a/tasks.py +++ b/tasks.py @@ -65,7 +65,7 @@ def manage(c, cmd, pty=False): cmd - django command to run """ - c.run('cd "{path}" && python3 manage.py {cmd}'.format( + result = c.run('cd "{path}" && python3 manage.py {cmd}'.format( path=managePyDir(), cmd=cmd ), pty=pty) @@ -80,14 +80,6 @@ def install(c): # Install required Python packages with PIP c.run('pip3 install -U -r requirements.txt') - # If a config.yaml file does not exist, copy from the template! - CONFIG_FILE = os.path.join(localDir(), 'InvenTree', 'config.yaml') - CONFIG_TEMPLATE_FILE = os.path.join(localDir(), 'InvenTree', 'config_template.yaml') - - if not os.path.exists(CONFIG_FILE): - print("Config file 'config.yaml' does not exist - copying from template.") - copyfile(CONFIG_TEMPLATE_FILE, CONFIG_FILE) - @task def shell(c): @@ -97,13 +89,6 @@ def shell(c): manage(c, 'shell', pty=True) -@task -def worker(c): - """ - Run the InvenTree background worker process - """ - - manage(c, 'qcluster', pty=True) @task def superuser(c): @@ -113,6 +98,7 @@ def superuser(c): manage(c, 'createsuperuser', pty=True) + @task def check(c): """ @@ -121,13 +107,24 @@ def check(c): manage(c, "check") + @task def wait(c): """ Wait until the database connection is ready """ - manage(c, "wait_for_db") + return manage(c, "wait_for_db") + + +@task(pre=[wait]) +def worker(c): + """ + Run the InvenTree background worker process + """ + + manage(c, 'qcluster', pty=True) + @task def rebuild(c): @@ -137,6 +134,7 @@ def rebuild(c): manage(c, "rebuild_models") + @task def clean_settings(c): """ @@ -145,7 +143,7 @@ def clean_settings(c): manage(c, "clean_settings") -@task +@task(post=[rebuild]) def migrate(c): """ Performs database migrations.