A l'heure actuelle, Pod a été installé en test sur une VM spécifique, sous CentOS 7.
Pour réaliser cette installation, je me suis basé sur les packages et documentation de référence, à savoir :
Cependant, pour CentOS 7, il a fallu changer de nombreuses commandes. Ci-dessous les étapes d'installation réalisées :
Lors de certaines étapes d'installation, il est nécessaire d'être root, ou - à minima - d'avoir les droits sudo. Selon l'environnement test / préproduction / production, il faut remplacer %userpod% par le bon user. Lors d el'installation, je parle du fichier settings_local.py; la documentation concernant ce fichier se retrouve plus loin, dans la partie Configuration Pod v2. |
[root@ts-sun-video ~]# adduser %userpod% [root@ts-sun-video ~]# passwd %userpod% [root@ts-sun-video ~]# usermod -aG wheel %userpod% [root@ts-sun-video ~]# # L'utilisateur %userpod% doit faire parti du groupe nginx. A ce moment là, ce groupe n'existe pas encore, mais il est très important de s'en rappeler par la suite !!! [root@ts-sun-video ~]# usermod -g nginx %userpod% |
[root@ts-sun-video ~]# yum install epel-release |
Installation de la dernière version de Python stable, en tant que root (ou via sudo).
Cf. https://www.rosehosting.com/blog/how-to-install-python-3-6-4-on-centos-7/
[root@ts-sun-video ~]# yum install -y https://centos7.iuscommunity.org/ius-release.rpm [root@ts-sun-video ~]# yum update [root@ts-sun-video ~]# yum install -y python36u python36u-libs python36u-devel python36u-pip [root@ts-sun-video ~]# yum install python36-setuptools [root@ts-sun-video ~]# python3.6 -V |
Cf. https://stackoverflow.com/questions/50408941/recommended-way-to-install-pip3-on-centos7
Par la suite, pour utiliser la nouvelle version de pip, il est nécessaire d'utiliser - en lieu et place de la commande pip :
# Pour vérifier la version [root@ts-sun-video ~]# pip3 -V # Pour mettre à jour pip3 [root@ts-sun-video ~]# pip3 install --upgrade pip # Autant installer le package requests (utile pour la reprise de l'existant) [root@ts-sun-video ~]# pip3 install requests |
L'environnement virtuel sera positionné dans le répertoire /data/www/%userpod% (choix pour l'Université de Montpellier).
Surtout bien positionner l'environnement virtuel dans le bon répertoire dès le départ. Il est complexe par la suite de déplacer un environnement virtuel d'un répertoire à un autre ! |
[root@ts-sun-video ~]# cd /data/www/%userpod% [root@ts-sun-video /data/www/%userpod%]# pip3 install virtualenvwrapper |
Puis éditer le fichier .bashrc du compte :
[%userpod%@ts-sun-video ~]$ cd [%userpod%@ts-sun-video ~]$ emacs .bashrc |
Si besoin, commenter les anciennes lignes, puis ajouter ces quelques lignes en fin de fichier :
# POD v2 export WORKON_HOME=/data/www/%userpod%/.virtualenvs #### A priori, ces lignes ne sont pas utiles #### # Il est necessaire d'utiliser le python du virtualenv #export PYTHONPATH=$HOME/.virtualenvs/django_pod/bin/ #export PYTHONPATH=/usr/bin/ #PATH=$PYTHONPATH:$PATH export VIRTUALENVWRAPPER_PYTHON=/usr/bin/python3.6 source /usr/bin/virtualenvwrapper.sh |
Remarque : le fichier virtualenvwrapper.sh est positionné dans /usr/bin/virtualenvwrapper.sh et non pas /usr/local/bin/virtualenvwrapper.sh. |
Prendre en compte les modifications :
[%userpod%@ts-sun-video ~]$ source .bashrc |
Et créer un nouvel environnement virtuel :
[%userpod%@ts-sun-video ~]$ cd /data/www/%userpod% [%userpod%@ts-sun-video /data/www/%userpod%]$ mkvirtualenv --system-site-packages --python=/usr/bin/python3.6 django_pod |
Pour l'Université de Montpellier, on positionne le projet dans /data/www/%userpod% et non /usr/local.
En tant que %userpod%: [pod@ts-sun-video ~]$ sudo mkdir /data/www/%userpod%/django_projects OU En tant que root (A vérifier: existence du groupe nginx) [root@ts-sun-video ~]$ mkdir /data/www/%userpod%/django_projects [root@ts-sun-video ~]$ chown %userpod%:nginx /data/www/%userpod%/django_projects/ |
Création d'un lien symbolique, dans le home de l'utilisateur :
[%userpod%@ts-sun-video ~]$ cd [%userpod%@ts-sun-video ~]$ 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 :
[%userpod%@ts-sun-video ~]$ cd /data/www/%userpod%/django_projects [%userpod%@ts-sun-video /data/www/%userpod%/django_projects]$ git clone https://github.com/esupportail/podv2.git |
On profite pour mettre à jour la version de pip3 avec l'installation des librairies Python :
[%userpod%@ts-sun-video ~]$ cd [%userpod%@ts-sun-video ~]$ source .bashrc [%userpod%@ts-sun-video ~]$ cd /data/www/%userpod%/django_projects/podv2 [%userpod%@ts-sun-video /data/www/%userpod%/django_projects/podv2]$ workon django_pod (django_pod) [%userpod%@ts-sun-video][/data/www/%userpod%/django_projects/podv2] pip3 install --upgrade pip (django_pod) [%userpod%@ts-sun-video][/data/www/%userpod%/django_projects/podv2] pip3 install -r requirements.txt |
Il faut vérifier que l'on se trouve bien dans l'environnement virtuel (présence de "(django_pod)" au début l'invite de commande. Sinon, il faut lancer la commande, dans le bon répertoire $> workon django_pod.
Utilisé pour la génération des overviews. A installer sur le serveur d'encodage.
[root@ts-sun-video ~]# yum install ImageMagick ImageMagick-devel |
Utilisé pour l'encodage des vidéos. A installer sur le serveur d'encodage.
[root@ts-sun-video ~]# cd /opt/ [root@ts-sun-video /opt]# mkdir ffmpeg [root@ts-sun-video /opt]# cd ffmpeg [root@ts-sun-video /opt]# wget http://johnvansickle.com/ffmpeg/releases/ffmpeg-release-64bit-static.tar.xz [root@ts-sun-video /opt]# tar -Jxvf ffmpeg-release-64bit-static.tar.xz [root@ts-sun-video /opt]# # ATTENTION : changer les X.X.X par la bonne version !!! [root@ts-sun-video /opt]# ln -s ffmpeg-X.X.X-64bit-static ffmpeg [root@ts-sun-video /opt]# chown -R %userpod%:nginx /opt/ffmpeg |
Il faudra modifier le fichier settings_local.py pour indiquer les chemins ffmpeg et ffprobe :
FFMPEG = '/opt/ffmpeg/ffmpeg/ffmpeg' FFPROBE = '/opt/ffmpeg/ffmpeg/ffprobe' |
Utilisé pour l'encodage des vignettes (plus rapide que ffmpeg dans ce cas là). A installer sur le serveur d'encodage.
Installation décrite à cette adresse : http://linoxide.com/linux-how-to/install-ffmpeg-centos-7/
[root@ts-sun-video ~]# yum -y install epel-release [root@ts-sun-video ~]# rpm --import http://li.nux.ro/download/nux/RPM-GPG-KEY-nux.ro [root@ts-sun-video ~]# # Attention : modification du 0-1 en 0-5 par rapport à la documentation ci-dessus [root@ts-sun-video ~]# rpm -Uvh http://li.nux.ro/download/nux/dextop/el7/x86_64/nux-dextop-release-0-5.el7.nux.noarch.rpm [root@ts-sun-video ~]# yum repolist [root@ts-sun-video ~]# yum install --enablerepo=epel ffmpeg ffmpeg-devel [root@ts-sun-video ~]# yum install --enablerepo=epel ffmpegthumbnailer |
Au final, le serveur contient 2 versions différentes de ffmpeg :
|
A installer uniquement sur le serveur principal Frontal Web (1 seul RabbitMQ est utile).
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
Voici ce qui a été fait à l'UM :
[root@ts-sun-video ~]# cd [root@ts-sun-video ~]# 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-video ~]# yum install erlang-21.2.3-1.el7.centos.x86_64.rpm |
[root@ts-sun-video ~]# cd [root@ts-sun-video ~]# wget https://github.com/rabbitmq/rabbitmq-server/releases/download/v3.7.10/rabbitmq-server-3.7.10-1.el7.noarch.rpm [root@ts-sun-video ~]# rpm --import https://www.rabbitmq.com/rabbitmq-release-signing-key.asc [root@ts-sun-video ~]# yum install rabbitmq-server-3.7.10-1.el7.noarch.rpm [root@ts-sun-video ~]# # Démarrage du service la 1° fois [root@ts-sun-video ~]# systemctl start rabbitmq-server |
Il est possible d'utiliser une interface Web pour gérer Rabbitmq; cette interfaçe se nomme Rabbitmq management console.
La version installée contient - de base - cette interface. Il n'y a plus besoin d'installation complémentaire.
Il est ensuite possible d'accéder à cette interface via le port 15672 : http://[serverPod]:15672/
Penser à rendre accessible ce port pour les utilisateurs concernés de la DSI.
[root@ts-sun-video ~]# # On crée un nouvel utilisateur pod qui dispose d'un mot de passe xxxxx [root@ts-sun-video ~]# rabbitmqctl add_user pod xxxxx [root@ts-sun-video ~]# # 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-video ~]# rabbitmqctl set_user_tags pod administrator [root@ts-sun-video ~]# # Commande documentée mais ne fonctionne pas dans mon cas "abbitmqctl clear_admin guest" remplacée par celle ci-dessous [root@ts-sun-video ~]# rabbitmqctl set_permissions -p / pod ".*" ".*" ".*" |
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%@ Les fichiers relatifs à Celery sont déjà créés dans Pod. L'installation est donc terminée. |
Configurer le fichier settings_local.py de Pod, pour utiliser l'encodage déporté.
# Encode with Celery CELERY_TO_ENCODE = True CELERY_NAME = "pod_project" CELERY_BACKEND = "amqp" # CELERY_BROKER = "amqp://guest@localhost//" CELERY_BROKER = "amqp://pod:xxxx@162.38.60.68//" |
La valeur du celery_broker doit pointer vers le serveur RabbitMQ installé sur le serveur Web Frontal principal.
Le paragraphe suivant concerne le serveur d'encodage. Dans son cas, il doit recevoir les ordres d'encodage qui lui ont été envoyés. |
A réaliser UNIQUEMENT sur le serveur d'encodage.
CELERYD_NODES="worker1" # Nom du/des worker(s) DJANGO_SETTINGS_MODULE="pod.settings" # settings de votre Pod CELERY_BIN="/data/www/%userpod%/.virtualenvs/django_pod/bin/celery" # répertoire source de celery CELERY_APP="pod.main" # application où se situe celery CELERYD_CHDIR="/data/www/%userpod%/django_projects/podv2" # répertoire du projet Pod (où se trouve manage.py) CELERYD_OPTS="--time-limit=86400 --concurrency=1 --maxtasksperchild=1" # options à appliquer en plus sur le comportement du/des worker(s) CELERYD_LOG_FILE="/var/log/celery/%N.log" # fichier log CELERYD_PID_FILE="/var/run/celery/%N.pid" # 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 |
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 ~]# systemctl daemon-reload [root@ts-sun-video ~]# systemctl enable celeryd |
/var/log/celery/*.log { missingok notifempty compress delaycompress copytruncate daily dateext rotate 7 size 10M } |
Pour utiliser Elasticsearch, il faut avoir java8 sur sa machine.
Dans l'environnement applicatif UM, Java est installé de base; cette étape n'est alors pas nécessaire.
[root@ts-sun-video ~]# yum install java-1.8.0-openjdk.x86_64 |
[root@ts-sun-video ~]# rpm --import https://artifacts.elastic.co/GPG-KEY-elasticsearch |
[elasticsearch-6.x] name=Elasticsearch repository for 6.x packages baseurl=https://artifacts.elastic.co/packages/6.x/yum gpgcheck=1 gpgkey=https://artifacts.elastic.co/GPG-KEY-elasticsearch enabled=1 autorefresh=1 type=rpm-md |
[root@ts-sun-video ~]# yum install elasticsearch |
S'il y a besoin de supprimer une ancienne installation d'Elasticsearch, exécuter la commande suivante, en tant que root : yum erase elasticsearch
[root@ts-sun-video ~]# systemctl daemon-reload [root@ts-sun-video ~]# systemctl enable elasticsearch.service |
[root@ts-sun-video ~]# # Création des répertoires de base [root@ts-sun-video ~]# mkdir /data/elasticsearch [root@ts-sun-video ~]# mkdir /data/elasticsearch/data [root@ts-sun-video ~]# mkdir /data/elasticsearch/logs [root@ts-sun-video ~]# chown elasticsearch:elasticsearch /data/elasticsearch/ -R [root@ts-sun-video ~]# chown elasticsearch:elasticsearch /usr/share/elasticsearch/ -R [root@ts-sun-video ~]# chown elasticsearch:elasticsearch /etc/elasticsearch/ -R |
cluster.name: %userpod% node.name: node-1 path.data: /data/elasticsearch/data path.logs: /data/elasticsearch/logs # Mettre l'adresse IP du serveur network.host: 162.38.xx.xx # Au cas où, il est aussi possible de mettre 0.0.0.0 # network.host: 0.0.0.0 # Adresse IP du ou des serveurs pod discovery.zen.ping.unicast.hosts: ["162.38.xx.xx"] |
[root@ts-sun-video ~]# systemctl start elasticsearch.service # Mettre l'adresse IP du serveur Elasticsearch [root@ts-sun-video ~]# curl -XGET http://162.38.xx.xx:9200/_cat/nodes |
Pour utiliser la recherche dans Pod, nous allons avoir besoin également du plugin ICU:
[root@ts-sun-video ~]# systemctl cd /usr/share/elasticsearch/ [root@ts-sun-video ~]# bin/elasticsearch-plugin install analysis-icu [root@ts-sun-video ~]# systemctl restart elasticsearch |
Pour installer H5PP avec Podv2, la procédure est un peu particulière.
Voici les étapes nécessaires à cette installation :
1. Installation des packages
[%userpod%@ts-sun-video ~]# cd [%userpod%@ts-sun-video ~]# source .bashrc [%userpod%@ts-sun-video ~]# cd /data/www/%userpod%/django_projects # Installation requests [%userpod%@ts-sun-video /data/www/%userpod%/django_projects]# pip3 install requests [%userpod%@ts-sun-video /data/www/%userpod%/django_projects]# workon django_pod (django_pod)[%userpod%@ts-sun-video /data/www/%userpod%/django_projects]# git clone https://github.com/EsupPortail/H5PP.git (django_pod)[%userpod%@ts-sun-video /data/www/%userpod%/django_projects]# cd H5PP (django_pod)[%userpod%@ts-sun-video /data/www/%userpod%/django_projects/H5PP]# git checkout --track origin/dev # Création du package H5PP (-> création de dist/H5PP-0.1.9.tar.gz) (django_pod)[%userpod%@ts-sun-video /data/www/%userpod%/django_projects/H5PP]# python setup.py sdist (django_pod)[%userpod%@ts-sun-video /data/www/%userpod%/django_projects/H5PP]# cd ../podv2 (django_pod)[%userpod%@ts-sun-video /data/www/%userpod%/django_projects/podv2]# pip3 install ../H5PP/dist/H5PP-0.1.9.tar.gz |
Pour activer le plugin dans Pod, il est nécessaire d'éditer son fichier custom/settings_local.py :
THIRD_PARTY_APPS = ['live', 'enrichment', 'interactive'] ## # H5P relative parameters # H5P_ENABLED = True # Active the module or not #H5P_VERSION = '7.x' # Current version of H5P module H5P_DEV_MODE = 0 # Active the development mode or not #H5P_PATH = os.path.join(BASE_DIR, 'h5pp/static/h5p') # Path to static ressources of H5PP module H5P_URL = '/h5p/' # All H5PP pages begin with this url H5P_SAVE = 30 # How often current content state should be saved H5P_EXPORT = '/exports/' # Location of exports (packages .h5p) H5P_LANGUAGE = 'fr' # Language of the module H5P. BASE_URL = 'https://pod-test.umontpellier.fr' # Hostname of your django ap |
Il reste maintenant à installer les librairies nécessaires au module sous-jacent H5P.
Pour cela, il suffit de se rendre à l'URL http://<adresse_serveur>/h5p/home/.
Puis, dans cette page :
Ainsi, les librairies H5P seront accessibles dans Pod, et l'icône d'ajout d'interactivité sera ajouté aux vidéos.
Il semblerait qu'il manque des éléments de style (CSS, images...) pour l'affichage dans Pod v2, mais l'ajout de librairies fonctionne correctement.
Il semblerait que l'ensemble des fichiers statiques ne soient pas positionnés par défaut au bon endroit : avec Pod v2, la variable H5P_PATH ne semble pas être pris en compte et provoque même une erreur au démarrage.
Pour ma part, j'ai résolu ce problème en positionnant manuellement les fichiers statiques au bon endroit (cela n'est sûrement pas la meilleure méthode, mais cela fonctionne), à savoir :
# Les fichiers statiques sont dans l'environnement virtuel. Il a fallu copier le répertoire h5p : cp /data/www/%userpod%/.virtualenvs/django_pod/lib/python3.6/site-packages/h5pp/static/h5p /data/www/%userpod%/django_projects/podv2/pod/static/h5p -R |
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 :
[%userpod%@ts-sun-video ~]# mkdir /data/www/%userpod%/django_projects/podv2/pod/custom/ [%userpod%@ts-sun-video ~]# cp /data/www/%userpod%/django_projects/podv2/pod/main/settings.py /data/www/%userpod%/django_projects/podv2/pod/custom/settings_local.py |
[root@ts-sun-video ~]# # En cas de problème de droit [root@ts-sun-video ~]# 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 :
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) :
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 :
# -*- 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' ## # 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 = ( ('Loic Bonavent', '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', 'interactive'] # 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"' ' 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', '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' ## # H5P relative parameters # H5P_ENABLED = True # Active the module or not #H5P_VERSION = '7.x' # Current version of H5P module H5P_DEV_MODE = 0 # Active the development mode or not #H5P_PATH = os.path.join(BASE_DIR, 'h5pp/static/h5p') # Path to static ressources of H5PP module H5P_URL = '/h5p/' # All H5PP pages begin with this url H5P_SAVE = 30 # How often current content state should be saved H5P_EXPORT = '/exports/' # Location of exports (packages .h5p) H5P_LANGUAGE = 'fr' # Language of the module H5P. BASE_URL = 'https://xxx.umontpellier.fr' # Hostname of your django ap # Utile pour la reprise de l'existant (adresse de Pod v1 en production) FROM_URL = 'https://video.umontpellier.fr/media/' |
Nous pouvons enfin vérifier le bon fonctionnement de l'ensemble (l'erreur affichée lors de la suppression est normal puisque l'indice n'existe pas encore, mais nous devons supprimer avant de créer un index dans ES) :
[%userpod%@ts-sun-video ~]$ cd [%userpod%@ts-sun-video ~]$ source .bashrc [%userpod%@ts-sun-video ~]$ cd /data/www/%userpod%/django_projects/podv2 [%userpod%@ts-sun-video /data/www/%userpod%/django_projects/podv2]$ workon django_pod (django_pod) [%userpod%@ts-sun-video][/data/www/%userpod%/django_projects/podv2] python3.6 manage.py create_pod_index |
[%userpod%@ts-sun-video ~]$ pip3 install "mysqlclient==1.3.14" |
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). |
(django_pod) [%userpod%@ts-sun-video][/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.
(django_pod) [%userpod%@ts-sun-video][/data/www/%userpod%/django_projects/podv2]# python3.6 manage.py createsuperuser |
Il faut vérifier que l'on se trouve bien dans l'environnement virtuel.
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.
(django_pod) [%userpod%@ts-sun-video][/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.
Il est nécessaire de donner les droits à l'utilisateur Nginx (cf. configuration Nginx) aux fichiers Web de l'application.
Dans mon cas, voici les droits que j'ai positionné en tant que root (ou sudo) :
# Droits (sinon cela peut provoquer une erreur "ImportError: No module named site") [root@ts-sun-video ~]# chmod 755 /data/www/%userpod%/ # Attention, les vidéos vont être uploadées dans le répertoire « média ». Il faut donner le droit en lecture et en écriture à l'utilisateur web (nginx) [root@ts-sun-video ~]# chown -R %userpod%:nginx /data/www/%userpod%/media/ [root@ts-sun-video ~]# chown -R %userpod%:nginx /data/www/%userpod%/.virtualenvs/ [root@ts-sun-video ~]# chown -R %userpod%:nginx /data/www/%userpod%/django_projects/ [root@ts-sun-video ~]# chmod 755 /data/www/%userpod%/media -R # Sécurisation [root@ts-sun-video ~]# chmod -R o-rx /data/www/%userpod%/django_projects/podv2/ |
Pour réaliser les traductions, il suffit de modifier le fichier /data/www/%userpod%/django_projects/podv2/pod/locale/fr/LC_MESSAGES/django.po puis de compiler :
(django_pod) [%userpod%@ts-sun-video][/data/www/%userpod%/django_projects/podv2]# django-admin.py compilemessages |
Il faut vérifier que l'on se trouve bien dans l'environnement virtuel.
A l'heure actuelle, j'ai ajouté les traductions suivantes :
La mise en place d'un thème spécifique à chaque établissement est totalement différent que pour la v1.
Pour l'utilisation de fichiers Javascript, CSS ou d'images, il est nécessaire d'utiliser un répertoire custom, directement dans le répertoire static.
Ainsi, ce répertoire custom est accessible : /data/www/%userpod%/django_projects/podv2/pod/static/custom.
[%userpod%@ts-sun-video][/]# mkdir /data/www/%userpod%/django_projects/podv2/pod/static/custom |
Pour utiliser des templates spécifiques, il est nécessaire de :
# 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' ], }, }, ] |
Ce répertoire contient les pages spécifiques à l'établissement, sur le modèle /data/www/%userpod%/django_projects/podv2/pod/main/templates.
Par exemple, pour définir une page d'erreur spécifique, il suffit de créer une page /data/www/%userpod%/django_projects/podv2/pod/custom/templates/404.html, à partir de la page /data/www/%userpod%/django_projects/podv2/pod/main/templates/404.html.
Après divers tests sur Pod v1, il s'était avéré utile de modifier la ligne de commande par défaut qui permet l'encodage des vidéos (en remplaçant -b:v %(bv)s -maxrate %(bv)s -bufsize %(bufsize)s par -crf 23)
Pour Pod v2, cela ne semble plus utile; par contre, l'option est positionnée - par défaut - à -crf 20, ce qui traduit une bonne qualité, mais des fichiers vidéos plus lourds !
Dans Pod v2, pour l'encodage MP4, il est possible d'utiliser le paramètre FFMPEG_STATIC_PARAMS. |
Une fois le serveur lancé, il m'a fallu réaliser quelques éléments de paramétrage via l'interface d'administration du site.
Le module d'administration n'est accessible qu'aux administrateurs du site.
Au départ, il n'y a que le compte root qui est considéré comme administrateur du site.
Pour donner ce droit à d'autres utilisateurs :
Il est possible de mettre directement le statut super-utilisateur à un utilisateur en base de données: UPDATE |
Pour obtenir une génération correcte des URLs des vidéos lors d'une recherche, il est obligatoire de positionner l'adresse dans le module des sites de Pod.
Pour ce faire, 2 possibilités :
|
Côté serveur Web, je pensais partir sur une configuration similaire à Pod v1, à savoir du Apache + WSGI.
Malheureusement, il semblerait que Pod v2 ne fonctionne pas sous cette configuration (ou du moins, cela nécessiterait plus de temps pour trouver une solution).
Du coup, j'ai suivi les recommandations et mis en place du Nginx + uWSGI.
Ci-dessous, je mets l'ensemble des documentations concernant ces solutions, même si cela n'est pas concluant.
(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.
Cette solution ne peut être utilisée en production ! |
Documentations de référence :
[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]# yum install python36u-mod_wsgi [root@ts-sun-video]# # ATTENTION: nouveau fichier créé /etc/httpd/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 |
Documentations de référence :
[root@ts-sun-video]# 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 |
A FAIRE : installer # Pod Progress Bar : reserve 1MB under the name 'uploads' to track uploads upload_progress uploadp 1m; Cela n'est pas de base sous CentOS. A installer à la main. (cf. https://www.nginx.com/resources/wiki/modules/upload_progress/). |
Pour configurer Nginx, je me base sur le fichier fourni par Pod v2, que je copie dans custom et que je personnalise :
[%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 :
# 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:///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 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 #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 /data/www/%userpod%/media; # your Django project's media files - amend as required } location /static { alias /data/www/%userpod%/django_projects/podv2/pod/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; #track_uploads uploadp 30s; } } |
[%userpod%@ts-sun-video]# cd /data/www/%userod%/django_projects/podv2/ [%userpod%@ts-sun-video /data/www/%userpod%/django_projects/podv2]# sudo pip3 install uwsgi |
Pour configurer uWSGI, je me base sur le fichier fourni par Pod v2, que je copie dans custom et que je personnalise :
[%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_uwsgi.ini pod/custom/. # Edition du nouveau fichier [%userpod%@ts-sun-video /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%@ts-sun-video /data/www/%userpod%/django_projects/podv2]# mkdir /data/www/%userpod%/django_projects/podv2/uwsgi # Gestion des droits de ce répertoire [%userpod%@ts-sun-video /data/www/%userpod%/django_projects/podv2]# chown %userpod%:nginx /data/www/%userpod%/django_projects/podv2/uwsgi [%userpod%@ts-sun-video /data/www/%userpod%/django_projects/podv2]# chmod 766 /data/www/%userpod%/django_projects/podv2/uwsgi |
Voici le contenu du fichier pod_uwsgi.ini :
# pod_uwsgi.ini file [uwsgi] # Django-related settings # the base directory (full path) chdir = /data/www/%userpod%/django_projects/podv2 # Django's wsgi file module = pod.wsgi #module = pod.wsgi:application # the virtualenv (full path) home = /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 = 512 |
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 :
[%userpod%@ts-sun-video]# cd [%userpod%@ts-sun-video /home/%userpod%]# source .bashrc [%userpod%@ts-sun-video /home/%userpod%]# cd /data/www/%userpod%/django_projects/podv2 [%userpod%@ts-sun-video /data/www/%userpod%/django_projects/podv2]# workon django_pod (django_pod) [%userpod%@ts-sun-video][/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
[%userpod%@ts-sun-video]# cd [%userpod%@ts-sun-video /home/%userpod%]# source .bashrc [%userpod%@ts-sun-video /home/%userpod%]# cd /data/www/%userpod%/django_projects/podv2 [%userpod%@ts-sun-video /data/www/%userpod%/django_projects/podv2]# workon django_pod (django_pod) [%userpod%@ts-sun-video][/data/www/%userpod%/django_projects/podv2]# /usr/bin/uwsgi --stop /data/www/%userpod%/django_projects/podv2/uwsgi/pod.pid |
Pour éviter de démarrer / arrêter manuellement le système de workers uWSGI, il est nécessaire de créer un service.
Ce service s'appelle uwsgi-pod.service, positionné dans /etc/systemd/system/.
Voici le contenu de ce fichier :
# [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/uwsgi --ini /data/www/%userpod%/django_projects/podv2/pod/custom/pod_uwsgi.ini --enable-threads --uid podtest --gid nginx --pidfile /data/www/%userpod%/django_projects/podv2/uwsgi/pod.pid' ExecStop=/usr/bin/uwsgi --stop /data/www/%userpod%/django_projects/podv2/uwsgi/pod.pid User=podtest Group=nginx Restart=on-failure #KillSignal=SIGQUIT Type=simple RemainAfterExit=yes #StandardError=syslog #NotifyAccess=all [Install] WantedBy=multi-user.target limit-as = 512 |
Configurer pour que ce service soit démarré lors d'un reboot :
[root@ts-sun-video ~]# systemctl daemon-reload [root@ts-sun-video ~]# systemctl enable uwsgi-pod.service |
Afin de tests, nous sommes passé d'une version 2.0.4 à une version 2.1.0 de Pod v2 sur l'environnement de test.
Pour ce faire, voici les commandes réalisées :
[%userpod%@ts-sun-video ~]# cd [%userpod%@ts-sun-video ~]# source .bashrc [%userpod%@ts-sun-video ~]# cd /data/www/%userpod%/django_projects/podv2 [%userpod%@ts-sun-video /data/www/%userpod%/django_projects/podv2]# workon django_pod (django_pod) [%userpod%@ts-sun-video][/data/www/%userpod%/django_projects/podv2] git pull (django_pod) [%userpod%@ts-sun-video][/data/www/%userpod%/django_projects/podv2] python manage.py makemigrations (django_pod) [%userpod%@ts-sun-video][/data/www/%userpod%/django_projects/podv2] python manage.py migrate (django_pod) [%userpod%@ts-sun-video][/data/www/%userpod%/django_projects/podv2] python manage.py collectstatic |
En cas d'erreur du type "Your local changes to the following files would be overwritten by merge", lors du git pull, cela signifie que des fichiers sources - qui n'auraient pas dû être modifiés - ont été modifiés (typiquement main/settings.py). Il suffit de faire un git checkout . avant le git pull, pour ne plus avoir cette erreur (et perdre les données modifiées). |
Il est nécessaire de vérifier / réaliser les étapes suivantes à chaque migration :
# Les fichiers statiques sont dans l'environnement virtuel. Il a fallu copier le répertoire h5p : cp /data/www/%userpod%/.virtualenvs/django_pod/lib/python3.6/site-packages/h5pp/static/h5p /data/www/%userpod%/django_projects/podv2/pod/static/h5p -R |