Table des matières
Phabricator est un outil de gestion de projet et de développement écrit en PHP. Il est utilisé au sein de FedeRez pour gérer les projets afin de garder un historique de ce qui est fait.
Il est accessible à l'adresse suivante : https://task.federez.net.
Pour toutes les commandes à lancer qui commencent par ./
, on se placera dans le dossier d'installation de phabricator, /opt/phabricator/phabricator
, sauf autre indication.
Administration
Modification des Dashboards
Pour modifier un dashboard, notamment le message “bienvenue”, la procédure à suivre et la suivante :
- rechercher Dashboard dans la barre de recherche
- cliquer sur manage dashboard en bout de ligne (c'est l'icone représentant 9 cases (3*3))
- éditer le message de bienvenue en cliquant sur le crayon
Note : il faut posséder les droits admins pour modifier ces paramètres
Note 2 : ajouter un lien vers un projet dans le message de bienvenue améliore grandement la convivialité.
Redémarrage des démons
Pour modifier des paramètres de Phabricator, on peut souvent passer par l'interface web, mais dans tous les cas on peut le faire en console avec :
./bin/config set 'clef' 'valeur'
Après une modification, il faut en général redémarrer manuellement les démons avec :
./bin/phd restart
Supprimer une tâche ou un projet
En général, si le projet ou la tâche a été traité, on préférera l'archiver pour le garder dans l'historique.
Si l'on souhaite vraiment le supprimer (en cas de doublon, spam, etc.), il faut trouver son PHID :
- pour les tâches, il suffit de l'ouvrir et de copier le lien sur le groupe qui peut voir la tâche.
- pour les projets, on peut l'ouvrir puis le récupérer dans le lien sur “Open Tasks” dans le menu de droite (paramètre projet dans l'URL).
Ensuite, pour le supprimer on lance :
./bin/remove destroy 'PHID-…'
Et on valide malgré le message.
Sinon autre possibilité de manière plus globale : utiliser conduit (l'api de phabricator).
https://task.federez.net/conduit/method/phid.lookup/
On tape le nom (par example [“T15”]) au format json et le tour est joué.
Mise à jour
Pour mettre à jour, on peut suivre la partie de la doc d'installation qui en parle.
On peut aussi laisser faire le script de mis à jour automatique suivant :
- /usr/local/sbin/phabricator_update
#!/bin/bash GIT_ROOT="/opt/phabricator" LOG_FILE="/var/log/phabricator_update.log" # Redirection vers un fichier de log et affichage exec > >(tee -a "${LOG_FILE}") 2>&1 IFS=";" read date date_fr debut <<<$(LANG="fr_FR.UTF-8" date +'%F_%T;%a %d %b à %T;%s') echo "Début de la mise à jour le ${date_fr}." if [ ! -d ${GIT_ROOT} ]; then echo "Dossier d'installation inexistant" >&2 exit 1 fi if [ ! -w ${GIT_ROOT} ]; then echo "Droits insuffisants pour écrire dans le dossier d'installation de Phabricator" >&2 exit 2 fi if [ ! -x ${GIT_ROOT}/phabricator/bin/storage ]; then echo "Impossible de trouver le script de mise à jour de la BdD pour Phabricator" >&2 exit 3 fi echo -n "Désactivation du VHOST : " a2dissite task.conf service apache2 reload echo "OK" echo -n "Désactivation des démons : " cd ${GIT_ROOT}/phabricator/ ./bin/phd stop echo "OK" echo "Mise à jour des dépôts git : " echo -n "- arcanist :" cd ${GIT_ROOT}/arcanist/ git pull echo "OK" echo -n "- libphutil :" cd ${GIT_ROOT}/libphutil/ git pull echo "OK" echo -n "- phabricator :" cd ${GIT_ROOT}/phabricator/ git pull echo "OK" echo -n "Mise à jour des schéma de la BdD :" cd ${GIT_ROOT}/phabricator/ ./bin/storage upgrade --user 'phabricator_adm' --password '?iJ&u4x^98i^Fx<+' --force echo "OK" echo -n "Réactivation des démons : " ./bin/phd start echo "OK" echo -n "Réactivation du VHOST : " a2ensite task.conf service apache2 reload echo "OK" fin=$(date +'%s') echo "Fin de la mise à jour, temps total $((fin - debut))s."
Il est appelé par le script suivant via la crontab :
- /usr/local/sbin/phabricator_backup_and_update
#!/bin/bash /usr/local/sbin/phabricator_backup if [ $? -eq 0 ]; then /usr/local/sbin/phabricator_update fi
Pour gérer les logs, on crée un fichier de configuration pour logrotate comme suit :
- /etc/logrotate.d/phabricator_update
# Conf pour les màj de phabricator /var/log/phabricator_backup.log /var/log/phabricator_update.log { weekly missingok rotate 4 compress notifempty copytruncate }
Installation
Le guide officiel est en deux parties :
Le choix de MySQL et et non de MariaDB vient du fait que le premier était déjà installé sur baldrick.
Il pourrait être intéressant dans le futur d'utiliser la version des dépôts debian de Phabricator (disponible uniquement pour stretch et sid actuellement), pour une maintenance plus simple.
Installation des logiciels
Pour PHP, les modules iconv et pcntl sont activés par défaut dans le paquet php de buster, il n'y a donc rien de particulier à faire pour les installer en plus de PHP.
Les paquets optionnels php-apcu, php-gd et php-zip ont été installés.
Pour installer d'un coup tous les paquets utiles, (y compris php5-ldap, utilisé pour l'authentification), on peut lancer :
apt install apache2 libapache2-mod-php git python3-pygments php php-apcu php-curl php-gd php-json php-ldap php-mbstring php-mysql php-zip
L'installation de phabricator a été réalisée dans /opt/phabricator
depuis les dépôts git :
mkdir /opt/phabricator && cd /opt/phabricator git clone https://github.com/phacility/libphutil.git git clone https://github.com/phacility/arcanist.git git clone https://github.com/phacility/phabricator.git
Configuration de PHP
Il faut définir un fuseau horaire par défaut :
- /etc/php5/apache2/php.ini
date.timezone = Europe/Paris
Configuration du vhost
On s'occupe d'abord d'obtenir un certificat TLS pour le site.
On crée ensuite le vhost en créant le fichier suivant :
- /etc/apache2/sites-available/task.conf
# Redirections vers task.federez.net <VirtualHost *:443> ServerName phabricator.federez.net ServerAlias todo.federez.net RedirectMatch permanent ^/(?!.well-known/)(.+)$ https://task.federez.net/ SSLEngine on SSLCertificateFile /etc/letsencrypt/live/nonagon.federez.net/fullchain.pem SSLCertificateKeyFile /etc/letsencrypt/live/nonagon.federez.net/privkey.pem ErrorLog ${APACHE_LOG_DIR}/phabricator-redir.error.log CustomLog ${APACHE_LOG_DIR}/phabricator-redir.access.log combined </VirtualHost> <VirtualHost *:443> ServerName task.federez.net ServerSignature Off <Directory /opt/phabricator/phabricator/webroot> AllowOverride None Require all granted </Directory> DocumentRoot /opt/phabricator/phabricator/webroot # Limite à 32M LimitRequestBody 33554432 # php_value post_max_size 32M # php_value opcache.validate_timestamps 0 # php_value memory_limit 512M RewriteEngine on RewriteRule ^/rsrc/(.*) - [L,QSA] RewriteRule ^/favicon.ico - [L,QSA] RewriteRule ^/ws/(.*) ws://localhost:22280/$1 [P,L] RewriteRule ^(.*)$ /index.php?__path__=$1 [B,L,QSA] ErrorLog ${APACHE_LOG_DIR}/phabricator-ssl.error.log CustomLog ${APACHE_LOG_DIR}/phabricator-ssl.access.log combined SSLEngine on SSLCertificateFile /etc/letsencrypt/live/nonagon.federez.net/fullchain.pem SSLCertificateKeyFile /etc/letsencrypt/live/nonagon.federez.net/privkey.pem ProxyPass /ws "http://127.0.0.1:22280/" ProxyPassReverse /ws "http://127.0.0.1:22280/" </VirtualHost>
On recharge la configuration d'apache :
service apache2 reload
Configuration de la base de données
On crée un utilisateur en base de données (via le compte root) :
CREATE USER 'user'@'IP' IDENTIFIED BY 'passwd'; GRANT SELECT, INSERT, UPDATE, DELETE, EXECUTE, SHOW VIEW ON `phabricator\_%`.* TO 'user'@'IP'; CREATE USER 'user_adm'@'IP' IDENTIFIED BY 'passwd'; GRANT ALL PRIVILEGES ON `phabricator\_%`.* TO 'user_adm'@'IP';
On configure ensuite les accès à la base de données pour phabricator :
./bin/config set mysql.user 'user' ./bin/config set mysql.pass 'passwd' ./bin/config set mysql.host 'hôte' ./bin/storage upgrade --user 'root' --password 'password' --host 'hôte'
Idéalement, on évitera de garder ces lignes dans son historique…
La dernière commande vous créera une vingtaine de bases MySQL, ce n'est pas un bug mais une fonctionnalité : https://secure.phabricator.com/book/phabcontrib/article/database/#databases
Ensuite, on se connecte au site et on suit les recommandations pour résoudre tous les problèmes remontés. Certains très simples à résoudre ne sont pas détaillés ici.
Pour la base de données, on change la configuration par défaut pour avoir :
- /etc/mysql/my.cnf
max_allowed_packet = 48M sql_mode = STRICT_ALL_TABLES ft_stopword_file=/opt/phabricator/phabricator/resources/sql/stopwords.txt
Et on redémarre mysql :
service mysql restart
Configuration du stockage
Ceci n'a pas été fait sur notre instance car elle n'est pas prévue pour servir à partager des fichiers et pour avoir un seul fichier à sauvegarder pour les backups.
Cependant, si l'on veut autoriser le stockage de fichiers sur disque (et non en base de données), on lancera :
mkdir -p /data/phabricator chown www-data: /data/phabricator ./bin/config set "storage.local-disk.path" /data/phabricator
Lancement des démons
Il faut aussi lancer les démons de phabricator.
Pour qu'ils soient lancés en utilisant un utilisateur différent de root, on le crée et on le défini dans la configuration de pahbricator avant de lancer les démons :
useradd --system -d /opt/phabricator/phd -c "Phabricator Daemons" -s /usr/sbin/nologin phd ./bin/config set phd.user phd ./bin/phd start
Pour qu'ils soient lancés automatiquement au démarrage, on ajoute à la crontab :
@reboot root /opt/phabricator/phabricator/bin/phd start
Gestion des logs des démons
On crée le fichier suivant, pour que logrotate gère les logs des démons qui sont dans un dossier inadapté :
- /etc/logrotate.d/phabricator
# Conf pour les logs de phabricator /var/tmp/phd/log/daemons.log { daily missingok rotate 7 compress notifempty create 740 phd phd }
Configuration d'elasticsearch (option non retenue à FedeRez)
Afin d'obtenir de meilleur résultats de recherche, il est possible de se baser sur elasticsearch.
L’installation est simple : cf la doc officielle
Elasticsearch écoute de base sur 0.0.0.0
. Afin d'augmenter la sécurité, on peut dé-commenter la ligne network.host: “127.0.0.1”
dans /etc/elasticsearch/elasticsearch.yml
Après avoir activé le service au démarage (avec systemctl enable elasticsearch
) et lancé le service (avec systemctl start elasticsearch
), on peut l'activer dans phabricator.
Il suffit de changer les configurations de phabricator avec les commandes:
/opt/phabricator/phabricator/bin/config set search.elastic.host "http://localhost:9200" /opt/phabricator/phabricator/bin/config set search.elastic.namespace "phabricator"
Enfin on execute, pour créer les index :
/opt/phabricator/phabricator/bin/search init /opt/phabricator/phabricator/bin/search index --all
A partir de là on peut optimiser elasticsearch, changer la langue, rajouter des synonymes.
Cela se fait via curl :
curl -XPUT 'http://127.0.0.1:9200/_template/template_phabricator' -d @mapping_phab.json
Avec dans notre cas, un fichier mapping.json suivant.
{ "template": "phabricator", "settings": { "analysis": { "filter": { "trigrams_filter": { "type": "ngram", "min_gram": 3, "max_gram": 3 }, "french_elision": { "type": "elision", "articles": [ "l", "m", "t", "qu", "n", "s", "j", "d", "c", "jusqu", "quoiqu", "lorsqu", "puisqu" ] }, "french_stop": { "type": "stop", "stopwords": "_french_" }, "french_stemmer": { "type": "stemmer", "language": "french" } }, "analyzer": { "french_no_trigrams": { "type": "custom", "tokenizer": "standard", "filter": [ "french_elision", "lowercase", "french_stop", "french_stemmer" ] }, "french_trigrams": { "type": "custom", "tokenizer": "standard", "filter": [ "french_elision", "lowercase", "french_stop", "french_stemmer", "trigrams_filter" ] } } } }, "mappings": { "PROJ": { "properties": { "field": { "properties": { "corpus": { "type": "string", "analyzer": "french_trigrams" } } } } }, "TASK": { "properties": { "field": { "properties": { "corpus": { "type": "string", "analyzer": "french_trigrams" } } } } }, "USER": { "properties": { "field": { "properties": { "corpus": { "type": "string", "analyzer": "french_no_trigrams" } } } } } } }
Puis pour reindexer les objects :
/opt/phabricator/phabricator/bin/search index --all
Sauvegardes
Une commande permet de sauvegarder facilement la base de données de Phabricator :
./bin/storage dump | xz > backup.sql.xz
Le script /usr/local/sbin/phabricator_backup
permet de créer un backup dans /data/backups/phabricator
et supprime ceux qui ont plus de 2 jours (ils sont conservés plus longtemps grâce à duplicity).
Pour restaurer une sauvegarde :
xzcat backup.sql.xz | mysql -u root -p
La restauration efface toutes les données et insère les anciennes.
Le script lancé indirectement via la crontab tous les jours à 3:00 est le suivant :
- /usr/local/sbin/phabricator_backup
#!/bin/bash BACKUP_ROOT="/data/backups/phabricator" PHABRICATOR_ROOT="/opt/phabricator/phabricator" LOG_FILE="/var/log/phabricator_backup.log" # Redirection vers un fichier de log et affichage exec > >(tee -a "${LOG_FILE}") 2>&1 IFS=";" read date date_fr debut <<<$(LANG="fr_FR.UTF-8" date +'%F_%T;%a %d %b à %T;%s') echo "Début de la sauvegarde le ${date_fr}." if [ ! -d ${BACKUP_ROOT} ]; then echo "Dossier de sauvegarde inexistant" >&2 exit 1 fi if [ ! -w ${BACKUP_ROOT} ]; then echo "Droits insuffisants pour écrire dans le dossier de sauvegarde" >&2 exit 2 fi if [ ! -x ${PHABRICATOR_ROOT}/bin/storage ]; then echo "Impossible de trouver le script de backup de Phabricator" >&2 exit 3 fi echo "Nettoyage des vieux backups :" find ${BACKUP_ROOT} -type f -ctime +2 -exec echo " -" {} \; -exec rm -rf {} + echo -e "Création du nouveau backup" ${PHABRICATOR_ROOT}/bin/storage dump | xz >| "${BACKUP_ROOT}/phabricator_${date}.xz" fin=$(date +'%s') echo "Fin de la sauvegarde, temps total $((fin - debut))s."
Pour gérer les logs on ajoute à la configuration de logrotate le fichier suivant :
- /etc/logrotate.d/phabricator_backup
# Conf pour les backups de phabricator /var/log/phabricator_backup.log { weekly missingok rotate 4 compress notifempty copytruncate }