Arborescence des pages

Comparaison des versions

Légende

  • Ces lignes ont été ajoutées. Ce mot a été ajouté.
  • Ces lignes ont été supprimées. Ce mot a été supprimé.
  • La mise en forme a été modifiée.

...


Cependant, pour CentOS 7, il a fallu changer de nombreuses commandes. Ci-dessous les étapes d'installation réalisées :

...

Bloc de code
languagebash
themeMidnight
titleServeur(s) Pod / Compte root
[root@ts-sun-videoroot ~]# yum install -y https://centos7.iuscommunity.org/ius-release.rpm
[root@ts-sun-videoroot ~]# yum update
[root@ts-sun-videoroot ~]# yum install -y python36u python36u-libs python36u-devel python36u-pip
[root@ts-sun-videoroot ~]# python3.6 -V

Requêtes annexes en lien avec pip

...

Bloc de code
languagebash
themeMidnight
titleServeur(s) Pod / Compte root
# Pour vérifier la version
[root@ts-sun-videoroot ~]# python3.6 -m pip -V
# Pour mettre à jour pip3
[root@ts-sun-videoroot ~]# python3.6 -m pip install --upgrade pip
# Pour vérifier la version 
[root@ts-sun-videoroot ~]# pip3 -V
 # Autant installer les autres packages, utiles pour la reprise de l'existant
[root@ts-sun-videoroot ~]# pip3 install requests
[root@ts-sun-videoroot ~]# pip3 install request
[root@ts-sun-videoroot ~]# pip3 install wget

Par la suite, pour utiliser la nouvelle version de pip, il est nécessaire d'utiliser - en lieu et place de la commande pip :

...

Bloc de code
languagebash
themeMidnight
titleServeur(s) Pod / Compte root
[root@ts-sun-videoroot ~]# cd /data/www/%userpod%
[root@ts-sun-videoroot /data/www/%userpod%]# pip3 install virtualenvwrapper

...

Bloc de code
languagebash
themeMidnight
titleServeur(s) Pod / Compte %userpod%
[%userpod%@ts-sun-video%userpod% ~]$ cd
[%userpod%@ts-sun-video%userpod% ~]$ emacs .bashrc

Si besoin, commenter les anciennes lignes, puis ajouter ces quelques lignes en fin de fichier :

...

Bloc de code
languagebash
themeMidnight
titleServeur(s) Pod / Compte %userpod%
[%userpod%@ts-sun-video%userpod% ~]$ source .bashrc

Et créer un nouvel environnement virtuel :

Bloc de code
languagebash
themeMidnight
titleServeur(s) Pod / Compte %userpod%
[%userpod%@ts-sun-video%userpod% ~]$ cd /data/www/%userpod%
[%userpod%@ts-sun-video%userpod% /data/www/%userpod%]$ mkvirtualenv --system-site-packages --python=/usr/bin/python3.6 django_pod

...

Bloc de code
languagebash
themeMidnight
titleServeur(s) Pod / Compte %userpod%
[%userpod% ~]$ cd
[%userpod% ~]$ ln -s /data/www/%userpod%/django_projects django_projects

...

?? S'il y a besoin de supprimer un ancien lien symbolique existant, penser à faire - sous root - : unlink django_projects


Récupérer les sources :
Bloc de code
languagebash
themeMidnight
titleServeur(s) Pod / Compte %userpod%
[%userpod% ~]$ cd /data/www/%userpod%/django_projects
[%userpod% /data/www/%userpod%/django_projects]$ git clone https://github.com/esupportail/podv2.git

...

Utilisé pour la génération des overviews. A installer sur le serveur d'encodage.Pour CentOS

Bloc de code
languagebash
themeMidnight
# Pour CentOS 8, ajoutez

...

 ce yum config-manager :
[root ~]# yum config-manager --set-enabled PowerTools

...

Bloc de code
languagebash
themeMidnight



[root ~]# yum install ImageMagick ImageMagick-devel

...

Utilisé pour l'encodage des vidéos. A À installer sur le serveur d'encodage.

Bloc de code
languagepy
themeMidnight
[root ~/opt]# cdmkdir /opt/ffmpeg -p
[root /opt]# mkdir ffmpeg
[rootcd /opt]# cd /ffmpeg
[root /opt]# wget https://johnvansickle.com/ffmpeg/releases/ffmpeg-release-amd64-static.tar.xz
[root /opt]# tar -Jxvf ffmpeg-release-amd64-static.tar.xz
[root /opt]# # ATTENTION : changer les X.X.X par la bonne version !!!
[root /opt]# ln -s ffmpeg-X.X.X-amd64-static ffmpeg
[root /opt]# chown -R %userpod%:nginx /opt/ffmpeg

...

Bloc de code
languagepy
themeMidnight
[root ~]# yum -y install epel-release
[root ~]# rpm --import http://li.nux.ro/download/nux/RPM-GPG-KEY-nux.ro
[root ~]# # Attention : modification du 0-1 en 0-5 par rapport à la documentation ci-dessus
[root ~]# rpm -Uvh http://li.nux.ro/download/nux/dextop/el7/x86_64/nux-dextop-release-0-5.el7.nux.noarch.rpm
[root ~]# yum repolist

# Pour CentOS 8, ajouter :
[root ~]# yum localinstall --nogpgcheck https://download1.rpmfusion.org/free/el/rpmfusion-free-release-8.noarch.rpm -y

[root ~]# yum install --enablerepo=epel ffmpeg ffmpeg-devel
[root ~]# yum install --enablerepo=epel ffmpegthumbnailer

...

Info

Si besoin : pour supprimer les anciennes versions d'Erlang  : (yum list installed | grep erl | grep -v perl)

yum remove 'erlang-*'

La documentation officielle : https://www.erlang-solutions.com/resources/download.html

...

Bloc de code
languagebash
titleServeur principal Pod / Compte root
[root@ts-sun-videoroot ~]# cd
[root@ts-sun-videoroot ~]# wget https://github.com/rabbitmq/erlang-rpm/releases/download/v21.2.3/erlang-21.2.3-1.el7.centos.x86_64.rpm
[root@ts-sun-videoroot ~]# yum install erlang-21.2.3-1.el7.centos.x86_64.rpm

...

Bloc de code
languagebash
titleServeur principal Pod / Compte root
[root@ts-sun-videoroot ~]# cd
[root@ts-sun-videoroot ~]# wget https://github.com/rabbitmq/rabbitmq-server/releases/download/v3.7.10/rabbitmq-server-3.7.10-1.el7.noarch.rpm
[root@ts-sun-videoroot ~]# rpm --import https://www.rabbitmq.com/rabbitmq-release-signing-key.asc
[root@ts-sun-videoroot ~]# yum install rabbitmq-server-3.7.10-1.el7.noarch.rpm
[root@ts-sun-videoroot ~]# # Démarrage du service la 1° fois
[root@ts-sun-videoroot ~]# systemctl start rabbitmq-server
[root@ts-sun-videoroot ~]# # Activation des plugins RabbitMQ (utile pour l'interface Web)
[root@ts-sun-videoroot ~]# rabbitmq-plugins enable rabbitmq_management

...

Il est possible d'utiliser une interface Web pour gérer Rabbitmq ; cette interfaçe interface se nomme Rabbitmq management console.

...

Bloc de code
languagebash
titleServeur principal Pod / Compte root
[root@ts-sun-videoroot ~]# # On crée un nouvel utilisateur pod qui dispose d'un mot de passe xxxxx
[root@ts-sun-videoroot ~]# rabbitmqctl add_user pod xxxxx
[root@ts-sun-videoroot ~]# # On donne les droits administrateurs. Commande documentée mais ne fonctionne pas dans mon cas "rabbitmqctl set_admin pod" remplacée par celle ci-dessous
[root@ts-sun-videoroot ~]# rabbitmqctl set_user_tags pod administrator
[root@ts-sun-videoroot ~]# # Commande documentée mais ne fonctionne pas dans mon cas "abbitmqctlrabbitmqctl clear_admin guest" remplacée par celle ci-dessous
[root@ts-sun-videoroot ~]# rabbitmqctl set_permissions -p / pod ".*" ".*" ".*"

...

Info

Celery est intégré à Pod dans le fichier requirements.txt à la racine du projet. Pensez à vérifier que vous avez bien installé les prérequis python au passage (n'oubliez pas d'être en environnement virtuel) :

(django_pod) %userPod%@ts-sun-video%userPod%:~/django_projects/pod$ pip3 install -r requirements.txt

Les fichiers relatifs à Celery sont déjà créés dans Pod. L'installation est donc terminée.

...

Bloc de code
CELERYD_NODES="worker1"                                                        # Nom du/des worker(s)
# Nom du/des worker(s). Ajoutez autant de workers que de tache à executer en paralelle.
# exemple : CELERYD_NODES="worker1 worker2 worker3 worker4"
CELERYD_NODES="worker1"
# Settings de votre Pod
DJANGO_SETTINGS_MODULE="pod.settings"
#                                  # settingsRépertoire source de votre Podcelery
CELERY_BIN="/data/www/%userpod%/.virtualenvs/django_pod/bin/celery"
# Application             # répertoire source dese situe celery
CELERY_APP="pod.main"
# Répertoire du projet Pod (où se                                                 # application où se situe celery
trouve manage.py)
CELERYD_CHDIR="/data/www/%userpod%/django_projects/podv2"	
# Options à appliquer en plus sur     # répertoirele comportement du projet Pod (où se trouve manage.py/des worker(s)
CELERYD_OPTS="--time-limit=86400 --concurrency=1 --maxtasksperchild=1"         
# options à appliquer en plus sur le comportement du/des worker(s)Fichier log
CELERYD_LOG_FILE="/var/log/celery/%N.log"
# Fichier pid                                    # fichier logdu socket
CELERYD_PID_FILE="/var/run/celery/%N.pid"
# Utilisateur système utilisant celery
CELERYD_USER="%userpod%"
# Groupe système utilisant celery
CELERYD_GROUP="nginx"
# Si celery dispose du droit de création de dossiers
CELERY_CREATE_DIRS=1
# Niveau d'information qui seront inscrit dans               # fichier pid
CELERYD_USER="%userpod%"                                                         # utilisateur système utilisant celery
CELERYD_GROUP="nginx"                                                         # groupe système utilisant celery
CELERY_CREATE_DIRS=1                                                           # si celery dispose du droit de création de dossiers
CELERYD_LOG_LEVEL="INFO"                                                       # niveau d'information qui seront inscrit dans les logs

...

les logs
CELERYD_LOG_LEVEL="INFO"
  • Démarrage si nécessaire du service : systemctl start celeryd

Avertissement

# Ayant eu des problèmes de droits sur le répertoire contenant les vidéos (qui peuvent être déposés et par le user nginx et par le user Celery), j'ai ajouté l'utilisateur dans le groupe Nginx et j'ai changé quelques droits :

[root ~]# mkdir /var/log/celery
[root ~]# chown poduser:nginx /var/log/celery
[root ~]# mkdir /var/run/celery
[root ~]# chown poduser:nginx /var/run/celery

[root ~]# usermod -g nginx %userpod%
[root ~]# chown %userpod%:nginx /data/www/%userpod%/media -R
[root ~]# chmod 755 /data/www/%userpod%/media/ -R
  • Configurer pour que ce service soit démarré lors d'un reboot :
Bloc de code
languagebash
titleMise en service uwsgi-pod (compte root)
[root ~]# systemctl daemon-reload
[root ~]# systemctl enable celeryd


  • Configurer un système de logrotate pour vider régulièrement les logs de Celery, sur le serveur d'encodage. Pour cela, j'ai créé le fichier /etc/logrotate.d/celery avec le contenu suivant :
Bloc de code
/var/log/celery/*.log {
    missingok
    notifempty
    compress
    delaycompress
    copytruncate
    daily
    dateext
    rotate 7
    size 10M
}



Configuration Pod v2

Le fichier custom/settings_local.py

La configuration de Pod v2 se réalise au travers d'un fichier de configuration, spécifique à chaque établissement, settings_local.py.

Il est alors nécessaire de créer ce fichier via :

Bloc de code
languagebash
titleServeur(s) Pod / Création du fichier settings_local.py (compte %userpod%)
[%userpod%@ ~]# mkdir /data/www/%userpod%/django_projects/podv2/pod/custom/
[%userpod%@ ~]# cp /data/www/%userpod%/django_projects/podv2/pod/main/settings.py /data/www/%userpod%/django_projects/podv2/pod/custom/settings_local.py 


Bloc de code
languagebash
titleServeur(s) Pod / Droits du fichier (compte root)
[root@ ~]# # En cas de problème de droit
[root@ ~]# chown %userpod%:nginx /data/www/%userpod%/django_projects/podv2/pod/custom/ -R

Une fois ce fichier créé, il est nécessaire de réaliser la configuration.

Pour cela, il y a la documentation officielle, accessible à l'adresse suivante : https://podv2.readthedocs.io/configuration/

Le mieux est de partir du fichier de configuration créé dans l'environnement de test, qui configure l'ensemble des éléments, à savoir :

  • Base de données,
  • Annuaire LDAP,
  • Authentification CAS,
  • Gestion des affiliations,
  • Encodage déporté,
  • Langues,
  • Emails,
  • Templates spécifiques
  • ...


Avertissement

Il est indispensable que le fichier de configuration settings_local.py soit finalisé avant la création de la base de données. De nombreux paramètres de configuration ont un impact sur la structure des tables de la base de données.

En particulier, il est indispensable de vérifier les paramètres suivants (il ne faut pas changer les valeurs de ces paramètres par la suite) :

  • USE_PODFILE = True
    Activation du gestionnaire de fichiers.
  • FROM_URL = "https://video.umontpellier.fr/media/"
    Utile pour la récupération des vidéos depuis ce serveur (serveur de production de podv1).
  • MEDIA_ROOT = '/data/www/%userpod%/media'
    Utile pour la récupération des vidéos.
  • LANGUAGES :...
    Ne garder que les valeurs FR et EN : supprimer la valeur NL avant de créer la base de données.

Dans le cas contraire, il sera sûrement nécessaire de réaliser une migration de la base de données via les commandes suivantes :

  • python manage.py makemigrations
  • python manage.py migrate

N'oubliez pas de relancer tous les services en lien avec ce fichier de configuration (en cas de cache) : uWSGI, celeryd voire nginx et rabbitmq (cf. document d'exploitation v2).

Je le répète : en cas de changement de configuration, il est préférable de supprimer tout le contenu de la base et de la recréer.


Au final, voici le contenu du fichier custom/settings_local.py :

Bloc de code
languagepy
titleServeur(s) Pod / Fichier custom/settings_local.py
# -*- coding: utf-8 -*-
from django.utils.translation import ugettext_lazy as _

##
# DEBUG mode activation
#
# https://docs.djangoproject.com/en/1.11/ref/settings/#debug
#
# SECURITY WARNING: MUST be set to False when deploying into production.
DEBUG = False

SECRET_KEY = 'xxxxxxxxxxxxxxxxxxxxxxx'

# Droit des fichiers uploadés
FILE_UPLOAD_PERMISSIONS = 0o644


# Permet d'utiliser la mise en ligne fragmentée (qui permet de reprendre la mise en ligne lors de problèmes de connexion)
USE_CHUNKED_UPLOAD = True

##
# A list of strings representing the host/domain names
# that this Django site is allowed to serve.
#
# https://docs.djangoproject.com/en/1.11/ref/settings/#allowed-hosts
ALLOWED_HOSTS = ['162.38.xx.xx', 'xxxxx.umontpellier.fr']

##
# A tuple that lists people who get code error notifications
#   when DEBUG=False and a view raises an exception.
#
# https://docs.djangoproject.com/fr/1.11/ref/settings/#std:setting-ADMINS
#
ADMINS = (
    ('Admin Pod', 'xxx.xxx@umontpellier.fr'),
)
##
# A dictionary containing the settings for all databases
# to be used with Django.
#
# https://docs.djangoproject.com/en/1.11/ref/settings/#databases
"""
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': '/data/www/podtest/django_projects/podv2/db.sqlite',
    }
}
"""

# MySQL settings
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'xxx',
        'USER': 'xxx',
        'PASSWORD': 'xxx',
        'HOST': 'xxxxx.umontpellier.fr',
        'PORT': '',
        'OPTIONS': {'init_command':"SET storage_engine=INNODB, sql_mode='STRICT_TRANS_TABLES', innodb_strict_mode=1;"}
        #'OPTIONS': {'init_command':"SET storage_engine=INNODB;"}
    }
}

RESTRICT_EDIT_VIDEO_ACCESS_TO_STAFF_ONLY = True

VIDEO_MAX_UPLOAD_SIZE = 4

FILE_ALLOWED_EXTENSIONS = ( 'doc', 'docx', 'odt', 'pdf', 'xls', 'xlsx', 'ods', 'ppt', 'pptx', 'txt', 'html', 'htm', 'vtt', 'srt', 'webm', 'ts', )
IMAGE_ALLOWED_EXTENSIONS = ( 'jpg', 'jpeg', 'bmp', 'png', 'gif', 'tiff', )
FILE_MAX_UPLOAD_SIZE = 20

##
# THIRD PARTY APPS OPTIONNAL
#
USE_PODFILE = True
THIRD_PARTY_APPS = ['live', 'enrichment']

# Nouveaute v2
AUTH_TYPE = (('local', ('local')), ('CAS', 'CAS'))

USE_CAS = True
CAS_VERSION = '3'
CAS_SERVER_URL = 'https://xxx.umontpellier.fr/cas/'
CAS_GATEWAY = False
POPULATE_USER = 'LDAP'
AUTH_CAS_USER_SEARCH = 'user'

CREATE_GROUP_FROM_AFFILIATION = False
AFFILIATION_STAFF = ('faculty', 'employee', 'researcher', 'affiliate')

LDAP_SERVER = {'url
Avertissement

Ayant eu des problèmes de droits sur le répertoire contenant les vidéos (qui peuvent être déposés et par le user nginx et par le user Celery), j'ai ajouté l'utilisateur dans le groupe Nginx et j'ai changé quelques droits :

[root@ts-sun-video ~]# usermod -g nginx %userpod%
[root@ts-sun-video ~]# chown %userpod%:nginx /data/www/%userpod%/media -R
[root@ts-sun-video ~]# chmod 755 /data/www/%userpod%/media/ -R

  • Configurer pour que ce service soit démarré lors d'un reboot :
Bloc de code
languagebash
titleMise en service uwsgi-pod (compte root)
[root@ts-sun-video ~]# systemctl daemon-reload
[root@ts-sun-video ~]# systemctl enable celeryd
  • Configurer un système de logrotate pour vider régulièrement les logs de Celery, sur le serveur d'encodage. Pour cela, j'ai créé le fichier /etc/logrotate.d/celery avec le contenu suivant :
Bloc de code
/var/log/celery/*.log {
    missingok
    notifempty
    compress
    delaycompress
    copytruncate
    daily
    dateext
    rotate 7
    size 10M
}

Configuration Pod v2

Le fichier custom/settings_local.py

La configuration de Pod v2 se réalise au travers d'un fichier de configuration, spécifique à chaque établissement, settings_local.py.

Il est alors nécessaire de créer ce fichier via :

Bloc de code
languagebash
titleServeur(s) Pod / Création du fichier settings_local.py (compte %userpod%)
[%userpod%@ ~]# mkdir /data/www/%userpod%/django_projects/podv2/pod/custom/
[%userpod%@ ~]# cp /data/www/%userpod%/django_projects/podv2/pod/main/settings.py /data/www/%userpod%/django_projects/podv2/pod/custom/settings_local.py 
Bloc de code
languagebash
titleServeur(s) Pod / Droits du fichier (compte root)
[root@ ~]# # En cas de problème de droit
[root@ ~]# chown %userpod%:nginx /data/www/%userpod%/django_projects/podv2/pod/custom/ -R

Une fois ce fichier créé, il est nécessaire de réaliser la configuration.

Pour cela, il y a la documentation officielle, accessible à l'adresse suivante : https://podv2.readthedocs.io/configuration/

Le mieux est de partir du fichier de configuration créé dans l'environnement de test, qui configure l'ensemble des éléments, à savoir :

  • Base de données,
  • Annuaire LDAP,
  • Authentification CAS,
  • Gestion des affiliations,
  • Encodage déporté,
  • Langues,
  • Emails,
  • Templates spécifiques
  • ...
Avertissement

Il est indispensable que le fichier de configuration settings_local.py soit finalisé avant la création de la base de données. De nombreux paramètres de configuration ont un impact sur la structure des tables de la base de données.

En particulier, il est indispensable de vérifier les paramètres suivants (il ne faut pas changer les valeurs de ces paramètres par la suite) :

  • USE_PODFILE = True
    Activation du gestionnaire de fichiers.
  • FROM_URL = "https://video.umontpellier.fr/media/"
    Utile pour la récupération des vidéos depuis ce serveur (serveur de production de podv1).
  • MEDIA_ROOT = '/data/www/%userpod%/media'
    Utile pour la récupération des vidéos.
  • LANGUAGES :...
    Ne garder que les valeurs FR et EN : supprimer la valeur NL avant de créer la base de données.

Dans le cas contraire, il sera sûrement nécessaire de réaliser une migration de la base de données via les commandes suivantes :

  • python manage.py makemigrations
  • python manage.py migrate

N'oubliez pas de relancer tous les services en lien avec ce fichier de configuration (en cas de cache) : uWSGI, celeryd voire nginx et rabbitmq (cf. document d'exploitation v2).

Je le répète : en cas de changement de configuration, il est préférable de supprimer tout le contenu de la base et de la recréer.

Au final, voici le contenu du fichier custom/settings_local.py :

Bloc de code
languagetext
titleServeur(s) Pod / Fichier custom/settins_local.py
# -*- coding: utf-8 -*-
from django.utils.translation import ugettext_lazy as _

##
# DEBUG mode activation
#
# https://docs.djangoproject.com/en/1.11/ref/settings/#debug
#
# SECURITY WARNING: MUST be set to False when deploying into production.
DEBUG = False

SECRET_KEY = 'xxxxxxxxxxxxxxxxxxxxxxx'

# Droit des fichiers uploadés
FILE_UPLOAD_PERMISSIONS = 0o644

##
# A list of strings representing the host/domain names
# that this Django site is allowed to serve.
#
# https://docs.djangoproject.com/en/1.11/ref/settings/#allowed-hosts
ALLOWED_HOSTS = ['162.38.xx.xx', 'xxxxx.umontpellier.fr']

##
# A tuple that lists people who get code error notifications
#   when DEBUG=False and a view raises an exception.
#
# https://docs.djangoproject.com/fr/1.11/ref/settings/#std:setting-ADMINS
#
ADMINS = (
    ('Admin Pod', 'xxx.xxx@umontpellier.fr'),
)
##
# A dictionary containing the settings for all databases
# to be used with Django.
#
# https://docs.djangoproject.com/en/1.11/ref/settings/#databases
"""
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': '/data/www/podtest/django_projects/podv2/db.sqlite',
    }
}
"""

# MySQL settings
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'xxx',
        'USER': 'xxx',
        'PASSWORD': 'xxx',
        'HOST': 'xxxxx.umontpellier.fr',
        'PORTport': 389, '',
        'OPTIONS': {'init_command':"SET storage_engine=INNODB, sql_mode='STRICT_TRANS_TABLES', innodb_strict_mode=1;"}
        #'OPTIONS': {'init_command':"SET storage_engine=INNODB;"}
    }
}

RESTRICT_EDIT_VIDEO_ACCESS_TO_STAFF_ONLY = True

VIDEO_MAX_UPLOAD_SIZE = 4

FILE_ALLOWED_EXTENSIONS = ( 'doc', 'docx', 'odt', 'pdf', 'xls', 'xlsx', 'ods', 'ppt', 'pptx', 'txt', 'html', 'htm', 'vtt', 'srt', 'webm', 'ts', )
IMAGE_ALLOWED_EXTENSIONS = ( 'jpg', 'jpeg', 'bmp', 'png', 'gif', 'tiff', )
FILE_MAX_UPLOAD_SIZE = 20

##
# THIRD PARTY APPS OPTIONNAL
#
USE_PODFILE = True
THIRD_PARTY_APPS = ['live', 'enrichment']

# Nouveaute v2
AUTH_TYPE = (('local', ('local')), ('CAS', 'CAS'))

USE_CAS = True
CAS_SERVER_URL = 'https://xxx.umontpellier.fr/cas/'
CAS_GATEWAY = False
POPULATE_USER = 'LDAP'
AUTH_CAS_USER_SEARCH = 'user'

CREATE_GROUP_FROM_AFFILIATION = False
AFFILIATION_STAFF = ('faculty', 'employee', 'researcher', 'affiliate')

LDAP_SERVER = {'url': 'xxxxx.umontpellier.fr', 'port': 389, 'use_ssl': False}
AUTH_LDAP_BIND_DN = 'xxx'
AUTH_LDAP_BIND_PASSWORD =  'xxx'
AUTH_LDAP_BASE_DN = 'ou=people,dc=umontpellier,dc=fr'
AUTH_LDAP_USER_SEARCH = (AUTH_LDAP_BASE_DN, "(uid=%(uid)s)")

##
# Internationalization and localization.
#
#   https://docs.djangoproject.com/en/1.8/ref/settings/#globalization-i18n-l10n
#
LANGUAGE_CODE = 'fr'
LANGUAGES = (
    ('fr', 'Fran?§ais'),
    ('en', 'English')
)
MODELTRANSLATION_DEFAULT_LANGUAGE = 'fr'
MODELTRANSLATION_FALLBACK_LANGUAGES = ('fr', 'en')

##
# A string representing the time zone for this installation.
#
#   https://en.wikipedia.org/wiki/List_of_tz_database_time_zones
#
TIME_ZONE = 'Europe/Paris'

##
# Dynamic files (user managed content: videos, subtitles, documents, etc...)
#
# https://docs.djangoproject.com/en/1.11/ref/settings/#media-url
# https://docs.djangoproject.com/en/1.11/ref/settings/#media-root
#
# WARNING: this folder must have previously been created.
MEDIA_URL = '/media/'
MEDIA_ROOT = '/data/www/%userpod%/media'

FILE_UPLOAD_TEMP_DIR = '/var/tmp'

##
# eMail settings
#
# https://docs.djangoproject.com/en/1.11/ref/settings/#email-host
# https://docs.djangoproject.com/en/1.11/ref/settings/#email-port
# https://docs.djangoproject.com/en/1.11/ref/settings/#default-from-email
#
#   username: EMAIL_HOST_USER
#   password: EMAIL_HOST_PASSWORD
#
EMAIL_HOST = 'smtp-xxx.umontpellier.fr'
EMAIL_PORT = 25
DEFAULT_FROM_EMAIL = 'xxx.xxx@umontpellier.fr'

# https://docs.djangoproject.com/fr/1.11/ref/settings/#std:setting-SERVER_EMAIL
SERVER_EMAIL = 'xxx.xxx@umontpellier.fr'

MENUBAR_SHOW_STAFF_OWNERS_ONLY = True
HOMEPAGE_SHOWS_RESTRICTED = True
##
# List of Elasticsearch urls, like ['host1', 'host2', ...].
#
#   http://elasticutils.readthedocs.io/en/latest/django.html#django.conf.settings.ES_URLS
#
ES_URL = ['http://162.38.xx.xx:9200/']

FFMPEG = '/opt/ffmpeg/ffmpeg/ffmpeg'
FFPROBE = '/opt/ffmpeg/ffmpeg/ffprobe'

# Encode with Celery
CELERY_TO_ENCODE = True
CELERY_NAME = "pod_project"
CELERY_BACKEND = "amqp"
CELERY_BROKER = "amqp://pod:xxxx@162.38.xx.xx//"

# Template Settings
TEMPLATE_VISIBLE_SETTINGS = {
     'TITLE_SITE': 'Vidéo - Université de Montpellier',
     'TITLE_ETB': 'Université de Montpellier',
     'LOGO_SITE': 'custom/um_pod.png',
     'LOGO_COMPACT_SITE': 'custom/logo_black_compact.png',
     'LOGO_ETB': 'custom/um.png',
     'LOGO_PLAYER': 'custom/logo_player.png',
     'FOOTER_TEXT': (
         '163 rue Auguste Broussonnet',
         '34090 Montpellier',
         ('<a href="https://goo.gl/maps/RHsfxME59Fp"'
use_ssl': False}
AUTH_LDAP_BIND_DN = 'xxx'
AUTH_LDAP_BIND_PASSWORD =  'xxx'
AUTH_LDAP_BASE_DN = 'ou=people,dc=umontpellier,dc=fr'
AUTH_LDAP_USER_SEARCH = (AUTH_LDAP_BASE_DN, "(uid=%(uid)s)")

##
# Internationalization and localization.
#
#   https://docs.djangoproject.com/en/1.8/ref/settings/#globalization-i18n-l10n
#
LANGUAGE_CODE = 'fr'
LANGUAGES = (
    ('fr', 'Fran?§ais'),
    ('en', 'English')
)
MODELTRANSLATION_DEFAULT_LANGUAGE = 'fr'
MODELTRANSLATION_FALLBACK_LANGUAGES = ('fr', 'en')

##
# A string representing the time zone for this installation.
#
#   https://en.wikipedia.org/wiki/List_of_tz_database_time_zones
#
TIME_ZONE = 'Europe/Paris'

##
# Dynamic files (user managed content: videos, subtitles, documents, etc...)
#
# https://docs.djangoproject.com/en/1.11/ref/settings/#media-url
# https://docs.djangoproject.com/en/1.11/ref/settings/#media-root
#
# WARNING: this folder must have previously been created.
MEDIA_URL = '/media/'
MEDIA_ROOT = '/data/www/%userpod%/media'

FILE_UPLOAD_TEMP_DIR = os.path.join(os.path.sep, 'var', 'tmp')

##
# eMail settings
#
# https://docs.djangoproject.com/en/1.11/ref/settings/#email-host
# https://docs.djangoproject.com/en/1.11/ref/settings/#email-port
# https://docs.djangoproject.com/en/1.11/ref/settings/#default-from-email
#
#   username: EMAIL_HOST_USER
#   password: EMAIL_HOST_PASSWORD
#
EMAIL_HOST = 'smtp-xxx.umontpellier.fr'
EMAIL_PORT = 25
DEFAULT_FROM_EMAIL = 'xxx.xxx@umontpellier.fr'

# https://docs.djangoproject.com/fr/1.11/ref/settings/#std:setting-SERVER_EMAIL
SERVER_EMAIL = 'xxx.xxx@umontpellier.fr'

MENUBAR_SHOW_STAFF_OWNERS_ONLY = True
HOMEPAGE_SHOWS_RESTRICTED = True
##
# List of Elasticsearch urls, like ['host1', 'host2', ...].
#
#   http://elasticutils.readthedocs.io/en/latest/django.html#django.conf.settings.ES_URLS
#
ES_URL = ['http://162.38.xx.xx:9200/']

FFMPEG = '/opt/ffmpeg/ffmpeg/ffmpeg'
FFPROBE = '/opt/ffmpeg/ffmpeg/ffprobe'

# Encode with Celery
CELERY_TO_ENCODE = True
CELERY_NAME = "pod_project"
CELERY_BACKEND = "amqp"
CELERY_BROKER = "amqp://pod:xxxx@162.38.xx.xx//"

# Template Settings
TEMPLATE_VISIBLE_SETTINGS = {
     'TITLE_SITE': 'Vidéo - Université de Montpellier',
     'TITLE_ETB': 'Université de Montpellier',
     'LOGO_SITE': 'custom/um_pod.png',
     'LOGO_COMPACT_SITE': 'custom/logo_black_compact.png',
     'LOGO_ETB': 'custom/um.png',
     'LOGO_PLAYER': 'custom/logo_player.png',
     'FOOTER_TEXT': (
         '163 rue Auguste Broussonnet',
         '34090 Montpellier',
         ('<a href="https://goo.gl/maps/RHsfxME59Fp"'
          ' target="_blank">Google maps</a>')
     ),
     'LINK_PLAYER': 'https://www.umontpellier.fr',
     'CSS_OVERRIDE': 'custom/um.css',
     'FAVICON': 'custom/favicon.png'
}

SUBJECT_CHOICES = ( ('', '-----'), ('info', _('Request more information')), ('request_password', _('Password request for a video')), ('inappropriate_content', _('Report inappropriate content')),
('bug', _('Correction or bug report')), ('other', _('Other (please specify)')) )

# Templates spécifiques UM
TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': ['/data/www/%userpod%/django_projects/podv2/pod/custom/templates'],
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                ' target="_blank">Google maps</a>')
django.contrib.auth.context_processors.auth',
          ),
     'LINK_PLAYER': 'https://www.umontpellier.fr 'django.contrib.messages.context_processors.messages',
     'CSS_OVERRIDE': 'custom/um.css',
     'FAVICON': 'custom/favicon.png'
}

SUBJECT_CHOICES = ( ('', '-----'), ('info', _('Request more information')), ('request_password', _('Password request for a video')), ('inappropriate_content', _('Report inappropriate content')),
('bug', _('Correction or bug report')), ('other', _('Other (please specify)')) )

# Templates spécifiques UM
TEMPLATES = [
    {
 # Local contexts
                'pod.main.context_processors.context_settings',
                'BACKEND': 'django.template.backends.django.DjangoTemplates',
pod.main.context_processors.context_navbar'
           'DIRS': ['/data/www/%userpod%/django_projects/podv2/pod/custom/templates'],
        'APP_DIRS': True},
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
                # Local contexts
                'pod.main.context_processors.context_settings',
                'pod.main.context_processors.context_navbar'
            ],
        },
    },
]

DEFAULT_THUMBNAIL = 'custom/default.png'

# Utile pour la reprise de l'existant (adresse de Pod v1 en production)
FROM_URL = 'https://video.umontpellier.fr/media/'
Astuce
titleDroits des fichiers uploadés

Pour que les fichiers vidéos uploadés aient les bons droits (pour simplifier 644), j'ai positionné la ligne suivante dans le fichier settings_local.py :

FILE_UPLOAD_PERMISSIONS = 0o644

Base de données

...

},
]

DEFAULT_THUMBNAIL = 'custom/default.png'

# Utile pour la reprise de l'existant (adresse de Pod v1 en production)
FROM_URL = 'https://video.umontpellier.fr/media/'


Astuce
titleDroits des fichiers uploadés

Pour que les fichiers vidéos uploadés aient les bons droits (pour simplifier 644), j'ai positionné la ligne suivante dans le fichier settings_local.py :

FILE_UPLOAD_PERMISSIONS = 0o644

Base de données

Installation de la librairie

Bloc de code
languagebash
themeMidnight
titleServeur(s) Pod / Compte %userpod%
[%userpod%@ts-sun-video ~]$ pip3 install "mysqlclient==1.3.14"

(avertissement) En cas d'erreur, c'est que le client MySQL / MariaDB n'a pas été installé; il est alors nécessaire de réaliser, sous root, un yum install mariadb-devel


Avertissement

Surtout ne pas faire de "pip3 install mysqlclient" : il semblerait que la version de Django utilisée ne soit pas compatible avec la dernière version de MySQL.

Cela provoquait une erreur du type "KeyError: <class 'bytes'>" lors de la création de la base de données (cf. https://github.com/PyMySQL/mysqlclient-python/issues/306).


Création de la base de données :

?? Attention, si vous préférez ne pas accorder les droits "CREATE DATABASE" à l'utilisateur Pod, vous pouvez créer une base vide en amont, mais assurez-vous que cette dernière soit en "utf8_general_ci" ! Lancez ensuite les scripts ci-dessous (dans tous les cas) :

Bloc de code
languagebash
themeMidnight
titleServeur(s) Pod / Compte %userpod%
[%userpod%][/data/www/%userpod%/django_projects/podv2]# workon django_pod
(django_pod) [%userpod%][/data/www/%userpod%/django_projects/podv2]# sh create_data_base.sh

? Il faut vérifier que l'on se trouve bien dans l'environnement virtuel.

Creation de l'index Pod

Nous pouvons enfin vérifier le bon fonctionnement de l'ensemble (l'erreur "404-index_not_found_exception : no such index" affichée lors de la suppression est normale, puisque l'index n'existe pas encore, mais nous devons supprimer avant de créer un index dans ES) :

Bloc de code
languagebash
themeMidnight
titleServeur(s) Pod / Compte %userpod%
[%userpod%@ts-sun-video%userpod% ~]$ pip3 install "mysqlclient==1.3.14"

(avertissement) En cas d'erreur, c'est que le client MySQL / MariaDB n'a pas été installé; il est alors nécessaire de réaliser, sous root, un yum install mariadb-devel

Avertissement

Surtout ne pas faire de "pip3 install mysqlclient" : il semblerait que la version de Django utilisée ne soit pas compatible avec la dernière version de MySQL.

Cela provoquait une erreur du type "KeyError: <class 'bytes'>" lors de la création de la base de données (cf. https://github.com/PyMySQL/mysqlclient-python/issues/306).

Création de la base de données :

Bloc de code
languagebash
themeMidnight
titleServeur(s) Pod / Compte %userpod%
 cd
[%userpod% ~]$ source .bashrc
[%userpod% ~]$ cd /data/www/%userpod%/django_projects/podv2
[%userpod% /data/www/%userpod%/django_projects/podv2]$ workon django_pod
(django_pod) [%userpod%][/data/www/%userpod%/django_projects/podv2]# workon django_pod
 python3.6 manage.py create_pod_index

Création du super user

Bloc de code
languagebash
themeMidnight
titleServeur(s) Pod / Compte %userpod%
(django_pod) [%userpod%][/data/www/%userpod%/django_projects/podv2]# sh create_data_base.sh

...

python3.6 manage.py createsuperuser

Il faut vérifier que l'on se trouve bien dans l'environnement virtuel.

Creation de l'index Pod

Gestion des fichiers "static"

Par défaut, chaque application possède ses propres fichiers statiques (images, css, javascript etc.) La commande ci-après permet de les centraliser pour que ces fichiers soient distribués plus facilement par le fontal web.Nous pouvons enfin vérifier le bon fonctionnement de l'ensemble (l'erreur "404-index_not_found_exception : no such index" affichée lors de la suppression est normale, puisque l'index n'existe pas encore, mais nous devons supprimer avant de créer un index dans ES) :

Bloc de code
languagebash
themeMidnight
titleServeur(s) Pod / Compte %userpod%
[%userpod% ~]$ cd
[%userpod% ~]$ source .bashrc
[%userpod% ~]$ cd /data/www/%userpod%/django_projects/podv2
[%userpod% (django_pod) [%userpod%][/data/www/%userpod%/django_projects/podv2]$# workon django_pod
(django_pod) [%userpod%][/data/www/%userpod%/django_projects/podv2] python3.6 manage.py create_pod_index

Création du super user

Bloc de code
languagebash
themeMidnight
titleServeur(s) Pod / Compte %userpod%
(django_pod) [%userpod%][/data/www/%userpod%/django_projects/podv2]# python3.6 manage.py createsuperuser
python3.6 manage.py collectstatic

?Il faut vérifier que l'on se trouve bien dans l'environnement virtuel.

Gestion des droits des fichiers

...

Il est nécessaire de donner les droits à l'utilisateur Nginx (cf

Par défaut, chaque application possède ses propres fichiers statiques (images, css, javascript etc.) La commande ci-après permet de les centraliser pour que ces fichiers soient distribués plus facilement par le fontal web.

Bloc de code
languagebash
themeMidnight
titleServeur(s) Pod / Compte %userpod%
(django_pod) [%userpod%][/data/www/%userpod%/django_projects/podv2]# python3.6 manage.py collectstatic

?Il faut vérifier que l'on se trouve bien dans l'environnement virtuel.

Gestion des droits des fichiers

Il est nécessaire de donner les droits à l'utilisateur Nginx (cf. configuration Nginx) aux fichiers Web de l'application.

...

Bloc de code
languagebash
titleServeur(s) Pod / Compte root
# Droits (sinon cela peut provoquer une erreur "ImportError: No module named site")
[root ~]# chmod 755 /data/www/%userpod%/
# Attention, les vidéos vont être uploadées dans le répertoire « media ». Il faut donner le droit en lecture et en écriture à l'utilisateur web (nginx)
[root ~]# mkdir /data/www/%userpod%/media
[root ~]# chown -R %userpod%:nginx /data/www/%userpod%/media/
[root@ts-sun-video root ~]# chown -R %userpod%:nginx /data/www/%userpod%/.virtualenvs/
[root@ts-sun-videoroot ~]# chown -R %userpod%:nginx /data/www/%userpod%/django_projects/
[root@ts-sun-videoroot ~]# chmod 755 /data/www/%userpod%/media -R
# Sécurisation
[root@ts-sun-videoroot ~]# chmod -R o-rx /data/www/%userpod%/django_projects/podv2/ 

...

Bloc de code
languagebash
themeMidnight
titleServeur(s) Pod / Compte %userpod%
[%userpod%@ts-sun-video%userpod%][/]# mkdir /data/www/%userpod%/django_projects/podv2/pod/static/custom

...

  • Réaliser une configuration dans le fichier settings_local.py
Bloc de code
languagetextpy
themeEmacs
titleServeur(s) Pod / Compte %userpod%
# Templates spécifiques UM
TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': ['/data/www/%userpod%/django_projects/podv2/pod/custom/templates'],
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
                # Local contexts
                'pod.main.context_processors.context_settings',
                'pod.main.context_processors.context_navbar'
            ],
        },
    },
]

...

  • soit via l'interface d'Administration, module Sites, définir un nom de domaine.
  • soit directement en mettant à jour la base de données, table django_site, colonnes domain et name.

...

Astuce

??UPDATE `django_site` SET `domain` = 'video.umontpellier.fr', `name` = 'video.umontpellier.fr' WHERE `django_site`.`id` = 1;

...

Ci-dessous, je mets l'ensemble des documentations concernant ces solutions, même si cela n'est pas concluant.

Utilisation du serveur de développement

concernant ces solutions, même si cela n'est pas concluant.

Utilisation du serveur de développement

Bloc de code
languagebash
themeMidnight
titleServeur(s) Pod / Compte %userpod%
(django_pod) [%userpod%][/data/www/%userpod%/django_projects/podv2]# python3.6 manage.py runserver 162.38.xx.xx:8080

? Il faut vérifier que l'on se trouve bien dans l'environnement virtuel.

Avertissement

Cette solution ne peut être utilisée en production !

Utilisation avec Apache + WSGI (comme pour la v1) → NON CONCLUANT

Documentations de référence :


Bloc de code
languagebash
[root]# yum install mod_wsgi
[root]# yum install expat-devel
[root]# yum install httpd-devel
[root]# yum install python36u-mod_wsgi
[root]# # ATTENTION: nouveau fichier créé /etc/httpd/conf.modules.d/10-wsgi-python3.6.conf
[root]# # Configurer 10-wsgi.conf
[root]# # Configurer pod.conf
[root]# chmod 755 /data/www/%userpod%/django_projects/podv2/pod/wsgi.py

[%userpod%
Bloc de code
languagebash
themeMidnight
titleServeur(s) Pod / Compte %userpod%
(django_pod) [%userpod%@ts-sun-video][/data/www/%userpod%/django_projects/podv2]# python3.6 manage.py runserver 162.38.xx.xx:8080

? Il faut vérifier que l'on se trouve bien dans l'environnement virtuel.

Avertissement

Cette solution ne peut être utilisée en production !

...

podv2]# pip3 install requests


Utilisation avec Nginx + uWSGI

Documentations de référence : 

Installation Nginx

Bloc de code
languagebash
titleServeur(s) Pod / Compte root
[root[root@ts-sun-video]# yum install mod_wsgi
[root@ts-sun-video]# yum install expat-devel
[root@ts-sun-video]# yum install httpd-devel
[root@ts-sun-video-enablerepo=epel nginx
[root]# yum install python36u-mod_wsgi
[root@ts-sun-video]#emacs /etc/nginx/nginx.conf # ATTENTION:vérifier nouveauque fichierinclude créé /etc/httpdnginx/conf.modules.d/10-wsgi-python3.6.conf
[root@ts-sun-video]# # Configurer 10-wsgi.conf
[root@ts-sun-video]# # Configurer pod.conf
[root@ts-sun-video]# chmod 755 /data/www/%userpod%/django_projects/podv2/pod/wsgi.py

[%userpod%@ts-sun-video][/data/www/%userpod%/django_projects/podv2]# pip3 install requests

Utilisation avec Nginx + uWSGI

Documentations de référence : 

...

*.conf n'est pas en commentaire. Ne pas configurer d'adresse IP ni de server_name.
[root]# systemctl start nginx
[root]# systemctl enable nginx


Avertissement

Pod permet 2 systèmes de barre de progression :

  • Le premier nécessite de recompiler directement les sources d'nginx (je ne vous le recommande pas, cela complique les mises à jour)
  • Le second ne modifie rien dans nginx, et permet en plus de reprendre un téléchargement en cas de coupure réseau (à condition que l'utilisateur ne recharge pas la page) : c'est le mode "CHUNK" que nous préconisons ici. ("USE_CHUNKED_UPLOAD = True" dans settings_local.py)

Configuration Nginx

Pour configurer Nginx, je me base sur le fichier fourni par Pod v2, que je copie dans custom et que je personnalise :

Bloc de code
languagebash
titleServeur(s) Pod / Compte root%userpod%
[root@ts-sun-video%userpod%]# yum install --enablerepo=epel nginx
[root@ts-sun-video]# emacs /etc/nginx/nginx.conf # vérifier que include /etc/nginx/conf.d/*.conf n'est pas en commentaire. Ne pas configurer d'adresse IP ni de server_name.
[root@ts-sun-video]# systemctl start nginx
[root@ts-sun-video]# systemctl enable nginx
Avertissement

N'ayant pas souhaité installer le système de barre de progression (Pod Progress Bar) - qui nécessitait d'installer Nginx via les sources - j'ai seulement mis en place une image (type "Chargement en cours") lors de la publication d'une vidéo, directement via la feuille de style CSS.

Au cas où, il est possible d'installer la barre de progression à la main (cela n'est pas de base sous CentOS) : (cf. https://www.nginx.com/resources/wiki/modules/upload_progress/).

Configuration Nginx

Pour configurer Nginx, je me base sur le fichier fourni par Pod v2, que je copie dans custom et que je personnalise :

cd /data/www/%userod%/django_projects/podv2/
# Copie du fichier
[%userpod% /data/www/%userpod%/django_projects/podv2]# cp pod_nginx.conf pod/custom/
# Édition du nouveau fichier
[%userpod /data/www/%userpod%/django_projects/podv2]# emacs pod/custom/pod_nginx.conf
# Création d'un lien symbolique, directement dans le répertoire de Nginx
[%userpod /data/www/%userpod%/django_projects/podv2]# sudo ln -s /data/www/%userpod%/django_projects/podv2/pod/custom/pod_nginx.conf /etc/nginx/conf.d/pod_nginx.conf
[%userpod% /data/www/%userpod%/django_projects/podv2]# sudo systemctl restart nginx


Voici un exemple de contenu du fichier pod_nginx.conf :

Bloc de code
languagetext
Bloc de code
languagebash
titleServeur(s) Pod / Compte %userpod%Fichier pod_nginx.conf

# the upstream component nginx needs to connect to
upstream podupstream {
    server unix://[%userpod%@ts-sun-video]# cd /data/www/%userod%/django_projects/podv2/
# Copie du fichier
[%userpod%@ts-sun-video /data/www/%userpod%/django_projects/podv2]# cp pod_nginx.conf pod/custom/.
# Edition du nouveau fichier
[%userpod%@ts-sun-video /data/www/%userpod%/django_projects/podv2]# emacs pod/custom/pod_nginx.conf
# Création d'un lien symbolique, directement dans le répertoire de Nginx
[%userpod%@ts-sun-video /data/www/%userpod%/django_projects/podv2]# sudo ln -s /data/www/%userpod%/django_projects/podv2/pod/custom/pod_nginx.conf /etc/nginx/conf.d/pod_nginx.conf
[%userpod%@ts-sun-video /data/www/%userpod%/django_projects/podv2]# sudo /etc/init.d/nginx restart

Voici le contenu du fichier pod_nginx.conf UM :

Bloc de code
languagetext
titleServeur(s) Pod / Fichier pod_nginx.conf (ompte %userpod%)
# mysite_nginx.conf
# Add this line in /etc/nginx/nginx.conf
#http {
#    [...]
#    # reserve 1MB under the name 'uploads' to track uploads
#    upload_progress uploadp 1m;
#    [...]
#}
# the upstream component nginx needs to connect to
upstream podupstream {
    server unix:///podv2/uwsgi/podv2.sock max_fails=2 fail_timeout=3s;
}

# configuration of the server
server {
    # the port your site will be served on
    listen      80;
    # the domain name it will serve for
    server_name xxxxx.umontpellier.fr; # substitute your machine's IP address or FQDN
    charset     utf-8;

    # max upload size
    client_max_body_size 4G;   # adjust to taste

    # Django media
    location /media  {
        alias /data/www/%userpod%/media;  # your Django project's media files - amend as required
    }

    location /static {
		# your Django project's static files - amend as required
        alias /data/www/%userpod%/django_projects/podv2/uwsgi/podv2.sock max_fails=2 fail_timeout=3s;
}

# configuration of the server
server {
    # the port your site will be served on/pod/static;
    listen}

    # Finally, 80;
send all non-media requests #to the domainDjango nameserver.
 it will serve for
location / {
  server_name xxxxx.umontpellier.fr; # substitute your machine's IP address or FQDN uwsgi_pass  podupstream;
    charset    include utf-8;

    # max upload size/data/www/%userpod%/django_projects/podv2/uwsgi_params;
    client_max_body_size 4G;   # adjust to taste

    #location ^~ /video_edit {
    #    track_uploads uploadp 30s
    #}

    #location ^~ /progressbarupload/upload_progress {
        # JSON document rather than JSONP callback, pls
    #    upload_progress_json_output;
    #    report_uploads uploadp;
    #}

    # Django media
    location /media  {
        alias}
}


Installation uWSGI

Bloc de code
languagebash
titleServeur(s) Pod / Compte root
[root]# yum install pcre-devel
[root]# cd /data/www/%userod%/django_projects/podv2/
[root /data/www/%userpod%/django_projects/podv2]# pip3 install uwsgi

Configuration uWSGI

Pour configurer uWSGI, je me base sur le fichier fourni par Pod v2, que je copie dans custom et que je personnalise :

Bloc de code
languagebash
titleServeur(s) Pod / Compte %userpod%
[%userpod%]# cd /data/www/%userod%/django_projects/podv2/
# Copie du fichier
[%userpod% /data/www/%userpod%/django_projects/podv2]# cp pod_uwsgi.ini pod/custom/.
# Edition du nouveau fichier
[%userpod% /data/www/%userpod%/django_projects/podv2]# emacs pod/custom/pod_uwsgi.ini
# Création d'un répertoire, qui contiendra les fichiers de logs, socket... de uWSGI
[%userpod% /data/www/%userpod%/django_projects/podv2]# mkdir /data/www/%userpod%/media;  /django_projects/podv2/uwsgi
# yourGestion Djangodes project'sdroits mediade files - amend as required
    }

    location /static {
        aliasce répertoire
[%userpod% /data/www/%userpod%/django_projects/podv2]# chown %userpod%:nginx /data/www/%userpod%/django_projects/podv2/uwsgi
[%userpod% /data/www/%userpod%/django_projects/podv2]# chmod 776 /data/www/%userpod%/django_projects/podv2/uwsgi

Voici le contenu du fichier pod_uwsgi.ini :

Bloc de code
languagetext
titleServeur(s) Pod / Fichier pod_uwsgi.ini
# pod_uwsgi.ini file
[uwsgi]

# Django-related settings
# the base directory (full path)
chdir/static; # your Django project's static files - amend as required
    }

    # Finally, send all non-media requests to the Django server.
    location / {
        uwsgi_pass  podupstream;
        include    = /data/www/%userpod%/django_projects/podv2/uwsgi_params;
# Django's wsgi file
module     #track_uploads uploadp 30s;	
   = }
}

Installation uWSGI

Bloc de code
languagebash
titleServeur(s) Pod / Compte root
[%userpod%@ts-sun-video]# cd /data/www/%userod%/django_projects/podv2/
[%userpod%@ts-sun-videopod.wsgi
# the virtualenv (full path)
home            = /data/www/%userpod%/.virtualenvs/django_projects/podv2]# sudo pip3 install uwsgi

Configuration uWSGI

Pour configurer uWSGI, je me base sur le fichier fourni par Pod v2, que je copie dans custom et que je personnalise :

Bloc de code
languagebash
titleServeur(s) Pod / Compte %userpod%
[%userpod%]# cd /data/www/%userod%/django_projects/podv2/
# Copie du fichier
[%userpod% /data/www/%userpod%/django_projects/podv2]# cp pod_uwsgi.ini pod/custom/.
# Edition du nouveau fichier
[%userpod% /data/www/%userpod%/django_projects/podv2]# emacs pod/custom/pod_uwsgi.ini
# Création d'un répertoire, qui contiendra les fichiers de logs, socket... de uWSGI
[%userpod% /data/www/%userpod%/django_projects/podv2]# mkdirpod
# process-related settings
# The master uWSGI process is necessary to gracefully re-spawn and pre-fork workers, consolidate logs, and manage many other features.
master          = true
# maximum number of worker processes
processes       = 10
# the socket (use the full path to be safe
socket          = /data/www/%userpod%/django_projects/podv2/uwsgi/podv2.sock
chown-socket    = %userpod%:nginx
# http		= :8000
# Gestion des droits de ce répertoire
[%userpod% /data/www/%userpod%/django_projects/podv2]# chown %userpod%:nginx /data/www/%userpod%/django_projects/podv2/uwsgi
[%userpod% /data/www/%userpod%/django_projects/podv2]# chmod 776 ... with appropriate permissions - may be needed
chmod-socket    = 666
# clear environment on exit
vacuum          = true

daemonize       = /data/www/%userpod%/django_projects/podv2/uwsgi

...

uwsgi

...

Serveur(s) Pod Fichier pod_uwsgi.ini (compte %userpod%)
Bloc de code
languagetext
title
/
# pod_uwsgi.ini file
[uwsgi]uwsgi-pod.log

# Django-related settings
# the base directory (full path)
chdir recommended params by https://www.techatbloomberg.com/blog/configuring-uwsgi-production-deployment/
strict          = true  ; This option = /data/www/%userpod%/django_projects/podv2
# Django's wsgi file
module          = pod.wsgi
#moduletells uWSGI to fail to start if any parameter in the configuration file isn’t explicitly understood. 
die-on-term     = true  ; Shutdown = pod.wsgi:application
# the virtualenv (full path)
home    when receiving SIGTERM (default is respawn)
need-app        = /data/www/%userpod%/.virtualenvs/django_pod
# process-related settings
# master
master          = true
# maximum number of worker processes
processes       = 10
# the socket (use the full path to be safe)
socket          = /data/www/%userpod%/django_projects/podv2/uwsgi/podv2.sock
chown-socket 	= podtest:nginx
# ... with appropriate permissions - may be needed
#chmod-socket    = 666
chmod-socket    = 666
# clear environment on exit
vacuum          = true
#
daemonize		= /data/www/%userpod%/django_projects/podv2/uwsgi/uwsgi-pod.log
#
die-on-term		= true
limit-as 		= 5120
max-requests	= 5000true  ; This parameter prevents uWSGI from starting if it is unable to find or load your application module.

# Limit process address space (vsz) (in megabytes).
# Limits the address space usage of each uWSGI (worker) process using POSIX/UNIX setrlimit(). For example, limit-as 256 will disallow uWSGI processes to grow over 256MB of address space. Address space is the virtual memory a process has access to. It does not correspond to physical memory. Read and understand this page before enabling this option: http://en.wikipedia.org/wiki/Virtual_memory
# limit-as        = 5120
# max-requests    = 5000

Démarrage manuel des workers uWSGI 

Il faut lancer la commande uwsgi, en pointant vers le bon fichier pod_uwsgi.ini, via l'environnement django_pod. Cela donne :

Bloc de code
languagebash
titleServeur(s) Pod / Compte %userpod%
[%userpod%@ts-sun-video%userpod%]# cd
[%userpod%@ts-sun-video%userpod% /home/%userpod%]# source .bashrc
[%userpod%@ts-sun-video%userpod% /home/%userpod%]# cd /data/www/%userpod%/django_projects/podv2
[%userpod%@ts-sun-video%userpod% /data/www/%userpod%/django_projects/podv2]# workon django_pod
(django_pod) [%userpod%@ts-sun-video%userpod%][/data/www/%userpod%/django_projects/podv2]# /usr/bin/uwsgi --ini /data/www/%userpod%/django_projects/podv2/pod/custom/pod_uwsgi.ini --enable-threads --uid %userpod% --gid nginx --pidfile /data/www/%userpod%/django_projects/podv2/uwsgi/pod.pid

Arrêt manuel des workers uWSGI

Bloc de code
languagebash
titleServeur(s) Pod / Compte %userpod%
[%userpod%@ts-sun-video%userpod%]# cd
[%userpod%@ts-sun-video%userpod% /home/%userpod%]# source .bashrc
[%userpod%@ts-sun-video%userpod% /home/%userpod%]# cd /data/www/%userpod%/django_projects/podv2
[%userpod%@ts-sun-video%userpod% /data/www/%userpod%/django_projects/podv2]# workon django_pod
(django_pod) [%userpod%@ts-sun-video%userpod%][/data/www/%userpod%/django_projects/podv2]# /usr/bin/uwsgi --stop /data/www/%userpod%/django_projects/podv2/uwsgi/pod.pid

...

Bloc de code
languagetext
titleServeur(s) Pod / Fichier uwsgi-pod.service (compte root)
# [Unit]
Description=Pod uWSGI app
After=syslog.target

[Service]
ExecStartPre=-/usr/bin/bash -c 'export WORKON_HOME=/data/www/%userpod%/.virtualenvs; export VIRTUALENVWRAPPER_PYTHON=/usr/bin/python3.6; cd /data/www/%userpod%/django_projects/podv2; source /usr/bin/virtualenvwrapper.sh; workon django_pod;'
ExecStart=/usr/bin/bash -c '/usr/bin/bash -c 'export WORKON_HOME=/bin/uwsgi --ini /data/www/%userpod%/django_projects/podv2/pod/custom/pod_uwsgi.ini --enable-threads --uid %userpod% --gid nginx --pidfile /data/www/%userpod%/django_projects/podv2/uwsgi/.virtualenvs; export VIRTUALENVWRAPPER_PYTHONpod.pid'
ExecStop=/usr/bin/python3.6; cduwsgi --stop /data/www/%userpod%/django_projects/podv2; source /usr/bin/virtualenvwrapper.sh; workon django_pod;'
ExecStart=/usr/bin/bash -c '/usr/bin/uwsgi --ini /data/www/%userpod%/django_projects/podv2/pod/custom/pod_uwsgi.ini --enable-threads --uid %userpod% --gid nginx --pidfile uwsgi/pod.pid
User=%userpod%
Group=nginx
Restart=on-failure
Type=notify
TimeoutStopSec=15
KillSignal=SIGQUIT
RemainAfterExit=yes
StandardError=syslog
NotifyAccess=all
StartLimitBurst=0
 
[Install]
WantedBy=multi-user.target
limit-as=512

Pensez à créer le répertoire /var/run/podv2, avec les droits adéquats pour pod:nginx.

Configurer pour que ce service soit démarré lors d'un reboot :

Bloc de code
languagebash
titleMise en service uwsgi-pod (compte root)
[root ~]# systemctl daemon-reload
[root ~]# systemctl enable uwsgi-pod.service

Rotation des logs

Configurer un système de logrotate pour vider régulièrement les logs de django et uwsgi. Pour cela, j'ai créé le fichier /etc/logrotate.d/django-uwsgi avec le contenu suivant :

Bloc de code
title/etc/logrotate.d/django-uwsgi
/data/www/%userpod%/django_projects/podv2/uwsgi/pod*.pid'
ExecStop=/usr/bin/uwsgi --stop log
/data/www/%userpod%/django_projects/podv2/pod/uwsgilog/pod*.pid
User=%userpod%
Group=nginx
Restart=on-failure
Type=notify
TimeoutStopSec=15
KillSignal=SIGQUIT
RemainAfterExit=yes
StandardError=syslog
NotifyAccess=all
StartLimitBurst=0
 
[Install]
WantedBy=multi-user.target
limit-as=512

Pensez à créer le répertoire /var/run/podv2, avec les droits adéquats pour pod:nginx.

Configurer pour que ce service soit démarré lors d'un reboot :

...

languagebash
titleMise en service uwsgi-pod (compte root)

...

log {
    su %userpod% nginx
    daily
    missingok
    rotate 14
    compress
    delaycompress
    notifempty
    create 0640 %userpod% nginx
    sharedscripts
    postrotate
        systemctl restart uwsgi-pod >/dev/null 2>&1
    endscript
}

Puis lancez la commande suivante pour vérifier que ca fonctionne :
logrotate -d /etc/logrotate.d/django-uwsgi

Migrations de Pod v2

Migration v2.0.4 vers v2.1.0

...

Bloc de code
languagebash
titleServeur(s) Pod / Migration v2.0.4 vers 2.1.0 (compte %userpod%)
[%userpod%@ts-sun-video%userpod% ~]# cd
[%userpod%@ts-sun-video%userpod% ~]# source .bashrc
[%userpod%@ts-sun-video%userpod% ~]# cd /data/www/%userpod%/django_projects/podv2
[%userpod%@ts-sun-video%userpod% /data/www/%userpod%/django_projects/podv2]# workon django_pod
(django_pod) [%userpod%@ts-sun-video%userpod%][/data/www/%userpod%/django_projects/podv2] git pull
(django_pod) [%userpod%@ts-sun-video%userpod%][/data/www/%userpod%/django_projects/podv2] python manage.py makemigrations
(django_pod) [%userpod%@ts-sun-video%userpod%][/data/www/%userpod%/django_projects/podv2] python manage.py migrate
(django_pod) [%userpod%@ts-sun-video%userpod%][/data/www/%userpod%/django_projects/podv2] python manage.py collectstatic

...

Il est nécessaire de vérifier / réaliser les étapes suivantes à chaque migration :

...

  •  la la traduction
  • la gestion des fichiers statiques, utiles au module H5P

...

languagebash
titleServeur(s) Pod / Copie de fichiers statiques (compte %userpod%)
  •  
  • les templates spécifiques (footer.html, 404.html....) doivent, dans certains cas, être modifiés, en cas de changement majeur.
  • les autres spécificités qui n'ont pas pu être pris en compte dans le système de répertoire custom.