• Pleroma


Pleroma est un réseau social de microbloging semblable à Mastodon. Il a pour particularité d'être décentralisé, chaque instance pouvant suivre une ou plusieurs autres instances Pleroma. Ce réseau est également fédéré, celui ci pouvant intéragir avec d'autres logiciels et protocoles.
Pleroma propose à ses utilisateurs deux interfaces principales :

  • Une interface native hautement personalisable
  • Une interface semblable à celle utilisée par Mastodon

Étant donné que Pleroma installe son propre serveur Web et que nos services se trouvent sur des contenneurs Proxmox acessibles via un Reverse Proxy, il n'y a pas besoin d'installer Nginx au sein de Pleroma.
Le fichier de conf dont on a besoin est :


proxy_cache_path /tmp/pleroma-media-cache levels=1:2 keys_zone=pleroma_media_cache:10m max_size=10g
                 inactive=720m use_temp_path=off;

server {
     if ($host = pleroma.defis.info) {
         return 301 https://$host$request_uri;
     } # managed by Certbot

     server_name    pleroma.defis.info;

     listen         80;
     listen         [::]:80;
     return 404; # managed by Certbot

     # location ~ /\.well-known/acme-challenge {
     #     root /var/lib/letsencrypt/;
     # }
     #location / {
     #  return         301 https://pleroma.defis.info;
     #}
}

ssl_session_cache shared:ssl_session_cache:10m;

server {
     server_name pleroma.defis.info;

     listen 443 ssl http2;
     listen [::]:443 ssl http2;
     ssl_session_timeout 5m;

     ssl_certificate /etc/letsencrypt/live/pleroma.defis.info/fullchain.pem; # managed by Certbot
     ssl_certificate_key /etc/letsencrypt/live/pleroma.defis.info/privkey.pem; # managed by Certbot
#     include /etc/letsencrypt/options-ssl-nginx.conf;
     ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;

     ssl_protocols TLSv1.2;
     # ssl_ciphers "HIGH:!aNULL:!MD5 or HIGH:!aNULL:!MD5:!3DES";
  ssl_ciphers "ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384:!aNULL:!eNULL:!EXPORT:!DES:!MD5:!PSK:!RC4";
     ssl_prefer_server_ciphers on;
     ssl_ecdh_curve X25519:prime256v1:secp384r1:secp521r1;
     ssl_stapling on;
     ssl_stapling_verify on;

     gzip_vary on;
     gzip_proxied any;
     gzip_comp_level 6;
     gzip_buffers 16 8k;
     gzip_http_version 1.1;
     gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript application/activity+json application/atom+xml;

     client_max_body_size 16m;

     location / {
         proxy_http_version 1.1;
         proxy_set_header Upgrade $http_upgrade;
         proxy_set_header Connection "upgrade";
         proxy_set_header Host $http_host;
         proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

         proxy_pass http://xxx.xxx.xxx.xxx:4000;

         client_max_body_size 16m;
     }

     location ~ ^/(media|proxy) {
         proxy_cache        pleroma_media_cache;
         slice              1m;
         proxy_cache_key    $host$uri$is_args$args$slice_range;
         proxy_set_header   Range $slice_range;
         proxy_http_version 1.1;
         proxy_cache_valid  200 206 301 304 1h;
         proxy_cache_lock   on;
         proxy_ignore_client_abort on;
         proxy_buffering    on;
         chunked_transfer_encoding on;
         proxy_pass         http://xxx.xxx.xxx.xxx:4000;
     }
}



Installation de Pleroma

Identifier la plateforme


La commande suivante vous permet d'identifier le type de plateforme sur laquelle sera hébergé Pleroma. Notez quelque part le résultat de cette commande.

arch="$(uname -m)";if [ "$arch" = "x86_64" ];then arch="amd64";elif [ "$arch" = "armv7l" ];then arch="arm";elif [ "$arch" = "aarch64" ];then arch="arm64";else echo "Unsupported arch: $arch">&2;fi;if getconf GNU_LIBC_VERSION>/dev/null;then libc_postfix="";elif [ "$(ldd 2>&1|head -c 9)" = "musl libc" ];then libc_postfix="-musl";elif [ "$(find /lib/libc.musl*|wc -l)" ];then libc_postfix="-musl";else echo "Unsupported libc">&2;fi;echo "$arch$libc_postfix"



Installation des différents packages


La commande suivante permet d'intaller les différents packages dont à besoin Pleroma pour fonctionner correctement, qui sont :

  • curl (pour télécharger la derniere vesion en développement)
  • unzip (pour déziper le fichier de la dernière version)
  • ncurses (ERTS ne fonctionnera pas sans)
  • PostgreSQL (un gestionnaire de base de donnée, en utilisant également les extentions postgresql-contrib)
  • certbot (pour le certificat SSL)

apt install curl unzip libncurses5 postgresql postgresql-contrib certbot

Déploiement de Pleroma


Nous n'utiliseront ici pas le système d'index RUM avec PostgreSQL, permettant de réaliser des recherches ordonées de résultats.
Les commandes suivantes permettent de déployer pleroma sur votre machine.

Créer un utilisateur au nom de Pleroma
adduser --system --shell /bin/false --home /opt/pleroma pleroma

Définir la plateforme de destination

Remplacez dans cette commande "amd64-musl" par le résultat de la commande ayant permis de connaitre le type de plateforme qu'utilise votre machine.

export FLAVOUR="amd64-musl"

Cloner la dernière version dans un répertoire temporaire et la dézipper
su pleroma -s $SHELL -lc " curl 'https://git.pleroma.social/api/v4/projects/2/jobs/artifacts/stable/download?job=$FLAVOUR' -o /tmp/pleroma.zip unzip /tmp/pleroma.zip -d /tmp/ "

Déplacer la version dans le repertoire home et supprimer les fichiers du repertoire temporaire
mv /tmp/release/* /opt/pleroma rmdir /tmp/release rm /tmp/pleroma.zip "

Créer un dossier d'upload et lui donner les bonnes permissions
mkdir -p /var/lib/pleroma/uploads
chown -R pleroma /var/lib/pleroma


Créer un repertoire public
mkdir -p /var/lib/pleroma/static
chown -R pleroma /var/lib/pleroma


Créer un repertoire de configuration
mkdir -p /etc/pleroma
chown -R pleroma /etc/pleroma


Lancer la commande de configuration
su pleroma -s $SHELL -lc "./bin/pleroma_ctl instance gen --output /etc/pleroma/config.exs --output-psql /tmp/setup_db.psql"

Créer la base de données postgres
su postgres -s $SHELL -lc "psql -f /tmp/setup_db.psql"

Créer le shéma de la base de données
su pleroma -s $SHELL -lc "./bin/pleroma_ctl migrate"

Lancement de l'instance pour vérifier que tout fonctionne correctement
su pleroma -s $SHELL -lc "./bin/pleroma daemon"

Attendez environ 20 secondes et interrogez le terminal de l'instance, s'il affiche correctement votre uri, votre nom et votre e-mail, l'instance est correctement configurée
sleep 20 && curl http://localhost:4000/api/v1/instance

Stoper l'instance
su pleroma -s $SHELL -lc "./bin/pleroma stop"

Sytème de service


Copie du service dans le dossier approprié
cp /opt/pleroma/installation/pleroma.service /etc/systemd/system/pleroma.service

Démarer pleroma et l'activer au démarage
systemctl start pleroma
systemctl enable pleroma



Configuration de Pleroma derrière un Reverse Proxy

Définition de l'adresse IP


Modification du fichier de configuration
nano /etc/pleroma/config.exs

Une fois que vous êtes rendu dans l'interface de modificaiton de votre fichier de configuration, rendez-vous à la ligne http et renseignez y l'adresse IP de la machine sur laqeulle est installée Pleroma.

Au sein de ce fichier de configuration, vous pouvez également activier ou désactivier les inscriptions de nouveaux utilisateurs en vous rendant à la ligne registrations_open:. Cette ligne prend en compte deux paramètres, true activant les inscriptions et false emêchant de nouveaux utilisateurs de s'inscrire. Défis ayant déployé ce service afin de pouvoir communiquer à propos de son associaiton, un seul utilisateur administrateur est necessaire, les inscriptions sont donc désactivées.

redémarer pleroma
systemctl restart pleroma


Nginx

La configuration qui vous est présentée ici est celle du service Pleroma de Défis, installé au sein d'un conteneur qui se trouve derrière un Reverse Proxy qui se trouve dans un autre conteneur, tous les deux gérés par le système de virtualisation Proxmox.

Configuration du Reverse Proxy Nginx


Nous nous connectons au conteneur du Reverse Proxy Nginx.
Afin de créer le fichier de configuration du reverse proxy menant vers Pleroma nous nous plaçons dans le répertoire /etc/nginx/sites-available/ afin d'y trouver notre fichier modèle contenu modele_avant_certbot.conf :


server {
    location / {
        include proxy_params;
        proxy_pass http://XXX.XXX.XXX.XXX;
    }
    server_name container.defis.info;
    listen [::]:80;
    listen 80;
}


Nous copions et renomons ce fichier de configuration qui va servir de base à la construction du fichier de configuration du service :

cp modele_avant_certbot.conf pleroma.defis.info.conf

Puis nous créons un lien symbolique vers le répertoire /etc/nginx/sites-enabled/ :

ln -s /etc/nginx/sites-available/pleroma.defis.info.conf /etc/nginx/sites-enabled/pleroma.defis.info.conf'

Nous testons la validité de la syntaxe du fichier de configuration grâce à la commande suivante :

nginx -t

Si la commande renvoie quelque chose de similaire, notre fichier de configuration est valide :

nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

Nous redémarrons nginx afin que les modifications soient prisent prises en compte :

service nginx restart


Afin de sécuriser les connexion entre l'utilisateur et le service Pleroma, nous utilisons Certbot afin de générer un ceritficat TLS, le sucesseur du SSL :

certbot --nginx -d pleroma.defis.info

À la fin de cette commande, il est demandé si nous souhaitons forcer la redirection vers le protocole TLS. Nous choisissons de forcer la redirection (l'option numéro 2).

Voici alors le contenu du fichier de configuration pleroma.defis.info.conf après l'execution de certbot :



server {
    if ($host = pleroma.defis.info) {
        return 301 https://$host$request_uri;
    } # managed by Certbot

    server_name pleroma.defis.info;
    
    listen [::]:80;
    listen 80;
    return 404; # managed by Certbot
}

server {
    server_name pleroma.defis.info;

    listen [::]:443 ssl; # managed by Certbot
    listen 443 ssl; # managed by Certbot
    ssl_certificate /etc/letsencrypt/live/wiki.defis.info/fullchain.pem; # managed by Certbot
    ssl_certificate_key /etc/letsencrypt/live/wiki.defis.info/privkey.pem; # managed by Certbot
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot
    
    location  / {
        include proxy_params;
        proxy_pass http://XXX.XXX.XXX.XXX;
    }
    
}



Cette procédure est la même pour l'installation de presque tous nos services sur notre infrastructure.


En nous basant sur les informations du site https://docs-develop.pleroma.social, nous modifions ce fichier de configuration à l'aide de la commande suivante :

nano pleroma.defis.info.conf

afin d'obtenir le fichier suivant :


proxy_cache_path /tmp/pleroma-media-cache levels=1:2 keys_zone=pleroma_media_cache:10m max_size=10g
                 inactive=720m use_temp_path=off;

server {
     if ($host = pleroma.defis.info) {
         return 301 https://$host$request_uri;
     } # managed by Certbot

     server_name    pleroma.defis.info;

     listen         80;
     listen         [::]:80;
     return 404; # managed by Certbot

     # location ~ /\.well-known/acme-challenge {
     #     root /var/lib/letsencrypt/;
     # }
     #location / {
     #  return         301 https://pleroma.defis.info;
     #}
}

ssl_session_cache shared:ssl_session_cache:10m;

server {
     server_name pleroma.defis.info;

     listen 443 ssl http2;
     listen [::]:443 ssl http2;
     ssl_session_timeout 5m;

     ssl_certificate /etc/letsencrypt/live/pleroma.defis.info/fullchain.pem; # managed by Certbot
     ssl_certificate_key /etc/letsencrypt/live/pleroma.defis.info/privkey.pem; # managed by Certbot
#     include /etc/letsencrypt/options-ssl-nginx.conf;
     ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;

     ssl_protocols TLSv1.2;
     # ssl_ciphers "HIGH:!aNULL:!MD5 or HIGH:!aNULL:!MD5:!3DES";
  ssl_ciphers "ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384:!aNULL:!eNULL:!EXPORT:!DES:!MD5:!PSK:!RC4";
     ssl_prefer_server_ciphers on;
     ssl_ecdh_curve X25519:prime256v1:secp384r1:secp521r1;
     ssl_stapling on;
     ssl_stapling_verify on;

     gzip_vary on;
     gzip_proxied any;
     gzip_comp_level 6;
     gzip_buffers 16 8k;
     gzip_http_version 1.1;
     gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript application/activity+json application/atom+xml;

     client_max_body_size 16m;

     location / {
         proxy_http_version 1.1;
         proxy_set_header Upgrade $http_upgrade;
         proxy_set_header Connection "upgrade";
         proxy_set_header Host $http_host;
         proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

         proxy_pass http://xxx.xxx.xxx.xxx:4000;

         client_max_body_size 16m;
     }

     location ~ ^/(media|proxy) {
         proxy_cache        pleroma_media_cache;
         slice              1m;
         proxy_cache_key    $host$uri$is_args$args$slice_range;
         proxy_set_header   Range $slice_range;
         proxy_http_version 1.1;
         proxy_cache_valid  200 206 301 304 1h;
         proxy_cache_lock   on;
         proxy_ignore_client_abort on;
         proxy_buffering    on;
         chunked_transfer_encoding on;
         proxy_pass         http://xxx.xxx.xxx.xxx:4000;
     }
}



Nous vérifions la syntaxe du fichier de configuration :

nginx -t

Si la commande renvoie quelque chose de similaire, notre fichier de configuration est valide :

nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful


Redémarrons le Reverse Proxy Nginx afin que les modifications soient prises en compte.

service nginx restart

Si tout a fonctionné, vous devriez voir apparaitre l'interface de Pleroma lorsque vous rentrez votre nom de domaine ou adresse IP dans la barre d'URL.

Utilisateurs

Création d'utilisateur


Les deux commandes suivantes vont vous permettre de créer un utilisateur et de le définir comme administrateur. Remplasez "Joeuser" par le nom que vous shouaiter assigner à ce nouvel utilisateur, et "joeuser@sld.tld" par l'adresse mail que vous shouaitez lui atitrer.

cd /opt/pleroma/bin
su pleroma -s $SHELL -lc "./bin/pleroma_ctl user new joeuser joeuser@sld.tld --admin"