Outils pour utilisateurs

Outils du site


admin:services:phabricator

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 :

  1. rechercher Dashboard dans la barre de recherche
  2. cliquer sur manage dashboard en bout de ligne (c'est l'icone représentant 9 cases (3*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
}
admin/services/phabricator.txt · Dernière modification: 2019/11/27 02:05 de david