diff --git a/Saleor_Production_Deployment.sh b/Saleor_Production_Deployment.sh deleted file mode 100644 index 18d04ef..0000000 --- a/Saleor_Production_Deployment.sh +++ /dev/null @@ -1,336 +0,0 @@ -######################################################################################### -# Saleor_Production_Deployment.sh -# Author: Aaron K. Nall http://github.com/thewhiterabbit -######################################################################################### -#!/bin/sh -set -e - -# Get the actual user that logged in -UN="$(who am i | awk '{print $1}')" -if [[ "$UN" != "root" ]]; then - HD="/home/$UN" -else - HD="/root" -fi - -while [ -n "$1" ]; do # while loop starts - case "$1" in - -name) - DEPLOYED_NAME="$2" - shift - ;; - - -host) - API_HOST="$2" - shift - ;; - - -uri) - APP_MOUNT_URI="$2" - shift - ;; - - -url) - STATIC_URL="$2" - shift - ;; - - -dbhost) - PGDBHOST="$2" - shift - ;; - - -dbport) - DBPORT="$2" - shift - ;; - - -v) - vOPT="true" - VERSION="$2" - shift - ;; - - *) - echo "Option $1 is invalid." - echo "Exiting" - exit 1 - ;; - esac - shift -done - -######################################################################################### -# Select Operating System specific commands -# Tested working on Ubuntu Server 20.04 -# Needs testing on the distributions listed below -# Debian -# Fedora CoreOS -# Kubernetes -# SUSE CaaS -IN=$(uname -a) -arrIN=(${IN// / }) -IN2=${arrIN[3]} -arrIN2=(${IN2//-/ }) -OS=${arrIN2[1]} -echo "" -echo "$OS detected" -echo "" -sleep 3 -echo "Installing core dependencies..." -# For future use to setup Operating System specific commands -case "$OS" in - Debian) - sudo apt-get update - sudo apt-get install -y build-essential python3-dev python3-pip python3-cffi python3-venv - sudo python3 -m pip install --upgrade pip - sudo apt-get install -y libcairo2 libpango-1.0-0 libpangocairo-1.0-0 libgdk-pixbuf2.0-0 libffi-dev shared-mime-info - sudo apt-get install -y nodejs npm postgresql postgresql-contrib - ;; - - Fedora) - ;; - - Kubernetes) - ;; - - SUSE) - ;; - - Ubuntu) - sudo apt-get update - sudo apt-get install -y build-essential python3-dev python3-pip python3-cffi python3-venv - sudo python3 -m pip install --upgrade pip - sudo apt-get install -y libcairo2 libpango-1.0-0 libpangocairo-1.0-0 libgdk-pixbuf2.0-0 libffi-dev shared-mime-info - sudo apt-get install -y nodejs npm postgresql postgresql-contrib - ;; - - *) - # Unsupported distribution detected, exit - echo "Unsupported Linix distribution detected." - echo "Exiting" - exit 1 - ;; -esac -######################################################################################### - -# Tell the user what's happening -echo "" -echo "Finished installing core dependencies" -echo "" -sleep 3 -echo "Setting up security feature details..." -echo "" - -# Create randomized 2049 byte keyfile -sudo mkdir /etc/saleor - -echo $(cat /dev/urandom | tr -dc 'a-zA-Z0-9' | fold -w 2048| head -n 1)>/etc/saleor/api_sk -# Set variables for the password, obfuscation string, and user/database names -OBFSTR=$(cat /dev/urandom | tr -dc 'a-z0-9' | fold -w 8| head -n 1) -PGSQLUSERPASS=$(cat /dev/urandom | tr -dc 'A-Za-z0-9' | fold -w 128 | head -n 1) -PGSQLDBNAME="saleor_db_$OBFSTR" -PGSQLUSER="saleor_dbu_$OBFSTR" - -# Tell the user what's happening -echo "Finished setting up security feature details" -echo "" -sleep 1 -echo "Creating database..." -echo "" - -# Create a superuser for Saleor - -sudo -i -u postgres psql -c "CREATE ROLE $PGSQLUSER PASSWORD '$PGSQLUSERPASS' SUPERUSER CREATEDB CREATEROLE INHERIT LOGIN;" -sudo -i -u postgres psql -c "CREATE DATABASE $PGSQLDBNAME;" -# TODO - Secure the postgers user account - -# Tell the user what's happening -echo "Finished creating database" -echo "" -sleep 3 -echo "Please provide details for your instillation..." -echo "" - -# Ask for the API host IP or domain -while [ "$HOST" = "" ] -do - echo -n "Enter the Dashboard & GraphQL host domain:" - read HOST -done - -while [ "$API_HOST" = "" ] -do - echo "" - echo -n "Enter the API host IP or domain:" - read API_HOST -done - -# Ask for the API port -echo -n "Enter the API port (optional):" -read API_PORT - -# Ask for the API Mount URI -while [ "$APP_MOUNT_URI" = "" ] -do - echo "" - echo -n "Enter the Dashboard URI:" - read APP_MOUNT_URI -done - -# Ask for the Static URL -echo -n "Enter the Static URL:" -read STATIC_URL - -# Ask for the Static URL -while [ "$EMAIL" = "" ] -do - echo "" - echo -n "Enter the Dashboard admin's email:" - read EMAIL -done - -# Ask for the Static URL -while [ "$PASSW" = "" ] -do - echo "" - echo -n "Enter the Dashboard admin's desired password:" - read PASSW -done - -# Use set parameters for Database or fall back to defaults -if [ "$PGDBHOST" = "" ]; then - PGDBHOST="localhost" -fi - -if [ "$DBPORT" = "" ]; then - DBPORT="5432" -fi - -if [[ "$GQL_PORT" = "" ]]; then - GQL_PORT="9000" -fi - -if [[ "$API_PORT" = "" ]]; then - API_PORT="8000" -fi - -if [ "$APIURI" = "" ]; then - APIURI="graphql" -fi - -if [ "vOPT" = "true" ]; then - if [ "$VERSION" = "" ]; then - VERSION="2.11.1" - fi -fi - -sudo ufw allow $GQL_PORT -sudo ufw allow $API_PORT - -# Here goes nothing -cd $HD -if [ "vOPT" = "true" ]; then - git clone https://github.com/mirumee/saleor.git -else - git clone https://github.com/thewhiterabbit/saleor.git -fi -wait -cd saleor -if [ "vOPT" = "true" ]; then - sudo sed "s|{hd}|$HD| - s/{hostip}/$API_HOST/" $HD/saleor/resources/saleor.service > /etc/systemd/system/saleor.service - wait - - sudo sed "s|{hd}|$HD| - s/{api_host}/$API_HOST/ - s/{host}/$HOST/g - s/{apiport}/$API_PORT/" $HD/saleor/resources/server_block > /etc/nginx/sites-available/saleor - wait - - sudo sed -i "s/{\"email\": \"admin@example.com\", \"password\": \"admin\"}/{\"email\": \"$EMAIL\", \"password\": \"$PASSW\"}/" $HD/saleor/saleor/core/management/commands/populatedb.py - wait - - sudo sed -i "s/{\"email\": \"admin@example.com\", \"password\": \"admin\"}/{\"email\": \"$EMAIL\", \"password\": \"$PASSW\"}/" $HD/saleor/saleor/core/tests/test_core.py - wait - - sudo sed -i "s|SECRET_KEY = os.environ.get(\"SECRET_KEY\")|with open('/etc/saleor/api_sk') as f: SECRET_KEY = f.read().strip()|" $HD/saleor/saleor/settings.py - wait -else - sudo sed "s|{hd}|$HD| - s/{hostip}/$API_HOST/" $HD/saleor/resources/saleor.service > /etc/systemd/system/saleor.service - wait - - sudo sed "s|{hd}|$HD| - s/{api_host}/$API_HOST/ - s/{host}/$HOST/g - s/{apiport}/$API_PORT/" $HD/saleor/resources/server_block > /etc/nginx/sites-available/saleor - wait - - sudo sed -i "s/{email}/$EMAIL/ - s/{passw}/$PASSW/" $HD/saleor/saleor/core/management/commands/populatedb.py - wait - - sudo sed -i "s/{email}/$EMAIL/ - s/{passw}/$PASSW/" $HD/saleor/saleor/core/tests/test_core.py - wait -fi - -# Tell the user what's happening -echo "Creating production deployment packages for Saleor API & GraphQL..." -echo "" - -DB_URL="postgres://$PGSQLUSER:$PGSQLUSERPASS@$PGDBHOST:$DBPORT/$PGSQLDBNAME" - -if [ "vOPT" = "true" ]; then - git checkout $VERSION -fi -python3 -m venv $HD/saleor/venv -source $HD/saleor/venv/bin/activate -pip3 install -r requirements.txt -export DATABASE_URL=$DB_URL -npm install -npm audit fix -python3 manage.py migrate -python3 manage.py collectstatic -npm run build-schema -npm run build-emails - -sudo touch /etc/init.d/saleor -sudo chmod +x /etc/init.d/saleor -sudo update-rc.d saleor defaults - -APIURL="http://$API_HOST:$API_PORT/$APIURI/" - -# Tell the user what's happening -echo "Finished creating production deployment packages for Saleor API & GraphQL" -echo"" -sleep 3 -echo "Creating production deployment packages for Saleor Dashboard..." -echo "" - -# Missing some things here as well -cd $HD -git clone https://github.com/mirumee/saleor-dashboard.git -wait -cd saleor-dashboard - -if [ "vOPT" = "true" ]; then - git checkout $VERSION -fi -npm i -export API_URI=$APIURL -export APP_MOUNT_URI=$APP_MOUNT_URI -if [[ "$STATIC_URL" != "" ]]; then - export STATIC_URL=$STATIC_URL -fi -npm run build - -echo "Restarting nginx..." -sudo ln -s /etc/nginx/sites-available/saleor /etc/nginx/sites-enabled/ -sudo systemctl restart nginx -sleep 3 - -echo "I think we're done here." -echo "Test the installation." -echo "Run python3 manage.py createsuperuser from $HD/saleor" \ No newline at end of file diff --git a/deploy-dashboard.sh b/deploy-dashboard.sh new file mode 100644 index 0000000..63e1c63 --- /dev/null +++ b/deploy-dashboard.sh @@ -0,0 +1,93 @@ + +######################################################################################### +echo "" +echo "Creating production deployment packages for Saleor Dashboard..." +echo "" +######################################################################################### + + + +######################################################################################### +# Collect input from the user to assign required installation parameters +######################################################################################### +echo "Please provide details for your Saleor API instillation..." +echo "" +# Get the Dashboard & GraphQL host domain +while [ "$HOST" = "" ] +do + echo -n "Enter the Dashboard & GraphQL host domain:" + read HOST +done +# Get the API host IP or domain +while [ "$API_HOST" = "" ] +do + echo "" + echo -n "Enter the API host IP or domain:" + read API_HOST +done +# Get the APP Mount (Dashboard) URI +while [ "$APP_MOUNT_URI" = "" ] +do + echo "" + echo -n "Enter the APP Mount (Dashboard) URI:" + read APP_MOUNT_URI +done +# Get an optional custom API port +echo -n "Enter the API port (optional):" +read API_PORT +# +if [[ "$API_PORT" = "" ]]; then + API_PORT="8000" +fi +# +######################################################################################### + + + +######################################################################################### +# Setup the environment variables for Saleor API +######################################################################################### +# Build the API URL +APIURL="http://$API_HOST:$API_PORT/$APIURI/" +# Write the production .env file from template.env +sudo sed "s|{apiuri}|$APIURL| + s|{mounturi}|$APP_MOUNT_URI| + s|{url}|$HOST|" $HD/Deploy_Saleor/resources/saleor-dashboard/template.env > $HD/saleor-dashboard/.env +wait +######################################################################################### + + + +######################################################################################### +# Build Saleor Dashboard for production +######################################################################################### +# Make sure we're in the user's home directory +cd $HD +# Clone the Saleor Dashboard Git repository +if [ -f "$HD/saleor-dashboard" ]; then + sudo rm -R $HD/saleor-dashboard +fi +git clone https://github.com/mirumee/saleor-dashboard.git +wait +# Make sure we're in the project root directory +cd saleor-dashboard +# Was the -v (version) option used? +if [ "vOPT" = "true" ]; then + git checkout $VERSION +fi +# Install dependancies +npm i +wait +npm run build +wait +######################################################################################### + + + +######################################################################################### +# Tell the user what's happening +######################################################################################### +echo "I think we're done here." +echo "Test the installation." +echo "Run python3 manage.py createsuperuser from $HD/saleor" +######################################################################################### \ No newline at end of file diff --git a/deploy-saleor.sh b/deploy-saleor.sh new file mode 100644 index 0000000..fe439d8 --- /dev/null +++ b/deploy-saleor.sh @@ -0,0 +1,535 @@ +######################################################################################### +# Saleor_Production_Deployment.sh +# Author: Aaron K. Nall http://github.com/thewhiterabbit +######################################################################################### +#!/bin/sh +set -e + +######################################################################################### +# Get the actual user that logged in +######################################################################################### +UN="$(who am i | awk '{print $1}')" +if [[ "$UN" != "root" ]]; then + HD="/home/$UN" +else + HD="/root" +fi +######################################################################################### + + + +######################################################################################### +# Get the operating system +######################################################################################### +IN=$(uname -a) +arrIN=(${IN// / }) +IN2=${arrIN[3]} +arrIN2=(${IN2//-/ }) +OS=${arrIN2[1]} +######################################################################################### + + + +######################################################################################### +# Parse options +######################################################################################### +while [ -n "$1" ]; do # while loop starts + case "$1" in + -name) + DEPLOYED_NAME="$2" + shift + ;; + + -host) + API_HOST="$2" + shift + ;; + + -uri) + APP_MOUNT_URI="$2" + shift + ;; + + -url) + STATIC_URL="$2" + shift + ;; + + -dbhost) + PGDBHOST="$2" + shift + ;; + + -dbport) + DBPORT="$2" + shift + ;; + + -repo) + REPO="$2" + shift + ;; + + -v) + vOPT="true" + VERSION="$2" + shift + ;; + + *) + echo "Option $1 is invalid." + echo "Exiting" + exit 1 + ;; + esac + shift +done +######################################################################################### + + + +######################################################################################### +# Echo the detected operating system +######################################################################################### +echo "" +echo "$OS detected" +echo "" +sleep 3 +######################################################################################### + + + +######################################################################################### +# Select/run Operating System specific commands +######################################################################################### +# Tested working on Ubuntu Server 20.04 +# Needs testing on the distributions listed below: +# Debian +# Fedora CoreOS +# Kubernetes +# SUSE CaaS +echo "Installing core dependencies..." +case "$OS" in + Debian) + sudo apt-get update + sudo apt-get install -y build-essential python3-dev python3-pip python3-cffi python3-venv gcc + sudo apt-get install -y libcairo2 libpango-1.0-0 libpangocairo-1.0-0 libgdk-pixbuf2.0-0 libffi-dev shared-mime-info + sudo apt-get install -y nodejs npm postgresql postgresql-contrib + ;; + + Fedora) + ;; + + Kubernetes) + ;; + + SUSE) + ;; + + Ubuntu) + sudo apt-get update + sudo apt-get install -y build-essential python3-dev python3-pip python3-cffi python3-venv gcc + sudo apt-get install -y libcairo2 libpango-1.0-0 libpangocairo-1.0-0 libgdk-pixbuf2.0-0 libffi-dev shared-mime-info + sudo apt-get install -y nodejs npm postgresql postgresql-contrib + ;; + + *) + # Unsupported distribution detected, exit + echo "Unsupported Linix distribution detected." + echo "Exiting" + exit 1 + ;; +esac +######################################################################################### + + + +######################################################################################### +# Tell the user what's happening +######################################################################################### +echo "" +echo "Finished installing core dependencies" +echo "" +sleep 3 +echo "Setting up security feature details..." +echo "" +######################################################################################### + + + +######################################################################################### +# Generate a secret key file +######################################################################################### +# Does the key file directory exiet? +if [ ! -d "/etc/saleor" ]; then + sudo mkdir /etc/saleor +else + # Does the key file exist? + if [ -f "/etc/saleor/api_sk" ]; then + # Yes, remove it. + sudo rm /etc/saleor/api_sk + fi +fi +# Create randomized 2049 byte key file +sudo echo $(cat /dev/urandom | tr -dc 'a-zA-Z0-9' | fold -w 2048| head -n 1) > /etc/saleor/api_sk +######################################################################################### + + + +######################################################################################### +# Set variables for the password, obfuscation string, and user/database names +######################################################################################### +# Generate an 8 byte obfuscation string for the database name & username +OBFSTR=$(cat /dev/urandom | tr -dc 'a-z0-9' | fold -w 8| head -n 1) +# Append the database name for Saleor with the obfuscation string +PGSQLDBNAME="saleor_db_$OBFSTR" +# Append the database username for Saleor with the obfuscation string +PGSQLUSER="saleor_dbu_$OBFSTR" +# Generate a 128 byte password for the Saleor database user +# TODO: Add special characters once we know which ones won't crash the python script +PGSQLUSERPASS=$(cat /dev/urandom | tr -dc 'A-Za-z0-9' | fold -w 128 | head -n 1) +######################################################################################### + + + +######################################################################################### +# Tell the user what's happening +######################################################################################### +echo "Finished setting up security feature details" +echo "" +sleep 1 +echo "Creating database..." +echo "" +######################################################################################### + + + +######################################################################################### +# Create a superuser for Saleor +######################################################################################### +# Create the role in the database and assign the generated password +sudo -i -u postgres psql -c "CREATE ROLE $PGSQLUSER PASSWORD '$PGSQLUSERPASS' SUPERUSER CREATEDB CREATEROLE INHERIT LOGIN;" +# Create the database for Saleor +sudo -i -u postgres psql -c "CREATE DATABASE $PGSQLDBNAME;" +# TODO - Secure the postgers user account +######################################################################################### + + + +######################################################################################### +# Tell the user what's happening +######################################################################################### +echo "Finished creating database" +echo "" +sleep 3 +######################################################################################### + + + +######################################################################################### +# Collect input from the user to assign required installation parameters +######################################################################################### +echo "Please provide details for your Saleor API instillation..." +echo "" +# Get the Dashboard & GraphQL host domain +while [ "$HOST" = "" ] +do + echo -n "Enter the Dashboard & GraphQL host domain:" + read HOST +done +# Get the API host IP or domain +while [ "$API_HOST" = "" ] +do + echo "" + echo -n "Enter the API host IP or domain:" + read API_HOST +done +# Get an optional custom API port +echo -n "Enter the API port (optional):" +read API_PORT +# Get the APP Mount (Dashboard) URI +while [ "$APP_MOUNT_URI" = "" ] +do + echo "" + echo -n "Enter the Dashboard URI:" + read APP_MOUNT_URI +done +# Get an optional custom Static URL +echo -n "Enter a custom Static Files URI (optional):" +read STATIC_URL +# Get the Admin's email address +while [ "$EMAIL" = "" ] +do + echo "" + echo -n "Enter the Dashboard admin's email:" + read EMAIL +done +# Get the Admin's desired password +while [ "$PASSW" = "" ] +do + echo "" + echo -n "Enter the Dashboard admin's desired password:" + read -s PASSW +done +######################################################################################### + + + +######################################################################################### +# Set default and optional parameters +######################################################################################### +if [ "$PGDBHOST" = "" ]; then + PGDBHOST="localhost" +fi +# +if [ "$DBPORT" = "" ]; then + DBPORT="5432" +fi +# +if [[ "$GQL_PORT" = "" ]]; then + GQL_PORT="9000" +fi +# +if [[ "$API_PORT" = "" ]]; then + API_PORT="8000" +fi +# +if [ "$APIURI" = "" ]; then + APIURI="graphql" +fi +# +if [ "$vOPT" = "true" ]; then + if [ "$VERSION" = "" ]; then + VERSION="2.11.1" + fi +fi +######################################################################################### + + + +######################################################################################### +# Open the selected ports for the API and APP +######################################################################################### +# Open GraphQL port +sudo ufw allow $GQL_PORT +# Open API port +sudo ufw allow $API_PORT +######################################################################################### + + + +######################################################################################### +# Clone the Saleor Git repository +######################################################################################### +# Make sure we're in the user's home directory +cd $HD +# Does the Saleor Dashboard already exist? +if [ -f "$HD/saleor" ]; then + # Remove /saleor-dashboard + sudo rm -R $HD/saleor +fi +# Check if the -v (version) option was used +if [ "$vOPT" = "true" ]; then + # Get the Mirumee repo + git clone https://github.com/mirumee/saleor.git +else + # Was a repo specified? + if [ "$REPO" = "mirumee" ]; then + # Get the Mirumee repo + git clone https://github.com/mirumee/saleor.git + else + # Get the forked repo from thewhiterabbit + git clone https://github.com/thewhiterabbit/saleor.git + fi +fi +wait +######################################################################################### + + + +######################################################################################### +# Replace any parameter slugs in the template files with real paramaters & write them to +# the production files +######################################################################################### +# Create vassals directory in virtual environment +mkdir $HD/env/saleor/vassals +sudo ln -s $HD/saleor/saleor/wsgi/uwsgi.ini $HD/env/saleor/vassals +# Was the -v (version) option used or Mirumee repo specified? +if [ "vOPT" = "true" ] || [ "$REPO" = "mirumee" ]; then + # Does an old saleor.service file exist? + if [ -f "/etc/systemd/system/saleor.service" ]; then + # Remove the old service file + sudo rm /etc/systemd/system/saleor.service + fi + # Create the new service file + sudo sed "s/{un}/$UN/ + s|{hd}|$HD|" $HD/Deploy_Saleor/template.service > /etc/systemd/system/saleor.service + wait + # Does an old server block exist? + if [ -f "/etc/nginx/sites-available/saleor" ]; then + # Remove the old service file + sudo rm /etc/nginx/sites-available/saleor + fi + # Create the new server block + sudo sed "s|{hd}|$HD|g + s/{api_host}/$API_HOST/ + s/{host}/$HOST/g + s/{apiport}/$API_PORT/" $HD/Deploy_Saleor/server_block > /etc/nginx/sites-available/saleor + wait + # Replace demo credentials with production credentials in /saleor/saleor/core/management/commands/populatedb.py + sudo sed -i "s/{\"email\": \"admin@example.com\", \"password\": \"admin\"}/{\"email\": \"$EMAIL\", \"password\": \"$PASSW\"}/" $HD/saleor/saleor/core/management/commands/populatedb.py + wait + # Replace demo credentials with production credentials in /saleor/saleor/core/tests/test_core.py + sudo sed -i "s/{\"email\": \"admin@example.com\", \"password\": \"admin\"}/{\"email\": \"$EMAIL\", \"password\": \"$PASSW\"}/" $HD/saleor/saleor/core/tests/test_core.py + wait + # Replace the insecure demo secret key assignemnt with a more secure file reference in /saleor/saleor/settings.py + sudo sed -i "s|SECRET_KEY = os.environ.get(\"SECRET_KEY\")|with open('/etc/saleor/api_sk') as f: SECRET_KEY = f.read().strip()|" $HD/saleor/saleor/settings.py + wait +else + # Does an old saleor.service file exist? + if [ -f "/etc/systemd/system/saleor.service" ]; then + # Remove the old service file + sudo rm /etc/systemd/system/saleor.service + fi + # Create the new service file + sudo sed "s/{un}/$UN/ + s|{hd}|$HD|" $HD/saleor/resources/template.service > /etc/systemd/system/saleor.service + wait + # Does an old server block exist? + if [ -f "/etc/nginx/sites-available/saleor" ]; then + # Remove the old service file + sudo rm /etc/nginx/sites-available/saleor + fi + # Create the new server block + sudo sed "s|{hd}|$HD| + s/{api_host}/$API_HOST/ + s/{host}/$HOST/g + s/{apiport}/$API_PORT/" $HD/saleor/resources/server_block > /etc/nginx/sites-available/saleor + wait + # Set the production credentials in /saleor/saleor/core/management/commands/populatedb.py + sudo sed -i "s/{email}/$EMAIL/ + s/{passw}/$PASSW/" $HD/saleor/saleor/core/management/commands/populatedb.py + wait + # Set the production credentials in /saleor/saleor/core/tests/test_core.py + sudo sed -i "s/{email}/$EMAIL/ + s/{passw}/$PASSW/" $HD/saleor/saleor/core/tests/test_core.py + wait +fi +######################################################################################### + + + +######################################################################################### +# Tell the user what's happening +echo "Creating production deployment packages for Saleor API & GraphQL..." +echo "" +######################################################################################### + + + +######################################################################################### +# Setup the environment variables for Saleor API +######################################################################################### +# Build the database URL +DB_URL="postgres://$PGSQLUSER:$PGSQLUSERPASS@$PGDBHOST:$DBPORT/$PGSQLDBNAME" +EMAIL_URL="smtp://$EMAIL:$EMAIL_PW@$EMAIL_HOST:/?ssl=True" +# Build the chosts and ahosts lists +C_HOSTS="$HOST,$API_HOST,localhost,127.0.0.1" +A_HOSTS="$HOST,$API_HOST,localhost,127.0.0.1" +QL_ORIGINS="$HOST,$API_HOST,localhost,127.0.0.1" +# Write the production .env file from template.env +sudo sed "s|{dburl}|$DB_URL| + s|{emailurl}|$EMAIL_URL| + s/{chosts}/$C_HOSTS/ + s/{ahosts}/$A_HOSTS/ + s/{gqlorigins}/$QL_ORIGINS/" $HD/Deploy_Saleor/resources/saleor/template.env > $HD/saleor/.env +wait +######################################################################################### + + + +######################################################################################### +# Copy the uwsgi_params file to /saleor/uwsgi_params +######################################################################################### +sudo cp $HD/Deploy_Saleor/uwsgi_params $HD/saleor/uwsgi_params +######################################################################################### + + + +######################################################################################### +# Install Saleor for production +######################################################################################### +# Make sure we're in the project root directory for Saleor +cd $HD/saleor +# Was the -v (version) option used? +if [ "vOPT" = "true" ]; then + # Checkout the specified version + git checkout $VERSION +fi +# Does an old virtual environment for Saleor exist? +if [ -f "$HD/env/saleor" ]; then + # remove the old virtual environment + sudo rm -R $HD/env/saleor +fi +# Create a new virtual environment for Saleor +python3 -m venv $HD/env/saleor +# Activate the virtual environment +source $HD/env/saleor/bin/activate +# Make sure pip is upgraded +python3 -m pip install --upgrade pip +wait +# Install Django +pip3 install Django +wait +# Install uwsgi +pip3 install uwsgi +wait +# Install the project requirements +pip3 install -r requirements.txt +wait +# Install the project +npm install +# Run an audit to fix any vulnerabilities +npm audit fix +# Establish the database +python3 manage.py migrate +# Collect the static elemants +python3 manage.py collectstatic +# Build the schema +npm run build-schema +# Build the emails +npm run build-emails +# Exit the virtual environment here? _#_ +deactivate +######################################################################################### + + + +######################################################################################### +echo "Enabling server block and Restarting nginx..." +sudo ln -s /etc/nginx/sites-available/saleor /etc/nginx/sites-enabled/ +sudo systemctl restart nginx +######################################################################################### + + + +######################################################################################### +# Create the Saleor service +######################################################################################### +# Touch +sudo touch /etc/init.d/saleor +# Allow execute +sudo chmod +x /etc/init.d/saleor +# Update with defaults +sudo update-rc.d saleor defaults +######################################################################################### + + + +######################################################################################### +# Tell the user what's happening +######################################################################################### +echo "" +echo "Finished creating production deployment packages for Saleor API & GraphQL" +echo "" +######################################################################################### \ No newline at end of file diff --git a/resources/saleor-dashboard/template.env b/resources/saleor-dashboard/template.env new file mode 100644 index 0000000..78abcb5 --- /dev/null +++ b/resources/saleor-dashboard/template.env @@ -0,0 +1,3 @@ +API_URI="{apiuri}" +APP_MOUNT_URI="/{dashuri}/" +STATIC_URL="{url}" \ No newline at end of file diff --git a/resources/saleor.service b/resources/saleor.service deleted file mode 100644 index 091b12e..0000000 --- a/resources/saleor.service +++ /dev/null @@ -1,34 +0,0 @@ -#! /bin/sh -### BEGIN INIT INFO -# Provides: Django-Server -# Required-Start: $all -# Required-Stop: -# Default-Start: 2 3 4 5 -# Default-Stop: 0 1 6 -# Short-Description: Django Server -### END INIT INFO - -PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/opt/bin - -# If you need to source some other scripts, do it here - -case "$1" in - start) - log_begin_msg "Starting Saleor Server" - python3 "{hd}/saleor/manage.py" runserver {hostip}:8000 --insecure & - log_end_msg $? - exit 0 - ;; - stop) - log_begin_msg "Stopping Saleor Server" - - # do something to kill the service or cleanup or nothing - - log_end_msg $? - exit 0 - ;; - *) - echo "Usage: /etc/init.d/saleor {start|stop}" - exit 1 - ;; -esac \ No newline at end of file diff --git a/resources/saleor/server_block b/resources/saleor/server_block new file mode 100644 index 0000000..fd43180 --- /dev/null +++ b/resources/saleor/server_block @@ -0,0 +1,34 @@ +# the upstream component nginx needs to connect to +upstream django { + server unix://{hd}/saleor/saleor.sock; +} +# configuration of the server +server { + listen 80; + server_name {host} www.{host}; + charset utf-8; + # max upload size + client_max_body_size 75M; + # Django media and static files + location /media { + alias {hd}}/saleor/media; + } + location /static { + alias {hd}/saleor/static; + } + # Send all non-media requests to the Django server. + location / { + uwsgi_pass django; + include {hd}/saleor/uwsgi_params; + } + + location /graphql/ { + proxy_pass https://{apihost}:{apiport}; + } + + location /dashboard/ { + path {hd}/saleor-dashboard/build/; + index index.html; + try_files $uri $uri/ /dashboard/index.html; + } +} \ No newline at end of file diff --git a/resources/saleor/template.env b/resources/saleor/template.env new file mode 100644 index 0000000..212a091 --- /dev/null +++ b/resources/saleor/template.env @@ -0,0 +1,26 @@ +PROJECT_ROOT="{proot}" + +DEFAULT_COUNTRY="{country}" +DEFAULT_CURRENCY="{currency}" + +ALLOWED_CLIENT_HOSTS="{chosts}" +ALLOWED_HOSTS="{ahosts}" +ALLOWED_GRAPHQL_ORIGINS="{gqlorigins}" + +#INTERNAL_IPS="{iips}" +DATABASE_URL="{dburl}" + +EMAIL_URL="{emailurl}" +#SENDGRID_USERNAME="{sguser}" +#SENDGRID_PASSWORD="{sgpass}" +DEFAULT_FROM_EMAIL="{dfemail}" + +STATIC_URL="{static}" +MEDIA_URL="{media}" + +#MAX_CHECKOUT_LINE_QUANTITY="{mclq}" + +#OPENEXCHANGERATES_API_KEY="{openxkey}" +#GOOGLE_ANALYTICS_TRACKING_ID="{gatid}" + +DEBUG=False \ No newline at end of file diff --git a/resources/saleor/template.service b/resources/saleor/template.service new file mode 100644 index 0000000..d167cf5 --- /dev/null +++ b/resources/saleor/template.service @@ -0,0 +1,9 @@ +[Unit] +Description=uWSGI for Saleor API +After=network.target +[Service] +User={un} +Restart=always +ExecStart={hd}/env/saleor/bin/uwsgi --emperor {hd}/env/saleor/vassals --uid www-data --gid www-data +[Install] +WantedBy=multi-user.target \ No newline at end of file diff --git a/resources/saleor/uwsgi_params b/resources/saleor/uwsgi_params new file mode 100644 index 0000000..111ccc3 --- /dev/null +++ b/resources/saleor/uwsgi_params @@ -0,0 +1,14 @@ +uwsgi_param QUERY_STRING $query_string; +uwsgi_param REQUEST_METHOD $request_method; +uwsgi_param CONTENT_TYPE $content_type; +uwsgi_param CONTENT_LENGTH $content_length; +uwsgi_param REQUEST_URI $request_uri; +uwsgi_param PATH_INFO $document_uri; +uwsgi_param DOCUMENT_ROOT $document_root; +uwsgi_param SERVER_PROTOCOL $server_protocol; +uwsgi_param REQUEST_SCHEME $scheme; +uwsgi_param HTTPS $https if_not_empty; +uwsgi_param REMOTE_ADDR $remote_addr; +uwsgi_param REMOTE_PORT $remote_port; +uwsgi_param SERVER_PORT $server_port; +uwsgi_param SERVER_NAME $server_name; \ No newline at end of file diff --git a/resources/server_block b/resources/server_block deleted file mode 100644 index d7601df..0000000 --- a/resources/server_block +++ /dev/null @@ -1,14 +0,0 @@ -server { - listen 80; - server_name {host} www.{host}; - - location /graphql/ { - proxy_pass https://{apihost}:{apiport}; - } - - location /dashboard/ { - path {hd}/saleor-dashboard/build/; - index index.html; - try_files $uri $uri/ /dashboard/index.html; - } -} \ No newline at end of file diff --git a/saleor/settings.py b/saleor/settings.py deleted file mode 100644 index a2410f2..0000000 --- a/saleor/settings.py +++ /dev/null @@ -1,591 +0,0 @@ -import ast -import os.path -import warnings -from datetime import timedelta - -import dj_database_url -import dj_email_url -import django_cache_url -import jaeger_client -import jaeger_client.config -import pkg_resources -import sentry_sdk -import sentry_sdk.utils -from django.core.exceptions import ImproperlyConfigured -from django.core.management.utils import get_random_secret_key -from pytimeparse import parse -from sentry_sdk.integrations.celery import CeleryIntegration -from sentry_sdk.integrations.django import DjangoIntegration - - -def get_list(text): - return [item.strip() for item in text.split(",")] - - -def get_bool_from_env(name, default_value): - if name in os.environ: - value = os.environ[name] - try: - return ast.literal_eval(value) - except ValueError as e: - raise ValueError("{} is an invalid value for {}".format(value, name)) from e - return default_value - - -DEBUG = get_bool_from_env("DEBUG", True) - -SITE_ID = 1 - -PROJECT_ROOT = os.path.normpath(os.path.join(os.path.dirname(__file__), "..")) - -ROOT_URLCONF = "saleor.urls" - -WSGI_APPLICATION = "saleor.wsgi.application" - -ADMINS = ( - # ('Your Name', 'your_email@example.com'), -) -MANAGERS = ADMINS - -_DEFAULT_CLIENT_HOSTS = "localhost,127.0.0.1" - -ALLOWED_CLIENT_HOSTS = os.environ.get("ALLOWED_CLIENT_HOSTS") -if not ALLOWED_CLIENT_HOSTS: - if DEBUG: - ALLOWED_CLIENT_HOSTS = _DEFAULT_CLIENT_HOSTS - else: - raise ImproperlyConfigured( - "ALLOWED_CLIENT_HOSTS environment variable must be set when DEBUG=False." - ) - -ALLOWED_CLIENT_HOSTS = get_list(ALLOWED_CLIENT_HOSTS) - -INTERNAL_IPS = get_list(os.environ.get("INTERNAL_IPS", "127.0.0.1")) - -DATABASES = { - "default": dj_database_url.config( - default="postgres://saleor:saleor@localhost:5432/saleor", conn_max_age=600 - ) -} - - -TIME_ZONE = "UTC" -LANGUAGE_CODE = "en" -LANGUAGES = [ - ("ar", "Arabic"), - ("az", "Azerbaijani"), - ("bg", "Bulgarian"), - ("bn", "Bengali"), - ("ca", "Catalan"), - ("cs", "Czech"), - ("da", "Danish"), - ("de", "German"), - ("el", "Greek"), - ("en", "English"), - ("es", "Spanish"), - ("es-co", "Colombian Spanish"), - ("et", "Estonian"), - ("fa", "Persian"), - ("fi", "Finnish"), - ("fr", "French"), - ("hi", "Hindi"), - ("hu", "Hungarian"), - ("hy", "Armenian"), - ("id", "Indonesian"), - ("is", "Icelandic"), - ("it", "Italian"), - ("ja", "Japanese"), - ("ka", "Georgian"), - ("km", "Khmer"), - ("ko", "Korean"), - ("lt", "Lithuanian"), - ("mn", "Mongolian"), - ("my", "Burmese"), - ("nb", "Norwegian"), - ("nl", "Dutch"), - ("pl", "Polish"), - ("pt", "Portuguese"), - ("pt-br", "Brazilian Portuguese"), - ("ro", "Romanian"), - ("ru", "Russian"), - ("sk", "Slovak"), - ("sl", "Slovenian"), - ("sq", "Albanian"), - ("sr", "Serbian"), - ("sv", "Swedish"), - ("sw", "Swahili"), - ("ta", "Tamil"), - ("th", "Thai"), - ("tr", "Turkish"), - ("uk", "Ukrainian"), - ("vi", "Vietnamese"), - ("zh-hans", "Simplified Chinese"), - ("zh-hant", "Traditional Chinese"), -] -LOCALE_PATHS = [os.path.join(PROJECT_ROOT, "locale")] -USE_I18N = True -USE_L10N = True -USE_TZ = True - -FORM_RENDERER = "django.forms.renderers.TemplatesSetting" - -EMAIL_URL = os.environ.get("EMAIL_URL") -SENDGRID_USERNAME = os.environ.get("SENDGRID_USERNAME") -SENDGRID_PASSWORD = os.environ.get("SENDGRID_PASSWORD") -if not EMAIL_URL and SENDGRID_USERNAME and SENDGRID_PASSWORD: - EMAIL_URL = "smtp://%s:%s@smtp.sendgrid.net:587/?tls=True" % ( - SENDGRID_USERNAME, - SENDGRID_PASSWORD, - ) -email_config = dj_email_url.parse( - EMAIL_URL or "console://demo@example.com:console@example/" -) - -EMAIL_FILE_PATH = email_config["EMAIL_FILE_PATH"] -EMAIL_HOST_USER = email_config["EMAIL_HOST_USER"] -EMAIL_HOST_PASSWORD = email_config["EMAIL_HOST_PASSWORD"] -EMAIL_HOST = email_config["EMAIL_HOST"] -EMAIL_PORT = email_config["EMAIL_PORT"] -EMAIL_BACKEND = email_config["EMAIL_BACKEND"] -EMAIL_USE_TLS = email_config["EMAIL_USE_TLS"] -EMAIL_USE_SSL = email_config["EMAIL_USE_SSL"] - -# If enabled, make sure you have set proper storefront address in ALLOWED_CLIENT_HOSTS. -ENABLE_ACCOUNT_CONFIRMATION_BY_EMAIL = get_bool_from_env( - "ENABLE_ACCOUNT_CONFIRMATION_BY_EMAIL", True -) - -ENABLE_SSL = get_bool_from_env("ENABLE_SSL", False) - -if ENABLE_SSL: - SECURE_SSL_REDIRECT = not DEBUG - -DEFAULT_FROM_EMAIL = os.environ.get("DEFAULT_FROM_EMAIL", EMAIL_HOST_USER) - -MEDIA_ROOT = os.path.join(PROJECT_ROOT, "media") -MEDIA_URL = os.environ.get("MEDIA_URL", "/media/") - -STATIC_ROOT = os.path.join(PROJECT_ROOT, "static") -STATIC_URL = os.environ.get("STATIC_URL", "/static/") -STATICFILES_DIRS = [ - ("images", os.path.join(PROJECT_ROOT, "saleor", "static", "images")) -] -STATICFILES_FINDERS = [ - "django.contrib.staticfiles.finders.FileSystemFinder", - "django.contrib.staticfiles.finders.AppDirectoriesFinder", -] - -context_processors = [ - "django.template.context_processors.debug", - "django.template.context_processors.media", - "django.template.context_processors.static", - "saleor.site.context_processors.site", -] - -loaders = [ - "django.template.loaders.filesystem.Loader", - "django.template.loaders.app_directories.Loader", -] - -TEMPLATES = [ - { - "BACKEND": "django.template.backends.django.DjangoTemplates", - "DIRS": [os.path.join(PROJECT_ROOT, "templates")], - "OPTIONS": { - "debug": DEBUG, - "context_processors": context_processors, - "loaders": loaders, - "string_if_invalid": '<< MISSING VARIABLE "%s" >>' if DEBUG else "", - }, - } -] - -# Read secret key from a file -with open('/etc/saleor/api_sk') as f: - SECRET_KEY = f.read().strip() - -if not SECRET_KEY and DEBUG: - warnings.warn("SECRET_KEY not configured, using a random temporary key.") - SECRET_KEY = get_random_secret_key() - -MIDDLEWARE = [ - "django.middleware.security.SecurityMiddleware", - "django.middleware.common.CommonMiddleware", - "saleor.core.middleware.request_time", - "saleor.core.middleware.discounts", - "saleor.core.middleware.google_analytics", - "saleor.core.middleware.country", - "saleor.core.middleware.currency", - "saleor.core.middleware.site", - "saleor.core.middleware.plugins", - "saleor.core.middleware.jwt_refresh_token_middleware", -] - -INSTALLED_APPS = [ - # External apps that need to go before django's - "storages", - # Django modules - "django.contrib.contenttypes", - "django.contrib.sites", - "django.contrib.staticfiles", - "django.contrib.auth", - "django.contrib.postgres", - # Local apps - "saleor.plugins", - "saleor.account", - "saleor.discount", - "saleor.giftcard", - "saleor.product", - "saleor.attribute", - "saleor.channel", - "saleor.checkout", - "saleor.core", - "saleor.csv", - "saleor.graphql", - "saleor.menu", - "saleor.order", - "saleor.invoice", - "saleor.seo", - "saleor.shipping", - "saleor.search", - "saleor.site", - "saleor.page", - "saleor.payment", - "saleor.warehouse", - "saleor.webhook", - "saleor.wishlist", - "saleor.app", - # External apps - "versatileimagefield", - "django_measurement", - "django_prices", - "django_prices_openexchangerates", - "django_prices_vatlayer", - "graphene_django", - "mptt", - "django_countries", - "django_filters", - "phonenumber_field", -] - - -ENABLE_DEBUG_TOOLBAR = get_bool_from_env("ENABLE_DEBUG_TOOLBAR", False) -if ENABLE_DEBUG_TOOLBAR: - # Ensure the graphiql debug toolbar is actually installed before adding it - try: - __import__("graphiql_debug_toolbar") - except ImportError as exc: - msg = ( - f"{exc} -- Install the missing dependencies by " - f"running `pip install -r requirements_dev.txt`" - ) - warnings.warn(msg) - else: - INSTALLED_APPS += ["django.forms", "debug_toolbar", "graphiql_debug_toolbar"] - MIDDLEWARE.append("saleor.graphql.middleware.DebugToolbarMiddleware") - - DEBUG_TOOLBAR_PANELS = [ - "ddt_request_history.panels.request_history.RequestHistoryPanel", - "debug_toolbar.panels.timer.TimerPanel", - "debug_toolbar.panels.headers.HeadersPanel", - "debug_toolbar.panels.request.RequestPanel", - "debug_toolbar.panels.sql.SQLPanel", - "debug_toolbar.panels.profiling.ProfilingPanel", - ] - DEBUG_TOOLBAR_CONFIG = {"RESULTS_CACHE_SIZE": 100} - -LOGGING = { - "version": 1, - "disable_existing_loggers": False, - "root": {"level": "INFO", "handlers": ["default"]}, - "formatters": { - "django.server": { - "()": "django.utils.log.ServerFormatter", - "format": "[{server_time}] {message}", - "style": "{", - }, - "json": { - "()": "saleor.core.logging.JsonFormatter", - "datefmt": "%Y-%m-%dT%H:%M:%SZ", - "format": ( - "%(asctime)s %(levelname)s %(lineno)s %(message)s %(name)s " - + "%(pathname)s %(process)d %(threadName)s" - ), - }, - "verbose": { - "format": ( - "%(levelname)s %(name)s %(message)s [PID:%(process)d:%(threadName)s]" - ) - }, - }, - "handlers": { - "default": { - "level": "DEBUG", - "class": "logging.StreamHandler", - "formatter": "verbose" if DEBUG else "json", - }, - "django.server": { - "level": "INFO", - "class": "logging.StreamHandler", - "formatter": "django.server" if DEBUG else "json", - }, - }, - "loggers": { - "django": {"level": "INFO", "propagate": True}, - "django.server": { - "handlers": ["django.server"], - "level": "INFO", - "propagate": False, - }, - "saleor": {"level": "DEBUG", "propagate": True}, - "saleor.graphql.errors.handled": { - "handlers": ["default"], - "level": "INFO", - "propagate": False, - }, - "graphql.execution.utils": {"propagate": False}, - }, -} - -AUTH_USER_MODEL = "account.User" - -AUTH_PASSWORD_VALIDATORS = [ - { - "NAME": "django.contrib.auth.password_validation.MinimumLengthValidator", - "OPTIONS": {"min_length": 8}, - } -] - -DEFAULT_COUNTRY = os.environ.get("DEFAULT_COUNTRY", "US") -DEFAULT_CURRENCY = os.environ.get("DEFAULT_CURRENCY", "USD") -DEFAULT_DECIMAL_PLACES = 3 -DEFAULT_MAX_DIGITS = 12 -DEFAULT_CURRENCY_CODE_LENGTH = 3 - -# The default max length for the display name of the -# sender email address. -# Following the recommendation of https://tools.ietf.org/html/rfc5322#section-2.1.1 -DEFAULT_MAX_EMAIL_DISPLAY_NAME_LENGTH = 78 - -COUNTRIES_OVERRIDE = {"EU": "European Union"} - -OPENEXCHANGERATES_API_KEY = os.environ.get("OPENEXCHANGERATES_API_KEY") - -GOOGLE_ANALYTICS_TRACKING_ID = os.environ.get("GOOGLE_ANALYTICS_TRACKING_ID") - - -def get_host(): - from django.contrib.sites.models import Site - - return Site.objects.get_current().domain - - -PAYMENT_HOST = get_host - -PAYMENT_MODEL = "order.Payment" - -MAX_CHECKOUT_LINE_QUANTITY = int(os.environ.get("MAX_CHECKOUT_LINE_QUANTITY", 50)) - -TEST_RUNNER = "saleor.tests.runner.PytestTestRunner" - - -PLAYGROUND_ENABLED = get_bool_from_env("PLAYGROUND_ENABLED", True) - -ALLOWED_HOSTS = get_list(os.environ.get("ALLOWED_HOSTS", "localhost,127.0.0.1")) -ALLOWED_GRAPHQL_ORIGINS = get_list(os.environ.get("ALLOWED_GRAPHQL_ORIGINS", "*")) - -SECURE_PROXY_SSL_HEADER = ("HTTP_X_FORWARDED_PROTO", "https") - -# Amazon S3 configuration -# See https://django-storages.readthedocs.io/en/latest/backends/amazon-S3.html -AWS_ACCESS_KEY_ID = os.environ.get("AWS_ACCESS_KEY_ID") -AWS_LOCATION = os.environ.get("AWS_LOCATION", "") -AWS_MEDIA_BUCKET_NAME = os.environ.get("AWS_MEDIA_BUCKET_NAME") -AWS_MEDIA_CUSTOM_DOMAIN = os.environ.get("AWS_MEDIA_CUSTOM_DOMAIN") -AWS_QUERYSTRING_AUTH = get_bool_from_env("AWS_QUERYSTRING_AUTH", False) -AWS_QUERYSTRING_EXPIRE = get_bool_from_env("AWS_QUERYSTRING_EXPIRE", 3600) -AWS_S3_CUSTOM_DOMAIN = os.environ.get("AWS_STATIC_CUSTOM_DOMAIN") -AWS_S3_ENDPOINT_URL = os.environ.get("AWS_S3_ENDPOINT_URL", None) -AWS_S3_REGION_NAME = os.environ.get("AWS_S3_REGION_NAME", None) -AWS_SECRET_ACCESS_KEY = os.environ.get("AWS_SECRET_ACCESS_KEY") -AWS_STORAGE_BUCKET_NAME = os.environ.get("AWS_STORAGE_BUCKET_NAME") -AWS_DEFAULT_ACL = os.environ.get("AWS_DEFAULT_ACL", None) - -# Google Cloud Storage configuration -GS_PROJECT_ID = os.environ.get("GS_PROJECT_ID") -GS_STORAGE_BUCKET_NAME = os.environ.get("GS_STORAGE_BUCKET_NAME") -GS_MEDIA_BUCKET_NAME = os.environ.get("GS_MEDIA_BUCKET_NAME") -GS_AUTO_CREATE_BUCKET = get_bool_from_env("GS_AUTO_CREATE_BUCKET", False) -GS_QUERYSTRING_AUTH = get_bool_from_env("GS_QUERYSTRING_AUTH", False) -GS_DEFAULT_ACL = os.environ.get("GS_DEFAULT_ACL", None) -GS_MEDIA_CUSTOM_ENDPOINT = os.environ.get("GS_MEDIA_CUSTOM_ENDPOINT", None) -GS_EXPIRATION = os.environ.get("GS_EXPIRATION", None) - -# If GOOGLE_APPLICATION_CREDENTIALS is set there is no need to load OAuth token -# See https://django-storages.readthedocs.io/en/latest/backends/gcloud.html -if "GOOGLE_APPLICATION_CREDENTIALS" not in os.environ: - GS_CREDENTIALS = os.environ.get("GS_CREDENTIALS") - -if AWS_STORAGE_BUCKET_NAME: - STATICFILES_STORAGE = "storages.backends.s3boto3.S3Boto3Storage" -elif GS_STORAGE_BUCKET_NAME: - STATICFILES_STORAGE = "storages.backends.gcloud.GoogleCloudStorage" - -if AWS_MEDIA_BUCKET_NAME: - DEFAULT_FILE_STORAGE = "saleor.core.storages.S3MediaStorage" - THUMBNAIL_DEFAULT_STORAGE = DEFAULT_FILE_STORAGE -elif GS_MEDIA_BUCKET_NAME: - DEFAULT_FILE_STORAGE = "saleor.core.storages.GCSMediaStorage" - THUMBNAIL_DEFAULT_STORAGE = DEFAULT_FILE_STORAGE - -VERSATILEIMAGEFIELD_RENDITION_KEY_SETS = { - "products": [ - ("product_gallery", "thumbnail__540x540"), - ("product_gallery_2x", "thumbnail__1080x1080"), - ("product_small", "thumbnail__60x60"), - ("product_small_2x", "thumbnail__120x120"), - ("product_list", "thumbnail__255x255"), - ("product_list_2x", "thumbnail__510x510"), - ], - "background_images": [("header_image", "thumbnail__1080x440")], - "user_avatars": [("default", "thumbnail__445x445")], -} - -VERSATILEIMAGEFIELD_SETTINGS = { - # Images should be pre-generated on Production environment - "create_images_on_demand": get_bool_from_env("CREATE_IMAGES_ON_DEMAND", DEBUG) -} - -PLACEHOLDER_IMAGES = { - 60: "images/placeholder60x60.png", - 120: "images/placeholder120x120.png", - 255: "images/placeholder255x255.png", - 540: "images/placeholder540x540.png", - 1080: "images/placeholder1080x1080.png", -} - -DEFAULT_PLACEHOLDER = "images/placeholder255x255.png" - -SEARCH_BACKEND = "saleor.search.backends.postgresql" - -AUTHENTICATION_BACKENDS = [ - "saleor.core.auth_backend.JSONWebTokenBackend", -] - -# CELERY SETTINGS -CELERY_TIMEZONE = TIME_ZONE -CELERY_BROKER_URL = ( - os.environ.get("CELERY_BROKER_URL", os.environ.get("CLOUDAMQP_URL")) or "" -) -CELERY_TASK_ALWAYS_EAGER = not CELERY_BROKER_URL -CELERY_ACCEPT_CONTENT = ["json"] -CELERY_TASK_SERIALIZER = "json" -CELERY_RESULT_SERIALIZER = "json" -CELERY_RESULT_BACKEND = os.environ.get("CELERY_RESULT_BACKEND", None) - -# Change this value if your application is running behind a proxy, -# e.g. HTTP_CF_Connecting_IP for Cloudflare or X_FORWARDED_FOR -REAL_IP_ENVIRON = os.environ.get("REAL_IP_ENVIRON", "REMOTE_ADDR") - -# Slugs for menus precreated in Django migrations -DEFAULT_MENUS = {"top_menu_name": "navbar", "bottom_menu_name": "footer"} - -# Slug for channel precreated in Django migrations -DEFAULT_CHANNEL_SLUG = os.environ.get("DEFAULT_CHANNEL_SLUG", "default-channel") - - -# Sentry -sentry_sdk.utils.MAX_STRING_LENGTH = 4096 -SENTRY_DSN = os.environ.get("SENTRY_DSN") -if SENTRY_DSN: - sentry_sdk.init( - dsn=SENTRY_DSN, integrations=[CeleryIntegration(), DjangoIntegration()] - ) - -GRAPHENE = { - "RELAY_CONNECTION_ENFORCE_FIRST_OR_LAST": True, - "RELAY_CONNECTION_MAX_LIMIT": 100, - "MIDDLEWARE": [ - "saleor.graphql.middleware.OpentracingGrapheneMiddleware", - "saleor.graphql.middleware.JWTMiddleware", - "saleor.graphql.middleware.app_middleware", - ], -} - -PLUGINS_MANAGER = "saleor.plugins.manager.PluginsManager" - -PLUGINS = [ - "saleor.plugins.avatax.plugin.AvataxPlugin", - "saleor.plugins.vatlayer.plugin.VatlayerPlugin", - "saleor.plugins.webhook.plugin.WebhookPlugin", - "saleor.payment.gateways.dummy.plugin.DummyGatewayPlugin", - "saleor.payment.gateways.dummy_credit_card.plugin.DummyCreditCardGatewayPlugin", - "saleor.payment.gateways.stripe.plugin.StripeGatewayPlugin", - "saleor.payment.gateways.braintree.plugin.BraintreeGatewayPlugin", - "saleor.payment.gateways.razorpay.plugin.RazorpayGatewayPlugin", - "saleor.payment.gateways.adyen.plugin.AdyenGatewayPlugin", - "saleor.payment.gateways.authorize_net.plugin.AuthorizeNetGatewayPlugin", - "saleor.plugins.invoicing.plugin.InvoicingPlugin", -] - -# Plugin discovery -installed_plugins = pkg_resources.iter_entry_points("saleor.plugins") -for entry_point in installed_plugins: - plugin_path = "{}.{}".format(entry_point.module_name, entry_point.attrs[0]) - if plugin_path not in PLUGINS: - if entry_point.name not in INSTALLED_APPS: - INSTALLED_APPS.append(entry_point.name) - PLUGINS.append(plugin_path) - -if ( - not DEBUG - and ENABLE_ACCOUNT_CONFIRMATION_BY_EMAIL - and ALLOWED_CLIENT_HOSTS == get_list(_DEFAULT_CLIENT_HOSTS) -): - raise ImproperlyConfigured( - "Make sure you've added storefront address to ALLOWED_CLIENT_HOSTS " - "if ENABLE_ACCOUNT_CONFIRMATION_BY_EMAIL is enabled." - ) - -# Initialize a simple and basic Jaeger Tracing integration -# for open-tracing if enabled. -# -# Refer to our guide on https://docs.saleor.io/docs/next/guides/opentracing-jaeger/. -# -# If running locally, set: -# JAEGER_AGENT_HOST=localhost -if "JAEGER_AGENT_HOST" in os.environ: - jaeger_client.Config( - config={ - "sampler": {"type": "const", "param": 1}, - "local_agent": { - "reporting_port": os.environ.get( - "JAEGER_AGENT_PORT", jaeger_client.config.DEFAULT_REPORTING_PORT - ), - "reporting_host": os.environ.get("JAEGER_AGENT_HOST"), - }, - "logging": get_bool_from_env("JAEGER_LOGGING", False), - }, - service_name="saleor", - validate=True, - ).initialize_tracer() - - -# Some cloud providers (Heroku) export REDIS_URL variable instead of CACHE_URL -REDIS_URL = os.environ.get("REDIS_URL") -if REDIS_URL: - CACHE_URL = os.environ.setdefault("CACHE_URL", REDIS_URL) -CACHES = {"default": django_cache_url.config()} - -# Default False because storefront and dashboard don't support expiration of token -JWT_EXPIRE = get_bool_from_env("JWT_EXPIRE", False) -JWT_TTL_ACCESS = timedelta(seconds=parse(os.environ.get("JWT_TTL_ACCESS", "5 minutes"))) -JWT_TTL_APP_ACCESS = timedelta( - seconds=parse(os.environ.get("JWT_TTL_APP_ACCESS", "5 minutes")) -) -JWT_TTL_REFRESH = timedelta(seconds=parse(os.environ.get("JWT_TTL_REFRESH", "30 days"))) - - -JWT_TTL_REQUEST_EMAIL_CHANGE = timedelta( - seconds=parse(os.environ.get("JWT_TTL_REQUEST_EMAIL_CHANGE", "1 hour")), -)