Outils pour utilisateurs

Outils du site


admin:services:phabricator

Ceci est une ancienne révision du document !


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

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_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 mbstring, iconv et pcntl sont activés par défaut dans le paquet php5 de jessie, il n'y a donc rien de particulier à faire pour les installer en plus de PHP.

Les paquets optionnels php5-apcu et php5-gd 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-get install apache2 libapache2-mod-php5 php5 git php5-mysql php5-curl \
    php5-apcu php5-gd php5-ldap mysql-server python-pygments

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
<VirtualHost *:80>
  ServerName task.federez.net
  ServerAlias task.federez.org
  ServerAlias todo.federez.net todo.federez.org
  ServerAlias phabricator.federez.net phabricator.federez.org
  ServerSignature Off
 
  Redirect permanent / https://task.federez.net/
</VirtualHost>
 
<VirtualHost *:443>
  ServerName task.federez.net
  ServerAlias task.federez.org task.federez.fr
  ServerAlias todo.federez.net todo.federez.org todo.federez.fr
  ServerAlias phabricator.federez.net phabricator.federez.org  phabricator.federez.fr
  ServerSignature Off
 
  <Directory /opt/phabricator/phabricator/webroot>
      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
 
  # Règles pour Phabricator
  RewriteEngine on
  RewriteRule ^/rsrc/(.*)     -                       [L,QSA]
  RewriteRule ^/favicon.ico   -                       [L,QSA]
  RewriteRule ^(.*)$          /index.php?__path__=$1  [B,L,QSA]
 
  ErrorLog ${APACHE_LOG_DIR}/phabricator.error.log
  CustomLog ${APACHE_LOG_DIR}/phabricator.access.log combined
 
  SSLEngine on
  SSLCertificateFile /etc/ssl/federez/federez_task.crt
  SSLCertificateKeyFile /etc/ssl/private/federez.key
  SSLCertificateChainFile /etc/ssl/federez/federez_task_chain.crt
  SSLCACertificateFile /etc/ssl/certs/StartCom_Certification_Authority.pem
</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'@'localhost' IDENTIFIED BY 'passwd';
GRANT SELECT, INSERT, UPDATE, DELETE, EXECUTE, SHOW VIEW ON `phabricator\_%`.* TO 'user'@'localhost';
CREATE USER 'user_adm'@'localhost' IDENTIFIED BY 'passwd';
GRANT ALL PRIVILEGES ON `phabricator\_%`.* TO 'user_adm'@'localhost';

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/storage upgrade --user 'root' --password 'password'

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 /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

Configuration d'elasticsearch (option)

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.1441978809.txt.gz · Dernière modification : 2015/09/11 15:40 de tycho.tatitscheff

Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki