Skip to content

Latest commit

 

History

History
 
 

manual_install

Folders and files

NameName
Last commit message
Last commit date

parent directory

..
 
 

Manual installation instructions

These intructions are inspired from a standard django/gunicorn/postgresql instructions (for example)

Important note: Be sure to use pyton3.8 and pip related to python 3.8. Depending on your distribution calling python or pip will use python2 instead of pyton 3.8.

Prerequisites

Optional: create a virtual env and activate it

Get the last version from the repository: git clone https://github.com/vabene1111/recipes.git -b master

Install postgresql requirements: sudo apt install libpq-dev postgresql Install project requirements: pip3.8 install -r requirements.txt

Setup postgresql

Run sudo -u postgres psql

In the psql console:

CREATE DATABASE djangodb;
CREATE USER djangouser WITH PASSWORD 'password';
GRANT ALL PRIVILEGES ON DATABASE djangodb TO djangouser;
ALTER DATABASE djangodb OWNER TO djangouser;

--Maybe not necessary, but should be faster:
ALTER ROLE djangouser SET client_encoding TO 'utf8';
ALTER ROLE djangouser SET default_transaction_isolation TO 'read committed';
ALTER ROLE djangouser SET timezone TO 'UTC';

--Grant superuser right to your new user, it will be removed later
ALTER USER djangouser WITH SUPERUSER;

Move or copy .env.template to .env and update it with relevent values. For example:

# only set this to true when testing/debugging
# when unset: 1 (true) - dont unset this, just for development
DEBUG=0

# hosts the application can run under e.g. recipes.mydomain.com,cooking.mydomain.com,...
#ALLOWED_HOSTS=*

# random secret key, use for example base64 /dev/urandom | head -c50 to generate one
SECRET_KEY=TOGENERATE

# add only a database password if you want to run with the default postgres, otherwise change settings accordingly
DB_ENGINE=django.db.backends.postgresql_psycopg2
POSTGRES_HOST=localhost
POSTGRES_PORT=5432
POSTGRES_USER=djangouser
POSTGRES_PASSWORD=password
POSTGRES_DB=djangodb

# Serve mediafiles directly using gunicorn. Basically everyone recommends not doing this. Please use any of the examples
# provided that include an additional nxginx container to handle media file serving.
# If you know what you are doing turn this back on (1) to serve media files using djangos serve() method.
# when unset: 1 (true) - this is temporary until an appropriate amount of time has passed for everyone to migrate
GUNICORN_MEDIA=0


# allow authentication via reverse proxy (e.g. authelia), leave of if you dont know what you are doing
# docs: https://github.com/vabene1111/recipes/tree/develop/docs/docker/nginx-proxy%20with%20proxy%20authentication
# when unset: 0 (false)
REVERSE_PROXY_AUTH=0


# the default value for the user preference 'comments' (enable/disable commenting system)
# when unset: 1 (true)
COMMENT_PREF_DEFAULT=1

Initialize the application

Execute export $(cat .env |grep "^[^#]" | xargs) to load variables from .env

Execute /python3.8 manage.py migrate

And revert superuser from postgres: sudo -u postgres psql and ALTER USER djangouser WITH NOSUPERUSER;

Generate static files: python3.8 manage.py collectstatic and remember the folder where files have been copied.

Setup web services

gunicorn

Create a service that will start gunicorn at boot: sudo nano /etc/systemd/system/gunicorn_recipes.service

And enter these lines:

[Unit]
Description=gunicorn daemon for recipes
After=network.target

[Service]
Type=simple
Restart=always
RestartSec=3
Group=www-data
WorkingDirectory=/media/data/recipes
EnvironmentFile=/media/data/recipes/.env
ExecStart=/opt/.pyenv/versions/3.8.5/bin/gunicorn --error-logfile /tmp/gunicorn_err.log --log-level debug --capture-output --bind unix:/media/data/recipes/recipes.sock recipes.wsgi:application

[Install]
WantedBy=multi-user.target

Note: -error-logfile /tmp/gunicorn_err.log --log-level debug --capture-output are usefull for debugging and can be removed later

Note2: Fix the path in the ExecStart line to where you gunicorn and recipes are

Finally, run sudo systemctl enable gunicorn_recipes.service and sudo systemctl start gunicorn_recipes.service. You can check that the service is correctly started with systemctl status gunicorn_recipes.service

nginx

Now we tell nginx to listen to a new port and forward that to gunicorn. sudo nano /etc/nginx/sites-available/recipes.conf

And enter these lines:

server {
    listen 8002;
    #access_log /var/log/nginx/access.log;
    #error_log /var/log/nginx/error.log;

    # serve media files
    location /static {
        alias /media/data/recipes/staticfiles;
    }
    
    location /media {
        alias /media/data/recipes/mediafiles;
    }

    location / {
        proxy_pass http://unix:/media/data/recipes/recipes.sock;
    }
}

Note: Enter the correct path in static and proxy_pass lines.

Enable the website sudo ln -s /etc/nginx/sites-available/recipes.conf /etc/nginx/sites-enabled and restart nginx : sudo systemctl restart nginx.service