====== Service paste.chapril.org ======
===== Introduction =====
Cette documentation explique comment installer un service, en l’occurrence le //paste//, sur une nouvelle machine virtuelle de l’[[admin:schema_infra:start|infrastructure du Chapril]].
Ce service fait partie d'un ensemble de services du Chapril.
Une partie de sa mise en place est donc similaire aux autres services.
Même si l’ensemble de la procédure est traitée, c’est la partie plus spécifique à ce service qui sera la plus détaillée.
Par exemple, la [[admin:procedures:creation_machine_virtuelle|création d'une machine virtuelle]] renvoie sur une autre page et n’est pas détaillée ici.
Cette documentation est technique mais se veut accessible avec de bonnes connaissances, notamment en ce qui concerne la ligne de commande.
Ce service est basé sur le logiciel Privatebin.
Celui-ci est écrit en PHP et JavaScript.
Il est sous licence Zlib/libpng.
Le logiciel inclut aussi des bibliothèques sous licences GNU GPLv2 (Rawinflate), BSD 3-clause (Showdown), MIT (''base64.js'' version 1.7, Bootstrap, Identicon, ''random_compat'', ''composer'', ''kjua'', ''base-x''), Apache (''prettify.js'') et CC-BY (//favicon//, icône et logotype).
Retrouvez la page de présentation du service sur le site [[https://www.chapril.org|www.chapril.org]] : [[https://www.chapril.org/-services-.html|www.chapril.org/-services-.html]].
Site principal : [[https://privatebin.info|privatebin.info]]\\
Source et téléchargement : [[https://github.com/PrivateBin/PrivateBin|github.com/PrivateBin/PrivateBin]]\\
Machine virtuelle Chapril pour ce service : **lamp.cluster.chapril.org**\\
Page principale du service Paste Chapril: [[https://paste.chapril.org/|paste.chapril.org]]\\
Dépôt de l’April : [[https://forge.april.org/Chapril/paste.chapril.org-privatebin/|forge.april.org/Chapril/paste.chapril.org-privatebin]] - [[https://forge.april.org/Chapril/paste.chapril.org-tools|forge.april.org/Chapril/paste.chapril.org-tools]]
==== Aspects techniques ====
Les données peuvent être stockées en SQL ou en fichier plat.
Ici la solution retenue est le fichier plat.
===== Préparation =====
Création de la VM avec la procédure [[admin:procedures:creation_machine_virtuelle|Création d'une machine virtuelle « bling »]].
Création d'un utilisateur (non indispensable mais fait pour le Chapril).
useradd pastechaprilorg
usermod -a -G www-data pastechaprilorg
Ajouter le module ''php7.0-gd'' :
apt-get install php7.0-gd
===== Installation =====
==== Déploiement du code ====
cd /var/www/
wget https://github.com/PrivateBin/PrivateBin/archive/x.x.x.tar.gz
tar xf x.x.x.tar.gz && rm x.x.x.tar.gz
mv PrivateBin-x.x.x paste.chapril.org
chown www-data:www-data -R /var/www/paste.chapril.org
==== Fichiers de logs ====
cd /var/log/apache2/
mkdir paste.chapril.org
==== Configuration d'apache2 ====
Créer le fichier ''/etc/apache2/sites-avalailable/paste.chapril.org.conf'' avec le contenu ci-dessous.
ServerName paste.chapril.org
ServerAdmin webmaster@localhost
DocumentRoot /var/www/paste.chapril.org/
php_admin_value open_basedir "/var/www/paste.chapril.org/"
AllowOverride All
ErrorLog ${APACHE_LOG_DIR}/paste.chapril.org/paste.chapril.org-error.log
CustomLog ${APACHE_LOG_DIR}/paste.chapril.org/paste.chapril.org-access.log combined-proxy
==== Activation de la configuration ====
a2ensite paste.chapril.org.conf
systemctl reload apache2
===== Configuration =====
==== Fichier de configuration ====
Il s'agit du fichier de configuration principal de l'application.
Par défaut il est à cet endroit : ''/var/www/paste.chapril.org/public_html/cfg/conf.php''.
Pour nous, son emplacement est ''/etc/chapril/chapril-paste.conf'', mais on y accède dans l'application par un lien symbolique :
ls -la /var/www/paste.chapril.org/public_html/cfg
conf.php -> /etc/chapril/chapril-paste.conf
Configuration du fichier :
cp conf.sample.php conf.php
Dans la section ''[traffic]'' :
dir = PATH "/var/www/paste.chapril.org/data_spec/"
Dans la section ''[model_options]'' :
dir = PATH "/var/www/paste.chapril.org/data/"
==== Création d’un répertoire pour les données et affectation des droits ====
cd /var/www/paste.chapril.org/
mkdir data
chown www-data:www-data data
chmod -R u+rwX /var/www/paste.chapril.org/data
==== Création d’un répertoire pour les versions et affectation des droits ====
cd /var/www/paste.chapril.org/
mkdir versions
chown www-data:www-data versions
chmod -R u+rwX /var/www/paste.chapril.org/versions
===== Personnalisation =====
==== Favicon et logo ====
Les deux fichiers //favicon// du Chapril (''favicon-16x16_chapril.png'' et ''favicon-32x32_chapril.png'') sont à placer dans le dossier ''img/''.
==== Mise en place d'un fichier de log ====
Celui-ci permet de voir l'activité plus facilement, on voit pour chaque accès si il y a une lecture (//read//) ou une création (//create//) d'un //paste// avec la date, l'heure et un identifiant.
Ce fichier se nomme ''paste.log'' et se trouve ici : ''/var/www/paste.chapril.org/''.
Pour cela on ajoute une fonction dans le fichier suivant : ''/var/www/paste.chapril.org/public_html/lib/Data/Filesystem.php''.
private function logToChapril($message, $id=null)
{
$today = date('Y-m-d H:i:s');
$texte_retour="$today $message \t$id\n";
return (bool) file_put_contents("/var/www/paste.chapril.org/paste.log",$texte_retour,FILE_APPEND|LOCK_EX);
Cette fonction est appelée à plusieurs endroits, lors d'une lecture ou d'une création d'un //paste//.
==== Texte sur la page d'accueil ====
Un texte pour le Chapril est affiché sur la page d'accueil.
On le trouve dans le fichier : ''/var/www/paste.chapril.org/public_html/i18n/fr.json''.
''PasteChaprilOrg'' est un //pastebin// (ou gestionnaire d'extraits de texte et de code source) minimaliste et libre, dans lequel le serveur n'a aucune connaissance des données envoyées.
Les données sont chiffrées ou déchiffrées dans le navigateur par un chiffrement AES 256 bits.
Plus d'informations sur la page du projet.
La seule modification par rapport au texte d'origine est //open source// transformé ici en //libre//.
===== Rapport d’activité =====
Ce rapport permet de voir l'activité du service avec différentes informations.
Il est généré chaque mois :
* Nombre total de requêtes http
* Nombre de vraies requêtes http
* Nombre de requêtes bot
* Nombre de requêtes http en erreur
* Nombre de pastes créés ce mois
* Nombre de pastes supprimés ce mois
* Nombre de commentaires ce mois
* Nombre de lectures ce mois
* Nombre de lectures ce mois - les commentaires
* Nombre de pastes dans la base actuellement
* Taille totale de la base des pastes
* Nombre d'ipv4 ayant visité le service
* Nombre d'ipv6 ayant visité le service
* Nombre total d'ip ayant visité le service
* Nombre d'ipv4 utilisatrices du service
* Nombre d'ipv6 utilisatrices du service
* Nombre total d'ip utilisatrices du service
Créer le répertoire ''rapport_activite/'' dans ''/srv/paste.chapril.org/tools/''.
mkdir /srv/paste.chapril.org/tools
mkdir /srv/paste.chapril.org/tools/rapport_activite
Copier dans ce répertoire le script ''rapport_activite.sh''((Fichier distant : ''https://forge.april.org/Chapril/paste.chapril.org-tools/src/branch/master/rapport_activite/rapport_activite.sh''.)) et le rendre exécutable((Si nécessaire se mettre sur la dernière branche.)).
Puis créer la tâche Cron en ajoutant un fichier ''pastechaprilorg'' dans ''/etc/cron.d/'' avec les lignes suivantes :
6 0 1 * * root /srv/paste.chapril.org/tools/rapport_activite/rapport_activite.sh -p >> /srv/paste.chapril.org/Exploitation/rapport_paste.log 2>&1
20 0 1 * * root /srv/paste.chapril.org/tools/rapport_activite/update_redmine_ticket.sh >> /var/log/paste_stats.log
==== Création d’un dossier de projet ====
Créer le répertoire ''/srv/paste.chapril.org/Exploitation'' avec dedans un fichier ''rapport_paste.log''.
mkdir /srv/paste.chapril.org/Exploitation
touch rapport_paste.log
==== Maintenance du fichier chapril.log ====
Pour nettoyer chaque année le fichier ''paste.log'', voici une solution :
cd /var/www/paste.chapril.org/
cat paste.log |grep 2024- > paste_2024.log
cat paste.log |grep 2025- > paste_2025.log
cat paste_2025.log >> paste.log
On ne garde que l'année en cours dans le fichier ''paste.log''.
Mise en place de rotation du fichier log :
cd /etc/logrotate.d/
vim paste
Contenu du fichier ''paste'' :
/var/www/paste.chapril.org/paste.log {
monthly
rotate 12
compress
delaycompress
missingok
notifempty
create 644 root root
}
===== Monitoring =====
Mettre dans le répertoire ''/usr/lib/nagios/plugins/'' un fichier ''check_pastechaprilorg_update'' et une copie dans ''/srv/paste.chapril.org/tools/monitoring/''.
function usage() {
echo "Usage : $0"
}
#
if [ "$#" -ne 0 ]; then
usage
else
lastVersion=$(curl -s https://privatebin.info/|grep Current|cut -d' ' -f3|cut -d'<' -f1)
currentVersion=$(cd /var/www/paste.chapril.org && git branch | grep '*'|cut -c 11-100 )
#echo $lastVersion
#echo $currentVersion
if [ $currentVersion = $lastVersion ]; then
echo "OK"
result=0
else
echo "WARNING : new version available, current is $currentVersion, last is $lastVersion."
result=1
fi
fi
exit $result
===== Modération =====
==== Modification de la configuration de base ====
Pour limiter le nombre de //pad// et éviter que des //pastes// restent indéfiniment on modifie le paramètre ''expiration''((Voir la doc [[https://github.com/PrivateBin/PrivateBin/wiki/Configuration#expiration|github.com/PrivateBin/PrivateBin/wiki/Configuration#expiration]] pour tous les paramètres.)) avec pour valeur par défaut un jour et un maximum d’une semaine (au lieu d’un temps illimité).
Édition du fichier de configuration :
vim /etc/chapril/chapril-paste.conf
[expire]
; expire value that is selected per default
; make sure the value exists in [expire_options]
# default = "1week"
default = "1day"
[expire_options]
; Set each one of these to the number of seconds in the expiration period,
; or 0 if it should never expire
5min = 300
10min = 600
1hour = 3600
1day = 86400
1week = 604800
;1month = 2592000
;1year = 31536000
;never = 0
==== Supprimer des pastes en ligne de commande ====
Les fichiers contenant les //pastes// sont dans le répertoire ''/var/www/paste.chapril.org/data/''.
Se placer dans le répertoire ''data/'' et lister les fichiers de type fichier.
ls /var/www/paste.chapril.org/data/
find /var/www/paste.chapril.org/data/ -type f
Trouver les fichiers avec ''expire_date'' dans les métadonnées :
find /var/www/paste.chapril.org/data -type f | tail -n 1000 | xargs -I{} grep expire_date
Nettoyage ((La nouvelle configuration évitera d'avoir à faire ces opérations à l'avenir.)) :
# Compter les fichiers qui ont la metadonnée "expire_date" et qui ont une date d'expiration définie
# rgrep expire_date ./ |wc -l
# Compter les fichiers qui n'ont pas la metadonnée "expire_date" et qui donc n'ont pas d'expiration
rgrep -L expire_date ./ |wc -l
# Supprimer (xarg rm) les fichiers sans date d'expiration
rgrep -L expire_date ./ |xargs rm
# Compter les fichiers modifiés il y a plus de 60 jours
find ./ -type f -mtime +60 | wc -l
# Supprimer (option -delete) les fichiers modifiés il y a plus de 60 jours
find ./ -type f -mtime +60 -delete
==== Commandes utiles ====
Compter les //pastes// :
find /var/www/paste.chapril.org/data -type f | wc -l
Retrouver la date d’un //paste// avec la commande ''date'' à partir du //timestamp//, par exemple :
date -d@1736291828
En retour : ''mer. 08 janv. 2025 00:17:08 CET''.
Trouver les tâches Cron pour Paste :
rgrep paste /etc/cron*
Surveillance de l'activité du serveur avec ''goaccess''.
Configuration en décommentant les différents formats souhaités :
vim /etc/goaccess/goaccess.conf
Utilisation :
cd /var/log/apache2/paste.chapril.org/
tail -fn 20 paste.chapril.org-access.log | goaccess
Utilisation alternative :
cd /var/log/apache2/paste.chapril.org/
goaccess paste.chapril.org-access.log
===== Installation d’une mise à jour =====
==== Mise à jour de Paste ====
La mise à jour se passe en deux temps :
- Générer le livrable sous forme de //tarball// (la nouvelle version) sur le poste de travail de l’animsys((Cela en utilisant Git, les dépôts de l'April et de Github ainsi qu’en suivant la procédure indiquée.)) ;
- Déployer cette //tarball// sur le serveur((On envoie la //tarball// par la commande ''scp'' ou on le récupère avec ''wget'' puis on suit également la procédure indiquée.)).
On doit aussi envoyer la nouvelle version à la forge April avec un étiquette contenant le mot ''chapril''.
Si on est deux et à distance, pour travailler on peut partager un //screen// : le premier utilisateur se connecte en faisant ''screen -x'', le deuxième en faisant ''screen''.
==== Générer le « livrable » en local ====
Cette étape se déroule de préférence sur le poste de travail de l'animsys, pas sur le serveur.
=== La première fois ===
mkdir -p ~/code/chapril/paste-chapril
cd ~/code/chapril/paste-chapril/
git clone https://forge.april.org/Chapril/paste.chapril.org-privatebin.git . # ne pas oublier le "." ici
git remote add upstream https://github.com/PrivateBin/PrivateBin.git
git fetch --all
=== Les fois suivantes ===
cd ~/code/chapril/paste-chapril
git fetch --all
git pull --rebase
Trouver l’étiquette de la version qui nous intéresse.
C’est probablement le dernier qui nous intéresse, donc on peut l'obtenir avec cette commande :
git tag --sort=v:refname | tail -n 1
Le ''tail -n 1'' est optionnel.
On pourrait aussi mettre ''tail -n 1'' pour voir les cinq derniers.
Stockons le numéro de version qui nous intéresse dans une variable, ici la version ''1.7.x'' pour l'exemple :
export VERSION=1.7.x
Puis se mettre sur la branche ''paste-chapril'' (''git checkout''), mettre les deux sources ''gitub.com'' et ''forge.april.org'' ensemble en conservant les personnalisations de ''forge.april.org'' (''git rebase'').
C'est alors qu'il faut résoudre les éventuels conflits.
TODO : décrire grossièrement la procédure de résolution des conflits (''edit'', ''git add'' et ''git rebase --continue'').
cd ~/code/chapril/paste-chapril/
git checkout main-chapril
git rebase ${VERSION?}
Une fois les conflits résolus, on vérifie si les //commits// Chapril sont présents.
Pour cela, voir dans les dernières lignes si les trois //commits// de personnalisation sont présents.
git log --oneline -n 10
Maintenant on créé une étiquette (//tag//), puis une archive ''*.tar.gz'' à partir de cette étiquette((L'archive pourrait aussi être récupérée sur la forge de l’April après le //push// de la nouvelle étiquette.)) :
git tag ${VERSION?}-chapril
git archive --prefix=paste-${VERSION?}-chapril/ -o /tmp/paste-${VERSION?}-chapril.tar.gz ${VERSION?}-chapril
On envoie la nouvelle version locale et l’étiquette vers la forge April avec la commande ''push''.
Des identifiants utilisateurs de la forge April sont demandés.
git push origin # Pousser les changements vers la forge April
git push --tags origin # Pousser le tag aussi vers la forge April
=== En cas d'erreur lors du git push origin ===
Si on a un message d'erreur :
! [rejected] main-chapril -> main-chapril (non-fast-forward)
erreur : impossible de pousser des références vers 'https://forge.april.org/Chapril/paste.chapril.org-privatebin.git'
Il faut faire une tirage du dépôt distant vers le dépôt local :
git pull origin
Tirage par fusion :
git config pull.rebase=false
Éditer chaque fichier en conflit :
git status
Écraser la dernière étiquette (//tag//) :
git tag -f $VERSION
Pousser le dépôt local vers le dépôt distant :
git push --tags origin
==== Déployer sur la VM Lamp la nouvelle version ====
Se connecter sur la VM Lamp.
L’étiquette créé dans la précédente section donne lieu à la création d'une //tarball// téléchargeable sur la [[https://forge.april.org/Chapril/paste.chapril.org-privatebin/tags|page des étiquettes du dépôt]].
Stockons une fois de plus le numéro de version qui nous intéresse dans une variable, ici la version ''1.7.
x'' pour l'exemple :
export VERSION=1.7.x
On extrait alors dans un dossier dédié, dans lequel on doit recopier le fichier ''conf.php'' spécifique au Chapril ((On ne le copie pas ; on créé plutôt un lien symbolique parce qu'on aime créer du lien. :-) )).
cd /var/www/paste.chapril.org/
wget -O versions/paste-${VERSION?}-chapril.tar.gz \
https://forge.april.org/Chapril/paste.chapril.org-privatebin/archive/${VERSION?}-chapril.tar.gz
sudo -u www-data tar \
--one-top-level=versions/chapril-paste-${VERSION?} \
--strip-components=1 \
-xavf versions/paste-${VERSION?}-chapril.tar.gz
Il faut remettre le lien symbolique vers le fichier de configuration ''/etc/chapril/chapril-paste.conf''.
cd versions/chapril-paste-${VERSION?}/cfg/
ln -s /etc/chapril/chapril-paste.conf conf.php
Une méthode alternative existe pour la récupération de la //tarball//.
Dans le cas où la commande ''wget'' précédente ne marche pas, on peut envoyer le fichier de la machine locale vers la VM Lamp avec la commande suivante :
scp paste-${VERSION?}-chapril.tar.gz lamp.cluster.chapril.org:/var/www/paste.chapril.org/versions/
On peut maintenant faire la bascule, tout simplement en remplaçant le lien symbolique ''public_html'' pour qu’il pointe vers le nouveau répertoire.
Cela se fait avec la commande de suppression du lien symbolique actuel, puis création du lien symbolique vers la nouvelle version :
cd /var/www/paste.chapril.org/
rm -f public_html ; ln -s versions/chapril-paste-${VERSION?} public_html
On vérifie que l’application fonctionne toujours correctement en visitant [[https://paste.chapril.org/|paste.chapril.org]].
Si besoin, on peut rapidement faire un retour arrière à la version précédente (version ''1.7.x'' ici), suppression du lien symbolique et création du lien symbolique vers la version précédente avec la commande suivante (remplacer ''x'' par le numéro de la version à restaurer) :
rm -f public_html ; ln -s versions/chapril-paste-1.7.x public_html