Wed 1 Jun, 2022
mkdir ~/path/to/project/root
cd ~/path/to/project/root
python3 -m venv ve
source ve/bin/activate
pip install django
pip install psycopg2
django-admin startproject <projectname> .
mkdir apps logs media static templates settings
touch settings/development.py && touch settings/production.py
mv <projectname>/settings.py settings/core.py
echo "from .core import *" >> settings/development.py
echo "from .core import *" >> settings/production.py
vim manage.py
edit:
os.environ.setdefault('DJANGO_SETTINGS_MODULE','<projectname>.settings')
to:
os.environ.setdefault('DJANGO_SETTINGS_MODULE','settings.development')
:wq
Setup a secrets file on local system and then:
vim settings/core.py
insert:
import os
from pathlib import Path
from configparser import RawConfigParser
config = RawConfigParser()
config.read('/etc/secrets/<projectname>/settings.ini')
BASE_DIR = Path(__file__).resolve().parent.parent
SECRET_KEY = config.get('SECRETS','SECRET_KEY')
In TEMPLATES =[]:
'DIRS': [os.path.join(BASE_DIR,'templates')],
In DATABASES = {}:
DATABASES ={
'default': {
'ENGINE': config.get('DATABASE','ENGINE'),
'NAME': config.get('DATABASE','NAME'),
'USER': config.get('DATABASE','USER'),
'PASSWORD': config.get('DATABASE','PASSWORD'),
'HOST': config.get('DATABASE','HOST'),
'PORT': config.get('DATABASE','PORT'),
}
}
:wq
vim settings/development.py
insert:
DEBUG = True
ALLOWED_HOSTS = []
STATICFILES_DIRS = [
os.path.join(BASE_DIR, 'static/')
]
vim settings/production.py
insert:
DEBUG = False
SITE_ID = 1
SECURE_HSTS_SECONDS = 1
SECURE_SSL_REDIRECT = True
CSRF_COOKIE_SECURE = True
SESSION_COOKIE_SECURE = True
SECURE_HSTS_INCLUDE_SUBDOMAINS = True
SECURE_HSTS_PRELOAD = True
SECURE_REFERRER_POLICY= "origin"
ALLOWED_HOSTS = ['<example.jcaston.uk>']
STATIC_ROOT = os.path.join(BASE_DIR, 'static/')
Also, set up a db environment that is as similar as you can make it to whatever your production environment will be.
In commandline:
$ sudo su postgres
$ psql
$ CREATE DATABASE <name_of_db>;
$ CREATE USER <name_of_db_user> WITH PASSWORD 'p455w0rd';
$ ALTER USER <name_of_db_user> WITH SUPERUSER;
$ GRANT ALL PRIVILEGES ON DATABASE <name_of_db> TO <name_of_db_user>;
$ exit
$ exit
Add these credentials to your
/etc/secrets/<projectname>/settings.ini
Don't forget to edit:
~/path/tp/project/root/<projectname>/wsgi.py
from:
os.environ.setdefault('DJANGO_SETTINGS_MODULE', '<projectname>.settings')
to:
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'settings.production')
And prepare a directory in:
~/path/to/project/root/apps
with a directory named the same as your app, ready for:
(ve) python manage.py startapp <app_name> apps/<directory>
And edit:
~/path/to/project/root/apps/<app_name>/apps.py
from:
name = '<app_name>'
to:
name = 'apps.<app_name>'
And now you're ready to actually do something.
blog.jcaston.uk // 2025