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.
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
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
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.
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
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