Déployer une app Django sur Gandi Simple Hosting

Posted on sam. 18 avril 2020 in Tech

L'offre Simple Hosting chez Gandi permet d'héberger une application web associée à sa base de donnée. Il supporte le php bien sûr, mais aussi Node.js, Ruby et Python. Les bases de données disponibles sont Mysql, PostgreSQL et MongoDB. Par défaut Simple Hosting permet en quelque clics de créer un site Wordpress, et désormais une instance Nextcloud (des tutoriels sont également disponibles pour installer Mattermost, Jitsi ou Mumble).

Malgré une documentation relativement riche, le déploiement d'une application Django est assez succinct. Pour ce billet, on va donc voir comment héberger son application en Django, avec une base de données PostgreSQL. Pour certaines étapes, des liens pointent vers la documentation de Gandi.

Vous aurez besoin d'un nom de domaine à relier (par exemple dev.monapp.mondomaine.com).

Avertissement : Je n'ai pas de parts chez Gandi, ni d'offre commerciale. D'autres hébergeurs proposent ce type de service plateforme en tant que service.

Création de l'instance et du site

Pour commencer, créez votre instance, en choisissant Python et PostgreSQL avec les versions dont vous avez besoin. Créez ensuite votre site, à associer avec le nom de domaine selon cette documentation. Selon la taille, vous pouvez avoir plusieurs sites sur la même instance.

Une fois votre instance et votre site créés, vous pouvez avoir accès à un tableau de bord en utilisant les identifiants fournis : un numéro d'id et le mot de passe que vous avez choisi. Vous pouvez avoir accès aux logs, au cron, au dépôts git, à la base de données, etc.

Création de la base de données

Connectez-vous à votre base de données, par exemple en passant par phpPgAdmin, l'interface web qui permet de gérer les bases de données. Créez un rôle et une base de données associée à votre projet.

Votre rôle doit pouvoir se connecter, et avoir les droits sur votre base de données. Pour la base de données, j'ai choisi template0 et encodage UTF8, mais n'étant pas spécialiste, je ne peux pas vous dire si c'est le bon choix.

Préparation de votre projet

Vous devrez ajouter à la racine de votre projet un fichier wsgi.py, comme indiqué dans l'exemple django dans la documentation, et générer le fichier de requirements pour les dépendance python, par exemple en utilisant pip :

pip freeze > requirements.txt

Ce qui n'est pas précisé dans la documentation, c'est que vous devrez adapter les paramètres de l'application avec les informations de connexion à votre base de donnée. Plusieurs manières sont possibles, la votre est la meilleure. Pour ma part j'ai un fichier de settings dédié pour le déploiement :

# src/monprojet/settings/local.py
STATIC_ROOT = '/srv/data/web/vhost/default/static/'

ALLOWED_HOSTS = ['dev-teaching.numahell.net']
SECRET_KEY = 'ma-super-secret-key-super-longue-avec-pleins-de-caractères'

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql',
        'NAME': 'monprojetdb',
        'USER': 'monprojetuser',
        'PASSWORD': 'mon-mot-de-passe-super-long',
        'HOST': '127.0.0.1',
        'PORT': '5432',
    }
}

Attention : ce fichier ne doit pas être ajouté à votre dépôt git, et il est préférable de limiter ses permissions à l'utilisateur courant (600). Ajoutez-le à .gitignore.

Il est courant d'ajouter au fichier de settings de base le code qui permet d'importer ce fichier, et qui surchargera les paramètres déjà entrés. Par exemple :

# src/monprojet/settings/base.py (à la fin)
# Override with custom settings
LOCAL_SETTINGS_FILE = "local.py"

try:
    custom_settings_file = os.path.join(os.path.dirname(__file__), LOCAL_SETTINGS_FILE)
    with open(custom_settings_file, 'r') as f:
        exec(f.read())
except:
    pass

Déployer le code

Cela se fait en plusieurs étapes :

  • envoyer les fichiers (via git ou par sftp)
  • déployer l'application (via une commande ssh)
  • envoyer le fichier local.py (via ftp)
  • activer la console et se connecter en ssh
  • exécuter les commandes pour la migration, les statics et les traductions

Envoyer les fichiers de l'application

Vous pouvez utiliser sFTP ou git pour transférer les fichiers de l'application.

Via git il faut au départ ajouter le dépôt de votre instance :

git remote add gandi ssh+git://{instance_id}@git.{datacenter_id}.gpaas.net/default.git

Puis pour envoyer votre code sur le serveur avec cette commande :

git push gandi master

Déployer votre code

L'étape suivante consiste à déployer le code et installer toutes les dépendances.

ssh {instance_id}@git.{datacenter_id}.gpaas.net 'deploy {repository}.git'

Installer votre application

Avec django, il faut d'abord effectuer les migration pour créer les tables dans la base de données. Mais pour cela il faut se connecter en ssh sur le serveur, grâce à la console d'urgence.

Vous devez d'abord activer la console d'urgence depuis l'interface d'admin (onglet administration).

Ensuite vous pouvez vous connecter sur votre serveur par ssh :

ssh {instance_id}@git.{datacenter_id}.gpaas.net

Une fois sur le serveur, retrouvez le code de votre application, activez le virtualenv et lancez vos commandes :

source /code/env/bin/activate
./manage.py migrate
./manage.py collectstatic
./manage.py loaddata --app teaching ./teaching/fixtures/demo.json