Heroku Django Project (HDP)


Téléchargement du dépôt

git clone https://github.com/CodiTheck/heroku-django.git

Fais en bonne usage !


Installation et configuration

Installation de python3

sudo apt install python3
sudo apt install python3-pip

Il faut s'assurer de la version de python qui est installée. La version de python utilisée est python 3.9.12. Tu peux aussi utiliser la version 3.8.

Installation de venv

sudo apt install python3-venv

OU

sudo pip3 install virtualenv

Créer un environnement virtuel

python3 -m venv env

OU

virtualenv env -p python3

Démarrage de l'environnement

source env/bin/activate

Installation des dépendances

pip install -r requirements.txt

Création de la base de données

La création de la base de données se fera en deux parties :

Première partie

Le système de gestion de base de données utilisé est PostgreSQL. Pour l'installer, tape la commande suivante :

sudo apt install postgresql

Démarre ensuite le service du SGBDR avec la commande suivante:

sudo service postgresql start

Connecte toi en mode root avec les deux commandes suivantes :

sudo su - postgres
psql

Seconde partie

Exécutez les trois commandes SQL suivantes :

  1. Création d'un utilisateur :
CREATE USER user_name WITH ENCRYPTED PASSWORD 'secretpassword' LOGIN NOCREATEDB;
  1. Création de la base de données pour l'utilisateur précédement créé :
CREATE DATABASE db_name OWNER user_name;
  1. Attribution du droit de connexion à la base de données à l'utilisateur :
GRANT CONNECT ON DATABASE db_name TO user_name;
  1. Note bien les information que tu as utilisées pour créer l'utilisateur et la base de données quelque part, car tu en aura besoin pour configurer ton programme. Dans le cas présent, on a :
FIELDS VALUES
DB_NAME db_name
USERNAME user_name
PASSWORD secretpassword
  1. Déconnectez vous enfin du SGBDR en faisant deux fois CTRL + D.

Création des connexions du serveur WEB à la base de données

  1. Il faut créer un fichier .env à la racine du dossier du projet à partir de l'exemple .env_example :
cp .env_example .env
  1. Insérer les informations que tu avais noté à l'étape 4 de la seconde partie de la procédure de Création de la base de données dans le fichier .env :
FIELDS VALUES
DB_NAME db_name
USERNAME user_name
PASSWORD secretpassword
HOST 127.0.0.1
PORT 5432

Voici donc le contenu du fichier .env :

DB_NAME=db_name
USERNAME=user_name
PASSWORD=secretpassword
HOST=127.0.0.1
PORT=5432

Si le port 5432 ne marche pas, alors essayez avec le port 5433.

Ensuite exécute la commande suivante pour définir les variables du fichier .env dans l'environnement virtuel.

source .env
  1. Ouvre le fichier core/settings.py et rend toi à la ligne où c'est marqué Database dans les commentaires.
...

# Database
# https://docs.djangoproject.com/en/3.2/ref/settings/#databases

DATABASES = {
   'default': {
       'ENGINE': 'django.db.backends.sqlite3',
       'NAME': BASE_DIR / 'db.sqlite3',
   }
}

# DATABASES = {
#     'default': {
#         'ENGINE': 'django.db.backends.postgresql_psycopg2',
#         'NAME': os.getenv("DB_NAME", ''),
#         'USER': os.getenv("USERNAME", ''),
#         'PASSWORD': os.getenv("PASSWORD", ''),
#         'HOST': os.getenv("HOST", ''),
#         'PORT': os.getenv('PORT', ''),
#     }
# };

...

Commente la première configuration de la base de données (DATABASES) et décommente la deuxième. Ce que tu dois avoir est donc :

...

# Database
# https://docs.djangoproject.com/en/3.2/ref/settings/#databases

# DATABASES = {
#    'default': {
#        'ENGINE': 'django.db.backends.sqlite3',
#        'NAME': BASE_DIR / 'db.sqlite3',
#    }
# }

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql_psycopg2',
        'NAME': os.getenv("DB_NAME", ''),
        'USER': os.getenv("USERNAME", ''),
        'PASSWORD': os.getenv("PASSWORD", ''),
        'HOST': os.getenv("HOST", ''),
        'PORT': os.getenv('PORT', ''),
    }
};

...
  1. Exécute les commandes suivantes pour faire la migration des modèles de base de données
./manage.py makemigrations
./manage.py migrate

Création d'un super utilisateur pour l'espace admin

./manage.py createsuperuser

Tu peux juste renseigner le username et le password.

Démarrage du serveur de django

./manage.py runserver

Résultats dans le terminal, qui indique que tout va bien est :

Watching for file changes with StatReloader
Performing system checks...

System check identified no issues (0 silenced).
January 21, 2022 - 07:53:49
Django version 3.2.6, using settings 'docs.settings'
Starting development server at http://127.0.0.1:8000/
Quit the server with CONTROL-C.

Nettoyage de la base de données

Cette section est facultative. Mais, il peut arriver un jour où tu aurras besoin de néttoyer toutes les tables de la base de données. Alors, c'est simple. Pour y parvcenir, tu peux simplement supprimer tous les schémas que tu as créé. Dans cet exemple, il n'y a qu'un seul schéma que tu vas néttoyer : public.
Connecte toi en mode root avec les deux commandes suivantes :

sudo su - postgres
psql

Ensuite connecte toi en tent que user_name à db_name :

\c user_name db_name

Maintenant, tu peut supprimer le schéma :

DROP SCHEMA public CASCADE;

Ensuite tu le recrée avec la commande SQL suivante :

CREATE SCHEMA public;

Et enfin, il ne faut pas oublier de redonner les droit d'accès du schéma à l'utilisateur utilisé par ton application pour se connecter.

GRANT ALL ON SCHEMA public TO user_name;
GRANT ALL ON SCHEMA public TO public;

Hébergement du serveur sur Heroku

Concernant l'hébergement du serveur sur Heroku, tu dois faire les choses suivantes:

  1. créer l'application sur Heroku en premier;
  2. clonner ce projet dans votre répertoire de travail;
  3. redéfinir l'URL HOST du serveur de l'application dans le fichier core/prod_settings.py;
  4. sur héroku, au niveau des configurations de ton application, définir deux variables dans les variables d'environnement : SECRET_KEY et DJANGO_SETTINGS_MODULE qui représentes respectievement la clé secrete utilisée par le serveur et le fichier de configuration globale du projet Django;
  5. connecter l'application créée sur Heroku à ton l'application;
  6. Envoyer l'application par Git au serveur Heroku.

Créer l'application sur Heroku

Pour créer l'application heroku pour héberger ton programme serveur, il faut simplement te connecter sur le site de heroku ou accède au dossier de ton projet via le terminal et exécuter les commandes suivantes:

alt

1. Installer le CLI de Heroku

sudo snap install heroku --classic

NOTE : Si tu utilise Kali, alors tu dois taper cette commande sudo systemctl start snapd.service avant de pouvoir installer le CLI de heroku par snap. C'est à dire avant que la commande ci-dessus ne marche.

2. Se connecter à ton compte

Une fois l'installation terminé, tu peux maintenant te connecter à ton compte Heroku via le CLI.

heroku login

Si le message suivant s'affiche, alors appuis sur la touche ENTRER de ton clavier pour continuer.

heroku: Press any key to open up the browser to login or q to exit:

Après avoir saisi tes identifiants dans le navigateur qui s'est ouvert, si tout va bien, alors tu arras les deux derniers messages suivants imprimés dans ton terminal.

...

Logging in... done
Logged in as monemail@email.com

Au cas où la commande heroku login t'affiche l'erreur suivante :

Command 'heroku' is available in '/snap/bin/heroku'
The command could not be located because '/snap/bin' is not included in the PATH environment variable.
heroku: command not found

Alors tape la commande suivante pour résoudre son cas :

sudo ln -s /snap/bin/heroku /bin/heroku

puis reéssaie la commande heroku login.

3. Configure ton projet avec Git

Si tu avais déjà configuré ton projet avec Git ou tu avais clonner mon dépôt comme je l'ai indiqué plus haut, alors pas besoin d'exécuter la commande suivante. Dans le cas contraire, tu dois exécuter la commande:

git init

NOTE : Ceci est necessaire pour la suite.

4. Créer ton application sur heroku

Si on suppose que le nom que tu veux donner à ton application est monapplication, alors tu exécute la commande suivante :

heroku create monapplication

5. Créer une base de données à ton application

heroku addons:create heroku-postgresql

Redéfinir l'URL HOST du serveur

Tu dois redéfinir l'URL HOST du serveur de l'application dans le fichier core/prod_settings.py

import dj_database_url
from core.settings import *
from stdlib import get_env_var


DEBUG = False;
TEMPLATE_DEBUG = False;

# To force HTTPs communication to server
SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTO', 'https');
SECURE_SSL_REDIRECT     = True;

# Heroku database configuration
DATABASES['default'].update(dj_database_url.config());

# HOST list allowed by this server
ALLOWED_HOSTS = ['heroku-dj.herokuapp.com'];

# CONFIGURATION DE WHITENOISE
# ================================================================
# WhiteNoise permet à votre application Web de servir ses
# propres fichiers statiques, ce qui en fait une unité autonome
# qui peut être déployée n'importe où sans dépendre de nginx,
# d'Amazon S3 ou de tout autre service externe. (Particulièrement
# utile sur Heroku, OpenShift et autres fournisseurs PaaS.).
MIDDLEWARE += ['whitenoise.middleware.WhiteNoiseMiddleware'];
STATICFILES_STORAGE = 'whitenoise.storage.CompressedManifestStaticFilesStorage';

Il s'agit de modifier cette ligne :

# ...

ALLOWED_HOSTS = ['heroku-dj.herokuapp.com'];

# ...

en :

# ...

# Si on suppose que ton application s'appelle : `monapplication`
ALLOWED_HOSTS = ['monapplication.herokuapp.com'];

# ...

Définir des variables d'environnements nécessaire

Sur héroku, au niveau des configurations de ton application, définir deux variables dans les variables d'environnement : SECRET_KEY et DJANGO_SETTINGS_MODULE qui représentes respectievement la clé secrete utilisée par le serveur et le fichier de configuration globale du projet Django.

alt Onglet des configuration de l'application sur Heroku

  • SECRET_KEY : clé secrete Tu dois renseigner une clé secrete différente de celle qui se trouve dans le fichier core/settings.py, pour cela tu peux te rendre sur ce site qui te permettra de générer une clé secrete propre à ton application que tu vas ensuite copier et venir coller dans ce champ.

  • DJANGO_SETTINGS_MODULE : fichier de configuration Pour ceci, il suffit tous simplement de renseigner le champ avec cette valeur core.prod_settings. Cette dernière représente le fichier de configuration de mise en production de ton application. Ce sont les configurations qui se trouvent dans ce fichier qui seront utilisées par le serveur, une fois en ligne.

Connecter l'application créée sur Heroku à ton l'application

Il s'agit de configurer le dépôt local avec le dépôt distant du serveur SVM de Heroku. Pour ce faire, tape juste la commande suivante: si on suppose que ton application s'appelle : monapplication

NOTE : Cette étape n'est plus necessaire, si tu as suivis l'étape 1 : Créer l'application sur Heroku à la lettre. Car lorsqu'on crée une application heroku via le CLI dans le dossier d'un projet déjà configuré avec Git, alors, heroku profite pour connecter le dépôt local de l'application au dépôt distant de l'application qui est créée sur son serveur de production.

Voici donc la commande pour connecter ton dépôt local au dépôt distant de Heroku :

heroku git:remote -a monapplication

Envoyer l'application par Git au serveur Heroku.

En supposant que tout s'est bien passé, alors tu es enfin prêt à déployer ton application en ligne !

  • tu les changements précédement apportés au fichier core/prod_settings.py :
git add -A

ensuite :

git commit -m "Allowed HOST is defined and All is ready !"
  • tu pousses le projet sur le serveur GIT de Heroku en faisant :
git push heroku master

Création des tables de la base de données

Si l'envoie de l'application a été un succès, alors n'oublie pas de créer les différentes tables de la base de données de ton application sur Heroku. Pour ce faire, exécute la commande suivante :

heroku run python manage.py migrate

C'est finit !

Après avoir pris le temps d'allumer un bon Nightcore dans ton répertoire de musique, tu peux maintenant frimer en lançant ta superbe appli via ton lien : https://monapplication.herokuapp.com .

""" Euh... N'oublie pas de me donner une note avant de te barrer l'amis. """